@phuc1403/musketeer 0.8.0 → 0.10.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 (236) hide show
  1. package/INSTALLATION.md +52 -52
  2. package/README.md +49 -49
  3. package/bin/musketeer.js +168 -168
  4. package/manifest.json +333 -301
  5. package/package.json +48 -48
  6. package/src/dotnet-scaffold-copier.js +79 -79
  7. package/src/provisioner/detect.js +93 -93
  8. package/src/self-update.js +77 -77
  9. package/template/.claude/agents/code-reviewer.md +182 -166
  10. package/template/.claude/agents/git-manager.md +18 -18
  11. package/template/.claude/agents/hallmark-auditor.md +78 -78
  12. package/template/.claude/agents/researcher.md +33 -33
  13. package/template/.claude/hooks/block-unsafe-adr-title.cjs +85 -85
  14. package/template/.claude/hooks/git-skill-reminder.cjs +53 -0
  15. package/template/.claude/hooks/init-adr-dir.cjs +173 -173
  16. package/template/.claude/hooks/inject-adr-flags.cjs +94 -94
  17. package/template/.claude/hooks/lib/adr/command-scan.cjs +115 -115
  18. package/template/.claude/hooks/lib/characteristics/checker.cjs +357 -357
  19. package/template/.claude/hooks/lib/colors.cjs +180 -122
  20. package/template/.claude/hooks/lib/git-info-cache.cjs +191 -191
  21. package/template/.claude/hooks/lib/transcript-parser.cjs +300 -277
  22. package/template/.claude/hooks/sync-adr-toc.cjs +146 -146
  23. package/template/.claude/hooks/{usage-context-awareness.cjs → usage-quota-cache-refresh.cjs} +166 -166
  24. package/template/.claude/hooks/validate-characteristics-hook.cjs +66 -66
  25. package/template/.claude/hooks/validate-cml-hook.js +145 -145
  26. package/template/.claude/skills/adr-writer/SKILL.md +48 -48
  27. package/template/.claude/skills/adr-writer/references/adr-example.md +35 -35
  28. package/template/.claude/skills/architecture-characteristic-writer/SKILL.md +215 -215
  29. package/template/.claude/skills/architecture-characteristic-writer/assets/worksheet-template.md +29 -29
  30. package/template/.claude/skills/architecture-characteristic-writer/references/characteristics-catalog.md +40 -40
  31. package/template/.claude/skills/architecture-characteristic-writer/scripts/ranking-table.cjs +171 -171
  32. package/template/.claude/skills/code-review/SKILL.md +201 -54
  33. package/template/.claude/skills/code-review/references/checklist-workflow.md +96 -0
  34. package/template/.claude/skills/code-review/references/checklists/api.md +52 -52
  35. package/template/.claude/skills/code-review/references/checklists/base.md +100 -100
  36. package/template/.claude/skills/code-review/references/checklists/web-app.md +54 -54
  37. package/template/.claude/skills/code-review/references/code-review-reception.md +113 -0
  38. package/template/.claude/skills/code-review/references/codebase-scan-workflow.md +30 -0
  39. package/template/.claude/skills/code-review/references/edge-case-scouting.md +119 -0
  40. package/template/.claude/skills/code-review/references/input-mode-resolution.md +135 -0
  41. package/template/.claude/skills/code-review/references/parallel-review-workflow.md +76 -0
  42. package/template/.claude/skills/code-review/references/requesting-code-review.md +116 -0
  43. package/template/.claude/skills/code-review/references/spec-compliance-review.md +43 -0
  44. package/template/.claude/skills/code-review/references/task-management-reviews.md +140 -0
  45. package/template/.claude/skills/code-review/references/verification-before-completion.md +139 -0
  46. package/template/.claude/skills/context-map/SKILL.md +80 -80
  47. package/template/.claude/skills/context-map/example.cml +106 -106
  48. package/template/.claude/skills/context-map/reference/Bounded Context/Bounded Context.md +40 -40
  49. package/template/.claude/skills/context-map/reference/Bounded Context/businessModel.md +5 -5
  50. package/template/.claude/skills/context-map/reference/Bounded Context/domainVisionStatement.md +2 -2
  51. package/template/.claude/skills/context-map/reference/Bounded Context/evolution.md +5 -5
  52. package/template/.claude/skills/context-map/reference/Bounded Context/implementationTechnology.md +1 -1
  53. package/template/.claude/skills/context-map/reference/Bounded Context/implements.md +1 -1
  54. package/template/.claude/skills/context-map/reference/Bounded Context/knowledgeLevel.md +4 -4
  55. package/template/.claude/skills/context-map/reference/Bounded Context/realizes.md +9 -9
  56. package/template/.claude/skills/context-map/reference/Bounded Context/refines.md +10 -10
  57. package/template/.claude/skills/context-map/reference/Bounded Context/responsibilities.md +26 -26
  58. package/template/.claude/skills/context-map/reference/Bounded Context/type.md +23 -23
  59. package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Anticorruption Layer.md +5 -5
  60. package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Bounded Context Relationship.md +12 -12
  61. package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Conformist.md +5 -5
  62. package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Customer-Supplier (C-S).md +22 -22
  63. package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Open Host Service.md +4 -4
  64. package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Partnership (P).md +13 -13
  65. package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Published Language.md +4 -4
  66. package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Shared Kernel (SK).md +12 -12
  67. package/template/.claude/skills/context-map/reference/Context Map.md +62 -62
  68. package/template/.claude/skills/context-map/reference/Domain/Domain.md +30 -30
  69. package/template/.claude/skills/context-map/reference/Domain/supports.md +33 -33
  70. package/template/.claude/skills/context-map/reference/Domain/type.md +3 -3
  71. package/template/.claude/skills/context-map/reference/Semantic Rules.md +32 -32
  72. package/template/.claude/skills/git/SKILL.md +131 -115
  73. package/template/.claude/skills/git/references/branch-management.md +88 -88
  74. package/template/.claude/skills/git/references/commit-standards.md +46 -46
  75. package/template/.claude/skills/git/references/context-efficiency.md +54 -0
  76. package/template/.claude/skills/git/references/gh-cli-guide.md +109 -109
  77. package/template/.claude/skills/git/references/safety-protocols.md +69 -69
  78. package/template/.claude/skills/git/references/workflow-commit.md +58 -58
  79. package/template/.claude/skills/git/references/workflow-merge-pr.md +136 -0
  80. package/template/.claude/skills/git/references/workflow-merge.md +48 -48
  81. package/template/.claude/skills/git/references/workflow-pr.md +58 -58
  82. package/template/.claude/skills/git/references/workflow-push.md +52 -52
  83. package/template/.claude/skills/hallmark/SKILL.md +552 -552
  84. package/template/.claude/skills/hallmark/references/anti-patterns.md +412 -412
  85. package/template/.claude/skills/hallmark/references/assets.md +406 -406
  86. package/template/.claude/skills/hallmark/references/color.md +95 -95
  87. package/template/.claude/skills/hallmark/references/component-cookbook.md +256 -256
  88. package/template/.claude/skills/hallmark/references/components/c1-outlined-chip.md +12 -12
  89. package/template/.claude/skills/hallmark/references/components/c2-inline-form-as-cta.md +16 -16
  90. package/template/.claude/skills/hallmark/references/components/c3-typographic-link.md +8 -8
  91. package/template/.claude/skills/hallmark/references/components/c4-sticky-bottom-bar.md +16 -16
  92. package/template/.claude/skills/hallmark/references/components/f1-bento-grid.md +20 -20
  93. package/template/.claude/skills/hallmark/references/components/f2-sticky-scroll-stack.md +20 -20
  94. package/template/.claude/skills/hallmark/references/components/f3-tabular-spec-sheet.md +11 -11
  95. package/template/.claude/skills/hallmark/references/components/f4-step-sequence.md +11 -11
  96. package/template/.claude/skills/hallmark/references/components/f5-annotated-screenshot.md +11 -11
  97. package/template/.claude/skills/hallmark/references/components/f6-product-card-grid.md +41 -41
  98. package/template/.claude/skills/hallmark/references/components/ft1-mast-headed.md +13 -13
  99. package/template/.claude/skills/hallmark/references/components/ft2-inline-rule-single-line.md +10 -10
  100. package/template/.claude/skills/hallmark/references/components/ft3-index-style-category-list.md +12 -12
  101. package/template/.claude/skills/hallmark/references/components/ft4-dense-typographic.md +10 -10
  102. package/template/.claude/skills/hallmark/references/components/ft5-statement.md +21 -21
  103. package/template/.claude/skills/hallmark/references/components/ft6-letter-close.md +19 -19
  104. package/template/.claude/skills/hallmark/references/components/ft7-newsletter-first.md +27 -27
  105. package/template/.claude/skills/hallmark/references/components/ft8-marquee-scroll.md +25 -25
  106. package/template/.claude/skills/hallmark/references/components/h1-marquee.md +15 -15
  107. package/template/.claude/skills/hallmark/references/components/h2-split-diptych.md +15 -15
  108. package/template/.claude/skills/hallmark/references/components/h3-quote-led.md +11 -11
  109. package/template/.claude/skills/hallmark/references/components/h4-stat-led.md +14 -14
  110. package/template/.claude/skills/hallmark/references/components/h5-letter-hero.md +11 -11
  111. package/template/.claude/skills/hallmark/references/components/h6-photographic-fold.md +16 -16
  112. package/template/.claude/skills/hallmark/references/components/h7-demo-video-clipped-by-viewport-edge.md +27 -27
  113. package/template/.claude/skills/hallmark/references/components/h8-mockup-split-browser-framed.md +23 -23
  114. package/template/.claude/skills/hallmark/references/components/h9-custom-illustration-centerpiece.md +27 -27
  115. package/template/.claude/skills/hallmark/references/components/n1-wordmark-2-links.md +12 -12
  116. package/template/.claude/skills/hallmark/references/components/n10-floating-on-scroll-morph.md +19 -19
  117. package/template/.claude/skills/hallmark/references/components/n2-floating-chip.md +14 -14
  118. package/template/.claude/skills/hallmark/references/components/n3-side-rail.md +14 -14
  119. package/template/.claude/skills/hallmark/references/components/n4-hidden-behind-k.md +9 -9
  120. package/template/.claude/skills/hallmark/references/components/n5-floating-pill.md +28 -28
  121. package/template/.claude/skills/hallmark/references/components/n6-newspaper-masthead.md +24 -24
  122. package/template/.claude/skills/hallmark/references/components/n7-brutal-slab.md +22 -22
  123. package/template/.claude/skills/hallmark/references/components/n8-terminal-command.md +21 -21
  124. package/template/.claude/skills/hallmark/references/components/n9-edge-aligned-minimal.md +17 -17
  125. package/template/.claude/skills/hallmark/references/components/s1-left-margin-numbered.md +15 -15
  126. package/template/.claude/skills/hallmark/references/components/s2-hanging.md +13 -13
  127. package/template/.claude/skills/hallmark/references/components/s3-sticky-pinned.md +19 -19
  128. package/template/.claude/skills/hallmark/references/components/s4-inline-no-break.md +11 -11
  129. package/template/.claude/skills/hallmark/references/components/s5-bottom-anchored.md +13 -13
  130. package/template/.claude/skills/hallmark/references/components/t1-pull-quote-with-marginalia.md +12 -12
  131. package/template/.claude/skills/hallmark/references/components/t2-logo-wall-hairline.md +19 -19
  132. package/template/.claude/skills/hallmark/references/components/t3-single-huge-quote.md +11 -11
  133. package/template/.claude/skills/hallmark/references/components/t4-numbered-stat-strip.md +14 -14
  134. package/template/.claude/skills/hallmark/references/contract.md +24 -24
  135. package/template/.claude/skills/hallmark/references/copy.md +182 -182
  136. package/template/.claude/skills/hallmark/references/custom-craft.md +626 -626
  137. package/template/.claude/skills/hallmark/references/custom-theme.md +329 -329
  138. package/template/.claude/skills/hallmark/references/design-md.md +116 -116
  139. package/template/.claude/skills/hallmark/references/export-formats.md +328 -328
  140. package/template/.claude/skills/hallmark/references/floating-nav.md +89 -89
  141. package/template/.claude/skills/hallmark/references/genres/atmospheric.md +65 -65
  142. package/template/.claude/skills/hallmark/references/genres/editorial.md +70 -70
  143. package/template/.claude/skills/hallmark/references/genres/modern-minimal.md +67 -67
  144. package/template/.claude/skills/hallmark/references/genres/playful.md +65 -65
  145. package/template/.claude/skills/hallmark/references/hero-enrichment.md +474 -474
  146. package/template/.claude/skills/hallmark/references/imagery-kit.md +170 -170
  147. package/template/.claude/skills/hallmark/references/interaction-and-states.md +207 -207
  148. package/template/.claude/skills/hallmark/references/layout-and-space.md +111 -111
  149. package/template/.claude/skills/hallmark/references/macrostructures/01-bento-grid.md +35 -35
  150. package/template/.claude/skills/hallmark/references/macrostructures/02-long-document.md +34 -34
  151. package/template/.claude/skills/hallmark/references/macrostructures/03-marquee-hero.md +31 -31
  152. package/template/.claude/skills/hallmark/references/macrostructures/04-stat-led.md +32 -32
  153. package/template/.claude/skills/hallmark/references/macrostructures/05-workbench.md +32 -32
  154. package/template/.claude/skills/hallmark/references/macrostructures/06-conversational-faq.md +33 -33
  155. package/template/.claude/skills/hallmark/references/macrostructures/07-manifesto.md +32 -32
  156. package/template/.claude/skills/hallmark/references/macrostructures/08-photographic.md +34 -34
  157. package/template/.claude/skills/hallmark/references/macrostructures/09-quote-led.md +32 -32
  158. package/template/.claude/skills/hallmark/references/macrostructures/10-specimen.md +32 -32
  159. package/template/.claude/skills/hallmark/references/macrostructures/11-catalogue.md +23 -23
  160. package/template/.claude/skills/hallmark/references/macrostructures/12-letter.md +23 -23
  161. package/template/.claude/skills/hallmark/references/macrostructures/13-index-first.md +23 -23
  162. package/template/.claude/skills/hallmark/references/macrostructures/14-narrative-workflow.md +23 -23
  163. package/template/.claude/skills/hallmark/references/macrostructures/15-split-studio.md +23 -23
  164. package/template/.claude/skills/hallmark/references/macrostructures/16-feature-stack.md +23 -23
  165. package/template/.claude/skills/hallmark/references/macrostructures/17-type-specimen.md +23 -23
  166. package/template/.claude/skills/hallmark/references/macrostructures/18-portfolio-grid.md +23 -23
  167. package/template/.claude/skills/hallmark/references/macrostructures/19-map-diagram.md +23 -23
  168. package/template/.claude/skills/hallmark/references/macrostructures/20-ecosystem-index.md +23 -23
  169. package/template/.claude/skills/hallmark/references/macrostructures/21-component-playground.md +23 -23
  170. package/template/.claude/skills/hallmark/references/macrostructures.md +89 -89
  171. package/template/.claude/skills/hallmark/references/microinteractions.md +260 -260
  172. package/template/.claude/skills/hallmark/references/motion.md +109 -109
  173. package/template/.claude/skills/hallmark/references/preview-examples.md +49 -49
  174. package/template/.claude/skills/hallmark/references/responsive.md +138 -138
  175. package/template/.claude/skills/hallmark/references/slop-test.md +205 -205
  176. package/template/.claude/skills/hallmark/references/structure.md +164 -164
  177. package/template/.claude/skills/hallmark/references/study.md +511 -511
  178. package/template/.claude/skills/hallmark/references/typography.md +243 -243
  179. package/template/.claude/skills/hallmark/references/verbs/audit.md +25 -25
  180. package/template/.claude/skills/hallmark/references/verbs/redesign.md +269 -269
  181. package/template/.claude/skills/hallmark-loop/SKILL.md +105 -105
  182. package/template/.claude/skills/hallmark-loop/references/auditor-call.md +60 -60
  183. package/template/.claude/skills/hallmark-loop/references/capture.md +78 -78
  184. package/template/.claude/skills/hallmark-loop/references/loop-control.md +79 -79
  185. package/template/.claude/skills/handoff/SKILL.md +15 -15
  186. package/template/.claude/skills/knowledge-crunching/SKILL.md +94 -94
  187. package/template/.claude/skills/research/SKILL.md +69 -69
  188. package/template/.claude/skills/skill-creator/LICENSE.txt +201 -201
  189. package/template/.claude/skills/skill-creator/SKILL.md +154 -149
  190. package/template/.claude/skills/skill-creator/agents/analyzer.md +274 -274
  191. package/template/.claude/skills/skill-creator/agents/comparator.md +202 -202
  192. package/template/.claude/skills/skill-creator/agents/grader.md +223 -223
  193. package/template/.claude/skills/skill-creator/assets/eval_review.html +146 -146
  194. package/template/.claude/skills/skill-creator/eval-viewer/generate_review.py +471 -471
  195. package/template/.claude/skills/skill-creator/eval-viewer/viewer.html +1325 -1325
  196. package/template/.claude/skills/skill-creator/references/benchmark-optimization-guide.md +86 -86
  197. package/template/.claude/skills/skill-creator/references/distribution-guide.md +79 -79
  198. package/template/.claude/skills/skill-creator/references/eval-infrastructure-guide.md +129 -129
  199. package/template/.claude/skills/skill-creator/references/eval-schemas.md +121 -121
  200. package/template/.claude/skills/skill-creator/references/mcp-skills-integration.md +71 -71
  201. package/template/.claude/skills/skill-creator/references/metadata-quality-criteria.md +94 -94
  202. package/template/.claude/skills/skill-creator/references/plugin-marketplace-hosting.md +104 -104
  203. package/template/.claude/skills/skill-creator/references/plugin-marketplace-overview.md +89 -89
  204. package/template/.claude/skills/skill-creator/references/plugin-marketplace-schema.md +93 -93
  205. package/template/.claude/skills/skill-creator/references/plugin-marketplace-sources.md +103 -103
  206. package/template/.claude/skills/skill-creator/references/plugin-marketplace-troubleshooting.md +76 -76
  207. package/template/.claude/skills/skill-creator/references/script-quality-criteria.md +106 -106
  208. package/template/.claude/skills/skill-creator/references/skill-anatomy-and-requirements.md +77 -77
  209. package/template/.claude/skills/skill-creator/references/skill-creation-workflow.md +152 -151
  210. package/template/.claude/skills/skill-creator/references/skill-design-patterns.md +75 -75
  211. package/template/.claude/skills/skill-creator/references/skillmark-benchmark-criteria.md +102 -102
  212. package/template/.claude/skills/skill-creator/references/structure-organization-criteria.md +114 -114
  213. package/template/.claude/skills/skill-creator/references/testing-and-iteration.md +78 -78
  214. package/template/.claude/skills/skill-creator/references/token-efficiency-criteria.md +74 -74
  215. package/template/.claude/skills/skill-creator/references/troubleshooting-guide.md +81 -81
  216. package/template/.claude/skills/skill-creator/references/validation-checklist.md +83 -83
  217. package/template/.claude/skills/skill-creator/references/writing-effective-instructions.md +88 -88
  218. package/template/.claude/skills/skill-creator/references/yaml-frontmatter-reference.md +92 -92
  219. package/template/.claude/skills/skill-creator/scripts/aggregate_benchmark.py +401 -401
  220. package/template/.claude/skills/skill-creator/scripts/encoding_utils.py +36 -36
  221. package/template/.claude/skills/skill-creator/scripts/generate_report.py +326 -326
  222. package/template/.claude/skills/skill-creator/scripts/improve_description.py +248 -248
  223. package/template/.claude/skills/skill-creator/scripts/init_skill.py +360 -360
  224. package/template/.claude/skills/skill-creator/scripts/package_skill.py +143 -143
  225. package/template/.claude/skills/skill-creator/scripts/quick_validate.py +110 -110
  226. package/template/.claude/skills/skill-creator/scripts/run_eval.py +310 -310
  227. package/template/.claude/skills/skill-creator/scripts/run_loop.py +332 -332
  228. package/template/.claude/skills/skill-creator/scripts/utils.py +47 -47
  229. package/template/.claude/skills/tdd/SKILL.md +142 -142
  230. package/template/.claude/skills/tdd/deep-modules.md +15 -15
  231. package/template/.claude/skills/tdd/interface-design.md +31 -31
  232. package/template/.claude/skills/tdd/mocking.md +59 -59
  233. package/template/.claude/skills/tdd/refactoring.md +10 -10
  234. package/template/.claude/skills/tdd/tests.md +61 -61
  235. package/template/.claude/statusline.cjs +0 -0
  236. package/template/.claude/skills/code-review/references/adversarial-review.md +0 -223
@@ -1,328 +1,328 @@
1
- # Export formats
2
-
3
- Loaded by [`SKILL.md`](../SKILL.md) Step 6 when emitting the design system as portable tokens. Defines the four canonical formats Hallmark always writes:
4
-
5
- 1. **`tokens.css`** — the source of truth. Always emitted alongside the page CSS.
6
- 2. **Tailwind v4 `@theme`** — for projects on Tailwind. Emitted into `design.md`'s Exports section on multi-page projects.
7
- 3. **DTCG `tokens.json`** — for projects using a token pipeline (Style Dictionary, Token Studio, Cobalt). Emitted into `design.md`.
8
- 4. **shadcn/ui CSS variables** — for projects using shadcn/ui's component library. Emitted into `design.md`.
9
-
10
- The output rule: `tokens.css` is always written. The other three live inline in `design.md` so the user copies whichever they need into a new project. **No new verb.** This is a side effect of every build.
11
-
12
- ---
13
-
14
- ## Token taxonomy — Hallmark's source of truth
15
-
16
- Every Hallmark output writes these tokens (or a subset, if the page doesn't use one). The names are the source; every other format is a translation.
17
-
18
- | Hallmark token | Type | Example value |
19
- | --- | --- | --- |
20
- | `--color-paper` | colour | `oklch(96% 0.018 80)` |
21
- | `--color-paper-2` | colour | `oklch(94% 0.020 80)` |
22
- | `--color-paper-3` | colour | `oklch(91% 0.022 80)` |
23
- | `--color-ink` | colour | `oklch(15% 0.012 80)` |
24
- | `--color-ink-2` | colour | `oklch(28% 0.014 80)` |
25
- | `--color-rule` | colour | `oklch(86% 0.018 80)` |
26
- | `--color-rule-2` | colour | `oklch(72% 0.020 80)` |
27
- | `--color-muted` | colour | `oklch(50% 0.014 80)` |
28
- | `--color-neutral` | colour | `oklch(38% 0.012 80)` |
29
- | `--color-accent` | colour | `oklch(58% 0.16 70)` |
30
- | `--color-accent-ink` | colour | (text on accent fill, ≥ APCA 7:1) |
31
- | `--color-focus` | colour | (often = accent at higher chroma) |
32
- | `--font-display` | font | `"Fraunces", ui-serif, Georgia, serif` |
33
- | `--font-body` | font | `"Geist", ui-sans-serif, system-ui, sans-serif` |
34
- | `--font-outlier` | font | `"Geist Mono", ui-monospace, monospace` |
35
- | `--space-3xs` … `--space-5xl` | length | 4-pt scale: `0.25rem` … `8rem` |
36
- | `--text-xs` … `--text-display` | length | 1.25 (major-third) ratio scale |
37
- | `--ease-out` / `--ease-in` / `--ease-in-out` | easing | `cubic-bezier(0.16, 1, 0.3, 1)` etc. |
38
- | `--dur-micro` / `--dur-short` / `--dur-long` | time | `120ms` / `220ms` / `420ms` |
39
- | `--rule-hair` / `--rule-fine` | length | `1px` / `2px` |
40
- | `--radius-card` / `--radius-pill` / `--radius-input` | length | varies per theme |
41
- | `--shadow-card` | shadow | varies per theme |
42
-
43
- If the page introduces *additional* tokens, name them by role and add to `tokens.css`. Don't make up token names downstream that aren't in `tokens.css` — the source of truth is the source of truth.
44
-
45
- ---
46
-
47
- ## Format 1 — `tokens.css`
48
-
49
- The source. Plain CSS custom properties at `:root`. Every Hallmark page CSS imports this file at the top:
50
-
51
- ```css
52
- @import "tokens.css";
53
- /* page CSS continues — uses var(--color-paper), never raw values */
54
- ```
55
-
56
- Or, if the project uses a CSS bundler / framework that doesn't honour bare `@import`, the project's existing entry-point includes `tokens.css` first. The page CSS still references tokens by name, never by raw value.
57
-
58
- **Worked example — editorial theme (Specimen-like):**
59
-
60
- ```css
61
- :root {
62
- --color-paper: oklch(96% 0.018 80);
63
- --color-paper-2: oklch(94% 0.020 80);
64
- --color-paper-3: oklch(91% 0.022 80);
65
- --color-rule: oklch(86% 0.020 78);
66
- --color-rule-2: oklch(72% 0.022 78);
67
- --color-muted: oklch(50% 0.018 78);
68
- --color-neutral: oklch(38% 0.014 76);
69
- --color-ink-2: oklch(28% 0.012 75);
70
- --color-ink: oklch(15% 0.010 75);
71
- --color-accent: oklch(58% 0.16 60);
72
- --color-accent-ink: oklch(98% 0.012 75);
73
- --color-focus: oklch(58% 0.16 60);
74
-
75
- --font-display: "Fraunces", "Cardo", ui-serif, Georgia, serif;
76
- --font-body: "Geist", "Söhne", ui-sans-serif, system-ui, sans-serif;
77
- --font-outlier: "Geist Mono", "JetBrains Mono", ui-monospace, monospace;
78
-
79
- --display-weight: 400;
80
- --display-style: italic;
81
- --tracking-display: -0.02em;
82
- --tracking-label: 0.10em;
83
-
84
- --text-xs: 0.75rem;
85
- --text-sm: 0.875rem;
86
- --text-md: 1.125rem;
87
- --text-lg: 1.375rem;
88
- --text-xl: 1.75rem;
89
- --text-2xl: 2.25rem;
90
- --text-display: clamp(3rem, 6vw + 1rem, 6.5rem);
91
-
92
- --space-3xs: 0.25rem;
93
- --space-2xs: 0.5rem;
94
- --space-xs: 0.75rem;
95
- --space-sm: 1rem;
96
- --space-md: 1.5rem;
97
- --space-lg: 2rem;
98
- --space-xl: 3rem;
99
- --space-2xl: 4.5rem;
100
- --space-3xl: 7rem;
101
- --space-4xl: 11rem;
102
-
103
- --rule-hair: 0.5px;
104
- --rule-fine: 1px;
105
- --radius-card: 0;
106
- --radius-pill: 0;
107
- --radius-input: 0;
108
-
109
- --ease-out: cubic-bezier(0.16, 1, 0.3, 1);
110
- --ease-in: cubic-bezier(0.7, 0, 0.84, 0);
111
- --ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);
112
-
113
- --dur-micro: 120ms;
114
- --dur-short: 220ms;
115
- --dur-long: 420ms;
116
- }
117
- ```
118
-
119
- **Worked example — modern-minimal theme (Quiet-like):**
120
-
121
- ```css
122
- :root {
123
- --color-paper: oklch(100% 0 0);
124
- --color-paper-2: oklch(98.5% 0 0);
125
- --color-paper-3: oklch(96% 0 0);
126
- --color-rule: oklch(91% 0 0);
127
- --color-rule-2: oklch(82% 0 0);
128
- --color-muted: oklch(55% 0 0);
129
- --color-neutral: oklch(40% 0 0);
130
- --color-ink-2: oklch(28% 0 0);
131
- --color-ink: oklch(15% 0 0);
132
- --color-accent: oklch(15% 0 0);
133
- --color-accent-ink: oklch(100% 0 0);
134
- --color-focus: oklch(60% 0.10 240);
135
-
136
- --font-display: "Geist", "Inter", ui-sans-serif, system-ui, sans-serif;
137
- --font-body: "Geist", "Inter", ui-sans-serif, system-ui, sans-serif;
138
- --font-outlier: "Geist Mono", ui-monospace, "SF Mono", Menlo, monospace;
139
-
140
- --display-weight: 600;
141
- --display-style: normal;
142
- --tracking-display: -0.025em;
143
-
144
- --radius-card: 8px;
145
- --radius-pill: 999px;
146
- --radius-input: 8px;
147
- }
148
- ```
149
-
150
- ---
151
-
152
- ## Format 2 — Tailwind v4 `@theme`
153
-
154
- Tailwind v4 reads CSS variables inside `@theme` and generates utilities (`bg-paper`, `text-ink`, etc.) automatically. The translation from Hallmark tokens is direct — same variable names, same OKLCH values:
155
-
156
- ```css
157
- @theme {
158
- /* Colours */
159
- --color-paper: oklch(96% 0.018 80);
160
- --color-paper-2: oklch(94% 0.020 80);
161
- --color-paper-3: oklch(91% 0.022 80);
162
- --color-rule: oklch(86% 0.020 78);
163
- --color-rule-2: oklch(72% 0.022 78);
164
- --color-muted: oklch(50% 0.018 78);
165
- --color-neutral: oklch(38% 0.014 76);
166
- --color-ink-2: oklch(28% 0.012 75);
167
- --color-ink: oklch(15% 0.010 75);
168
- --color-accent: oklch(58% 0.16 60);
169
- --color-focus: oklch(58% 0.16 60);
170
-
171
- /* Fonts */
172
- --font-display: "Fraunces", "Cardo", ui-serif, Georgia, serif;
173
- --font-body: "Geist", ui-sans-serif, system-ui, sans-serif;
174
- --font-outlier: "Geist Mono", ui-monospace, monospace;
175
-
176
- /* Spacing — Tailwind reads --spacing-* by default; we keep Hallmark's --space-* names alongside */
177
- --spacing-3xs: 0.25rem;
178
- --spacing-2xs: 0.5rem;
179
- --spacing-xs: 0.75rem;
180
- --spacing-sm: 1rem;
181
- --spacing-md: 1.5rem;
182
- --spacing-lg: 2rem;
183
- --spacing-xl: 3rem;
184
- --spacing-2xl: 4.5rem;
185
-
186
- /* Type scale — Tailwind reads --text-* */
187
- --text-xs: 0.75rem;
188
- --text-sm: 0.875rem;
189
- --text-md: 1.125rem;
190
- --text-lg: 1.375rem;
191
- --text-xl: 1.75rem;
192
- --text-2xl: 2.25rem;
193
-
194
- /* Radius */
195
- --radius-card: 0;
196
- --radius-pill: 0;
197
- --radius-input: 0;
198
-
199
- /* Easings — Tailwind reads --ease-* */
200
- --ease-out: cubic-bezier(0.16, 1, 0.3, 1);
201
- --ease-in: cubic-bezier(0.7, 0, 0.84, 0);
202
- --ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);
203
- }
204
- ```
205
-
206
- Notes:
207
- - Tailwind v4 expects `--spacing-*` (with `ing`) for the spacing utilities. We mirror Hallmark's `--space-*` to `--spacing-*` so both names work.
208
- - `--text-*` works as-is (Tailwind v4 picks them up for `text-md` etc.).
209
- - `--font-*` becomes `font-display` / `font-body` / `font-outlier` utilities.
210
- - The user's `tailwind.config.{ts,js}` may need `@source` directives but no `theme.extend` — v4 reads `@theme` directly.
211
-
212
- ---
213
-
214
- ## Format 3 — DTCG `tokens.json`
215
-
216
- W3C Design Tokens Community Group format. For projects using Style Dictionary, Cobalt, or Token Studio. Path-based; OKLCH stays as a string value; `$type` is required.
217
-
218
- ```json
219
- {
220
- "$schema": "https://design-tokens.github.io/community-group/format/",
221
- "color": {
222
- "paper": { "$value": "oklch(96% 0.018 80)", "$type": "color" },
223
- "paper-2": { "$value": "oklch(94% 0.020 80)", "$type": "color" },
224
- "paper-3": { "$value": "oklch(91% 0.022 80)", "$type": "color" },
225
- "rule": { "$value": "oklch(86% 0.020 78)", "$type": "color" },
226
- "rule-2": { "$value": "oklch(72% 0.022 78)", "$type": "color" },
227
- "muted": { "$value": "oklch(50% 0.018 78)", "$type": "color" },
228
- "neutral": { "$value": "oklch(38% 0.014 76)", "$type": "color" },
229
- "ink-2": { "$value": "oklch(28% 0.012 75)", "$type": "color" },
230
- "ink": { "$value": "oklch(15% 0.010 75)", "$type": "color" },
231
- "accent": { "$value": "oklch(58% 0.16 60)", "$type": "color" },
232
- "focus": { "$value": "oklch(58% 0.16 60)", "$type": "color" }
233
- },
234
- "font": {
235
- "display": { "$value": "Fraunces, Cardo, ui-serif, Georgia, serif", "$type": "fontFamily" },
236
- "body": { "$value": "Geist, ui-sans-serif, system-ui, sans-serif", "$type": "fontFamily" },
237
- "outlier": { "$value": "Geist Mono, ui-monospace, monospace", "$type": "fontFamily" }
238
- },
239
- "size": {
240
- "text-xs": { "$value": "0.75rem", "$type": "dimension" },
241
- "text-sm": { "$value": "0.875rem", "$type": "dimension" },
242
- "text-md": { "$value": "1.125rem", "$type": "dimension" },
243
- "text-lg": { "$value": "1.375rem", "$type": "dimension" },
244
- "text-xl": { "$value": "1.75rem", "$type": "dimension" },
245
- "text-2xl": { "$value": "2.25rem", "$type": "dimension" },
246
- "text-display": { "$value": "6rem", "$type": "dimension" }
247
- },
248
- "space": {
249
- "3xs": { "$value": "0.25rem", "$type": "dimension" },
250
- "2xs": { "$value": "0.5rem", "$type": "dimension" },
251
- "xs": { "$value": "0.75rem", "$type": "dimension" },
252
- "sm": { "$value": "1rem", "$type": "dimension" },
253
- "md": { "$value": "1.5rem", "$type": "dimension" },
254
- "lg": { "$value": "2rem", "$type": "dimension" },
255
- "xl": { "$value": "3rem", "$type": "dimension" },
256
- "2xl": { "$value": "4.5rem", "$type": "dimension" },
257
- "3xl": { "$value": "7rem", "$type": "dimension" },
258
- "4xl": { "$value": "11rem", "$type": "dimension" }
259
- },
260
- "duration": {
261
- "micro": { "$value": "120ms", "$type": "duration" },
262
- "short": { "$value": "220ms", "$type": "duration" },
263
- "long": { "$value": "420ms", "$type": "duration" }
264
- }
265
- }
266
- ```
267
-
268
- Notes:
269
- - DTCG accepts `oklch(...)` strings on modern tooling. If the user's pipeline doesn't, convert to hex (lossy — flag this) or to `color(oklch ...)` (CSS Color 4).
270
- - The `text-display` value uses a fixed `6rem` for portability — the responsive `clamp(...)` belongs in CSS, not in token JSON.
271
-
272
- ---
273
-
274
- ## Format 4 — shadcn/ui CSS variables
275
-
276
- shadcn/ui's component library reads CSS custom properties with specific names, in a specific shape. The values are **space-separated** triples (no `oklch()` wrapper, no commas) so shadcn can compose them with `oklch(<value> / <alpha>)`.
277
-
278
- The translation from Hallmark tokens:
279
-
280
- ```css
281
- :root {
282
- --background: 96% 0.018 80; /* paper */
283
- --foreground: 15% 0.010 75; /* ink */
284
-
285
- --card: 94% 0.020 80; /* paper-2 */
286
- --card-foreground: 15% 0.010 75; /* ink */
287
-
288
- --popover: 94% 0.020 80; /* paper-2 */
289
- --popover-foreground: 15% 0.010 75; /* ink */
290
-
291
- --primary: 58% 0.16 60; /* accent */
292
- --primary-foreground: 98% 0.012 75; /* accent-ink */
293
-
294
- --secondary: 91% 0.022 80; /* paper-3 */
295
- --secondary-foreground: 28% 0.012 75; /* ink-2 */
296
-
297
- --muted: 86% 0.020 78; /* rule */
298
- --muted-foreground: 50% 0.018 78; /* muted */
299
-
300
- --accent: 58% 0.16 60; /* accent (same as primary in Hallmark) */
301
- --accent-foreground: 98% 0.012 75;
302
-
303
- --destructive: 58% 0.20 25; /* warm red, fixed */
304
- --destructive-foreground: 98% 0.012 75;
305
-
306
- --border: 86% 0.020 78; /* rule */
307
- --input: 86% 0.020 78; /* rule */
308
- --ring: 58% 0.16 60; /* focus */
309
-
310
- --radius: 0; /* radius-card; shadcn uses one value */
311
- }
312
- ```
313
-
314
- Then the user's `tailwind.config.ts` (or v4 `@theme`) reads them with `oklch(var(--background))`. Hallmark's accent → shadcn's primary is the canonical mapping; secondary → paper-3.
315
-
316
- If the user wants a dark variant, mirror with the dark theme tokens under a `.dark` selector (Hallmark's Midnight / Bloom / Terminal supply the values).
317
-
318
- ---
319
-
320
- ## Output rule
321
-
322
- When SKILL.md Step 6 emits exports:
323
-
324
- 1. **Always** write `tokens.css` next to the page CSS (or in the project root for multi-file projects). Format 1.
325
- 2. **On `design.md`-managed projects** (multi-page), embed all four formats inline in `design.md`'s Exports section. The user copies whichever they need.
326
- 3. **On Tailwind projects** (detected at pre-flight), additionally surface the Tailwind `@theme` block in the build output so the user knows where to paste it (typically into `app/globals.css` or the equivalent).
327
-
328
- Don't blanket-emit tokens.json or shadcn variables on single-page projects — the user can copy them out of `design.md` if they upgrade to a multi-page system.
1
+ # Export formats
2
+
3
+ Loaded by [`SKILL.md`](../SKILL.md) Step 6 when emitting the design system as portable tokens. Defines the four canonical formats Hallmark always writes:
4
+
5
+ 1. **`tokens.css`** — the source of truth. Always emitted alongside the page CSS.
6
+ 2. **Tailwind v4 `@theme`** — for projects on Tailwind. Emitted into `design.md`'s Exports section on multi-page projects.
7
+ 3. **DTCG `tokens.json`** — for projects using a token pipeline (Style Dictionary, Token Studio, Cobalt). Emitted into `design.md`.
8
+ 4. **shadcn/ui CSS variables** — for projects using shadcn/ui's component library. Emitted into `design.md`.
9
+
10
+ The output rule: `tokens.css` is always written. The other three live inline in `design.md` so the user copies whichever they need into a new project. **No new verb.** This is a side effect of every build.
11
+
12
+ ---
13
+
14
+ ## Token taxonomy — Hallmark's source of truth
15
+
16
+ Every Hallmark output writes these tokens (or a subset, if the page doesn't use one). The names are the source; every other format is a translation.
17
+
18
+ | Hallmark token | Type | Example value |
19
+ | --- | --- | --- |
20
+ | `--color-paper` | colour | `oklch(96% 0.018 80)` |
21
+ | `--color-paper-2` | colour | `oklch(94% 0.020 80)` |
22
+ | `--color-paper-3` | colour | `oklch(91% 0.022 80)` |
23
+ | `--color-ink` | colour | `oklch(15% 0.012 80)` |
24
+ | `--color-ink-2` | colour | `oklch(28% 0.014 80)` |
25
+ | `--color-rule` | colour | `oklch(86% 0.018 80)` |
26
+ | `--color-rule-2` | colour | `oklch(72% 0.020 80)` |
27
+ | `--color-muted` | colour | `oklch(50% 0.014 80)` |
28
+ | `--color-neutral` | colour | `oklch(38% 0.012 80)` |
29
+ | `--color-accent` | colour | `oklch(58% 0.16 70)` |
30
+ | `--color-accent-ink` | colour | (text on accent fill, ≥ APCA 7:1) |
31
+ | `--color-focus` | colour | (often = accent at higher chroma) |
32
+ | `--font-display` | font | `"Fraunces", ui-serif, Georgia, serif` |
33
+ | `--font-body` | font | `"Geist", ui-sans-serif, system-ui, sans-serif` |
34
+ | `--font-outlier` | font | `"Geist Mono", ui-monospace, monospace` |
35
+ | `--space-3xs` … `--space-5xl` | length | 4-pt scale: `0.25rem` … `8rem` |
36
+ | `--text-xs` … `--text-display` | length | 1.25 (major-third) ratio scale |
37
+ | `--ease-out` / `--ease-in` / `--ease-in-out` | easing | `cubic-bezier(0.16, 1, 0.3, 1)` etc. |
38
+ | `--dur-micro` / `--dur-short` / `--dur-long` | time | `120ms` / `220ms` / `420ms` |
39
+ | `--rule-hair` / `--rule-fine` | length | `1px` / `2px` |
40
+ | `--radius-card` / `--radius-pill` / `--radius-input` | length | varies per theme |
41
+ | `--shadow-card` | shadow | varies per theme |
42
+
43
+ If the page introduces *additional* tokens, name them by role and add to `tokens.css`. Don't make up token names downstream that aren't in `tokens.css` — the source of truth is the source of truth.
44
+
45
+ ---
46
+
47
+ ## Format 1 — `tokens.css`
48
+
49
+ The source. Plain CSS custom properties at `:root`. Every Hallmark page CSS imports this file at the top:
50
+
51
+ ```css
52
+ @import "tokens.css";
53
+ /* page CSS continues — uses var(--color-paper), never raw values */
54
+ ```
55
+
56
+ Or, if the project uses a CSS bundler / framework that doesn't honour bare `@import`, the project's existing entry-point includes `tokens.css` first. The page CSS still references tokens by name, never by raw value.
57
+
58
+ **Worked example — editorial theme (Specimen-like):**
59
+
60
+ ```css
61
+ :root {
62
+ --color-paper: oklch(96% 0.018 80);
63
+ --color-paper-2: oklch(94% 0.020 80);
64
+ --color-paper-3: oklch(91% 0.022 80);
65
+ --color-rule: oklch(86% 0.020 78);
66
+ --color-rule-2: oklch(72% 0.022 78);
67
+ --color-muted: oklch(50% 0.018 78);
68
+ --color-neutral: oklch(38% 0.014 76);
69
+ --color-ink-2: oklch(28% 0.012 75);
70
+ --color-ink: oklch(15% 0.010 75);
71
+ --color-accent: oklch(58% 0.16 60);
72
+ --color-accent-ink: oklch(98% 0.012 75);
73
+ --color-focus: oklch(58% 0.16 60);
74
+
75
+ --font-display: "Fraunces", "Cardo", ui-serif, Georgia, serif;
76
+ --font-body: "Geist", "Söhne", ui-sans-serif, system-ui, sans-serif;
77
+ --font-outlier: "Geist Mono", "JetBrains Mono", ui-monospace, monospace;
78
+
79
+ --display-weight: 400;
80
+ --display-style: italic;
81
+ --tracking-display: -0.02em;
82
+ --tracking-label: 0.10em;
83
+
84
+ --text-xs: 0.75rem;
85
+ --text-sm: 0.875rem;
86
+ --text-md: 1.125rem;
87
+ --text-lg: 1.375rem;
88
+ --text-xl: 1.75rem;
89
+ --text-2xl: 2.25rem;
90
+ --text-display: clamp(3rem, 6vw + 1rem, 6.5rem);
91
+
92
+ --space-3xs: 0.25rem;
93
+ --space-2xs: 0.5rem;
94
+ --space-xs: 0.75rem;
95
+ --space-sm: 1rem;
96
+ --space-md: 1.5rem;
97
+ --space-lg: 2rem;
98
+ --space-xl: 3rem;
99
+ --space-2xl: 4.5rem;
100
+ --space-3xl: 7rem;
101
+ --space-4xl: 11rem;
102
+
103
+ --rule-hair: 0.5px;
104
+ --rule-fine: 1px;
105
+ --radius-card: 0;
106
+ --radius-pill: 0;
107
+ --radius-input: 0;
108
+
109
+ --ease-out: cubic-bezier(0.16, 1, 0.3, 1);
110
+ --ease-in: cubic-bezier(0.7, 0, 0.84, 0);
111
+ --ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);
112
+
113
+ --dur-micro: 120ms;
114
+ --dur-short: 220ms;
115
+ --dur-long: 420ms;
116
+ }
117
+ ```
118
+
119
+ **Worked example — modern-minimal theme (Quiet-like):**
120
+
121
+ ```css
122
+ :root {
123
+ --color-paper: oklch(100% 0 0);
124
+ --color-paper-2: oklch(98.5% 0 0);
125
+ --color-paper-3: oklch(96% 0 0);
126
+ --color-rule: oklch(91% 0 0);
127
+ --color-rule-2: oklch(82% 0 0);
128
+ --color-muted: oklch(55% 0 0);
129
+ --color-neutral: oklch(40% 0 0);
130
+ --color-ink-2: oklch(28% 0 0);
131
+ --color-ink: oklch(15% 0 0);
132
+ --color-accent: oklch(15% 0 0);
133
+ --color-accent-ink: oklch(100% 0 0);
134
+ --color-focus: oklch(60% 0.10 240);
135
+
136
+ --font-display: "Geist", "Inter", ui-sans-serif, system-ui, sans-serif;
137
+ --font-body: "Geist", "Inter", ui-sans-serif, system-ui, sans-serif;
138
+ --font-outlier: "Geist Mono", ui-monospace, "SF Mono", Menlo, monospace;
139
+
140
+ --display-weight: 600;
141
+ --display-style: normal;
142
+ --tracking-display: -0.025em;
143
+
144
+ --radius-card: 8px;
145
+ --radius-pill: 999px;
146
+ --radius-input: 8px;
147
+ }
148
+ ```
149
+
150
+ ---
151
+
152
+ ## Format 2 — Tailwind v4 `@theme`
153
+
154
+ Tailwind v4 reads CSS variables inside `@theme` and generates utilities (`bg-paper`, `text-ink`, etc.) automatically. The translation from Hallmark tokens is direct — same variable names, same OKLCH values:
155
+
156
+ ```css
157
+ @theme {
158
+ /* Colours */
159
+ --color-paper: oklch(96% 0.018 80);
160
+ --color-paper-2: oklch(94% 0.020 80);
161
+ --color-paper-3: oklch(91% 0.022 80);
162
+ --color-rule: oklch(86% 0.020 78);
163
+ --color-rule-2: oklch(72% 0.022 78);
164
+ --color-muted: oklch(50% 0.018 78);
165
+ --color-neutral: oklch(38% 0.014 76);
166
+ --color-ink-2: oklch(28% 0.012 75);
167
+ --color-ink: oklch(15% 0.010 75);
168
+ --color-accent: oklch(58% 0.16 60);
169
+ --color-focus: oklch(58% 0.16 60);
170
+
171
+ /* Fonts */
172
+ --font-display: "Fraunces", "Cardo", ui-serif, Georgia, serif;
173
+ --font-body: "Geist", ui-sans-serif, system-ui, sans-serif;
174
+ --font-outlier: "Geist Mono", ui-monospace, monospace;
175
+
176
+ /* Spacing — Tailwind reads --spacing-* by default; we keep Hallmark's --space-* names alongside */
177
+ --spacing-3xs: 0.25rem;
178
+ --spacing-2xs: 0.5rem;
179
+ --spacing-xs: 0.75rem;
180
+ --spacing-sm: 1rem;
181
+ --spacing-md: 1.5rem;
182
+ --spacing-lg: 2rem;
183
+ --spacing-xl: 3rem;
184
+ --spacing-2xl: 4.5rem;
185
+
186
+ /* Type scale — Tailwind reads --text-* */
187
+ --text-xs: 0.75rem;
188
+ --text-sm: 0.875rem;
189
+ --text-md: 1.125rem;
190
+ --text-lg: 1.375rem;
191
+ --text-xl: 1.75rem;
192
+ --text-2xl: 2.25rem;
193
+
194
+ /* Radius */
195
+ --radius-card: 0;
196
+ --radius-pill: 0;
197
+ --radius-input: 0;
198
+
199
+ /* Easings — Tailwind reads --ease-* */
200
+ --ease-out: cubic-bezier(0.16, 1, 0.3, 1);
201
+ --ease-in: cubic-bezier(0.7, 0, 0.84, 0);
202
+ --ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);
203
+ }
204
+ ```
205
+
206
+ Notes:
207
+ - Tailwind v4 expects `--spacing-*` (with `ing`) for the spacing utilities. We mirror Hallmark's `--space-*` to `--spacing-*` so both names work.
208
+ - `--text-*` works as-is (Tailwind v4 picks them up for `text-md` etc.).
209
+ - `--font-*` becomes `font-display` / `font-body` / `font-outlier` utilities.
210
+ - The user's `tailwind.config.{ts,js}` may need `@source` directives but no `theme.extend` — v4 reads `@theme` directly.
211
+
212
+ ---
213
+
214
+ ## Format 3 — DTCG `tokens.json`
215
+
216
+ W3C Design Tokens Community Group format. For projects using Style Dictionary, Cobalt, or Token Studio. Path-based; OKLCH stays as a string value; `$type` is required.
217
+
218
+ ```json
219
+ {
220
+ "$schema": "https://design-tokens.github.io/community-group/format/",
221
+ "color": {
222
+ "paper": { "$value": "oklch(96% 0.018 80)", "$type": "color" },
223
+ "paper-2": { "$value": "oklch(94% 0.020 80)", "$type": "color" },
224
+ "paper-3": { "$value": "oklch(91% 0.022 80)", "$type": "color" },
225
+ "rule": { "$value": "oklch(86% 0.020 78)", "$type": "color" },
226
+ "rule-2": { "$value": "oklch(72% 0.022 78)", "$type": "color" },
227
+ "muted": { "$value": "oklch(50% 0.018 78)", "$type": "color" },
228
+ "neutral": { "$value": "oklch(38% 0.014 76)", "$type": "color" },
229
+ "ink-2": { "$value": "oklch(28% 0.012 75)", "$type": "color" },
230
+ "ink": { "$value": "oklch(15% 0.010 75)", "$type": "color" },
231
+ "accent": { "$value": "oklch(58% 0.16 60)", "$type": "color" },
232
+ "focus": { "$value": "oklch(58% 0.16 60)", "$type": "color" }
233
+ },
234
+ "font": {
235
+ "display": { "$value": "Fraunces, Cardo, ui-serif, Georgia, serif", "$type": "fontFamily" },
236
+ "body": { "$value": "Geist, ui-sans-serif, system-ui, sans-serif", "$type": "fontFamily" },
237
+ "outlier": { "$value": "Geist Mono, ui-monospace, monospace", "$type": "fontFamily" }
238
+ },
239
+ "size": {
240
+ "text-xs": { "$value": "0.75rem", "$type": "dimension" },
241
+ "text-sm": { "$value": "0.875rem", "$type": "dimension" },
242
+ "text-md": { "$value": "1.125rem", "$type": "dimension" },
243
+ "text-lg": { "$value": "1.375rem", "$type": "dimension" },
244
+ "text-xl": { "$value": "1.75rem", "$type": "dimension" },
245
+ "text-2xl": { "$value": "2.25rem", "$type": "dimension" },
246
+ "text-display": { "$value": "6rem", "$type": "dimension" }
247
+ },
248
+ "space": {
249
+ "3xs": { "$value": "0.25rem", "$type": "dimension" },
250
+ "2xs": { "$value": "0.5rem", "$type": "dimension" },
251
+ "xs": { "$value": "0.75rem", "$type": "dimension" },
252
+ "sm": { "$value": "1rem", "$type": "dimension" },
253
+ "md": { "$value": "1.5rem", "$type": "dimension" },
254
+ "lg": { "$value": "2rem", "$type": "dimension" },
255
+ "xl": { "$value": "3rem", "$type": "dimension" },
256
+ "2xl": { "$value": "4.5rem", "$type": "dimension" },
257
+ "3xl": { "$value": "7rem", "$type": "dimension" },
258
+ "4xl": { "$value": "11rem", "$type": "dimension" }
259
+ },
260
+ "duration": {
261
+ "micro": { "$value": "120ms", "$type": "duration" },
262
+ "short": { "$value": "220ms", "$type": "duration" },
263
+ "long": { "$value": "420ms", "$type": "duration" }
264
+ }
265
+ }
266
+ ```
267
+
268
+ Notes:
269
+ - DTCG accepts `oklch(...)` strings on modern tooling. If the user's pipeline doesn't, convert to hex (lossy — flag this) or to `color(oklch ...)` (CSS Color 4).
270
+ - The `text-display` value uses a fixed `6rem` for portability — the responsive `clamp(...)` belongs in CSS, not in token JSON.
271
+
272
+ ---
273
+
274
+ ## Format 4 — shadcn/ui CSS variables
275
+
276
+ shadcn/ui's component library reads CSS custom properties with specific names, in a specific shape. The values are **space-separated** triples (no `oklch()` wrapper, no commas) so shadcn can compose them with `oklch(<value> / <alpha>)`.
277
+
278
+ The translation from Hallmark tokens:
279
+
280
+ ```css
281
+ :root {
282
+ --background: 96% 0.018 80; /* paper */
283
+ --foreground: 15% 0.010 75; /* ink */
284
+
285
+ --card: 94% 0.020 80; /* paper-2 */
286
+ --card-foreground: 15% 0.010 75; /* ink */
287
+
288
+ --popover: 94% 0.020 80; /* paper-2 */
289
+ --popover-foreground: 15% 0.010 75; /* ink */
290
+
291
+ --primary: 58% 0.16 60; /* accent */
292
+ --primary-foreground: 98% 0.012 75; /* accent-ink */
293
+
294
+ --secondary: 91% 0.022 80; /* paper-3 */
295
+ --secondary-foreground: 28% 0.012 75; /* ink-2 */
296
+
297
+ --muted: 86% 0.020 78; /* rule */
298
+ --muted-foreground: 50% 0.018 78; /* muted */
299
+
300
+ --accent: 58% 0.16 60; /* accent (same as primary in Hallmark) */
301
+ --accent-foreground: 98% 0.012 75;
302
+
303
+ --destructive: 58% 0.20 25; /* warm red, fixed */
304
+ --destructive-foreground: 98% 0.012 75;
305
+
306
+ --border: 86% 0.020 78; /* rule */
307
+ --input: 86% 0.020 78; /* rule */
308
+ --ring: 58% 0.16 60; /* focus */
309
+
310
+ --radius: 0; /* radius-card; shadcn uses one value */
311
+ }
312
+ ```
313
+
314
+ Then the user's `tailwind.config.ts` (or v4 `@theme`) reads them with `oklch(var(--background))`. Hallmark's accent → shadcn's primary is the canonical mapping; secondary → paper-3.
315
+
316
+ If the user wants a dark variant, mirror with the dark theme tokens under a `.dark` selector (Hallmark's Midnight / Bloom / Terminal supply the values).
317
+
318
+ ---
319
+
320
+ ## Output rule
321
+
322
+ When SKILL.md Step 6 emits exports:
323
+
324
+ 1. **Always** write `tokens.css` next to the page CSS (or in the project root for multi-file projects). Format 1.
325
+ 2. **On `design.md`-managed projects** (multi-page), embed all four formats inline in `design.md`'s Exports section. The user copies whichever they need.
326
+ 3. **On Tailwind projects** (detected at pre-flight), additionally surface the Tailwind `@theme` block in the build output so the user knows where to paste it (typically into `app/globals.css` or the equivalent).
327
+
328
+ Don't blanket-emit tokens.json or shadcn variables on single-page projects — the user can copy them out of `design.md` if they upgrade to a multi-page system.