wand-kit 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (262) hide show
  1. package/.gitkeep +0 -0
  2. package/PROMPT.md +252 -0
  3. package/SKILL.md +100 -0
  4. package/START-HERE.md +16 -0
  5. package/brands/current/assets/bg-cover-dark.png +0 -0
  6. package/brands/current/assets/bg-overlay-dark.png +0 -0
  7. package/brands/current/assets/bg-statement-dark.png +0 -0
  8. package/brands/current/assets/closing-art.png +0 -0
  9. package/brands/current/assets/cover-art.png +0 -0
  10. package/brands/current/assets/divider-art.png +0 -0
  11. package/brands/current/assets/glyphs/README.md +29 -0
  12. package/brands/current/assets/glyphs/activity.svg +15 -0
  13. package/brands/current/assets/glyphs/atom.svg +17 -0
  14. package/brands/current/assets/glyphs/badge-check.svg +16 -0
  15. package/brands/current/assets/glyphs/bell.svg +16 -0
  16. package/brands/current/assets/glyphs/blocks.svg +16 -0
  17. package/brands/current/assets/glyphs/book-open.svg +16 -0
  18. package/brands/current/assets/glyphs/bot.svg +20 -0
  19. package/brands/current/assets/glyphs/boxes.svg +26 -0
  20. package/brands/current/assets/glyphs/brain.svg +23 -0
  21. package/brands/current/assets/glyphs/briefcase.svg +16 -0
  22. package/brands/current/assets/glyphs/building-2.svg +21 -0
  23. package/brands/current/assets/glyphs/calendar.svg +18 -0
  24. package/brands/current/assets/glyphs/chart-column.svg +18 -0
  25. package/brands/current/assets/glyphs/chart-line.svg +16 -0
  26. package/brands/current/assets/glyphs/chart-pie.svg +16 -0
  27. package/brands/current/assets/glyphs/circle-check.svg +16 -0
  28. package/brands/current/assets/glyphs/clipboard-check.svg +17 -0
  29. package/brands/current/assets/glyphs/clock.svg +16 -0
  30. package/brands/current/assets/glyphs/cloud.svg +15 -0
  31. package/brands/current/assets/glyphs/code.svg +15 -0
  32. package/brands/current/assets/glyphs/coins.svg +18 -0
  33. package/brands/current/assets/glyphs/compass.svg +16 -0
  34. package/brands/current/assets/glyphs/cpu.svg +24 -0
  35. package/brands/current/assets/glyphs/database.svg +17 -0
  36. package/brands/current/assets/glyphs/eye.svg +16 -0
  37. package/brands/current/assets/glyphs/file-check.svg +17 -0
  38. package/brands/current/assets/glyphs/filter.svg +15 -0
  39. package/brands/current/assets/glyphs/fingerprint.svg +23 -0
  40. package/brands/current/assets/glyphs/flag.svg +16 -0
  41. package/brands/current/assets/glyphs/gauge.svg +16 -0
  42. package/brands/current/assets/glyphs/gavel.svg +19 -0
  43. package/brands/current/assets/glyphs/git-branch.svg +18 -0
  44. package/brands/current/assets/glyphs/globe.svg +17 -0
  45. package/brands/current/assets/glyphs/graduation-cap.svg +17 -0
  46. package/brands/current/assets/glyphs/handshake.svg +19 -0
  47. package/brands/current/assets/glyphs/hexagon.svg +15 -0
  48. package/brands/current/assets/glyphs/index.json +177 -0
  49. package/brands/current/assets/glyphs/infinity.svg +15 -0
  50. package/brands/current/assets/glyphs/key.svg +17 -0
  51. package/brands/current/assets/glyphs/landmark.svg +20 -0
  52. package/brands/current/assets/glyphs/layers.svg +17 -0
  53. package/brands/current/assets/glyphs/lightbulb.svg +17 -0
  54. package/brands/current/assets/glyphs/link.svg +16 -0
  55. package/brands/current/assets/glyphs/list-checks.svg +19 -0
  56. package/brands/current/assets/glyphs/lock.svg +16 -0
  57. package/brands/current/assets/glyphs/map.svg +17 -0
  58. package/brands/current/assets/glyphs/megaphone.svg +16 -0
  59. package/brands/current/assets/glyphs/message-square.svg +15 -0
  60. package/brands/current/assets/glyphs/milestone.svg +17 -0
  61. package/brands/current/assets/glyphs/network.svg +19 -0
  62. package/brands/current/assets/glyphs/orbit.svg +19 -0
  63. package/brands/current/assets/glyphs/package.svg +18 -0
  64. package/brands/current/assets/glyphs/plug.svg +18 -0
  65. package/brands/current/assets/glyphs/puzzle.svg +15 -0
  66. package/brands/current/assets/glyphs/radar.svg +22 -0
  67. package/brands/current/assets/glyphs/receipt.svg +17 -0
  68. package/brands/current/assets/glyphs/refresh-cw.svg +18 -0
  69. package/brands/current/assets/glyphs/rocket.svg +18 -0
  70. package/brands/current/assets/glyphs/route.svg +17 -0
  71. package/brands/current/assets/glyphs/scale.svg +19 -0
  72. package/brands/current/assets/glyphs/search.svg +16 -0
  73. package/brands/current/assets/glyphs/server.svg +18 -0
  74. package/brands/current/assets/glyphs/settings.svg +16 -0
  75. package/brands/current/assets/glyphs/share-2.svg +19 -0
  76. package/brands/current/assets/glyphs/shield-check.svg +16 -0
  77. package/brands/current/assets/glyphs/shuffle.svg +19 -0
  78. package/brands/current/assets/glyphs/sparkles.svg +19 -0
  79. package/brands/current/assets/glyphs/square-stack.svg +17 -0
  80. package/brands/current/assets/glyphs/target.svg +17 -0
  81. package/brands/current/assets/glyphs/trending-up.svg +16 -0
  82. package/brands/current/assets/glyphs/triangle-alert.svg +17 -0
  83. package/brands/current/assets/glyphs/trophy.svg +20 -0
  84. package/brands/current/assets/glyphs/users.svg +18 -0
  85. package/brands/current/assets/glyphs/wallet.svg +16 -0
  86. package/brands/current/assets/glyphs/wand-sparkles.svg +22 -0
  87. package/brands/current/assets/glyphs/workflow.svg +17 -0
  88. package/brands/current/assets/glyphs/zap.svg +15 -0
  89. package/brands/current/assets/mark-dark.png +0 -0
  90. package/brands/current/assets/mark-white.png +0 -0
  91. package/brands/current/assets/orb-cover.png +0 -0
  92. package/brands/current/assets/orb-glow.png +0 -0
  93. package/brands/current/assets/wordmark-dark.png +0 -0
  94. package/brands/current/assets/wordmark-white.png +0 -0
  95. package/brands/current/fonts/Geist-Bold.ttf +0 -0
  96. package/brands/current/fonts/Geist-BoldItalic.ttf +0 -0
  97. package/brands/current/fonts/Geist-ExtraBold.ttf +0 -0
  98. package/brands/current/fonts/Geist-ExtraBoldItalic.ttf +0 -0
  99. package/brands/current/fonts/Geist-Italic.ttf +0 -0
  100. package/brands/current/fonts/Geist-Light.ttf +0 -0
  101. package/brands/current/fonts/Geist-LightItalic.ttf +0 -0
  102. package/brands/current/fonts/Geist-Medium.ttf +0 -0
  103. package/brands/current/fonts/Geist-MediumItalic.ttf +0 -0
  104. package/brands/current/fonts/Geist-Regular.ttf +0 -0
  105. package/brands/current/fonts/Geist-SemiBold.ttf +0 -0
  106. package/brands/current/fonts/Geist-SemiBoldItalic.ttf +0 -0
  107. package/brands/current/lib/glyphs.js +87 -0
  108. package/brands/current/lib/measure.js +115 -0
  109. package/brands/current/lib/pdf.js +603 -0
  110. package/brands/current/lib/ttf.py +167 -0
  111. package/brands/current/lib/wandxml.py +37 -0
  112. package/brands/current/tokens.json +206 -0
  113. package/brands/next/assets/closing-art.png +0 -0
  114. package/brands/next/assets/cover-art.png +0 -0
  115. package/brands/next/assets/divider-art.png +0 -0
  116. package/brands/next/assets/glyphs/README.md +29 -0
  117. package/brands/next/assets/glyphs/activity.svg +15 -0
  118. package/brands/next/assets/glyphs/atom.svg +17 -0
  119. package/brands/next/assets/glyphs/badge-check.svg +16 -0
  120. package/brands/next/assets/glyphs/bell.svg +16 -0
  121. package/brands/next/assets/glyphs/blocks.svg +16 -0
  122. package/brands/next/assets/glyphs/book-open.svg +16 -0
  123. package/brands/next/assets/glyphs/bot.svg +20 -0
  124. package/brands/next/assets/glyphs/boxes.svg +26 -0
  125. package/brands/next/assets/glyphs/brain.svg +23 -0
  126. package/brands/next/assets/glyphs/briefcase.svg +16 -0
  127. package/brands/next/assets/glyphs/building-2.svg +21 -0
  128. package/brands/next/assets/glyphs/calendar.svg +18 -0
  129. package/brands/next/assets/glyphs/chart-column.svg +18 -0
  130. package/brands/next/assets/glyphs/chart-line.svg +16 -0
  131. package/brands/next/assets/glyphs/chart-pie.svg +16 -0
  132. package/brands/next/assets/glyphs/circle-check.svg +16 -0
  133. package/brands/next/assets/glyphs/clipboard-check.svg +17 -0
  134. package/brands/next/assets/glyphs/clock.svg +16 -0
  135. package/brands/next/assets/glyphs/cloud.svg +15 -0
  136. package/brands/next/assets/glyphs/code.svg +15 -0
  137. package/brands/next/assets/glyphs/coins.svg +18 -0
  138. package/brands/next/assets/glyphs/compass.svg +16 -0
  139. package/brands/next/assets/glyphs/cpu.svg +24 -0
  140. package/brands/next/assets/glyphs/database.svg +17 -0
  141. package/brands/next/assets/glyphs/eye.svg +16 -0
  142. package/brands/next/assets/glyphs/file-check.svg +17 -0
  143. package/brands/next/assets/glyphs/filter.svg +15 -0
  144. package/brands/next/assets/glyphs/fingerprint.svg +23 -0
  145. package/brands/next/assets/glyphs/flag.svg +16 -0
  146. package/brands/next/assets/glyphs/gauge.svg +16 -0
  147. package/brands/next/assets/glyphs/gavel.svg +19 -0
  148. package/brands/next/assets/glyphs/git-branch.svg +18 -0
  149. package/brands/next/assets/glyphs/globe.svg +17 -0
  150. package/brands/next/assets/glyphs/graduation-cap.svg +17 -0
  151. package/brands/next/assets/glyphs/handshake.svg +19 -0
  152. package/brands/next/assets/glyphs/hexagon.svg +15 -0
  153. package/brands/next/assets/glyphs/index.json +177 -0
  154. package/brands/next/assets/glyphs/infinity.svg +15 -0
  155. package/brands/next/assets/glyphs/key.svg +17 -0
  156. package/brands/next/assets/glyphs/landmark.svg +20 -0
  157. package/brands/next/assets/glyphs/layers.svg +17 -0
  158. package/brands/next/assets/glyphs/lightbulb.svg +17 -0
  159. package/brands/next/assets/glyphs/link.svg +16 -0
  160. package/brands/next/assets/glyphs/list-checks.svg +19 -0
  161. package/brands/next/assets/glyphs/lock.svg +16 -0
  162. package/brands/next/assets/glyphs/map.svg +17 -0
  163. package/brands/next/assets/glyphs/megaphone.svg +16 -0
  164. package/brands/next/assets/glyphs/message-square.svg +15 -0
  165. package/brands/next/assets/glyphs/milestone.svg +17 -0
  166. package/brands/next/assets/glyphs/network.svg +19 -0
  167. package/brands/next/assets/glyphs/orbit.svg +19 -0
  168. package/brands/next/assets/glyphs/package.svg +18 -0
  169. package/brands/next/assets/glyphs/plug.svg +18 -0
  170. package/brands/next/assets/glyphs/puzzle.svg +15 -0
  171. package/brands/next/assets/glyphs/radar.svg +22 -0
  172. package/brands/next/assets/glyphs/receipt.svg +17 -0
  173. package/brands/next/assets/glyphs/refresh-cw.svg +18 -0
  174. package/brands/next/assets/glyphs/rocket.svg +18 -0
  175. package/brands/next/assets/glyphs/route.svg +17 -0
  176. package/brands/next/assets/glyphs/scale.svg +19 -0
  177. package/brands/next/assets/glyphs/search.svg +16 -0
  178. package/brands/next/assets/glyphs/server.svg +18 -0
  179. package/brands/next/assets/glyphs/settings.svg +16 -0
  180. package/brands/next/assets/glyphs/share-2.svg +19 -0
  181. package/brands/next/assets/glyphs/shield-check.svg +16 -0
  182. package/brands/next/assets/glyphs/shuffle.svg +19 -0
  183. package/brands/next/assets/glyphs/sparkles.svg +19 -0
  184. package/brands/next/assets/glyphs/square-stack.svg +17 -0
  185. package/brands/next/assets/glyphs/target.svg +17 -0
  186. package/brands/next/assets/glyphs/trending-up.svg +16 -0
  187. package/brands/next/assets/glyphs/triangle-alert.svg +17 -0
  188. package/brands/next/assets/glyphs/trophy.svg +20 -0
  189. package/brands/next/assets/glyphs/users.svg +18 -0
  190. package/brands/next/assets/glyphs/wallet.svg +16 -0
  191. package/brands/next/assets/glyphs/wand-sparkles.svg +22 -0
  192. package/brands/next/assets/glyphs/workflow.svg +17 -0
  193. package/brands/next/assets/glyphs/zap.svg +15 -0
  194. package/brands/next/assets/layers-dark.png +0 -0
  195. package/brands/next/assets/layers-light.png +0 -0
  196. package/brands/next/assets/ornaments/burst-dark.png +0 -0
  197. package/brands/next/assets/ornaments/burst-light.png +0 -0
  198. package/brands/next/assets/ornaments/chain-dark.png +0 -0
  199. package/brands/next/assets/ornaments/chain-light.png +0 -0
  200. package/brands/next/assets/ornaments/coil-dark.png +0 -0
  201. package/brands/next/assets/ornaments/coil-light.png +0 -0
  202. package/brands/next/assets/ornaments/cone-dark.png +0 -0
  203. package/brands/next/assets/ornaments/cone-light.png +0 -0
  204. package/brands/next/assets/ornaments/diamond-dark.png +0 -0
  205. package/brands/next/assets/ornaments/diamond-light.png +0 -0
  206. package/brands/next/assets/ornaments/fan-dark.png +0 -0
  207. package/brands/next/assets/ornaments/fan-light.png +0 -0
  208. package/brands/next/assets/ornaments/globe-dark.png +0 -0
  209. package/brands/next/assets/ornaments/globe-light.png +0 -0
  210. package/brands/next/assets/ornaments/orbit-dark.png +0 -0
  211. package/brands/next/assets/ornaments/orbit-light.png +0 -0
  212. package/brands/next/assets/ornaments/rings-dark.png +0 -0
  213. package/brands/next/assets/ornaments/rings-light.png +0 -0
  214. package/brands/next/assets/ornaments/sphere-dark.png +0 -0
  215. package/brands/next/assets/ornaments/sphere-light.png +0 -0
  216. package/brands/next/assets/ornaments/sun-dark.png +0 -0
  217. package/brands/next/assets/ornaments/sun-light.png +0 -0
  218. package/brands/next/assets/photos/atrium.jpg +0 -0
  219. package/brands/next/assets/photos/cantilever.jpg +0 -0
  220. package/brands/next/assets/photos/corridor.jpg +0 -0
  221. package/brands/next/assets/photos/dome.jpg +0 -0
  222. package/brands/next/assets/photos/facade.jpg +0 -0
  223. package/brands/next/assets/photos/glass.jpg +0 -0
  224. package/brands/next/assets/photos/stairs.jpg +0 -0
  225. package/brands/next/assets/photos/tower.jpg +0 -0
  226. package/brands/next/assets/photos/walk.jpg +0 -0
  227. package/brands/next/assets/spark-gold.png +0 -0
  228. package/brands/next/assets/statement-art.png +0 -0
  229. package/brands/next/assets/wordmark-dark.png +0 -0
  230. package/brands/next/assets/wordmark-light.png +0 -0
  231. package/brands/next/assets/wordmark.svg +7 -0
  232. package/brands/next/fonts/FKRomanStandard-Light.ttf +0 -0
  233. package/brands/next/fonts/OFL-OverusedGrotesk.txt +93 -0
  234. package/brands/next/fonts/OverusedGrotesk-Italic.ttf +0 -0
  235. package/brands/next/fonts/OverusedGrotesk-Medium.ttf +0 -0
  236. package/brands/next/fonts/OverusedGrotesk-MediumItalic.ttf +0 -0
  237. package/brands/next/fonts/OverusedGrotesk-Roman.ttf +0 -0
  238. package/brands/next/fonts/OverusedGrotesk-SemiBold.ttf +0 -0
  239. package/brands/next/fonts/OverusedGrotesk-SemiBoldItalic.ttf +0 -0
  240. package/brands/next/fonts/faces.json +27 -0
  241. package/brands/next/lib/glyphs.js +89 -0
  242. package/brands/next/lib/measure.js +121 -0
  243. package/brands/next/lib/pdf.js +597 -0
  244. package/brands/next/lib/ttf.py +169 -0
  245. package/brands/next/lib/wandxml.py +37 -0
  246. package/brands/next/tokens.json +174 -0
  247. package/examples/gallery/job.mjs +81 -0
  248. package/examples/overview/job.mjs +99 -0
  249. package/lib/brand.js +115 -0
  250. package/lib/components.js +313 -0
  251. package/lib/content.js +66 -0
  252. package/lib/engine.js +280 -0
  253. package/lib/html_export.js +71 -0
  254. package/lib/pptx.js +446 -0
  255. package/lib/surfaces.js +62 -0
  256. package/package.json +17 -4
  257. package/templates/card.mjs +30 -0
  258. package/templates/page.mjs +52 -0
  259. package/templates/slide.mjs +46 -0
  260. package/tools/embed_fonts.py +154 -0
  261. package/wand.js +175 -0
  262. package/README.md +0 -3
package/.gitkeep ADDED
File without changes
package/PROMPT.md ADDED
@@ -0,0 +1,252 @@
1
+ # Wand Power Prompt — Studio (v0.1)
2
+
3
+ One design surface for every material a sales or marketing team needs, on
4
+ either Wand brand. The page is HTML; it is composed from a component library on
5
+ brand tokens; Chromium renders it; every gate measures that render; and every
6
+ export (PDF, PNG, PowerPoint, a one-file HTML) is read from it, so nothing can
7
+ drift from what was reviewed on screen.
8
+
9
+ This document is the design system and the pipeline, and the source of truth
10
+ on every design question. `brand/BRAND.md` and `brand-next/BRAND.md` win on
11
+ values (a hex, a face, an asset); `STATUS.md` is state; `SKILL.md` is procedure.
12
+
13
+ **Why this exists.** The outputs that reviewed best in October 2026 (the
14
+ Franklin Templeton case study, the aviation overview, the BofA talk) were all
15
+ hand-written HTML outside the kits: brand fonts and art through `brand.js`, a
16
+ palette, free composition, two gates. The form-filling kits (44 slide layouts,
17
+ 26 document blocks) guaranteed correctness and could not supply composition.
18
+ This kit keeps the freedom and systematises the rest: tokens, surfaces,
19
+ components, gates, exports.
20
+
21
+ ---
22
+
23
+ ## 0. Ground truth
24
+
25
+ Two brands, one component set.
26
+
27
+ | Brand | Directory | Faces | Guideline |
28
+ |---|---|---|---|
29
+ | `current` | `brand/` | Geist | the Kearney leadership deck; `brand/BRAND.md` |
30
+ | `next` | `brand-next/` | FK Roman Standard Light, Overused Grotesk | the website, read 2026-10-05; `brand-next/BRAND.md` |
31
+
32
+ Each directory's `tokens.json` carries the brand as values a kit can draw with:
33
+ `swatch` (the measured hexes), `roles` (what each value is for, once per
34
+ ground), `faces` (the files and their PowerPoint names), `shape` (radius,
35
+ strokes) and `art` (which file plays which role). A component asks for a role
36
+ (`--ink`, `--accent`, `--emph`) and never for a hex. Where a hex in
37
+ `tokens.json` and `BRAND.md` differ, `BRAND.md` is right and `tokens.json` has
38
+ drifted.
39
+
40
+ The new brand is for internal testing until the FK Roman Standard licence for
41
+ documents is settled (`brand-next/fonts/LICENSE-FONTS.md`).
42
+
43
+ ## 1. Surfaces — locked
44
+
45
+ A surface fixes the frame, the margins, where the chrome sits, the type scale
46
+ and the minimum type size. Nothing else. `kit/lib/surfaces.js` is the table.
47
+
48
+ | Surface | Canvas (px) | Content box | Base | Min type | For |
49
+ |---|---|---|---|---|---|
50
+ | `letter` | 816 × 1056 | 60 / 92 / 60 / 74 | 11.6px | 7px | documents, one- and two-pagers, case studies |
51
+ | `a4` | 794 × 1123 | as letter | 11.6px | 7px | the same, for Europe |
52
+ | `slide` | 1920 × 1080 | 72 / 178 / 72 / 112 | 21px | 13px | decks, talks |
53
+ | `square` | 1080 × 1080 | 72 / 150 / 72 / 120 | 22px | 14px | social cards |
54
+ | `og` | 1200 × 630 | 64 / 120 / 64 / 90 | 20px | 13px | link previews, banners |
55
+
56
+ The letter scale is the Franklin Templeton letter's; the slide scale is its
57
+ deck's. A letter page is read at 96 px/in, a slide at 192 px/in (10 in wide).
58
+
59
+ **Chrome on every page:** the tag and eyebrow top left (`TAG | Section`), the
60
+ mark top right, the footer with the running line and the page number. A page
61
+ may drop it (`chrome: false`) only on a social card.
62
+
63
+ ## 2. Colour
64
+
65
+ Roles, per ground. A page is `light` or `dark`; the same role names resolve to
66
+ the ground's values, so one component draws on both.
67
+
68
+ | Role | Light (current) | Dark (current) | Use |
69
+ |---|---|---|---|
70
+ | `bg` | F8F6FB | 240F48 | the ground |
71
+ | `paper` | FFFFFF | 291D5A | cards, nodes, chips |
72
+ | `ink` | 1D1A33 | FFFFFF | titles, values |
73
+ | `text` | 5C5779 | F5F5F5 | running text |
74
+ | `soft` / `muted` | 555077 / 999999 | BBBBBB / 746B98 | small print / chrome |
75
+ | `accent` | 8B7CF6 | 9481FF | anything drawn: meters, dots, arrows |
76
+ | `accentText` | 6C5CE7 | 9481FF | the accent phrase in a title, outcomes, deltas |
77
+ | `label` | 6C5CE7 | A78BFA | tags, section numbers |
78
+ | `emph` / `emphInk` / `emphText` / `emphAccent` | 251C63 / FFF / DCD6F5 / AA9BFF | 4D2E8C / FFF / DCD6F5 / C4B5F4 | the emphasis card and what sits on it |
79
+ | `stroke` / `rule` / `track` / `surface` | E4E0F2 / E4E0F2 / E9E6F5 / EBE8F8 | 5B4BB0 / 3A2E63 / 1A1033 / 1A1033 | card strokes, hairlines, meter tracks, tiles |
80
+
81
+ The next brand fills the same roles from the website (gold the one accent,
82
+ violets as grounds, beige as paper); see `brand-next/tokens.json`.
83
+
84
+ **Rules.**
85
+ - One accent. The accent phrase in a title is the single most recognisable
86
+ device in the system: one per title, never two, the sentence period in ink.
87
+ - One emphasis card per row, at most one or two per page.
88
+ - Light pages carry no art. Dark pages carry art on the cover, the closing and
89
+ a statement; a dark content page is flat.
90
+ - A job may declare a client's own colours as a `theme` (role overrides and
91
+ `extra` hexes). The brand gate then reports them as declared, so a client
92
+ look is a decision on record rather than a hex that slipped in.
93
+
94
+ ## 3. Typography
95
+
96
+ Three face roles per brand: `display` (titles, figures, the lockup), `body`
97
+ (everything read), `label` (tags, eyebrows, table heads, chips' numerals).
98
+ Tracking and leading travel with the face in `tokens.json`; the CSS sets them
99
+ from the same values.
100
+
101
+ | Role | current | next |
102
+ |---|---|---|
103
+ | display | Geist SemiBold, −0.02em | FK Roman Standard Light, −0.07em, 1.06 |
104
+ | body | Geist Regular | Overused Grotesk, −0.02em |
105
+ | label | Geist SemiBold, +0.18em, caps | FK Roman Standard Light, caps |
106
+
107
+ **Weight carries no hierarchy on the next brand** (the serif ships one weight);
108
+ the face does. Components therefore never rely on bold to separate levels, and
109
+ `strong` is 600 on the body face only.
110
+
111
+ **The scale is the surface's** (`--t-h1` … `--t-note`), so a component sets
112
+ `font-size: var(--t-h3)` and lands right on every surface. Nothing under the
113
+ surface's minimum; the type gate fails the build otherwise.
114
+
115
+ Figures are tabular (`font-variant-numeric: tabular-nums` on the page).
116
+
117
+ ## 4. Chrome
118
+
119
+ Drawn by `c.page()` on every page: eyebrow (`job.tag | eyebrow`), mark, footer
120
+ (`job.footer`, page number). The cover and closing pages are `c.cover()` and
121
+ `c.closing()`, which place the brand art and the lockup; a job gives them
122
+ words, never styling. Every piece of chrome is `.deco` or chrome-classed, so
123
+ the gates know what is content and what is frame.
124
+
125
+ ## 5. Catalog
126
+
127
+ The components (`node wand.js components`; `kit/lib/components.js`):
128
+
129
+ | Component | For |
130
+ |---|---|
131
+ | `page`, `cover`, `closing` | the three page kinds |
132
+ | `sec(num, title)` | a numbered section heading; the title carries the accent phrase |
133
+ | `lead`, `body`, `small`, `note`, `tag` | the type roles |
134
+ | `cols(n, items)` | a grid of 2 to 5, or `12` / `21` for a 1.35 : 1 split |
135
+ | `card({ tag, title, body, out, emph })` | the card, the emphasis card, the function card with its outcome line |
136
+ | `strip(labels, { on })`, `chip`, `phase(i, label, line)` | the journey: numbered chips with arrows, the chip-then-heading row |
137
+ | `flow({ label, nodes, note })` | the five-node tool-vs-labor flow |
138
+ | `table({ head, rows, emph })` | ruled tables; a cell with `meter: true` draws its bar |
139
+ | `quote({ text, by, emph })`, `who` | testimonial cards, name over role, no photographs |
140
+ | `stats`, `delta(from, to)` | figures, before-and-after |
141
+ | `steps(items)` | next steps with arrows |
142
+ | `callout`, `list`, `chapter`, `img`, `icon`, `tile` | the rest |
143
+
144
+ **Composition is free.** A job writes the markup it needs from these, adds its
145
+ own CSS on top (custom properties only) and may write raw markup where no
146
+ component fits. Recipes, not forms: `templates/` and `examples/` are starting
147
+ points to copy from, not fields to fill. The things the catalogue does not
148
+ decide, and that make or break a page:
149
+
150
+ - **An argument per page.** Before any markup, one line per page saying what
151
+ the page claims. A document that passes every gate and "spreads information
152
+ with no story" (the aviation round-1 verdict) fails here.
153
+ - **Three sections a page, not four.** The cramped first pass of the aviation
154
+ overview had four; the accepted one had three.
155
+ - **Separate with alignment, hairlines and type, not boxes.** Cards are for
156
+ things that are a set (layers, functions, steps); running text sits on the
157
+ ground.
158
+ - **Short lines in cards.** One sentence and an outcome. The card's body is
159
+ never the place for the argument.
160
+ - **Equal heights in a row** (`stretch`), titles at one height, and the empty
161
+ space at the foot of a page shared by its sections, never left under one.
162
+
163
+ ## 6. Pipeline
164
+
165
+ ```
166
+ new ─▶ argue ─▶ content ─▶ compose ─▶ build ─▶ review ─▶ ship
167
+ ```
168
+
169
+ 1. **new** — `node wand.js new <dir> --surface letter --brand current`. A job
170
+ folder: `job.mjs`, `content.txt`.
171
+ 2. **argue** — the page list with one claim per page, in the chat, before any
172
+ markup. For a rebuild, the mapping from source pages to it.
173
+ 3. **content** — for a rebuild, the source's strings into `content.txt`, one
174
+ per line, verbatim (`tools/extract.py` from the decks or docs kit, or
175
+ `pdftotext`). Every departure declared in `edits`; every line left out in
176
+ `cut`. For authored copy, no file.
177
+ 4. **compose** — `pages(c)`. Lines by number (`c.L(12)`), components, job CSS.
178
+ 5. **build** — `node wand.js build <job>`: the gates (§7), then the PDF, a PNG
179
+ per page, the contact sheet. `watch` does this on every save in under a
180
+ second with the browser kept warm.
181
+ 6. **review** — look at `out/sheet.png`, then at any page the gates named.
182
+ Read the pages as the reader will: does each carry its claim?
183
+ 7. **ship** — `node wand.js ship <job> [--pptx]`: the build, the one-file HTML,
184
+ the PowerPoint. The review note says what was changed from the source and
185
+ why, which gates ran, and what a human still has to decide.
186
+
187
+ ## 7. Gates — every build, every job
188
+
189
+ | Gate | Fails when | Blind to |
190
+ |---|---|---|
191
+ | fit | anything in the content box runs past it, under the footer, or off the sides | a page that fits and reads badly |
192
+ | coverage | a line of `content.txt` is not on the page (whole, or in its declared parts), less the `cut` lines | a line that is present and in the wrong place |
193
+ | overlap | one text box sits on another | text on art |
194
+ | brand | a computed colour, border or fill that is not a token or a declared theme colour | gradients and images |
195
+ | fonts | a text run not in the brand's faces | a weight the face lacks (the browser synthesises) |
196
+ | type | text under the surface's minimum size | |
197
+ | dashes | an em dash reaches a page (JP Sacy, Oct 2026: a GPT marker) | |
198
+ | names | a denied name (a previous client's) is on a page | |
199
+ | pdf text | the PDF's text misses a line, or carries an em dash | |
200
+ | contrast (warn) | text under WCAG AA against its background, chrome excepted | |
201
+ | measure (warn) | a paragraph over the surface's characters-per-line | |
202
+ | console | a page error | |
203
+
204
+ The gates read the DOM Chromium laid out for the PDF; nothing is inferred from
205
+ the spec. What no gate sees: the argument, the pacing, and whether the right
206
+ component was chosen. That is the review.
207
+
208
+ ## 8. Content rules
209
+
210
+ - **Verbatim for a rebuild.** Reflowing is fine; rewording is not. Every
211
+ departure is an `edit` with the needle and the replacement, so the review
212
+ note can list it and coverage still passes.
213
+ - **No em dashes** in anything generated: a comma or a semicolon, a colon
214
+ before a list. For a source that has them, declare the swaps as edits.
215
+ - **No photographs of people** in sales material without consent on file. The
216
+ `quote` component sets name over role and nothing else.
217
+ - **A client's confidential detail** (a vendor they use, a figure they have not
218
+ published) does not travel into a generic piece. The `denylist` catches a
219
+ name; the review catches the rest.
220
+ - **Figures are sourced on the day** and dated on the page.
221
+
222
+ ## 9. Environment gotchas
223
+
224
+ - **The browser.** The kit renders with Chromium. `findChrome()` looks at
225
+ `WAND_CHROME`, Playwright's own cache, then the system. In a sandbox without
226
+ one, `doctor` says so and nothing renders: there is no browser-free fallback
227
+ in this kit.
228
+ - **LibreOffice** substitutes faces and widens text; it is a geometry check for
229
+ the PowerPoint export, never a judge of fit.
230
+ - **Google Slides and Keynote** ignore embedded fonts; the `.pptx` needs the
231
+ faces installed there.
232
+ - **iCloud** evicts files under `Documents/`; a build that hangs on a font is
233
+ usually that.
234
+
235
+ ## 10. Known drift — don't propagate
236
+
237
+ - `brand/BRAND.md` keeps values in prose and `wand_kit.js` keeps a copy; this
238
+ kit reads `brand/tokens.json`, added 2026-10-16 from the same values.
239
+ - The Franklin Templeton case study shipped on colours sampled from the
240
+ client's own slides, not the brand's. Its studio regression declares them as
241
+ a theme; nothing in the components carries them.
242
+
243
+ ## 11. Open items
244
+
245
+ 1. **DOCX export.** Declined for now: Word cannot hold these pages. If needed,
246
+ a semantic export (headings, prose, tables) as an editable-text version,
247
+ labelled as such.
248
+ 2. **The sandbox's browser.** Confirm Chromium is present where sellers work
249
+ before the kit replaces `decks` and `docs`.
250
+ 3. **The chapter panel and the talk runtime** (presenter view, demos) from the
251
+ BofA deck: carry into the slide surface when a talk needs them.
252
+ 4. **Email and banner surfaces**: declared in §1's spirit, not yet in the table.
package/SKILL.md ADDED
@@ -0,0 +1,100 @@
1
+ ---
2
+ name: wand-studio
3
+ description: Design any Wand sales or marketing material on either brand - a deck, a document, a one-pager, a case study, social cards - as PDF, PowerPoint and one-file HTML, with gates. Use when a .pptx, .docx or .pdf is attached, or branded output is wanted from a brief.
4
+ compatibility: Requires Node.js 18+, code execution enabled in claude.ai (Settings > Features), and a Chromium the kit can find (Playwright's cache or the system). No network needed once installed. Python 3 embeds fonts in the .pptx; without it the deck ships with the faces named, not embedded.
5
+ license: Proprietary - Wand AI
6
+ metadata:
7
+ version: "0.1.0"
8
+ ---
9
+
10
+
11
+ # Wand studio
12
+
13
+ ## First: find the kit and stand in it
14
+
15
+ 1. **Installed from npm** (the usual way): it is at `node_modules/wand-kit/`.
16
+ If it is not there yet: `npm install wand-kit@next --no-audit --no-fund`.
17
+ 2. **Attached to the chat as a zip**: unzip it and enter the folder it makes.
18
+ 3. **You are already inside it**: `wand.js` is next to this file.
19
+
20
+ Then:
21
+
22
+ ```bash
23
+ node wand.js doctor
24
+ ```
25
+
26
+ Every row must be clear, and `chromium` must name a binary. If it does not,
27
+ **stop and say so**: nothing renders without a browser, and never report checks
28
+ you did not run. Every path below is relative to the kit folder.
29
+
30
+ ## What this is
31
+
32
+ One HTML page per slide, sheet or card, composed from a component library on
33
+ the brand's tokens; Chromium renders it; every gate measures that render; the
34
+ PDF, the PNGs, the PowerPoint and the one-file HTML are all read from it.
35
+ `PROMPT.md` is the design system: read it once for design decisions, not per
36
+ page. `node wand.js components` lists the vocabulary.
37
+
38
+ Two brands: `current` (Geist, the default) and `next` (the website's; for
39
+ internal testing until its font licence is settled). Use `next` only when the
40
+ user says *new brand*, *new guidelines* or *website look*.
41
+
42
+ ## Read only what the job needs
43
+
44
+ | Job | Read |
45
+ |---|---|
46
+ | A document, a two-pager, a case study | `PROMPT.md` §5 and `templates/page.mjs`; `examples/overview/job.mjs` for a finished one |
47
+ | A deck or a talk | §5 and `templates/slide.mjs` |
48
+ | Social cards, a banner | `templates/card.mjs` |
49
+ | Edit a job this kit built | the job's `job.mjs` only, then `build` |
50
+
51
+ ## The jobs
52
+
53
+ ### Rebuild from a source they attached (a .pptx, .docx, .pdf, .html)
54
+
55
+ 1. Dump the source's strings verbatim, one per line, into `content.txt`:
56
+ `pdftotext -layout` for a PDF; for a .pptx or .docx, unzip and read the XML
57
+ text runs in order, or use the decks kit's `tools/extract.py` if present.
58
+ 2. **Write the page list in the chat before any markup**: one line per page
59
+ with the claim it carries and which source lines it takes. Then compose.
60
+ 3. `node wand.js new work/<name> --surface letter|slide --brand current`,
61
+ write `pages(c)` with `c.L(n)` for every string, declare every departure
62
+ in `edits` (no em dashes: swap them for commas or semicolons there) and
63
+ every line left out in `cut`.
64
+ 4. `node wand.js build work/<name>/job.mjs` until every hard gate is ok. Look
65
+ at `out/sheet.png`. Open a page only where something looks off.
66
+ 5. `node wand.js ship work/<name>/job.mjs --pptx` for a deck; without `--pptx`
67
+ for a document. Deliver the PDF (and the .pptx, and the .html) with the
68
+ review note.
69
+
70
+ ### Author from a brief
71
+
72
+ Skip `content.txt` (delete the `content:` line in the job). Write the page list
73
+ with its claims first, then the pages. Coverage is skipped and says so; the
74
+ review reads the argument instead. Three sections a page, not four.
75
+
76
+ ### Make it generic (an industry version of a client piece)
77
+
78
+ Author from the client piece: remove the client's figures, names, quotes and
79
+ vendors; put the client's name and its people in `denylist` so the gate proves
80
+ they are gone. Say in the note what was cut and what was generalised.
81
+
82
+ ### Social cards
83
+
84
+ `--surface square` or `og`; one `c.page()` per card; `out/pages/pNN.png` are
85
+ the deliverables.
86
+
87
+ ## The review note, always
88
+
89
+ What was changed from the source and why (every edit, every cut); the gate
90
+ table as printed; what a human still has to decide (a figure to confirm, a
91
+ quote to clear, a claim legal should see). A file delivered without the gate
92
+ table has been checked by nobody.
93
+
94
+ ## Available scripts
95
+
96
+ - **`wand.js`** — doctor, new, build, check, ship, watch, gallery, components, brands
97
+ - **`lib/engine.js`** — the render and the gates
98
+ - **`lib/components.js`** — the vocabulary and its CSS
99
+ - **`lib/pptx.js`**, **`tools/embed_fonts.py`** — the PowerPoint export
100
+ - **`lib/html_export.js`** — the one-file HTML with its runtime
package/START-HERE.md ADDED
@@ -0,0 +1,16 @@
1
+ # Wand studio — start here
2
+
3
+ ```bash
4
+ node wand.js doctor # what works here; chromium must name a binary
5
+ node wand.js new work/acme --surface letter --brand current
6
+ # write work/acme/job.mjs (pages(c)) and, for a rebuild, work/acme/content.txt
7
+ node wand.js build work/acme/job.mjs # gates, PDF, a PNG per page, out/sheet.png
8
+ node wand.js ship work/acme/job.mjs --pptx # + one-file HTML, PowerPoint
9
+ ```
10
+
11
+ `node wand.js components` lists the vocabulary; `examples/overview/job.mjs` is
12
+ a finished document and `examples/gallery/job.mjs` every component on one
13
+ sheet (`node wand.js gallery --brand next` draws it on the website's brand).
14
+
15
+ `PROMPT.md` is the design system. `SKILL.md` is the procedure. Read §5 of the
16
+ prompt before composing; everything else when a gate names it.
@@ -0,0 +1,29 @@
1
+ # Glyphs — Lucide
2
+
3
+ 76 icons from [Lucide](https://lucide.dev) v0.469.0, **ISC licensed** (permissive:
4
+ use, modify and redistribute, keep the notice). They replace the numbered PNGs
5
+ that were reverse-extracted from a reference deck.
6
+
7
+ Two problems they fix, both of which were standing known gaps:
8
+
9
+ **Polarity.** The old glyphs were baked white or baked accent, so a white one on
10
+ a light-theme `surface` tile was invisible. These are single-colour stroke SVGs
11
+ with `stroke="currentColor"`, and the kit substitutes the theme's ink colour at
12
+ build time. There is no variant to pick and nothing to get wrong.
13
+
14
+ **Meaning.** They have names. A spec says `icon: "shield-check"`, not
15
+ `icon: "icon-17.png"`. `index.json` groups them by what a deck actually needs —
16
+ governance, workforce, platform, process, outcome, signal.
17
+
18
+ ## How they reach the deck
19
+
20
+ As vector. pptxgenjs writes the OOXML `asvg:svgBlip` extension with a raster
21
+ fallback, so PowerPoint 2016+ renders the SVG and anything older gets the PNG.
22
+ Nothing is rasterised at build time, so the kit still needs no native
23
+ dependency.
24
+
25
+ ## The old set
26
+
27
+ `../icons/*.png` is still there and still works — every existing spec references
28
+ those filenames. New specs should use glyph names. The two sets can coexist
29
+ indefinitely; `iconTile` resolves a name first and falls back to a filename.
@@ -0,0 +1,15 @@
1
+ <!-- @license lucide-static v0.469.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-activity"
4
+ xmlns="http://www.w3.org/2000/svg"
5
+ width="24"
6
+ height="24"
7
+ viewBox="0 0 24 24"
8
+ fill="none"
9
+ stroke="currentColor"
10
+ stroke-width="2"
11
+ stroke-linecap="round"
12
+ stroke-linejoin="round"
13
+ >
14
+ <path d="M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2" />
15
+ </svg>
@@ -0,0 +1,17 @@
1
+ <!-- @license lucide-static v0.469.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-atom"
4
+ xmlns="http://www.w3.org/2000/svg"
5
+ width="24"
6
+ height="24"
7
+ viewBox="0 0 24 24"
8
+ fill="none"
9
+ stroke="currentColor"
10
+ stroke-width="2"
11
+ stroke-linecap="round"
12
+ stroke-linejoin="round"
13
+ >
14
+ <circle cx="12" cy="12" r="1" />
15
+ <path d="M20.2 20.2c2.04-2.03.02-7.36-4.5-11.9-4.54-4.52-9.87-6.54-11.9-4.5-2.04 2.03-.02 7.36 4.5 11.9 4.54 4.52 9.87 6.54 11.9 4.5Z" />
16
+ <path d="M15.7 15.7c4.52-4.54 6.54-9.87 4.5-11.9-2.03-2.04-7.36-.02-11.9 4.5-4.52 4.54-6.54 9.87-4.5 11.9 2.03 2.04 7.36.02 11.9-4.5Z" />
17
+ </svg>
@@ -0,0 +1,16 @@
1
+ <!-- @license lucide-static v0.469.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-badge-check"
4
+ xmlns="http://www.w3.org/2000/svg"
5
+ width="24"
6
+ height="24"
7
+ viewBox="0 0 24 24"
8
+ fill="none"
9
+ stroke="currentColor"
10
+ stroke-width="2"
11
+ stroke-linecap="round"
12
+ stroke-linejoin="round"
13
+ >
14
+ <path d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z" />
15
+ <path d="m9 12 2 2 4-4" />
16
+ </svg>
@@ -0,0 +1,16 @@
1
+ <!-- @license lucide-static v0.469.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-bell"
4
+ xmlns="http://www.w3.org/2000/svg"
5
+ width="24"
6
+ height="24"
7
+ viewBox="0 0 24 24"
8
+ fill="none"
9
+ stroke="currentColor"
10
+ stroke-width="2"
11
+ stroke-linecap="round"
12
+ stroke-linejoin="round"
13
+ >
14
+ <path d="M10.268 21a2 2 0 0 0 3.464 0" />
15
+ <path d="M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326" />
16
+ </svg>
@@ -0,0 +1,16 @@
1
+ <!-- @license lucide-static v0.469.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-blocks"
4
+ xmlns="http://www.w3.org/2000/svg"
5
+ width="24"
6
+ height="24"
7
+ viewBox="0 0 24 24"
8
+ fill="none"
9
+ stroke="currentColor"
10
+ stroke-width="2"
11
+ stroke-linecap="round"
12
+ stroke-linejoin="round"
13
+ >
14
+ <rect width="7" height="7" x="14" y="3" rx="1" />
15
+ <path d="M10 21V8a1 1 0 0 0-1-1H4a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-5a1 1 0 0 0-1-1H3" />
16
+ </svg>
@@ -0,0 +1,16 @@
1
+ <!-- @license lucide-static v0.469.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-book-open"
4
+ xmlns="http://www.w3.org/2000/svg"
5
+ width="24"
6
+ height="24"
7
+ viewBox="0 0 24 24"
8
+ fill="none"
9
+ stroke="currentColor"
10
+ stroke-width="2"
11
+ stroke-linecap="round"
12
+ stroke-linejoin="round"
13
+ >
14
+ <path d="M12 7v14" />
15
+ <path d="M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z" />
16
+ </svg>
@@ -0,0 +1,20 @@
1
+ <!-- @license lucide-static v0.469.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-bot"
4
+ xmlns="http://www.w3.org/2000/svg"
5
+ width="24"
6
+ height="24"
7
+ viewBox="0 0 24 24"
8
+ fill="none"
9
+ stroke="currentColor"
10
+ stroke-width="2"
11
+ stroke-linecap="round"
12
+ stroke-linejoin="round"
13
+ >
14
+ <path d="M12 8V4H8" />
15
+ <rect width="16" height="12" x="4" y="8" rx="2" />
16
+ <path d="M2 14h2" />
17
+ <path d="M20 14h2" />
18
+ <path d="M15 13v2" />
19
+ <path d="M9 13v2" />
20
+ </svg>
@@ -0,0 +1,26 @@
1
+ <!-- @license lucide-static v0.469.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-boxes"
4
+ xmlns="http://www.w3.org/2000/svg"
5
+ width="24"
6
+ height="24"
7
+ viewBox="0 0 24 24"
8
+ fill="none"
9
+ stroke="currentColor"
10
+ stroke-width="2"
11
+ stroke-linecap="round"
12
+ stroke-linejoin="round"
13
+ >
14
+ <path d="M2.97 12.92A2 2 0 0 0 2 14.63v3.24a2 2 0 0 0 .97 1.71l3 1.8a2 2 0 0 0 2.06 0L12 19v-5.5l-5-3-4.03 2.42Z" />
15
+ <path d="m7 16.5-4.74-2.85" />
16
+ <path d="m7 16.5 5-3" />
17
+ <path d="M7 16.5v5.17" />
18
+ <path d="M12 13.5V19l3.97 2.38a2 2 0 0 0 2.06 0l3-1.8a2 2 0 0 0 .97-1.71v-3.24a2 2 0 0 0-.97-1.71L17 10.5l-5 3Z" />
19
+ <path d="m17 16.5-5-3" />
20
+ <path d="m17 16.5 4.74-2.85" />
21
+ <path d="M17 16.5v5.17" />
22
+ <path d="M7.97 4.42A2 2 0 0 0 7 6.13v4.37l5 3 5-3V6.13a2 2 0 0 0-.97-1.71l-3-1.8a2 2 0 0 0-2.06 0l-3 1.8Z" />
23
+ <path d="M12 8 7.26 5.15" />
24
+ <path d="m12 8 4.74-2.85" />
25
+ <path d="M12 13.5V8" />
26
+ </svg>
@@ -0,0 +1,23 @@
1
+ <!-- @license lucide-static v0.469.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-brain"
4
+ xmlns="http://www.w3.org/2000/svg"
5
+ width="24"
6
+ height="24"
7
+ viewBox="0 0 24 24"
8
+ fill="none"
9
+ stroke="currentColor"
10
+ stroke-width="2"
11
+ stroke-linecap="round"
12
+ stroke-linejoin="round"
13
+ >
14
+ <path d="M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z" />
15
+ <path d="M12 5a3 3 0 1 1 5.997.125 4 4 0 0 1 2.526 5.77 4 4 0 0 1-.556 6.588A4 4 0 1 1 12 18Z" />
16
+ <path d="M15 13a4.5 4.5 0 0 1-3-4 4.5 4.5 0 0 1-3 4" />
17
+ <path d="M17.599 6.5a3 3 0 0 0 .399-1.375" />
18
+ <path d="M6.003 5.125A3 3 0 0 0 6.401 6.5" />
19
+ <path d="M3.477 10.896a4 4 0 0 1 .585-.396" />
20
+ <path d="M19.938 10.5a4 4 0 0 1 .585.396" />
21
+ <path d="M6 18a4 4 0 0 1-1.967-.516" />
22
+ <path d="M19.967 17.484A4 4 0 0 1 18 18" />
23
+ </svg>
@@ -0,0 +1,16 @@
1
+ <!-- @license lucide-static v0.469.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-briefcase"
4
+ xmlns="http://www.w3.org/2000/svg"
5
+ width="24"
6
+ height="24"
7
+ viewBox="0 0 24 24"
8
+ fill="none"
9
+ stroke="currentColor"
10
+ stroke-width="2"
11
+ stroke-linecap="round"
12
+ stroke-linejoin="round"
13
+ >
14
+ <path d="M16 20V4a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16" />
15
+ <rect width="20" height="14" x="2" y="6" rx="2" />
16
+ </svg>
@@ -0,0 +1,21 @@
1
+ <!-- @license lucide-static v0.469.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-building-2"
4
+ xmlns="http://www.w3.org/2000/svg"
5
+ width="24"
6
+ height="24"
7
+ viewBox="0 0 24 24"
8
+ fill="none"
9
+ stroke="currentColor"
10
+ stroke-width="2"
11
+ stroke-linecap="round"
12
+ stroke-linejoin="round"
13
+ >
14
+ <path d="M6 22V4a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v18Z" />
15
+ <path d="M6 12H4a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h2" />
16
+ <path d="M18 9h2a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2h-2" />
17
+ <path d="M10 6h4" />
18
+ <path d="M10 10h4" />
19
+ <path d="M10 14h4" />
20
+ <path d="M10 18h4" />
21
+ </svg>
@@ -0,0 +1,18 @@
1
+ <!-- @license lucide-static v0.469.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-calendar"
4
+ xmlns="http://www.w3.org/2000/svg"
5
+ width="24"
6
+ height="24"
7
+ viewBox="0 0 24 24"
8
+ fill="none"
9
+ stroke="currentColor"
10
+ stroke-width="2"
11
+ stroke-linecap="round"
12
+ stroke-linejoin="round"
13
+ >
14
+ <path d="M8 2v4" />
15
+ <path d="M16 2v4" />
16
+ <rect width="18" height="18" x="3" y="4" rx="2" />
17
+ <path d="M3 10h18" />
18
+ </svg>