@nurix/etna 0.19.11 → 0.19.13

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 (494) hide show
  1. package/README.md +6 -4
  2. package/data/harness-index.json +1 -1
  3. package/data/harnesses/code/agents/maintenance.md +1 -1
  4. package/data/harnesses/code/harness.json +1 -1
  5. package/data/harnesses/code/rules/frontend.md +5 -5
  6. package/data/harnesses/code/skills/design/SKILL.md +70 -50
  7. package/data/harnesses/code/skills/design/components/charts.md +76 -0
  8. package/data/harnesses/code/skills/design/components/collections.md +132 -0
  9. package/data/harnesses/code/skills/design/components/feedback.md +47 -0
  10. package/data/harnesses/code/skills/design/components/hooks.md +35 -0
  11. package/data/harnesses/code/skills/design/components/index.md +143 -0
  12. package/data/harnesses/code/skills/design/components/inputs.md +327 -0
  13. package/data/harnesses/code/skills/design/components/layout.md +52 -0
  14. package/data/harnesses/code/skills/design/components/media.md +66 -0
  15. package/data/harnesses/code/skills/design/components/motion.md +82 -0
  16. package/data/harnesses/code/skills/design/components/navigation.md +29 -0
  17. package/data/harnesses/code/skills/design/components/overlays.md +72 -0
  18. package/data/harnesses/code/skills/design/components/setup.md +40 -0
  19. package/data/harnesses/code/skills/design/components/typography.md +46 -0
  20. package/data/harnesses/code/skills/design/components/utils.md +37 -0
  21. package/data/harnesses/code/skills/design/data/blueprints/browse.md +38 -0
  22. package/data/harnesses/code/skills/design/data/blueprints/creation-flow.md +38 -0
  23. package/data/harnesses/code/skills/design/data/blueprints/dashboard.md +38 -0
  24. package/data/harnesses/code/skills/design/data/blueprints/grid.md +38 -0
  25. package/data/harnesses/code/skills/design/data/blueprints/queue.md +38 -0
  26. package/data/harnesses/code/skills/design/data/blueprints/record-detail.md +38 -0
  27. package/data/harnesses/code/skills/design/data/blueprints/settings.md +38 -0
  28. package/data/harnesses/code/skills/design/data/chart-styling/Readme.md +33 -0
  29. package/data/harnesses/code/skills/design/data/chart-styling/carbon-accessible-alert-semantic.md +19 -0
  30. package/data/harnesses/code/skills/design/data/chart-styling/carbon-monochrome-sequential-trend.md +19 -0
  31. package/data/harnesses/code/skills/design/data/chart-styling/datadog-classic-six-aligned.md +19 -0
  32. package/data/harnesses/code/skills/design/data/chart-styling/datawrapper-tiered-gray-hierarchy.md +19 -0
  33. package/data/harnesses/code/skills/design/data/chart-styling/econ-red-rule-horizontal.md +19 -0
  34. package/data/harnesses/code/skills/design/data/chart-styling/financial-diverging-threshold-overlay.md +19 -0
  35. package/data/harnesses/code/skills/design/data/chart-styling/ft-vocabulary-ranked-muted.md +19 -0
  36. package/data/harnesses/code/skills/design/data/chart-styling/grafana-dark-threshold-bands.md +19 -0
  37. package/data/harnesses/code/skills/design/data/chart-styling/material-rounded-explicit-label.md +19 -0
  38. package/data/harnesses/code/skills/design/data/chart-styling/nyt-ghost-grid-direct-label.md +19 -0
  39. package/data/harnesses/code/skills/design/data/chart-styling/plot-currentcolor-inherit.md +19 -0
  40. package/data/harnesses/code/skills/design/data/chart-styling/saas-gradient-glow-area.md +19 -0
  41. package/data/harnesses/code/skills/design/data/chart-styling/shadcn-composable-css-vars.md +19 -0
  42. package/data/harnesses/code/skills/design/data/charts/census.csv +58 -0
  43. package/data/harnesses/code/skills/design/data/checklists/browse.md +21 -0
  44. package/data/harnesses/code/skills/design/data/checklists/creation-flow.md +20 -0
  45. package/data/harnesses/code/skills/design/data/checklists/dashboard.md +21 -0
  46. package/data/harnesses/code/skills/design/data/checklists/grid.md +21 -0
  47. package/data/harnesses/code/skills/design/data/checklists/queue.md +21 -0
  48. package/data/harnesses/code/skills/design/data/checklists/record-detail.md +21 -0
  49. package/data/harnesses/code/skills/design/data/checklists/settings.md +21 -0
  50. package/data/harnesses/code/skills/design/data/chrome/board-column.md +68 -0
  51. package/data/harnesses/code/skills/design/data/chrome/data-table.md +63 -0
  52. package/data/harnesses/code/skills/design/data/chrome/side-panel.md +60 -0
  53. package/data/harnesses/code/skills/design/data/chrome/sidebar.md +78 -0
  54. package/data/harnesses/code/skills/design/data/chrome/stat-cards.md +62 -0
  55. package/data/harnesses/code/skills/design/data/chrome/topbar.md +65 -0
  56. package/data/harnesses/code/skills/design/data/color/accent-presets.md +90 -0
  57. package/data/harnesses/code/skills/design/data/color/aesop-earth-mute.md +91 -0
  58. package/data/harnesses/code/skills/design/data/color/arc-peach-play.md +90 -0
  59. package/data/harnesses/code/skills/design/data/color/attio-hunter-teal.md +90 -0
  60. package/data/harnesses/code/skills/design/data/color/carbon-cyan-signal.md +90 -0
  61. package/data/harnesses/code/skills/design/data/color/clay-parchment.md +90 -0
  62. package/data/harnesses/code/skills/design/data/color/duolingo-feather.md +90 -0
  63. package/data/harnesses/code/skills/design/data/color/geist-mono-signal.md +90 -0
  64. package/data/harnesses/code/skills/design/data/color/linear-graphite-violet.md +90 -0
  65. package/data/harnesses/code/skills/design/data/color/mercury-onyx-cobalt.md +90 -0
  66. package/data/harnesses/code/skills/design/data/color/notion-paper-ink.md +90 -0
  67. package/data/harnesses/code/skills/design/data/color/radix-slate-iris.md +90 -0
  68. package/data/harnesses/code/skills/design/data/color/raycast-void-spectrum.md +90 -0
  69. package/data/harnesses/code/skills/design/data/color/spectrum-celery-fuchsia.md +90 -0
  70. package/data/harnesses/code/skills/design/data/color/stripe-blurple-ruby.md +90 -0
  71. package/data/harnesses/code/skills/design/data/color/superhuman-cod-picton.md +89 -0
  72. package/data/harnesses/code/skills/design/data/corpora/operations-review/companies.csv +15 -0
  73. package/data/harnesses/code/skills/design/data/corpora/operations-review/corpus.md +87 -0
  74. package/data/harnesses/code/skills/design/data/corpora/operations-review/people.csv +25 -0
  75. package/data/harnesses/code/skills/design/data/corpora/procurement-approvals/companies.csv +15 -0
  76. package/data/harnesses/code/skills/design/data/corpora/procurement-approvals/corpus.md +83 -0
  77. package/data/harnesses/code/skills/design/data/corpora/procurement-approvals/people.csv +25 -0
  78. package/data/harnesses/code/skills/design/data/corpora/revenue-analytics/companies.csv +15 -0
  79. package/data/harnesses/code/skills/design/data/corpora/revenue-analytics/corpus.md +89 -0
  80. package/data/harnesses/code/skills/design/data/corpora/revenue-analytics/people.csv +25 -0
  81. package/data/harnesses/code/skills/design/data/elevation/ant-design-directional-shadow.md +19 -0
  82. package/data/harnesses/code/skills/design/data/elevation/apple-liquid-glass-material.md +18 -0
  83. package/data/harnesses/code/skills/design/data/elevation/atlassian-surface-shadow-pairing.md +20 -0
  84. package/data/harnesses/code/skills/design/data/elevation/fluent-2-key-ambient-ramp.md +20 -0
  85. package/data/harnesses/code/skills/design/data/elevation/github-primer-sparing-shadow.md +19 -0
  86. package/data/harnesses/code/skills/design/data/elevation/ibm-carbon-layer-and-border.md +19 -0
  87. package/data/harnesses/code/skills/design/data/elevation/linear-dark-surface-ladder.md +17 -0
  88. package/data/harnesses/code/skills/design/data/elevation/material-2-key-ambient-dp-ramp.md +19 -0
  89. package/data/harnesses/code/skills/design/data/elevation/material-3-tonal-elevation.md +21 -0
  90. package/data/harnesses/code/skills/design/data/elevation/neobrutalist-hard-offset.md +19 -0
  91. package/data/harnesses/code/skills/design/data/elevation/neumorphic-soft-dual-shadow.md +18 -0
  92. package/data/harnesses/code/skills/design/data/elevation/notion-warm-minimal-hairline.md +17 -0
  93. package/data/harnesses/code/skills/design/data/elevation/polaris-elevation-inset-bevel.md +21 -0
  94. package/data/harnesses/code/skills/design/data/elevation/radix-themes-alpha-ring-scale.md +19 -0
  95. package/data/harnesses/code/skills/design/data/elevation/shadcn-neutral-derived-radius.md +19 -0
  96. package/data/harnesses/code/skills/design/data/elevation/stripe-brand-tinted-dual-shadow.md +18 -0
  97. package/data/harnesses/code/skills/design/data/elevation/tailwind-default-utility-scale.md +19 -0
  98. package/data/harnesses/code/skills/design/data/elevation/vercel-geist-shadow-as-border.md +20 -0
  99. package/data/harnesses/code/skills/design/data/gradients/amber-attention-fill.md +16 -0
  100. package/data/harnesses/code/skills/design/data/gradients/cloud-shadow-wash.md +16 -0
  101. package/data/harnesses/code/skills/design/data/gradients/confident-lavender-wash.md +16 -0
  102. package/data/harnesses/code/skills/design/data/gradients/ember-ship-flare.md +18 -0
  103. package/data/harnesses/code/skills/design/data/gradients/full-metal-wash.md +16 -0
  104. package/data/harnesses/code/skills/design/data/gradients/indigo-ruby-cta-band.md +18 -0
  105. package/data/harnesses/code/skills/design/data/gradients/linear-graphite-wash.md +18 -0
  106. package/data/harnesses/code/skills/design/data/gradients/marble-quartz-wash.md +16 -0
  107. package/data/harnesses/code/skills/design/data/gradients/midnight-aurora-panel.md +16 -0
  108. package/data/harnesses/code/skills/design/data/gradients/neutral-volume-fill.md +16 -0
  109. package/data/harnesses/code/skills/design/data/gradients/revenue-uptrend-fill.md +16 -0
  110. package/data/harnesses/code/skills/design/data/gradients/risk-decline-fill.md +16 -0
  111. package/data/harnesses/code/skills/design/data/gradients/signal-blue-develop.md +18 -0
  112. package/data/harnesses/code/skills/design/data/gradients/slate-mist-wash.md +16 -0
  113. package/data/harnesses/code/skills/design/data/gradients/stripe-atmosphere-mesh.md +18 -0
  114. package/data/harnesses/code/skills/design/data/gradients/teal-signal-accent.md +16 -0
  115. package/data/harnesses/code/skills/design/data/gradients/violet-magenta-promo.md +16 -0
  116. package/data/harnesses/code/skills/design/data/iconography.md +199 -0
  117. package/data/harnesses/code/skills/design/data/motion/accordion-expand.md +18 -0
  118. package/data/harnesses/code/skills/design/data/motion/destructive-hold-confirm.md +18 -0
  119. package/data/harnesses/code/skills/design/data/motion/drag-dismiss-momentum.md +18 -0
  120. package/data/harnesses/code/skills/design/data/motion/empty-state-arrive.md +18 -0
  121. package/data/harnesses/code/skills/design/data/motion/hover-lift.md +18 -0
  122. package/data/harnesses/code/skills/design/data/motion/modal-center-arrive.md +18 -0
  123. package/data/harnesses/code/skills/design/data/motion/number-ticker-roll.md +18 -0
  124. package/data/harnesses/code/skills/design/data/motion/onboarding-bounce.md +18 -0
  125. package/data/harnesses/code/skills/design/data/motion/panel-slide.md +18 -0
  126. package/data/harnesses/code/skills/design/data/motion/press-feedback.md +18 -0
  127. package/data/harnesses/code/skills/design/data/motion/progress-linear-loop.md +18 -0
  128. package/data/harnesses/code/skills/design/data/motion/route-crossfade.md +18 -0
  129. package/data/harnesses/code/skills/design/data/motion/rubber-band-overscroll.md +18 -0
  130. package/data/harnesses/code/skills/design/data/motion/skeleton-shimmer.md +18 -0
  131. package/data/harnesses/code/skills/design/data/motion/stagger-arrive.md +18 -0
  132. package/data/harnesses/code/skills/design/data/motion/toast-enter-stack.md +18 -0
  133. package/data/harnesses/code/skills/design/data/motion/tooltip-chain-instant.md +18 -0
  134. package/data/harnesses/code/skills/design/data/motion/trigger-anchored-reveal.md +18 -0
  135. package/data/harnesses/code/skills/design/data/tells.csv +34 -0
  136. package/data/harnesses/code/skills/design/data/typography/anton-work-sans.md +17 -0
  137. package/data/harnesses/code/skills/design/data/typography/archivo-black-archivo.md +17 -0
  138. package/data/harnesses/code/skills/design/data/typography/bitter-karla.md +17 -0
  139. package/data/harnesses/code/skills/design/data/typography/dm-serif-dm-sans.md +17 -0
  140. package/data/harnesses/code/skills/design/data/typography/fraunces-inter.md +17 -0
  141. package/data/harnesses/code/skills/design/data/typography/geist-geist-mono.md +17 -0
  142. package/data/harnesses/code/skills/design/data/typography/hubot-sans-mona-sans.md +17 -0
  143. package/data/harnesses/code/skills/design/data/typography/ibm-plex-sans-operator-single-family.md +17 -0
  144. package/data/harnesses/code/skills/design/data/typography/instrument-serif-instrument-sans.md +17 -0
  145. package/data/harnesses/code/skills/design/data/typography/inter-operator-single-family.md +17 -0
  146. package/data/harnesses/code/skills/design/data/typography/libre-baskerville-libre-franklin.md +17 -0
  147. package/data/harnesses/code/skills/design/data/typography/newsreader-inter.md +17 -0
  148. package/data/harnesses/code/skills/design/data/typography/playfair-display-source-sans.md +17 -0
  149. package/data/harnesses/code/skills/design/data/typography/public-sans-operator-single-family.md +17 -0
  150. package/data/harnesses/code/skills/design/data/typography/sohne-inter-fintech.md +17 -0
  151. package/data/harnesses/code/skills/design/data/typography/source-serif-source-sans.md +17 -0
  152. package/data/harnesses/code/skills/design/data/typography/space-grotesk-work-sans-space-mono.md +17 -0
  153. package/data/harnesses/code/skills/design/data/typography/spectral-manrope.md +17 -0
  154. package/data/harnesses/code/skills/design/data/voices/bright-collaborator.md +29 -0
  155. package/data/harnesses/code/skills/design/data/voices/direct-operator.md +29 -0
  156. package/data/harnesses/code/skills/design/data/voices/earnest-helper.md +29 -0
  157. package/data/harnesses/code/skills/design/data/voices/editorial-composed.md +29 -0
  158. package/data/harnesses/code/skills/design/data/voices/quiet-concierge.md +29 -0
  159. package/data/harnesses/code/skills/design/data/voices/warm-guide.md +29 -0
  160. package/data/harnesses/code/skills/design/design-md/SCHEMA.md +179 -0
  161. package/data/harnesses/code/skills/design/design-md/index.csv +67 -0
  162. package/data/harnesses/code/skills/design/design-md/library/airbnb.md +207 -0
  163. package/data/harnesses/code/skills/design/design-md/library/airtable.md +205 -0
  164. package/data/harnesses/code/skills/design/design-md/library/anthropic-claude.md +203 -0
  165. package/data/harnesses/code/skills/design/design-md/library/apple.md +206 -0
  166. package/data/harnesses/code/skills/design/design-md/library/binance.md +210 -0
  167. package/data/harnesses/code/skills/design/design-md/library/bmw.md +210 -0
  168. package/data/harnesses/code/skills/design/design-md/library/cal.md +209 -0
  169. package/data/harnesses/code/skills/design/design-md/library/clay.md +204 -0
  170. package/data/harnesses/code/skills/design/design-md/library/clickhouse.md +205 -0
  171. package/data/harnesses/code/skills/design/design-md/library/cohere.md +205 -0
  172. package/data/harnesses/code/skills/design/design-md/library/coinbase.md +198 -0
  173. package/data/harnesses/code/skills/design/design-md/library/composio.md +198 -0
  174. package/data/harnesses/code/skills/design/design-md/library/cursor.md +197 -0
  175. package/data/harnesses/code/skills/design/design-md/library/elevenlabs.md +199 -0
  176. package/data/harnesses/code/skills/design/design-md/library/expo.md +200 -0
  177. package/data/harnesses/code/skills/design/design-md/library/figma.md +199 -0
  178. package/data/harnesses/code/skills/design/design-md/library/framer.md +202 -0
  179. package/data/harnesses/code/skills/design/design-md/library/hashicorp.md +205 -0
  180. package/data/harnesses/code/skills/design/design-md/library/ibm.md +205 -0
  181. package/data/harnesses/code/skills/design/design-md/library/intercom.md +204 -0
  182. package/data/harnesses/code/skills/design/design-md/library/kraken.md +200 -0
  183. package/data/harnesses/code/skills/design/design-md/library/linear-app.md +198 -0
  184. package/data/harnesses/code/skills/design/design-md/library/lovable.md +199 -0
  185. package/data/harnesses/code/skills/design/design-md/library/meta.md +204 -0
  186. package/data/harnesses/code/skills/design/design-md/library/minimax.md +204 -0
  187. package/data/harnesses/code/skills/design/design-md/library/mintlify.md +210 -0
  188. package/data/harnesses/code/skills/design/design-md/library/miro.md +209 -0
  189. package/data/harnesses/code/skills/design/design-md/library/mistral-ai.md +201 -0
  190. package/data/harnesses/code/skills/design/design-md/library/mongodb.md +201 -0
  191. package/data/harnesses/code/skills/design/design-md/library/notion.md +204 -0
  192. package/data/harnesses/code/skills/design/design-md/library/nvidia.md +215 -0
  193. package/data/harnesses/code/skills/design/design-md/library/ollama.md +213 -0
  194. package/data/harnesses/code/skills/design/design-md/library/opencode-ai.md +216 -0
  195. package/data/harnesses/code/skills/design/design-md/library/posthog.md +218 -0
  196. package/data/harnesses/code/skills/design/design-md/library/raycast.md +214 -0
  197. package/data/harnesses/code/skills/design/design-md/library/replicate.md +202 -0
  198. package/data/harnesses/code/skills/design/design-md/library/resend.md +203 -0
  199. package/data/harnesses/code/skills/design/design-md/library/revolut.md +203 -0
  200. package/data/harnesses/code/skills/design/design-md/library/runwayml.md +203 -0
  201. package/data/harnesses/code/skills/design/design-md/library/sanity.md +200 -0
  202. package/data/harnesses/code/skills/design/design-md/library/sentry.md +201 -0
  203. package/data/harnesses/code/skills/design/design-md/library/shopify.md +202 -0
  204. package/data/harnesses/code/skills/design/design-md/library/slack.md +202 -0
  205. package/data/harnesses/code/skills/design/design-md/library/spacex.md +206 -0
  206. package/data/harnesses/code/skills/design/design-md/library/spotify.md +206 -0
  207. package/data/harnesses/code/skills/design/design-md/library/stripe.md +196 -0
  208. package/data/harnesses/code/skills/design/design-md/library/supabase.md +196 -0
  209. package/data/harnesses/code/skills/design/design-md/library/superhuman.md +194 -0
  210. package/data/harnesses/code/skills/design/design-md/library/tesla.md +198 -0
  211. package/data/harnesses/code/skills/design/design-md/library/theverge.md +199 -0
  212. package/data/harnesses/code/skills/design/design-md/library/together-ai.md +193 -0
  213. package/data/harnesses/code/skills/design/design-md/library/uber.md +195 -0
  214. package/data/harnesses/code/skills/design/design-md/library/vercel.md +195 -0
  215. package/data/harnesses/code/skills/design/design-md/library/voltagent.md +197 -0
  216. package/data/harnesses/code/skills/design/design-md/library/warp.md +196 -0
  217. package/data/harnesses/code/skills/design/design-md/library/webflow.md +197 -0
  218. package/data/harnesses/code/skills/design/design-md/library/wired.md +197 -0
  219. package/data/harnesses/code/skills/design/design-md/library/wise.md +198 -0
  220. package/data/harnesses/code/skills/design/design-md/library/x-ai.md +199 -0
  221. package/data/harnesses/code/skills/design/design-md/library/zapier.md +198 -0
  222. package/data/harnesses/code/skills/design/design-md/nurix.md +214 -0
  223. package/data/harnesses/code/skills/design/design-md/variants/editorial-luxury.md +184 -0
  224. package/data/harnesses/code/skills/design/design-md/variants/expressive-saas.md +216 -0
  225. package/data/harnesses/code/skills/design/design-md/variants/quiet-premium.md +211 -0
  226. package/data/harnesses/code/skills/design/design-md/variants/terse-dense-operator.md +212 -0
  227. package/data/harnesses/code/skills/design/design-md/variants/warm-approachable.md +216 -0
  228. package/data/harnesses/code/skills/design/references/compose.md +23 -0
  229. package/data/harnesses/code/skills/design/references/content.md +28 -0
  230. package/data/harnesses/code/skills/design/references/emission.md +21 -0
  231. package/data/harnesses/code/skills/design/references/existing-apps.md +27 -0
  232. package/data/harnesses/code/skills/design/references/intake.md +36 -0
  233. package/data/harnesses/code/skills/design/references/object-pass.md +24 -0
  234. package/data/harnesses/code/skills/design/references/ship-gate.md +29 -0
  235. package/data/harnesses/code/skills/design/references/ux-patterns/Readme.md +195 -0
  236. package/data/harnesses/code/skills/design/references/ux-patterns/ai-layer.md +49 -0
  237. package/data/harnesses/code/skills/design/references/ux-patterns/attributes-lifecycle.md +43 -0
  238. package/data/harnesses/code/skills/design/references/ux-patterns/container-choice.md +44 -0
  239. package/data/harnesses/code/skills/design/references/ux-patterns/creation-paths.md +46 -0
  240. package/data/harnesses/code/skills/design/references/ux-patterns/dashboards.md +42 -0
  241. package/data/harnesses/code/skills/design/references/ux-patterns/modes.md +42 -0
  242. package/data/harnesses/code/skills/design/references/ux-patterns/object-model.md +46 -0
  243. package/data/harnesses/code/skills/design/references/ux-patterns/page-archetype.md +48 -0
  244. package/data/harnesses/code/skills/design/references/ux-patterns/promotion-demotion.md +37 -0
  245. package/data/harnesses/code/skills/design/references/ux-patterns/settings.md +42 -0
  246. package/data/harnesses/code/skills/design/references/ux-patterns/standard-pages.md +46 -0
  247. package/data/harnesses/code/skills/design/references/ux-patterns/state-matrix.md +41 -0
  248. package/data/harnesses/code/skills/design/references/ux-patterns/table-mechanics.md +48 -0
  249. package/data/harnesses/code/skills/design/references/ux-patterns/verbs.md +45 -0
  250. package/data/harnesses/code/skills/design/references/ux-patterns/viewer-context.md +40 -0
  251. package/data/harnesses/code/skills/design/scripts/README-validator.md +27 -0
  252. package/data/harnesses/code/skills/design/scripts/select-chart.mjs +596 -0
  253. package/data/harnesses/code/skills/design/scripts/validate-design-md.mjs +1198 -0
  254. package/data/harnesses/discussion/agents/discussion-baseline.md +1 -1
  255. package/data/harnesses/discussion/harness.json +1 -1
  256. package/data/harnesses/etna/agents/maintenance.md +1 -1
  257. package/data/harnesses/etna/harness.json +1 -1
  258. package/data/harnesses/hr/CLAUDE.md +1 -1
  259. package/data/harnesses/hr/harness.json +1 -1
  260. package/package.json +1 -1
  261. package/data/harnesses/code/skills/design/data/catalog/rules.csv +0 -137
  262. package/data/harnesses/code/skills/design/data/combinations/Readme.md +0 -33
  263. package/data/harnesses/code/skills/design/data/combinations/accent-presets.md +0 -113
  264. package/data/harnesses/code/skills/design/data/combinations/charts.csv +0 -33
  265. package/data/harnesses/code/skills/design/data/combinations/fonts-known.json +0 -448
  266. package/data/harnesses/code/skills/design/data/combinations/icons.csv +0 -157
  267. package/data/harnesses/code/skills/design/data/combinations/landing.csv +0 -38
  268. package/data/harnesses/code/skills/design/data/combinations/lucide-names.json +0 -2001
  269. package/data/harnesses/code/skills/design/data/combinations/manifest.json +0 -330
  270. package/data/harnesses/code/skills/design/data/combinations/motion.csv +0 -10
  271. package/data/harnesses/code/skills/design/data/combinations/palettes.csv +0 -92
  272. package/data/harnesses/code/skills/design/data/combinations/product-router.csv +0 -80
  273. package/data/harnesses/code/skills/design/data/combinations/styles.csv +0 -67
  274. package/data/harnesses/code/skills/design/data/combinations/typography.csv +0 -64
  275. package/data/harnesses/code/skills/design/data/design-md/SCHEMA.md +0 -106
  276. package/data/harnesses/code/skills/design/data/design-md/library/airbnb.md +0 -154
  277. package/data/harnesses/code/skills/design/data/design-md/library/airtable.md +0 -151
  278. package/data/harnesses/code/skills/design/data/design-md/library/anthropic-claude.md +0 -139
  279. package/data/harnesses/code/skills/design/data/design-md/library/apple.md +0 -139
  280. package/data/harnesses/code/skills/design/data/design-md/library/binance.md +0 -140
  281. package/data/harnesses/code/skills/design/data/design-md/library/bmw.md +0 -140
  282. package/data/harnesses/code/skills/design/data/design-md/library/cal.md +0 -140
  283. package/data/harnesses/code/skills/design/data/design-md/library/clay.md +0 -139
  284. package/data/harnesses/code/skills/design/data/design-md/library/clickhouse.md +0 -139
  285. package/data/harnesses/code/skills/design/data/design-md/library/cohere.md +0 -147
  286. package/data/harnesses/code/skills/design/data/design-md/library/coinbase.md +0 -156
  287. package/data/harnesses/code/skills/design/data/design-md/library/composio.md +0 -138
  288. package/data/harnesses/code/skills/design/data/design-md/library/cursor.md +0 -138
  289. package/data/harnesses/code/skills/design/data/design-md/library/elevenlabs.md +0 -137
  290. package/data/harnesses/code/skills/design/data/design-md/library/expo.md +0 -148
  291. package/data/harnesses/code/skills/design/data/design-md/library/figma.md +0 -141
  292. package/data/harnesses/code/skills/design/data/design-md/library/framer.md +0 -156
  293. package/data/harnesses/code/skills/design/data/design-md/library/hashicorp.md +0 -140
  294. package/data/harnesses/code/skills/design/data/design-md/library/ibm.md +0 -153
  295. package/data/harnesses/code/skills/design/data/design-md/library/intercom.md +0 -158
  296. package/data/harnesses/code/skills/design/data/design-md/library/kraken.md +0 -156
  297. package/data/harnesses/code/skills/design/data/design-md/library/linear-app.md +0 -122
  298. package/data/harnesses/code/skills/design/data/design-md/library/lovable.md +0 -140
  299. package/data/harnesses/code/skills/design/data/design-md/library/meta.md +0 -139
  300. package/data/harnesses/code/skills/design/data/design-md/library/minimax.md +0 -139
  301. package/data/harnesses/code/skills/design/data/design-md/library/mintlify.md +0 -139
  302. package/data/harnesses/code/skills/design/data/design-md/library/miro.md +0 -153
  303. package/data/harnesses/code/skills/design/data/design-md/library/mistral-ai.md +0 -140
  304. package/data/harnesses/code/skills/design/data/design-md/library/mongodb.md +0 -155
  305. package/data/harnesses/code/skills/design/data/design-md/library/notion.md +0 -140
  306. package/data/harnesses/code/skills/design/data/design-md/library/nvidia.md +0 -141
  307. package/data/harnesses/code/skills/design/data/design-md/library/ollama.md +0 -145
  308. package/data/harnesses/code/skills/design/data/design-md/library/opencode-ai.md +0 -142
  309. package/data/harnesses/code/skills/design/data/design-md/library/posthog.md +0 -152
  310. package/data/harnesses/code/skills/design/data/design-md/library/raycast.md +0 -137
  311. package/data/harnesses/code/skills/design/data/design-md/library/replicate.md +0 -140
  312. package/data/harnesses/code/skills/design/data/design-md/library/resend.md +0 -170
  313. package/data/harnesses/code/skills/design/data/design-md/library/revolut.md +0 -145
  314. package/data/harnesses/code/skills/design/data/design-md/library/runwayml.md +0 -137
  315. package/data/harnesses/code/skills/design/data/design-md/library/sanity.md +0 -168
  316. package/data/harnesses/code/skills/design/data/design-md/library/sentry.md +0 -163
  317. package/data/harnesses/code/skills/design/data/design-md/library/shopify.md +0 -147
  318. package/data/harnesses/code/skills/design/data/design-md/library/slack.md +0 -158
  319. package/data/harnesses/code/skills/design/data/design-md/library/spacex.md +0 -171
  320. package/data/harnesses/code/skills/design/data/design-md/library/spotify.md +0 -166
  321. package/data/harnesses/code/skills/design/data/design-md/library/stripe.md +0 -160
  322. package/data/harnesses/code/skills/design/data/design-md/library/supabase.md +0 -173
  323. package/data/harnesses/code/skills/design/data/design-md/library/superhuman.md +0 -145
  324. package/data/harnesses/code/skills/design/data/design-md/library/tesla.md +0 -153
  325. package/data/harnesses/code/skills/design/data/design-md/library/theverge.md +0 -167
  326. package/data/harnesses/code/skills/design/data/design-md/library/together-ai.md +0 -140
  327. package/data/harnesses/code/skills/design/data/design-md/library/uber.md +0 -140
  328. package/data/harnesses/code/skills/design/data/design-md/library/vercel.md +0 -140
  329. package/data/harnesses/code/skills/design/data/design-md/library/voltagent.md +0 -130
  330. package/data/harnesses/code/skills/design/data/design-md/library/warp.md +0 -140
  331. package/data/harnesses/code/skills/design/data/design-md/library/webflow.md +0 -140
  332. package/data/harnesses/code/skills/design/data/design-md/library/wired.md +0 -139
  333. package/data/harnesses/code/skills/design/data/design-md/library/wise.md +0 -137
  334. package/data/harnesses/code/skills/design/data/design-md/library/x-ai.md +0 -138
  335. package/data/harnesses/code/skills/design/data/design-md/library/zapier.md +0 -158
  336. package/data/harnesses/code/skills/design/data/design-md/nurix.md +0 -138
  337. package/data/harnesses/code/skills/design/data/design-tokens/SCHEMA.md +0 -695
  338. package/data/harnesses/code/skills/design/data/design-tokens/airbnb/design.resolver.json +0 -20
  339. package/data/harnesses/code/skills/design/data/design-tokens/airbnb/design.tokens.json +0 -1272
  340. package/data/harnesses/code/skills/design/data/design-tokens/airtable/design.resolver.json +0 -20
  341. package/data/harnesses/code/skills/design/data/design-tokens/airtable/design.tokens.json +0 -1268
  342. package/data/harnesses/code/skills/design/data/design-tokens/anthropic-claude/design.resolver.json +0 -20
  343. package/data/harnesses/code/skills/design/data/design-tokens/anthropic-claude/design.tokens.json +0 -1273
  344. package/data/harnesses/code/skills/design/data/design-tokens/apple/design.resolver.json +0 -20
  345. package/data/harnesses/code/skills/design/data/design-tokens/apple/design.tokens.json +0 -1262
  346. package/data/harnesses/code/skills/design/data/design-tokens/binance/design.resolver.json +0 -20
  347. package/data/harnesses/code/skills/design/data/design-tokens/binance/design.tokens.json +0 -1257
  348. package/data/harnesses/code/skills/design/data/design-tokens/bmw/design.resolver.json +0 -20
  349. package/data/harnesses/code/skills/design/data/design-tokens/bmw/design.tokens.json +0 -1270
  350. package/data/harnesses/code/skills/design/data/design-tokens/cal/design.resolver.json +0 -20
  351. package/data/harnesses/code/skills/design/data/design-tokens/cal/design.tokens.json +0 -1270
  352. package/data/harnesses/code/skills/design/data/design-tokens/clay/design.resolver.json +0 -20
  353. package/data/harnesses/code/skills/design/data/design-tokens/clay/design.tokens.json +0 -1261
  354. package/data/harnesses/code/skills/design/data/design-tokens/clickhouse/design.resolver.json +0 -20
  355. package/data/harnesses/code/skills/design/data/design-tokens/clickhouse/design.tokens.json +0 -1268
  356. package/data/harnesses/code/skills/design/data/design-tokens/cohere/design.resolver.json +0 -20
  357. package/data/harnesses/code/skills/design/data/design-tokens/cohere/design.tokens.json +0 -1281
  358. package/data/harnesses/code/skills/design/data/design-tokens/coinbase/design.resolver.json +0 -20
  359. package/data/harnesses/code/skills/design/data/design-tokens/coinbase/design.tokens.json +0 -1262
  360. package/data/harnesses/code/skills/design/data/design-tokens/composio/design.resolver.json +0 -20
  361. package/data/harnesses/code/skills/design/data/design-tokens/composio/design.tokens.json +0 -1271
  362. package/data/harnesses/code/skills/design/data/design-tokens/cursor/design.resolver.json +0 -20
  363. package/data/harnesses/code/skills/design/data/design-tokens/cursor/design.tokens.json +0 -1276
  364. package/data/harnesses/code/skills/design/data/design-tokens/elevenlabs/design.resolver.json +0 -20
  365. package/data/harnesses/code/skills/design/data/design-tokens/elevenlabs/design.tokens.json +0 -1293
  366. package/data/harnesses/code/skills/design/data/design-tokens/expo/design.resolver.json +0 -20
  367. package/data/harnesses/code/skills/design/data/design-tokens/expo/design.tokens.json +0 -1270
  368. package/data/harnesses/code/skills/design/data/design-tokens/figma/design.resolver.json +0 -20
  369. package/data/harnesses/code/skills/design/data/design-tokens/figma/design.tokens.json +0 -1276
  370. package/data/harnesses/code/skills/design/data/design-tokens/framer/design.resolver.json +0 -20
  371. package/data/harnesses/code/skills/design/data/design-tokens/framer/design.tokens.json +0 -1267
  372. package/data/harnesses/code/skills/design/data/design-tokens/goldens.json +0 -251
  373. package/data/harnesses/code/skills/design/data/design-tokens/hashicorp/design.resolver.json +0 -20
  374. package/data/harnesses/code/skills/design/data/design-tokens/hashicorp/design.tokens.json +0 -1273
  375. package/data/harnesses/code/skills/design/data/design-tokens/ibm/design.resolver.json +0 -20
  376. package/data/harnesses/code/skills/design/data/design-tokens/ibm/design.tokens.json +0 -1286
  377. package/data/harnesses/code/skills/design/data/design-tokens/intercom/design.resolver.json +0 -20
  378. package/data/harnesses/code/skills/design/data/design-tokens/intercom/design.tokens.json +0 -1290
  379. package/data/harnesses/code/skills/design/data/design-tokens/kraken/design.resolver.json +0 -20
  380. package/data/harnesses/code/skills/design/data/design-tokens/kraken/design.tokens.json +0 -1270
  381. package/data/harnesses/code/skills/design/data/design-tokens/linear-app/design.resolver.json +0 -23
  382. package/data/harnesses/code/skills/design/data/design-tokens/linear-app/design.tokens.dark.json +0 -599
  383. package/data/harnesses/code/skills/design/data/design-tokens/linear-app/design.tokens.json +0 -1272
  384. package/data/harnesses/code/skills/design/data/design-tokens/lovable/design.resolver.json +0 -20
  385. package/data/harnesses/code/skills/design/data/design-tokens/lovable/design.tokens.json +0 -1267
  386. package/data/harnesses/code/skills/design/data/design-tokens/meta/design.resolver.json +0 -20
  387. package/data/harnesses/code/skills/design/data/design-tokens/meta/design.tokens.json +0 -1289
  388. package/data/harnesses/code/skills/design/data/design-tokens/minimax/design.resolver.json +0 -20
  389. package/data/harnesses/code/skills/design/data/design-tokens/minimax/design.tokens.json +0 -1258
  390. package/data/harnesses/code/skills/design/data/design-tokens/mintlify/design.resolver.json +0 -20
  391. package/data/harnesses/code/skills/design/data/design-tokens/mintlify/design.tokens.json +0 -1284
  392. package/data/harnesses/code/skills/design/data/design-tokens/miro/design.resolver.json +0 -20
  393. package/data/harnesses/code/skills/design/data/design-tokens/miro/design.tokens.json +0 -1291
  394. package/data/harnesses/code/skills/design/data/design-tokens/mistral-ai/design.resolver.json +0 -20
  395. package/data/harnesses/code/skills/design/data/design-tokens/mistral-ai/design.tokens.json +0 -1263
  396. package/data/harnesses/code/skills/design/data/design-tokens/mongodb/design.resolver.json +0 -20
  397. package/data/harnesses/code/skills/design/data/design-tokens/mongodb/design.tokens.json +0 -1270
  398. package/data/harnesses/code/skills/design/data/design-tokens/notion/design.resolver.json +0 -20
  399. package/data/harnesses/code/skills/design/data/design-tokens/notion/design.tokens.json +0 -1261
  400. package/data/harnesses/code/skills/design/data/design-tokens/nurix/design.resolver.json +0 -20
  401. package/data/harnesses/code/skills/design/data/design-tokens/nurix/design.tokens.json +0 -1209
  402. package/data/harnesses/code/skills/design/data/design-tokens/nvidia/design.resolver.json +0 -20
  403. package/data/harnesses/code/skills/design/data/design-tokens/nvidia/design.tokens.json +0 -1265
  404. package/data/harnesses/code/skills/design/data/design-tokens/ollama/design.resolver.json +0 -20
  405. package/data/harnesses/code/skills/design/data/design-tokens/ollama/design.tokens.json +0 -1253
  406. package/data/harnesses/code/skills/design/data/design-tokens/opencode-ai/design.resolver.json +0 -20
  407. package/data/harnesses/code/skills/design/data/design-tokens/opencode-ai/design.tokens.json +0 -1268
  408. package/data/harnesses/code/skills/design/data/design-tokens/posthog/design.resolver.json +0 -20
  409. package/data/harnesses/code/skills/design/data/design-tokens/posthog/design.tokens.json +0 -1261
  410. package/data/harnesses/code/skills/design/data/design-tokens/raycast/design.resolver.json +0 -20
  411. package/data/harnesses/code/skills/design/data/design-tokens/raycast/design.tokens.json +0 -1263
  412. package/data/harnesses/code/skills/design/data/design-tokens/replicate/design.resolver.json +0 -20
  413. package/data/harnesses/code/skills/design/data/design-tokens/replicate/design.tokens.json +0 -1266
  414. package/data/harnesses/code/skills/design/data/design-tokens/resend/design.resolver.json +0 -23
  415. package/data/harnesses/code/skills/design/data/design-tokens/resend/design.tokens.dark.json +0 -623
  416. package/data/harnesses/code/skills/design/data/design-tokens/resend/design.tokens.json +0 -1276
  417. package/data/harnesses/code/skills/design/data/design-tokens/revolut/design.resolver.json +0 -20
  418. package/data/harnesses/code/skills/design/data/design-tokens/revolut/design.tokens.json +0 -1264
  419. package/data/harnesses/code/skills/design/data/design-tokens/runwayml/design.resolver.json +0 -20
  420. package/data/harnesses/code/skills/design/data/design-tokens/runwayml/design.tokens.json +0 -1268
  421. package/data/harnesses/code/skills/design/data/design-tokens/sanity/design.resolver.json +0 -20
  422. package/data/harnesses/code/skills/design/data/design-tokens/sanity/design.tokens.json +0 -1270
  423. package/data/harnesses/code/skills/design/data/design-tokens/sentry/design.resolver.json +0 -20
  424. package/data/harnesses/code/skills/design/data/design-tokens/sentry/design.tokens.json +0 -1288
  425. package/data/harnesses/code/skills/design/data/design-tokens/shopify/design.resolver.json +0 -20
  426. package/data/harnesses/code/skills/design/data/design-tokens/shopify/design.tokens.json +0 -1272
  427. package/data/harnesses/code/skills/design/data/design-tokens/slack/design.resolver.json +0 -20
  428. package/data/harnesses/code/skills/design/data/design-tokens/slack/design.tokens.json +0 -1265
  429. package/data/harnesses/code/skills/design/data/design-tokens/spacex/design.resolver.json +0 -20
  430. package/data/harnesses/code/skills/design/data/design-tokens/spacex/design.tokens.json +0 -1287
  431. package/data/harnesses/code/skills/design/data/design-tokens/spotify/design.resolver.json +0 -20
  432. package/data/harnesses/code/skills/design/data/design-tokens/spotify/design.tokens.json +0 -1286
  433. package/data/harnesses/code/skills/design/data/design-tokens/stripe/design.resolver.json +0 -20
  434. package/data/harnesses/code/skills/design/data/design-tokens/stripe/design.tokens.json +0 -1285
  435. package/data/harnesses/code/skills/design/data/design-tokens/supabase/design.resolver.json +0 -20
  436. package/data/harnesses/code/skills/design/data/design-tokens/supabase/design.tokens.json +0 -1287
  437. package/data/harnesses/code/skills/design/data/design-tokens/superhuman/design.resolver.json +0 -20
  438. package/data/harnesses/code/skills/design/data/design-tokens/superhuman/design.tokens.json +0 -1278
  439. package/data/harnesses/code/skills/design/data/design-tokens/tesla/design.resolver.json +0 -20
  440. package/data/harnesses/code/skills/design/data/design-tokens/tesla/design.tokens.json +0 -1269
  441. package/data/harnesses/code/skills/design/data/design-tokens/theverge/design.resolver.json +0 -20
  442. package/data/harnesses/code/skills/design/data/design-tokens/theverge/design.tokens.json +0 -1285
  443. package/data/harnesses/code/skills/design/data/design-tokens/together-ai/design.resolver.json +0 -20
  444. package/data/harnesses/code/skills/design/data/design-tokens/together-ai/design.tokens.json +0 -1303
  445. package/data/harnesses/code/skills/design/data/design-tokens/uber/design.resolver.json +0 -20
  446. package/data/harnesses/code/skills/design/data/design-tokens/uber/design.tokens.json +0 -1274
  447. package/data/harnesses/code/skills/design/data/design-tokens/vercel/design.resolver.json +0 -20
  448. package/data/harnesses/code/skills/design/data/design-tokens/vercel/design.tokens.json +0 -1296
  449. package/data/harnesses/code/skills/design/data/design-tokens/voltagent/design.resolver.json +0 -23
  450. package/data/harnesses/code/skills/design/data/design-tokens/voltagent/design.tokens.dark.json +0 -612
  451. package/data/harnesses/code/skills/design/data/design-tokens/voltagent/design.tokens.json +0 -1282
  452. package/data/harnesses/code/skills/design/data/design-tokens/warp/design.resolver.json +0 -20
  453. package/data/harnesses/code/skills/design/data/design-tokens/warp/design.tokens.json +0 -1287
  454. package/data/harnesses/code/skills/design/data/design-tokens/webflow/design.resolver.json +0 -20
  455. package/data/harnesses/code/skills/design/data/design-tokens/webflow/design.tokens.json +0 -1268
  456. package/data/harnesses/code/skills/design/data/design-tokens/wired/design.resolver.json +0 -20
  457. package/data/harnesses/code/skills/design/data/design-tokens/wired/design.tokens.json +0 -1276
  458. package/data/harnesses/code/skills/design/data/design-tokens/wise/design.resolver.json +0 -20
  459. package/data/harnesses/code/skills/design/data/design-tokens/wise/design.tokens.json +0 -1273
  460. package/data/harnesses/code/skills/design/data/design-tokens/x-ai/design.resolver.json +0 -20
  461. package/data/harnesses/code/skills/design/data/design-tokens/x-ai/design.tokens.json +0 -1296
  462. package/data/harnesses/code/skills/design/data/design-tokens/zapier/design.resolver.json +0 -20
  463. package/data/harnesses/code/skills/design/data/design-tokens/zapier/design.tokens.json +0 -1286
  464. package/data/harnesses/code/skills/design/data/operator-pack/exemplars/command-center.tsx +0 -249
  465. package/data/harnesses/code/skills/design/data/operator-pack/exemplars/create-edit.tsx +0 -249
  466. package/data/harnesses/code/skills/design/data/operator-pack/exemplars/dashboard.tsx +0 -225
  467. package/data/harnesses/code/skills/design/data/operator-pack/exemplars/entity-detail.tsx +0 -249
  468. package/data/harnesses/code/skills/design/data/operator-pack/exemplars/list-detail.tsx +0 -224
  469. package/data/harnesses/code/skills/design/data/operator-pack/exemplars/log-stream.tsx +0 -249
  470. package/data/harnesses/code/skills/design/data/operator-pack/fixtures.md +0 -88
  471. package/data/harnesses/code/skills/design/data/operator-pack/surface-catalog.md +0 -132
  472. package/data/harnesses/code/skills/design/data/operator-pack/trust-rubric.md +0 -76
  473. package/data/harnesses/code/skills/design/references/create.md +0 -173
  474. package/data/harnesses/code/skills/design/references/diagnosis.md +0 -108
  475. package/data/harnesses/code/skills/design/references/hard-rules.md +0 -177
  476. package/data/harnesses/code/skills/design/references/improve.md +0 -116
  477. package/data/harnesses/code/skills/design/references/interaction.md +0 -77
  478. package/data/harnesses/code/skills/design/references/introspect.md +0 -100
  479. package/data/harnesses/code/skills/design/references/lifecycle.md +0 -73
  480. package/data/harnesses/code/skills/design/references/personality.md +0 -575
  481. package/data/harnesses/code/skills/design/references/structure.md +0 -159
  482. package/data/harnesses/code/skills/design/scripts/convert-design-md.mjs +0 -1312
  483. package/data/harnesses/code/skills/design/scripts/derive-personality.mjs +0 -1498
  484. package/data/harnesses/code/skills/design/scripts/generate-fixtures.mjs +0 -551
  485. package/data/harnesses/code/skills/design/scripts/lib/checks.mjs +0 -1092
  486. package/data/harnesses/code/skills/design/scripts/lib/golden.mjs +0 -26
  487. package/data/harnesses/code/skills/design/scripts/lib/vocabulary.mjs +0 -65
  488. package/data/harnesses/code/skills/design/scripts/phase-gate.mjs +0 -538
  489. package/data/harnesses/code/skills/design/scripts/preship-sweep.mjs +0 -312
  490. package/data/harnesses/code/skills/design/scripts/render-rung.mjs +0 -890
  491. package/data/harnesses/code/skills/design/scripts/scaffold.mjs +0 -769
  492. package/data/harnesses/code/skills/design/scripts/self-integrity.mjs +0 -675
  493. package/data/harnesses/code/skills/design/scripts/snapshot-goldens.mjs +0 -164
  494. package/data/harnesses/code/skills/design/scripts/validate-combinations.mjs +0 -439
@@ -1,695 +0,0 @@
1
- # design-tokens — schema `design-tokens/v2`
2
-
3
- A look travels as a **design-tokens artifact**: three JSON files in the pinned **DTCG 2025.10 Stable**
4
- grammar (W3C Design Tokens Community Group — the dated snapshot; the live drafts carry the spec's own
5
- "do not implement" warning). The artifact is exact, queryable, and diffable — no consumer interprets
6
- prose. [`derive-personality.mjs`](../../scripts/derive-personality.mjs) is the reference consumer:
7
- `--check` is the coverage gate, `--emit` writes `personality.css` / `globals.css` / the `<html>`
8
- attributes. The check engine ([`lib/checks.mjs`](../../scripts/lib/checks.mjs), fired at the phase
9
- gates and the verify/pre-ship sweeps) reads the lever manifest from the artifact's `$extensions` payload.
10
-
11
- The token files are a project's **canonical look state**. Create writes them, improve rewrites them,
12
- extraction on a foreign UI recovers them. No readable design.md view is generated from the token
13
- files — the nine-section [design.md format](../design-md/SCHEMA.md) serves only as the library's
14
- documentation format.
15
-
16
- **One schema, every origin.** A project's own artifact, an extracted artifact, a shipped library
17
- entry, and the Nurix default all use this identical shape; only the payload's `provenance` varies.
18
-
19
- **v1 → v2 in one line:** everything structural survives; the vocabulary grows — **expression arrives
20
- as tokens** (27 primitives, 36 color roles, a 7-step ramp, 4 elevation composites, an optional wash
21
- pair, and the `theme-default` / `anchors` payload keys), so the no-literals rule and the token-lock
22
- now guard a vocabulary with range. Existing v1 artifacts migrate mechanically:
23
- `convert-design-md.mjs --upgrade-v2` (idempotent; the Migration section below).
24
-
25
- ---
26
-
27
- ## The three files
28
-
29
- | File | Ships | Contents |
30
- | --- | --- | --- |
31
- | `design.tokens.json` | always | The base/light set: the 27 visual primitives, the 36 color roles, the typography composites, the 4 elevation composites, the optional wash pair, and the file-level `$extensions["com.nurix.design"]` payload. The base set **is** the light rendering — light is never omitted, even when `theme-default` is `dark`. |
32
- | `design.tokens.dark.json` | only when the look has dark values | The dark modifier set: the `color` group remapped, nothing else. |
33
- | `design.resolver.json` | always | Sets, modifiers, and resolution order. The theme modifier's `default` mirrors the payload's `theme-default`. |
34
-
35
- The three files sit together in one directory: a project's artifact lives at the repo root; a library
36
- entry lives at `data/design-tokens/<product-slug>/`; the Nurix default at `data/design-tokens/nurix/`.
37
-
38
- Look resolution is project-first — `project`/`extracted` artifacts win outright; a `library` entry
39
- serves only on confirmed match; the `default` serves when nothing else does. The origin is recorded in
40
- the payload's `provenance` field:
41
-
42
- | `provenance` | Origin | Precedence |
43
- | --- | --- | --- |
44
- | `project` | The project's own artifact, written by a create run. | Wins outright when present. |
45
- | `extracted` | Recovered from a UI this skill did not build. | Same tier as `project`. |
46
- | `library` | A shipped library entry. | Serves only when the brief names or resembles the product and the user confirms. |
47
- | `default` | The Nurix default. | Worn when there is no project artifact and no confirmed library match. |
48
-
49
- ---
50
-
51
- ## DTCG grammar in this artifact
52
-
53
- A token is an object with `$type` and `$value`, plus optional `$description` and `$extensions`.
54
- Groups nest; the file root is a group and carries the file-level `$extensions`. An alias is the
55
- string `"{path.to.token}"` and may appear anywhere a value of the target's type is legal, including
56
- composite sub-values; alias chains are legal, cycles are not. Exactly ten `$type` values appear —
57
- **never invent a custom `$type`** (`shadow` and `gradient` are DTCG 2025.10 composite types, not
58
- inventions):
59
-
60
- | `$type` | `$value` shape | Used by |
61
- | --- | --- | --- |
62
- | `color` | `{ "colorSpace": "oklch"\|"srgb", "components": [n, n, n], "alpha"?: n, "hex"?: "#rrggbb" }` | the 36 color roles, shadow layer colors, gradient stop colors |
63
- | `dimension` | `{ "value": n, "unit": "px" }` (`px`\|`rem` per spec; this artifact always writes `px`) | `radius`, `border-weight`, `icon-size-base`, the 8 layout primitives, ramp `fontSize`, shadow lengths |
64
- | `duration` | `{ "value": n, "unit": "ms" }` | the 4 duration primitives, `stagger-unit` |
65
- | `cubicBezier` | `[x1, y1, x2, y2]` (numbers; x in 0–1) | `ease-default` |
66
- | `fontFamily` | array of family-name strings | `font-sans`, `font-mono`, `typography.family.*` |
67
- | `fontWeight` | number 100–900 | `font-weight-normal`, `font-weight-strong`, ramp `fontWeight` |
68
- | `number` | plain JSON number | `shadow-intensity`, `density-gap`, `density-inset`, `heading-tracking`, `contrast-boost`, `icon-stroke`, ramp `lineHeight` / `letterSpacing` |
69
- | `typography` | composite `{ fontFamily, fontSize, fontWeight, letterSpacing, lineHeight }` | the 7 ramp steps |
70
- | `shadow` | composite **array of layers** `{ color, offsetX, offsetY, blur, spread }` (color/dimension sub-value shapes as above) | the 4 `elevation.*` tokens |
71
- | `gradient` | composite **array of stops** `{ color, position }` (position a number 0–1) | the ≤ 2 `wash.*` tokens |
72
-
73
- Color rules: an oklch source stays `"colorSpace": "oklch"` with `components` carrying the literal
74
- `[L, C, H]` numbers from the source string; a hex/rgba (or any other CSS color) source becomes
75
- `"colorSpace": "srgb"` with `components` as `[r, g, b]` in 0–1 (at most 5 decimals), the `hex`
76
- fallback field, and `alpha` when the source carries one:
77
-
78
- ```json
79
- {
80
- "$type": "color",
81
- "$value": { "colorSpace": "srgb", "components": [0.3098, 0.2745, 0.898], "alpha": 1, "hex": "#4f46e5" },
82
- "$extensions": { "com.nurix.design": { "css": "#4f46e5" } }
83
- }
84
- ```
85
-
86
- **One documented deviation.** The spec's `dimension` carries only `px`|`rem`, so an `em` tracking
87
- value cannot be a dimension. `heading-tracking` is therefore a `number` token (an em multiplier) with
88
- its exact source string preserved (the preserved-css pattern, below), and a typography composite's
89
- `letterSpacing` sub-value is a number (em multiplier) or an alias to one — not a spec dimension.
90
- Everything else in the artifact is spec-shaped.
91
-
92
- ---
93
-
94
- ## The file-level payload — `$extensions["com.nurix.design"]`
95
-
96
- One vendor namespace, reverse-domain, on the **base file's root group only** (the dark file carries no
97
- payload; the resolver has no `$extensions`). It holds everything the look needs that is not a design
98
- token — twelve keys in v2, plus the optional `look` record:
99
-
100
- | Key | Type | Legal values / shape |
101
- | --- | --- | --- |
102
- | `schema` | string | Literal `design-tokens/v2`. A parser refuses an unknown value. |
103
- | `dtcg` | string | Literal `2025.10` — the pinned DTCG snapshot this artifact conforms to. |
104
- | `product` | string | The product name; slugified (lowercase, non-alphanumeric runs → `-`) it becomes the `data-style` value. |
105
- | `provenance` | enum | `project` \| `extracted` \| `library` \| `default` |
106
- | `sourced` | string | ISO date the artifact was authored, extracted, or last re-sourced. |
107
- | `theme-default` | enum | `light` \| `dark` — which context the app boots in: scaffold writes it to `<html data-theme>`, and the resolver's `theme.default` mirrors it. **The brief's explicit theme direction is binding.** Absent → `light`. The base set remains the light rendering either way. |
108
- | `anchors` | string[] | 2–3 non-empty entries — the named real-product anchors from intake ("Linear", "Stripe Dashboard"), recorded so improve/judge runs critique against the same gestalt targets create aimed at. **Required on `provenance: project` artifacts**; optional on library/default/extracted. |
109
- | `look` | object | **Optional.** The full intake look block persisted by create-authored artifacts — `theme` (`light` \| `dark` \| `both`), `anchors` (2–3 named products), `delight` (`baseline` \| `expressive`), `resolution` (`project` \| `library:<slug>` \| `seed:<style>+<palette>` \| `default`), `resolution-mode` (`confirmed` \| `recorded`). A provenance record, not a projection: `theme-default` and the top-level `anchors` remain the canonical keys emission consumes. Enum-checked when present (rule 2; the enums mirror the intake gate's `validateLookBlock`). Conforming tools preserve unknown payload keys — this one included. |
110
- | `verbosity` | enum | `full` \| `default` \| `compact` \| `expert` — emits `data-verbosity` on `<html>`. |
111
- | `feedback` | enum | `subtle` \| `minimal` — emits `data-feedback`. |
112
- | `density-tier` | enum | `spacious` \| `standard` \| `dense` — emits `data-density`; drives the density base multipliers. |
113
- | `product-traits` | array | Non-empty list of product-type trait slugs the front gate reads — e.g. `["review-queue", "case-detail", "fintech"]`. Never emitted to CSS. |
114
- | `lever-manifest` | object | The drift-check allowlist (below). |
115
-
116
- Payload fields are always concrete — the hint mechanism (below) exists only on tokens.
117
-
118
- ### The lever manifest
119
-
120
- The machine-readable allowlist the drift check reads: the check engine flags any emitted value outside
121
- this vocabulary — a radius not on `radius-scale`, a spacing off `spacing-scale`, a motion duration off
122
- `motion.durations`.
123
-
124
- | Key | Shape | Rule |
125
- | --- | --- | --- |
126
- | `spacing-scale` | number[] (px) | Non-empty, ascending — on-scale values only. |
127
- | `radius-scale` | number[] (px) | Non-empty, ascending. |
128
- | `shadow-levels` | string[] | Non-empty; names drawn from `none` `2xs` `xs` `sm` `md` `lg` `xl` `2xl` `overlay`, ordered by strictly increasing intensity. The Nurix default's vocabulary is `["none", "sm", "md", "lg", "overlay"]`. |
129
- | `motion` | `{ "durations": number[], "easings": string[] }` | Durations in ms, non-empty, ascending; easings non-empty CSS easing strings. |
130
- | `icons` | `{ "family": string }` | The icon family, e.g. `lucide`. |
131
- | `accent-count` | number | ≥ 1. |
132
-
133
- The manifest carries only vocabulary that is not already a token — **it never restates a token
134
- value**. The allowlists that are tokens are read from the tokens: the 36 color values from the
135
- `color` group, the font stacks from `primitive.font-sans` / `primitive.font-mono`, the icon stroke
136
- from `primitive.icon-stroke`, and the elevation/wash color literals from those groups' preserved
137
- byte forms.
138
-
139
- ---
140
-
141
- ## `primitive.*` — the 27 visual primitives
142
-
143
- One group, `primitive`, holding all 27 (leaf names are law — they map 1:1 to the emitted CSS
144
- variables, without the leading `--`). Every token is either concrete or hinted.
145
-
146
- | Family | Token (`primitive.…`) | `$type` | Notes | Example (source form) |
147
- | --- | --- | --- | --- | --- |
148
- | geometric | `radius` | `dimension` | | `6px` |
149
- | | `shadow-intensity` | `number` | 0–1 master multiplier on every emitted `--shadow-*` alpha; 0 legally flattens everything (flat looks stay expressible). New looks default 1.0 — the elevation composites carry designed alphas. | `0.4` |
150
- | | `border-weight` | `dimension` | | `1px` |
151
- | | `density-gap` | `number` | multiplier on the `0.25rem` spacing base | `1` |
152
- | | `density-inset` | `number` | multiplier on component insets | `1` |
153
- | typographic | `font-sans` | `fontFamily` | carries `.css` | `Inter, system-ui, sans-serif` |
154
- | | `font-mono` | `fontFamily` | carries `.css` | `Geist Mono, ui-monospace, SFMono-Regular, monospace` |
155
- | | `font-weight-normal` | `fontWeight` | | `400` |
156
- | | `font-weight-strong` | `fontWeight` | | `600` |
157
- | | `heading-tracking` | `number` | em multiplier; carries `.css` | `-0.01em` |
158
- | temporal | `duration-unit` | `duration` | the tempo base | `50ms` |
159
- | | `duration-fast` | `duration` | | `100ms` |
160
- | | `duration-normal` | `duration` | | `150ms` |
161
- | | `duration-slow` | `duration` | | `250ms` |
162
- | | `ease-default` | `cubicBezier` | carries `.css` | `cubic-bezier(0.4,0,0.2,1)` |
163
- | | `stagger-unit` | `duration` | motion-moment base, authored per look; legal 0–60ms, default 30 (reads polished; 0 reads utilitarian) | `30ms` |
164
- | surface | `contrast-boost` | `number` | multiplier, 1 = default | `1` |
165
- | iconography | `icon-stroke` | `number` | px stroke-width | `1.75` |
166
- | | `icon-size-base` | `dimension` | | `16px` |
167
- | layout | `sidebar-width-expanded` | `dimension` | | `248px` |
168
- | | `sidebar-width-collapsed` | `dimension` | | `56px` |
169
- | | `topbar-height` | `dimension` | | `52px` |
170
- | | `side-panel-width` | `dimension` | | `420px` |
171
- | | `side-panel-width-rich` | `dimension` | | `640px` |
172
- | | `modal-width-max` | `dimension` | | `560px` |
173
- | | `form-max-width` | `dimension` | | `640px` |
174
- | | `table-row-height` | `dimension` | | `40px` |
175
-
176
- **Derived, never stored.** Emission computes `--ease-enter` and `--ease-exit` from `ease-default`,
177
- and `--stagger-delay` from `stagger-unit` (`--stagger-delay: var(--stagger-unit)` — the
178
- `.motion-stagger` cascade base). They are not tokens, not authored, and not part of the coverage
179
- gate. Do not add them.
180
-
181
- ---
182
-
183
- ## `color.*` — the 36 color roles
184
-
185
- One flat group, `color`, holding all 36 (leaf names map 1:1 to the emitted `--<name>` variables).
186
- Every token is `$type: "color"` with a typed `$value` **and** mandatory preserved `.css` (an aliased
187
- role takes both from its target).
188
-
189
- - **Semantic (19):** `background` · `foreground` · `card` · `card-foreground` · `muted` ·
190
- `muted-foreground` · `border` · `input` · `ring` · `primary` · `primary-foreground` · `accent` ·
191
- `accent-foreground` · `destructive` · `destructive-foreground` · `success` · `warning` ·
192
- `surface-raised` · `surface-overlay`.
193
- - **Substrate (17):** `popover` · `popover-foreground` · `secondary` · `secondary-foreground` ·
194
- `chart-1` · `chart-2` · `chart-3` · `chart-4` · `chart-5` · `sidebar` · `sidebar-foreground` ·
195
- `sidebar-primary` · `sidebar-primary-foreground` · `sidebar-accent` · `sidebar-accent-foreground` ·
196
- `sidebar-border` · `sidebar-ring`.
197
-
198
- **`surface-raised` / `surface-overlay` — the dark ladder.** In light looks the two roles may alias
199
- `{color.card}` / `{color.popover}` — zero visual change. In dark looks they carry the
200
- **surface-lightness elevation ladder** (raised surfaces get *lighter*, ~+4–6 L points per step, hue
201
- held — the physics dark cannot fake with shadows). Components express elevation as
202
- `bg-surface-raised` / `bg-surface-overlay` instead of shadow-only. Both appear in the dark set (dark
203
- completeness counts 36).
204
-
205
- No consumed token falls back to a shadcn-gray default: emission sets all 36. A color token may alias
206
- another (`"$value": "{color.primary}"`), in which case it takes the target's `.css`; mechanical
207
- conversion writes literals, aliases are for authored files and the two ladder roles.
208
-
209
- ---
210
-
211
- ## `typography.*` — families and the ramp
212
-
213
- The first-class machine form of the type scale, in two subgroups. It reaches CSS variables only
214
- through the primitives it aliases; emitters read the ramp as data and materialize it as the seven
215
- `text-*` utilities (the type-scale rule's fixed scale *is* the ramp — typ-09).
216
-
217
- **`typography.family.*`** — the heading/body pairing plus mono, plus an optional display slot, all
218
- `$type: "fontFamily"`. The three-*job* rhythm is display / body / numeric-mono (typ-06: ≤ 3 families,
219
- each with a distinct job); `heading` stays for compat and typically aliases `display` or `body`:
220
-
221
- | Token | Value |
222
- | --- | --- |
223
- | `typography.family.heading` | `"{primitive.font-sans}"` — or its own stack when the look pairs a distinct heading family. |
224
- | `typography.family.body` | `"{primitive.font-sans}"` |
225
- | `typography.family.mono` | `"{primitive.font-mono}"` |
226
- | `typography.family.display` | **optional** third-slot member; may alias `heading`. |
227
-
228
- **`typography.ramp.*`** — seven fixed step names, each `$type: "typography"` carrying all five
229
- sub-values:
230
-
231
- | Step | Role |
232
- | --- | --- |
233
- | `h1` | page title |
234
- | `h2` | section head |
235
- | `h3` | card / group head |
236
- | `body` | UI + prose |
237
- | `small` | labels, meta, dense table |
238
- | `caption` | uppercase eyebrow (text case is a usage rule; the composite carries no case slot) |
239
- | `display` | the scale-drama step: KPI numerals, the one focal metric, a brand-forward page title. `fontSize` guidance 32–48px; `fontFamily` may alias `typography.family.display`. Usage is rule-gated, not schema-gated: display-step elements only on `brand-forward` surfaces, ≤ 1 per surface (typ-20). Baseline surfaces keep the 24px-h1 world. |
240
-
241
- | Sub-value | Shape |
242
- | --- | --- |
243
- | `fontFamily` | alias to a `typography.family.*` token |
244
- | `fontSize` | `dimension` (px) |
245
- | `lineHeight` | number (unitless multiplier) |
246
- | `fontWeight` | alias to `primitive.font-weight-strong` / `primitive.font-weight-normal`, or a number |
247
- | `letterSpacing` | number (em multiplier) or alias to `primitive.heading-tracking` — the documented deviation |
248
-
249
- ---
250
-
251
- ## `elevation.*` — depth as a designed system
252
-
253
- Four tokens, each `$type: "shadow"`, `$value` an **array of layers** (`{ color, offsetX, offsetY,
254
- blur, spread }` per layer — the DTCG shadow shape; color sub-values follow the color rules incl.
255
- `alpha`). Leaf names are law → emitted as `--shadow-sm`, `--shadow-md`, `--shadow-lg`,
256
- `--shadow-overlay`, plus the matching `@theme` shadow utilities.
257
-
258
- | Token | Role | Authoring guidance (seeds carry real values) |
259
- | --- | --- | --- |
260
- | `elevation.sm` | hairline lift — hover on rows/cards | 1–2 layers, y ≤ 2px, blur ≤ 4px |
261
- | `elevation.md` | raised panel, dropdown | 2 layers (ambient + key) |
262
- | `elevation.lg` | brand-forward feature panel | 2–3 layers, tinted |
263
- | `elevation.overlay` | side panel / dialog scrim companion | widest blur; the only level a modal may use |
264
-
265
- Rules:
266
-
267
- - Shadow color is **brand-tintable** — a low-alpha tint toward the brand hue (e.g.
268
- `rgba(0,55,112,0.08)`), never pure black at alpha ≥ 0.15.
269
- - `primitive.shadow-intensity` stays the master multiplier: emission wraps every layer alpha as
270
- `calc(<alpha> * var(--shadow-intensity))`, so `prefers-contrast: more` (which zeroes the
271
- multiplier) and flat looks keep working.
272
- - The **token-level `.css`** is the full serialized shadow list — the preserved byte form, carrying
273
- every layer color's byte form inside it (composite sub-values have no `$extensions` slot of their
274
- own). Zero lengths serialize bare `0`; the alpha may ride the `calc(… * var(--shadow-intensity))`
275
- wrapper in the byte form — parse-back strips it to the layer alpha.
276
- - The lever manifest's `shadow-levels` key is unchanged in shape; `overlay` joins its legal name
277
- vocabulary.
278
-
279
- ---
280
-
281
- ## `wash.*` — the tasteful-gradient path (optional group)
282
-
283
- At most two tokens, `$type: "gradient"` (the DTCG stops array; each stop's color follows the color
284
- rules, `position` in 0–1). Emitted as `--wash-surface` / `--wash-emphasis`. **Optional presence**: a
285
- look that declares no washes omits the group entirely — the coverage gate validates shape when
286
- present, never requires it. The token-level `.css` carries the authored gradient (the stop list holds
287
- no geometry — angle and shape live in the byte form). Consumption is budget-gated (only
288
- `brand-forward` surfaces), and the anti-slop gradient ban (col-12 — neon purple/blue glows,
289
- purple-on-white) applies to wash values: a wash is a low-chroma tint ramp, not a hero gradient.
290
-
291
- ---
292
-
293
- ## The preserved-css pattern
294
-
295
- Every formatting-sensitive value carries **two forms that must agree**: the typed `$value` (the
296
- queryable semantic) and `$extensions["com.nurix.design"].css` — the exact source CSS string.
297
- Emitters prefer the preserved string, so output is byte-stable across convert/emit round trips.
298
-
299
- - **Mandatory `.css`:** every `color` token; `heading-tracking` (sources vary — `0`, `0em`,
300
- `-0.015em`); `ease-default`; any `fontFamily` token carrying its own stack; every `elevation.*`
301
- token (the serialized shadow list); every `wash.*` token (the authored gradient).
302
- - **Omitted where serialization is deterministic:** `dimension` and `duration` serialize as
303
- `<value><unit>`; `number` and `fontWeight` as the plain number; `cubicBezier` (absent `.css`) as
304
- `cubic-bezier(x1, y1, x2, y2)`; `fontFamily` (absent `.css`) as the families joined with `", "`,
305
- multi-word names double-quoted.
306
- - **On a composite token**, `.css` is an object keyed by sub-value name for `typography` (present
307
- for formatting-sensitive inline sub-values, e.g. `{ "letterSpacing": "0.02em" }`; an aliased
308
- sub-value takes its `.css` from the alias target) and a single string — the full serialized value —
309
- for `shadow` and `gradient`.
310
- - **Parse-back verification is a converter requirement:** whatever writes a token must verify that
311
- parsing `.css` reproduces `$value` exactly, and that re-serializing `$value` reproduces the byte
312
- form — oklch components are the literal source numbers; srgb components round-trip through the
313
- `hex` field; a shadow's `.css` parses back to its layer array (the intensity `calc` wrapper strips
314
- to the layer alpha); a gradient's `.css` must contain each stop color's byte form. The gate
315
- re-verifies.
316
-
317
- ## Hints and the coverage tri-state
318
-
319
- DTCG has no hint concept; this is the convention. Where a value needs judgment, the token carries a
320
- **valid provisional `$value`** plus `$extensions["com.nurix.design"].hint` — the intent in plain
321
- words. Every gated token is in exactly one state:
322
-
323
- | State | Marker | `--check` | `--emit` |
324
- | --- | --- | --- | --- |
325
- | **assigned** | real value, no `hint` key | passes | emits |
326
- | **hinted** | `hint` key present | passes | **refuses**, naming every hinted path |
327
- | **missing** | token absent | fails, naming the key | — |
328
-
329
- Resolving a hint deletes the `hint` key and records the rationale in the token's `$description`, so
330
- the resolved artifact is self-explaining and re-derivable. Judgment is recorded, never silent.
331
- (`--emit --provisional` — the golden/regression flow only — emits hinted tokens at their provisional
332
- `$values` instead of refusing; it never ships output.)
333
-
334
- ```json
335
- {
336
- "$type": "number",
337
- "$value": 1,
338
- "$extensions": { "com.nurix.design": { "hint": "nudge borders up a step so the dense table grid reads as a grid" } }
339
- }
340
- ```
341
-
342
- resolves to:
343
-
344
- ```json
345
- {
346
- "$type": "number",
347
- "$value": 1.1,
348
- "$description": "derived: dense-grid brief, one step up (was hint)"
349
- }
350
- ```
351
-
352
- ## Per-value provenance — the layer vocabulary
353
-
354
- A value's provenance rationale — why it diverges from a brand default, what judgment resolved its
355
- hint — lives in the token's `$description`. Mechanical conversion moves source comments here.
356
-
357
- **The layer tags.** A `$description` that opens with a tag names the composition layer that set the
358
- value (the layer model's audit surface): **`source:`** (the resolved source), **`brief:`** (a brief
359
- binding), **`deviation:`** (a recorded deviation — the only layer that may contradict a domain owner
360
- or leave the tables entirely; every such value carries its reason). Untagged values are inherited
361
- from the resolved source or defaults. The mechanical-annotation prefixes the converters write
362
- (`derived:`, `corpus:`, `rationale:`, `note:`, `synthesized:`, `brand:`, `dark:`) remain legal; any
363
- other opening tag fails the gate. **Every off-manifest value carries `deviation:`** — an artifact
364
- base value off its own lever-manifest allowlist without one fails rule 8. The artifact root's
365
- `$description` carries the resolution record (which source won, the runner-up, the deciding
366
- evidence).
367
-
368
- ---
369
-
370
- ## The dark set — `design.tokens.dark.json`
371
-
372
- Ships **only when the look has dark values**; light is never omitted — the base set is the light
373
- rendering (even for a `theme-default: dark` look; only the boot attribute and resolver default move).
374
- When it ships:
375
-
376
- - It carries exactly the `color` group, all 36 roles, same shape rules (typed `$value` + `.css`;
377
- aliases legal — they resolve after overlay, so `"{color.card}"` in the dark file resolves to the
378
- dark card) — and nothing else: no primitives, no typography, no elevation, no payload (the base
379
- file is the payload's single carrier).
380
- - Emission targets `:root[data-theme="dark"]` (specificity 0,2,0 — the same armor as the light
381
- block; a lone attribute selector loses to the component library's later `:root` by source order),
382
- remapping all 36; when the file is absent, no dark block is emitted and the project is light-only.
383
- - The `surface-raised` / `surface-overlay` roles carry the dark surface-lightness ladder (above).
384
-
385
- ```json
386
- {
387
- "color": {
388
- "background": { "$type": "color", "$value": { "colorSpace": "oklch", "components": [0.2077, 0.0398, 265.75] }, "$extensions": { "com.nurix.design": { "css": "oklch(0.2077 0.0398 265.75)" } } },
389
- "foreground": { "$type": "color", "$value": { "colorSpace": "oklch", "components": [0.9842, 0.0034, 247.86] }, "$extensions": { "com.nurix.design": { "css": "oklch(0.9842 0.0034 247.86)" } } }
390
- }
391
- }
392
- ```
393
-
394
- (Fragment — a real dark file carries all 36.)
395
-
396
- ---
397
-
398
- ## The resolver — `design.resolver.json`
399
-
400
- The DTCG resolver document has no stable snapshot, so this shape is **ours-until-standardized** — the
401
- exact minimal shape the scripts implement, confined to this file so a future spec shift lands in one
402
- place.
403
-
404
- | Key | Shape |
405
- | --- | --- |
406
- | `schema` | Literal `design-resolver/v1`. |
407
- | `sets` | Array of `{ "name": string, "values": [file, …] }` — the base token files, in load order. |
408
- | `modifiers` | Array of `{ "name": string, "default": string, "contexts": { <context>: [file, …] } }`. Exactly one modifier today: `theme`. |
409
-
410
- **Resolution order (deterministic):** concatenate the set files in array order; select one context
411
- per modifier (the `default` when unstated); overlay the context's files in order — a later file
412
- overrides an earlier one per token path, and an overlay may only override paths that exist in the
413
- base, never introduce new ones. Aliases resolve after overlay. **The base set is always the light
414
- rendering:** the `light` context is always the empty overlay `[]`, and `theme.default` mirrors the
415
- payload's `theme-default` (`light` when absent — a dark-first look sets both to `dark`). A light-only
416
- look carries only the `light` context; a look with dark adds `"dark": ["design.tokens.dark.json"]`:
417
-
418
- ```json
419
- {
420
- "schema": "design-resolver/v1",
421
- "sets": [{ "name": "base", "values": ["design.tokens.json"] }],
422
- "modifiers": [
423
- { "name": "theme", "default": "light", "contexts": { "light": [], "dark": ["design.tokens.dark.json"] } }
424
- ]
425
- }
426
- ```
427
-
428
- ---
429
-
430
- ## Emission mapping
431
-
432
- The slug is the payload's `product`, slugified. Emission order is this document's enumeration order
433
- (mirrored by the consumer's arrays); JSON key order carries no meaning.
434
-
435
- | Source | Emitted target |
436
- | --- | --- |
437
- | `primitive.<name>` (25 static) | `[data-style="<slug>"] { --<name>: … }` — 1:1 by leaf name |
438
- | `primitive.density-gap` / `density-inset` | governed refs (`var(--density-base-gap/inset)`); the tier writes the base |
439
- | `color.<name>` (36) | `:root, :root[data-theme="light"] { --<name>: … }` |
440
- | dark set `color.<name>` | `:root[data-theme="dark"] { --<name>: … }` — only when the dark file ships |
441
- | `elevation.<level>` (4) | `--shadow-<level>` in the `[data-style]` block **and** the `@theme` shadow utilities (`shadow-sm` … `shadow-overlay`); every alpha rides `calc(… * var(--shadow-intensity))` |
442
- | `wash.<slot>` (≤ 2, optional) | `--wash-surface` / `--wash-emphasis` in the `[data-style]` block — consumed only on budget-granted surfaces |
443
- | `typography.ramp.<step>` (7) | `@theme` text utilities `text-h1` … `text-display` carrying size / line-height / weight / tracking per step — the ramp becomes *classes* (typ-09: the fixed scale IS the ramp) |
444
- | `primitive.stagger-unit` | `--stagger-delay: var(--stagger-unit)` (derived) + the named motion classes `.motion-lift` (hover −1px translateY + `elevation.sm` at `duration-fast`/`ease-default`) and `.motion-stagger` (children arrival cascade at `--stagger-delay`, capped at 8 children — mot-08), both inert under `prefers-reduced-motion` (mot-03) |
445
- | `verbosity` / `feedback` / `density-tier` | `<html data-verbosity / data-feedback / data-density>` |
446
- | `theme-default` | `<html data-theme>` (the boot theme; the toggle round-trips the same attribute) |
447
- | `product` | `<html data-style="<slug>">` |
448
- | `product-traits` / `anchors` | read by the front gate and improve/judge runs; never emitted |
449
- | `typography.family.*` | data for emitters and exemplars; reaches CSS only through the primitives it aliases |
450
- | — (derived at emit) | `--ease-enter`, `--ease-exit` from `ease-default`; `--stagger-delay` from `stagger-unit` |
451
-
452
- ---
453
-
454
- ## Validation — what `--check` enforces
455
-
456
- The coverage gate. It exits non-zero and **names every offending path** so the fix is mechanical; an
457
- artifact that passes is guaranteed derivable. Rules 1–12 keep their v1 numbering (amended where the
458
- surface grew); rules 13–15 are the v2 additions.
459
-
460
- 1. **Files** — `design.tokens.json` and `design.resolver.json` present and parse as JSON; every file
461
- the resolver references exists beside it; `design.tokens.dark.json` exists exactly when the
462
- resolver's `dark` context names it.
463
- 2. **Payload** — the base file's root `$extensions["com.nurix.design"]` present with: `schema` literal
464
- `design-tokens/v2`; `dtcg` literal `2025.10`; `product` non-empty; `provenance` legal; `sourced` an
465
- ISO date; `verbosity` / `feedback` / `density-tier` legal enum values (never hinted);
466
- `product-traits` a non-empty array; `lever-manifest` carrying all six keys; `theme-default` legal
467
- when present and mirrored by the resolver's theme default; `anchors` an array of 2–3 non-empty
468
- strings when present — **required for `provenance: project`** artifacts; the optional `look`
469
- block enum-checked when present (theme / delight / resolution-mode enums, 2–3 named anchors,
470
- the resolution shape).
471
- 3. **Primitive coverage** — all 27 `primitive.*` tokens present with the exact `$type` this schema
472
- assigns, each assigned or hinted; `stagger-unit` within 0–60ms; fails naming every absent, empty,
473
- or mistyped key.
474
- 4. **Color coverage** — all 36 `color.*` tokens present, `$type: "color"`, `colorSpace` one of
475
- `oklch` | `srgb`, `.css` present (via the target when aliased), each assigned or hinted; fails
476
- naming every missing token.
477
- 5. **Typography coverage** — `typography.family.heading|body|mono` present (`fontFamily`;
478
- `family.display` optional but shape-checked when present);
479
- `typography.ramp.h1|h2|h3|body|small|caption|display` present (`typography`), each composite
480
- carrying all five sub-values.
481
- 6. **Alias integrity** — every `{path}` reference resolves within the artifact to a token of the
482
- required type; no cycles.
483
- 7. **Manifest scales** — `spacing-scale`, `radius-scale`, `motion.durations` non-empty and ascending;
484
- `motion.easings` non-empty; `shadow-levels` non-empty, drawn from the legal vocabulary (`overlay`
485
- included), strictly increasing in intensity; `icons.family` non-empty; `accent-count` ≥ 1.
486
- 8. **Manifest consistency** — the look's own base values sit on its own allowlist: `radius` ∈
487
- `radius-scale`; `duration-fast` / `duration-normal` / `duration-slow` ∈ `motion.durations`;
488
- `ease-default`'s serialization ∈ `motion.easings`. An off-manifest value is legal **only** with a
489
- `deviation:` `$description` (the recorded-deviation rule).
490
- 9. **Parse-back** — for every token carrying `.css`, parsing the string reproduces `$value` and
491
- re-serializing `$value` reproduces the byte form; a shadow `.css` parses back to its layer array
492
- (the intensity `calc` wrapper strips to the layer alpha); a gradient `.css` contains each stop
493
- color's byte form.
494
- 10. **Dark completeness** — the dark file, when present, carries exactly the `color` group with all
495
- 36 roles under the same shape rules (aliases legal), and nothing else.
496
- 11. **Spec conformance** — only the ten `$type` values this schema uses appear; no invented
497
- `$type`; unknown `$extensions` namespaces are preserved, never authored.
498
- 12. **Emission precondition** — `--emit` runs only over a passing artifact and refuses while any
499
- token carries a `hint`, naming every hinted path (`--provisional` — golden/regression flows
500
- only — emits provisional values instead).
501
- 13. **Elevation coverage** — all four `elevation.*` present, `$type: "shadow"`, ≥ 1 layer each,
502
- every layer color rule-conformant (typed oklch|srgb; never pure black at alpha ≥ 0.15), lengths
503
- dimension-shaped, the token-level `.css` present; each assigned or hinted; no level outside
504
- `sm|md|lg|overlay`.
505
- 14. **Wash shape** — when the `wash` group exists: ≤ 2 tokens, slots ⊆ `surface|emphasis`,
506
- `$type: "gradient"`, ≥ 2 stops each with a rule-conformant color and a position in 0–1, `.css`
507
- present. Presence is never required.
508
- 15. **Provenance vocabulary** — a per-value `$description` opening with a tag uses a legal one
509
- (`source:` / `brief:` / `deviation:` layer tags, or a mechanical-annotation prefix; untagged =
510
- inherited); rule 8 enforces the off-manifest `deviation:` requirement.
511
-
512
- Font binding and emitter completeness run at `--emit`, not `--check` — they compare the artifact
513
- against emitted output and project dependencies (the emission contracts, not this file's gate).
514
-
515
- ---
516
-
517
- ## Migration — v1 artifacts to v2
518
-
519
- `convert-design-md.mjs --upgrade-v2` is the mechanical, **idempotent** v1→v2 upgrade (it runs over
520
- `data/design-tokens/*/`; the converter also applies the same transform to every fresh conversion):
521
-
522
- 1. `schema` literal → `design-tokens/v2`.
523
- 2. `elevation.*` derived from the v1 hardcoded slate recipes × the twin's `shadow-intensity` —
524
- value-preserving (the emitted `--shadow-sm/md/lg` for an untouched twin are byte-identical before
525
- and after migration, because the composites carry the recipe alphas and the intensity stays the
526
- runtime `calc` multiplier), tagged `$description: "derived: v1 shadow-intensity migration"`.
527
- Library entries whose design.md names real shadow values get **hinted** elevation instead,
528
- resolved from the design.md prose at the data build.
529
- 3. `color.surface-raised` / `surface-overlay` → aliases to `{color.card}` / `{color.popover}` (in
530
- the dark file too, where they resolve to the dark card/popover; the +4–6 L ladder is owed at
531
- budget-time).
532
- 4. `typography.ramp.display` → **hinted** (provisional: h1 scaled ×1.75, weight from
533
- `font-weight-strong`), hint text "display step unset — resolve from the product's design.md or
534
- leave for budget-time". The Nurix default adopts the provisional derivation as its own look,
535
- assigned.
536
- 5. `primitive.stagger-unit` → 30ms default (the prior derived clamp's value).
537
- 6. `theme-default` → `light` everywhere except twins whose design.md declares dark-first (only
538
- twins carrying dark sets qualify; their design.md decides); the resolver's theme default mirrors
539
- it.
540
- 7. Re-run parse-back verification + the v2 gate over every migrated twin.
541
-
542
- Because migration is deterministic + hint-carrying, no hand-rewrite of the library is needed; hints
543
- surface exactly where judgment is owed.
544
-
545
- ---
546
-
547
- ## Worked example — the Nurix default (abbreviated)
548
-
549
- `data/design-tokens/nurix/design.tokens.json`, abbreviated to a representative subset of each token
550
- family — the real file carries all 27 primitives, all 36 color roles, the full seven-step ramp, and
551
- the four elevation composites. Nurix ships no dark set, so `design.tokens.dark.json` is absent and
552
- the resolver carries only the `light` context.
553
-
554
- ```json
555
- {
556
- "$description": "Nurix default — the look a zero-input project wears. Abbreviated here; the shipped file is complete.",
557
- "$extensions": {
558
- "com.nurix.design": {
559
- "schema": "design-tokens/v2",
560
- "dtcg": "2025.10",
561
- "product": "Nurix",
562
- "provenance": "default",
563
- "sourced": "2026-07-04",
564
- "theme-default": "light",
565
- "product-traits": ["operator-console", "crm", "queue", "dashboard", "admin"],
566
- "verbosity": "default",
567
- "feedback": "subtle",
568
- "density-tier": "standard",
569
- "lever-manifest": {
570
- "spacing-scale": [2, 4, 8, 12, 16, 24, 32, 48, 64],
571
- "radius-scale": [0, 4, 6, 12, 9999],
572
- "shadow-levels": ["none", "sm", "md", "lg", "overlay"],
573
- "motion": { "durations": [100, 150, 250], "easings": ["cubic-bezier(0.4,0,0.2,1)"] },
574
- "icons": { "family": "lucide" },
575
- "accent-count": 1
576
- }
577
- }
578
- },
579
- "primitive": {
580
- "radius": {
581
- "$type": "dimension",
582
- "$value": { "value": 6, "unit": "px" },
583
- "$description": "brand default 12px is marketing-surface soft; operator default tightens for a denser, engineered read"
584
- },
585
- "shadow-intensity": {
586
- "$type": "number",
587
- "$value": 0.4,
588
- "$description": "brand is predominantly flat; shadow only lifts true overlays"
589
- },
590
- "font-sans": {
591
- "$type": "fontFamily",
592
- "$value": ["Inter", "system-ui", "sans-serif"],
593
- "$description": "brand's body font; the single sans slot serves dense body/table chrome",
594
- "$extensions": { "com.nurix.design": { "css": "Inter, system-ui, sans-serif" } }
595
- },
596
- "heading-tracking": {
597
- "$type": "number",
598
- "$value": -0.01,
599
- "$description": "em multiplier; brand display tracks 0 — at operator heading sizes Inter reads tighter",
600
- "$extensions": { "com.nurix.design": { "css": "-0.01em" } }
601
- },
602
- "ease-default": {
603
- "$type": "cubicBezier",
604
- "$value": [0.4, 0, 0.2, 1],
605
- "$extensions": { "com.nurix.design": { "css": "cubic-bezier(0.4,0,0.2,1)" } }
606
- },
607
- "stagger-unit": {
608
- "$type": "duration",
609
- "$value": { "value": 30, "unit": "ms" },
610
- "$description": "derived: v1→v2 migration — the 30ms default stagger base (0–60ms legal)"
611
- },
612
- "table-row-height": {
613
- "$type": "dimension",
614
- "$value": { "value": 40, "unit": "px" },
615
- "$description": "comfortable at standard density; dense archetypes step down via the surface catalog"
616
- }
617
- },
618
- "color": {
619
- "background": {
620
- "$type": "color",
621
- "$value": { "colorSpace": "oklch", "components": [1, 0, 0] },
622
- "$extensions": { "com.nurix.design": { "css": "oklch(1 0 0)" } }
623
- },
624
- "primary": {
625
- "$type": "color",
626
- "$value": { "colorSpace": "oklch", "components": [0.5211, 0.2145, 263.89] },
627
- "$description": "brand #245AE2 — the one accent",
628
- "$extensions": { "com.nurix.design": { "css": "oklch(0.5211 0.2145 263.89)" } }
629
- },
630
- "surface-raised": {
631
- "$type": "color",
632
- "$value": "{color.card}",
633
- "$description": "derived: v1→v2 migration — light aliases card; dark looks carry the surface-lightness ladder"
634
- },
635
- "surface-overlay": {
636
- "$type": "color",
637
- "$value": "{color.popover}",
638
- "$description": "derived: v1→v2 migration — light aliases popover; dark looks carry the surface-lightness ladder"
639
- }
640
- },
641
- "typography": {
642
- "family": {
643
- "heading": { "$type": "fontFamily", "$value": "{primitive.font-sans}" },
644
- "body": { "$type": "fontFamily", "$value": "{primitive.font-sans}" },
645
- "mono": { "$type": "fontFamily", "$value": "{primitive.font-mono}" }
646
- },
647
- "ramp": {
648
- "h1": {
649
- "$type": "typography",
650
- "$value": {
651
- "fontFamily": "{typography.family.heading}",
652
- "fontSize": { "value": 24, "unit": "px" },
653
- "lineHeight": 1.25,
654
- "fontWeight": "{primitive.font-weight-strong}",
655
- "letterSpacing": "{primitive.heading-tracking}"
656
- }
657
- },
658
- "display": {
659
- "$type": "typography",
660
- "$value": {
661
- "fontFamily": "{typography.family.heading}",
662
- "fontSize": { "value": 42, "unit": "px" },
663
- "lineHeight": 1.25,
664
- "fontWeight": "{primitive.font-weight-strong}",
665
- "letterSpacing": "{primitive.heading-tracking}"
666
- },
667
- "$description": "derived: v2 display step — the provisional h1 × 1.75 derivation adopted as the default's own look (KPI numerals, the one focal metric)"
668
- }
669
- }
670
- },
671
- "elevation": {
672
- "sm": {
673
- "$type": "shadow",
674
- "$value": [
675
- { "color": { "colorSpace": "srgb", "components": [0.05882, 0.0902, 0.16471], "alpha": 0.1, "hex": "#0f172a" }, "offsetX": { "value": 0, "unit": "px" }, "offsetY": { "value": 1, "unit": "px" }, "blur": { "value": 3, "unit": "px" }, "spread": { "value": 0, "unit": "px" } },
676
- { "color": { "colorSpace": "srgb", "components": [0.05882, 0.0902, 0.16471], "alpha": 0.1, "hex": "#0f172a" }, "offsetX": { "value": 0, "unit": "px" }, "offsetY": { "value": 1, "unit": "px" }, "blur": { "value": 2, "unit": "px" }, "spread": { "value": -1, "unit": "px" } }
677
- ],
678
- "$description": "derived: v1 shadow-intensity migration",
679
- "$extensions": { "com.nurix.design": { "css": "0 1px 3px 0 rgb(15 23 42 / calc(0.10 * var(--shadow-intensity))), 0 1px 2px -1px rgb(15 23 42 / calc(0.10 * var(--shadow-intensity)))" } }
680
- }
681
- }
682
- }
683
- ```
684
-
685
- `data/design-tokens/nurix/design.resolver.json`:
686
-
687
- ```json
688
- {
689
- "schema": "design-resolver/v1",
690
- "sets": [{ "name": "base", "values": ["design.tokens.json"] }],
691
- "modifiers": [
692
- { "name": "theme", "default": "light", "contexts": { "light": [] } }
693
- ]
694
- }
695
- ```