wand-kit 0.0.0-stage → 0.2.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 +255 -0
  3. package/SKILL.md +117 -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 +83 -0
  248. package/examples/overview/job.mjs +99 -0
  249. package/lib/brand.js +135 -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 +179 -0
  262. package/README.md +0 -3
package/.gitkeep ADDED
File without changes
package/PROMPT.md ADDED
@@ -0,0 +1,255 @@
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
+ `current` is the default while the two overlap; a job is on `next` when the
41
+ user asks for the new brand. The default is one constant, `DEFAULT_BRAND` in
42
+ `kit/lib/brand.js`, and `doctor` prints the rule from it. The FK Roman
43
+ Standard licence for documents is still to be confirmed
44
+ (`brand-next/fonts/LICENSE-FONTS.md`).
45
+
46
+ ## 1. Surfaces — locked
47
+
48
+ A surface fixes the frame, the margins, where the chrome sits, the type scale
49
+ and the minimum type size. Nothing else. `kit/lib/surfaces.js` is the table.
50
+
51
+ | Surface | Canvas (px) | Content box | Base | Min type | For |
52
+ |---|---|---|---|---|---|
53
+ | `letter` | 816 × 1056 | 60 / 92 / 60 / 74 | 11.6px | 7px | documents, one- and two-pagers, case studies |
54
+ | `a4` | 794 × 1123 | as letter | 11.6px | 7px | the same, for Europe |
55
+ | `slide` | 1920 × 1080 | 72 / 178 / 72 / 112 | 21px | 13px | decks, talks |
56
+ | `square` | 1080 × 1080 | 72 / 150 / 72 / 120 | 22px | 14px | social cards |
57
+ | `og` | 1200 × 630 | 64 / 120 / 64 / 90 | 20px | 13px | link previews, banners |
58
+
59
+ The letter scale is the Franklin Templeton letter's; the slide scale is its
60
+ deck's. A letter page is read at 96 px/in, a slide at 192 px/in (10 in wide).
61
+
62
+ **Chrome on every page:** the tag and eyebrow top left (`TAG | Section`), the
63
+ mark top right, the footer with the running line and the page number. A page
64
+ may drop it (`chrome: false`) only on a social card.
65
+
66
+ ## 2. Colour
67
+
68
+ Roles, per ground. A page is `light` or `dark`; the same role names resolve to
69
+ the ground's values, so one component draws on both.
70
+
71
+ | Role | Light (current) | Dark (current) | Use |
72
+ |---|---|---|---|
73
+ | `bg` | F8F6FB | 240F48 | the ground |
74
+ | `paper` | FFFFFF | 291D5A | cards, nodes, chips |
75
+ | `ink` | 1D1A33 | FFFFFF | titles, values |
76
+ | `text` | 5C5779 | F5F5F5 | running text |
77
+ | `soft` / `muted` | 555077 / 999999 | BBBBBB / 746B98 | small print / chrome |
78
+ | `accent` | 8B7CF6 | 9481FF | anything drawn: meters, dots, arrows |
79
+ | `accentText` | 6C5CE7 | 9481FF | the accent phrase in a title, outcomes, deltas |
80
+ | `label` | 6C5CE7 | A78BFA | tags, section numbers |
81
+ | `emph` / `emphInk` / `emphText` / `emphAccent` | 251C63 / FFF / DCD6F5 / AA9BFF | 4D2E8C / FFF / DCD6F5 / C4B5F4 | the emphasis card and what sits on it |
82
+ | `stroke` / `rule` / `track` / `surface` | E4E0F2 / E4E0F2 / E9E6F5 / EBE8F8 | 5B4BB0 / 3A2E63 / 1A1033 / 1A1033 | card strokes, hairlines, meter tracks, tiles |
83
+
84
+ The next brand fills the same roles from the website (gold the one accent,
85
+ violets as grounds, beige as paper); see `brand-next/tokens.json`.
86
+
87
+ **Rules.**
88
+ - One accent. The accent phrase in a title is the single most recognisable
89
+ device in the system: one per title, never two, the sentence period in ink.
90
+ - One emphasis card per row, at most one or two per page.
91
+ - Light pages carry no art. Dark pages carry art on the cover, the closing and
92
+ a statement; a dark content page is flat.
93
+ - A job may declare a client's own colours as a `theme` (role overrides and
94
+ `extra` hexes). The brand gate then reports them as declared, so a client
95
+ look is a decision on record rather than a hex that slipped in.
96
+
97
+ ## 3. Typography
98
+
99
+ Three face roles per brand: `display` (titles, figures, the lockup), `body`
100
+ (everything read), `label` (tags, eyebrows, table heads, chips' numerals).
101
+ Tracking and leading travel with the face in `tokens.json`; the CSS sets them
102
+ from the same values.
103
+
104
+ | Role | current | next |
105
+ |---|---|---|
106
+ | display | Geist SemiBold, −0.02em | FK Roman Standard Light, −0.07em, 1.06 |
107
+ | body | Geist Regular | Overused Grotesk, −0.02em |
108
+ | label | Geist SemiBold, +0.18em, caps | FK Roman Standard Light, caps |
109
+
110
+ **Weight carries no hierarchy on the next brand** (the serif ships one weight);
111
+ the face does. Components therefore never rely on bold to separate levels, and
112
+ `strong` is 600 on the body face only.
113
+
114
+ **The scale is the surface's** (`--t-h1` … `--t-note`), so a component sets
115
+ `font-size: var(--t-h3)` and lands right on every surface. Nothing under the
116
+ surface's minimum; the type gate fails the build otherwise.
117
+
118
+ Figures are tabular (`font-variant-numeric: tabular-nums` on the page).
119
+
120
+ ## 4. Chrome
121
+
122
+ Drawn by `c.page()` on every page: eyebrow (`job.tag | eyebrow`), mark, footer
123
+ (`job.footer`, page number). The cover and closing pages are `c.cover()` and
124
+ `c.closing()`, which place the brand art and the lockup; a job gives them
125
+ words, never styling. Every piece of chrome is `.deco` or chrome-classed, so
126
+ the gates know what is content and what is frame.
127
+
128
+ ## 5. Catalog
129
+
130
+ The components (`node wand.js components`; `kit/lib/components.js`):
131
+
132
+ | Component | For |
133
+ |---|---|
134
+ | `page`, `cover`, `closing` | the three page kinds |
135
+ | `sec(num, title)` | a numbered section heading; the title carries the accent phrase |
136
+ | `lead`, `body`, `small`, `note`, `tag` | the type roles |
137
+ | `cols(n, items)` | a grid of 2 to 5, or `12` / `21` for a 1.35 : 1 split |
138
+ | `card({ tag, title, body, out, emph })` | the card, the emphasis card, the function card with its outcome line |
139
+ | `strip(labels, { on })`, `chip`, `phase(i, label, line)` | the journey: numbered chips with arrows, the chip-then-heading row |
140
+ | `flow({ label, nodes, note })` | the five-node tool-vs-labor flow |
141
+ | `table({ head, rows, emph })` | ruled tables; a cell with `meter: true` draws its bar |
142
+ | `quote({ text, by, emph })`, `who` | testimonial cards, name over role, no photographs |
143
+ | `stats`, `delta(from, to)` | figures, before-and-after |
144
+ | `steps(items)` | next steps with arrows |
145
+ | `callout`, `list`, `chapter`, `img`, `icon`, `tile` | the rest |
146
+
147
+ **Composition is free.** A job writes the markup it needs from these, adds its
148
+ own CSS on top (custom properties only) and may write raw markup where no
149
+ component fits. Recipes, not forms: `templates/` and `examples/` are starting
150
+ points to copy from, not fields to fill. The things the catalogue does not
151
+ decide, and that make or break a page:
152
+
153
+ - **An argument per page.** Before any markup, one line per page saying what
154
+ the page claims. A document that passes every gate and "spreads information
155
+ with no story" (the aviation round-1 verdict) fails here.
156
+ - **Three sections a page, not four.** The cramped first pass of the aviation
157
+ overview had four; the accepted one had three.
158
+ - **Separate with alignment, hairlines and type, not boxes.** Cards are for
159
+ things that are a set (layers, functions, steps); running text sits on the
160
+ ground.
161
+ - **Short lines in cards.** One sentence and an outcome. The card's body is
162
+ never the place for the argument.
163
+ - **Equal heights in a row** (`stretch`), titles at one height, and the empty
164
+ space at the foot of a page shared by its sections, never left under one.
165
+
166
+ ## 6. Pipeline
167
+
168
+ ```
169
+ new ─▶ argue ─▶ content ─▶ compose ─▶ build ─▶ review ─▶ ship
170
+ ```
171
+
172
+ 1. **new** — `node wand.js new <dir> --surface letter --brand current`. A job
173
+ folder: `job.mjs`, `content.txt`.
174
+ 2. **argue** — the page list with one claim per page, in the chat, before any
175
+ markup. For a rebuild, the mapping from source pages to it.
176
+ 3. **content** — for a rebuild, the source's strings into `content.txt`, one
177
+ per line, verbatim (`tools/extract.py` from the decks or docs kit, or
178
+ `pdftotext`). Every departure declared in `edits`; every line left out in
179
+ `cut`. For authored copy, no file.
180
+ 4. **compose** — `pages(c)`. Lines by number (`c.L(12)`), components, job CSS.
181
+ 5. **build** — `node wand.js build <job>`: the gates (§7), then the PDF, a PNG
182
+ per page, the contact sheet. `watch` does this on every save in under a
183
+ second with the browser kept warm.
184
+ 6. **review** — look at `out/sheet.png`, then at any page the gates named.
185
+ Read the pages as the reader will: does each carry its claim?
186
+ 7. **ship** — `node wand.js ship <job> [--pptx]`: the build, the one-file HTML,
187
+ the PowerPoint. The review note says what was changed from the source and
188
+ why, which gates ran, and what a human still has to decide.
189
+
190
+ ## 7. Gates — every build, every job
191
+
192
+ | Gate | Fails when | Blind to |
193
+ |---|---|---|
194
+ | fit | anything in the content box runs past it, under the footer, or off the sides | a page that fits and reads badly |
195
+ | 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 |
196
+ | overlap | one text box sits on another | text on art |
197
+ | brand | a computed colour, border or fill that is not a token or a declared theme colour | gradients and images |
198
+ | fonts | a text run not in the brand's faces | a weight the face lacks (the browser synthesises) |
199
+ | type | text under the surface's minimum size | |
200
+ | dashes | an em dash reaches a page (JP Sacy, Oct 2026: a GPT marker) | |
201
+ | names | a denied name (a previous client's) is on a page | |
202
+ | pdf text | the PDF's text misses a line, or carries an em dash | |
203
+ | contrast (warn) | text under WCAG AA against its background, chrome excepted | |
204
+ | measure (warn) | a paragraph over the surface's characters-per-line | |
205
+ | console | a page error | |
206
+
207
+ The gates read the DOM Chromium laid out for the PDF; nothing is inferred from
208
+ the spec. What no gate sees: the argument, the pacing, and whether the right
209
+ component was chosen. That is the review.
210
+
211
+ ## 8. Content rules
212
+
213
+ - **Verbatim for a rebuild.** Reflowing is fine; rewording is not. Every
214
+ departure is an `edit` with the needle and the replacement, so the review
215
+ note can list it and coverage still passes.
216
+ - **No em dashes** in anything generated: a comma or a semicolon, a colon
217
+ before a list. For a source that has them, declare the swaps as edits.
218
+ - **No photographs of people** in sales material without consent on file. The
219
+ `quote` component sets name over role and nothing else.
220
+ - **A client's confidential detail** (a vendor they use, a figure they have not
221
+ published) does not travel into a generic piece. The `denylist` catches a
222
+ name; the review catches the rest.
223
+ - **Figures are sourced on the day** and dated on the page.
224
+
225
+ ## 9. Environment gotchas
226
+
227
+ - **The browser.** The kit renders with Chromium. `findChrome()` looks at
228
+ `WAND_CHROME`, Playwright's own cache, then the system. In a sandbox without
229
+ one, `doctor` says so and nothing renders: there is no browser-free fallback
230
+ in this kit.
231
+ - **LibreOffice** substitutes faces and widens text; it is a geometry check for
232
+ the PowerPoint export, never a judge of fit.
233
+ - **Google Slides and Keynote** ignore embedded fonts; the `.pptx` needs the
234
+ faces installed there.
235
+ - **iCloud** evicts files under `Documents/`; a build that hangs on a font is
236
+ usually that.
237
+
238
+ ## 10. Known drift — don't propagate
239
+
240
+ - `brand/BRAND.md` keeps values in prose and `wand_kit.js` keeps a copy; this
241
+ kit reads `brand/tokens.json`, added 2026-10-16 from the same values.
242
+ - The Franklin Templeton case study shipped on colours sampled from the
243
+ client's own slides, not the brand's. Its studio regression declares them as
244
+ a theme; nothing in the components carries them.
245
+
246
+ ## 11. Open items
247
+
248
+ 1. **DOCX export.** Declined for now: Word cannot hold these pages. If needed,
249
+ a semantic export (headings, prose, tables) as an editable-text version,
250
+ labelled as such.
251
+ 2. **The sandbox's browser.** Confirm Chromium is present where sellers work
252
+ before the kit replaces `decks` and `docs`.
253
+ 3. **The chapter panel and the talk runtime** (presenter view, demos) from the
254
+ BofA deck: carry into the slide surface when a talk needs them.
255
+ 4. **Email and banner surfaces**: declared in §1's spirit, not yet in the table.
package/SKILL.md ADDED
@@ -0,0 +1,117 @@
1
+ ---
2
+ name: wand-design
3
+ description: Rebrand or create Wand material on the current or the new brand - decks, documents, one-pagers, case studies, social cards. Use when a .pptx, .docx or .pdf is attached, or branded work is wanted.
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.2.0"
8
+ ---
9
+
10
+
11
+ # Wand design
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@latest --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
+ ## Which brand
39
+
40
+ Two brands, one kit: `current` (Geist) and `next` (the website's). `doctor`
41
+ ends with the brand rule: which one is the default, and the words that ask
42
+ for the other. Follow it as printed. When the user names no brand, build on
43
+ the default without asking; when their words ask for the other, pass
44
+ `--brand` to `new`. One brand per piece, never a mix, and the review note
45
+ says which. The rule lives in the kit, not here, so it can change without
46
+ anyone reinstalling the skill.
47
+
48
+ ## Read only what the job needs
49
+
50
+ | Job | Read |
51
+ |---|---|
52
+ | A document, a two-pager, a case study | `PROMPT.md` §5 and `templates/page.mjs`; `examples/overview/job.mjs` for a finished one |
53
+ | A deck or a talk | §5 and `templates/slide.mjs` |
54
+ | Social cards, a banner | `templates/card.mjs` |
55
+ | Edit a job this kit built | the job's `job.mjs` only, then `build` |
56
+
57
+ ## The jobs
58
+
59
+ ### Rebuild from a source they attached (a .pptx, .docx, .pdf, .html)
60
+
61
+ 1. Dump the source's strings verbatim, one per line, into `content.txt`:
62
+ `pdftotext -layout` for a PDF; for a .pptx or .docx, unzip and read the XML
63
+ text runs in order, or use the decks kit's `tools/extract.py` if present.
64
+ 2. **Write the page list in the chat before any markup**: one line per page
65
+ with the claim it carries and which source lines it takes. Then compose.
66
+ 3. `node wand.js new work/<name> --surface letter|slide` (plus `--brand` only
67
+ when the brand rule says so), write `pages(c)` with `c.L(n)` for every string, declare every departure
68
+ in `edits` (no em dashes: swap them for commas or semicolons there) and
69
+ every line left out in `cut`.
70
+ 4. `node wand.js build work/<name>/job.mjs` until every hard gate is ok. Look
71
+ at `out/sheet.png`. Open a page only where something looks off.
72
+ 5. `node wand.js ship work/<name>/job.mjs --pptx` for a deck; without `--pptx`
73
+ for a document. Deliver the PDF (and the .pptx, and the .html) with the
74
+ review note.
75
+
76
+ ### Author from a brief
77
+
78
+ Skip `content.txt` (delete the `content:` line in the job). Write the page list
79
+ with its claims first, then the pages. Coverage is skipped and says so; the
80
+ review reads the argument instead. Three sections a page, not four.
81
+
82
+ ### Make it generic (an industry version of a client piece)
83
+
84
+ Author from the client piece: remove the client's figures, names, quotes and
85
+ vendors; put the client's name and its people in `denylist` so the gate proves
86
+ they are gone. Say in the note what was cut and what was generalised.
87
+
88
+ ### Social cards
89
+
90
+ `--surface square` or `og`; one `c.page()` per card; `out/pages/pNN.png` are
91
+ the deliverables.
92
+
93
+ ### Older Wand work
94
+
95
+ A deck or document made before this kit has no `job.mjs`. Treat it as a
96
+ source and rebuild it (the first job above), on the brand the rule gives.
97
+ One exception: a small edit (a date, a word, a figure) to a deck the old
98
+ decks kit built, where they want the file otherwise untouched. For that edit
99
+ only, `npm install wand-decks-kit@0.11.0 --no-audit --no-fund` and follow
100
+ that kit's SKILL.md on editing (`node wand.js show`, then `edit --set`).
101
+ An older copy of this skill may describe that kit, a routing table between
102
+ two kits, or `edit --set`; none of it applies to anything else.
103
+
104
+ ## The review note, always
105
+
106
+ Which brand it is on; what was changed from the source and why (every edit,
107
+ every cut); the gate table as printed; what a human still has to decide (a figure to confirm, a
108
+ quote to clear, a claim legal should see). A file delivered without the gate
109
+ table has been checked by nobody.
110
+
111
+ ## Available scripts
112
+
113
+ - **`wand.js`** — doctor, new, build, check, ship, watch, gallery, components, brands
114
+ - **`lib/engine.js`** — the render and the gates
115
+ - **`lib/components.js`** — the vocabulary and its CSS
116
+ - **`lib/pptx.js`**, **`tools/embed_fonts.py`** — the PowerPoint export
117
+ - **`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 # the default brand; doctor prints the rule
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>