Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
3119434
Document the 23 undocumented public fns in pdf.clj
codeGlaze Oct 13, 2026
1d687ac
Correct the external-call count in the pdf.clj API note: 31, not 33
codeGlaze Oct 13, 2026
628b072
Pin card geometry before touching the card shape layer
codeGlaze Oct 13, 2026
3b34113
Cover the ornament matrix and the printer-friendly modes
codeGlaze Oct 13, 2026
d3768a5
Pin the spellbook too, and share the baseline machinery
codeGlaze Oct 13, 2026
5eb1a38
Unify bezier-k: one constant, not two copies
codeGlaze Oct 13, 2026
99f74dc
Merge remote-tracking branch 'origin/refactor/card-shape-layer' into …
codeGlaze Oct 13, 2026
4045c50
Lift the spell abbreviations out of pdf.clj into spell_print.cljc
codeGlaze Oct 13, 2026
36419f0
Share the shape path emission between pdf.clj and spellbook.clj
codeGlaze Oct 13, 2026
153fd0f
Stop one unrenderable homebrew name costing the export whole card sheets
codeGlaze Oct 15, 2026
6d16d96
One coordinate flip, with the page height named instead of inline
codeGlaze Oct 16, 2026
8e5668d
Move the text layer into the shared drawing file, and name it draw, n…
codeGlaze Oct 16, 2026
88bc903
Move the SVG and icon block into draw, and qualify every call site
codeGlaze Oct 16, 2026
d50b5e4
Cards out to orcpub.pdf.cards, and lint dev/ so this stops happening
codeGlaze Oct 16, 2026
8841cda
Pin the AcroForm character sheet, which nothing covered
codeGlaze Oct 16, 2026
9f46f20
Make the page a binding, and test a non-Letter page for the first time
codeGlaze Oct 16, 2026
e4de43b
Cards stop naming a page size, and the cut grid follows the card size
codeGlaze Oct 16, 2026
c68dab2
One grid-layout, so the cut lines and the cards cannot disagree
codeGlaze Oct 16, 2026
2aac01c
Three ways a non-Letter page lost data silently
codeGlaze Oct 17, 2026
397c4a5
A degraded export says what it dropped, on a page in the PDF
codeGlaze Oct 17, 2026
78ef468
A4 is selectable from the request, and pinned like Letter
codeGlaze Oct 17, 2026
7ba3ec0
The character sheet re-papers onto A4, by moving the window not the c…
codeGlaze Oct 17, 2026
605714d
Branch changelog
codeGlaze Oct 17, 2026
969c07f
Pin the locale everywhere the PDF path formats or folds a token
codeGlaze Oct 18, 2026
9559f3e
Place template-page images in template space, not the requested page
codeGlaze Oct 18, 2026
e3a0ed5
Do not report a style's declared omission as a degraded export
codeGlaze Oct 18, 2026
f5bb5a2
Merge integration into refactor/pdf-canvas
codeGlaze Oct 18, 2026
f0269cb
Fold the branch changelog into Summer Patch
codeGlaze Oct 18, 2026
9130242
Keep the character sheet on Letter at A5, and strip the portrait options
codeGlaze Oct 18, 2026
4525d56
Keep the spellbook's level tabs on the paper
codeGlaze Oct 18, 2026
18a95fc
Bound the chapter heading and spell name, and fix locale-folded ident…
codeGlaze Oct 19, 2026
d5e38d8
Report a truncated request instead of dropping the extras in silence
codeGlaze Oct 19, 2026
54700ff
Pin the JVM locale to ROOT at both server entry points
codeGlaze Oct 20, 2026
58f7d9a
Print what Vollkorn can draw, not just what WinAnsi allows
codeGlaze Oct 20, 2026
929b60c
Remove A5: design for Letter and A4
codeGlaze Oct 21, 2026
188d0e9
Keep what WinAnsi can draw: curly quotes, dashes, oe, euro
codeGlaze Oct 21, 2026
aef07d0
Use Nimbus Sans, not Vollkorn, for sheet fields Helvetica cannot draw
codeGlaze Oct 21, 2026
e08522e
Guard degenerate SVG arcs; fold CLI emails without the machine locale
codeGlaze Oct 21, 2026
c843de2
Set every sheet field in Nimbus Sans; keep the templates' own sizes
codeGlaze Oct 21, 2026
e6958cc
Pin the fonts the export's drawing uses
codeGlaze Oct 22, 2026
26aae0b
Set all drawn PDF text in embedded Nimbus Sans
codeGlaze Oct 22, 2026
6214259
Fix review findings: overflow site line, dropped-picture notice, tests
codeGlaze Oct 23, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,8 @@ Homebrew can be moved, switched off and repaired instead of lost, and a characte
- **Characters:** a Choices list in the builder shows every choice a character stores, including ones whose homebrew isn't loaded in this browser, and lets those be cleared.
- **Characters:** the character builder's Back and Next repeat at the bottom of each page, and open the next page at its top.
- **Homebrew:** the add buttons on homebrew builders repeat below a long list of traits or options.
- **Printing:** A4 as well as US Letter, for the character sheet, spell cards, magic item cards and the spellbook. An A4 spellbook page carries about 7% more than a Letter one.
- **Printing:** when part of an export cannot be produced, the PDF opens with a page naming what was left out and why. A clean export is unchanged and gains no page.

### Changed

Expand All @@ -93,6 +95,8 @@ Homebrew can be moved, switched off and repaired instead of lost, and a characte
not set one, instead of "Hi there".
- **Characters:** the builder's tab bar wraps on narrow screens.
- **Characters:** opening a character whose choices no longer apply sets them aside and lists them in a notice; the saved copy changes only when you save.
- **Printing:** a character portrait whose host is briefly unreachable is fetched a second time before the export gives up on it.
- **Printing:** every sans-serif line in an export -- sheet fields, spell-column headings, the site line, the notice page and card captions -- is set in one embedded font with Helvetica's exact widths, so it looks the same in every PDF viewer and prints names such as Łukasz.

### Fixed

Expand Down Expand Up @@ -151,9 +155,18 @@ Homebrew can be moved, switched off and repaired instead of lost, and a characte
- **Characters:** a choice that no longer applied, such as a skill picked for a level since lowered, stayed hidden on the character and still counted on its sheet.
- **Characters:** deleting or changing a character's first class no longer wipes the other classes' choices.
- **Homebrew:** a homebrew class's choices that share a name show in level order; levels 10 and 17 came before level 3.
- **Printing:** a magic item or spell whose name the embedded font cannot draw no longer costs the card sheet it is on, and every sheet after it.
- **Printing:** names and notes written in Polish, Turkish, Czech, Russian, Greek and other scripts beyond Western European print on the character sheet and in the spellbook, instead of as question marks.
- **Printing:** curly quotes, dashes, ellipses, bullets, œ and € print as themselves on the character sheet and in spell text; they were flattened to straight quotes and hyphens or dropped.
- **Printing:** a spellbook page's level tabs no longer print off the edge of the paper when a character has a very long class name.
- **Printing:** a long class name in a spellbook chapter heading, or a long custom spell name, is now shortened to fit instead of running off the page.
- **Printing:** an export with more spells or magic items than the cap allows now says so on the notice page; the extras were dropped in silence.
- **Printing:** on a server whose JVM runs a non-English locale, spell-card school names and the sheet's ability labels drew the wrong letter: a Turkish server printed "İllusion" and "İNT".

### Security

- **Accounts:** on a server whose JVM runs a non-English locale, an email address containing a capital I folded to a different account key, so sign-in, password reset, the unsubscribe link and email change could all miss the account.

- Sign-in, password reset, share links, image fetching and PDF export are hardened against misuse, and secrets are no longer printed at startup.

## [breaking/2026-stack-modernization]
Expand Down
13 changes: 7 additions & 6 deletions dev/compare_item_cards.clj
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@
;; PDFBox's renderer cannot rasterise the embedded faces -- open the result in a
;; browser, not with PDFRenderer, or every card looks like an encoding bug.

(require '[orcpub.pdf :as pdf] '[orcpub.dnd.e5.magic-items :as mi])
(require '[orcpub.pdf.draw :as draw] '[orcpub.pdf.cards :as cards]
'[orcpub.dnd.e5.magic-items :as mi])
(import '[org.apache.pdfbox.pdmodel PDDocument PDPage PDPageContentStream] '[java.io File])

(def rarities [:common :uncommon :rare :very-rare :legendary])
Expand All @@ -28,14 +29,14 @@
(let [page (PDPage.)]
(.addPage doc page)
(with-open [cs (PDPageContentStream. doc page)]
(pdf/print-items cs doc fonts img 2.5 3.5 items 0 false false opts))))
(cards/print-items cs doc fonts img 2.5 3.5 items 0 false false opts))))

(let [doc (PDDocument.)
fonts (pdf/load-fonts doc)
img (pdf/make-image-loader doc)
fonts (draw/load-fonts doc)
img (draw/make-image-loader doc)
ladder (mapv sample rarities)]
;; One page per family: the five ranks side by side.
(doseq [family pdf/card-flourishes]
(doseq [family cards/card-flourishes]
(page! doc fonts img ladder {:flourish family}))
;; Name treatments, all on the winning-ish frame.
(doseq [[face size track] [[:bold 12 0.15] [:bold 13.5 0.3]
Expand All @@ -44,4 +45,4 @@
{:flourish :diamonds :name-face face :name-size size :name-tracking track}))
(.save doc (File. (or (System/getenv "OUT") "target/item-card-styles.pdf")))
(.close doc)
(println "families:" (pr-str pdf/card-flourishes) "pages:" (+ (count pdf/card-flourishes) 4)))
(println "families:" (pr-str cards/card-flourishes) "pages:" (+ (count cards/card-flourishes) 4)))
25 changes: 13 additions & 12 deletions dev/measure_item_card.clj
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@
;; PDFBox's renderer cannot rasterise the embedded faces -- open the PDF in a
;; browser, or every card will look like a text encoding bug.

(require '[orcpub.pdf :as pdf] '[clojure.string :as str])
(require '[orcpub.pdf.draw :as draw] '[orcpub.pdf.cards :as cards]
'[clojure.string :as str])
(import '[org.apache.pdfbox.pdmodel PDDocument PDPage PDPageContentStream] '[java.io File])

(def MIN-GAP
Expand Down Expand Up @@ -96,34 +97,34 @@

(let [doc (PDDocument.) page (PDPage.)]
(.addPage doc page)
(let [fonts (pdf/load-fonts doc) img (pdf/make-image-loader doc)]
(let [fonts (draw/load-fonts doc) img (draw/make-image-loader doc)]
(with-open [cs (PDPageContentStream. doc page)]
(pdf/print-items cs doc fonts img 2.5 3.5 [torture torture torture] 0 false false nil)))
(cards/print-items cs doc fonts img 2.5 3.5 [torture torture torture] 0 false false nil)))
(.save doc (File. (or (System/getenv "OUT") "target/item-card-torture.pdf")))
(.close doc))

(println "charges parsed:" (pdf/item-charges (:orcpub.dnd.e5.magic-items/description torture)))
(println "subtitle :" (pdf/magic-item-subtitle torture))
(println "clause :" (pdf/attunement-phrase
(println "charges parsed:" (cards/item-charges (:orcpub.dnd.e5.magic-items/description torture)))
(println "subtitle :" (cards/magic-item-subtitle torture))
(println "clause :" (cards/attunement-phrase
(:orcpub.dnd.e5.magic-items/attunement torture) nil))
(println)
;; The name shrinks to fit two lines, so ask the renderer what size it settled on
;; rather than assuming the nominal one.
(let [doc (PDDocument.)
fonts (pdf/load-fonts doc)
fonts (draw/load-fonts doc)
width (- 2.5 0.56)
lines-at (fn [pt] (count (#'pdf/split-lines (:name torture) (:bold fonts) pt width)))
floor (get-in pdf/card-layout [:down :name-floor])
height (get-in pdf/card-layout [:down :name-height])
lines-at (fn [pt] (count (#'draw/split-lines (:name torture) (:bold fonts) pt width)))
floor (get-in cards/card-layout [:down :name-floor])
height (get-in cards/card-layout [:down :name-height])
fits? (fn [pt] (let [n (lines-at pt)]
(and (<= n 3) (<= (* n (/ (* pt 1.1) 72)) height))))
size (or (first (filter fits? (take-while #(>= % floor) (iterate #(- % 0.5) 13))))
floor)
body-lines (count (#'pdf/split-lines
body-lines (count (#'draw/split-lines
(:orcpub.dnd.e5.magic-items/description torture)
(:plain fonts) 8 (- 2.5 0.4)))
capacity (int (dec (/ (* 72 (- 3.5 1.74 0.80)) (* 8 1.1))))]
(printf "name set at %.2fpt over %d lines; description %d lines, %d fit%n%n"
(double size) (lines-at size) body-lines capacity)
(report (elements pdf/card-layout 3.5 size (lines-at size) (min body-lines capacity)))
(report (elements cards/card-layout 3.5 size (lines-at size) (min body-lines capacity)))
(.close doc))
4 changes: 3 additions & 1 deletion dev/scan_site_line.clj
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,16 @@
;; Pages a style prints its own footer on are skipped, the same as at export.

(require '[orcpub.pdf :as pdf]
'[orcpub.pdf.draw :as draw]
'[clojure.java.io :as io])
(import '[org.apache.pdfbox Loader]
'[org.apache.pdfbox.pdmodel PDDocument]
'[org.apache.pdfbox.rendering PDFRenderer]
'[java.awt.image BufferedImage]
'[java.io ByteArrayOutputStream])

(def dpi 150.0)
(def stamp-width (pdf/string-width pdf/site-stamp pdf/HELVETICA 6))
(def stamp-width (draw/string-width draw/site-stamp (draw/sans (draw/load-sans (PDDocument.)) :plain) 6))
(def stamp-height
"6pt of cap height plus room for a descender, in inches."
(/ 8.0 72))
Expand Down
13 changes: 8 additions & 5 deletions dev/stress_packing.clj
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@
[orcpub.dnd.e5.spell-annotations :as ann]
[orcpub.dnd.e5.spell-packing :as packing]
[orcpub.dnd.e5.spells :as spells]
[orcpub.pdf :as pdf])
[orcpub.pdf :as pdf]
[orcpub.pdf.draw :as draw])
(:import [java.io File FileOutputStream]
[javax.imageio ImageIO]
[org.apache.pdfbox Loader]
Expand Down Expand Up @@ -103,14 +104,16 @@
{:keys [fields relabels headings pages unplaced]} (packing/packed-fields style classes)]
(with-open [doc (Loader/loadPDF (.readAllBytes (.openStream (io/resource file))))]
(pdf/grow-spell-sections! doc pages :all)
(let [[ok refused] (pdf/apply-relabel-instructions! doc relabels pages style)]
(let [sans (draw/load-sans doc)
printed (pdf/site-line-pages doc (boolean prints-site-line?))
[ok refused] (pdf/apply-relabel-instructions! doc sans relabels pages style)]
(pdf/reserve-annotation-columns! doc)
(let [dropped (pdf/write-fields! doc fields false {})]
(pdf/annotate-spell-rows! doc #(some-> (get spells/spell-map (common/name-to-kw %))
(pdf/annotate-spell-rows! doc sans #(some-> (get spells/spell-map (common/name-to-kw %))
ann/annotation))
(doseq [{:keys [class box section] :as h} headings]
(pdf/draw-column-heading! doc style box (or section 1) class h))
(pdf/stamp-site-line! doc site-line (boolean prints-site-line?))
(pdf/draw-column-heading! doc sans style box (or section 1) class h))
(pdf/stamp-site-line! doc sans site-line printed)
(when out
(with-open [o (FileOutputStream. (File. (str out ".pdf")))] (.save doc o))
(let [idx (.indexOf (vec (.getPages doc))
Expand Down
5 changes: 3 additions & 2 deletions dev/stress_spell_sheets.clj
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
;; annotation column has to live in.

(require '[orcpub.pdf :as pdf]
'[orcpub.pdf.draw :as draw]
'[orcpub.dnd.e5.spells :as spells]
'[clojure.java.io :as io]
'[clojure.string :as st])
Expand Down Expand Up @@ -77,14 +78,14 @@
;; Render the page section 1's rows actually live on. Style 4's master has
;; TWO spell pages, so the last page belongs to section 2 and is empty here.
;; Rendering it looked exactly like a total failure to fill anything.
(let [helv pdf/HELVETICA
(let [helv (draw/sans (draw/load-sans doc) :plain)
per-level (for [[lvl rs] (sort (group-by :level rows))]
(let [sizes (keep #(baked-size doc (:name %)) rs)
widest (apply max
(for [r rs
:let [sz (or (baked-size doc (:name r)) 0)
v (get values (keyword (:name r)))]]
(* 72 (pdf/string-width v helv sz))))]
(* 72 (draw/string-width v helv sz))))]
{:level lvl :rows (count rs)
:w (:w (first rs))
:size-min (when (seq sizes) (apply min sizes))
Expand Down
7 changes: 5 additions & 2 deletions dev/style_gallery.clj
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
(load-file "dev/sample_character.clj")

(require '[orcpub.pdf :as pdf]
'[orcpub.pdf.draw :as draw]
'[orcpub.dnd.e5.spells :as spells]
'[orcpub.dnd.e5.spell-lists :as sl]
'[orcpub.dnd.e5.spell-packing :as pk]
Expand Down Expand Up @@ -61,12 +62,14 @@
(pdf/grow-spell-sections! doc 1 :all)
(pdf/add-missing-spell-pages! doc all)
(let [all (pdf/merge-style-fields style all)
sans (draw/load-sans doc)
printed (pdf/site-line-pages doc (boolean prints-site-line?))
_ (pdf/reserve-annotation-columns! doc)
dropped (pdf/write-fields! doc (pdf/spill-overflow! doc all) false {})
_ (pdf/annotate-spell-rows!
doc #(some-> (get spells/spell-map (common/name-to-kw %))
doc sans #(some-> (get spells/spell-map (common/name-to-kw %))
spell-annotations/annotation))]
(pdf/stamp-site-line! doc site-line (boolean prints-site-line?))
(pdf/stamp-site-line! doc sans site-line printed)
(with-open [o (FileOutputStream. out)] (.save doc o))
(printf "style %d: %d pages, %d fields, %d KB%s%n"
style (.getNumberOfPages doc) (count all) (quot (.length out) 1024)
Expand Down
17 changes: 8 additions & 9 deletions dev/svg_icon_proof.clj
Original file line number Diff line number Diff line change
Expand Up @@ -11,22 +11,21 @@
;; The rasters are no longer what the cards draw. The comparison is kept because
;; it is the check to repeat whenever an icon or the parser changes.

(require '[orcpub.pdf :as pdf] '[clojure.string :as str] '[clojure.java.io :as io])
(require '[orcpub.pdf.draw :as draw] '[clojure.string :as str] '[clojure.java.io :as io])
(import '[org.apache.pdfbox.pdmodel PDDocument PDPage PDPageContentStream]
'[org.apache.pdfbox.pdmodel.font PDType1Font Standard14Fonts$FontName]
'[org.apache.pdfbox.rendering PDFRenderer]
'[javax.imageio ImageIO] '[java.io File])

(def icons (str/split (or (System/getenv "ICONS") "magic-swirl") #","))
(def sizes "Inches. 0.25 is what a spell card actually draws." [0.15 0.25 0.4 0.7 1.1])

(let [doc (PDDocument.) page (PDPage.) img (pdf/make-image-loader doc)
helv (PDType1Font. Standard14Fonts$FontName/HELVETICA)
label (fn [cs t x y] (pdf/draw-text cs t helv 7 x y))]
(let [doc (PDDocument.) page (PDPage.) img (draw/make-image-loader doc)
helv (draw/sans (draw/load-sans doc) :plain)
label (fn [cs t x y] (draw/draw-text cs t helv 7 x y))]
(.addPage doc page)
(with-open [cs (PDPageContentStream. doc page)]
(doseq [[row icon] (map-indexed vector icons)]
(let [ops (pdf/load-svg-icon icon)
(let [ops (draw/load-svg-icon icon)
png (when (io/resource (str "public/image/" icon ".png"))
(img (str "public/image/" icon ".png")))
top (+ 0.9 (* row 2.6))]
Expand All @@ -37,10 +36,10 @@
(loop [[s & more] sizes x 2.1]
(when s
;; Both rows share a baseline so the eye compares like with like.
(when ops (pdf/draw-svg-path! cs ops x (+ top 0.15) s 512))
(when ops (draw/draw-svg-path! cs ops x (+ top 0.15) s 512))
;; Only some of these were ever rasterised; the row is skipped rather
;; than faked for the rest.
(when png (pdf/draw-imagex cs png x (+ top 1.45) s s))
(when png (draw/draw-imagex cs png x (+ top 1.45) s s))
(label cs (format "%.2fin" (double s)) x (- 11 (+ top 2.55)))
(recur more (+ x s 0.28)))))))
(.save doc (File. "target/svg-icon-proof.pdf"))
Expand All @@ -49,7 +48,7 @@
(.close doc))

(doseq [i icons]
(let [ops (pdf/load-svg-icon i)]
(let [ops (draw/load-svg-icon i)]
(printf "%-20s %s%n" i
(if ops
(format "%d ops %s" (count ops)
Expand Down
11 changes: 9 additions & 2 deletions dev/user.clj
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
[buddy.hashers :as hashers]
[orcpub.routes :as r]
[orcpub.system :as s]
[orcpub.common :as common]
[orcpub.server :as server]
[orcpub.db.schema :as schema]
[orcpub.config :as config])
(:gen-class))
Expand Down Expand Up @@ -110,6 +112,9 @@

(defn start-server
[]
;; scripts/start.sh starts the server here, not through -main, so the pin is needed
;; on this path too -- it is the one self-hosters run.
(server/pin-locale!)
; restart
(stop-server)
(reset! -server (component/start (s/system :dev))))
Expand Down Expand Up @@ -183,7 +188,7 @@

(defn email-exists? [db email]
(boolean (datomic/q '[:find ?e . :in $ ?email :where [?e :orcpub.user/email ?email]]
db (str/lower-case email))))
db (common/ascii-lower-case email))))

(defn username-exists? [db username]
(boolean (datomic/q '[:find ?e . :in $ ?username :where [?e :orcpub.user/username ?username]]
Expand All @@ -199,7 +204,9 @@
lein with-profile init-db run -m user create-user bob bob@example.com pass verify"
[conn {:keys [username email password verify? send-updates?] :or {verify? false send-updates? false}}]
(let [db (datomic/db conn)
email (when email (str/lower-case (str/trim email)))
;; ascii, not str/lower-case: the CLI never starts the server, so pin-locale!
;; has not run, and a Turkish machine would store IVAN@ as ıvan@.
email (when email (common/ascii-lower-case (str/trim email)))
username (when username (str/trim username))]
(cond
(and email (email-exists? db email))
Expand Down
9 changes: 8 additions & 1 deletion project.clj
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,14 @@
;; trampoline re-execs in a fresh JVM so System/exit propagates
;; (without it, lein suppresses the exit code).
;; native/ is excluded — directory only exists for React Native builds.
"lint" ["trampoline" "with-profile" "lint" "run" "-m" "clj-kondo.main" "--lint" "src" "test" "web" "--fail-level" "error"]
;; dev/ is linted for its ERRORS. It contributes ~41 warnings that are the
;; scripts' own idiom -- they load-file each other, so re-requiring and
;; re-defining is normal -- and --fail-level error ignores those. Not silenced
;; via :config-in-ns: the scripts have no ns form, so kondo does not resolve
;; them to `user` and the suppression only caught 3 of the 41.
;; Added because this refactor shipped an unbalanced paren in 5 dev scripts
;; across 2 commits, unseen: kondo calls it an error, and dev/ was unlinted.
"lint" ["trampoline" "with-profile" "lint" "run" "-m" "clj-kondo.main" "--lint" "src" "test" "web" "dev" "--fail-level" "error"]
"prod-build" ^{:doc "Recompile code with prod profile."}
["externs"
["run" "-m" "figwheel.main" "--" "--build-once" "prod"]]}
Expand Down
Binary file added resources/fonts/NimbusSans-Bold.ttf
Binary file not shown.
Binary file added resources/fonts/NimbusSans-BoldItalic.ttf
Binary file not shown.
Loading
Loading