@nadicodeai/design-system 5.3.6 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/DESIGN.md CHANGED
@@ -44,7 +44,6 @@ colors:
44
44
  warning: "#ffc220"
45
45
  warning-soft: "#fff3d1"
46
46
  warning-deep: "#7a5800"
47
- flag-red: "#d3302f"
48
47
  verde-vivo: "#008c45"
49
48
  selection-bg: "#111111"
50
49
  selection-fg: "#fafafa"
@@ -56,8 +55,6 @@ colors:
56
55
  state-review: "#ffc220"
57
56
  state-blocked: "#d3302f"
58
57
  state-complete: "#00a85a"
59
- background-100: "#ffffff"
60
- background-200: "#fafafa"
61
58
  identity-verde: "#00a85a"
62
59
  identity-rosso: "#d3302f"
63
60
  identity-arancio: "#ff5a1f"
@@ -110,9 +107,6 @@ colors:
110
107
  dark-info: "#8098ff"
111
108
  dark-info-soft: "#070f47"
112
109
  dark-info-deep: "#b3c1ff"
113
- dark-cyan: "#33d1cb"
114
- dark-cyan-soft: "#7ee8de"
115
- dark-cyan-deep: "#1f9e9a"
116
110
  dark-success: "#17bd68"
117
111
  dark-success-soft: "#00351c"
118
112
  dark-success-deep: "#93e3b8"
@@ -296,7 +290,7 @@ One foundation, three registers. The foundation is every `core` value in this co
296
290
 
297
291
  A register decides where a foundation value appears and adds rules of its own. It never redefines a foundation value and never mints one: a value its physics need and the foundation lacks is authored in this contract under `register.<name>`.
298
292
 
299
- The kernel is the reusable implementation layer. `DESIGN.md` defines the reusable contract and exported scalar tokens; the `@nadicodeai/design-system/css` bundle (`src/css/**`) demonstrates and exercises that contract. Homepage copy, page-specific ordering, and temporary prototypes do not belong in this file.
293
+ `DESIGN.md` defines the reusable contract and exported scalar tokens; the `@nadicodeai/design-system/css` bundle (`src/css/**`) realises that contract. Homepage copy, page-specific ordering, and temporary prototypes do not belong in this file.
300
294
 
301
295
  ## Colors
302
296
 
@@ -304,7 +298,7 @@ Neutrals carry the interface: grounds, chrome, hierarchy, and every control come
304
298
 
305
299
  Interaction states are material, not meaning: focus, hover, and selection read as contrast steps on the neutral spine. A hover ground is a neutral step; the only change a control hover carries is a step inside its own family, as `{colors.action-hover}` does on the action control. Cobalto stays on info and running.
306
300
 
307
- Every value a role needs is carried by the role token itself; the ten-step numeric scale families were removed deliberately and must not be reintroduced. Two neutral page grounds sit under the roles below: `{colors.background-100}` (page default, white) and `{colors.background-200}` (soft, used sparingly). The neutral spine — `{colors.ink}`, `{colors.body}`, `{colors.muted}`, `{colors.canvas}`, `{colors.canvas-soft}`, `{colors.canvas-soft-2}`, `{colors.line}`, `{colors.seam}` — is strictly achromatic: every neutral is an equal-channel gray (OKLCH chroma 0) in both themes. The five identity-palette hues are cross-spectrum equals, so any neutral bias would flatter one and dirty another; hue arrives full-strength through the chromatic roles or not at all, and no tint ever paints an app surface. Colours are authored as sRGB hex here and emitted as `oklch()` in the generated CSS.
301
+ Every value a role needs is carried by the role token itself; there is no numeric scale family. The neutral spine — `{colors.ink}`, `{colors.body}`, `{colors.muted}`, `{colors.canvas}`, `{colors.canvas-soft}`, `{colors.canvas-soft-2}`, `{colors.line}`, `{colors.seam}` — is strictly achromatic: every neutral is an equal-channel gray (OKLCH chroma 0) in both themes. The five identity-palette hues are cross-spectrum equals, so any neutral bias would flatter one and dirty another; hue arrives full-strength through the chromatic roles or not at all, and no tint ever paints an app surface. Colours are authored as sRGB hex here and emitted as `oklch()` in the generated CSS.
308
302
 
309
303
  ### Semantic roles (functional tier)
310
304
 
@@ -318,8 +312,7 @@ Every value a role needs is carried by the role token itself; the ten-step numer
318
312
  - **Navigation selection** (`{colors.navigation-selection-bg}`, `{colors.navigation-selection-fg}`, `{colors.navigation-selection-hover}`): the selected destination in persistent product navigation, a neutral ink pill. Selection is a place, not a meaning, so it holds by contrast on the neutral spine; cobalto belongs to the semantic info and running roles only. The dark counterparts are tuned independently for the black console. Resting and hover pairs clear AA for text, and the offset focus outline stays visible against both the pill fill and the adjacent canvas.
319
313
  - **Semantic feedback** (`{colors.success}` = verde with `{colors.success-soft}`/`{colors.success-deep}`; `{colors.error}` = rosso funzionale `#d3302f` with `{colors.error-soft}`/`{colors.error-deep}`; `{colors.warning}` = giallo `#ffc220` with `{colors.warning-soft}`/`{colors.warning-deep}`; `{colors.info}` = cobalto `#1e3cff` with `{colors.info-soft}`/`{colors.info-deep}`): validation, caution, approval, and operational feedback. In each pair the `-soft` value is the tinted tag/banner ground and the `-deep` value is the AA-clearing text on it. On a solid `error` fill (the shadcn `destructive` role) text is white; on a solid `warning` or `success` fill text is ink. The success pair intentionally reuses the link pair's AA-safe verde values; its feedback meaning remains distinct from inline navigation and entity-status semantics.
320
314
  - **Accent** (`{colors.accent}` = arancio `#ff5a1f`): a small emphasis mark for exception flags and highlights; it appears as a mark, carries no text, and paints no fill or background. The identically-named shadcn surface role is a different thing — a neutral (`{colors.canvas-soft-2}` light, `{colors.dark-canvas-soft-2}` dark) with no hue.
321
- - **Flag Red** (`{colors.flag-red}` = `#d3302f`): the identity-mark red alias. It shares its hex with `{colors.error}` but stays a distinct role name — `flag-red` is identity, `error` is validation feedback. The attention accent is arancio, not flag red.
322
- - **Verde vivo** (`{colors.verde-vivo}` = `#008c45`, dark `{colors.dark-verde-vivo}` = `#62d494`): Nadia's presence accent. It paints the marks that say *Nadia herself is here*: the first-run medallion, a live-presence indicator beside her portrait. It is a mark colour, never a control fill, a text colour, a link, or a status; `action`, `link`, and `success` keep their jobs. It clears the 3:1 non-text floor on `{colors.canvas}` (4.3:1) and `{colors.dark-canvas}` (11.4:1) and carries no text of its own. White on it is 4.34:1, below AA for normal text, so a label never sits on a `verde-vivo` fill; the ring, halo, or portrait sits on it and the words sit on the canvas.
315
+ - **Verde vivo** (`{colors.verde-vivo}` = `#008c45`, dark `{colors.dark-verde-vivo}` = `#62d494`): Nadia's presence accent. It paints the marks that say *Nadia herself is here*, such as the success beat over her silhouette at a threshold (`@nadicodeai/ui/threshold`). It is a mark colour, never a control fill, a text colour, a link, or a status; `action`, `link`, and `success` keep their jobs. It clears the 3:1 non-text floor on `{colors.canvas}` (4.3:1) and `{colors.dark-canvas}` (11.4:1) and carries no text of its own. White on it is 4.34:1, below AA for normal text, so a label never sits on a `verde-vivo` fill; the ring, halo, or portrait sits on it and the words sit on the canvas.
323
316
  - **Workflow States** (`{colors.state-ready}` neutral, `{colors.state-running}` cobalto, `{colors.state-review}` giallo, `{colors.state-blocked}` rosso, `{colors.state-complete}` verde): the left-border/state vocabulary for agentic work surfaces — cobalto means in motion, verde means done. The dark counterparts (`{colors.dark-state-ready}`, `{colors.dark-state-running}`, `{colors.dark-state-review}`, `{colors.dark-state-blocked}`, `{colors.dark-state-complete}`) keep the same functional identity. These colours are carried by non-text state accents only — meter and bullet segments, delta marks, and the brand book's own rails; label text stays on the neutral foreground roles for contrast in both themes. Status is not one of their jobs: every status the product renders is the Badge status vocabulary (see `## Status Vocabulary`), which reads from the semantic feedback and link pairs, and the two token sets never cross.
324
317
 
325
318
  ### Chart categoricals (functional tier)
@@ -337,8 +330,6 @@ Five full-strength hues are the system's expressive chromatic range: verde `{col
337
330
 
338
331
  This achromatic-neutral discipline is not dark-specific: it governs the generated shadcn surface-role bridge in both the light `:root` and dark `.dark` maps. The neutral surface family — `background`, `card`, `popover`, `muted`, `secondary`, `sidebar`, `sidebar-accent`, their neutral foreground/border variants, plus `border` and `input` — resolves only to exact equal-channel grays (OKLCH chroma 0) in both themes. Hue in the role bridge is reserved for the explicit semantic roles `destructive`, `success`, and `warning`; `primary` resolves to the neutral action family. The focus rings (`ring`/`sidebar-ring`) and the `sidebar-primary*` navigation-selection family resolve to equal-channel grays like the surface family: focus and selection are material states, and no interaction state carries a hue. In dark product shells, `background`, `card`, `popover`, and `sidebar` share `{colors.dark-canvas}` so page chrome, cards, tables, overlays, and nav rails read as one console. `muted`, `secondary`, and `accent` retain the `dark-canvas-soft` steps for small interaction states such as hover, selected rows, keycaps, and inline controls. Large product surfaces never take a tinted or soft-panel fill by default.
339
332
 
340
- A colour leaves this contract only through an explicit palette migration decision; what the current website kernel happens to consume is not palette authority.
341
-
342
333
  ## Data Visualization
343
334
 
344
335
  ### Entity-color assignment
@@ -352,7 +343,7 @@ A colour leaves this contract only through an explicit palette migration decisio
352
343
 
353
344
  ### Meter and bullet grammar
354
345
 
355
- - **Meter and bullet grammar**: cap and included-usage bars carry a positional threshold tick at the product-configured warning fraction (80% is the common default; the fraction is a consumer input, never a constant of this contract) and a cap tick at 100%. Overflow renders as a distinct segment continuing past the cap tick, never clamped away. Severity state tokens (`{colors.state-*}`) reinforce position, never act as the sole signal. The current value reads at the bar tip. Every meter carries an accessible name, and its `aria` values clamp to the meter maximum. A meter has two scales. At panel scale the grammar above holds whole. At row scale — a meter inside a membership row, shown only once the value is already past the warning rung — it is a warning rather than a gauge: it drops both ticks and the tip value for a percent and a thin bar on one line, because a row cannot encode position legibly and the reader is asking how close the wall is, not how many. The overflow segment and the accessible name survive at both scales; the words a caption would have printed live in that name.
346
+ - **Meter and bullet grammar**: cap and included-usage bars carry a positional threshold tick at the product-configured warning fraction (80% is the common default; the fraction is a consumer input, never a constant of this contract) and a cap tick at 100%. Overflow renders as a distinct segment continuing past the cap tick, never clamped away. Severity state tokens (`{colors.state-*}`) reinforce position, never act as the sole signal. The current value reads at the bar tip. Every meter carries an accessible name, and its `aria` values clamp to the meter maximum. A meter has two scales. At panel scale the grammar above holds whole. At row scale — a meter inside a list row, shown only once the value is already past the warning rung — it is a warning rather than a gauge: it drops both ticks and the tip value for a percent and a thin bar on one line, because a row cannot encode position legibly and the reader is asking how close the wall is, not how many. The overflow segment and the accessible name survive at both scales; the words a caption would have printed live in that name.
356
347
 
357
348
  ### Mark specs
358
349
 
@@ -378,11 +369,11 @@ All body, title, caption, and code typography uses `letterSpacing: 0px`. Do not
378
369
 
379
370
  | Token | Size | Weight | Line Height | Use |
380
371
  | ----------------------------- | ---- | ------ | ----------- | -------------------------------------------------------------------------- |
381
- | `{typography.display-xl}` | 72px | 600 | 74px | Large desktop homepage hero only. |
372
+ | `{typography.display-xl}` | 72px | 600 | 74px | Hero headline at the widest breakpoint. |
382
373
  | `{typography.display-lg}` | 52px | 600 | 54px | Compact hero and major landing headlines. |
383
- | `{typography.display-md}` | 24px | 600 | 32px | Recovered display tier for compact cards, pricing names, and asset labels. |
384
- | `{typography.display-sm}` | 20px | 600 | 28px | Recovered small display tier for inline display micro-headings. |
385
- | `{typography.title-lg}` | 40px | 600 | 41px | Kernel specimen headings and major section headings. |
374
+ | `{typography.display-md}` | 24px | 600 | 32px | Compact display tier: action bands, plan names, a threshold's sentence. |
375
+ | `{typography.display-sm}` | 20px | 600 | 28px | Small display tier for inline display headings. |
376
+ | `{typography.title-lg}` | 40px | 600 | 41px | Major section headings. |
386
377
  | `{typography.title-md}` | 30px | 600 | 32px | Standard section title. |
387
378
  | `{typography.title-sm}` | 22px | 600 | 25px | Cell and artifact titles. |
388
379
  | `{typography.body-lg}` | 18px | 400 | 27px | Hero/lead paragraphs. |
@@ -394,7 +385,7 @@ All body, title, caption, and code typography uses `letterSpacing: 0px`. Do not
394
385
  | `{typography.caption-strong}` | 12px | 500 | 16px | Compact emphasised labels on chrome and chips. |
395
386
  | `{typography.caption-mono}` | 12px | 500 | 16px | Eyebrows, identifiers and code. |
396
387
  | `{typography.code}` | 13px | 400 | 20px | Tool calls, snippets, traces. |
397
- | `{typography.button-lg}` | 16px | 500 | 24px | Marketing-scale button labels. |
388
+ | `{typography.button-lg}` | 16px | 500 | 24px | Large button labels. |
398
389
  | `{typography.button-md}` | 14px | 500 | 18px | Standard button and control labels. |
399
390
 
400
391
  ## Layout
@@ -473,7 +464,7 @@ Height tokens are fixed by component family and breakpoint. Components may grow
473
464
 
474
465
  Page shells must prevent horizontal scrollbars when a mathematically aligned full-bleed surface uses viewport width. Clip horizontal overflow at the shell/root level; do not hide overflow on structural cells to mask bad seam math.
475
466
 
476
- Kernel compositions arrange approved primitives for a content role. They must not redefine page-frame math, row seams, marker placement, side-fill ownership, active-lane spans, or global guide primitives. If a composition needs new structural geometry, promote that geometry into the page grammar or a real component first.
467
+ Compositions arrange approved primitives for a content role. They must not redefine page-frame math, row seams, marker placement, side-fill ownership, active-lane spans, or global guide primitives. If a composition needs new structural geometry, promote that geometry into the page grammar or a real component first.
477
468
 
478
469
  ### Delivery Tiers
479
470
 
@@ -513,16 +504,14 @@ Page grammar is the NadicodeAI structural system. It defines how pages are built
513
504
 
514
505
  **`rule-svg`** — bounded dashed connector rule. Uses `{colors.seam}` and never overlaps a cell seam.
515
506
 
516
- The generic marketing/SaaS section patterns (Nav, Hero, Logo cloud, Statement, Texture strip, Feature grid, Feature rows, Bento, Steps, Integrations, Live demo, Stats, Testimonial, Security/data, Pricing, FAQ, Team, Contact, CTA band, Footer) ship as React shadcn compositions from `@nadicodeai/ui`, composed over the kept page grammar above. This contract no longer documents them as a pure-CSS section layer; the page grammar is the framework-agnostic foundation those compositions assemble.
507
+ Reusable section compositions ship as React components from `@nadicodeai/ui`, composed over the page grammar above; the page grammar is the framework-agnostic foundation they assemble.
517
508
 
518
509
  ### Related Layout Helpers
519
510
 
520
- These live helpers are part of the kept page-grammar layout layer. They support index/long-form page assemblies rather than naming an interface component.
511
+ This live helper is part of the kept page-grammar layout layer. It supports index-style page assemblies rather than naming an interface component.
521
512
 
522
513
  **`index-grid`** — layout helper for index-style page assemblies (blog, learn, and case-study rows whose guide layer owns the dividers).
523
514
 
524
- **`article-frame`** — layout helper for the long-form reading companion in article/index page assemblies.
525
-
526
515
  `index-card` is the repeated item class inside `index-grid`, not a standalone contract key.
527
516
 
528
517
  ## Elevation & Depth
@@ -531,7 +520,7 @@ Product UI uses one shared material ladder. The workspace is one continuous grou
531
520
 
532
521
  Glass is a material variant, not an elevation step. Floating chrome may be glass: menus, popovers, selects, comboboxes, the command palette, and bars, the surfaces that stand over the room and show it through themselves. Content surfaces stay solid: cards, KPIs, tables, inspectors, and dialog, sheet, and drawer bodies, because glass floats but never carries content. Inside the window, glass composites only over our own content; a product whose window the operating system composites states its window material in its register. Glass keeps exactly one separator, the integrated edge ring of its elevation falloff, never ring plus shadow plus border stacked. Reduced-transparency mode replaces glass with the same solid material at the same elevation.
533
522
 
534
- The Google design schema defines no opacity, elevation, or motion group. Those values are authored in the one `json design-tokens` fence under "CSS Architecture & Token Pipeline", "Authored token extension". `core.material` holds the four values this section applies and emits them as `--nc-material-*`: `scrim-opacity` becomes the theme layer's `--opacity-scrim`, and the three glass values are consumed by `@nadicodeai/ui/globals.css`. `core.elevation` holds the four rungs and emits `--nc-elevation-resting`, `-raised`, `-floating`, and `-modal`.
523
+ The material and elevation values are authored in the one `json design-tokens` fence under "CSS Architecture & Token Pipeline", "Authored token extension". `core.material` holds the four values this section applies and emits them as `--nc-material-*`: `scrim-opacity` becomes the theme layer's `--opacity-scrim`, and the three glass values are consumed by `@nadicodeai/ui/globals.css`. `core.elevation` holds the four rungs and emits `--nc-elevation-resting`, `-raised`, `-floating`, and `-modal`.
535
524
 
536
525
  | Material role | Construction | Use |
537
526
  | ------------- | ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
@@ -568,7 +557,7 @@ Public page-grammar cells are not cards and remain square because their parent f
568
557
 
569
558
  Motion reports state: things move when something changes, briefly, and settle. Continuous, ambient motion is scarce and purposeful — the Agent identity visuals are its natural carrier — and repeated interactions stay fast and quiet. Motion preserves meaning when movement is reduced.
570
559
 
571
- The durations and easings live in `core.motion` of the authored token extension ("CSS Architecture & Token Pipeline"); the Google design schema defines no motion group. The build emits every duration as `--nc-duration-*` and every easing as `--nc-ease-*`. `src/css/motion.css` owns the keyframes, the `nc-anim-*` and `nc-transition-*` classes, and the reduced-motion law, and references those names; it declares no duration, easing, or alias of its own. A register decides where motion appears; it never picks a duration outside this list.
560
+ The durations and easings live in `core.motion` of the authored token extension ("CSS Architecture & Token Pipeline"). The build emits every duration as `--nc-duration-*` and every easing as `--nc-ease-*`. `src/css/motion.css` owns the keyframes, the `nc-anim-*` and `nc-transition-*` classes, and the reduced-motion law, and references those names; it declares no duration, easing, or alias of its own. A register decides where motion appears; it never picks a duration outside this list.
572
561
 
573
562
  | Token | Use |
574
563
  | --- | --- |
@@ -596,7 +585,7 @@ A register adds rules. It never redefines a foundation value. A value one regist
596
585
  | Portal | `apps/portal/docs/design-doctrine.md` | `register.portal.density`: `filter-chip-gap`, `filter-chip-height`, `filter-chip-icon` | System, light, dark, on the `.dark` class |
597
586
  | Nadia desktop app | `apps/nadia/docs/design-doctrine.md` | `register.nadia.*`: colour-role and radius aliases; six deprecated elevation recipes and the legacy overlay border remain as compatibility data. New surfaces consume the foundation's material roles | Follows the operating system, on the `.dark` class |
598
587
 
599
- The website's depth is flat and architectural: hairlines, contrast, dotted fields, diagonal fills, and dark action bands make hierarchy, and the page frame and row grid stay dominant. It uses no rung of the material ladder and no floating card stack as page structure. Marketing bands may use `register.website.layout.section`, emitted as `--nc-section`, when they need the broader inherited hero rhythm. The website kernel uses no negative letter spacing outside the two display tiers.
588
+ The website's depth is flat and architectural: hairlines, contrast, dotted fields, diagonal fills, and dark action bands make hierarchy, and the page frame and row grid stay dominant. It uses no rung of the material ladder and no floating card stack as page structure. Marketing bands may use `register.website.layout.section`, emitted as `--nc-section`, when they need the broader inherited hero rhythm. The website uses no negative letter spacing outside the two display tiers.
600
589
 
601
590
  The Portal and the desktop are product shells on the material ladder above, each by its rulebook. The desktop's window material is the operating system's where the OS composites the window; inside the window the foundation's glass law holds.
602
591
 
@@ -614,7 +603,7 @@ Keyboard focus has one owner: the kit's foundation layer draws the full-opacity
614
603
 
615
604
  **`badge-secondary`** — small rounded metadata badge for "New", "Beta", "Live", or similar labels.
616
605
 
617
- **`filter-chip`** — removable selected-filter label. Neutral chrome only: `{colors.line}` border, muted/background fill, foreground text, compact radius, and an inline remove icon with a visible `:focus-visible` ring. It names the active facet/value pair and clears that facet; it does not carry lifecycle, workflow, product-tier, or feature-state color. Use this for table/search filters after a shadcn `Select`, `Popover`, or command filter is applied.
606
+ **`filter-chip`** — removable selected-filter label. Neutral chrome only: `{colors.line}` border, muted/background fill, foreground text, compact radius, and an inline remove icon with a visible `:focus-visible` ring. It names the active facet/value pair and clears that facet; it does not carry lifecycle, workflow, product-tier, or feature-state color.
618
607
 
619
608
  **`link-inline`** — inline body link. Uses `{colors.link}` and normal body rhythm.
620
609
 
@@ -643,46 +632,38 @@ Agent identity is decorative product identity, not a work artifact or a status s
643
632
  ## Status Vocabulary
644
633
 
645
634
  Status is the one thing every surface in the product says: an agent is active, a
646
- key is revoked, an invitation is waiting, a run is blocked. It is said one way.
647
-
648
- **What it is.** The single status carrier is the React `Badge` from
649
- `@nadicodeai/ui`, rendered in one of five semantic tones with a small mark in
650
- its icon slot. It is not a CSS component in this package: there is no
651
- framework-neutral status class, and a static surface that needs to show a status
652
- shows it as ordinary text. Its React API — the tone variants, the icon slot, and
653
- what a consuming app must supply — is contracted in
654
- [`packages/ui/docs/contract.md`](../ui/docs/contract.md).
655
-
656
- **Why.** A status read by colour alone is not read by everyone, and a product
657
- that speaks status in three grammars teaches its next surface to invent a
658
- fourth. One badge, carrying an icon and a word with the tone only reinforcing
659
- both, is legible without colour and leaves nothing to invent.
660
-
661
- **What it does.** Five tones, each a soft ground with its deep label from an
662
- existing semantic pair: gray on the neutral spine for the default and every
663
- terminal, no-action state; green on the link pair for healthy and complete; red
664
- on the error pair for unusable and failed; amber on the warning pair for waiting
665
- on a decision; blue on the info pair for a step in motion. One mark per tone, so
666
- the shape repeats the tone rather than adding a second axis. The families —
667
- which statuses exist and which tone each value takes — belong to the consuming
668
- app, because they are its domain, not this contract's; the Portal keeps its
669
- whole map in one module and no surface picks a status colour anywhere else.
635
+ key is revoked, an invitation is waiting, a run is blocked. It is said one way:
636
+ one badge carrying an icon and a word, in one of five semantic tones that only
637
+ reinforce both, so a status is legible without colour and no surface invents a
638
+ second grammar.
639
+
640
+ Each tone pairs a soft ground with its deep label from an existing semantic
641
+ pair: gray on the neutral spine for the default and every terminal, no-action
642
+ state; green on the link pair for healthy and complete; red on the error pair
643
+ for unusable and failed; amber on the warning pair for waiting on a decision;
644
+ blue on the info pair for a step in motion. One mark per tone, so the shape
645
+ repeats the tone rather than adding a second axis.
646
+
647
+ The carrier is the React `Badge` in `@nadicodeai/ui`, contracted in
648
+ [`packages/ui/docs/contract.md`](../ui/docs/contract.md). This package ships no
649
+ status class; a static surface shows a status as ordinary text. Which statuses
650
+ exist and which tone each takes belong to the consuming app, which keeps its
651
+ whole map in one module.
670
652
 
671
653
  ## System activity
672
654
 
673
- System activity, measured progress and settled status share the foundation's
674
- visual language. Activity is transient: it communicates ongoing work, then
675
- gives way to content or outcome feedback. The shared activity family uses
676
- neutral ink for its structure and the cobalto info role for moving foreground
677
- particles. The existing success, warning and error roles keep their meanings.
655
+ System activity, measured progress and settled status share one visual
656
+ language. Activity is transient: it communicates ongoing work, then gives way
657
+ to content or outcome feedback. The activity family uses neutral ink for its
658
+ structure and the cobalto info role for moving foreground particles; success,
659
+ warning and error keep their meanings. Measurable completion uses progress,
660
+ and waiting for a person or a failed operation uses the feedback treatment.
678
661
 
679
- `ActivityOrb` in `@nadicodeai/ui` renders three distinct activities: loading,
680
- connecting and processing. Its closed motion recipes, operation mapping,
662
+ The renderer is `ActivityOrb` in `@nadicodeai/ui`, with three activities:
663
+ loading, connecting and processing. Its motion recipes, operation mapping,
681
664
  sizes and runtime behaviour are owned by
682
- [`packages/ui/docs/activity.md`](../ui/docs/activity.md). A consuming app
683
- chooses the actual activity and supplies its readable meaning. Measurable
684
- completion uses progress, and waiting for a person or a failed operation uses
685
- the existing feedback treatment.
665
+ [`packages/ui/docs/activity.md`](../ui/docs/activity.md); a consuming app
666
+ chooses the activity and supplies its readable meaning.
686
667
 
687
668
  ## Do's and Don'ts
688
669
 
@@ -692,7 +673,6 @@ This section states the correct form; a complete positive definition is the whol
692
673
  - Every visible line has one owner: ordinary seams are `{spacing.guide}` at `{colors.line}`, tuned only at the token contract; control boundaries are `{colors.input}` / `{colors.dark-input}`; keyboard focus is the dedicated focus-ring roles; crosshairs are `{colors.cross}` at `{spacing.guide}` weight.
693
674
  - Page structure is architectural: hairlines, luminance, spacing, and the grammar above. One material role per product container; structural page-grammar cells are border-only; the four `nc-elevation-*` rungs are the complete shadow vocabulary; modal scrims stay unblurred.
694
675
  - Typography uses fixed token sizes stepped by breakpoint; components take their default heights from the exported height tokens and grow only when real content requires it.
695
- - Each row carries one story beat; the full-lane `stage` presents one major use-case story; pricing, logo, banner, and showcase compositions appear when the page truly contains that content, with real, approved material.
696
676
  - Agent identity visuals identify an Agent or its explicit type; conversations, artifacts, review states, and work output belong to assistant-ui and the agentic work surfaces. Text beside `{colors.verde-vivo}` sits on the canvas.
697
677
  - Components are named as NadicodeAI-owned primitives, and this file carries contract only: tokens, semantics, and application rules — component prop APIs, state matrices, screenshots, and page-specific material live with their owners.
698
678
  - Each register keeps its own structure and chrome: the page grammar on the website, the material ladder in the Portal and the desktop, the desktop window following the operating system.
@@ -715,9 +695,35 @@ complete the treatment. Static and React icon sources stay version-aligned so a
715
695
  glyph has one silhouette everywhere. Text-paired icons are decorative; icon-only
716
696
  controls carry an accessible name.
717
697
 
698
+ ## Brand media authority
699
+
700
+ The NadicodeAI logo has three approved forms:
701
+
702
+ 1. **Horizontal lockup.** One interlocked-link mark followed by one NadicodeAI wordmark. The mark sits on the left, is scaled to the wordmark's capital height, and shares its baseline. Use this form when a company identifier needs both the mark and the readable name.
703
+ 2. **Mark.** The two interlocked rounded-square links may stand alone where space is tight: favicons, app icons, avatars, watermarks, stamps, and compact navigation. A containing link or control names NadicodeAI when the mark is used without visible text.
704
+ 3. **Wordmark.** The NadicodeAI letterforms may stand alone where the name must read by itself, including document headers and editorial layouts.
705
+
706
+ Other companies' marks are not NadicodeAI company logos and are not governed by anything in this section. They are generated identity images owned by `@nadicodeai/ui/components/brand-icons`; [`packages/ui/docs/contract.md`](../ui/docs/contract.md) carries their rules. A third-party mark never enters a NadicodeAI logo form, composition, or clear-space measurement.
707
+
708
+ Nadia's portrait, Agent identity visuals, and generated imagery are not NadicodeAI company logos. Nadia's identity and selection rules live in [`brand/AGENTS.md`](../../brand/AGENTS.md); the Agent identity system lives in [`packages/ui/docs/agent-visual.md`](../ui/docs/agent-visual.md); editorial imagery routes through [`skills/marketing/blog-imagegen/references/editorial-register.md`](../../skills/marketing/blog-imagegen/references/editorial-register.md). This contract owns only the package delivery interface.
709
+
710
+ The approved transparent Nadia master ships at `assets/nadia-solid-surface`. Package delivery does not grant brand approval; which Nadia image a surface may use stays with the identity document named above.
711
+
712
+ All three forms derive from one authored, framework-neutral geometry source exported as `@nadicodeai/design-system/assets/logo-geometry`. The lockup combines the shared mark and wordmark geometry at the established proportion and spacing. No SVG, React component, favicon, document, or app re-authors, traces, typesets, or rearranges those shapes.
713
+
714
+ Use the positive form on `{colors.canvas}` and the soft neutral canvases: ink letterforms and link with the primary verde link and `AI` suffix. Use the inverse form on `{colors.identity-ink}`: `{colors.identity-white}` letterforms and link with the dark-primary verde link and `AI` suffix. On `{colors.identity-verde}`, use the supplied on-verde form with one ink link and one white link. On photography, place the logo in a quiet area or over a scrim that keeps every part legible; when neither is available, mount it on an approved solid field. One surface uses one treatment.
715
+
716
+ The clear-space unit is the rendered width of one link stroke in the mark. Keep at least one unit free on every side of the mark and lockup, with no text, rule, image, or container edge inside it. A wordmark used alone keeps the same unit that the mark would have at the wordmark's capital height. Minimum rendered sizes are 16 CSS pixels or 5 mm for the mark, 130 CSS pixels or 32 mm wide for the lockup, and 96 CSS pixels or 25 mm wide for the wordmark. Browser and operating-system icon slots use the supplied favicon or app-icon files at the platform's required size and are exempt from the screen minimum. Never compress, crop, or distort a logo to fit.
717
+
718
+ For a meaningful standalone image, use the accessible name `NadicodeAI`; the accessible name is the label that identifies an image, link, or control to assistive technology. When a containing link or control already has that accessible name, hide the logo image from assistive technology with empty alt text. Never repeat the same accessible name on both the container and the image.
719
+
720
+ Do not redraw, retype, reorder, stretch, crop, rotate, recolor, outline, shadow, animate, or add effects or gradients to a logo form. Do not flatten the over-under interlock, add a third link, alter the proportions or lockup spacing, stack the forms, embed the mark inside the wordmark, place the mark after the wordmark, combine it with another mark, or substitute Nadia imagery for it.
721
+
722
+ The package build renders and publicly exports full-colour, mono-ink, inverse, and on-verde SVG and transparent PNG files for the lockup, mark, and wordmark from the geometry and current `colors.*` contract. React consumers use `BrandLockup`, `BrandMark`, or `BrandWordmark` according to the roles above. The operator-only favicon generator wraps the same mark geometry in the platform tile and may adapt tile radius, output size, and fixed-tile paint roles; it does not substitute another mark. Private geometry templates do not ship. A contract or geometry change is completed by regeneration, never by repainting an output or updating a fallback by hand.
723
+
718
724
  ## CSS Architecture & Token Pipeline
719
725
 
720
- How this contract becomes shipped CSS. The private CSS authoring graph lives in `src/css/`; the build flattens that graph and inlines its component icon dependencies into the single public `dist/css/index.css` artifact exported as `@nadicodeai/design-system/css`. Generated files and partials never ship as package subpaths. The cascade is `@layer tokens, theme, reset, foundation, motion, layout, primitives, components;` with no `sections` layer. Since the Tailwind+shadcn migration, the bundle ships only framework-agnostic brand and display CSS components. Generic marketing/SaaS components and the former `sections/*` layer ship as React components from `@nadicodeai/ui`.
726
+ How this contract becomes shipped CSS. The private CSS authoring graph lives in `src/css/`; the build flattens that graph and inlines its component icon dependencies into the single public `dist/css/index.css` artifact exported as `@nadicodeai/design-system/css`. Generated files and partials never ship as package subpaths. The cascade is `@layer tokens, theme, reset, foundation, motion, layout, primitives, components;` with no `sections` layer. The bundle ships only framework-agnostic brand and display CSS components; generic marketing and SaaS components ship as React components from `@nadicodeai/ui`.
721
727
 
722
728
  ### Public style interfaces
723
729
 
@@ -957,8 +963,7 @@ An alias is written in the short `{core.color.canvas}` form here; the build rewr
957
963
  "sidebar-background": {"$value":"{core.color.canvas-soft}"},
958
964
  "sidebar-border": {"$value":"{core.color.line}"},
959
965
  "user-bubble": {"$value":"{core.color.canvas-soft-2}"},
960
- "user-bubble-border": {"$value":"{core.color.line}"},
961
- "medallion": {"$value":"{core.color.verde-vivo}"}
966
+ "user-bubble-border": {"$value":"{core.color.line}"}
962
967
  },
963
968
  "dark": {
964
969
  "$type": "color",
@@ -981,13 +986,12 @@ An alias is written in the short `{core.color.canvas}` form here; the build rewr
981
986
  "ring": {"$value":"{core.color.dark-focus-ring}"},
982
987
  "midground": {"$value":"{core.color.dark-muted}"},
983
988
  "composer-ring": {"$value":"{core.color.dark-focus-ring}"},
984
- "destructive": {"$value":"{core.color.flag-red}"},
989
+ "destructive": {"$value":"{core.color.error}"},
985
990
  "destructive-foreground": {"$value":"{core.color.on-primary}"},
986
991
  "sidebar-background": {"$value":"{core.color.dark-canvas}"},
987
992
  "sidebar-border": {"$value":"{core.color.dark-seam}"},
988
993
  "user-bubble": {"$value":"{core.color.dark-canvas-soft-2}"},
989
- "user-bubble-border": {"$value":"{core.color.dark-line}"},
990
- "medallion": {"$value":"{core.color.dark-verde-vivo}"}
994
+ "user-bubble-border": {"$value":"{core.color.dark-line}"}
991
995
  }
992
996
  },
993
997
  "radius": {
@@ -1111,32 +1115,6 @@ The private source entry imports all three generated files, and the package buil
1111
1115
 
1112
1116
  `npm run build` also writes the two DTCG artifacts above and `dist/tailwind/nadicode.tailwind.json` as generated, tracked data artifacts, and bakes `dist/icons/` from the pinned `lucide-static` dependency. The Tailwind export stays for what it uniquely supplies: the typography line-height with its declared unit, which the DTCG composite normaliser strips, and the logo paint lookup.
1113
1117
 
1114
- #### Brand media authority
1115
-
1116
- The NadicodeAI logo has three approved forms:
1117
-
1118
- 1. **Horizontal lockup.** One interlocked-link mark followed by one NadicodeAI wordmark. The mark sits on the left, is scaled to the wordmark's capital height, and shares its baseline. Use this form when a company identifier needs both the mark and the readable name.
1119
- 2. **Mark.** The two interlocked rounded-square links may stand alone where space is tight: favicons, app icons, avatars, watermarks, stamps, and compact navigation. A containing link or control names NadicodeAI when the mark is used without visible text.
1120
- 3. **Wordmark.** The NadicodeAI letterforms may stand alone where the name must read by itself, including document headers and editorial layouts.
1121
-
1122
- Other companies' marks are not NadicodeAI company logos and are not governed by anything in this section. They are generated identity images owned by `@nadicodeai/ui/components/brand-icons`; [`packages/ui/docs/contract.md`](../ui/docs/contract.md) carries their rules. A third-party mark never enters a NadicodeAI logo form, composition, or clear-space measurement.
1123
-
1124
- Nadia's portrait, Agent identity visuals, and generated imagery are not NadicodeAI company logos. Nadia's identity and selection rules live in [`brand/AGENTS.md`](../../brand/AGENTS.md); the Agent identity system lives in [`packages/ui/docs/agent-visual.md`](../ui/docs/agent-visual.md); editorial imagery routes through [`skills/marketing/blog-imagegen/references/editorial-register.md`](../../skills/marketing/blog-imagegen/references/editorial-register.md). This contract owns only the package delivery interface.
1125
-
1126
- The approved transparent Nadia master ships at `assets/nadia-solid-surface`. The package also delivers the three remaining material states as compatibility routes: `assets/nadia-ordered-points`, `assets/nadia-triangulated-wire`, and `assets/nadia-irregular-particles`. Package delivery does not grant brand approval; which Nadia image a surface may use stays with the identity document named above.
1127
-
1128
- All three forms derive from one authored, framework-neutral geometry source exported as `@nadicodeai/design-system/assets/logo-geometry`. The lockup combines the shared mark and wordmark geometry at the established proportion and spacing. No SVG, React component, favicon, document, or app re-authors, traces, typesets, or rearranges those shapes.
1129
-
1130
- Use the positive form on `{colors.canvas}` and the soft neutral canvases: ink letterforms and link with the primary verde link and `AI` suffix. Use the inverse form on `{colors.identity-ink}`: `{colors.identity-white}` letterforms and link with the dark-primary verde link and `AI` suffix. On `{colors.identity-verde}`, use the supplied on-verde form with one ink link and one white link. On photography, place the logo in a quiet area or over a scrim that keeps every part legible; when neither is available, mount it on an approved solid field. One surface uses one treatment.
1131
-
1132
- The clear-space unit is the rendered width of one link stroke in the mark. Keep at least one unit free on every side of the mark and lockup, with no text, rule, image, or container edge inside it. A wordmark used alone keeps the same unit that the mark would have at the wordmark's capital height. Minimum rendered sizes are 16 CSS pixels or 5 mm for the mark, 130 CSS pixels or 32 mm wide for the lockup, and 96 CSS pixels or 25 mm wide for the wordmark. Browser and operating-system icon slots use the supplied favicon or app-icon files at the platform's required size and are exempt from the screen minimum. Never compress, crop, or distort a logo to fit.
1133
-
1134
- For a meaningful standalone image, use the accessible name `NadicodeAI`; the accessible name is the label that identifies an image, link, or control to assistive technology. When a containing link or control already has that accessible name, hide the logo image from assistive technology with empty alt text. Never repeat the same accessible name on both the container and the image.
1135
-
1136
- Do not redraw, retype, reorder, stretch, crop, rotate, recolor, outline, shadow, animate, or add effects or gradients to a logo form. Do not flatten the over-under interlock, add a third link, alter the proportions or lockup spacing, stack the forms, embed the mark inside the wordmark, place the mark after the wordmark, combine it with another mark, or substitute Nadia imagery for it.
1137
-
1138
- The package build renders and publicly exports full-colour, mono-ink, inverse, and on-verde SVG and transparent PNG files for the lockup, mark, and wordmark from the geometry and current `colors.*` contract. React consumers use `BrandLockup`, `BrandMark`, or `BrandWordmark` according to the roles above. The operator-only favicon generator wraps the same mark geometry in the platform tile and may adapt tile radius, output size, and fixed-tile paint roles; it does not substitute another mark. Private geometry templates do not ship. A contract or geometry change is completed by regeneration, never by repainting an output or updating a fallback by hand.
1139
-
1140
1118
  ### Enforcement
1141
1119
 
1142
1120
  Correctness is structural, not a byte snapshot: `scripts/sd/design-tokens-fence.test.ts` verifies the fence reader, one fence, strict JSON, typed leaves, legal names; `scripts/sd/compose-token-graph.test.ts` verifies the composition, one construction of the root, alias rewriting, ownership and reference direction, extension preservation, and the CSS projection; `tests/guards/dtcg-shape.test.ts` verifies both published artifacts against the vendored DTCG schema and the Nadicode profile; `tests/guards/token-structural-parity.test.ts` verifies the complete `--nc-*` projection; `tests/guards/tailwind-v4-theme.test.ts` verifies mode-pair derivation, `@theme` values, and light/dark role integrity; `tests/guards/component-contract-matches-css.test.ts` verifies the retained CSS component surface against this contract; `tests/guards/css-bundle.test.ts` verifies the public artifact is flat, complete, and contains no shipped partials; and `tests/guards/consumer-css-discipline.test.ts` verifies reference integrity, the absence of raw color literals in the hand-authored kit CSS and of raw color and radius literals in `examples/`, second value sources, and DTCG drift. These guards read freshly built output (the test global-setup rebuilds before any of them run), so they prove the generator; a hand-edited or stale committed generated file is caught by the CI cleanliness step in the `design-system` job, which requires a fresh build to reproduce the committed bytes exactly, with `dist/favicon/**` outside it, regenerated only by `generate:favicons` and fenced by review rather than machinery. Cross-package guards verify that React callers use only the React stylesheet interface.
@@ -77,7 +77,6 @@
77
77
  --nc-warning: oklch(0.8466 0.1678 84.63);
78
78
  --nc-warning-soft: oklch(0.9649 0.0461 90.87);
79
79
  --nc-warning-deep: oklch(0.4834 0.0995 82.44);
80
- --nc-flag-red: oklch(0.5688 0.1995 26.59);
81
80
  --nc-verde-vivo: oklch(0.5604 0.1485 151.68);
82
81
  --nc-selection-bg: oklch(0.1776 0.0000 0.00);
83
82
  --nc-selection-fg: oklch(0.9851 0.0000 0.00);
@@ -89,8 +88,6 @@
89
88
  --nc-state-review: oklch(0.8466 0.1678 84.63);
90
89
  --nc-state-blocked: oklch(0.5688 0.1995 26.59);
91
90
  --nc-state-complete: oklch(0.6415 0.1644 153.23);
92
- --nc-background-100: oklch(1.0000 0.0000 0.00);
93
- --nc-background-200: oklch(0.9851 0.0000 0.00);
94
91
  --nc-identity-verde: oklch(0.6415 0.1644 153.23);
95
92
  --nc-identity-rosso: oklch(0.5688 0.1995 26.59);
96
93
  --nc-identity-arancio: oklch(0.6824 0.2108 37.70);
@@ -143,9 +140,6 @@
143
140
  --nc-dark-info: oklch(0.7067 0.1528 272.08);
144
141
  --nc-dark-info-soft: oklch(0.2118 0.1033 268.28);
145
142
  --nc-dark-info-deep: oklch(0.8222 0.0888 274.44);
146
- --nc-dark-cyan: oklch(0.7820 0.1247 190.99);
147
- --nc-dark-cyan-soft: oklch(0.8646 0.1000 187.55);
148
- --nc-dark-cyan-deep: oklch(0.6347 0.1029 191.54);
149
143
  --nc-dark-success: oklch(0.7019 0.1753 153.20);
150
144
  --nc-dark-success-soft: oklch(0.2893 0.0697 156.32);
151
145
  --nc-dark-success-deep: oklch(0.8524 0.0996 159.83);
@@ -670,7 +664,7 @@
670
664
  --sidebar-border: var(--nc-dark-line);
671
665
  --sidebar-ring: var(--nc-dark-focus-ring);
672
666
  }
673
- @theme { --color-*: initial; --color-nc-primary: oklch(0.5075 0.1338 151.91); --color-nc-on-primary: oklch(1.0000 0.0000 0.00); --color-nc-action: oklch(0.1776 0.0000 0.00); --color-nc-action-foreground: oklch(1.0000 0.0000 0.00); --color-nc-action-hover: oklch(0.3012 0.0000 0.00); --color-nc-action-active: oklch(0.0000 0.0000 0.00); --color-nc-ink: oklch(0.1776 0.0000 0.00); --color-nc-body: oklch(0.3867 0.0000 0.00); --color-nc-muted: oklch(0.5278 0.0000 0.00); --color-nc-canvas: oklch(1.0000 0.0000 0.00); --color-nc-canvas-soft: oklch(0.9851 0.0000 0.00); --color-nc-canvas-soft-2: oklch(0.9702 0.0000 0.00); --color-nc-material-workspace: oklch(0.9761 0.0000 0.00); --color-nc-material-solid: oklch(1.0000 0.0000 0.00); --color-nc-line: oklch(0.9219 0.0000 0.00); --color-nc-input: oklch(0.5624 0.0000 0.00); --color-nc-seam: oklch(0.8699 0.0000 0.00); --color-nc-cross: oklch(0.6830 0.0000 0.00); --color-nc-focus-ring: oklch(0.1776 0.0000 0.00); --color-nc-scrim: oklch(0.1776 0.0000 0.00); --color-nc-link: oklch(0.4815 0.1209 154.24); --color-nc-link-deep: oklch(0.3852 0.0953 154.99); --color-nc-link-bg-soft: oklch(0.9170 0.0519 161.77); --color-nc-accent: oklch(0.6824 0.2108 37.70); --color-nc-info: oklch(0.5005 0.2804 266.17); --color-nc-info-soft: oklch(0.9457 0.0259 276.40); --color-nc-info-deep: oklch(0.3197 0.1758 266.79); --color-nc-success: oklch(0.6415 0.1644 153.23); --color-nc-success-soft: oklch(0.9170 0.0519 161.77); --color-nc-success-deep: oklch(0.3852 0.0953 154.99); --color-nc-error: oklch(0.5688 0.1995 26.59); --color-nc-error-soft: oklch(0.9522 0.0207 17.52); --color-nc-error-deep: oklch(0.4235 0.1525 27.08); --color-nc-warning: oklch(0.8466 0.1678 84.63); --color-nc-warning-soft: oklch(0.9649 0.0461 90.87); --color-nc-warning-deep: oklch(0.4834 0.0995 82.44); --color-nc-flag-red: oklch(0.5688 0.1995 26.59); --color-nc-verde-vivo: oklch(0.5604 0.1485 151.68); --color-nc-selection-bg: oklch(0.1776 0.0000 0.00); --color-nc-selection-fg: oklch(0.9851 0.0000 0.00); --color-nc-navigation-selection-bg: oklch(0.9461 0.0000 0.00); --color-nc-navigation-selection-fg: oklch(0.1776 0.0000 0.00); --color-nc-navigation-selection-hover: oklch(0.9219 0.0000 0.00); --color-nc-state-ready: oklch(0.5278 0.0000 0.00); --color-nc-state-running: oklch(0.5005 0.2804 266.17); --color-nc-state-review: oklch(0.8466 0.1678 84.63); --color-nc-state-blocked: oklch(0.5688 0.1995 26.59); --color-nc-state-complete: oklch(0.6415 0.1644 153.23); --color-nc-background-100: oklch(1.0000 0.0000 0.00); --color-nc-background-200: oklch(0.9851 0.0000 0.00); --color-nc-identity-verde: oklch(0.6415 0.1644 153.23); --color-nc-identity-rosso: oklch(0.5688 0.1995 26.59); --color-nc-identity-arancio: oklch(0.6824 0.2108 37.70); --color-nc-identity-giallo: oklch(0.8466 0.1678 84.63); --color-nc-identity-cobalto: oklch(0.5005 0.2804 266.17); --color-nc-identity-ink: oklch(0.0000 0.0000 0.00); --color-nc-identity-white: oklch(1.0000 0.0000 0.00); --color-nc-chart-1: oklch(0.5005 0.2804 266.17); --color-nc-chart-2: oklch(0.6415 0.1644 153.23); --color-nc-chart-3: oklch(0.7638 0.1562 86.86); --color-nc-chart-4: oklch(0.5688 0.1995 26.59); --color-nc-chart-5: oklch(0.6161 0.1062 208.85); --color-nc-chart-6: oklch(0.5015 0.1883 294.99); --color-nc-chart-seq-1: oklch(0.6998 0.1347 269.48); --color-nc-chart-seq-2: oklch(0.5724 0.1897 270.11); --color-nc-chart-seq-3: oklch(0.4725 0.2271 267.41); --color-nc-chart-seq-4: oklch(0.3989 0.1934 267.50); --color-nc-chart-seq-5: oklch(0.3270 0.1487 267.91); --color-nc-chart-div-warm: oklch(0.7592 0.1560 83.30); --color-nc-chart-div-mid: oklch(0.5278 0.0000 0.00); --color-nc-chart-div-cool: oklch(0.5923 0.2215 269.61); --color-nc-dark-canvas: oklch(0.0000 0.0000 0.00); --color-nc-dark-canvas-soft: oklch(0.1776 0.0000 0.00); --color-nc-dark-canvas-soft-2: oklch(0.2178 0.0000 0.00); --color-nc-dark-material-workspace: oklch(0.0000 0.0000 0.00); --color-nc-dark-material-solid: oklch(0.0000 0.0000 0.00); --color-nc-dark-ink: oklch(0.9461 0.0000 0.00); --color-nc-dark-body: oklch(0.8297 0.0000 0.00); --color-nc-dark-muted: oklch(0.6500 0.0000 0.00); --color-nc-dark-line: oklch(0.2686 0.0000 0.00); --color-nc-dark-input: oklch(0.5208 0.0000 0.00); --color-nc-dark-seam: oklch(0.2178 0.0000 0.00); --color-nc-dark-primary: oklch(0.7727 0.1753 155.96); --color-nc-dark-on-primary: oklch(0.1448 0.0000 0.00); --color-nc-dark-action: oklch(1.0000 0.0000 0.00); --color-nc-dark-action-foreground: oklch(0.1448 0.0000 0.00); --color-nc-dark-action-hover: oklch(0.9189 0.0000 0.00); --color-nc-dark-action-active: oklch(0.8761 0.0000 0.00); --color-nc-dark-link: oklch(0.7661 0.1498 157.10); --color-nc-dark-link-deep: oklch(0.8524 0.0996 159.83); --color-nc-dark-link-bg-soft: oklch(0.2893 0.0697 156.32); --color-nc-dark-focus-ring: oklch(0.9461 0.0000 0.00); --color-nc-dark-scrim: oklch(0.9461 0.0000 0.00); --color-nc-dark-error: oklch(0.7955 0.0980 21.02); --color-nc-dark-error-soft: oklch(0.2296 0.0728 26.06); --color-nc-dark-error-deep: oklch(0.8856 0.0534 19.64); --color-nc-dark-warning: oklch(0.8939 0.1387 90.47); --color-nc-dark-warning-soft: oklch(0.3135 0.0643 85.04); --color-nc-dark-warning-deep: oklch(0.9320 0.0896 90.86); --color-nc-dark-info: oklch(0.7067 0.1528 272.08); --color-nc-dark-info-soft: oklch(0.2118 0.1033 268.28); --color-nc-dark-info-deep: oklch(0.8222 0.0888 274.44); --color-nc-dark-cyan: oklch(0.7820 0.1247 190.99); --color-nc-dark-cyan-soft: oklch(0.8646 0.1000 187.55); --color-nc-dark-cyan-deep: oklch(0.6347 0.1029 191.54); --color-nc-dark-success: oklch(0.7019 0.1753 153.20); --color-nc-dark-success-soft: oklch(0.2893 0.0697 156.32); --color-nc-dark-success-deep: oklch(0.8524 0.0996 159.83); --color-nc-dark-state-ready: oklch(0.5624 0.0000 0.00); --color-nc-dark-state-running: oklch(0.5923 0.2215 269.61); --color-nc-dark-state-review: oklch(0.8466 0.1678 84.63); --color-nc-dark-state-blocked: oklch(0.5688 0.1995 26.59); --color-nc-dark-state-complete: oklch(0.6415 0.1644 153.23); --color-nc-dark-selection-bg: oklch(0.9461 0.0000 0.00); --color-nc-dark-selection-fg: oklch(0.1448 0.0000 0.00); --color-nc-dark-navigation-selection-bg: oklch(0.2178 0.0000 0.00); --color-nc-dark-navigation-selection-fg: oklch(0.9461 0.0000 0.00); --color-nc-dark-navigation-selection-hover: oklch(0.2686 0.0000 0.00); --color-nc-dark-cross: oklch(0.4495 0.0000 0.00); --color-nc-dark-verde-vivo: oklch(0.7868 0.1398 156.43); --color-nc-dark-chart-1: oklch(0.5923 0.2215 269.61); --color-nc-dark-chart-2: oklch(0.6415 0.1644 153.23); --color-nc-dark-chart-3: oklch(0.8939 0.1387 90.47); --color-nc-dark-chart-4: oklch(0.6627 0.1685 23.66); --color-nc-dark-chart-5: oklch(0.7820 0.1247 190.99); --color-nc-dark-chart-6: oklch(0.6297 0.1321 299.36); --color-nc-dark-chart-seq-1: oklch(0.5724 0.1897 270.11); --color-nc-dark-chart-seq-2: oklch(0.6998 0.1347 269.48); --color-nc-dark-chart-seq-3: oklch(0.8072 0.0884 269.44); --color-nc-dark-chart-seq-4: oklch(0.8877 0.0514 270.78); --color-nc-dark-chart-seq-5: oklch(0.9619 0.0179 272.31); --color-nc-dark-chart-div-warm: oklch(0.8939 0.1387 90.47); --color-nc-dark-chart-div-mid: oklch(0.9219 0.0000 0.00); --color-nc-dark-chart-div-cool: oklch(0.8222 0.0888 274.44); --font-display-xl: Geist, Inter, system-ui, -apple-system, sans-serif; --font-display-lg: Geist, Inter, system-ui, -apple-system, sans-serif; --font-display-md: Geist, Inter, system-ui, -apple-system, sans-serif; --font-display-sm: Geist, Inter, system-ui, -apple-system, sans-serif; --font-title-lg: Geist, Inter, system-ui, -apple-system, sans-serif; --font-title-md: Geist, Inter, system-ui, -apple-system, sans-serif; --font-title-sm: Geist, Inter, system-ui, -apple-system, sans-serif; --font-body-lg: Geist, Inter, system-ui, -apple-system, sans-serif; --font-body-md: Geist, Inter, system-ui, -apple-system, sans-serif; --font-body-md-strong: Geist, Inter, system-ui, -apple-system, sans-serif; --font-body-sm: Geist, Inter, system-ui, -apple-system, sans-serif; --font-body-sm-strong: Geist, Inter, system-ui, -apple-system, sans-serif; --font-caption: Geist, Inter, system-ui, -apple-system, sans-serif; --font-caption-strong: Geist, Inter, system-ui, -apple-system, sans-serif; --font-caption-mono: Geist Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, monospace; --font-code: Geist Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, monospace; --font-button-md: Geist, Inter, system-ui, -apple-system, sans-serif; --font-button-lg: Geist, Inter, system-ui, -apple-system, sans-serif; --text-display-xl: 72px; --text-display-xl--line-height: 74px; --leading-display-xl: 74px; --text-display-xl--letter-spacing: -1.5px; --tracking-display-xl: -1.5px; --text-display-xl--font-weight: 600; --font-weight-display-xl: 600; --text-display-lg: 52px; --text-display-lg--line-height: 54px; --leading-display-lg: 54px; --text-display-lg--letter-spacing: -1px; --tracking-display-lg: -1px; --text-display-lg--font-weight: 600; --font-weight-display-lg: 600; --text-display-md: 24px; --text-display-md--line-height: 32px; --leading-display-md: 32px; --text-display-md--letter-spacing: 0px; --tracking-display-md: 0px; --text-display-md--font-weight: 600; --font-weight-display-md: 600; --text-display-sm: 20px; --text-display-sm--line-height: 28px; --leading-display-sm: 28px; --text-display-sm--letter-spacing: 0px; --tracking-display-sm: 0px; --text-display-sm--font-weight: 600; --font-weight-display-sm: 600; --text-title-lg: 40px; --text-title-lg--line-height: 41px; --leading-title-lg: 41px; --text-title-lg--letter-spacing: 0px; --tracking-title-lg: 0px; --text-title-lg--font-weight: 600; --font-weight-title-lg: 600; --text-title-md: 30px; --text-title-md--line-height: 32px; --leading-title-md: 32px; --text-title-md--letter-spacing: 0px; --tracking-title-md: 0px; --text-title-md--font-weight: 600; --font-weight-title-md: 600; --text-title-sm: 22px; --text-title-sm--line-height: 25px; --leading-title-sm: 25px; --text-title-sm--letter-spacing: 0px; --tracking-title-sm: 0px; --text-title-sm--font-weight: 600; --font-weight-title-sm: 600; --text-body-lg: 18px; --text-body-lg--line-height: 27px; --leading-body-lg: 27px; --text-body-lg--letter-spacing: 0px; --tracking-body-lg: 0px; --text-body-lg--font-weight: 400; --font-weight-body-lg: 400; --text-body-md: 16px; --text-body-md--line-height: 25px; --leading-body-md: 25px; --text-body-md--letter-spacing: 0px; --tracking-body-md: 0px; --text-body-md--font-weight: 400; --font-weight-body-md: 400; --text-body-md-strong: 16px; --text-body-md-strong--line-height: 24px; --leading-body-md-strong: 24px; --text-body-md-strong--letter-spacing: 0px; --tracking-body-md-strong: 0px; --text-body-md-strong--font-weight: 500; --font-weight-body-md-strong: 500; --text-body-sm: 14px; --text-body-sm--line-height: 20px; --leading-body-sm: 20px; --text-body-sm--letter-spacing: 0px; --tracking-body-sm: 0px; --text-body-sm--font-weight: 400; --font-weight-body-sm: 400; --text-body-sm-strong: 14px; --text-body-sm-strong--line-height: 20px; --leading-body-sm-strong: 20px; --text-body-sm-strong--letter-spacing: 0px; --tracking-body-sm-strong: 0px; --text-body-sm-strong--font-weight: 500; --font-weight-body-sm-strong: 500; --text-caption: 12px; --text-caption--line-height: 16px; --leading-caption: 16px; --text-caption--letter-spacing: 0px; --tracking-caption: 0px; --text-caption--font-weight: 400; --font-weight-caption: 400; --text-caption-strong: 12px; --text-caption-strong--line-height: 16px; --leading-caption-strong: 16px; --text-caption-strong--letter-spacing: 0px; --tracking-caption-strong: 0px; --text-caption-strong--font-weight: 500; --font-weight-caption-strong: 500; --text-caption-mono: 12px; --text-caption-mono--line-height: 16px; --leading-caption-mono: 16px; --text-caption-mono--letter-spacing: 0px; --tracking-caption-mono: 0px; --text-caption-mono--font-weight: 500; --font-weight-caption-mono: 500; --text-code: 13px; --text-code--line-height: 20px; --leading-code: 20px; --text-code--letter-spacing: 0px; --tracking-code: 0px; --text-code--font-weight: 400; --font-weight-code: 400; --text-button-md: 14px; --text-button-md--line-height: 18px; --leading-button-md: 18px; --text-button-md--letter-spacing: 0px; --tracking-button-md: 0px; --text-button-md--font-weight: 500; --font-weight-button-md: 500; --text-button-lg: 16px; --text-button-lg--line-height: 24px; --leading-button-lg: 24px; --text-button-lg--letter-spacing: 0px; --tracking-button-lg: 0px; --text-button-lg--font-weight: 500; --font-weight-button-lg: 500; --radius-none: 0px; --radius-xs: 2px; --radius-sm: 4px; --radius-md: 6px; --radius-lg: 8px; --radius-xl: 10px; --radius-2xl: 12px; --radius-3xl: 16px; --radius-pill-sm: 64px; --radius-pill: 100px; --radius-full: 9999px; --ease-nc-emphasized: cubic-bezier(0.3, 0.7, 0.2, 1); --ease-nc-out-strong: cubic-bezier(0.23, 1, 0.32, 1); --ease-nc-in-out-strong: cubic-bezier(0.77, 0, 0.175, 1); --ease-nc-drawer: cubic-bezier(0.32, 0.72, 0, 1); --outline-width-focus: var(--spacing-nadicode-focus-outline-width); --outline-offset-focus: var(--spacing-nadicode-focus-outline-offset); --opacity-scrim: var(--nc-material-scrim-opacity); --spacing-nadicode-xxs: 4px; --spacing-nadicode-xs: 8px; --spacing-nadicode-sm: 12px; --spacing-nadicode-md: 16px; --spacing-nadicode-lg: 24px; --spacing-nadicode-xl: 32px; --spacing-nadicode-2xl: 40px; --spacing-nadicode-3xl: 48px; --spacing-nadicode-4xl: 64px; --spacing-nadicode-5xl: 96px; --spacing-nadicode-6xl: 128px; --spacing-nadicode-guide: 1px; --spacing-nadicode-icon-stroke: 1.6px; --spacing-nadicode-focus-outline-width: 2px; --spacing-nadicode-focus-outline-offset: 2px; --spacing-nadicode-control-height: 32px; --spacing-nadicode-control-padding-inline: 10px; --spacing-nadicode-touch-target: 44px; --spacing-nadicode-section: 192px; --spacing-nadicode-page-pad: 24px; --spacing-nadicode-page-max-mobile: 448px; --spacing-nadicode-page-max-tablet: 624px; --spacing-nadicode-page-max-desktop: 1440px; --spacing-nadicode-frame-max: 1392px; --spacing-nadicode-frame-gap: 24px; --spacing-nadicode-cell-padding: 24px; --spacing-nadicode-section-gap: 48px; --spacing-nadicode-cross-size-mobile: 11px; --spacing-nadicode-cross-size-tablet: 15px; --spacing-nadicode-cross-size-desktop: 21px; --spacing-nadicode-h-strip-mobile: 72px; --spacing-nadicode-h-strip-tablet: 80px; --spacing-nadicode-h-strip-desktop: 88px; --spacing-nadicode-h-cell-sm: 120px; --spacing-nadicode-h-cell-md-mobile: 144px; --spacing-nadicode-h-cell-md-tablet: 160px; --spacing-nadicode-h-cell-md-desktop: 168px; --spacing-nadicode-h-cell-lg-mobile: 220px; --spacing-nadicode-h-cell-lg-desktop: 240px; --spacing-nadicode-h-visual-mobile: 276px; --spacing-nadicode-h-visual-tablet: 318px; --spacing-nadicode-h-visual-desktop: 360px; --spacing-nadicode-h-precision-mobile: 276px; --spacing-nadicode-h-precision-tablet: 480px; --spacing-nadicode-h-precision-desktop: 720px; --spacing-nadicode-h-hero-mobile: 560px; --spacing-nadicode-h-hero-desktop: 720px; --spacing-nadicode-h-action-strip-mobile: 20px; --spacing-nadicode-h-action-strip-desktop: 32px; --spacing-nadicode-h-action-body-mobile: 320px; --spacing-nadicode-h-action-body-tablet: 338px; --spacing-nadicode-h-action-band: 260px; --spacing-nadicode-h-feature-mobile: 360px; --spacing-nadicode-h-feature-tablet: 400px; --spacing-nadicode-h-feature-desktop: 456px; --spacing-nadicode-h-editorial-feature-mobile: 360px; --spacing-nadicode-h-editorial-feature-tablet: 440px; --spacing-nadicode-h-editorial-feature-desktop: 560px; --spacing-nadicode-h-bento-primary: 384px; --spacing-nadicode-h-bento-secondary: 240px; --spacing-nadicode-h-bento-mobile-copy: 248px; --spacing-nadicode-h-bento-mobile-main: 537px; --spacing-nadicode-h-bento-strip: 20px; --spacing-nadicode-filter-chip-gap: 6px; --spacing-nadicode-filter-chip-height: 28px; --spacing-nadicode-filter-chip-icon: 14px; --spacing-control-height: var(--spacing-nadicode-control-height); --spacing-control-padding-inline: var(--spacing-nadicode-control-padding-inline); --spacing-touch-target: var(--spacing-nadicode-touch-target); }
667
+ @theme { --color-*: initial; --color-nc-primary: oklch(0.5075 0.1338 151.91); --color-nc-on-primary: oklch(1.0000 0.0000 0.00); --color-nc-action: oklch(0.1776 0.0000 0.00); --color-nc-action-foreground: oklch(1.0000 0.0000 0.00); --color-nc-action-hover: oklch(0.3012 0.0000 0.00); --color-nc-action-active: oklch(0.0000 0.0000 0.00); --color-nc-ink: oklch(0.1776 0.0000 0.00); --color-nc-body: oklch(0.3867 0.0000 0.00); --color-nc-muted: oklch(0.5278 0.0000 0.00); --color-nc-canvas: oklch(1.0000 0.0000 0.00); --color-nc-canvas-soft: oklch(0.9851 0.0000 0.00); --color-nc-canvas-soft-2: oklch(0.9702 0.0000 0.00); --color-nc-material-workspace: oklch(0.9761 0.0000 0.00); --color-nc-material-solid: oklch(1.0000 0.0000 0.00); --color-nc-line: oklch(0.9219 0.0000 0.00); --color-nc-input: oklch(0.5624 0.0000 0.00); --color-nc-seam: oklch(0.8699 0.0000 0.00); --color-nc-cross: oklch(0.6830 0.0000 0.00); --color-nc-focus-ring: oklch(0.1776 0.0000 0.00); --color-nc-scrim: oklch(0.1776 0.0000 0.00); --color-nc-link: oklch(0.4815 0.1209 154.24); --color-nc-link-deep: oklch(0.3852 0.0953 154.99); --color-nc-link-bg-soft: oklch(0.9170 0.0519 161.77); --color-nc-accent: oklch(0.6824 0.2108 37.70); --color-nc-info: oklch(0.5005 0.2804 266.17); --color-nc-info-soft: oklch(0.9457 0.0259 276.40); --color-nc-info-deep: oklch(0.3197 0.1758 266.79); --color-nc-success: oklch(0.6415 0.1644 153.23); --color-nc-success-soft: oklch(0.9170 0.0519 161.77); --color-nc-success-deep: oklch(0.3852 0.0953 154.99); --color-nc-error: oklch(0.5688 0.1995 26.59); --color-nc-error-soft: oklch(0.9522 0.0207 17.52); --color-nc-error-deep: oklch(0.4235 0.1525 27.08); --color-nc-warning: oklch(0.8466 0.1678 84.63); --color-nc-warning-soft: oklch(0.9649 0.0461 90.87); --color-nc-warning-deep: oklch(0.4834 0.0995 82.44); --color-nc-verde-vivo: oklch(0.5604 0.1485 151.68); --color-nc-selection-bg: oklch(0.1776 0.0000 0.00); --color-nc-selection-fg: oklch(0.9851 0.0000 0.00); --color-nc-navigation-selection-bg: oklch(0.9461 0.0000 0.00); --color-nc-navigation-selection-fg: oklch(0.1776 0.0000 0.00); --color-nc-navigation-selection-hover: oklch(0.9219 0.0000 0.00); --color-nc-state-ready: oklch(0.5278 0.0000 0.00); --color-nc-state-running: oklch(0.5005 0.2804 266.17); --color-nc-state-review: oklch(0.8466 0.1678 84.63); --color-nc-state-blocked: oklch(0.5688 0.1995 26.59); --color-nc-state-complete: oklch(0.6415 0.1644 153.23); --color-nc-identity-verde: oklch(0.6415 0.1644 153.23); --color-nc-identity-rosso: oklch(0.5688 0.1995 26.59); --color-nc-identity-arancio: oklch(0.6824 0.2108 37.70); --color-nc-identity-giallo: oklch(0.8466 0.1678 84.63); --color-nc-identity-cobalto: oklch(0.5005 0.2804 266.17); --color-nc-identity-ink: oklch(0.0000 0.0000 0.00); --color-nc-identity-white: oklch(1.0000 0.0000 0.00); --color-nc-chart-1: oklch(0.5005 0.2804 266.17); --color-nc-chart-2: oklch(0.6415 0.1644 153.23); --color-nc-chart-3: oklch(0.7638 0.1562 86.86); --color-nc-chart-4: oklch(0.5688 0.1995 26.59); --color-nc-chart-5: oklch(0.6161 0.1062 208.85); --color-nc-chart-6: oklch(0.5015 0.1883 294.99); --color-nc-chart-seq-1: oklch(0.6998 0.1347 269.48); --color-nc-chart-seq-2: oklch(0.5724 0.1897 270.11); --color-nc-chart-seq-3: oklch(0.4725 0.2271 267.41); --color-nc-chart-seq-4: oklch(0.3989 0.1934 267.50); --color-nc-chart-seq-5: oklch(0.3270 0.1487 267.91); --color-nc-chart-div-warm: oklch(0.7592 0.1560 83.30); --color-nc-chart-div-mid: oklch(0.5278 0.0000 0.00); --color-nc-chart-div-cool: oklch(0.5923 0.2215 269.61); --color-nc-dark-canvas: oklch(0.0000 0.0000 0.00); --color-nc-dark-canvas-soft: oklch(0.1776 0.0000 0.00); --color-nc-dark-canvas-soft-2: oklch(0.2178 0.0000 0.00); --color-nc-dark-material-workspace: oklch(0.0000 0.0000 0.00); --color-nc-dark-material-solid: oklch(0.0000 0.0000 0.00); --color-nc-dark-ink: oklch(0.9461 0.0000 0.00); --color-nc-dark-body: oklch(0.8297 0.0000 0.00); --color-nc-dark-muted: oklch(0.6500 0.0000 0.00); --color-nc-dark-line: oklch(0.2686 0.0000 0.00); --color-nc-dark-input: oklch(0.5208 0.0000 0.00); --color-nc-dark-seam: oklch(0.2178 0.0000 0.00); --color-nc-dark-primary: oklch(0.7727 0.1753 155.96); --color-nc-dark-on-primary: oklch(0.1448 0.0000 0.00); --color-nc-dark-action: oklch(1.0000 0.0000 0.00); --color-nc-dark-action-foreground: oklch(0.1448 0.0000 0.00); --color-nc-dark-action-hover: oklch(0.9189 0.0000 0.00); --color-nc-dark-action-active: oklch(0.8761 0.0000 0.00); --color-nc-dark-link: oklch(0.7661 0.1498 157.10); --color-nc-dark-link-deep: oklch(0.8524 0.0996 159.83); --color-nc-dark-link-bg-soft: oklch(0.2893 0.0697 156.32); --color-nc-dark-focus-ring: oklch(0.9461 0.0000 0.00); --color-nc-dark-scrim: oklch(0.9461 0.0000 0.00); --color-nc-dark-error: oklch(0.7955 0.0980 21.02); --color-nc-dark-error-soft: oklch(0.2296 0.0728 26.06); --color-nc-dark-error-deep: oklch(0.8856 0.0534 19.64); --color-nc-dark-warning: oklch(0.8939 0.1387 90.47); --color-nc-dark-warning-soft: oklch(0.3135 0.0643 85.04); --color-nc-dark-warning-deep: oklch(0.9320 0.0896 90.86); --color-nc-dark-info: oklch(0.7067 0.1528 272.08); --color-nc-dark-info-soft: oklch(0.2118 0.1033 268.28); --color-nc-dark-info-deep: oklch(0.8222 0.0888 274.44); --color-nc-dark-success: oklch(0.7019 0.1753 153.20); --color-nc-dark-success-soft: oklch(0.2893 0.0697 156.32); --color-nc-dark-success-deep: oklch(0.8524 0.0996 159.83); --color-nc-dark-state-ready: oklch(0.5624 0.0000 0.00); --color-nc-dark-state-running: oklch(0.5923 0.2215 269.61); --color-nc-dark-state-review: oklch(0.8466 0.1678 84.63); --color-nc-dark-state-blocked: oklch(0.5688 0.1995 26.59); --color-nc-dark-state-complete: oklch(0.6415 0.1644 153.23); --color-nc-dark-selection-bg: oklch(0.9461 0.0000 0.00); --color-nc-dark-selection-fg: oklch(0.1448 0.0000 0.00); --color-nc-dark-navigation-selection-bg: oklch(0.2178 0.0000 0.00); --color-nc-dark-navigation-selection-fg: oklch(0.9461 0.0000 0.00); --color-nc-dark-navigation-selection-hover: oklch(0.2686 0.0000 0.00); --color-nc-dark-cross: oklch(0.4495 0.0000 0.00); --color-nc-dark-verde-vivo: oklch(0.7868 0.1398 156.43); --color-nc-dark-chart-1: oklch(0.5923 0.2215 269.61); --color-nc-dark-chart-2: oklch(0.6415 0.1644 153.23); --color-nc-dark-chart-3: oklch(0.8939 0.1387 90.47); --color-nc-dark-chart-4: oklch(0.6627 0.1685 23.66); --color-nc-dark-chart-5: oklch(0.7820 0.1247 190.99); --color-nc-dark-chart-6: oklch(0.6297 0.1321 299.36); --color-nc-dark-chart-seq-1: oklch(0.5724 0.1897 270.11); --color-nc-dark-chart-seq-2: oklch(0.6998 0.1347 269.48); --color-nc-dark-chart-seq-3: oklch(0.8072 0.0884 269.44); --color-nc-dark-chart-seq-4: oklch(0.8877 0.0514 270.78); --color-nc-dark-chart-seq-5: oklch(0.9619 0.0179 272.31); --color-nc-dark-chart-div-warm: oklch(0.8939 0.1387 90.47); --color-nc-dark-chart-div-mid: oklch(0.9219 0.0000 0.00); --color-nc-dark-chart-div-cool: oklch(0.8222 0.0888 274.44); --font-display-xl: Geist, Inter, system-ui, -apple-system, sans-serif; --font-display-lg: Geist, Inter, system-ui, -apple-system, sans-serif; --font-display-md: Geist, Inter, system-ui, -apple-system, sans-serif; --font-display-sm: Geist, Inter, system-ui, -apple-system, sans-serif; --font-title-lg: Geist, Inter, system-ui, -apple-system, sans-serif; --font-title-md: Geist, Inter, system-ui, -apple-system, sans-serif; --font-title-sm: Geist, Inter, system-ui, -apple-system, sans-serif; --font-body-lg: Geist, Inter, system-ui, -apple-system, sans-serif; --font-body-md: Geist, Inter, system-ui, -apple-system, sans-serif; --font-body-md-strong: Geist, Inter, system-ui, -apple-system, sans-serif; --font-body-sm: Geist, Inter, system-ui, -apple-system, sans-serif; --font-body-sm-strong: Geist, Inter, system-ui, -apple-system, sans-serif; --font-caption: Geist, Inter, system-ui, -apple-system, sans-serif; --font-caption-strong: Geist, Inter, system-ui, -apple-system, sans-serif; --font-caption-mono: Geist Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, monospace; --font-code: Geist Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, monospace; --font-button-md: Geist, Inter, system-ui, -apple-system, sans-serif; --font-button-lg: Geist, Inter, system-ui, -apple-system, sans-serif; --text-display-xl: 72px; --text-display-xl--line-height: 74px; --leading-display-xl: 74px; --text-display-xl--letter-spacing: -1.5px; --tracking-display-xl: -1.5px; --text-display-xl--font-weight: 600; --font-weight-display-xl: 600; --text-display-lg: 52px; --text-display-lg--line-height: 54px; --leading-display-lg: 54px; --text-display-lg--letter-spacing: -1px; --tracking-display-lg: -1px; --text-display-lg--font-weight: 600; --font-weight-display-lg: 600; --text-display-md: 24px; --text-display-md--line-height: 32px; --leading-display-md: 32px; --text-display-md--letter-spacing: 0px; --tracking-display-md: 0px; --text-display-md--font-weight: 600; --font-weight-display-md: 600; --text-display-sm: 20px; --text-display-sm--line-height: 28px; --leading-display-sm: 28px; --text-display-sm--letter-spacing: 0px; --tracking-display-sm: 0px; --text-display-sm--font-weight: 600; --font-weight-display-sm: 600; --text-title-lg: 40px; --text-title-lg--line-height: 41px; --leading-title-lg: 41px; --text-title-lg--letter-spacing: 0px; --tracking-title-lg: 0px; --text-title-lg--font-weight: 600; --font-weight-title-lg: 600; --text-title-md: 30px; --text-title-md--line-height: 32px; --leading-title-md: 32px; --text-title-md--letter-spacing: 0px; --tracking-title-md: 0px; --text-title-md--font-weight: 600; --font-weight-title-md: 600; --text-title-sm: 22px; --text-title-sm--line-height: 25px; --leading-title-sm: 25px; --text-title-sm--letter-spacing: 0px; --tracking-title-sm: 0px; --text-title-sm--font-weight: 600; --font-weight-title-sm: 600; --text-body-lg: 18px; --text-body-lg--line-height: 27px; --leading-body-lg: 27px; --text-body-lg--letter-spacing: 0px; --tracking-body-lg: 0px; --text-body-lg--font-weight: 400; --font-weight-body-lg: 400; --text-body-md: 16px; --text-body-md--line-height: 25px; --leading-body-md: 25px; --text-body-md--letter-spacing: 0px; --tracking-body-md: 0px; --text-body-md--font-weight: 400; --font-weight-body-md: 400; --text-body-md-strong: 16px; --text-body-md-strong--line-height: 24px; --leading-body-md-strong: 24px; --text-body-md-strong--letter-spacing: 0px; --tracking-body-md-strong: 0px; --text-body-md-strong--font-weight: 500; --font-weight-body-md-strong: 500; --text-body-sm: 14px; --text-body-sm--line-height: 20px; --leading-body-sm: 20px; --text-body-sm--letter-spacing: 0px; --tracking-body-sm: 0px; --text-body-sm--font-weight: 400; --font-weight-body-sm: 400; --text-body-sm-strong: 14px; --text-body-sm-strong--line-height: 20px; --leading-body-sm-strong: 20px; --text-body-sm-strong--letter-spacing: 0px; --tracking-body-sm-strong: 0px; --text-body-sm-strong--font-weight: 500; --font-weight-body-sm-strong: 500; --text-caption: 12px; --text-caption--line-height: 16px; --leading-caption: 16px; --text-caption--letter-spacing: 0px; --tracking-caption: 0px; --text-caption--font-weight: 400; --font-weight-caption: 400; --text-caption-strong: 12px; --text-caption-strong--line-height: 16px; --leading-caption-strong: 16px; --text-caption-strong--letter-spacing: 0px; --tracking-caption-strong: 0px; --text-caption-strong--font-weight: 500; --font-weight-caption-strong: 500; --text-caption-mono: 12px; --text-caption-mono--line-height: 16px; --leading-caption-mono: 16px; --text-caption-mono--letter-spacing: 0px; --tracking-caption-mono: 0px; --text-caption-mono--font-weight: 500; --font-weight-caption-mono: 500; --text-code: 13px; --text-code--line-height: 20px; --leading-code: 20px; --text-code--letter-spacing: 0px; --tracking-code: 0px; --text-code--font-weight: 400; --font-weight-code: 400; --text-button-md: 14px; --text-button-md--line-height: 18px; --leading-button-md: 18px; --text-button-md--letter-spacing: 0px; --tracking-button-md: 0px; --text-button-md--font-weight: 500; --font-weight-button-md: 500; --text-button-lg: 16px; --text-button-lg--line-height: 24px; --leading-button-lg: 24px; --text-button-lg--letter-spacing: 0px; --tracking-button-lg: 0px; --text-button-lg--font-weight: 500; --font-weight-button-lg: 500; --radius-none: 0px; --radius-xs: 2px; --radius-sm: 4px; --radius-md: 6px; --radius-lg: 8px; --radius-xl: 10px; --radius-2xl: 12px; --radius-3xl: 16px; --radius-pill-sm: 64px; --radius-pill: 100px; --radius-full: 9999px; --ease-nc-emphasized: cubic-bezier(0.3, 0.7, 0.2, 1); --ease-nc-out-strong: cubic-bezier(0.23, 1, 0.32, 1); --ease-nc-in-out-strong: cubic-bezier(0.77, 0, 0.175, 1); --ease-nc-drawer: cubic-bezier(0.32, 0.72, 0, 1); --outline-width-focus: var(--spacing-nadicode-focus-outline-width); --outline-offset-focus: var(--spacing-nadicode-focus-outline-offset); --opacity-scrim: var(--nc-material-scrim-opacity); --spacing-nadicode-xxs: 4px; --spacing-nadicode-xs: 8px; --spacing-nadicode-sm: 12px; --spacing-nadicode-md: 16px; --spacing-nadicode-lg: 24px; --spacing-nadicode-xl: 32px; --spacing-nadicode-2xl: 40px; --spacing-nadicode-3xl: 48px; --spacing-nadicode-4xl: 64px; --spacing-nadicode-5xl: 96px; --spacing-nadicode-6xl: 128px; --spacing-nadicode-guide: 1px; --spacing-nadicode-icon-stroke: 1.6px; --spacing-nadicode-focus-outline-width: 2px; --spacing-nadicode-focus-outline-offset: 2px; --spacing-nadicode-control-height: 32px; --spacing-nadicode-control-padding-inline: 10px; --spacing-nadicode-touch-target: 44px; --spacing-nadicode-section: 192px; --spacing-nadicode-page-pad: 24px; --spacing-nadicode-page-max-mobile: 448px; --spacing-nadicode-page-max-tablet: 624px; --spacing-nadicode-page-max-desktop: 1440px; --spacing-nadicode-frame-max: 1392px; --spacing-nadicode-frame-gap: 24px; --spacing-nadicode-cell-padding: 24px; --spacing-nadicode-section-gap: 48px; --spacing-nadicode-cross-size-mobile: 11px; --spacing-nadicode-cross-size-tablet: 15px; --spacing-nadicode-cross-size-desktop: 21px; --spacing-nadicode-h-strip-mobile: 72px; --spacing-nadicode-h-strip-tablet: 80px; --spacing-nadicode-h-strip-desktop: 88px; --spacing-nadicode-h-cell-sm: 120px; --spacing-nadicode-h-cell-md-mobile: 144px; --spacing-nadicode-h-cell-md-tablet: 160px; --spacing-nadicode-h-cell-md-desktop: 168px; --spacing-nadicode-h-cell-lg-mobile: 220px; --spacing-nadicode-h-cell-lg-desktop: 240px; --spacing-nadicode-h-visual-mobile: 276px; --spacing-nadicode-h-visual-tablet: 318px; --spacing-nadicode-h-visual-desktop: 360px; --spacing-nadicode-h-precision-mobile: 276px; --spacing-nadicode-h-precision-tablet: 480px; --spacing-nadicode-h-precision-desktop: 720px; --spacing-nadicode-h-hero-mobile: 560px; --spacing-nadicode-h-hero-desktop: 720px; --spacing-nadicode-h-action-strip-mobile: 20px; --spacing-nadicode-h-action-strip-desktop: 32px; --spacing-nadicode-h-action-body-mobile: 320px; --spacing-nadicode-h-action-body-tablet: 338px; --spacing-nadicode-h-action-band: 260px; --spacing-nadicode-h-feature-mobile: 360px; --spacing-nadicode-h-feature-tablet: 400px; --spacing-nadicode-h-feature-desktop: 456px; --spacing-nadicode-h-editorial-feature-mobile: 360px; --spacing-nadicode-h-editorial-feature-tablet: 440px; --spacing-nadicode-h-editorial-feature-desktop: 560px; --spacing-nadicode-h-bento-primary: 384px; --spacing-nadicode-h-bento-secondary: 240px; --spacing-nadicode-h-bento-mobile-copy: 248px; --spacing-nadicode-h-bento-mobile-main: 537px; --spacing-nadicode-h-bento-strip: 20px; --spacing-nadicode-filter-chip-gap: 6px; --spacing-nadicode-filter-chip-height: 28px; --spacing-nadicode-filter-chip-icon: 14px; --spacing-control-height: var(--spacing-nadicode-control-height); --spacing-control-padding-inline: var(--spacing-nadicode-control-padding-inline); --spacing-touch-target: var(--spacing-nadicode-touch-target); }
674
668
  @theme inline { --color-background: var(--background); --color-foreground: var(--foreground); --color-card: var(--card); --color-card-foreground: var(--card-foreground); --color-popover: var(--popover); --color-popover-foreground: var(--popover-foreground); --color-primary: var(--primary); --color-primary-foreground: var(--primary-foreground); --color-primary-hover: var(--primary-hover); --color-primary-active: var(--primary-active); --color-secondary: var(--secondary); --color-secondary-foreground: var(--secondary-foreground); --color-muted: var(--muted); --color-muted-foreground: var(--muted-foreground); --color-placeholder: var(--placeholder); --color-accent: var(--accent); --color-accent-foreground: var(--accent-foreground); --color-destructive: var(--destructive); --color-destructive-foreground: var(--destructive-foreground); --color-warning: var(--warning); --color-warning-foreground: var(--warning-foreground); --color-success: var(--success); --color-success-foreground: var(--success-foreground); --color-border: var(--border); --color-input: var(--input); --color-ring: var(--ring); --color-scrim: var(--scrim); --color-chart-1: var(--chart-1); --color-chart-2: var(--chart-2); --color-chart-3: var(--chart-3); --color-chart-4: var(--chart-4); --color-chart-5: var(--chart-5); --color-sidebar: var(--sidebar); --color-sidebar-foreground: var(--sidebar-foreground); --color-sidebar-primary: var(--sidebar-primary); --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); --color-sidebar-primary-hover: var(--sidebar-primary-hover); --color-sidebar-accent: var(--sidebar-accent); --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); --color-sidebar-border: var(--sidebar-border); --color-sidebar-ring: var(--sidebar-ring); }
675
669
  }
676
670
 
@@ -77,7 +77,6 @@
77
77
  --nc-warning: oklch(0.8466 0.1678 84.63);
78
78
  --nc-warning-soft: oklch(0.9649 0.0461 90.87);
79
79
  --nc-warning-deep: oklch(0.4834 0.0995 82.44);
80
- --nc-flag-red: oklch(0.5688 0.1995 26.59);
81
80
  --nc-verde-vivo: oklch(0.5604 0.1485 151.68);
82
81
  --nc-selection-bg: oklch(0.1776 0.0000 0.00);
83
82
  --nc-selection-fg: oklch(0.9851 0.0000 0.00);
@@ -89,8 +88,6 @@
89
88
  --nc-state-review: oklch(0.8466 0.1678 84.63);
90
89
  --nc-state-blocked: oklch(0.5688 0.1995 26.59);
91
90
  --nc-state-complete: oklch(0.6415 0.1644 153.23);
92
- --nc-background-100: oklch(1.0000 0.0000 0.00);
93
- --nc-background-200: oklch(0.9851 0.0000 0.00);
94
91
  --nc-identity-verde: oklch(0.6415 0.1644 153.23);
95
92
  --nc-identity-rosso: oklch(0.5688 0.1995 26.59);
96
93
  --nc-identity-arancio: oklch(0.6824 0.2108 37.70);
@@ -143,9 +140,6 @@
143
140
  --nc-dark-info: oklch(0.7067 0.1528 272.08);
144
141
  --nc-dark-info-soft: oklch(0.2118 0.1033 268.28);
145
142
  --nc-dark-info-deep: oklch(0.8222 0.0888 274.44);
146
- --nc-dark-cyan: oklch(0.7820 0.1247 190.99);
147
- --nc-dark-cyan-soft: oklch(0.8646 0.1000 187.55);
148
- --nc-dark-cyan-deep: oklch(0.6347 0.1029 191.54);
149
143
  --nc-dark-success: oklch(0.7019 0.1753 153.20);
150
144
  --nc-dark-success-soft: oklch(0.2893 0.0697 156.32);
151
145
  --nc-dark-success-deep: oklch(0.8524 0.0996 159.83);
@@ -38,7 +38,6 @@
38
38
  "warning": "#ffc220",
39
39
  "warning-soft": "#fff3d1",
40
40
  "warning-deep": "#7a5800",
41
- "flag-red": "#d3302f",
42
41
  "verde-vivo": "#008c45",
43
42
  "selection-bg": "#111111",
44
43
  "selection-fg": "#fafafa",
@@ -50,8 +49,6 @@
50
49
  "state-review": "#ffc220",
51
50
  "state-blocked": "#d3302f",
52
51
  "state-complete": "#00a85a",
53
- "background-100": "#ffffff",
54
- "background-200": "#fafafa",
55
52
  "identity-verde": "#00a85a",
56
53
  "identity-rosso": "#d3302f",
57
54
  "identity-arancio": "#ff5a1f",
@@ -104,9 +101,6 @@
104
101
  "dark-info": "#8098ff",
105
102
  "dark-info-soft": "#070f47",
106
103
  "dark-info-deep": "#b3c1ff",
107
- "dark-cyan": "#33d1cb",
108
- "dark-cyan-soft": "#7ee8de",
109
- "dark-cyan-deep": "#1f9e9a",
110
104
  "dark-success": "#17bd68",
111
105
  "dark-success-soft": "#00351c",
112
106
  "dark-success-deep": "#93e3b8",
@@ -401,17 +401,6 @@
401
401
  "hex": "#7a5800"
402
402
  }
403
403
  },
404
- "flag-red": {
405
- "$value": {
406
- "colorSpace": "srgb",
407
- "components": [
408
- 0.827,
409
- 0.188,
410
- 0.184
411
- ],
412
- "hex": "#d3302f"
413
- }
414
- },
415
404
  "verde-vivo": {
416
405
  "$value": {
417
406
  "colorSpace": "srgb",
@@ -533,28 +522,6 @@
533
522
  "hex": "#00a85a"
534
523
  }
535
524
  },
536
- "background-100": {
537
- "$value": {
538
- "colorSpace": "srgb",
539
- "components": [
540
- 1,
541
- 1,
542
- 1
543
- ],
544
- "hex": "#ffffff"
545
- }
546
- },
547
- "background-200": {
548
- "$value": {
549
- "colorSpace": "srgb",
550
- "components": [
551
- 0.98,
552
- 0.98,
553
- 0.98
554
- ],
555
- "hex": "#fafafa"
556
- }
557
- },
558
525
  "identity-verde": {
559
526
  "$value": {
560
527
  "colorSpace": "srgb",
@@ -1127,39 +1094,6 @@
1127
1094
  "hex": "#b3c1ff"
1128
1095
  }
1129
1096
  },
1130
- "dark-cyan": {
1131
- "$value": {
1132
- "colorSpace": "srgb",
1133
- "components": [
1134
- 0.2,
1135
- 0.82,
1136
- 0.796
1137
- ],
1138
- "hex": "#33d1cb"
1139
- }
1140
- },
1141
- "dark-cyan-soft": {
1142
- "$value": {
1143
- "colorSpace": "srgb",
1144
- "components": [
1145
- 0.494,
1146
- 0.91,
1147
- 0.871
1148
- ],
1149
- "hex": "#7ee8de"
1150
- }
1151
- },
1152
- "dark-cyan-deep": {
1153
- "$value": {
1154
- "colorSpace": "srgb",
1155
- "components": [
1156
- 0.122,
1157
- 0.62,
1158
- 0.604
1159
- ],
1160
- "hex": "#1f9e9a"
1161
- }
1162
- },
1163
1097
  "dark-success": {
1164
1098
  "$value": {
1165
1099
  "colorSpace": "srgb",
@@ -4017,17 +3951,6 @@
4017
3951
  ],
4018
3952
  "hex": "#e5e5e5"
4019
3953
  }
4020
- },
4021
- "medallion": {
4022
- "$value": {
4023
- "colorSpace": "srgb",
4024
- "components": [
4025
- 0,
4026
- 0.549,
4027
- 0.271
4028
- ],
4029
- "hex": "#008c45"
4030
- }
4031
3954
  }
4032
3955
  },
4033
3956
  "dark": {
@@ -4306,17 +4229,6 @@
4306
4229
  ],
4307
4230
  "hex": "#262626"
4308
4231
  }
4309
- },
4310
- "medallion": {
4311
- "$value": {
4312
- "colorSpace": "srgb",
4313
- "components": [
4314
- 0.384,
4315
- 0.831,
4316
- 0.58
4317
- ],
4318
- "hex": "#62d494"
4319
- }
4320
4232
  }
4321
4233
  }
4322
4234
  },
@@ -401,17 +401,6 @@
401
401
  "hex": "#7a5800"
402
402
  }
403
403
  },
404
- "flag-red": {
405
- "$value": {
406
- "colorSpace": "srgb",
407
- "components": [
408
- 0.827,
409
- 0.188,
410
- 0.184
411
- ],
412
- "hex": "#d3302f"
413
- }
414
- },
415
404
  "verde-vivo": {
416
405
  "$value": {
417
406
  "colorSpace": "srgb",
@@ -533,28 +522,6 @@
533
522
  "hex": "#00a85a"
534
523
  }
535
524
  },
536
- "background-100": {
537
- "$value": {
538
- "colorSpace": "srgb",
539
- "components": [
540
- 1,
541
- 1,
542
- 1
543
- ],
544
- "hex": "#ffffff"
545
- }
546
- },
547
- "background-200": {
548
- "$value": {
549
- "colorSpace": "srgb",
550
- "components": [
551
- 0.98,
552
- 0.98,
553
- 0.98
554
- ],
555
- "hex": "#fafafa"
556
- }
557
- },
558
525
  "identity-verde": {
559
526
  "$value": {
560
527
  "colorSpace": "srgb",
@@ -1127,39 +1094,6 @@
1127
1094
  "hex": "#b3c1ff"
1128
1095
  }
1129
1096
  },
1130
- "dark-cyan": {
1131
- "$value": {
1132
- "colorSpace": "srgb",
1133
- "components": [
1134
- 0.2,
1135
- 0.82,
1136
- 0.796
1137
- ],
1138
- "hex": "#33d1cb"
1139
- }
1140
- },
1141
- "dark-cyan-soft": {
1142
- "$value": {
1143
- "colorSpace": "srgb",
1144
- "components": [
1145
- 0.494,
1146
- 0.91,
1147
- 0.871
1148
- ],
1149
- "hex": "#7ee8de"
1150
- }
1151
- },
1152
- "dark-cyan-deep": {
1153
- "$value": {
1154
- "colorSpace": "srgb",
1155
- "components": [
1156
- 0.122,
1157
- 0.62,
1158
- 0.604
1159
- ],
1160
- "hex": "#1f9e9a"
1161
- }
1162
- },
1163
1097
  "dark-success": {
1164
1098
  "$value": {
1165
1099
  "colorSpace": "srgb",
@@ -3817,9 +3751,6 @@
3817
3751
  },
3818
3752
  "user-bubble-border": {
3819
3753
  "$value": "{nadicode.core.color.line}"
3820
- },
3821
- "medallion": {
3822
- "$value": "{nadicode.core.color.verde-vivo}"
3823
3754
  }
3824
3755
  },
3825
3756
  "dark": {
@@ -3882,7 +3813,7 @@
3882
3813
  "$value": "{nadicode.core.color.dark-focus-ring}"
3883
3814
  },
3884
3815
  "destructive": {
3885
- "$value": "{nadicode.core.color.flag-red}"
3816
+ "$value": "{nadicode.core.color.error}"
3886
3817
  },
3887
3818
  "destructive-foreground": {
3888
3819
  "$value": "{nadicode.core.color.on-primary}"
@@ -3898,9 +3829,6 @@
3898
3829
  },
3899
3830
  "user-bubble-border": {
3900
3831
  "$value": "{nadicode.core.color.dark-line}"
3901
- },
3902
- "medallion": {
3903
- "$value": "{nadicode.core.color.dark-verde-vivo}"
3904
3832
  }
3905
3833
  }
3906
3834
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nadicodeai/design-system",
3
- "version": "5.3.6",
3
+ "version": "6.0.0",
4
4
  "type": "module",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -121,18 +121,6 @@
121
121
  "types": "./src/assets/nadia-asset.d.ts",
122
122
  "default": "./dist/assets/nadia-01-solid-surface.png"
123
123
  },
124
- "./assets/nadia-ordered-points": {
125
- "types": "./src/assets/nadia-asset.d.ts",
126
- "default": "./dist/assets/nadia-02-ordered-points.png"
127
- },
128
- "./assets/nadia-triangulated-wire": {
129
- "types": "./src/assets/nadia-asset.d.ts",
130
- "default": "./dist/assets/nadia-03-triangulated-wire.png"
131
- },
132
- "./assets/nadia-irregular-particles": {
133
- "types": "./src/assets/nadia-asset.d.ts",
134
- "default": "./dist/assets/nadia-04-irregular-particles.png"
135
- },
136
124
  "./assets/fonts/geist.css": "./src/assets/fonts/geist.css",
137
125
  "./assets/fonts/*": "./src/assets/fonts/*"
138
126
  },
@@ -167,7 +155,7 @@
167
155
  "@google/design.md": "0.4.0",
168
156
  "@nadicodeai/eslint-plugin": "*",
169
157
  "@playwright/test": "^1.63.0",
170
- "@types/node": "^22",
158
+ "@types/node": "^24",
171
159
  "ajv": "8.20.0",
172
160
  "ajv-formats": "3.0.1",
173
161
  "esbuild": "^0.28.2",