@nurix/etna 0.19.11 → 0.19.12
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.
- package/data/harness-index.json +1 -1
- package/data/harnesses/code/harness.json +1 -1
- package/data/harnesses/code/rules/frontend.md +5 -5
- package/data/harnesses/code/skills/design/SKILL.md +70 -50
- package/data/harnesses/code/skills/design/components/charts.md +76 -0
- package/data/harnesses/code/skills/design/components/collections.md +132 -0
- package/data/harnesses/code/skills/design/components/feedback.md +47 -0
- package/data/harnesses/code/skills/design/components/hooks.md +35 -0
- package/data/harnesses/code/skills/design/components/index.md +143 -0
- package/data/harnesses/code/skills/design/components/inputs.md +327 -0
- package/data/harnesses/code/skills/design/components/layout.md +52 -0
- package/data/harnesses/code/skills/design/components/media.md +66 -0
- package/data/harnesses/code/skills/design/components/motion.md +82 -0
- package/data/harnesses/code/skills/design/components/navigation.md +29 -0
- package/data/harnesses/code/skills/design/components/overlays.md +72 -0
- package/data/harnesses/code/skills/design/components/setup.md +40 -0
- package/data/harnesses/code/skills/design/components/typography.md +46 -0
- package/data/harnesses/code/skills/design/components/utils.md +37 -0
- package/data/harnesses/code/skills/design/data/blueprints/browse.md +38 -0
- package/data/harnesses/code/skills/design/data/blueprints/creation-flow.md +38 -0
- package/data/harnesses/code/skills/design/data/blueprints/dashboard.md +38 -0
- package/data/harnesses/code/skills/design/data/blueprints/grid.md +38 -0
- package/data/harnesses/code/skills/design/data/blueprints/queue.md +38 -0
- package/data/harnesses/code/skills/design/data/blueprints/record-detail.md +38 -0
- package/data/harnesses/code/skills/design/data/blueprints/settings.md +38 -0
- package/data/harnesses/code/skills/design/data/chart-styling/Readme.md +33 -0
- package/data/harnesses/code/skills/design/data/chart-styling/carbon-accessible-alert-semantic.md +19 -0
- package/data/harnesses/code/skills/design/data/chart-styling/carbon-monochrome-sequential-trend.md +19 -0
- package/data/harnesses/code/skills/design/data/chart-styling/datadog-classic-six-aligned.md +19 -0
- package/data/harnesses/code/skills/design/data/chart-styling/datawrapper-tiered-gray-hierarchy.md +19 -0
- package/data/harnesses/code/skills/design/data/chart-styling/econ-red-rule-horizontal.md +19 -0
- package/data/harnesses/code/skills/design/data/chart-styling/financial-diverging-threshold-overlay.md +19 -0
- package/data/harnesses/code/skills/design/data/chart-styling/ft-vocabulary-ranked-muted.md +19 -0
- package/data/harnesses/code/skills/design/data/chart-styling/grafana-dark-threshold-bands.md +19 -0
- package/data/harnesses/code/skills/design/data/chart-styling/material-rounded-explicit-label.md +19 -0
- package/data/harnesses/code/skills/design/data/chart-styling/nyt-ghost-grid-direct-label.md +19 -0
- package/data/harnesses/code/skills/design/data/chart-styling/plot-currentcolor-inherit.md +19 -0
- package/data/harnesses/code/skills/design/data/chart-styling/saas-gradient-glow-area.md +19 -0
- package/data/harnesses/code/skills/design/data/chart-styling/shadcn-composable-css-vars.md +19 -0
- package/data/harnesses/code/skills/design/data/charts/census.csv +58 -0
- package/data/harnesses/code/skills/design/data/checklists/browse.md +21 -0
- package/data/harnesses/code/skills/design/data/checklists/creation-flow.md +20 -0
- package/data/harnesses/code/skills/design/data/checklists/dashboard.md +21 -0
- package/data/harnesses/code/skills/design/data/checklists/grid.md +21 -0
- package/data/harnesses/code/skills/design/data/checklists/queue.md +21 -0
- package/data/harnesses/code/skills/design/data/checklists/record-detail.md +21 -0
- package/data/harnesses/code/skills/design/data/checklists/settings.md +21 -0
- package/data/harnesses/code/skills/design/data/chrome/board-column.md +68 -0
- package/data/harnesses/code/skills/design/data/chrome/data-table.md +63 -0
- package/data/harnesses/code/skills/design/data/chrome/side-panel.md +60 -0
- package/data/harnesses/code/skills/design/data/chrome/sidebar.md +78 -0
- package/data/harnesses/code/skills/design/data/chrome/stat-cards.md +62 -0
- package/data/harnesses/code/skills/design/data/chrome/topbar.md +65 -0
- package/data/harnesses/code/skills/design/data/color/accent-presets.md +90 -0
- package/data/harnesses/code/skills/design/data/color/aesop-earth-mute.md +91 -0
- package/data/harnesses/code/skills/design/data/color/arc-peach-play.md +90 -0
- package/data/harnesses/code/skills/design/data/color/attio-hunter-teal.md +90 -0
- package/data/harnesses/code/skills/design/data/color/carbon-cyan-signal.md +90 -0
- package/data/harnesses/code/skills/design/data/color/clay-parchment.md +90 -0
- package/data/harnesses/code/skills/design/data/color/duolingo-feather.md +90 -0
- package/data/harnesses/code/skills/design/data/color/geist-mono-signal.md +90 -0
- package/data/harnesses/code/skills/design/data/color/linear-graphite-violet.md +90 -0
- package/data/harnesses/code/skills/design/data/color/mercury-onyx-cobalt.md +90 -0
- package/data/harnesses/code/skills/design/data/color/notion-paper-ink.md +90 -0
- package/data/harnesses/code/skills/design/data/color/radix-slate-iris.md +90 -0
- package/data/harnesses/code/skills/design/data/color/raycast-void-spectrum.md +90 -0
- package/data/harnesses/code/skills/design/data/color/spectrum-celery-fuchsia.md +90 -0
- package/data/harnesses/code/skills/design/data/color/stripe-blurple-ruby.md +90 -0
- package/data/harnesses/code/skills/design/data/color/superhuman-cod-picton.md +89 -0
- package/data/harnesses/code/skills/design/data/corpora/operations-review/companies.csv +15 -0
- package/data/harnesses/code/skills/design/data/corpora/operations-review/corpus.md +87 -0
- package/data/harnesses/code/skills/design/data/corpora/operations-review/people.csv +25 -0
- package/data/harnesses/code/skills/design/data/corpora/procurement-approvals/companies.csv +15 -0
- package/data/harnesses/code/skills/design/data/corpora/procurement-approvals/corpus.md +83 -0
- package/data/harnesses/code/skills/design/data/corpora/procurement-approvals/people.csv +25 -0
- package/data/harnesses/code/skills/design/data/corpora/revenue-analytics/companies.csv +15 -0
- package/data/harnesses/code/skills/design/data/corpora/revenue-analytics/corpus.md +89 -0
- package/data/harnesses/code/skills/design/data/corpora/revenue-analytics/people.csv +25 -0
- package/data/harnesses/code/skills/design/data/elevation/ant-design-directional-shadow.md +19 -0
- package/data/harnesses/code/skills/design/data/elevation/apple-liquid-glass-material.md +18 -0
- package/data/harnesses/code/skills/design/data/elevation/atlassian-surface-shadow-pairing.md +20 -0
- package/data/harnesses/code/skills/design/data/elevation/fluent-2-key-ambient-ramp.md +20 -0
- package/data/harnesses/code/skills/design/data/elevation/github-primer-sparing-shadow.md +19 -0
- package/data/harnesses/code/skills/design/data/elevation/ibm-carbon-layer-and-border.md +19 -0
- package/data/harnesses/code/skills/design/data/elevation/linear-dark-surface-ladder.md +17 -0
- package/data/harnesses/code/skills/design/data/elevation/material-2-key-ambient-dp-ramp.md +19 -0
- package/data/harnesses/code/skills/design/data/elevation/material-3-tonal-elevation.md +21 -0
- package/data/harnesses/code/skills/design/data/elevation/neobrutalist-hard-offset.md +19 -0
- package/data/harnesses/code/skills/design/data/elevation/neumorphic-soft-dual-shadow.md +18 -0
- package/data/harnesses/code/skills/design/data/elevation/notion-warm-minimal-hairline.md +17 -0
- package/data/harnesses/code/skills/design/data/elevation/polaris-elevation-inset-bevel.md +21 -0
- package/data/harnesses/code/skills/design/data/elevation/radix-themes-alpha-ring-scale.md +19 -0
- package/data/harnesses/code/skills/design/data/elevation/shadcn-neutral-derived-radius.md +19 -0
- package/data/harnesses/code/skills/design/data/elevation/stripe-brand-tinted-dual-shadow.md +18 -0
- package/data/harnesses/code/skills/design/data/elevation/tailwind-default-utility-scale.md +19 -0
- package/data/harnesses/code/skills/design/data/elevation/vercel-geist-shadow-as-border.md +20 -0
- package/data/harnesses/code/skills/design/data/gradients/amber-attention-fill.md +16 -0
- package/data/harnesses/code/skills/design/data/gradients/cloud-shadow-wash.md +16 -0
- package/data/harnesses/code/skills/design/data/gradients/confident-lavender-wash.md +16 -0
- package/data/harnesses/code/skills/design/data/gradients/ember-ship-flare.md +18 -0
- package/data/harnesses/code/skills/design/data/gradients/full-metal-wash.md +16 -0
- package/data/harnesses/code/skills/design/data/gradients/indigo-ruby-cta-band.md +18 -0
- package/data/harnesses/code/skills/design/data/gradients/linear-graphite-wash.md +18 -0
- package/data/harnesses/code/skills/design/data/gradients/marble-quartz-wash.md +16 -0
- package/data/harnesses/code/skills/design/data/gradients/midnight-aurora-panel.md +16 -0
- package/data/harnesses/code/skills/design/data/gradients/neutral-volume-fill.md +16 -0
- package/data/harnesses/code/skills/design/data/gradients/revenue-uptrend-fill.md +16 -0
- package/data/harnesses/code/skills/design/data/gradients/risk-decline-fill.md +16 -0
- package/data/harnesses/code/skills/design/data/gradients/signal-blue-develop.md +18 -0
- package/data/harnesses/code/skills/design/data/gradients/slate-mist-wash.md +16 -0
- package/data/harnesses/code/skills/design/data/gradients/stripe-atmosphere-mesh.md +18 -0
- package/data/harnesses/code/skills/design/data/gradients/teal-signal-accent.md +16 -0
- package/data/harnesses/code/skills/design/data/gradients/violet-magenta-promo.md +16 -0
- package/data/harnesses/code/skills/design/data/iconography.md +199 -0
- package/data/harnesses/code/skills/design/data/motion/accordion-expand.md +18 -0
- package/data/harnesses/code/skills/design/data/motion/destructive-hold-confirm.md +18 -0
- package/data/harnesses/code/skills/design/data/motion/drag-dismiss-momentum.md +18 -0
- package/data/harnesses/code/skills/design/data/motion/empty-state-arrive.md +18 -0
- package/data/harnesses/code/skills/design/data/motion/hover-lift.md +18 -0
- package/data/harnesses/code/skills/design/data/motion/modal-center-arrive.md +18 -0
- package/data/harnesses/code/skills/design/data/motion/number-ticker-roll.md +18 -0
- package/data/harnesses/code/skills/design/data/motion/onboarding-bounce.md +18 -0
- package/data/harnesses/code/skills/design/data/motion/panel-slide.md +18 -0
- package/data/harnesses/code/skills/design/data/motion/press-feedback.md +18 -0
- package/data/harnesses/code/skills/design/data/motion/progress-linear-loop.md +18 -0
- package/data/harnesses/code/skills/design/data/motion/route-crossfade.md +18 -0
- package/data/harnesses/code/skills/design/data/motion/rubber-band-overscroll.md +18 -0
- package/data/harnesses/code/skills/design/data/motion/skeleton-shimmer.md +18 -0
- package/data/harnesses/code/skills/design/data/motion/stagger-arrive.md +18 -0
- package/data/harnesses/code/skills/design/data/motion/toast-enter-stack.md +18 -0
- package/data/harnesses/code/skills/design/data/motion/tooltip-chain-instant.md +18 -0
- package/data/harnesses/code/skills/design/data/motion/trigger-anchored-reveal.md +18 -0
- package/data/harnesses/code/skills/design/data/tells.csv +34 -0
- package/data/harnesses/code/skills/design/data/typography/anton-work-sans.md +17 -0
- package/data/harnesses/code/skills/design/data/typography/archivo-black-archivo.md +17 -0
- package/data/harnesses/code/skills/design/data/typography/bitter-karla.md +17 -0
- package/data/harnesses/code/skills/design/data/typography/dm-serif-dm-sans.md +17 -0
- package/data/harnesses/code/skills/design/data/typography/fraunces-inter.md +17 -0
- package/data/harnesses/code/skills/design/data/typography/geist-geist-mono.md +17 -0
- package/data/harnesses/code/skills/design/data/typography/hubot-sans-mona-sans.md +17 -0
- package/data/harnesses/code/skills/design/data/typography/ibm-plex-sans-operator-single-family.md +17 -0
- package/data/harnesses/code/skills/design/data/typography/instrument-serif-instrument-sans.md +17 -0
- package/data/harnesses/code/skills/design/data/typography/inter-operator-single-family.md +17 -0
- package/data/harnesses/code/skills/design/data/typography/libre-baskerville-libre-franklin.md +17 -0
- package/data/harnesses/code/skills/design/data/typography/newsreader-inter.md +17 -0
- package/data/harnesses/code/skills/design/data/typography/playfair-display-source-sans.md +17 -0
- package/data/harnesses/code/skills/design/data/typography/public-sans-operator-single-family.md +17 -0
- package/data/harnesses/code/skills/design/data/typography/sohne-inter-fintech.md +17 -0
- package/data/harnesses/code/skills/design/data/typography/source-serif-source-sans.md +17 -0
- package/data/harnesses/code/skills/design/data/typography/space-grotesk-work-sans-space-mono.md +17 -0
- package/data/harnesses/code/skills/design/data/typography/spectral-manrope.md +17 -0
- package/data/harnesses/code/skills/design/data/voices/bright-collaborator.md +29 -0
- package/data/harnesses/code/skills/design/data/voices/direct-operator.md +29 -0
- package/data/harnesses/code/skills/design/data/voices/earnest-helper.md +29 -0
- package/data/harnesses/code/skills/design/data/voices/editorial-composed.md +29 -0
- package/data/harnesses/code/skills/design/data/voices/quiet-concierge.md +29 -0
- package/data/harnesses/code/skills/design/data/voices/warm-guide.md +29 -0
- package/data/harnesses/code/skills/design/design-md/SCHEMA.md +179 -0
- package/data/harnesses/code/skills/design/design-md/index.csv +67 -0
- package/data/harnesses/code/skills/design/design-md/library/airbnb.md +207 -0
- package/data/harnesses/code/skills/design/design-md/library/airtable.md +205 -0
- package/data/harnesses/code/skills/design/design-md/library/anthropic-claude.md +203 -0
- package/data/harnesses/code/skills/design/design-md/library/apple.md +206 -0
- package/data/harnesses/code/skills/design/design-md/library/binance.md +210 -0
- package/data/harnesses/code/skills/design/design-md/library/bmw.md +210 -0
- package/data/harnesses/code/skills/design/design-md/library/cal.md +209 -0
- package/data/harnesses/code/skills/design/design-md/library/clay.md +204 -0
- package/data/harnesses/code/skills/design/design-md/library/clickhouse.md +205 -0
- package/data/harnesses/code/skills/design/design-md/library/cohere.md +205 -0
- package/data/harnesses/code/skills/design/design-md/library/coinbase.md +198 -0
- package/data/harnesses/code/skills/design/design-md/library/composio.md +198 -0
- package/data/harnesses/code/skills/design/design-md/library/cursor.md +197 -0
- package/data/harnesses/code/skills/design/design-md/library/elevenlabs.md +199 -0
- package/data/harnesses/code/skills/design/design-md/library/expo.md +200 -0
- package/data/harnesses/code/skills/design/design-md/library/figma.md +199 -0
- package/data/harnesses/code/skills/design/design-md/library/framer.md +202 -0
- package/data/harnesses/code/skills/design/design-md/library/hashicorp.md +205 -0
- package/data/harnesses/code/skills/design/design-md/library/ibm.md +205 -0
- package/data/harnesses/code/skills/design/design-md/library/intercom.md +204 -0
- package/data/harnesses/code/skills/design/design-md/library/kraken.md +200 -0
- package/data/harnesses/code/skills/design/design-md/library/linear-app.md +198 -0
- package/data/harnesses/code/skills/design/design-md/library/lovable.md +199 -0
- package/data/harnesses/code/skills/design/design-md/library/meta.md +204 -0
- package/data/harnesses/code/skills/design/design-md/library/minimax.md +204 -0
- package/data/harnesses/code/skills/design/design-md/library/mintlify.md +210 -0
- package/data/harnesses/code/skills/design/design-md/library/miro.md +209 -0
- package/data/harnesses/code/skills/design/design-md/library/mistral-ai.md +201 -0
- package/data/harnesses/code/skills/design/design-md/library/mongodb.md +201 -0
- package/data/harnesses/code/skills/design/design-md/library/notion.md +204 -0
- package/data/harnesses/code/skills/design/design-md/library/nvidia.md +215 -0
- package/data/harnesses/code/skills/design/design-md/library/ollama.md +213 -0
- package/data/harnesses/code/skills/design/design-md/library/opencode-ai.md +216 -0
- package/data/harnesses/code/skills/design/design-md/library/posthog.md +218 -0
- package/data/harnesses/code/skills/design/design-md/library/raycast.md +214 -0
- package/data/harnesses/code/skills/design/design-md/library/replicate.md +202 -0
- package/data/harnesses/code/skills/design/design-md/library/resend.md +203 -0
- package/data/harnesses/code/skills/design/design-md/library/revolut.md +203 -0
- package/data/harnesses/code/skills/design/design-md/library/runwayml.md +203 -0
- package/data/harnesses/code/skills/design/design-md/library/sanity.md +200 -0
- package/data/harnesses/code/skills/design/design-md/library/sentry.md +201 -0
- package/data/harnesses/code/skills/design/design-md/library/shopify.md +202 -0
- package/data/harnesses/code/skills/design/design-md/library/slack.md +202 -0
- package/data/harnesses/code/skills/design/design-md/library/spacex.md +206 -0
- package/data/harnesses/code/skills/design/design-md/library/spotify.md +206 -0
- package/data/harnesses/code/skills/design/design-md/library/stripe.md +196 -0
- package/data/harnesses/code/skills/design/design-md/library/supabase.md +196 -0
- package/data/harnesses/code/skills/design/design-md/library/superhuman.md +194 -0
- package/data/harnesses/code/skills/design/design-md/library/tesla.md +198 -0
- package/data/harnesses/code/skills/design/design-md/library/theverge.md +199 -0
- package/data/harnesses/code/skills/design/design-md/library/together-ai.md +193 -0
- package/data/harnesses/code/skills/design/design-md/library/uber.md +195 -0
- package/data/harnesses/code/skills/design/design-md/library/vercel.md +195 -0
- package/data/harnesses/code/skills/design/design-md/library/voltagent.md +197 -0
- package/data/harnesses/code/skills/design/design-md/library/warp.md +196 -0
- package/data/harnesses/code/skills/design/design-md/library/webflow.md +197 -0
- package/data/harnesses/code/skills/design/design-md/library/wired.md +197 -0
- package/data/harnesses/code/skills/design/design-md/library/wise.md +198 -0
- package/data/harnesses/code/skills/design/design-md/library/x-ai.md +199 -0
- package/data/harnesses/code/skills/design/design-md/library/zapier.md +198 -0
- package/data/harnesses/code/skills/design/design-md/nurix.md +214 -0
- package/data/harnesses/code/skills/design/design-md/variants/editorial-luxury.md +184 -0
- package/data/harnesses/code/skills/design/design-md/variants/expressive-saas.md +216 -0
- package/data/harnesses/code/skills/design/design-md/variants/quiet-premium.md +211 -0
- package/data/harnesses/code/skills/design/design-md/variants/terse-dense-operator.md +212 -0
- package/data/harnesses/code/skills/design/design-md/variants/warm-approachable.md +216 -0
- package/data/harnesses/code/skills/design/references/compose.md +23 -0
- package/data/harnesses/code/skills/design/references/content.md +28 -0
- package/data/harnesses/code/skills/design/references/emission.md +21 -0
- package/data/harnesses/code/skills/design/references/existing-apps.md +27 -0
- package/data/harnesses/code/skills/design/references/intake.md +36 -0
- package/data/harnesses/code/skills/design/references/object-pass.md +24 -0
- package/data/harnesses/code/skills/design/references/ship-gate.md +29 -0
- package/data/harnesses/code/skills/design/references/ux-patterns/Readme.md +195 -0
- package/data/harnesses/code/skills/design/references/ux-patterns/ai-layer.md +49 -0
- package/data/harnesses/code/skills/design/references/ux-patterns/attributes-lifecycle.md +43 -0
- package/data/harnesses/code/skills/design/references/ux-patterns/container-choice.md +44 -0
- package/data/harnesses/code/skills/design/references/ux-patterns/creation-paths.md +46 -0
- package/data/harnesses/code/skills/design/references/ux-patterns/dashboards.md +42 -0
- package/data/harnesses/code/skills/design/references/ux-patterns/modes.md +42 -0
- package/data/harnesses/code/skills/design/references/ux-patterns/object-model.md +46 -0
- package/data/harnesses/code/skills/design/references/ux-patterns/page-archetype.md +48 -0
- package/data/harnesses/code/skills/design/references/ux-patterns/promotion-demotion.md +37 -0
- package/data/harnesses/code/skills/design/references/ux-patterns/settings.md +42 -0
- package/data/harnesses/code/skills/design/references/ux-patterns/standard-pages.md +46 -0
- package/data/harnesses/code/skills/design/references/ux-patterns/state-matrix.md +41 -0
- package/data/harnesses/code/skills/design/references/ux-patterns/table-mechanics.md +48 -0
- package/data/harnesses/code/skills/design/references/ux-patterns/verbs.md +45 -0
- package/data/harnesses/code/skills/design/references/ux-patterns/viewer-context.md +40 -0
- package/data/harnesses/code/skills/design/scripts/README-validator.md +27 -0
- package/data/harnesses/code/skills/design/scripts/select-chart.mjs +596 -0
- package/data/harnesses/code/skills/design/scripts/validate-design-md.mjs +1198 -0
- package/package.json +1 -1
- package/data/harnesses/code/skills/design/data/catalog/rules.csv +0 -137
- package/data/harnesses/code/skills/design/data/combinations/Readme.md +0 -33
- package/data/harnesses/code/skills/design/data/combinations/accent-presets.md +0 -113
- package/data/harnesses/code/skills/design/data/combinations/charts.csv +0 -33
- package/data/harnesses/code/skills/design/data/combinations/fonts-known.json +0 -448
- package/data/harnesses/code/skills/design/data/combinations/icons.csv +0 -157
- package/data/harnesses/code/skills/design/data/combinations/landing.csv +0 -38
- package/data/harnesses/code/skills/design/data/combinations/lucide-names.json +0 -2001
- package/data/harnesses/code/skills/design/data/combinations/manifest.json +0 -330
- package/data/harnesses/code/skills/design/data/combinations/motion.csv +0 -10
- package/data/harnesses/code/skills/design/data/combinations/palettes.csv +0 -92
- package/data/harnesses/code/skills/design/data/combinations/product-router.csv +0 -80
- package/data/harnesses/code/skills/design/data/combinations/styles.csv +0 -67
- package/data/harnesses/code/skills/design/data/combinations/typography.csv +0 -64
- package/data/harnesses/code/skills/design/data/design-md/SCHEMA.md +0 -106
- package/data/harnesses/code/skills/design/data/design-md/library/airbnb.md +0 -154
- package/data/harnesses/code/skills/design/data/design-md/library/airtable.md +0 -151
- package/data/harnesses/code/skills/design/data/design-md/library/anthropic-claude.md +0 -139
- package/data/harnesses/code/skills/design/data/design-md/library/apple.md +0 -139
- package/data/harnesses/code/skills/design/data/design-md/library/binance.md +0 -140
- package/data/harnesses/code/skills/design/data/design-md/library/bmw.md +0 -140
- package/data/harnesses/code/skills/design/data/design-md/library/cal.md +0 -140
- package/data/harnesses/code/skills/design/data/design-md/library/clay.md +0 -139
- package/data/harnesses/code/skills/design/data/design-md/library/clickhouse.md +0 -139
- package/data/harnesses/code/skills/design/data/design-md/library/cohere.md +0 -147
- package/data/harnesses/code/skills/design/data/design-md/library/coinbase.md +0 -156
- package/data/harnesses/code/skills/design/data/design-md/library/composio.md +0 -138
- package/data/harnesses/code/skills/design/data/design-md/library/cursor.md +0 -138
- package/data/harnesses/code/skills/design/data/design-md/library/elevenlabs.md +0 -137
- package/data/harnesses/code/skills/design/data/design-md/library/expo.md +0 -148
- package/data/harnesses/code/skills/design/data/design-md/library/figma.md +0 -141
- package/data/harnesses/code/skills/design/data/design-md/library/framer.md +0 -156
- package/data/harnesses/code/skills/design/data/design-md/library/hashicorp.md +0 -140
- package/data/harnesses/code/skills/design/data/design-md/library/ibm.md +0 -153
- package/data/harnesses/code/skills/design/data/design-md/library/intercom.md +0 -158
- package/data/harnesses/code/skills/design/data/design-md/library/kraken.md +0 -156
- package/data/harnesses/code/skills/design/data/design-md/library/linear-app.md +0 -122
- package/data/harnesses/code/skills/design/data/design-md/library/lovable.md +0 -140
- package/data/harnesses/code/skills/design/data/design-md/library/meta.md +0 -139
- package/data/harnesses/code/skills/design/data/design-md/library/minimax.md +0 -139
- package/data/harnesses/code/skills/design/data/design-md/library/mintlify.md +0 -139
- package/data/harnesses/code/skills/design/data/design-md/library/miro.md +0 -153
- package/data/harnesses/code/skills/design/data/design-md/library/mistral-ai.md +0 -140
- package/data/harnesses/code/skills/design/data/design-md/library/mongodb.md +0 -155
- package/data/harnesses/code/skills/design/data/design-md/library/notion.md +0 -140
- package/data/harnesses/code/skills/design/data/design-md/library/nvidia.md +0 -141
- package/data/harnesses/code/skills/design/data/design-md/library/ollama.md +0 -145
- package/data/harnesses/code/skills/design/data/design-md/library/opencode-ai.md +0 -142
- package/data/harnesses/code/skills/design/data/design-md/library/posthog.md +0 -152
- package/data/harnesses/code/skills/design/data/design-md/library/raycast.md +0 -137
- package/data/harnesses/code/skills/design/data/design-md/library/replicate.md +0 -140
- package/data/harnesses/code/skills/design/data/design-md/library/resend.md +0 -170
- package/data/harnesses/code/skills/design/data/design-md/library/revolut.md +0 -145
- package/data/harnesses/code/skills/design/data/design-md/library/runwayml.md +0 -137
- package/data/harnesses/code/skills/design/data/design-md/library/sanity.md +0 -168
- package/data/harnesses/code/skills/design/data/design-md/library/sentry.md +0 -163
- package/data/harnesses/code/skills/design/data/design-md/library/shopify.md +0 -147
- package/data/harnesses/code/skills/design/data/design-md/library/slack.md +0 -158
- package/data/harnesses/code/skills/design/data/design-md/library/spacex.md +0 -171
- package/data/harnesses/code/skills/design/data/design-md/library/spotify.md +0 -166
- package/data/harnesses/code/skills/design/data/design-md/library/stripe.md +0 -160
- package/data/harnesses/code/skills/design/data/design-md/library/supabase.md +0 -173
- package/data/harnesses/code/skills/design/data/design-md/library/superhuman.md +0 -145
- package/data/harnesses/code/skills/design/data/design-md/library/tesla.md +0 -153
- package/data/harnesses/code/skills/design/data/design-md/library/theverge.md +0 -167
- package/data/harnesses/code/skills/design/data/design-md/library/together-ai.md +0 -140
- package/data/harnesses/code/skills/design/data/design-md/library/uber.md +0 -140
- package/data/harnesses/code/skills/design/data/design-md/library/vercel.md +0 -140
- package/data/harnesses/code/skills/design/data/design-md/library/voltagent.md +0 -130
- package/data/harnesses/code/skills/design/data/design-md/library/warp.md +0 -140
- package/data/harnesses/code/skills/design/data/design-md/library/webflow.md +0 -140
- package/data/harnesses/code/skills/design/data/design-md/library/wired.md +0 -139
- package/data/harnesses/code/skills/design/data/design-md/library/wise.md +0 -137
- package/data/harnesses/code/skills/design/data/design-md/library/x-ai.md +0 -138
- package/data/harnesses/code/skills/design/data/design-md/library/zapier.md +0 -158
- package/data/harnesses/code/skills/design/data/design-md/nurix.md +0 -138
- package/data/harnesses/code/skills/design/data/design-tokens/SCHEMA.md +0 -695
- package/data/harnesses/code/skills/design/data/design-tokens/airbnb/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/airbnb/design.tokens.json +0 -1272
- package/data/harnesses/code/skills/design/data/design-tokens/airtable/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/airtable/design.tokens.json +0 -1268
- package/data/harnesses/code/skills/design/data/design-tokens/anthropic-claude/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/anthropic-claude/design.tokens.json +0 -1273
- package/data/harnesses/code/skills/design/data/design-tokens/apple/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/apple/design.tokens.json +0 -1262
- package/data/harnesses/code/skills/design/data/design-tokens/binance/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/binance/design.tokens.json +0 -1257
- package/data/harnesses/code/skills/design/data/design-tokens/bmw/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/bmw/design.tokens.json +0 -1270
- package/data/harnesses/code/skills/design/data/design-tokens/cal/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/cal/design.tokens.json +0 -1270
- package/data/harnesses/code/skills/design/data/design-tokens/clay/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/clay/design.tokens.json +0 -1261
- package/data/harnesses/code/skills/design/data/design-tokens/clickhouse/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/clickhouse/design.tokens.json +0 -1268
- package/data/harnesses/code/skills/design/data/design-tokens/cohere/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/cohere/design.tokens.json +0 -1281
- package/data/harnesses/code/skills/design/data/design-tokens/coinbase/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/coinbase/design.tokens.json +0 -1262
- package/data/harnesses/code/skills/design/data/design-tokens/composio/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/composio/design.tokens.json +0 -1271
- package/data/harnesses/code/skills/design/data/design-tokens/cursor/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/cursor/design.tokens.json +0 -1276
- package/data/harnesses/code/skills/design/data/design-tokens/elevenlabs/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/elevenlabs/design.tokens.json +0 -1293
- package/data/harnesses/code/skills/design/data/design-tokens/expo/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/expo/design.tokens.json +0 -1270
- package/data/harnesses/code/skills/design/data/design-tokens/figma/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/figma/design.tokens.json +0 -1276
- package/data/harnesses/code/skills/design/data/design-tokens/framer/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/framer/design.tokens.json +0 -1267
- package/data/harnesses/code/skills/design/data/design-tokens/goldens.json +0 -251
- package/data/harnesses/code/skills/design/data/design-tokens/hashicorp/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/hashicorp/design.tokens.json +0 -1273
- package/data/harnesses/code/skills/design/data/design-tokens/ibm/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/ibm/design.tokens.json +0 -1286
- package/data/harnesses/code/skills/design/data/design-tokens/intercom/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/intercom/design.tokens.json +0 -1290
- package/data/harnesses/code/skills/design/data/design-tokens/kraken/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/kraken/design.tokens.json +0 -1270
- package/data/harnesses/code/skills/design/data/design-tokens/linear-app/design.resolver.json +0 -23
- package/data/harnesses/code/skills/design/data/design-tokens/linear-app/design.tokens.dark.json +0 -599
- package/data/harnesses/code/skills/design/data/design-tokens/linear-app/design.tokens.json +0 -1272
- package/data/harnesses/code/skills/design/data/design-tokens/lovable/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/lovable/design.tokens.json +0 -1267
- package/data/harnesses/code/skills/design/data/design-tokens/meta/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/meta/design.tokens.json +0 -1289
- package/data/harnesses/code/skills/design/data/design-tokens/minimax/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/minimax/design.tokens.json +0 -1258
- package/data/harnesses/code/skills/design/data/design-tokens/mintlify/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/mintlify/design.tokens.json +0 -1284
- package/data/harnesses/code/skills/design/data/design-tokens/miro/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/miro/design.tokens.json +0 -1291
- package/data/harnesses/code/skills/design/data/design-tokens/mistral-ai/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/mistral-ai/design.tokens.json +0 -1263
- package/data/harnesses/code/skills/design/data/design-tokens/mongodb/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/mongodb/design.tokens.json +0 -1270
- package/data/harnesses/code/skills/design/data/design-tokens/notion/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/notion/design.tokens.json +0 -1261
- package/data/harnesses/code/skills/design/data/design-tokens/nurix/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/nurix/design.tokens.json +0 -1209
- package/data/harnesses/code/skills/design/data/design-tokens/nvidia/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/nvidia/design.tokens.json +0 -1265
- package/data/harnesses/code/skills/design/data/design-tokens/ollama/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/ollama/design.tokens.json +0 -1253
- package/data/harnesses/code/skills/design/data/design-tokens/opencode-ai/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/opencode-ai/design.tokens.json +0 -1268
- package/data/harnesses/code/skills/design/data/design-tokens/posthog/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/posthog/design.tokens.json +0 -1261
- package/data/harnesses/code/skills/design/data/design-tokens/raycast/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/raycast/design.tokens.json +0 -1263
- package/data/harnesses/code/skills/design/data/design-tokens/replicate/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/replicate/design.tokens.json +0 -1266
- package/data/harnesses/code/skills/design/data/design-tokens/resend/design.resolver.json +0 -23
- package/data/harnesses/code/skills/design/data/design-tokens/resend/design.tokens.dark.json +0 -623
- package/data/harnesses/code/skills/design/data/design-tokens/resend/design.tokens.json +0 -1276
- package/data/harnesses/code/skills/design/data/design-tokens/revolut/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/revolut/design.tokens.json +0 -1264
- package/data/harnesses/code/skills/design/data/design-tokens/runwayml/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/runwayml/design.tokens.json +0 -1268
- package/data/harnesses/code/skills/design/data/design-tokens/sanity/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/sanity/design.tokens.json +0 -1270
- package/data/harnesses/code/skills/design/data/design-tokens/sentry/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/sentry/design.tokens.json +0 -1288
- package/data/harnesses/code/skills/design/data/design-tokens/shopify/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/shopify/design.tokens.json +0 -1272
- package/data/harnesses/code/skills/design/data/design-tokens/slack/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/slack/design.tokens.json +0 -1265
- package/data/harnesses/code/skills/design/data/design-tokens/spacex/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/spacex/design.tokens.json +0 -1287
- package/data/harnesses/code/skills/design/data/design-tokens/spotify/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/spotify/design.tokens.json +0 -1286
- package/data/harnesses/code/skills/design/data/design-tokens/stripe/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/stripe/design.tokens.json +0 -1285
- package/data/harnesses/code/skills/design/data/design-tokens/supabase/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/supabase/design.tokens.json +0 -1287
- package/data/harnesses/code/skills/design/data/design-tokens/superhuman/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/superhuman/design.tokens.json +0 -1278
- package/data/harnesses/code/skills/design/data/design-tokens/tesla/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/tesla/design.tokens.json +0 -1269
- package/data/harnesses/code/skills/design/data/design-tokens/theverge/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/theverge/design.tokens.json +0 -1285
- package/data/harnesses/code/skills/design/data/design-tokens/together-ai/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/together-ai/design.tokens.json +0 -1303
- package/data/harnesses/code/skills/design/data/design-tokens/uber/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/uber/design.tokens.json +0 -1274
- package/data/harnesses/code/skills/design/data/design-tokens/vercel/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/vercel/design.tokens.json +0 -1296
- package/data/harnesses/code/skills/design/data/design-tokens/voltagent/design.resolver.json +0 -23
- package/data/harnesses/code/skills/design/data/design-tokens/voltagent/design.tokens.dark.json +0 -612
- package/data/harnesses/code/skills/design/data/design-tokens/voltagent/design.tokens.json +0 -1282
- package/data/harnesses/code/skills/design/data/design-tokens/warp/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/warp/design.tokens.json +0 -1287
- package/data/harnesses/code/skills/design/data/design-tokens/webflow/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/webflow/design.tokens.json +0 -1268
- package/data/harnesses/code/skills/design/data/design-tokens/wired/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/wired/design.tokens.json +0 -1276
- package/data/harnesses/code/skills/design/data/design-tokens/wise/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/wise/design.tokens.json +0 -1273
- package/data/harnesses/code/skills/design/data/design-tokens/x-ai/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/x-ai/design.tokens.json +0 -1296
- package/data/harnesses/code/skills/design/data/design-tokens/zapier/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/zapier/design.tokens.json +0 -1286
- package/data/harnesses/code/skills/design/data/operator-pack/exemplars/command-center.tsx +0 -249
- package/data/harnesses/code/skills/design/data/operator-pack/exemplars/create-edit.tsx +0 -249
- package/data/harnesses/code/skills/design/data/operator-pack/exemplars/dashboard.tsx +0 -225
- package/data/harnesses/code/skills/design/data/operator-pack/exemplars/entity-detail.tsx +0 -249
- package/data/harnesses/code/skills/design/data/operator-pack/exemplars/list-detail.tsx +0 -224
- package/data/harnesses/code/skills/design/data/operator-pack/exemplars/log-stream.tsx +0 -249
- package/data/harnesses/code/skills/design/data/operator-pack/fixtures.md +0 -88
- package/data/harnesses/code/skills/design/data/operator-pack/surface-catalog.md +0 -132
- package/data/harnesses/code/skills/design/data/operator-pack/trust-rubric.md +0 -76
- package/data/harnesses/code/skills/design/references/create.md +0 -173
- package/data/harnesses/code/skills/design/references/diagnosis.md +0 -108
- package/data/harnesses/code/skills/design/references/hard-rules.md +0 -177
- package/data/harnesses/code/skills/design/references/improve.md +0 -116
- package/data/harnesses/code/skills/design/references/interaction.md +0 -77
- package/data/harnesses/code/skills/design/references/introspect.md +0 -100
- package/data/harnesses/code/skills/design/references/lifecycle.md +0 -73
- package/data/harnesses/code/skills/design/references/personality.md +0 -575
- package/data/harnesses/code/skills/design/references/structure.md +0 -159
- package/data/harnesses/code/skills/design/scripts/convert-design-md.mjs +0 -1312
- package/data/harnesses/code/skills/design/scripts/derive-personality.mjs +0 -1498
- package/data/harnesses/code/skills/design/scripts/generate-fixtures.mjs +0 -551
- package/data/harnesses/code/skills/design/scripts/lib/checks.mjs +0 -1092
- package/data/harnesses/code/skills/design/scripts/lib/golden.mjs +0 -26
- package/data/harnesses/code/skills/design/scripts/lib/vocabulary.mjs +0 -65
- package/data/harnesses/code/skills/design/scripts/phase-gate.mjs +0 -538
- package/data/harnesses/code/skills/design/scripts/preship-sweep.mjs +0 -312
- package/data/harnesses/code/skills/design/scripts/render-rung.mjs +0 -890
- package/data/harnesses/code/skills/design/scripts/scaffold.mjs +0 -769
- package/data/harnesses/code/skills/design/scripts/self-integrity.mjs +0 -675
- package/data/harnesses/code/skills/design/scripts/snapshot-goldens.mjs +0 -164
- package/data/harnesses/code/skills/design/scripts/validate-combinations.mjs +0 -439
|
@@ -1,575 +0,0 @@
|
|
|
1
|
-
# Personality — the look pipeline
|
|
2
|
-
|
|
3
|
-
`design-tokens artifact → --check → --emit`. A look travels as a **design-tokens artifact** — three
|
|
4
|
-
DTCG JSON files whose grammar, payload, and resolution rules are the frozen transport schema,
|
|
5
|
-
[SCHEMA.md](../data/design-tokens/SCHEMA.md). [`derive-personality.mjs`](../scripts/derive-personality.mjs)
|
|
6
|
-
is the reference consumer: `--check` is the coverage gate that must pass before `--emit` writes
|
|
7
|
-
`personality.css`, `globals.css`, `fonts.css`, and the `<html>` attributes. The emitted files *are*
|
|
8
|
-
the state — no sidecar cache, no intermediate document. (The design.md format exists only as the
|
|
9
|
-
library's curated documentation corpus, `data/design-md/library/`; the machine path reads token files.)
|
|
10
|
-
|
|
11
|
-
The look comes entirely from the cascade. A surface composes in semantic tokens (`bg-card`,
|
|
12
|
-
`text-foreground`) and reads its personality from the CSS variables emission writes. Swap the
|
|
13
|
-
artifact, re-emit, and every surface re-skins with zero JSX edits — the invariant the exemplars are
|
|
14
|
-
validated against.
|
|
15
|
-
|
|
16
|
-
Emission is a **contract with checks**, not a template with hopes: every authored token group
|
|
17
|
-
reaches consumable, renderable output, and each contract names the check that fails closed when it
|
|
18
|
-
doesn't — the cascade armor (§4, verified rendered by cod-15 on the render rung), font binding
|
|
19
|
-
(§5, cod-16 at `--emit`), emitter completeness (§6, at `--emit`), and the Tailwind compile smoke
|
|
20
|
-
(`snapshot-goldens.mjs`, run at every goldens refresh).
|
|
21
|
-
|
|
22
|
-
Every CSS and comment excerpt in this document is pasted from a real emission of the shipped Nurix
|
|
23
|
-
default (`data/design-tokens/nurix/`); gate transcripts are from real runs, with scratch paths
|
|
24
|
-
shown as `<artifact-dir>`.
|
|
25
|
-
|
|
26
|
-
## 1. The pipeline — artifact in, CSS out
|
|
27
|
-
|
|
28
|
-
```
|
|
29
|
-
design-tokens artifact ──▶ derive-personality.mjs --check ──▶ (green) ──▶ --emit <outdir>
|
|
30
|
-
design.tokens.json the coverage gate (rules 1–15): src/styles/personality.css
|
|
31
|
-
design.tokens.dark.json? 27 primitives + 2 dials + density tier src/styles/globals.css
|
|
32
|
-
design.resolver.json + 36 color roles + typography 3+7 src/styles/fonts.css
|
|
33
|
-
+ elevation 4 + optional wash, index-html-attributes.txt
|
|
34
|
-
each assigned or hinted, or exit 1
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
```
|
|
38
|
-
derive-personality.mjs <artifact-dir> [--check | --emit <outdir> [--provisional]] [--theme light|dark]
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
**The artifact.** Three files in one directory: `design.tokens.json` (the base set — primitives,
|
|
42
|
-
color roles, typography, elevation, the optional wash pair, and the file-level
|
|
43
|
-
`$extensions["com.nurix.design"]` payload carrying `product`, `provenance`, `theme-default`,
|
|
44
|
-
`anchors`, the dials, and the lever manifest), `design.tokens.dark.json` (only when the look has
|
|
45
|
-
dark values), and `design.resolver.json`. The script resolves them in the resolver's deterministic
|
|
46
|
-
order — concatenate the set files, overlay the selected theme context, resolve aliases after
|
|
47
|
-
overlay — then validates or emits. File shapes, `$type` grammar, and payload spec live in
|
|
48
|
-
[SCHEMA.md](../data/design-tokens/SCHEMA.md); this document covers what emission does with a
|
|
49
|
-
resolved artifact.
|
|
50
|
-
|
|
51
|
-
**`--check` never best-efforts.** It runs the schema's rules 1–15 and exits non-zero naming every
|
|
52
|
-
offending path, so the fix is mechanical; the `tokens` phase gate (and the verify/pre-ship sweeps)
|
|
53
|
-
stay shut until it is green. Over the shipped default, from the skill root,
|
|
54
|
-
`node scripts/derive-personality.mjs data/design-tokens/nurix --check` prints:
|
|
55
|
-
|
|
56
|
-
```
|
|
57
|
-
check PASSED (data/design-tokens/nurix): rules 1–15 OK — 27 primitives, 36 color roles, typography 3+7, elevation 4, payload/manifest/parse-back OK — provenance=default, style=nurix, theme=light
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
Rule 12 (the emission precondition) is enforced at emit time; `--check` surfaces it as the
|
|
61
|
-
outstanding-hint count (§3). A failing artifact names its gaps — this run is against a scratch copy
|
|
62
|
-
of the default with one color token deleted:
|
|
63
|
-
|
|
64
|
-
```
|
|
65
|
-
check FAILED (<artifact-dir>): 1 issue(s)
|
|
66
|
-
- rule 4 — color.warning: missing
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
**`--emit <outdir>`** runs only over a passing artifact and refuses while any token carries a hint
|
|
70
|
-
(§3), while any authored group lacks an emitter (§6), or while any emitted stack family fails the
|
|
71
|
-
font-binding gate (§5). It writes four files: `<outdir>/src/styles/personality.css`,
|
|
72
|
-
`<outdir>/src/styles/globals.css`, `<outdir>/src/styles/fonts.css`, and
|
|
73
|
-
`<outdir>/index-html-attributes.txt` — the attribute set the project's `index.html` `<html>` tag
|
|
74
|
-
must carry. In real use `<outdir>` is the project root. `--provisional` (the golden/regression
|
|
75
|
-
flow only, never shipped output) emits hinted tokens at their provisional `$values` and demotes the
|
|
76
|
-
font-binding gate to a loud warning.
|
|
77
|
-
|
|
78
|
-
### The emitted header is the cache record
|
|
79
|
-
|
|
80
|
-
There is no sidecar state file. The header comment of the emitted `personality.css` carries the
|
|
81
|
-
active personality — dials, theme, and the artifact citation with its provenance — and the `<html>`
|
|
82
|
-
attributes carry the same state in markup:
|
|
83
|
-
|
|
84
|
-
```css
|
|
85
|
-
/* src/styles/personality.css — operator-UI personality tokens (emitted; do not hand-edit).
|
|
86
|
-
*
|
|
87
|
-
* Active personality — code is the cache. These values and the <html data-*>
|
|
88
|
-
* attributes in index.html are emitted from the design-tokens artifact. To change
|
|
89
|
-
* the look, edit design.tokens.json and re-run derive-personality.mjs --emit.
|
|
90
|
-
* style: nurix (<html data-style="nurix">) — the project's own personality (rosterless)
|
|
91
|
-
* density: standard (<html data-density="standard">)
|
|
92
|
-
* verbosity: default (<html data-verbosity="default">)
|
|
93
|
-
* feedback: subtle (<html data-feedback="subtle">)
|
|
94
|
-
* theme: light (<html data-theme="light">) — the payload's theme-default decides the boot theme
|
|
95
|
-
* artifact: design.tokens.json (resolved via design.resolver.json) — provenance: default, sourced 2026-07-04
|
|
96
|
-
*
|
|
97
|
-
* Semantic-token doctrine: components name purpose (bg-card, text-foreground, border-border);
|
|
98
|
-
* this file resolves those names to values. Components never use dark: prefixes or literal colors.
|
|
99
|
-
*/
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
Recovery therefore reads two things: the token artifact (the source) and the emitted attributes
|
|
103
|
-
(the active state). `index-html-attributes.txt` from the same run:
|
|
104
|
-
|
|
105
|
-
```html
|
|
106
|
-
<!-- Personality state lives in these <html data-*> attributes — code is the cache.
|
|
107
|
-
The design-tokens artifact is the source. To change the look, edit design.tokens.json
|
|
108
|
-
and re-run derive-personality.mjs --emit; to nudge one axis, edit an attribute here. -->
|
|
109
|
-
<html
|
|
110
|
-
lang="en"
|
|
111
|
-
data-style="nurix"
|
|
112
|
-
data-density="standard"
|
|
113
|
-
data-verbosity="default"
|
|
114
|
-
data-feedback="subtle"
|
|
115
|
-
data-theme="light"
|
|
116
|
-
>
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
## 2. Derivation — token paths to emitted CSS variables
|
|
120
|
-
|
|
121
|
-
Leaf names are law: a `primitive.*`, `color.*`, `elevation.*`, or `wash.*` token maps 1:1 to the
|
|
122
|
-
CSS variable of the same name (elevation as `--shadow-<level>`, wash as `--wash-<slot>`).
|
|
123
|
-
|
|
124
|
-
| Artifact source | Emitted target | Rule |
|
|
125
|
-
| --- | --- | --- |
|
|
126
|
-
| `primitive.<name>` (25 static) | `[data-style="<slug>"] { --<name>: … }` | 1:1 by leaf name |
|
|
127
|
-
| `primitive.density-gap` / `density-inset` | governed refs `var(--density-base-gap/inset)` in `[data-style]` | the density tier writes the base (§4) |
|
|
128
|
-
| `color.<name>` (36) | `:root, :root[data-theme="light"] { --<name>: … }` | 1:1 by leaf name, armored (§4) |
|
|
129
|
-
| dark set `color.<name>` (36) | `:root[data-theme="dark"] { --<name>: … }` | only when the dark file ships (§7); same 0,2,0 armor |
|
|
130
|
-
| `elevation.<level>` (4) | `--shadow-sm/md/lg/overlay` in `[data-style]` **and** the `@theme` shadow utilities | every layer alpha rides `calc(… * var(--shadow-intensity))` |
|
|
131
|
-
| `wash.<slot>` (≤ 2, optional) | `--wash-surface` / `--wash-emphasis` in `[data-style]` | consumed only on budget-granted surfaces (col-16) |
|
|
132
|
-
| `typography.ramp.<step>` (7) | `@theme` text utilities `text-h1` … `text-display` (size / line-height / weight / tracking per step) | the ramp becomes *classes* — the type scale IS the ramp (typ-09) |
|
|
133
|
-
| `primitive.stagger-unit` | `--stagger-delay` + the named motion classes `.motion-lift` / `.motion-stagger` | mot-08 caps the cascade; mot-03 gates it behind `prefers-reduced-motion` |
|
|
134
|
-
| payload `product` | `<html data-style="<slug>">` | slugified (lowercase, non-alphanumeric runs → `-`) |
|
|
135
|
-
| payload `verbosity` / `feedback` / `density-tier` | `<html data-verbosity / data-feedback / data-density>` | dial → attribute |
|
|
136
|
-
| payload `theme-default` | `<html data-theme>` | the boot theme; the `theme.ts` helper round-trips the same attribute (§7) |
|
|
137
|
-
| payload `product-traits` / `anchors` | read by the front gate and improve/judge runs; **not** emitted to CSS | — |
|
|
138
|
-
| `primitive.font-sans` / `font-mono`, `font-weight-normal` | `[data-style]` **and** literals in `@theme inline` | §4, two-weight discipline / no self-reference |
|
|
139
|
-
| `typography.family.*` / `typography.ramp.*` fontFamily | data for emitters, exemplars, and the fonts.css derivation (§5) | reaches CSS variables only through the primitives it aliases |
|
|
140
|
-
| — (derived at emit) | `--ease-enter`, `--ease-exit`, `--stagger-delay` | computed from `ease-default` + `stagger-unit` |
|
|
141
|
-
|
|
142
|
-
**The preserved-css rule.** For every emitted value the emitters prefer the token's
|
|
143
|
-
`$extensions["com.nurix.design"].css` — the exact source string — so output is byte-stable across
|
|
144
|
-
convert/emit round trips (an aliased token takes its target's `.css`). Absent `.css`, the schema's
|
|
145
|
-
deterministic serialization applies: `dimension`/`duration` as `<value><unit>`; `number`/`fontWeight`
|
|
146
|
-
as the plain number; `cubicBezier` as `cubic-bezier(x1, y1, x2, y2)`; `fontFamily` as the families
|
|
147
|
-
joined with `", "`, multi-word names double-quoted; `color` as the `hex` field when srgb, else
|
|
148
|
-
`oklch(…)`; `shadow` and `gradient` as their serialized composite byte forms. The parse-back check
|
|
149
|
-
(rule 9) guarantees the two forms agree before anything is emitted.
|
|
150
|
-
|
|
151
|
-
**Derived, never stored.** Three temporal variables are computed at emit — they are not tokens, not
|
|
152
|
-
authored beyond their sources, and not gated (do not add them to an artifact):
|
|
153
|
-
|
|
154
|
-
- `--ease-exit: var(--ease-default)` — departure mirrors the neutral curve.
|
|
155
|
-
- `--ease-enter` — the emphasized-decelerate arrival curve `cubic-bezier(0.16, 1, 0.3, 1)` (fast
|
|
156
|
-
in, settles clean); `ease-default` is reused verbatim when it is already a decelerate curve
|
|
157
|
-
(y1 ≥ 0.9).
|
|
158
|
-
- `--stagger-delay: var(--stagger-unit)` — the `.motion-stagger` cascade base, riding the authored
|
|
159
|
-
`primitive.stagger-unit` (legal 0–60ms). This is the feel calibration in one number: **30ms reads
|
|
160
|
-
polished; 0ms reads utilitarian.**
|
|
161
|
-
|
|
162
|
-
Emitted into the `[data-style]` block, directly after the temporal family:
|
|
163
|
-
|
|
164
|
-
```css
|
|
165
|
-
--ease-enter: cubic-bezier(0.16, 1, 0.3, 1); /* derived from ease-default */
|
|
166
|
-
--ease-exit: var(--ease-default); /* derived: departure mirrors the neutral curve */
|
|
167
|
-
--stagger-delay: var(--stagger-unit); /* derived: the motion-stagger cascade base */
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
### The emitted block order — law
|
|
171
|
-
|
|
172
|
-
The runtime cascade carries **contexts only** — theme, density, and the behavioral dials; every
|
|
173
|
-
value was already resolved at generation time into the artifact. The emitted `personality.css`
|
|
174
|
-
blocks, in order:
|
|
175
|
-
|
|
176
|
-
1. **Header comment** — provenance (artifact → emit command), the CASCADE CONTRACT (naming **both**
|
|
177
|
-
armors and the exact loss mode, §4), the regeneration instruction.
|
|
178
|
-
2. **The `:root` system baseline** — the 27 primitives at neutral operator defaults, the safety net
|
|
179
|
-
if `<html>` ever carries no `data-style`.
|
|
180
|
-
3. **The light theme context** — `:root, :root[data-theme="light"]`, all 36 color roles, armored.
|
|
181
|
-
4. **`[data-style="<slug>"]`** — the 27 primitives + the derived temporals (with their derivation
|
|
182
|
-
comments), the four elevation composites, and the optional wash pair; the one block
|
|
183
|
-
improve/extract rewrites.
|
|
184
|
-
5. **The dial and density contexts** — `[data-verbosity]` / `[data-feedback]` / `[data-density]` /
|
|
185
|
-
`[data-density-step]` attribute blocks.
|
|
186
|
-
6. **The dark theme context** — `:root[data-theme="dark"]`, all 36 dark roles (when the dark set
|
|
187
|
-
ships; a placeholder comment otherwise), same armor.
|
|
188
|
-
7. **Motion moments** — `.motion-lift` / `.motion-stagger`, behind `prefers-reduced-motion`.
|
|
189
|
-
8. **Accessibility contexts** — `prefers-reduced-motion: reduce` and `prefers-contrast: more`.
|
|
190
|
-
|
|
191
|
-
**Dial semantics.** The payload's two behavioral dials become `<html>` attributes, and
|
|
192
|
-
`personality.css` carries one block per dial value setting the behavioral variables the lifecycle
|
|
193
|
-
and interaction layers read:
|
|
194
|
-
|
|
195
|
-
```css
|
|
196
|
-
/* ── Behavioral dials (D4) — orthogonal to the visual primitives. ── */
|
|
197
|
-
[data-verbosity="full"] { --label-display: inline-flex; --helper-text-display: block; --tooltip-delay: 800ms; }
|
|
198
|
-
[data-verbosity="default"] { --label-display: inline-flex; --helper-text-display: block; --tooltip-delay: 500ms; }
|
|
199
|
-
[data-verbosity="compact"] { --label-display: none; --helper-text-display: none; --tooltip-delay: 200ms; }
|
|
200
|
-
[data-verbosity="expert"] { --label-display: none; --helper-text-display: none; --tooltip-delay: 0ms; }
|
|
201
|
-
|
|
202
|
-
[data-feedback="subtle"] { --feedback-press-scale: 0.99; --focus-ring-width: 2px; --focus-ring-offset: 1px; }
|
|
203
|
-
[data-feedback="minimal"] { --feedback-press-scale: 1; --focus-ring-width: 1px; --focus-ring-offset: 0px; }
|
|
204
|
-
```
|
|
205
|
-
|
|
206
|
-
- `--label-display` / `--helper-text-display` — `compact`/`expert` verbosity collapse form labels
|
|
207
|
-
and helper text; `full`/`default` keep them. Field chrome reads these, not a JS branch.
|
|
208
|
-
- `--tooltip-delay` — tightens with verbosity (`800ms → 0ms`).
|
|
209
|
-
- `--feedback-press-scale`, `--focus-ring-width`, `--focus-ring-offset` — `minimal` feedback
|
|
210
|
-
flattens the press and thins the focus ring; `subtle` keeps the operator-default ring.
|
|
211
|
-
|
|
212
|
-
The lifecycle pattern ([lifecycle.md](./lifecycle.md)) consumes the dials directly — empty-state
|
|
213
|
-
richness scales with verbosity, confirmation depth rides feedback; focus and overlay discipline read
|
|
214
|
-
the ring variables ([interaction.md](./interaction.md)). A component that must branch structurally
|
|
215
|
-
on a dial reads the `<html>` attribute — it never duplicates the state. Density (`data-density`) is
|
|
216
|
-
spatial chrome, not behavior — it composes with the dials, never replaces them (§4).
|
|
217
|
-
|
|
218
|
-
**Motion moments exist in behavior, not just variables.** Emission writes two named classes
|
|
219
|
-
consuming the temporal tokens — `.motion-lift` (hover: −1px translateY + `elevation.sm` at
|
|
220
|
-
`duration-fast`/`ease-default`) and `.motion-stagger` (children arrival cascade at
|
|
221
|
-
`--stagger-delay`, capped at 8 children, mot-08; children past the cap arrive with the 8th) — both
|
|
222
|
-
inert under `prefers-reduced-motion` (mot-03). `scaffold.mjs` consumes them where the archetype
|
|
223
|
-
calls for them (table rows ride `motion-lift`; brand-forward card grids ride `motion-stagger` —
|
|
224
|
-
baseline-stamped surfaces skip arrival cascades), and the exemplars demonstrate the same
|
|
225
|
-
consumption. The render rung audits rendered stagger containers against the cap and the 1s
|
|
226
|
-
total-sequence budget.
|
|
227
|
-
|
|
228
|
-
## 3. Hints — provisional values that pass the gate but block emission
|
|
229
|
-
|
|
230
|
-
Where a value needs judgment, the token carries a **valid provisional `$value`** plus
|
|
231
|
-
`$extensions["com.nurix.design"].hint` — the intent in plain words (the full convention, with the
|
|
232
|
-
JSON shape, is SCHEMA.md's hint section; payload fields are always concrete — hints exist only on
|
|
233
|
-
tokens). Every gated token is in exactly one state:
|
|
234
|
-
|
|
235
|
-
| State | Marker | `--check` | `--emit` |
|
|
236
|
-
| --- | --- | --- | --- |
|
|
237
|
-
| **assigned** | real value, no `hint` key | passes | emits |
|
|
238
|
-
| **hinted** | `hint` key present | passes | **refuses**, naming every hinted path |
|
|
239
|
-
| **missing** | token absent | fails, naming the key | — |
|
|
240
|
-
|
|
241
|
-
A hinted artifact is checkable — the pass line counts the outstanding hints (this run: a scratch
|
|
242
|
-
copy of the default with a hint added to `primitive.contrast-boost`):
|
|
243
|
-
|
|
244
|
-
```
|
|
245
|
-
check PASSED (<artifact-dir>): rules 1–15 OK — 27 primitives, 36 color roles, typography 3+7, elevation 4, payload/manifest/parse-back OK — provenance=default, style=nurix, theme=light, 1 hint(s) outstanding (emit will refuse)
|
|
246
|
-
```
|
|
247
|
-
|
|
248
|
-
— but not emittable. `--emit` over the same artifact:
|
|
249
|
-
|
|
250
|
-
```
|
|
251
|
-
emit REFUSED (<artifact-dir>): 1 unresolved hint(s) — rule 12: every gated token must be concrete before emission.
|
|
252
|
-
- primitive.contrast-boost: hint: nudge borders up a step so the dense table grid reads as a grid
|
|
253
|
-
Resolve each with judgment: set the real $value, delete the hint key, record the rationale in $description — then re-run --emit.
|
|
254
|
-
```
|
|
255
|
-
|
|
256
|
-
Resolving a hint is exactly that three-step: set the real `$value`, delete the `hint` key, record
|
|
257
|
-
the rationale in the token's `$description` — so the resolved artifact stays self-explaining and
|
|
258
|
-
re-derivable. Judgment is recorded, never silent. (`--emit --provisional`, the golden/regression
|
|
259
|
-
flow, emits hinted tokens at their provisional `$values` instead — loudly, and never as shipped
|
|
260
|
-
output.)
|
|
261
|
-
|
|
262
|
-
## 4. The substrate contracts — living with `@nurix/components`
|
|
263
|
-
|
|
264
|
-
`@nurix/components/styles.css` ships its own bare-`:root` token defaults and its own `@theme`
|
|
265
|
-
radius scale. Two cascade contracts keep the personality in charge; both are hardened with the
|
|
266
|
-
emitted in-CSS comments below, enforced by the code-and-token rules (`cod-*`) in
|
|
267
|
-
[hard-rules.md](./hard-rules.md), and verified **rendered** by the render rung's per-theme drift
|
|
268
|
-
check (cod-15). Measured at `@nurix/components@0.14.0`, the library directly consumes 15 of the 17
|
|
269
|
-
shadcn-standard semantic color roles but only one personality primitive (`--radius`) — everything else reaches
|
|
270
|
-
it through the consumer Tailwind build this file feeds (shadows, weights, tracking, and the density
|
|
271
|
-
remap below).
|
|
272
|
-
|
|
273
|
-
**CASCADE CONTRACT 1 — both theme blocks carry the same armor.** Light emits as
|
|
274
|
-
`:root, :root[data-theme="light"]` and dark as `:root[data-theme="dark"]` — both specificity
|
|
275
|
-
(0,2,0):
|
|
276
|
-
|
|
277
|
-
```css
|
|
278
|
-
/* ── Semantic + substrate color tokens — light theme. ──
|
|
279
|
-
* CASCADE CONTRACT 1: both theme blocks carry the same 0,2,0 armor — light as
|
|
280
|
-
* :root, :root[data-theme="light"] and dark as :root[data-theme="dark"] — because
|
|
281
|
-
* a bare :root or a lone attribute selector loses to the library's later :root
|
|
282
|
-
* block in @nurix/components/styles.css by source order. All 36 tokens are set
|
|
283
|
-
* (D6): no consumed token falls back to a shadcn-gray default. */
|
|
284
|
-
:root,
|
|
285
|
-
:root[data-theme="light"] {
|
|
286
|
-
```
|
|
287
|
-
|
|
288
|
-
*The exact loss mode:* a bare `:root { --background: … }` is specificity `(0,1,0)` — the library's
|
|
289
|
-
own `:root { --background: … }` is also `(0,1,0)` and imported *later*, so it wins by source order
|
|
290
|
-
and every surface silently reverts to shadcn gray. A lone `[data-theme="dark"]` attribute selector
|
|
291
|
-
is the same `(0,1,0)` and loses the same way — and it ships while every static gate stays green,
|
|
292
|
-
because no static check sees the cascade. The `:root[data-theme="…"]` arm
|
|
293
|
-
is `(0,2,0)` and out-wins — but only if `<html>` actually carries the attribute; scaffold writes it
|
|
294
|
-
from the payload's `theme-default`, and the render rung's cod-15 measures the rendered
|
|
295
|
-
`--background`/`--foreground`/`--primary` per declared theme context against the authored values,
|
|
296
|
-
so a cascade-dead theme block cannot pass.
|
|
297
|
-
|
|
298
|
-
**CASCADE CONTRACT 2 — the five-step import order.** The emitted `globals.css` opens:
|
|
299
|
-
|
|
300
|
-
```css
|
|
301
|
-
/* src/styles/globals.css — Tailwind v4 glue + @theme inline mappings (emitted). */
|
|
302
|
-
|
|
303
|
-
/* CASCADE CONTRACT 2: this five-step order is LOAD-BEARING. fonts.css registers the
|
|
304
|
-
* @fontsource faces before any stack consumes them; the library's styles.css ships
|
|
305
|
-
* its own :root token defaults and its own @theme radius scale, so our @theme MUST
|
|
306
|
-
* come AFTER the import to win the radius scale and own every mapping.
|
|
307
|
-
* rules/frontend.md states the same order — co-authority. */
|
|
308
|
-
@import "./fonts.css"; /* 1. font registration (faces before stacks) */
|
|
309
|
-
@import "./personality.css"; /* 2. token source */
|
|
310
|
-
@import "tailwindcss"; /* 3. framework */
|
|
311
|
-
@import "@nurix/components/styles.css"; /* 4. library (before our @theme) */
|
|
312
|
-
|
|
313
|
-
@theme inline { /* 5. consumer theme — AFTER the library, so it wins */
|
|
314
|
-
```
|
|
315
|
-
|
|
316
|
-
*Failure mode:* put `@theme inline` (or the whole consumer theme) *before* the library import and
|
|
317
|
-
the library's own `@theme` radius scale (`--radius-lg: var(--radius)`, its own offsets) comes later
|
|
318
|
-
and wins — the personality `--radius` stops driving the scale and archetype radius switching breaks.
|
|
319
|
-
The library also ships a `.dark`-class `@custom-variant`; the consumer's later redefinition (§7) is
|
|
320
|
-
what makes library `dark:` utilities follow the `data-theme` attribute. `rules/frontend.md` states
|
|
321
|
-
this same order — co-authority, not a restatement to drift from. `@theme inline` inlines each value
|
|
322
|
-
into the generated utilities (so `bg-card` compiles to `background-color: var(--card)`).
|
|
323
|
-
|
|
324
|
-
**The derivation-comment landmine.** Emitted comments explain derivations — and a CSS comment
|
|
325
|
-
containing the literal sequence `p-*/gap-*` **closes the comment early** (`*/`) and breaks every
|
|
326
|
-
consuming project's build. Emitters write "`p-*` and `gap-*`" instead; never paste a
|
|
327
|
-
`utility-*/utility-*` pair into an emitted CSS comment. Goldens hash bytes and never compile them,
|
|
328
|
-
so only the Tailwind compile smoke (`snapshot-goldens.mjs`, emission contract 5) catches this class
|
|
329
|
-
of defect — it is part of every goldens refresh, not optional.
|
|
330
|
-
|
|
331
|
-
**The gray-fallback trap — all 36 roles, always.** Beyond the semantic color tokens it maps, the
|
|
332
|
-
library consumes shadcn tokens — `--popover(-foreground)`, `--secondary(-foreground)`,
|
|
333
|
-
`--chart-1..5`, and the `--sidebar` family — that silently fall back to the shadcn-gray defaults
|
|
334
|
-
inside its `styles.css` when unset: popovers, menus, secondary buttons, sidebars, and charts render
|
|
335
|
-
visibly off-palette next to personality surfaces. The artifact's substrate group carries 17 roles
|
|
336
|
-
covering them, the semantic group carries 19 (including the `surface-raised`/`surface-overlay` dark
|
|
337
|
-
ladder), and emission sets all 36 color roles every time. `--color-destructive-foreground` is
|
|
338
|
-
mapped explicitly in `@theme` because the library leaves it unmapped.
|
|
339
|
-
|
|
340
|
-
**Coverage — every token the library consumes is emitted.**
|
|
341
|
-
|
|
342
|
-
| Library consumes | How | Emitted at |
|
|
343
|
-
| --- | --- | --- |
|
|
344
|
-
| `--radius` (`rounded-*`) | direct primitive + `@theme` radius scale | `[data-style]` · `@theme` |
|
|
345
|
-
| shadows (`shadow-*`) | the four `elevation.*` composites; every alpha rides `--shadow-intensity` | `[data-style]` · `@theme` |
|
|
346
|
-
| font weight (`font-medium/semibold/bold/normal`) | two-weight map to `--font-weight-strong` | `@theme` |
|
|
347
|
-
| tracking (`tracking-*`) | `--tracking-tight/tighter → --heading-tracking` | `@theme` |
|
|
348
|
-
| spacing (all `p-*` and `gap-*`) | `--spacing` density remap | `@theme` |
|
|
349
|
-
| `font-sans` / `font-mono` | literal font stacks (faces registered by `fonts.css`, §5) | `@theme` |
|
|
350
|
-
| type ramp (`text-h1` … `text-display`) | the seven authored steps as text utilities | `@theme` |
|
|
351
|
-
| 19 semantic colors | direct token values | `:root, :root[data-theme="light"]` (+ dark armor) |
|
|
352
|
-
| 17 substrate colors (`popover`/`secondary`/`chart-1..5`/`sidebar` family) | direct token values | same theme blocks |
|
|
353
|
-
| `--destructive-foreground` (unmapped by library) | explicit `--color-destructive-foreground` map | `@theme` |
|
|
354
|
-
| `--sidebar-width` / `--sidebar-width-icon` | SidebarProvider `style` prop | shell (below) |
|
|
355
|
-
|
|
356
|
-
**Density — global tier composed with a per-surface relative step.** Two composed levels, pure
|
|
357
|
-
cascade, no JS. The payload's `density-tier` becomes `data-density` on `<html>`, and the emitted
|
|
358
|
-
blocks write only the **base** multipliers; a surface carries `data-density-step` (from its
|
|
359
|
-
surface-catalog `density-modifier`, [surface-catalog.md](../data/operator-pack/surface-catalog.md),
|
|
360
|
-
emitted by `scaffold.mjs`) and re-derives one relative step off whatever tier the app runs:
|
|
361
|
-
|
|
362
|
-
```css
|
|
363
|
-
/* ── Density: global tier → base multipliers (D31). ──
|
|
364
|
-
* The tier writes ONLY the base; --density-gap/inset resolve from it (above),
|
|
365
|
-
* so a per-surface step can re-derive relative to the tier. */
|
|
366
|
-
[data-density="dense"] { --density-base-gap: 0.85; --density-base-inset: 0.85; }
|
|
367
|
-
[data-density="standard"] { --density-base-gap: 1; --density-base-inset: 1; }
|
|
368
|
-
[data-density="spacious"] { --density-base-gap: 1.15; --density-base-inset: 1.15; }
|
|
369
|
-
```
|
|
370
|
-
|
|
371
|
-
A log-stream inside a `standard` app resolves one step denser without pinning an absolute value.
|
|
372
|
-
Both levels reach the library's internals through one `@theme` line — every library padding and gap
|
|
373
|
-
utility is `calc(var(--spacing) × N)`, and `--density-gap` resolves per element (respecting a
|
|
374
|
-
`data-density-step` ancestor):
|
|
375
|
-
|
|
376
|
-
```css
|
|
377
|
-
/* density remap — the single line that scales ALL library spacing. Every p-* and
|
|
378
|
-
* gap-* is calc(var(--spacing) x N); driving --spacing off --density-gap flows the
|
|
379
|
-
* tier AND the per-surface density step into the library's internals. */
|
|
380
|
-
--spacing: calc(0.25rem * var(--density-gap));
|
|
381
|
-
```
|
|
382
|
-
|
|
383
|
-
**The two-weight discipline.** Operator UI carries exactly two font weights; the `@theme` map folds
|
|
384
|
-
the library's whole weight vocabulary onto them:
|
|
385
|
-
|
|
386
|
-
```css
|
|
387
|
-
/* font weight — two-weight discipline: medium/semibold/bold all resolve to the
|
|
388
|
-
* single emphasis weight; operator UI carries no third weight. normal is emitted
|
|
389
|
-
* as a literal because its theme key and the primitive share a name (no self-ref). */
|
|
390
|
-
--font-weight-normal: 400;
|
|
391
|
-
--font-weight-medium: var(--font-weight-strong);
|
|
392
|
-
--font-weight-semibold: var(--font-weight-strong);
|
|
393
|
-
--font-weight-bold: var(--font-weight-strong);
|
|
394
|
-
```
|
|
395
|
-
|
|
396
|
-
Fonts follow the same no-self-reference rule: `--font-sans`/`--font-mono` are emitted into `@theme`
|
|
397
|
-
as literal stacks (a font is not a runtime-toggled token, and the theme key shares the primitive's
|
|
398
|
-
name), while `personality.css` carries the same variables for direct `var()` use.
|
|
399
|
-
|
|
400
|
-
**Sidebar width — the style-prop seam.** The library hardcodes `--sidebar-width` /
|
|
401
|
-
`--sidebar-width-icon` as inline styles, overridable only via the provider's `style` prop — the one
|
|
402
|
-
layout primitive that cannot reach the library through `@theme`. The shell wires the personality
|
|
403
|
-
primitives in:
|
|
404
|
-
|
|
405
|
-
```tsx
|
|
406
|
-
<SidebarProvider
|
|
407
|
-
style={{
|
|
408
|
-
"--sidebar-width": "var(--sidebar-width-expanded)",
|
|
409
|
-
"--sidebar-width-icon": "var(--sidebar-width-collapsed)",
|
|
410
|
-
} as React.CSSProperties}
|
|
411
|
-
>
|
|
412
|
-
```
|
|
413
|
-
|
|
414
|
-
**Substrate limits — expected, never worked around.** Some values live in `@nurix/components` JS,
|
|
415
|
-
not CSS, so they do not follow tokens until the library adopts them (measured at 0.14.0; re-verify
|
|
416
|
-
on upgrades). This is user-owned upstream work — never patched with brittle per-instance overrides:
|
|
417
|
-
|
|
418
|
-
- **Chart palettes** — the d3 family's *defaults* embed literals, but the chart components accept
|
|
419
|
-
color props: scaffold's `src/lib/chart-colors.ts` wires `var(--chart-1..5)` through the series
|
|
420
|
-
props and the status roles (`--success`/`--warning`/`--destructive` + the accent/muted homes for
|
|
421
|
-
info/empty) through the BarGraph map, so charts inherit the theme today. Chart *chrome*
|
|
422
|
-
(gridlines, axis labels) stays hardcoded — a substrate limit, filed, never a skill defect.
|
|
423
|
-
- **Motion & icon stroke** — JS motion durations and icon `strokeWidth` numbers; `--duration-*` and
|
|
424
|
-
`--icon-stroke` reach consumer-emitted markup but not library internals. The density dial also
|
|
425
|
-
no-ops inside library tables (`h-8` row height).
|
|
426
|
-
- **Filled-control foreground** — `text-white` pinned on filled primary/destructive; the mapped
|
|
427
|
-
`--destructive-foreground` waits on the library reading it.
|
|
428
|
-
|
|
429
|
-
The stance: emit the complete token surface so the library "just works" the moment it adopts each
|
|
430
|
-
token; do not build an override layer that fights the library and rots.
|
|
431
|
-
|
|
432
|
-
## 5. Fonts — one derivation, not two authored artifacts (contract 2)
|
|
433
|
-
|
|
434
|
-
The artifact's font stacks and the project's installed fonts drift when they are two authored
|
|
435
|
-
artifacts — a package registering `"Inter Variable"` while the stack says `"Inter"` means the
|
|
436
|
-
flagship font silently never renders. Emission therefore derives both from one source:
|
|
437
|
-
|
|
438
|
-
- `--emit` additionally writes **`src/styles/fonts.css`** — the `@fontsource` import list
|
|
439
|
-
**generated from the artifact's `fontFamily` tokens**, resolved through `typography.csv`'s
|
|
440
|
-
`css-import` column (paste-ready static packages, registering the plain family names) with
|
|
441
|
-
`fonts-known.json` as the resolver fallback. The emitted stacks use the **registered** family
|
|
442
|
-
names. `globals.css` loads it first (Cascade Contract 2), so faces register before any stack
|
|
443
|
-
consumes them.
|
|
444
|
-
|
|
445
|
-
```css
|
|
446
|
-
/* Inter — @fontsource/inter */
|
|
447
|
-
@import '@fontsource/inter/400.css';
|
|
448
|
-
@import '@fontsource/inter/500.css';
|
|
449
|
-
@import '@fontsource/inter/600.css';
|
|
450
|
-
@import '@fontsource/inter/700.css';
|
|
451
|
-
|
|
452
|
-
/* Geist Mono — @fontsource/geist-mono */
|
|
453
|
-
@import '@fontsource/geist-mono/400.css';
|
|
454
|
-
```
|
|
455
|
-
|
|
456
|
-
**The check (cod-16, fail-closed at `--emit`).** Every family name in every emitted stack either
|
|
457
|
-
(a) matches a family registered by a generated import whose package exists in the emit target's
|
|
458
|
-
`package.json` (when the target is a project; a standalone target degrades to import-list
|
|
459
|
-
validation), or (b) is a recognized system/generic family (`system-ui`, `ui-monospace`,
|
|
460
|
-
`sans-serif`, `serif`, `monospace`, `ui-sans-serif`, the conventional OS fallback faces, …the
|
|
461
|
-
vocabulary is shared with the source-shell check in `lib/checks.mjs`). Failure exits non-zero
|
|
462
|
-
naming the unbound family and the exact package to install:
|
|
463
|
-
|
|
464
|
-
```
|
|
465
|
-
emit FAILED (<artifact-dir>): font binding (cod-16) — 1 unbound family
|
|
466
|
-
- "Inter" (emitted --font-sans stack): its registering import needs @fontsource/inter, absent from package.json — npm install @fontsource/inter
|
|
467
|
-
```
|
|
468
|
-
|
|
469
|
-
A consumer that installed the variable package instead (`@fontsource-variable/<slug>`, registering
|
|
470
|
-
the `"<Family> Variable"` name) also binds — the slug match strips the ` Variable` suffix. Brand
|
|
471
|
-
fonts with no `@fontsource` package fail the gate by design: swap to a bindable family, or register
|
|
472
|
-
the face via `@font-face` and record the deviation.
|
|
473
|
-
|
|
474
|
-
## 6. Emitter completeness — no authored group vanishes (contract 3)
|
|
475
|
-
|
|
476
|
-
Every authored token group has a named consumer in the emitted output; `--emit` fails if it
|
|
477
|
-
recognizes a group it has no emitter for — machinery that accepts data it never emits is a silent
|
|
478
|
-
contract breach (an authored ramp with no emitter simply vanishes). The registry: `primitive` (the
|
|
479
|
-
`[data-style]` block), `color` (the armored theme blocks), `typography` (the `@theme` ramp text
|
|
480
|
-
utilities; subgroups `family`/`ramp`), `elevation` (the shadow composites + utilities), `wash` (the
|
|
481
|
-
wash pair — optional presence). Against a scratch artifact carrying an unconsumed `spacing` group:
|
|
482
|
-
|
|
483
|
-
```
|
|
484
|
-
emit FAILED (<artifact-dir>): 1 issue(s)
|
|
485
|
-
- emitter completeness — authored token group "spacing" has no emitter (contract 3): an authored group with no emitter simply vanishes; add its emitter to this script or remove the group. Emitters exist for: primitive, color, typography, elevation, wash.
|
|
486
|
-
```
|
|
487
|
-
|
|
488
|
-
## 7. Dark and themes — the base set is light; the brief's theme binds
|
|
489
|
-
|
|
490
|
-
The base token set **is** the light rendering — light is never omitted, and the resolver's `light`
|
|
491
|
-
context is always the empty overlay. **The brief's stated theme is binding**: a dark-first look
|
|
492
|
-
sets `theme-default: dark` (payload and resolver both), scaffold writes `<html data-theme="dark">`,
|
|
493
|
-
and the app boots dark; light is the default only when the brief is silent. A look with dark values
|
|
494
|
-
ships `design.tokens.dark.json` — exactly the `color` group, all 36 roles, nothing else — named by
|
|
495
|
-
the resolver's `dark` context and overlaid per the resolution order. When it ships, emission adds
|
|
496
|
-
the armored dark context remapping all 36 roles (including the `surface-raised`/`surface-overlay`
|
|
497
|
-
lightness ladder — raised surfaces get *lighter* in dark, the physics shadows cannot fake):
|
|
498
|
-
|
|
499
|
-
```css
|
|
500
|
-
/* ── Dark theme — OPT-IN ONLY (this look ships a dark overlay). ──
|
|
501
|
-
* CASCADE CONTRACT 1b: :root[data-theme="dark"] (0,2,0) — a lone [data-theme="dark"]
|
|
502
|
-
* attribute selector (0,1,0) loses to the library's later bare :root block by source
|
|
503
|
-
* order. design.tokens.dark.json remaps all 36 color tokens; <html data-theme="dark">
|
|
504
|
-
* opts in (theme-default decides the boot attribute). */
|
|
505
|
-
:root[data-theme="dark"] {
|
|
506
|
-
```
|
|
507
|
-
|
|
508
|
-
For a light-only artifact (the shipped default is one), the emitted file carries a placeholder
|
|
509
|
-
comment instead:
|
|
510
|
-
|
|
511
|
-
```css
|
|
512
|
-
/* ── Dark theme — OPT-IN ONLY. ──
|
|
513
|
-
* Emitted only when the artifact ships a design.tokens.dark.json dark overlay,
|
|
514
|
-
* as :root[data-theme="dark"] (0,2,0 — armored against the library's later :root).
|
|
515
|
-
* This block never appears for a light-only project.
|
|
516
|
-
:root[data-theme="dark"] {
|
|
517
|
-
--background: ...; --foreground: ...; ... all 36 tokens remapped ...
|
|
518
|
-
} */
|
|
519
|
-
```
|
|
520
|
-
|
|
521
|
-
`--theme dark` selects the dark context and sets `<html data-theme="dark">` in the emitted
|
|
522
|
-
attributes (the header's `theme:` line follows). Requesting dark from a light-only artifact fails
|
|
523
|
-
cleanly — `node scripts/derive-personality.mjs data/design-tokens/nurix --check --theme dark`
|
|
524
|
-
prints:
|
|
525
|
-
|
|
526
|
-
```
|
|
527
|
-
check FAILED (data/design-tokens/nurix): 1 issue(s)
|
|
528
|
-
- rule 1 — resolver: theme dark selected but the resolver carries no dark context
|
|
529
|
-
```
|
|
530
|
-
|
|
531
|
-
**The `@custom-variant dark` line is always active.** The library's `dark:` utilities are
|
|
532
|
-
class-based; the emitted `globals.css` redefines the variant to follow the attribute — always, not
|
|
533
|
-
only when dark ships (the line is inert until `<html data-theme="dark">`, and library `dark:`
|
|
534
|
-
utilities — legal *inside* the library, banned in project JSX by the no-literals rule cod-05 —
|
|
535
|
-
must follow the same attribute the moment a dark set arrives):
|
|
536
|
-
|
|
537
|
-
```css
|
|
538
|
-
/* dark variant — ALWAYS ACTIVE: redefines the library's class-based dark: variant to
|
|
539
|
-
* follow the data-theme attribute, so library dark: utilities (legal inside the library,
|
|
540
|
-
* banned in project JSX by the no-literals rule) track the same attribute the theme
|
|
541
|
-
* blocks armor. Inert until <html data-theme="dark">; harmless for a light-only project. */
|
|
542
|
-
@custom-variant dark (&:where([data-theme="dark"], [data-theme="dark"] *));
|
|
543
|
-
```
|
|
544
|
-
|
|
545
|
-
**The `theme.ts` helper — one selector convention, four writers, zero disagreement.** Scaffold
|
|
546
|
-
emits `src/lib/theme.ts`: `getTheme`/`setTheme`/`toggleTheme` write the same `data-theme` attribute
|
|
547
|
-
the armor selectors and the `@custom-variant` read, persisting the preference; `initTheme()`
|
|
548
|
-
(called by `main.tsx` before mount) applies a stored preference over the boot attribute. Code is
|
|
549
|
-
the cache: the attribute is the single runtime theme state — the helper never keeps a parallel
|
|
550
|
-
copy. The four writers of the one convention: `personality.css` (the armored blocks), scaffold's
|
|
551
|
-
`<html data-theme>` (the boot value from `theme-default`), the `@custom-variant dark` line, and
|
|
552
|
-
`theme.ts` (the runtime toggle).
|
|
553
|
-
|
|
554
|
-
**The check (cod-15, on the render rung).** With the app rendered and `data-theme` flipped through
|
|
555
|
-
each theme context the resolver declares, the rendered
|
|
556
|
-
`getComputedStyle(document.documentElement).getPropertyValue('--background')` — plus
|
|
557
|
-
`--foreground`/`--primary` — must equal that context's authored values: rendered token drift is
|
|
558
|
-
measured *per theme context*, not just for the boot theme. Create runs invoke the rung with
|
|
559
|
-
`--require` (no headless browser → exit non-zero with the exact install command); improve keeps
|
|
560
|
-
graceful degradation, but its skip lands as a named finding, never a one-line notice.
|
|
561
|
-
|
|
562
|
-
Components never use `dark:` prefixes or literal colors regardless — the semantic tokens remap and
|
|
563
|
-
every surface follows (the semantic-token doctrine in the emitted header).
|
|
564
|
-
|
|
565
|
-
## 8. Precedence and provenance — which artifact gets emitted
|
|
566
|
-
|
|
567
|
-
Look resolution is project-first: a `project` or `extracted` artifact wins outright; a `library`
|
|
568
|
-
entry serves only when the brief names or resembles the product and the user confirms; the Nurix
|
|
569
|
-
default (`data/design-tokens/nurix/`) is worn when nothing else speaks. The origin is the payload's
|
|
570
|
-
`provenance` field, and the emitted header's `artifact:` line records it alongside the `sourced`
|
|
571
|
-
date — so the emitted CSS always says where its look came from. Create-authored artifacts may also
|
|
572
|
-
persist the full intake **look block** (`payload.look` — theme/anchors/delight/resolution/
|
|
573
|
-
resolution-mode, enum-checked when present); `theme-default` and the top-level `anchors` remain the
|
|
574
|
-
canonical projections emission consumes. The full precedence table, payload spec, and per-value
|
|
575
|
-
provenance convention (`$description`) are [SCHEMA.md](../data/design-tokens/SCHEMA.md).
|