@jack200714/mafw 4.5.1 → 4.5.2

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 (320) hide show
  1. package/README.md +5 -2
  2. package/bin/mafw.js +16 -14
  3. package/package.json +1 -7
  4. package/.opencode/mafw/.backup-v61/parametric/base-skill-manifest.yaml +0 -2
  5. package/.opencode/mafw/STATUS.md +0 -6
  6. package/.opencode/mafw/ledger.md +0 -20
  7. package/.opencode/mafw/memory/.harmonic_index.json +0 -28
  8. package/.opencode/mafw/memory/.review_queue.json +0 -1
  9. package/.opencode/mafw/memory/tier3/parametric.json +0 -13
  10. package/.opencode/mafw/memory/tier3/test-goal.json +0 -19
  11. package/.opencode/mafw/memory-index.json +0 -6
  12. package/.opencode/mafw/parametric/base-skill-manifest.yaml +0 -2
  13. package/.opencode/mafw/waves.json +0 -4
  14. package/.opencode/opencode.json +0 -3
  15. package/.opencode/plugins/mafw-plugin.ts +0 -8
  16. package/.opencode/skills/banner-design/SKILL.md +0 -196
  17. package/.opencode/skills/banner-design/references/banner-sizes-and-styles.md +0 -118
  18. package/.opencode/skills/brand/SKILL.md +0 -97
  19. package/.opencode/skills/brand/references/approval-checklist.md +0 -169
  20. package/.opencode/skills/brand/references/asset-organization.md +0 -157
  21. package/.opencode/skills/brand/references/brand-guideline-template.md +0 -140
  22. package/.opencode/skills/brand/references/color-palette-management.md +0 -186
  23. package/.opencode/skills/brand/references/consistency-checklist.md +0 -94
  24. package/.opencode/skills/brand/references/logo-usage-rules.md +0 -185
  25. package/.opencode/skills/brand/references/messaging-framework.md +0 -85
  26. package/.opencode/skills/brand/references/typography-specifications.md +0 -214
  27. package/.opencode/skills/brand/references/update.md +0 -118
  28. package/.opencode/skills/brand/references/visual-identity.md +0 -96
  29. package/.opencode/skills/brand/references/voice-framework.md +0 -88
  30. package/.opencode/skills/brand/scripts/extract-colors.cjs +0 -341
  31. package/.opencode/skills/brand/scripts/inject-brand-context.cjs +0 -349
  32. package/.opencode/skills/brand/scripts/sync-brand-to-tokens.cjs +0 -248
  33. package/.opencode/skills/brand/scripts/tests/test_sync_brand_to_tokens.py +0 -52
  34. package/.opencode/skills/brand/scripts/validate-asset.cjs +0 -387
  35. package/.opencode/skills/brand/templates/brand-guidelines-starter.md +0 -275
  36. package/.opencode/skills/design/SKILL.md +0 -313
  37. package/.opencode/skills/design/data/cip/deliverables.csv +0 -51
  38. package/.opencode/skills/design/data/cip/industries.csv +0 -21
  39. package/.opencode/skills/design/data/cip/mockup-contexts.csv +0 -21
  40. package/.opencode/skills/design/data/cip/styles.csv +0 -21
  41. package/.opencode/skills/design/data/icon/styles.csv +0 -16
  42. package/.opencode/skills/design/data/logo/colors.csv +0 -56
  43. package/.opencode/skills/design/data/logo/industries.csv +0 -56
  44. package/.opencode/skills/design/data/logo/styles.csv +0 -56
  45. package/.opencode/skills/design/references/banner-sizes-and-styles.md +0 -118
  46. package/.opencode/skills/design/references/cip-deliverable-guide.md +0 -95
  47. package/.opencode/skills/design/references/cip-design.md +0 -121
  48. package/.opencode/skills/design/references/cip-prompt-engineering.md +0 -84
  49. package/.opencode/skills/design/references/cip-style-guide.md +0 -68
  50. package/.opencode/skills/design/references/design-routing.md +0 -207
  51. package/.opencode/skills/design/references/icon-design.md +0 -122
  52. package/.opencode/skills/design/references/logo-color-psychology.md +0 -101
  53. package/.opencode/skills/design/references/logo-design.md +0 -92
  54. package/.opencode/skills/design/references/logo-prompt-engineering.md +0 -158
  55. package/.opencode/skills/design/references/logo-style-guide.md +0 -109
  56. package/.opencode/skills/design/references/slides-copywriting-formulas.md +0 -84
  57. package/.opencode/skills/design/references/slides-create.md +0 -4
  58. package/.opencode/skills/design/references/slides-html-template.md +0 -295
  59. package/.opencode/skills/design/references/slides-layout-patterns.md +0 -137
  60. package/.opencode/skills/design/references/slides-strategies.md +0 -94
  61. package/.opencode/skills/design/references/slides.md +0 -42
  62. package/.opencode/skills/design/references/social-photos-design.md +0 -329
  63. package/.opencode/skills/design/scripts/cip/core.py +0 -215
  64. package/.opencode/skills/design/scripts/cip/generate.py +0 -484
  65. package/.opencode/skills/design/scripts/cip/render-html.py +0 -424
  66. package/.opencode/skills/design/scripts/cip/search.py +0 -127
  67. package/.opencode/skills/design/scripts/icon/generate.py +0 -487
  68. package/.opencode/skills/design/scripts/logo/core.py +0 -175
  69. package/.opencode/skills/design/scripts/logo/generate.py +0 -362
  70. package/.opencode/skills/design/scripts/logo/search.py +0 -114
  71. package/.opencode/skills/design-system/SKILL.md +0 -244
  72. package/.opencode/skills/design-system/data/slide-backgrounds.csv +0 -11
  73. package/.opencode/skills/design-system/data/slide-charts.csv +0 -26
  74. package/.opencode/skills/design-system/data/slide-color-logic.csv +0 -14
  75. package/.opencode/skills/design-system/data/slide-copy.csv +0 -26
  76. package/.opencode/skills/design-system/data/slide-layout-logic.csv +0 -16
  77. package/.opencode/skills/design-system/data/slide-layouts.csv +0 -26
  78. package/.opencode/skills/design-system/data/slide-strategies.csv +0 -16
  79. package/.opencode/skills/design-system/data/slide-typography.csv +0 -15
  80. package/.opencode/skills/design-system/references/component-specs.md +0 -236
  81. package/.opencode/skills/design-system/references/component-tokens.md +0 -214
  82. package/.opencode/skills/design-system/references/primitive-tokens.md +0 -203
  83. package/.opencode/skills/design-system/references/semantic-tokens.md +0 -215
  84. package/.opencode/skills/design-system/references/states-and-variants.md +0 -241
  85. package/.opencode/skills/design-system/references/tailwind-integration.md +0 -251
  86. package/.opencode/skills/design-system/references/token-architecture.md +0 -224
  87. package/.opencode/skills/design-system/scripts/embed-tokens.cjs +0 -99
  88. package/.opencode/skills/design-system/scripts/fetch-background.py +0 -317
  89. package/.opencode/skills/design-system/scripts/generate-slide.py +0 -770
  90. package/.opencode/skills/design-system/scripts/generate-tokens.cjs +0 -205
  91. package/.opencode/skills/design-system/scripts/html-token-validator.py +0 -327
  92. package/.opencode/skills/design-system/scripts/search-slides.py +0 -218
  93. package/.opencode/skills/design-system/scripts/slide-token-validator.py +0 -35
  94. package/.opencode/skills/design-system/scripts/slide_search_core.py +0 -453
  95. package/.opencode/skills/design-system/scripts/tests/test_validate_tokens.py +0 -48
  96. package/.opencode/skills/design-system/scripts/validate-tokens.cjs +0 -246
  97. package/.opencode/skills/design-system/templates/design-tokens-starter.json +0 -143
  98. package/.opencode/skills/frontend-design/LICENSE.txt +0 -21
  99. package/.opencode/skills/frontend-design/SKILL.md +0 -115
  100. package/.opencode/skills/mafw-automation-interview/SKILL.md +0 -43
  101. package/.opencode/skills/mafw-cli-scanner/SKILL.md +0 -37
  102. package/.opencode/skills/mafw-compression-verifier/SKILL.md +0 -52
  103. package/.opencode/skills/mafw-desktop-inspector/SKILL.md +0 -170
  104. package/.opencode/skills/mafw-execute/SKILL.md +0 -62
  105. package/.opencode/skills/mafw-gateway-restart/SKILL.md +0 -87
  106. package/.opencode/skills/mafw-github-scanner/SKILL.md +0 -38
  107. package/.opencode/skills/mafw-goal/SKILL.md +0 -76
  108. package/.opencode/skills/mafw-interview/SKILL.md +0 -68
  109. package/.opencode/skills/mafw-memory-extractor/SKILL.md +0 -65
  110. package/.opencode/skills/mafw-plan/SKILL.md +0 -58
  111. package/.opencode/skills/mafw-review/SKILL.md +0 -85
  112. package/.opencode/skills/runtime-plugin-authoring/SKILL.md +0 -791
  113. package/.opencode/skills/slides/SKILL.md +0 -40
  114. package/.opencode/skills/slides/references/copywriting-formulas.md +0 -84
  115. package/.opencode/skills/slides/references/create.md +0 -4
  116. package/.opencode/skills/slides/references/html-template.md +0 -295
  117. package/.opencode/skills/slides/references/layout-patterns.md +0 -137
  118. package/.opencode/skills/slides/references/slide-strategies.md +0 -94
  119. package/.opencode/skills/ui-styling/LICENSE.txt +0 -202
  120. package/.opencode/skills/ui-styling/SKILL.md +0 -324
  121. package/.opencode/skills/ui-styling/references/canvas-design-system.md +0 -320
  122. package/.opencode/skills/ui-styling/references/shadcn-accessibility.md +0 -471
  123. package/.opencode/skills/ui-styling/references/shadcn-components.md +0 -424
  124. package/.opencode/skills/ui-styling/references/shadcn-theming.md +0 -373
  125. package/.opencode/skills/ui-styling/references/tailwind-customization.md +0 -483
  126. package/.opencode/skills/ui-styling/references/tailwind-responsive.md +0 -382
  127. package/.opencode/skills/ui-styling/references/tailwind-utilities.md +0 -455
  128. package/.opencode/skills/ui-styling/scripts/requirements.txt +0 -17
  129. package/.opencode/skills/ui-styling/scripts/shadcn_add.py +0 -308
  130. package/.opencode/skills/ui-styling/scripts/tailwind_config_gen.py +0 -473
  131. package/.opencode/skills/ui-styling/scripts/tests/coverage-ui.json +0 -1
  132. package/.opencode/skills/ui-styling/scripts/tests/requirements.txt +0 -3
  133. package/.opencode/skills/ui-styling/scripts/tests/test_shadcn_add.py +0 -266
  134. package/.opencode/skills/ui-styling/scripts/tests/test_tailwind_config_gen.py +0 -394
  135. package/.opencode/skills/ui-ux-pro-max/SKILL.md +0 -388
  136. package/.opencode/skills/ui-ux-pro-max/data/app-interface.csv +0 -31
  137. package/.opencode/skills/ui-ux-pro-max/data/charts.csv +0 -26
  138. package/.opencode/skills/ui-ux-pro-max/data/colors.csv +0 -193
  139. package/.opencode/skills/ui-ux-pro-max/data/google-fonts.csv +0 -1924
  140. package/.opencode/skills/ui-ux-pro-max/data/icons.csv +0 -106
  141. package/.opencode/skills/ui-ux-pro-max/data/landing.csv +0 -35
  142. package/.opencode/skills/ui-ux-pro-max/data/motion.csv +0 -17
  143. package/.opencode/skills/ui-ux-pro-max/data/products.csv +0 -193
  144. package/.opencode/skills/ui-ux-pro-max/data/react-performance.csv +0 -45
  145. package/.opencode/skills/ui-ux-pro-max/data/stacks/angular.csv +0 -51
  146. package/.opencode/skills/ui-ux-pro-max/data/stacks/astro.csv +0 -54
  147. package/.opencode/skills/ui-ux-pro-max/data/stacks/avalonia.csv +0 -57
  148. package/.opencode/skills/ui-ux-pro-max/data/stacks/flutter.csv +0 -53
  149. package/.opencode/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +0 -56
  150. package/.opencode/skills/ui-ux-pro-max/data/stacks/javafx.csv +0 -76
  151. package/.opencode/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +0 -53
  152. package/.opencode/skills/ui-ux-pro-max/data/stacks/laravel.csv +0 -51
  153. package/.opencode/skills/ui-ux-pro-max/data/stacks/nextjs.csv +0 -53
  154. package/.opencode/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +0 -71
  155. package/.opencode/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +0 -59
  156. package/.opencode/skills/ui-ux-pro-max/data/stacks/react-native.csv +0 -52
  157. package/.opencode/skills/ui-ux-pro-max/data/stacks/react.csv +0 -54
  158. package/.opencode/skills/ui-ux-pro-max/data/stacks/shadcn.csv +0 -61
  159. package/.opencode/skills/ui-ux-pro-max/data/stacks/svelte.csv +0 -54
  160. package/.opencode/skills/ui-ux-pro-max/data/stacks/swiftui.csv +0 -51
  161. package/.opencode/skills/ui-ux-pro-max/data/stacks/threejs.csv +0 -54
  162. package/.opencode/skills/ui-ux-pro-max/data/stacks/uno.csv +0 -60
  163. package/.opencode/skills/ui-ux-pro-max/data/stacks/uwp.csv +0 -56
  164. package/.opencode/skills/ui-ux-pro-max/data/stacks/vue.csv +0 -50
  165. package/.opencode/skills/ui-ux-pro-max/data/stacks/winui.csv +0 -60
  166. package/.opencode/skills/ui-ux-pro-max/data/stacks/wpf.csv +0 -57
  167. package/.opencode/skills/ui-ux-pro-max/data/styles.csv +0 -85
  168. package/.opencode/skills/ui-ux-pro-max/data/typography.csv +0 -75
  169. package/.opencode/skills/ui-ux-pro-max/data/ui-reasoning.csv +0 -162
  170. package/.opencode/skills/ui-ux-pro-max/data/ux-guidelines.csv +0 -100
  171. package/.opencode/skills/ui-ux-pro-max/scripts/core.py +0 -464
  172. package/.opencode/skills/ui-ux-pro-max/scripts/design_system.py +0 -1479
  173. package/.opencode/skills/ui-ux-pro-max/scripts/search.py +0 -162
  174. package/.opencode/skills/ui-ux-pro-max/scripts/tests/test_core.py +0 -134
  175. package/.opencode/skills/ui-ux-pro-max/scripts/tests/test_design_system_mode.py +0 -159
  176. package/.opencode/skills/ui-ux-pro-max/scripts/validate_data.py +0 -114
  177. package/dist/hooks/bash-python-guide.d.ts +0 -4
  178. package/dist/hooks/bash-python-guide.d.ts.map +0 -1
  179. package/dist/hooks/bash-python-guide.js +0 -67
  180. package/dist/hooks/bash-python-guide.js.map +0 -1
  181. package/dist/hooks/handoff.d.ts +0 -9
  182. package/dist/hooks/handoff.d.ts.map +0 -1
  183. package/dist/hooks/handoff.js +0 -8
  184. package/dist/hooks/handoff.js.map +0 -1
  185. package/dist/hooks/hook-manager.d.ts +0 -32
  186. package/dist/hooks/hook-manager.d.ts.map +0 -1
  187. package/dist/hooks/hook-manager.js +0 -91
  188. package/dist/hooks/hook-manager.js.map +0 -1
  189. package/dist/hooks/llm-after.d.ts +0 -8
  190. package/dist/hooks/llm-after.d.ts.map +0 -1
  191. package/dist/hooks/llm-after.js +0 -8
  192. package/dist/hooks/llm-after.js.map +0 -1
  193. package/dist/hooks/media-ingest.d.ts +0 -43
  194. package/dist/hooks/media-ingest.d.ts.map +0 -1
  195. package/dist/hooks/media-ingest.js +0 -269
  196. package/dist/hooks/media-ingest.js.map +0 -1
  197. package/dist/hooks/memory-guide.d.ts +0 -3
  198. package/dist/hooks/memory-guide.d.ts.map +0 -1
  199. package/dist/hooks/memory-guide.js +0 -47
  200. package/dist/hooks/memory-guide.js.map +0 -1
  201. package/dist/hooks/observation-capture.d.ts +0 -17
  202. package/dist/hooks/observation-capture.d.ts.map +0 -1
  203. package/dist/hooks/observation-capture.js +0 -20
  204. package/dist/hooks/observation-capture.js.map +0 -1
  205. package/dist/hooks/session-compacting.d.ts +0 -6
  206. package/dist/hooks/session-compacting.d.ts.map +0 -1
  207. package/dist/hooks/session-compacting.js +0 -6
  208. package/dist/hooks/session-compacting.js.map +0 -1
  209. package/dist/hooks/session-ending.d.ts +0 -20
  210. package/dist/hooks/session-ending.d.ts.map +0 -1
  211. package/dist/hooks/session-ending.js +0 -113
  212. package/dist/hooks/session-ending.js.map +0 -1
  213. package/dist/hooks/session-recall.d.ts +0 -2
  214. package/dist/hooks/session-recall.d.ts.map +0 -1
  215. package/dist/hooks/session-recall.js +0 -103
  216. package/dist/hooks/session-recall.js.map +0 -1
  217. package/dist/hooks/session-start.d.ts +0 -9
  218. package/dist/hooks/session-start.d.ts.map +0 -1
  219. package/dist/hooks/session-start.js +0 -42
  220. package/dist/hooks/session-start.js.map +0 -1
  221. package/dist/hooks/tool-before.d.ts +0 -10
  222. package/dist/hooks/tool-before.d.ts.map +0 -1
  223. package/dist/hooks/tool-before.js +0 -6
  224. package/dist/hooks/tool-before.js.map +0 -1
  225. package/dist/hooks/tool-executed.d.ts +0 -19
  226. package/dist/hooks/tool-executed.d.ts.map +0 -1
  227. package/dist/hooks/tool-executed.js +0 -12
  228. package/dist/hooks/tool-executed.js.map +0 -1
  229. package/dist/hooks/user-profile.d.ts +0 -2
  230. package/dist/hooks/user-profile.d.ts.map +0 -1
  231. package/dist/hooks/user-profile.js +0 -30
  232. package/dist/hooks/user-profile.js.map +0 -1
  233. package/dist/hooks/user-prompt.d.ts +0 -9
  234. package/dist/hooks/user-prompt.d.ts.map +0 -1
  235. package/dist/hooks/user-prompt.js +0 -8
  236. package/dist/hooks/user-prompt.js.map +0 -1
  237. package/dist/hooks/voice-guide.d.ts +0 -8
  238. package/dist/hooks/voice-guide.d.ts.map +0 -1
  239. package/dist/hooks/voice-guide.js +0 -101
  240. package/dist/hooks/voice-guide.js.map +0 -1
  241. package/dist/plugin.d.ts +0 -55
  242. package/dist/plugin.d.ts.map +0 -1
  243. package/dist/plugin.js +0 -342
  244. package/dist/plugin.js.map +0 -1
  245. package/dist/tools/add-memory.d.ts +0 -17
  246. package/dist/tools/add-memory.d.ts.map +0 -1
  247. package/dist/tools/add-memory.js +0 -60
  248. package/dist/tools/add-memory.js.map +0 -1
  249. package/dist/tools/media-ask.d.ts +0 -14
  250. package/dist/tools/media-ask.d.ts.map +0 -1
  251. package/dist/tools/media-ask.js +0 -224
  252. package/dist/tools/media-ask.js.map +0 -1
  253. package/dist/tools/media-speak.d.ts +0 -16
  254. package/dist/tools/media-speak.d.ts.map +0 -1
  255. package/dist/tools/media-speak.js +0 -78
  256. package/dist/tools/media-speak.js.map +0 -1
  257. package/dist/tools/media-upload.d.ts +0 -14
  258. package/dist/tools/media-upload.d.ts.map +0 -1
  259. package/dist/tools/media-upload.js +0 -155
  260. package/dist/tools/media-upload.js.map +0 -1
  261. package/dist/tools/python-exec.d.ts +0 -13
  262. package/dist/tools/python-exec.d.ts.map +0 -1
  263. package/dist/tools/python-exec.js +0 -99
  264. package/dist/tools/python-exec.js.map +0 -1
  265. package/dist/tools/python-restart.d.ts +0 -11
  266. package/dist/tools/python-restart.d.ts.map +0 -1
  267. package/dist/tools/python-restart.js +0 -33
  268. package/dist/tools/python-restart.js.map +0 -1
  269. package/dist/utils/circuit-breaker.d.ts +0 -23
  270. package/dist/utils/circuit-breaker.d.ts.map +0 -1
  271. package/dist/utils/circuit-breaker.js +0 -75
  272. package/dist/utils/circuit-breaker.js.map +0 -1
  273. package/dist/utils/config-loader.d.ts +0 -20
  274. package/dist/utils/config-loader.d.ts.map +0 -1
  275. package/dist/utils/config-loader.js +0 -194
  276. package/dist/utils/config-loader.js.map +0 -1
  277. package/dist/utils/fallback.d.ts +0 -7
  278. package/dist/utils/fallback.d.ts.map +0 -1
  279. package/dist/utils/fallback.js +0 -20
  280. package/dist/utils/fallback.js.map +0 -1
  281. package/dist/utils/git.d.ts +0 -24
  282. package/dist/utils/git.d.ts.map +0 -1
  283. package/dist/utils/git.js +0 -71
  284. package/dist/utils/git.js.map +0 -1
  285. package/dist/utils/github.d.ts +0 -37
  286. package/dist/utils/github.d.ts.map +0 -1
  287. package/dist/utils/github.js +0 -53
  288. package/dist/utils/github.js.map +0 -1
  289. package/dist/utils/global-path.d.ts +0 -2
  290. package/dist/utils/global-path.d.ts.map +0 -1
  291. package/dist/utils/global-path.js +0 -32
  292. package/dist/utils/global-path.js.map +0 -1
  293. package/dist/utils/logger.d.ts +0 -6
  294. package/dist/utils/logger.d.ts.map +0 -1
  295. package/dist/utils/logger.js +0 -69
  296. package/dist/utils/logger.js.map +0 -1
  297. package/dist/utils/obs-capture.d.ts +0 -7
  298. package/dist/utils/obs-capture.d.ts.map +0 -1
  299. package/dist/utils/obs-capture.js +0 -49
  300. package/dist/utils/obs-capture.js.map +0 -1
  301. package/dist/utils/retry.d.ts +0 -11
  302. package/dist/utils/retry.d.ts.map +0 -1
  303. package/dist/utils/retry.js +0 -45
  304. package/dist/utils/retry.js.map +0 -1
  305. package/dist/utils/self-wiring.d.ts +0 -13
  306. package/dist/utils/self-wiring.d.ts.map +0 -1
  307. package/dist/utils/self-wiring.js +0 -86
  308. package/dist/utils/self-wiring.js.map +0 -1
  309. package/dist/utils/state.d.ts +0 -106
  310. package/dist/utils/state.d.ts.map +0 -1
  311. package/dist/utils/state.js +0 -166
  312. package/dist/utils/state.js.map +0 -1
  313. package/dist/utils/status.d.ts +0 -47
  314. package/dist/utils/status.d.ts.map +0 -1
  315. package/dist/utils/status.js +0 -147
  316. package/dist/utils/status.js.map +0 -1
  317. package/dist/utils/ttl-map.d.ts +0 -17
  318. package/dist/utils/ttl-map.d.ts.map +0 -1
  319. package/dist/utils/ttl-map.js +0 -67
  320. package/dist/utils/ttl-map.js.map +0 -1
@@ -1,224 +0,0 @@
1
- # Token Architecture
2
-
3
- Three-layer token system for scalable, themeable design systems.
4
-
5
- ## Layer Overview
6
-
7
- ```
8
- ┌─────────────────────────────────────────┐
9
- │ Component Tokens │ Per-component overrides
10
- │ --button-bg, --card-padding │
11
- ├─────────────────────────────────────────┤
12
- │ Semantic Tokens │ Purpose-based aliases
13
- │ --color-primary, --spacing-section │
14
- ├─────────────────────────────────────────┤
15
- │ Primitive Tokens │ Raw design values
16
- │ --color-blue-600, --space-4 │
17
- └─────────────────────────────────────────┘
18
- ```
19
-
20
- ## Why Three Layers?
21
-
22
- | Layer | Purpose | When to Change |
23
- |-------|---------|----------------|
24
- | Primitive | Base values (colors, sizes) | Rarely - foundational |
25
- | Semantic | Meaning assignment | Theme switching |
26
- | Component | Component customization | Per-component needs |
27
-
28
- ## Layer 1: Primitive Tokens
29
-
30
- Raw design values without semantic meaning.
31
-
32
- ```css
33
- :root {
34
- /* Colors */
35
- --color-gray-50: #F9FAFB;
36
- --color-gray-900: #111827;
37
- --color-blue-500: #3B82F6;
38
- --color-blue-600: #2563EB;
39
-
40
- /* Spacing (4px base) */
41
- --space-1: 0.25rem; /* 4px */
42
- --space-2: 0.5rem; /* 8px */
43
- --space-4: 1rem; /* 16px */
44
- --space-6: 1.5rem; /* 24px */
45
-
46
- /* Typography */
47
- --font-size-sm: 0.875rem;
48
- --font-size-base: 1rem;
49
- --font-size-lg: 1.125rem;
50
-
51
- /* Radius */
52
- --radius-sm: 0.25rem;
53
- --radius-default: 0.5rem;
54
- --radius-lg: 0.75rem;
55
-
56
- /* Shadows */
57
- --shadow-sm: 0 1px 2px rgb(0 0 0 / 0.05);
58
- --shadow-default: 0 1px 3px rgb(0 0 0 / 0.1);
59
- }
60
- ```
61
-
62
- ## Layer 2: Semantic Tokens
63
-
64
- Purpose-based aliases that reference primitives.
65
-
66
- ```css
67
- :root {
68
- /* Background */
69
- --color-background: var(--color-gray-50);
70
- --color-foreground: var(--color-gray-900);
71
-
72
- /* Primary */
73
- --color-primary: var(--color-blue-600);
74
- --color-primary-hover: var(--color-blue-700);
75
-
76
- /* Secondary */
77
- --color-secondary: var(--color-gray-100);
78
- --color-secondary-foreground: var(--color-gray-900);
79
-
80
- /* Muted */
81
- --color-muted: var(--color-gray-100);
82
- --color-muted-foreground: var(--color-gray-500);
83
-
84
- /* Destructive */
85
- --color-destructive: var(--color-red-600);
86
- --color-destructive-foreground: white;
87
-
88
- /* Spacing */
89
- --spacing-component: var(--space-4);
90
- --spacing-section: var(--space-6);
91
- }
92
- ```
93
-
94
- ## Layer 3: Component Tokens
95
-
96
- Component-specific tokens referencing semantic layer.
97
-
98
- ```css
99
- :root {
100
- /* Button */
101
- --button-bg: var(--color-primary);
102
- --button-fg: white;
103
- --button-hover-bg: var(--color-primary-hover);
104
- --button-padding-x: var(--space-4);
105
- --button-padding-y: var(--space-2);
106
- --button-radius: var(--radius-default);
107
-
108
- /* Input */
109
- --input-bg: var(--color-background);
110
- --input-border: var(--color-gray-300);
111
- --input-focus-ring: var(--color-primary);
112
- --input-padding: var(--space-2) var(--space-3);
113
-
114
- /* Card */
115
- --card-bg: var(--color-background);
116
- --card-border: var(--color-gray-200);
117
- --card-padding: var(--space-4);
118
- --card-radius: var(--radius-lg);
119
- --card-shadow: var(--shadow-default);
120
- }
121
- ```
122
-
123
- ## Dark Mode
124
-
125
- Override semantic tokens for dark theme:
126
-
127
- ```css
128
- .dark {
129
- --color-background: var(--color-gray-900);
130
- --color-foreground: var(--color-gray-50);
131
- --color-muted: var(--color-gray-800);
132
- --color-muted-foreground: var(--color-gray-400);
133
- --color-secondary: var(--color-gray-800);
134
- }
135
- ```
136
-
137
- ## Naming Convention
138
-
139
- ```
140
- --{category}-{item}-{variant}-{state}
141
-
142
- Examples:
143
- --color-primary # category-item
144
- --color-primary-hover # category-item-state
145
- --button-bg-hover # component-property-state
146
- --space-section-sm # category-semantic-variant
147
- ```
148
-
149
- ## Categories
150
-
151
- | Category | Examples |
152
- |----------|----------|
153
- | color | primary, secondary, muted, destructive |
154
- | space | 1, 2, 4, 8, section, component |
155
- | font-size | xs, sm, base, lg, xl |
156
- | radius | sm, default, lg, full |
157
- | shadow | sm, default, lg |
158
- | duration | fast, normal, slow |
159
-
160
- ## File Organization
161
-
162
- ```
163
- tokens/
164
- ├── primitives.css # Raw values
165
- ├── semantic.css # Purpose aliases
166
- ├── components.css # Component tokens
167
- └── index.css # Imports all
168
- ```
169
-
170
- Or single file with layer comments:
171
-
172
- ```css
173
- /* === PRIMITIVES === */
174
- :root { ... }
175
-
176
- /* === SEMANTIC === */
177
- :root { ... }
178
-
179
- /* === COMPONENTS === */
180
- :root { ... }
181
-
182
- /* === DARK MODE === */
183
- .dark { ... }
184
- ```
185
-
186
- ## Migration from Flat Tokens
187
-
188
- Before (flat):
189
- ```css
190
- --button-primary-bg: #2563EB;
191
- --button-secondary-bg: #F3F4F6;
192
- ```
193
-
194
- After (three-layer):
195
- ```css
196
- /* Primitive */
197
- --color-blue-600: #2563EB;
198
- --color-gray-100: #F3F4F6;
199
-
200
- /* Semantic */
201
- --color-primary: var(--color-blue-600);
202
- --color-secondary: var(--color-gray-100);
203
-
204
- /* Component */
205
- --button-bg: var(--color-primary);
206
- --button-secondary-bg: var(--color-secondary);
207
- ```
208
-
209
- ## W3C DTCG Alignment
210
-
211
- Token JSON format (W3C Design Tokens Community Group):
212
-
213
- ```json
214
- {
215
- "color": {
216
- "blue": {
217
- "600": {
218
- "$value": "#2563EB",
219
- "$type": "color"
220
- }
221
- }
222
- }
223
- }
224
- ```
@@ -1,99 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * embed-tokens.cjs
4
- * Reads design-tokens.css and outputs embeddable inline CSS.
5
- * Use when generating standalone HTML files (infographics, slides, etc.)
6
- *
7
- * Usage:
8
- * node embed-tokens.cjs # Output full CSS
9
- * node embed-tokens.cjs --minimal # Output only commonly used tokens
10
- * node embed-tokens.cjs --style # Wrap in <style> tags
11
- */
12
-
13
- const fs = require('fs');
14
- const path = require('path');
15
-
16
- // Find project root (look for assets/design-tokens.css)
17
- function findProjectRoot(startDir) {
18
- let dir = startDir;
19
- while (dir !== '/') {
20
- if (fs.existsSync(path.join(dir, 'assets', 'design-tokens.css'))) {
21
- return dir;
22
- }
23
- dir = path.dirname(dir);
24
- }
25
- return null;
26
- }
27
-
28
- const projectRoot = findProjectRoot(process.cwd());
29
- if (!projectRoot) {
30
- console.error('Error: Could not find assets/design-tokens.css');
31
- process.exit(1);
32
- }
33
-
34
- const tokensPath = path.join(projectRoot, 'assets', 'design-tokens.css');
35
-
36
- // Minimal tokens commonly used in infographics/slides
37
- const MINIMAL_TOKENS = [
38
- '--primitive-spacing-',
39
- '--primitive-fontSize-',
40
- '--primitive-fontWeight-',
41
- '--primitive-lineHeight-',
42
- '--primitive-radius-',
43
- '--primitive-shadow-glow-',
44
- '--primitive-gradient-',
45
- '--primitive-duration-',
46
- '--color-primary',
47
- '--color-secondary',
48
- '--color-accent',
49
- '--color-background',
50
- '--color-surface',
51
- '--color-foreground',
52
- '--color-border',
53
- '--typography-font-',
54
- '--card-',
55
- ];
56
-
57
- function extractTokens(css, minimal = false) {
58
- // Extract :root block
59
- const rootMatch = css.match(/:root\s*\{([^}]+)\}/g);
60
- if (!rootMatch) return '';
61
-
62
- let allVars = [];
63
- for (const block of rootMatch) {
64
- const vars = block.match(/--[\w-]+:\s*[^;]+;/g) || [];
65
- allVars = allVars.concat(vars);
66
- }
67
-
68
- if (minimal) {
69
- allVars = allVars.filter(v =>
70
- MINIMAL_TOKENS.some(token => v.includes(token))
71
- );
72
- }
73
-
74
- // Dedupe
75
- allVars = [...new Set(allVars)];
76
-
77
- return `:root {\n ${allVars.join('\n ')}\n}`;
78
- }
79
-
80
- // Parse args
81
- const args = process.argv.slice(2);
82
- const minimal = args.includes('--minimal');
83
- const wrapStyle = args.includes('--style');
84
-
85
- try {
86
- const css = fs.readFileSync(tokensPath, 'utf-8');
87
- let output = extractTokens(css, minimal);
88
-
89
- if (wrapStyle) {
90
- output = `<style>\n/* Design Tokens (embedded for standalone HTML) */\n${output}\n</style>`;
91
- } else {
92
- output = `/* Design Tokens (embedded for standalone HTML) */\n${output}`;
93
- }
94
-
95
- console.log(output);
96
- } catch (err) {
97
- console.error(`Error reading tokens: ${err.message}`);
98
- process.exit(1);
99
- }
@@ -1,317 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- Background Image Fetcher
4
- Fetches real images from Pexels for slide backgrounds.
5
- Uses web scraping (no API key required) or WebFetch tool integration.
6
- """
7
-
8
- import json
9
- import csv
10
- import re
11
- import sys
12
- from pathlib import Path
13
-
14
- # Project root relative to this script
15
- PROJECT_ROOT = Path(__file__).parent.parent.parent.parent.parent
16
- TOKENS_PATH = PROJECT_ROOT / 'assets' / 'design-tokens.json'
17
- BACKGROUNDS_CSV = Path(__file__).parent.parent / 'data' / 'slide-backgrounds.csv'
18
-
19
-
20
- def resolve_token_reference(ref: str, tokens: dict) -> str:
21
- """Resolve token reference like {primitive.color.ocean-blue.500} to hex value."""
22
- if not ref or not ref.startswith('{') or not ref.endswith('}'):
23
- return ref # Already a value, not a reference
24
-
25
- # Parse reference: {primitive.color.ocean-blue.500}
26
- path = ref[1:-1].split('.') # ['primitive', 'color', 'ocean-blue', '500']
27
- current = tokens
28
- for key in path:
29
- if isinstance(current, dict):
30
- current = current.get(key)
31
- else:
32
- return None # Invalid path
33
- # Return $value if it's a token object
34
- if isinstance(current, dict) and '$value' in current:
35
- return current['$value']
36
- return current
37
-
38
-
39
- def load_brand_colors():
40
- """Load colors from assets/design-tokens.json for overlay gradients.
41
-
42
- Resolves semantic token references to actual hex values.
43
- """
44
- try:
45
- with open(TOKENS_PATH) as f:
46
- tokens = json.load(f)
47
-
48
- colors = tokens.get('primitive', {}).get('color', {})
49
- semantic = tokens.get('semantic', {}).get('color', {})
50
-
51
- # Try semantic tokens first (preferred) - resolve references
52
- if semantic:
53
- primary_ref = semantic.get('primary', {}).get('$value')
54
- secondary_ref = semantic.get('secondary', {}).get('$value')
55
- accent_ref = semantic.get('accent', {}).get('$value')
56
- background_ref = semantic.get('background', {}).get('$value')
57
-
58
- primary = resolve_token_reference(primary_ref, tokens)
59
- secondary = resolve_token_reference(secondary_ref, tokens)
60
- accent = resolve_token_reference(accent_ref, tokens)
61
- background = resolve_token_reference(background_ref, tokens)
62
-
63
- if primary and secondary:
64
- return {
65
- 'primary': primary,
66
- 'secondary': secondary,
67
- 'accent': accent or primary,
68
- 'background': background or '#0D0D0D',
69
- }
70
-
71
- # Fallback: find first color palette with 500 value (primary)
72
- primary_keys = ['ocean-blue', 'coral', 'blue', 'primary']
73
- secondary_keys = ['golden-amber', 'purple', 'amber', 'secondary']
74
- accent_keys = ['emerald', 'mint', 'green', 'accent']
75
-
76
- primary_color = None
77
- secondary_color = None
78
- accent_color = None
79
-
80
- for key in primary_keys:
81
- if key in colors and isinstance(colors[key], dict):
82
- primary_color = colors[key].get('500', {}).get('$value')
83
- if primary_color:
84
- break
85
-
86
- for key in secondary_keys:
87
- if key in colors and isinstance(colors[key], dict):
88
- secondary_color = colors[key].get('500', {}).get('$value')
89
- if secondary_color:
90
- break
91
-
92
- for key in accent_keys:
93
- if key in colors and isinstance(colors[key], dict):
94
- accent_color = colors[key].get('500', {}).get('$value')
95
- if accent_color:
96
- break
97
-
98
- background = colors.get('dark', {}).get('800', {}).get('$value', '#0D0D0D')
99
-
100
- return {
101
- 'primary': primary_color or '#3B82F6',
102
- 'secondary': secondary_color or '#F59E0B',
103
- 'accent': accent_color or '#10B981',
104
- 'background': background,
105
- }
106
- except (FileNotFoundError, KeyError, TypeError):
107
- # Fallback defaults
108
- return {
109
- 'primary': '#3B82F6',
110
- 'secondary': '#F59E0B',
111
- 'accent': '#10B981',
112
- 'background': '#0D0D0D',
113
- }
114
-
115
-
116
- def load_backgrounds_config():
117
- """Load background configuration from CSV."""
118
- config = {}
119
- try:
120
- with open(BACKGROUNDS_CSV, newline='') as f:
121
- reader = csv.DictReader(f)
122
- for row in reader:
123
- config[row['slide_type']] = row
124
- except FileNotFoundError:
125
- print(f"Warning: {BACKGROUNDS_CSV} not found")
126
- return config
127
-
128
-
129
- def get_overlay_css(style: str, brand_colors: dict) -> str:
130
- """Generate overlay CSS using brand colors from design-tokens.json."""
131
- overlays = {
132
- 'gradient-dark': f"linear-gradient(135deg, {brand_colors['background']}E6, {brand_colors['background']}B3)",
133
- 'gradient-brand': f"linear-gradient(135deg, {brand_colors['primary']}CC, {brand_colors['secondary']}99)",
134
- 'gradient-accent': f"linear-gradient(135deg, {brand_colors['accent']}99, transparent)",
135
- 'blur-dark': f"rgba(13,13,13,0.8)",
136
- 'desaturate-dark': f"rgba(13,13,13,0.7)",
137
- }
138
- return overlays.get(style, overlays['gradient-dark'])
139
-
140
-
141
- # Curated high-quality images from Pexels (free to use, pre-selected for brand aesthetic)
142
- CURATED_IMAGES = {
143
- 'hero': [
144
- 'https://images.pexels.com/photos/3861969/pexels-photo-3861969.jpeg?auto=compress&cs=tinysrgb&w=1920',
145
- 'https://images.pexels.com/photos/2582937/pexels-photo-2582937.jpeg?auto=compress&cs=tinysrgb&w=1920',
146
- 'https://images.pexels.com/photos/1089438/pexels-photo-1089438.jpeg?auto=compress&cs=tinysrgb&w=1920',
147
- ],
148
- 'vision': [
149
- 'https://images.pexels.com/photos/3183150/pexels-photo-3183150.jpeg?auto=compress&cs=tinysrgb&w=1920',
150
- 'https://images.pexels.com/photos/3182812/pexels-photo-3182812.jpeg?auto=compress&cs=tinysrgb&w=1920',
151
- 'https://images.pexels.com/photos/3184291/pexels-photo-3184291.jpeg?auto=compress&cs=tinysrgb&w=1920',
152
- ],
153
- 'team': [
154
- 'https://images.pexels.com/photos/3184418/pexels-photo-3184418.jpeg?auto=compress&cs=tinysrgb&w=1920',
155
- 'https://images.pexels.com/photos/3184338/pexels-photo-3184338.jpeg?auto=compress&cs=tinysrgb&w=1920',
156
- 'https://images.pexels.com/photos/3182773/pexels-photo-3182773.jpeg?auto=compress&cs=tinysrgb&w=1920',
157
- ],
158
- 'testimonial': [
159
- 'https://images.pexels.com/photos/3184465/pexels-photo-3184465.jpeg?auto=compress&cs=tinysrgb&w=1920',
160
- 'https://images.pexels.com/photos/1181622/pexels-photo-1181622.jpeg?auto=compress&cs=tinysrgb&w=1920',
161
- ],
162
- 'cta': [
163
- 'https://images.pexels.com/photos/3184339/pexels-photo-3184339.jpeg?auto=compress&cs=tinysrgb&w=1920',
164
- 'https://images.pexels.com/photos/3184298/pexels-photo-3184298.jpeg?auto=compress&cs=tinysrgb&w=1920',
165
- ],
166
- 'problem': [
167
- 'https://images.pexels.com/photos/3760529/pexels-photo-3760529.jpeg?auto=compress&cs=tinysrgb&w=1920',
168
- 'https://images.pexels.com/photos/897817/pexels-photo-897817.jpeg?auto=compress&cs=tinysrgb&w=1920',
169
- ],
170
- 'solution': [
171
- 'https://images.pexels.com/photos/3184292/pexels-photo-3184292.jpeg?auto=compress&cs=tinysrgb&w=1920',
172
- 'https://images.pexels.com/photos/3184644/pexels-photo-3184644.jpeg?auto=compress&cs=tinysrgb&w=1920',
173
- ],
174
- 'hook': [
175
- 'https://images.pexels.com/photos/2582937/pexels-photo-2582937.jpeg?auto=compress&cs=tinysrgb&w=1920',
176
- 'https://images.pexels.com/photos/1089438/pexels-photo-1089438.jpeg?auto=compress&cs=tinysrgb&w=1920',
177
- ],
178
- 'social': [
179
- 'https://images.pexels.com/photos/3184360/pexels-photo-3184360.jpeg?auto=compress&cs=tinysrgb&w=1920',
180
- 'https://images.pexels.com/photos/3184287/pexels-photo-3184287.jpeg?auto=compress&cs=tinysrgb&w=1920',
181
- ],
182
- 'demo': [
183
- 'https://images.pexels.com/photos/1181675/pexels-photo-1181675.jpeg?auto=compress&cs=tinysrgb&w=1920',
184
- 'https://images.pexels.com/photos/3861958/pexels-photo-3861958.jpeg?auto=compress&cs=tinysrgb&w=1920',
185
- ],
186
- }
187
-
188
-
189
- def get_curated_images(slide_type: str) -> list:
190
- """Get curated images for slide type."""
191
- return CURATED_IMAGES.get(slide_type, CURATED_IMAGES.get('hero', []))
192
-
193
-
194
- def get_pexels_search_url(keywords: str) -> str:
195
- """Generate Pexels search URL for manual lookup."""
196
- import urllib.parse
197
- return f"https://www.pexels.com/search/{urllib.parse.quote(keywords)}/"
198
-
199
-
200
- def get_background_image(slide_type: str) -> dict:
201
- """
202
- Get curated image matching slide type and brand aesthetic.
203
- Uses pre-selected Pexels images (no API/scraping needed).
204
- """
205
- brand_colors = load_brand_colors()
206
- config = load_backgrounds_config()
207
-
208
- slide_config = config.get(slide_type)
209
- overlay_style = 'gradient-dark'
210
- keywords = slide_type
211
-
212
- if slide_config:
213
- keywords = slide_config.get('search_keywords', slide_config.get('image_category', slide_type))
214
- overlay_style = slide_config.get('overlay_style', 'gradient-dark')
215
-
216
- # Get curated images
217
- urls = get_curated_images(slide_type)
218
- if urls:
219
- return {
220
- 'url': urls[0],
221
- 'all_urls': urls,
222
- 'overlay': get_overlay_css(overlay_style, brand_colors),
223
- 'attribution': 'Photo from Pexels (free to use)',
224
- 'source': 'pexels-curated',
225
- 'search_url': get_pexels_search_url(keywords),
226
- }
227
-
228
- # Fallback: provide search URL for manual selection
229
- return {
230
- 'url': None,
231
- 'overlay': get_overlay_css(overlay_style, brand_colors),
232
- 'keywords': keywords,
233
- 'search_url': get_pexels_search_url(keywords),
234
- 'available_types': list(CURATED_IMAGES.keys()),
235
- }
236
-
237
-
238
- def generate_css_for_background(result: dict, slide_class: str = '.slide-with-bg') -> str:
239
- """Generate CSS for a background slide."""
240
- if not result.get('url'):
241
- search_url = result.get('search_url', '')
242
- return f"""/* No image scraped. Search manually: {search_url} */
243
- /* Overlay ready: {result.get('overlay', 'gradient-dark')} */
244
- """
245
-
246
- return f"""{slide_class} {{
247
- background-image: url('{result['url']}');
248
- background-size: cover;
249
- background-position: center;
250
- position: relative;
251
- }}
252
-
253
- {slide_class}::before {{
254
- content: '';
255
- position: absolute;
256
- inset: 0;
257
- background: {result['overlay']};
258
- }}
259
-
260
- {slide_class} .content {{
261
- position: relative;
262
- z-index: 1;
263
- }}
264
-
265
- /* {result.get('attribution', 'Pexels')} - {result.get('search_url', '')} */
266
- """
267
-
268
-
269
- def main():
270
- """CLI entry point."""
271
- import argparse
272
-
273
- parser = argparse.ArgumentParser(description='Get background images for slides')
274
- parser.add_argument('slide_type', nargs='?', help='Slide type (hero, vision, team, etc.)')
275
- parser.add_argument('--list', action='store_true', help='List available slide types')
276
- parser.add_argument('--css', action='store_true', help='Output CSS for the background')
277
- parser.add_argument('--json', action='store_true', help='Output JSON')
278
- parser.add_argument('--colors', action='store_true', help='Show brand colors')
279
- parser.add_argument('--all', action='store_true', help='Show all curated URLs')
280
-
281
- args = parser.parse_args()
282
-
283
- if args.colors:
284
- colors = load_brand_colors()
285
- print("\nBrand Colors (from design-tokens.json):")
286
- for name, value in colors.items():
287
- print(f" {name}: {value}")
288
- return
289
-
290
- if args.list:
291
- print("\nAvailable slide types (curated images):")
292
- for slide_type, urls in CURATED_IMAGES.items():
293
- print(f" {slide_type}: {len(urls)} images")
294
- return
295
-
296
- if not args.slide_type:
297
- parser.print_help()
298
- return
299
-
300
- result = get_background_image(args.slide_type)
301
-
302
- if args.json:
303
- print(json.dumps(result, indent=2))
304
- elif args.css:
305
- print(generate_css_for_background(result))
306
- elif args.all:
307
- print(f"\nAll images for '{args.slide_type}':")
308
- for i, url in enumerate(result.get('all_urls', []), 1):
309
- print(f" {i}. {url}")
310
- else:
311
- print(f"\nImage URL: {result['url']}")
312
- print(f"Alternatives: {len(result.get('all_urls', []))} available (use --all)")
313
- print(f"Overlay: {result['overlay']}")
314
-
315
-
316
- if __name__ == '__main__':
317
- main()