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
@@ -0,0 +1,18 @@
1
+ <!-- @license lucide-static v0.469.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-users"
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 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2" />
15
+ <circle cx="9" cy="7" r="4" />
16
+ <path d="M22 21v-2a4 4 0 0 0-3-3.87" />
17
+ <path d="M16 3.13a4 4 0 0 1 0 7.75" />
18
+ </svg>
@@ -0,0 +1,16 @@
1
+ <!-- @license lucide-static v0.469.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-wallet"
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="M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1" />
15
+ <path d="M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4" />
16
+ </svg>
@@ -0,0 +1,22 @@
1
+ <!-- @license lucide-static v0.469.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-wand-sparkles"
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="m21.64 3.64-1.28-1.28a1.21 1.21 0 0 0-1.72 0L2.36 18.64a1.21 1.21 0 0 0 0 1.72l1.28 1.28a1.2 1.2 0 0 0 1.72 0L21.64 5.36a1.2 1.2 0 0 0 0-1.72" />
15
+ <path d="m14 7 3 3" />
16
+ <path d="M5 6v4" />
17
+ <path d="M19 14v4" />
18
+ <path d="M10 2v2" />
19
+ <path d="M7 8H3" />
20
+ <path d="M21 16h-4" />
21
+ <path d="M11 3H9" />
22
+ </svg>
@@ -0,0 +1,17 @@
1
+ <!-- @license lucide-static v0.469.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-workflow"
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="8" height="8" x="3" y="3" rx="2" />
15
+ <path d="M7 11v4a2 2 0 0 0 2 2h4" />
16
+ <rect width="8" height="8" x="13" y="13" rx="2" />
17
+ </svg>
@@ -0,0 +1,15 @@
1
+ <!-- @license lucide-static v0.469.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-zap"
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="M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z" />
15
+ </svg>
@@ -0,0 +1,7 @@
1
+ <svg width="77" height="26" viewBox="0 0 77 26" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M3.74156 8.94922C3.85971 8.94922 3.95544 9.04735 3.95544 9.16829V18.0647C3.95544 19.7429 5.28392 21.1035 6.92226 21.1035C8.56047 21.1033 9.8882 19.7427 9.8882 18.0647V9.16829C9.8882 9.04735 9.98396 8.94922 10.1021 8.94922H13.6469C13.7556 8.94922 13.8437 9.0394 13.8437 9.15067C13.8441 9.15651 13.8454 9.1626 13.8454 9.16854V18.0647C13.8455 19.7427 15.1732 21.1033 16.8113 21.1035C18.4497 21.1035 19.7781 19.7428 19.7781 18.0647V11.3917C19.7781 11.1899 20.022 11.0954 20.1524 11.2464L20.6319 11.8044C21.228 12.4978 22.2837 12.4978 22.8799 11.8044L23.3593 11.2464C23.4898 11.0953 23.7335 11.1899 23.7335 11.3917V18.0647C23.7335 21.9802 20.6341 25.154 16.8113 25.154C14.9523 25.154 13.265 24.4028 12.0216 23.181C11.9351 23.096 11.7976 23.096 11.7111 23.181C10.4678 24.4027 8.78122 25.1549 6.92226 25.155C3.09943 25.155 0 21.9803 0 18.0647V9.16829C0 9.04735 0.0957579 8.94922 0.213881 8.94922H3.74156Z" fill="currentColor"></path>
3
+ <path d="M42.1885 16.9826C42.1885 17.0058 42.1903 17.029 42.1903 17.0522C42.1903 17.0753 42.1885 17.0986 42.1885 17.1217V24.9351C42.1885 25.0562 42.0925 25.1542 41.9744 25.1542H38.4467C38.3289 25.1542 38.2329 25.0562 38.2329 24.9351V24.4482C38.2329 24.2795 38.0542 24.1733 37.9077 24.2509C36.8211 24.827 35.5883 25.1542 34.2801 25.1542C29.9112 25.1542 26.3693 21.527 26.3691 17.0522C26.3692 12.5772 29.9111 8.94922 34.2801 8.94922C35.588 8.94929 36.8211 9.27577 37.9077 9.85173C38.0542 9.92927 38.2329 9.82301 38.2329 9.65432V9.16829C38.2329 9.04731 38.3289 8.94922 38.4467 8.94922H41.9744C42.0925 8.94922 42.1885 9.04731 42.1885 9.16829V16.9826ZM34.2827 13.0007C32.0983 13.0007 30.3273 14.8147 30.3273 17.0522C30.3273 19.2895 32.0983 21.1037 34.2827 21.1037C36.3988 21.1036 38.1269 19.4012 38.2329 17.2607V16.8436C38.1269 14.7031 36.3988 13.0008 34.2827 13.0007Z" fill="currentColor"></path>
4
+ <path d="M76.9942 16.8435C76.996 16.9129 76.9996 16.9824 76.9996 17.0522C76.9996 17.1218 76.996 17.1915 76.9942 17.2607V24.936C76.9942 25.0571 76.8986 25.1551 76.7804 25.1551H73.1815C73.0633 25.1551 72.9677 25.0571 72.9677 24.936V24.4872C72.9677 24.3196 72.7908 24.2132 72.6446 24.2888C71.5756 24.8414 70.3679 25.1542 69.0887 25.1542C64.7197 25.1542 61.1781 21.5271 61.1777 17.0522C61.1781 12.5774 64.7201 8.94921 69.0887 8.94921C70.3679 8.94928 71.5756 9.26204 72.6446 9.81469C72.7908 9.89022 72.9677 9.78389 72.9677 9.61624V3.46682C72.9677 3.34583 73.0633 3.24774 73.1815 3.24774H76.7804C76.8986 3.24774 76.9942 3.34583 76.9942 3.46682V16.8435ZM69.0862 13.1344C66.9019 13.1344 65.1309 14.9485 65.1305 17.1859C65.1309 19.4232 66.9019 21.2365 69.0862 21.2365C71.0026 21.2364 72.6002 19.8408 72.9637 17.9876C72.9663 17.9738 72.9677 17.9597 72.9677 17.9456V16.4254C72.9677 16.4112 72.9663 16.3971 72.9634 16.3833C72.5999 14.5304 71.0022 13.1345 69.0862 13.1344Z" fill="currentColor"></path>
5
+ <path d="M58.5402 15.9719C58.5402 12.0937 55.4706 8.95034 51.6843 8.9502C47.8977 8.9502 44.8281 12.0937 44.8281 15.9719V24.8266C44.8281 25.0081 44.9717 25.1552 45.149 25.1552H48.4235C48.6008 25.1552 48.7444 25.0081 48.7444 24.8266V16.1912C48.7447 14.5293 50.0598 13.1819 51.6826 13.1817C53.3049 13.1817 54.6204 14.5292 54.6207 16.1912V24.8266C54.6207 25.0081 54.7644 25.1552 54.9413 25.1552H58.2197C58.3966 25.1552 58.5402 25.0081 58.5402 24.8266V15.9719Z" fill="currentColor"></path>
6
+ <path d="M26.686 4.79448C24.2167 4.79448 22.2079 2.78565 22.2079 0.316338C22.2079 0.170667 22.0901 0.0529175 21.9445 0.0529175C21.7988 0.0529175 21.681 0.170667 21.681 0.316338C21.681 2.78565 19.6722 4.79448 17.2029 4.79448C17.0572 4.79448 16.9395 4.91224 16.9395 5.05793C16.9395 5.20358 17.0572 5.32134 17.2029 5.32134C19.6722 5.32134 21.681 7.33018 21.681 9.79952C21.681 9.94517 21.7988 10.0629 21.9445 10.0629C22.0901 10.0629 22.2079 9.94517 22.2079 9.79952C22.2079 7.33018 24.2167 5.32134 26.686 5.32134C26.8317 5.32134 26.9495 5.20358 26.9495 5.05793C26.9495 4.91224 26.8317 4.79448 26.686 4.79448Z" fill="currentColor"></path>
7
+ </svg>
@@ -0,0 +1,93 @@
1
+ Copyright (c) 2023-2025, Bao Nguyen/RandomMaerks (rmforbusiness@gmail.com).
2
+
3
+ This Font Software is licensed under the SIL Open Font License, Version 1.1.
4
+ This license is copied below, and is also available with a FAQ at:
5
+ http://scripts.sil.org/OFL
6
+
7
+
8
+ -----------------------------------------------------------
9
+ SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
10
+ -----------------------------------------------------------
11
+
12
+ PREAMBLE
13
+ The goals of the Open Font License (OFL) are to stimulate worldwide
14
+ development of collaborative font projects, to support the font creation
15
+ efforts of academic and linguistic communities, and to provide a free and
16
+ open framework in which fonts may be shared and improved in partnership
17
+ with others.
18
+
19
+ The OFL allows the licensed fonts to be used, studied, modified and
20
+ redistributed freely as long as they are not sold by themselves. The
21
+ fonts, including any derivative works, can be bundled, embedded,
22
+ redistributed and/or sold with any software provided that any reserved
23
+ names are not used by derivative works. The fonts and derivatives,
24
+ however, cannot be released under any other type of license. The
25
+ requirement for fonts to remain under this license does not apply
26
+ to any document created using the fonts or their derivatives.
27
+
28
+ DEFINITIONS
29
+ "Font Software" refers to the set of files released by the Copyright
30
+ Holder(s) under this license and clearly marked as such. This may
31
+ include source files, build scripts and documentation.
32
+
33
+ "Reserved Font Name" refers to any names specified as such after the
34
+ copyright statement(s).
35
+
36
+ "Original Version" refers to the collection of Font Software components as
37
+ distributed by the Copyright Holder(s).
38
+
39
+ "Modified Version" refers to any derivative made by adding to, deleting,
40
+ or substituting -- in part or in whole -- any of the components of the
41
+ Original Version, by changing formats or by porting the Font Software to a
42
+ new environment.
43
+
44
+ "Author" refers to any designer, engineer, programmer, technical
45
+ writer or other person who contributed to the Font Software.
46
+
47
+ PERMISSION & CONDITIONS
48
+ Permission is hereby granted, free of charge, to any person obtaining
49
+ a copy of the Font Software, to use, study, copy, merge, embed, modify,
50
+ redistribute, and sell modified and unmodified copies of the Font
51
+ Software, subject to the following conditions:
52
+
53
+ 1) Neither the Font Software nor any of its individual components,
54
+ in Original or Modified Versions, may be sold by itself.
55
+
56
+ 2) Original or Modified Versions of the Font Software may be bundled,
57
+ redistributed and/or sold with any software, provided that each copy
58
+ contains the above copyright notice and this license. These can be
59
+ included either as stand-alone text files, human-readable headers or
60
+ in the appropriate machine-readable metadata fields within text or
61
+ binary files as long as those fields can be easily viewed by the user.
62
+
63
+ 3) No Modified Version of the Font Software may use the Reserved Font
64
+ Name(s) unless explicit written permission is granted by the corresponding
65
+ Copyright Holder. This restriction only applies to the primary font name as
66
+ presented to the users.
67
+
68
+ 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
69
+ Software shall not be used to promote, endorse or advertise any
70
+ Modified Version, except to acknowledge the contribution(s) of the
71
+ Copyright Holder(s) and the Author(s) or with their explicit written
72
+ permission.
73
+
74
+ 5) The Font Software, modified or unmodified, in part or in whole,
75
+ must be distributed entirely under this license, and must not be
76
+ distributed under any other license. The requirement for fonts to
77
+ remain under this license does not apply to any document created
78
+ using the Font Software.
79
+
80
+ TERMINATION
81
+ This license becomes null and void if any of the above conditions are
82
+ not met.
83
+
84
+ DISCLAIMER
85
+ THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
86
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
87
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
88
+ OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
89
+ COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
90
+ INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
91
+ DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
92
+ FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
93
+ OTHER DEALINGS IN THE FONT SOFTWARE.
@@ -0,0 +1,27 @@
1
+ {
2
+ "_": "The one table that maps a PowerPoint family name to the files that draw it. measure.js, the PDF renderer, the preview, embed_fonts.py and brandlint.py all read this file, so a face is added once. `tracking` is letter-spacing in em, measured from the website's CSS (headings -0.07em, body -0.02em): the kit writes it into every run and measures with it, so fit is judged on the spacing that is actually drawn.",
3
+ "default": "Overused Grotesk",
4
+ "families": {
5
+ "FK Roman Standard Light": {
6
+ "role": "display",
7
+ "r": "FKRomanStandard-Light", "b": "FKRomanStandard-Light",
8
+ "i": "FKRomanStandard-Light", "bi": "FKRomanStandard-Light",
9
+ "tracking": -0.07,
10
+ "license": "commercial - Florian Karsten Typefaces EULA, see LICENSE-FONTS.md"
11
+ },
12
+ "Overused Grotesk": {
13
+ "role": "body",
14
+ "r": "OverusedGrotesk-Roman", "b": "OverusedGrotesk-SemiBold",
15
+ "i": "OverusedGrotesk-Italic", "bi": "OverusedGrotesk-SemiBoldItalic",
16
+ "tracking": -0.02,
17
+ "license": "SIL OFL 1.1, see OFL-OverusedGrotesk.txt"
18
+ },
19
+ "Overused Grotesk Medium": {
20
+ "role": "label",
21
+ "r": "OverusedGrotesk-Medium", "b": "OverusedGrotesk-SemiBold",
22
+ "i": "OverusedGrotesk-MediumItalic", "bi": "OverusedGrotesk-SemiBoldItalic",
23
+ "tracking": -0.01,
24
+ "license": "SIL OFL 1.1, see OFL-OverusedGrotesk.txt"
25
+ }
26
+ }
27
+ }
@@ -0,0 +1,89 @@
1
+ /**
2
+ * lib/glyphs.js — the named icon set.
3
+ *
4
+ * The old library was 36 PNGs named after their extraction order, half baked
5
+ * white and half baked accent. That produced two standing bugs: a white glyph on
6
+ * a light tile is invisible, and nobody could pick an icon by meaning because
7
+ * the names carried none.
8
+ *
9
+ * These are Lucide's single-colour stroke SVGs. `stroke="currentColor"` means
10
+ * the kit substitutes the theme's colour at build time, so polarity cannot be
11
+ * wrong. They go into the deck as vector — pptxgenjs writes the OOXML
12
+ * `asvg:svgBlip` extension with a raster fallback — so nothing is rasterised
13
+ * and the kit keeps needing no native dependency.
14
+ */
15
+
16
+ const fs = require("fs");
17
+ const path = require("path");
18
+
19
+ const DIR = path.join(__dirname, "..", "assets", "glyphs");
20
+ let INDEX = null, BUNDLE = null;
21
+
22
+ function index() {
23
+ if (!INDEX) INDEX = JSON.parse(fs.readFileSync(path.join(DIR, "index.json"), "utf8"));
24
+ return INDEX;
25
+ }
26
+
27
+ /**
28
+ * 75 SVGs is 75 files, and a packaged skill is capped at 200 of them. The
29
+ * packager collapses them into one `glyphs.json`; loose files still win when
30
+ * they are there, so the repo keeps its readable one-file-per-icon layout.
31
+ */
32
+ function bundle() {
33
+ if (BUNDLE === null) {
34
+ const f = path.join(DIR, "glyphs.json");
35
+ BUNDLE = fs.existsSync(f) ? JSON.parse(fs.readFileSync(f, "utf8")) : false;
36
+ }
37
+ return BUNDLE;
38
+ }
39
+
40
+ /** The raw SVG source for a glyph. */
41
+ function svg(name) {
42
+ const b = bundle();
43
+ if (b && b[name]) return b[name];
44
+ return fs.readFileSync(path.join(DIR, name + ".svg"), "utf8");
45
+ }
46
+
47
+ /** Every glyph name, for validation and for `wand.js glyphs`. */
48
+ const names = () => index().icons;
49
+ const has = (name) => typeof name === "string" && index().icons.includes(name);
50
+
51
+ const cache = new Map();
52
+
53
+ /**
54
+ * A recoloured glyph as a data URI, ready for `addImage({ data })`.
55
+ * Returns null for anything that isn't a known glyph name, so callers can fall
56
+ * back to the legacy PNG path.
57
+ */
58
+ function dataUri(name, color, { strokeWidth } = {}) {
59
+ if (!has(name)) return null;
60
+ const key = `${name}|${color}|${strokeWidth || ""}`;
61
+ if (cache.has(key)) return cache.get(key);
62
+ let src = svg(name).replace(/currentColor/g, "#" + String(color).replace(/^#/, ""));
63
+ // the site draws its line art at a hairline; Lucide's 2px reads heavy beside it
64
+ if (strokeWidth) src = src.replace(/stroke-width="[\d.]+"/g, `stroke-width="${strokeWidth}"`);
65
+ const uri = "image/svg+xml;base64," + Buffer.from(src, "utf8").toString("base64");
66
+ cache.set(key, uri);
67
+ return uri;
68
+ }
69
+
70
+ /** Nearest names, for a useful error when someone mistypes one. */
71
+ function suggest(name, n = 4) {
72
+ const q = String(name || "").toLowerCase();
73
+ return index().icons
74
+ .map((g) => [g, g.includes(q) || q.includes(g) ? 0 : distance(q, g)])
75
+ .sort((a, b) => a[1] - b[1]).slice(0, n).map((r) => r[0]);
76
+ }
77
+
78
+ function distance(a, b) {
79
+ const d = Array.from({ length: a.length + 1 }, (_, i) => [i, ...Array(b.length).fill(0)]);
80
+ for (let j = 0; j <= b.length; j++) d[0][j] = j;
81
+ for (let i = 1; i <= a.length; i++) {
82
+ for (let j = 1; j <= b.length; j++) {
83
+ d[i][j] = Math.min(d[i - 1][j] + 1, d[i][j - 1] + 1, d[i - 1][j - 1] + (a[i - 1] === b[j - 1] ? 0 : 1));
84
+ }
85
+ }
86
+ return d[a.length][b.length];
87
+ }
88
+
89
+ module.exports = { names, has, svg, dataUri, suggest, index, DIR };
@@ -0,0 +1,121 @@
1
+ /**
2
+ * lib/measure.js — real text metrics against the brand's actual faces.
3
+ *
4
+ * Why this exists: LibreOffice ignores embedded fonts and substitutes DejaVu,
5
+ * so QA renders over-report overflow and lose all weight information. This
6
+ * module measures the real font, so overflow is a build-time error rather than
7
+ * a judgement call about a screenshot.
8
+ *
9
+ * What differs from the Geist-era copy in brand/lib: the face table is data
10
+ * (`fonts/faces.json`), not code, and every family carries its letter-spacing.
11
+ * The website sets headings at -0.07em and body at -0.02em, the kit writes the
12
+ * same spacing into every run, and this module measures with it — so a title
13
+ * is judged at the width it is actually drawn, not at the font's default.
14
+ */
15
+
16
+ const fs = require("fs");
17
+ const path = require("path");
18
+ const FONTS = path.join(__dirname, "..", "fonts");
19
+ const TABLE = JSON.parse(fs.readFileSync(path.join(FONTS, "faces.json"), "utf8"));
20
+
21
+ let FONTKIT = null;
22
+ const cache = new Map();
23
+
24
+ /** The faces.json entry for a family, falling back to the default body face. */
25
+ function familyOf(family) {
26
+ return TABLE.families[family] || TABLE.families[TABLE.default];
27
+ }
28
+
29
+ /** The TTF stem that draws a family in a given style. */
30
+ function stemOf(family, bold = false, italic = false) {
31
+ const set = familyOf(family);
32
+ return set[bold && italic ? "bi" : bold ? "b" : italic ? "i" : "r"];
33
+ }
34
+
35
+ /** Letter-spacing for a family, in em. */
36
+ const trackingEm = (family) => familyOf(family).tracking || 0;
37
+
38
+ /** Letter-spacing in points at a size — the unit PowerPoint's `spc` and PDF's `Tc` take. */
39
+ const trackingPt = (family, fontSize) => +(trackingEm(family) * fontSize).toFixed(2);
40
+
41
+ function face(family, { bold = false, italic = false } = {}) {
42
+ if (!FONTKIT) throw new Error("measure.js was loaded without fontkit — require it through the kit's lib/shared.js");
43
+ const stem = stemOf(family, bold, italic);
44
+ if (!cache.has(stem)) cache.set(stem, FONTKIT.openSync(path.join(FONTS, stem + ".ttf")));
45
+ return cache.get(stem);
46
+ }
47
+
48
+ /** Width of a single line, in inches, tracking included. */
49
+ function widthIn(text, { family, fontSize, bold, italic } = {}) {
50
+ if (!text) return 0;
51
+ const f = face(family, { bold, italic });
52
+ const run = f.layout(String(text));
53
+ const glyphs = run.glyphs.length;
54
+ return (run.advanceWidth / f.unitsPerEm) * (fontSize / 72) + (trackingPt(family, fontSize) * glyphs) / 72;
55
+ }
56
+
57
+ /**
58
+ * Greedy word wrap at a given box width. Returns the lines it would occupy.
59
+ * Honours explicit \n. Matches how PowerPoint breaks closely enough to catch
60
+ * the failures that matter (a line too many, a word that can't fit at all).
61
+ */
62
+ function wrap(text, boxWidthIn, opts = {}) {
63
+ const out = [];
64
+ for (const para of String(text).split("\n")) {
65
+ const words = para.split(/\s+/).filter(Boolean);
66
+ if (!words.length) { out.push(""); continue; }
67
+ let line = words[0];
68
+ for (let i = 1; i < words.length; i++) {
69
+ const test = line + " " + words[i];
70
+ if (widthIn(test, opts) <= boxWidthIn) line = test;
71
+ else { out.push(line); line = words[i]; }
72
+ }
73
+ out.push(line);
74
+ }
75
+ return out;
76
+ }
77
+
78
+ /** Rendered height in inches for text wrapped into a box. */
79
+ function heightIn(text, boxWidthIn, opts = {}) {
80
+ const leading = opts.lineSpacingMultiple || 1.2;
81
+ return wrap(text, boxWidthIn, opts).length * (opts.fontSize / 72) * leading;
82
+ }
83
+
84
+ /** Does this text fit the box? A verdict object, so callers can report why. */
85
+ function fits(text, boxWidthIn, boxHeightIn, opts = {}) {
86
+ const lines = wrap(text, boxWidthIn, opts);
87
+ const h = heightIn(text, boxWidthIn, opts);
88
+ const widest = Math.max(...lines.map((l) => widthIn(l, opts)));
89
+ return {
90
+ ok: h <= boxHeightIn + 1e-6 && widest <= boxWidthIn + 1e-6,
91
+ lines: lines.length,
92
+ heightIn: +h.toFixed(3),
93
+ widestIn: +widest.toFixed(3),
94
+ overflowIn: +Math.max(0, h - boxHeightIn).toFixed(3),
95
+ };
96
+ }
97
+
98
+ /** Largest size at or below `fontSize` that fits, stepping by `step`, never below `min`. */
99
+ function fitSize(text, boxWidthIn, boxHeightIn, opts = {}) {
100
+ const { fontSize, min = 7, step = 0.5 } = opts;
101
+ for (let s = fontSize; s >= min; s -= step) {
102
+ if (fits(text, boxWidthIn, boxHeightIn, { ...opts, fontSize: s }).ok) return s;
103
+ }
104
+ return min;
105
+ }
106
+
107
+ /** Line count only — the common case for "will this title be 2 lines or 3?". */
108
+ const lineCount = (text, boxWidthIn, opts = {}) => wrap(text, boxWidthIn, opts).length;
109
+
110
+ /** Every family the brand knows, for the gates that check a deck stays inside them. */
111
+ const families = () => Object.keys(TABLE.families);
112
+
113
+ /**
114
+ * This module lives in the brand payload, outside any kit's node_modules, so
115
+ * Node cannot resolve `fontkit` from here. The kit that loads it hands its own
116
+ * copy in.
117
+ */
118
+ module.exports = function create(fontkit) {
119
+ FONTKIT = fontkit;
120
+ return { widthIn, wrap, heightIn, fits, fitSize, lineCount, face, stemOf, trackingEm, trackingPt, families, TABLE };
121
+ };