@nadicodeai/design-system 0.5.0 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +1 -1
- package/DESIGN.md +45 -29
- package/README.md +1 -1
- package/dist/css/components/state-tag.css +1 -1
- package/dist/css/primitives.css +36 -0
- package/dist/css/tokens.generated.css +12 -5
- package/dist/tailwind/nadicode.tailwind.json +13 -6
- package/dist/tailwind/nadicode.theme.css +31 -12
- package/dist/tokens/nadicode.dtcg.json +82 -20
- package/package.json +1 -1
package/AGENTS.md
CHANGED
|
@@ -41,7 +41,7 @@ Generated-artifact and runtime-JS prohibitions live in the Forbidden Patterns ta
|
|
|
41
41
|
| --- | --- | --- | --- |
|
|
42
42
|
| Design token, contract, or token-pipeline change | `DESIGN.md`, `scripts/sd/config.ts`, `scripts/sd/transforms.ts`, `scripts/sd/format-token-layer.ts`, `scripts/sd/format-tailwind-v4-theme.ts` | `npm exec -- design.md spec`, `scripts/build.ts`, `tests/token-structural-parity.test.ts`, `tests/consumer-css-discipline.test.ts`, `tests/tailwind-v4-theme.test.ts` | `npm run lint:design && npm run build && npm run test` |
|
|
43
43
|
| Kernel geometry or component work | `DESIGN.md` Layout and Components | `src/css/index.css`, `src/css/layout.css`, `src/css/primitives.css`, `src/css/components/*.css`, `src/css/motion.css`, `tests/kernel-css-architecture.test.ts`, `tests/kernel-rendered-geometry.test.ts` | from design-system/: `npx vitest run tests/kernel-css-architecture.test.ts tests/kernel-rendered-geometry.test.ts` |
|
|
44
|
-
| CSS component or `examples/` specimen work | `DESIGN.md` Layout and Components | `src/css/components/`, `examples/`, `../skills/nadicodeai-brand-copy/SKILL.md`, `../skills/nadicodeai-brand-copy/references/
|
|
44
|
+
| CSS component or `examples/` specimen work | `DESIGN.md` Layout and Components | `src/css/components/`, `examples/`, `../skills/nadicodeai-brand-copy/SKILL.md`, `../skills/nadicodeai-brand-copy/references/writing-craft.md`, `../skills/nadicodeai-brand-copy/references/brand-voice-profile.md`, `../skills/nadicodeai-brand-copy/references/voice-examples.md` | `npm run test -- tests/examples-package-coherence.test.ts` |
|
|
45
45
|
| Package consumption or export surface | `README.md` | `package.json`, `scripts/build.ts`, `dist/tailwind/`, `dist/tokens/` | `npm run build && npm run test -- tests/build-produces-exports.test.ts tests/tailwind-v4-theme.test.ts` |
|
|
46
46
|
|
|
47
47
|
## DESIGN.md Authoring
|
package/DESIGN.md
CHANGED
|
@@ -128,15 +128,19 @@ colors:
|
|
|
128
128
|
dark-cyan-soft: "#7ee8de"
|
|
129
129
|
dark-cyan-deep: "#1f9e9a"
|
|
130
130
|
dark-success: "#62d494"
|
|
131
|
-
dark-state-ready: "#
|
|
132
|
-
dark-state-running: "#
|
|
133
|
-
dark-state-review: "#
|
|
134
|
-
dark-state-blocked: "#
|
|
135
|
-
dark-state-complete: "#
|
|
131
|
+
dark-state-ready: "#8f8f8f"
|
|
132
|
+
dark-state-running: "#4f6ae6"
|
|
133
|
+
dark-state-review: "#f5a623"
|
|
134
|
+
dark-state-blocked: "#cd212a"
|
|
135
|
+
dark-state-complete: "#008c45"
|
|
136
136
|
dark-selection-bg: "#ededed"
|
|
137
137
|
dark-selection-fg: "#0a0a0a"
|
|
138
138
|
dark-cross: "#6e6e6e"
|
|
139
139
|
dark-chart-1: "#7d99f2"
|
|
140
|
+
dark-chart-2: "#17b568"
|
|
141
|
+
dark-chart-3: "#ffd97d"
|
|
142
|
+
dark-chart-4: "#f28085"
|
|
143
|
+
dark-chart-5: "#33d1cb"
|
|
140
144
|
dark-chart-6: "#9575cd"
|
|
141
145
|
|
|
142
146
|
typography:
|
|
@@ -256,6 +260,7 @@ rounded:
|
|
|
256
260
|
|
|
257
261
|
spacing:
|
|
258
262
|
xxs: 4px
|
|
263
|
+
filter-chip-gap: 6px
|
|
259
264
|
xs: 8px
|
|
260
265
|
sm: 12px
|
|
261
266
|
md: 16px
|
|
@@ -312,6 +317,8 @@ spacing:
|
|
|
312
317
|
h-bento-mobile-copy: 248px
|
|
313
318
|
h-bento-mobile-main: 537px
|
|
314
319
|
h-bento-strip: 20px
|
|
320
|
+
filter-chip-height: 28px
|
|
321
|
+
filter-chip-icon: 14px
|
|
315
322
|
|
|
316
323
|
components:
|
|
317
324
|
label-mono:
|
|
@@ -348,6 +355,13 @@ components:
|
|
|
348
355
|
typography: "{typography.caption}"
|
|
349
356
|
rounded: "{rounded.full}"
|
|
350
357
|
padding: "0px {spacing.xs}"
|
|
358
|
+
filter-chip:
|
|
359
|
+
backgroundColor: "{colors.canvas-soft}"
|
|
360
|
+
textColor: "{colors.body}"
|
|
361
|
+
typography: "{typography.caption}"
|
|
362
|
+
rounded: "{rounded.sm}"
|
|
363
|
+
padding: "0px {spacing.xs}"
|
|
364
|
+
height: "{spacing.filter-chip-height}"
|
|
351
365
|
state-tag-ready:
|
|
352
366
|
backgroundColor: "{colors.canvas}"
|
|
353
367
|
textColor: "{colors.ink}"
|
|
@@ -479,12 +493,12 @@ Backgrounds are `{colors.background-100}` (page default, white) and `{colors.bac
|
|
|
479
493
|
- **Semantic feedback** (`{colors.success}`, `{colors.error}` + `{colors.error-soft}`/`{colors.error-deep}`, `{colors.warning}` + `{colors.warning-soft}`/`{colors.warning-deep}`, `{colors.info}`): validation, caution, approval, and operational feedback. `success` uses `green-italia-700`; `error` uses `red-italia-800` with soft/deep on `red-italia-200`/`red-italia-900`; `warning` uses `amber-600` with soft/deep on `amber-200`/`amber-900`; `info` (`blue-cobalto-700`) is the new informational role.
|
|
480
494
|
- **Accent** (`{colors.accent}` = `red-italia-700`): UI highlights, badges, and selected markers. Flag red is now an active accent — the former "decoration-only" restriction on flag red is retired. Do not conflate this functional Italia `accent` with the identically-named shadcn surface role `accent`: the latter is a neutral (mapped to `{colors.canvas-soft-2}` in light and `{colors.dark-canvas-soft-2}` in dark) and carries no flag-red hue despite the shared word.
|
|
481
495
|
- **Flag Red** (`{colors.flag-red}`): kept as a stable alias at the same value as `{colors.accent}` (`red-italia-700`, `#cd212a`). `accent` and `flag-red` are two roles at one hex: `accent` is the interface-highlight role, `flag-red` is the identity-mark alias. `error` (`red-italia-800`) stays a distinct, deeper red; never use it as an accent.
|
|
482
|
-
- **Workflow States** (`{colors.state-ready}`, `{colors.state-running}`, `{colors.state-review}`, `{colors.state-blocked}`, `{colors.state-complete}`): the left-border/state vocabulary for agentic work surfaces. `state-running` is
|
|
496
|
+
- **Workflow States** (`{colors.state-ready}`, `{colors.state-running}`, `{colors.state-review}`, `{colors.state-blocked}`, `{colors.state-complete}`): the left-border/state vocabulary for agentic work surfaces. `state-running` is `blue-cobalto-700` and `state-complete` is `green-italia-700` — blue means in motion, green means done; `state-ready` is `gray-900`. The dark counterparts (`{colors.dark-state-ready}`, `{colors.dark-state-running}`, `{colors.dark-state-review}`, `{colors.dark-state-blocked}`, `{colors.dark-state-complete}`) preserve the same functional identity instead of shifting to pastel labels: ready uses `gray-700`, running uses `blue-cobalto-600`, review reuses `amber-600`, blocked uses `red-italia-700`, and complete reuses `green-italia-700`. These state colors are carried only by the `state-tag` 3 px `border-left` rail and related non-text state accents; label text stays on the neutral foreground roles for contrast in both light and dark.
|
|
483
497
|
|
|
484
498
|
### Chart categoricals (functional tier)
|
|
485
499
|
|
|
486
|
-
- **Charts** (`{colors.chart-1}`…`{colors.chart-6}`): the categorical series palette — cobalto, verde, ambra, rosso, plus a functional-only teal and viola. Functional only: never place chart colours on marketing surfaces, campi, or generated imagery. On the dark canvas
|
|
487
|
-
- **Categorical distinguishability**: the same-family neighbours are held apart — `chart-3`/`chart-4` (ambra/rosso) and `chart-2`/`chart-5` (verde/teal) each clear a CIEDE2000 ≥ 20 normal / ≥ 15 deuteranopia-simulated floor. Two proximities are brand-locked and exempt from the numeric floor: `chart-2`/`chart-4` (verde/rosso, the flag pair, which collapses under red-green deficiency by identity) and `chart-1`/`chart-6` (cobalto/viola, adjacent blue-violet). Charts using the full six must carry redundant encoding (direct labels, position, or pattern), never hue alone, so these two pairs stay readable under colour-vision deficiency.
|
|
500
|
+
- **Charts** (`{colors.chart-1}`…`{colors.chart-6}`): the categorical series palette — cobalto, verde, ambra, rosso, plus a functional-only teal and viola. Functional only: never place chart colours on marketing surfaces, campi, or generated imagery. On the dark canvas all six series carry dark-tuned steps, remapped in the `.dark` scope so any consumer reading the semantic token gets the right hue in both modes: `{colors.dark-chart-1}` on `blue-cobalto-500`, `{colors.dark-chart-2}` on `green-italia-600`, `{colors.dark-chart-3}` on `amber-400`, `{colors.dark-chart-4}` on `red-italia-500`, `{colors.dark-chart-5}` on the `dark-cyan` value, `{colors.dark-chart-6}` a lighter viola. Clearing the 3:1 WCAG 1.4.11 data-mark floor is necessary but not sufficient on the near-black canvas: the full-saturation light hues read as loud saturated blocks there, so each dark step lightens or desaturates its hue while keeping series identity, and all six clear 3:1 against `{colors.dark-canvas}`. Verde takes the one-step move to `green-italia-600` (not the mint `green-italia-500`) so the verde/teal separation survives in normal vision.
|
|
501
|
+
- **Categorical distinguishability**: the same-family neighbours are held apart — `chart-3`/`chart-4` (ambra/rosso) and `chart-2`/`chart-5` (verde/teal) each clear a CIEDE2000 ≥ 20 normal / ≥ 15 deuteranopia-simulated floor, in the light set and in the dark-tuned set alike. Two proximities are brand-locked and exempt from the numeric floor: `chart-2`/`chart-4` (verde/rosso, the flag pair, which collapses under red-green deficiency by identity) and `chart-1`/`chart-6` (cobalto/viola, adjacent blue-violet). Charts using the full six must carry redundant encoding (direct labels, position, or pattern), never hue alone, so these two pairs stay readable under colour-vision deficiency.
|
|
488
502
|
|
|
489
503
|
### Brand tier — i campi
|
|
490
504
|
|
|
@@ -503,9 +517,9 @@ Four campo rules govern their use:
|
|
|
503
517
|
|
|
504
518
|
### Dark primitives
|
|
505
519
|
|
|
506
|
-
**Dark Primitives** (`{colors.dark-canvas}`, `{colors.dark-ink}`, `{colors.dark-line}`, and siblings) are the source tokens for the generated shadcn `.dark` role map — mode-bearing primitives, not a separate palette; consuming apps opt in by applying a `.dark` ancestor through their runtime theme provider. The dark neutrals (`dark-canvas`, `dark-canvas-soft`, `dark-canvas-soft-2`, `dark-ink`, `dark-body`, `dark-muted`, `dark-line`, `dark-input`, `dark-seam`, `dark-primary`, `dark-on-primary`) are true neutrals: each is a pure gray (equal channels) so the interface carries no ambient tint, and they step in clear elevation planes (`dark-canvas` → `dark-canvas-soft` → `dark-canvas-soft-2`). `dark-input` is the resting text-input boundary, held one gray brighter than the decorative `dark-line` border so a field edge clears non-text contrast before the focus ring appears. Chroma lives only in the intentional accents: the dark semantic ramps ride the same Italia scales as their light counterparts, moved to lighter steps
|
|
520
|
+
**Dark Primitives** (`{colors.dark-canvas}`, `{colors.dark-ink}`, `{colors.dark-line}`, and siblings) are the source tokens for the generated shadcn `.dark` role map — mode-bearing primitives, not a separate palette; consuming apps opt in by applying a `.dark` ancestor through their runtime theme provider. The dark neutrals (`dark-canvas`, `dark-canvas-soft`, `dark-canvas-soft-2`, `dark-ink`, `dark-body`, `dark-muted`, `dark-line`, `dark-input`, `dark-seam`, `dark-primary`, `dark-on-primary`) are true neutrals: each is a pure gray (equal channels) so the interface carries no ambient tint, and they step in clear elevation planes (`dark-canvas` → `dark-canvas-soft` → `dark-canvas-soft-2`). `dark-input` is the resting text-input boundary, held one gray brighter than the decorative `dark-line` border so a field edge clears non-text contrast before the focus ring appears. Chroma lives only in the intentional accents: the dark semantic ramps ride the same Italia scales as their light counterparts, moved to lighter steps where they are text-bearing — `dark-link`/`dark-link-deep` on `green-italia-400`/`green-italia-300`, `dark-error`/`dark-error-deep` on `red-italia-400`/`red-italia-300`, `dark-warning`/`dark-warning-deep` on `amber-400`/`amber-300`, with the `*-soft` tinted grounds on each scale's `1000` step, plus `dark-success` on `green-italia-500` for the positive-feedback green. The `dark-state-*` workflow family is not a text role; it preserves the matching ready/running/review/blocked/complete rail colors for 3 px state accents while text stays on neutral foreground roles. The remaining dark-ramp members stay true-neutral: `dark-selection-bg`/`dark-selection-fg` invert the light selection (a bright neutral ground with dark text) and `dark-cross` is the visible mark gray, brighter than the decorative `dark-line`. Never reintroduce hue into the neutral set.
|
|
507
521
|
|
|
508
|
-
This grayscale-only discipline is not dark-specific: it governs the whole generated shadcn surface-role bridge in both the light `:root` and dark `.dark` maps. The surface-role family — `background`, `card`, `popover`, `muted`, `secondary`, the `sidebar` roles and their `-foreground`/`-border` variants, plus `border` and `input` — resolves only to pure grays (equal channels) in both themes; hue in the role bridge is reserved for `primary`, `destructive`, and the focus rings (`ring`/`sidebar-ring`). Large product surfaces never take a tinted fill.
|
|
522
|
+
This grayscale-only discipline is not dark-specific: it governs the whole generated shadcn surface-role bridge in both the light `:root` and dark `.dark` maps. The surface-role family — `background`, `card`, `popover`, `muted`, `secondary`, the `sidebar` roles and their `-foreground`/`-border` variants, plus `border` and `input` — resolves only to pure grays (equal channels) in both themes; hue in the role bridge is reserved for `primary`, `destructive`, and the focus rings (`ring`/`sidebar-ring`). 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 black 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.
|
|
509
523
|
|
|
510
524
|
Do not delete a color because the current website kernel does not consume it. Prototype usage is not palette authority; removals require an explicit palette migration decision.
|
|
511
525
|
|
|
@@ -515,25 +529,25 @@ Geist Sans carries all narrative and interface copy. Geist Mono is reserved for
|
|
|
515
529
|
|
|
516
530
|
All body, title, caption, and code typography uses `letterSpacing: 0px`. Do not use viewport-scaled type (no `vw`/`vh` font sizing): use fixed token sizes stepped by breakpoint-specific rules when a headline must grow. The two large display tiers carry a small negative tracking — `display-xl` at `-1.5px` and `display-lg` at `-1px` — so large type reads optically tight; this is a display-heading-only exception and every non-display tier stays at `0px`.
|
|
517
531
|
|
|
518
|
-
| Token
|
|
519
|
-
|
|
|
520
|
-
| `{typography.display-xl}`
|
|
521
|
-
| `{typography.display-lg}`
|
|
522
|
-
| `{typography.display-md}`
|
|
523
|
-
| `{typography.display-sm}`
|
|
524
|
-
| `{typography.title-lg}`
|
|
525
|
-
| `{typography.title-md}`
|
|
526
|
-
| `{typography.title-sm}`
|
|
527
|
-
| `{typography.body-lg}`
|
|
528
|
-
| `{typography.body-md}`
|
|
529
|
-
| `{typography.body-md-strong}` | 16px | 500
|
|
530
|
-
| `{typography.body-sm}`
|
|
531
|
-
| `{typography.body-sm-strong}` | 14px | 500
|
|
532
|
-
| `{typography.caption}`
|
|
533
|
-
| `{typography.caption-mono}`
|
|
534
|
-
| `{typography.code}`
|
|
535
|
-
| `{typography.button-lg}`
|
|
536
|
-
| `{typography.button-md}`
|
|
532
|
+
| Token | Size | Weight | Line Height | Use |
|
|
533
|
+
| ----------------------------- | ---- | ------ | ----------- | -------------------------------------------------------------------------- |
|
|
534
|
+
| `{typography.display-xl}` | 72px | 600 | 74px | Large desktop homepage hero only. |
|
|
535
|
+
| `{typography.display-lg}` | 52px | 600 | 54px | Compact hero and major landing headlines. |
|
|
536
|
+
| `{typography.display-md}` | 24px | 600 | 32px | Recovered display tier for compact cards, pricing names, and asset labels. |
|
|
537
|
+
| `{typography.display-sm}` | 20px | 600 | 28px | Recovered small display tier for inline display micro-headings. |
|
|
538
|
+
| `{typography.title-lg}` | 40px | 600 | 41px | Kernel specimen headings and major section headings. |
|
|
539
|
+
| `{typography.title-md}` | 30px | 600 | 32px | Standard section title. |
|
|
540
|
+
| `{typography.title-sm}` | 22px | 600 | 25px | Cell and artifact titles. |
|
|
541
|
+
| `{typography.body-lg}` | 18px | 400 | 27px | Hero/lead paragraphs. |
|
|
542
|
+
| `{typography.body-md}` | 16px | 400 | 25px | Default body copy. |
|
|
543
|
+
| `{typography.body-md-strong}` | 16px | 500 | 24px | Emphasised body copy at the default size. |
|
|
544
|
+
| `{typography.body-sm}` | 14px | 400 | 20px | Secondary copy, nav, compact cell copy. |
|
|
545
|
+
| `{typography.body-sm-strong}` | 14px | 500 | 20px | Emphasised secondary copy and compact labels. |
|
|
546
|
+
| `{typography.caption}` | 12px | 400 | 16px | Footer secondary lines and badge labels. |
|
|
547
|
+
| `{typography.caption-mono}` | 12px | 500 | 16px | Eyebrows, labels, status tags. |
|
|
548
|
+
| `{typography.code}` | 13px | 400 | 20px | Tool calls, snippets, traces. |
|
|
549
|
+
| `{typography.button-lg}` | 16px | 500 | 24px | Marketing-scale button labels. |
|
|
550
|
+
| `{typography.button-md}` | 14px | 500 | 18px | Standard button and control labels. |
|
|
537
551
|
|
|
538
552
|
## Layout
|
|
539
553
|
|
|
@@ -648,6 +662,8 @@ Interactive CSS components must expose a visible `:focus-visible` state using th
|
|
|
648
662
|
|
|
649
663
|
**`badge-secondary`** — small rounded metadata badge for "New", "Beta", "Live", or similar labels.
|
|
650
664
|
|
|
665
|
+
**`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.
|
|
666
|
+
|
|
651
667
|
**`link-inline`** — inline body link. Uses `{colors.link}` and normal body rhythm.
|
|
652
668
|
|
|
653
669
|
### Content Surfaces
|
package/README.md
CHANGED
|
@@ -11,7 +11,7 @@ For Tailwind CSS v4 CSS-first projects, `npm run build` also emits `dist/tailwin
|
|
|
11
11
|
@import "@nadicodeai/design-system/tailwind/theme.css";
|
|
12
12
|
```
|
|
13
13
|
|
|
14
|
-
The CSS adapter provides shadcn-compatible semantic utilities such as `bg-background`, `text-foreground`, `bg-primary`, `text-primary-foreground`, `border-border`, and `ring-ring`. It publishes both `:root` light roles and `.dark` dark roles; consuming apps opt into dark mode by applying a `.dark` ancestor, normally through their own theme provider. NadicodeAI-specific spacing utilities are namespaced, for example `p-nadicode-lg` and `h-nadicode-h-cell-sm`, so standard Tailwind/shadcn classes such as `max-w-3xl` keep their normal Tailwind behavior. React consumers normally get this through `@nadicodeai/ui/globals.css`.
|
|
14
|
+
The CSS adapter provides shadcn-compatible semantic utilities such as `bg-background`, `text-foreground`, `bg-primary`, `text-primary-foreground`, `border-border`, and `ring-ring`. It publishes both `:root` light roles and `.dark` dark roles; consuming apps opt into dark mode by applying a `.dark` ancestor, normally through their own theme provider. The raw `--nc-*` brand-token remaps (the state, selection, cross, and chart families) are the one exception: they are emitted at `:root.dark`, so they flip only when the `dark` class sits on the root element itself (the next-themes `attribute="class"` default), not on an inner wrapper. NadicodeAI-specific spacing utilities are namespaced, for example `p-nadicode-lg` and `h-nadicode-h-cell-sm`, so standard Tailwind/shadcn classes such as `max-w-3xl` keep their normal Tailwind behavior. React consumers normally get this through `@nadicodeai/ui/globals.css`.
|
|
15
15
|
|
|
16
16
|
Geist and Geist Mono (SIL Open Font License 1.1) ship inside the package under `src/assets/fonts/`. Consumers can pull the `@font-face` shim directly:
|
|
17
17
|
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
* dark-grounded, not a light chip on the dark canvas. Scoped to the component
|
|
37
37
|
* because canvas/ink/line are global neutrals that must not be remapped in the
|
|
38
38
|
* unscoped .dark block. The variant state colors flip separately via the
|
|
39
|
-
* generated .dark --nc-state-* remap in the Tailwind theme map. Direct
|
|
39
|
+
* generated :root.dark --nc-state-* remap in the Tailwind theme map. Direct
|
|
40
40
|
* counterparts: the tag stays a canvas-grounded chip in both themes.
|
|
41
41
|
*/
|
|
42
42
|
.dark .nc-state-tag {
|
package/dist/css/primitives.css
CHANGED
|
@@ -273,6 +273,42 @@
|
|
|
273
273
|
color: var(--nc-body);
|
|
274
274
|
}
|
|
275
275
|
|
|
276
|
+
/* nc-filter-chip — removable selected-filter label (DESIGN.md filter-chip).
|
|
277
|
+
It uses neutral chrome only: applied filter state is not workflow, lifecycle,
|
|
278
|
+
or taxonomy state, so color is reserved for the remove affordance focus ring. */
|
|
279
|
+
.nc-filter-chip {
|
|
280
|
+
display: inline-flex;
|
|
281
|
+
width: fit-content;
|
|
282
|
+
min-height: var(--nc-filter-chip-height);
|
|
283
|
+
align-items: center;
|
|
284
|
+
justify-content: center;
|
|
285
|
+
gap: var(--nc-filter-chip-gap);
|
|
286
|
+
border: var(--nc-guide) solid var(--nc-line);
|
|
287
|
+
border-radius: var(--nc-rounded-sm);
|
|
288
|
+
padding: 0 var(--nc-xs);
|
|
289
|
+
background: var(--nc-canvas-soft);
|
|
290
|
+
color: var(--nc-body);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
.nc-filter-chip svg {
|
|
294
|
+
width: var(--nc-filter-chip-icon);
|
|
295
|
+
height: var(--nc-filter-chip-icon);
|
|
296
|
+
flex: none;
|
|
297
|
+
stroke: currentColor;
|
|
298
|
+
stroke-width: 1.5;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
.dark .nc-filter-chip {
|
|
302
|
+
border-color: var(--nc-dark-line);
|
|
303
|
+
background: var(--nc-dark-canvas-soft);
|
|
304
|
+
color: var(--nc-dark-body);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
.nc-filter-chip:focus-visible {
|
|
308
|
+
outline: 2px solid var(--nc-link);
|
|
309
|
+
outline-offset: 2px;
|
|
310
|
+
}
|
|
311
|
+
|
|
276
312
|
/* nc-link-inline — the inline body link style (DESIGN.md link-inline). It reads
|
|
277
313
|
in the {colors.link} accent against the body rhythm (the body type is applied
|
|
278
314
|
in markup via .nc-type-body-md), keeps the natural underline so it stays
|
|
@@ -125,19 +125,24 @@
|
|
|
125
125
|
--nc-dark-cyan-soft: #7ee8de;
|
|
126
126
|
--nc-dark-cyan-deep: #1f9e9a;
|
|
127
127
|
--nc-dark-success: #62d494;
|
|
128
|
-
--nc-dark-state-ready: #
|
|
129
|
-
--nc-dark-state-running: #
|
|
130
|
-
--nc-dark-state-review: #
|
|
131
|
-
--nc-dark-state-blocked: #
|
|
132
|
-
--nc-dark-state-complete: #
|
|
128
|
+
--nc-dark-state-ready: #8f8f8f;
|
|
129
|
+
--nc-dark-state-running: #4f6ae6;
|
|
130
|
+
--nc-dark-state-review: #f5a623;
|
|
131
|
+
--nc-dark-state-blocked: #cd212a;
|
|
132
|
+
--nc-dark-state-complete: #008c45;
|
|
133
133
|
--nc-dark-selection-bg: #ededed;
|
|
134
134
|
--nc-dark-selection-fg: #0a0a0a;
|
|
135
135
|
--nc-dark-cross: #6e6e6e;
|
|
136
136
|
--nc-dark-chart-1: #7d99f2;
|
|
137
|
+
--nc-dark-chart-2: #17b568;
|
|
138
|
+
--nc-dark-chart-3: #ffd97d;
|
|
139
|
+
--nc-dark-chart-4: #f28085;
|
|
140
|
+
--nc-dark-chart-5: #33d1cb;
|
|
137
141
|
--nc-dark-chart-6: #9575cd;
|
|
138
142
|
|
|
139
143
|
/* Spacing */
|
|
140
144
|
--nc-xxs: 4px;
|
|
145
|
+
--nc-filter-chip-gap: 6px;
|
|
141
146
|
--nc-xs: 8px;
|
|
142
147
|
--nc-sm: 12px;
|
|
143
148
|
--nc-md: 16px;
|
|
@@ -194,6 +199,8 @@
|
|
|
194
199
|
--nc-h-bento-mobile-copy: 248px;
|
|
195
200
|
--nc-h-bento-mobile-main: 537px;
|
|
196
201
|
--nc-h-bento-strip: 20px;
|
|
202
|
+
--nc-filter-chip-height: 28px;
|
|
203
|
+
--nc-filter-chip-icon: 14px;
|
|
197
204
|
|
|
198
205
|
/* Radii */
|
|
199
206
|
--nc-rounded-none: 0px;
|
|
@@ -122,15 +122,19 @@
|
|
|
122
122
|
"dark-cyan-soft": "#7ee8de",
|
|
123
123
|
"dark-cyan-deep": "#1f9e9a",
|
|
124
124
|
"dark-success": "#62d494",
|
|
125
|
-
"dark-state-ready": "#
|
|
126
|
-
"dark-state-running": "#
|
|
127
|
-
"dark-state-review": "#
|
|
128
|
-
"dark-state-blocked": "#
|
|
129
|
-
"dark-state-complete": "#
|
|
125
|
+
"dark-state-ready": "#8f8f8f",
|
|
126
|
+
"dark-state-running": "#4f6ae6",
|
|
127
|
+
"dark-state-review": "#f5a623",
|
|
128
|
+
"dark-state-blocked": "#cd212a",
|
|
129
|
+
"dark-state-complete": "#008c45",
|
|
130
130
|
"dark-selection-bg": "#ededed",
|
|
131
131
|
"dark-selection-fg": "#0a0a0a",
|
|
132
132
|
"dark-cross": "#6e6e6e",
|
|
133
133
|
"dark-chart-1": "#7d99f2",
|
|
134
|
+
"dark-chart-2": "#17b568",
|
|
135
|
+
"dark-chart-3": "#ffd97d",
|
|
136
|
+
"dark-chart-4": "#f28085",
|
|
137
|
+
"dark-chart-5": "#33d1cb",
|
|
134
138
|
"dark-chart-6": "#9575cd"
|
|
135
139
|
},
|
|
136
140
|
"fontFamily": {
|
|
@@ -337,6 +341,7 @@
|
|
|
337
341
|
},
|
|
338
342
|
"spacing": {
|
|
339
343
|
"xxs": "4px",
|
|
344
|
+
"filter-chip-gap": "6px",
|
|
340
345
|
"xs": "8px",
|
|
341
346
|
"sm": "12px",
|
|
342
347
|
"md": "16px",
|
|
@@ -392,7 +397,9 @@
|
|
|
392
397
|
"h-bento-secondary": "240px",
|
|
393
398
|
"h-bento-mobile-copy": "248px",
|
|
394
399
|
"h-bento-mobile-main": "537px",
|
|
395
|
-
"h-bento-strip": "20px"
|
|
400
|
+
"h-bento-strip": "20px",
|
|
401
|
+
"filter-chip-height": "28px",
|
|
402
|
+
"filter-chip-icon": "14px"
|
|
396
403
|
}
|
|
397
404
|
}
|
|
398
405
|
}
|
|
@@ -42,9 +42,9 @@
|
|
|
42
42
|
--radius: var(--radius-md);
|
|
43
43
|
--background: var(--color-dark-canvas);
|
|
44
44
|
--foreground: var(--color-dark-ink);
|
|
45
|
-
--card: var(--color-dark-canvas
|
|
45
|
+
--card: var(--color-dark-canvas);
|
|
46
46
|
--card-foreground: var(--color-dark-ink);
|
|
47
|
-
--popover: var(--color-dark-canvas
|
|
47
|
+
--popover: var(--color-dark-canvas);
|
|
48
48
|
--popover-foreground: var(--color-dark-ink);
|
|
49
49
|
--primary: var(--color-dark-primary);
|
|
50
50
|
--primary-foreground: var(--color-dark-on-primary);
|
|
@@ -60,11 +60,11 @@
|
|
|
60
60
|
--input: var(--color-dark-input);
|
|
61
61
|
--ring: var(--color-dark-link);
|
|
62
62
|
--chart-1: var(--color-dark-chart-1);
|
|
63
|
-
--chart-2: var(--color-
|
|
64
|
-
--chart-3: var(--color-
|
|
65
|
-
--chart-4: var(--color-
|
|
66
|
-
--chart-5: var(--color-
|
|
67
|
-
--sidebar: var(--color-dark-canvas
|
|
63
|
+
--chart-2: var(--color-dark-chart-2);
|
|
64
|
+
--chart-3: var(--color-dark-chart-3);
|
|
65
|
+
--chart-4: var(--color-dark-chart-4);
|
|
66
|
+
--chart-5: var(--color-dark-chart-5);
|
|
67
|
+
--sidebar: var(--color-dark-canvas);
|
|
68
68
|
--sidebar-foreground: var(--color-dark-ink);
|
|
69
69
|
--sidebar-primary: var(--color-dark-primary);
|
|
70
70
|
--sidebar-primary-foreground: var(--color-dark-on-primary);
|
|
@@ -72,6 +72,9 @@
|
|
|
72
72
|
--sidebar-accent-foreground: var(--color-dark-ink);
|
|
73
73
|
--sidebar-border: var(--color-dark-line);
|
|
74
74
|
--sidebar-ring: var(--color-dark-link);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
:root.dark {
|
|
75
78
|
--nc-state-ready: var(--nc-dark-state-ready);
|
|
76
79
|
--nc-state-running: var(--nc-dark-state-running);
|
|
77
80
|
--nc-state-review: var(--nc-dark-state-review);
|
|
@@ -80,10 +83,17 @@
|
|
|
80
83
|
--nc-selection-bg: var(--nc-dark-selection-bg);
|
|
81
84
|
--nc-selection-fg: var(--nc-dark-selection-fg);
|
|
82
85
|
--nc-cross: var(--nc-dark-cross);
|
|
86
|
+
--nc-chart-1: var(--nc-dark-chart-1);
|
|
87
|
+
--nc-chart-2: var(--nc-dark-chart-2);
|
|
88
|
+
--nc-chart-3: var(--nc-dark-chart-3);
|
|
89
|
+
--nc-chart-4: var(--nc-dark-chart-4);
|
|
90
|
+
--nc-chart-5: var(--nc-dark-chart-5);
|
|
91
|
+
--nc-chart-6: var(--nc-dark-chart-6);
|
|
83
92
|
}
|
|
84
93
|
|
|
85
94
|
:root {
|
|
86
95
|
--nadicode-spacing-xxs: var(--spacing-nadicode-xxs);
|
|
96
|
+
--nadicode-spacing-filter-chip-gap: var(--spacing-nadicode-filter-chip-gap);
|
|
87
97
|
--nadicode-spacing-xs: var(--spacing-nadicode-xs);
|
|
88
98
|
--nadicode-spacing-sm: var(--spacing-nadicode-sm);
|
|
89
99
|
--nadicode-spacing-md: var(--spacing-nadicode-md);
|
|
@@ -140,6 +150,8 @@
|
|
|
140
150
|
--nadicode-spacing-h-bento-mobile-copy: var(--spacing-nadicode-h-bento-mobile-copy);
|
|
141
151
|
--nadicode-spacing-h-bento-mobile-main: var(--spacing-nadicode-h-bento-mobile-main);
|
|
142
152
|
--nadicode-spacing-h-bento-strip: var(--spacing-nadicode-h-bento-strip);
|
|
153
|
+
--nadicode-spacing-filter-chip-height: var(--spacing-nadicode-filter-chip-height);
|
|
154
|
+
--nadicode-spacing-filter-chip-icon: var(--spacing-nadicode-filter-chip-icon);
|
|
143
155
|
}
|
|
144
156
|
|
|
145
157
|
/* === FAITHFUL PROJECTION of the @google/design.md Tailwind export. === */
|
|
@@ -264,15 +276,19 @@
|
|
|
264
276
|
--color-dark-cyan-soft: #7ee8de;
|
|
265
277
|
--color-dark-cyan-deep: #1f9e9a;
|
|
266
278
|
--color-dark-success: #62d494;
|
|
267
|
-
--color-dark-state-ready: #
|
|
268
|
-
--color-dark-state-running: #
|
|
269
|
-
--color-dark-state-review: #
|
|
270
|
-
--color-dark-state-blocked: #
|
|
271
|
-
--color-dark-state-complete: #
|
|
279
|
+
--color-dark-state-ready: #8f8f8f;
|
|
280
|
+
--color-dark-state-running: #4f6ae6;
|
|
281
|
+
--color-dark-state-review: #f5a623;
|
|
282
|
+
--color-dark-state-blocked: #cd212a;
|
|
283
|
+
--color-dark-state-complete: #008c45;
|
|
272
284
|
--color-dark-selection-bg: #ededed;
|
|
273
285
|
--color-dark-selection-fg: #0a0a0a;
|
|
274
286
|
--color-dark-cross: #6e6e6e;
|
|
275
287
|
--color-dark-chart-1: #7d99f2;
|
|
288
|
+
--color-dark-chart-2: #17b568;
|
|
289
|
+
--color-dark-chart-3: #ffd97d;
|
|
290
|
+
--color-dark-chart-4: #f28085;
|
|
291
|
+
--color-dark-chart-5: #33d1cb;
|
|
276
292
|
--color-dark-chart-6: #9575cd;
|
|
277
293
|
--color-nadicode-muted: #888888;
|
|
278
294
|
--color-nadicode-primary: #008c45;
|
|
@@ -427,6 +443,7 @@
|
|
|
427
443
|
--radius-pill: 100px;
|
|
428
444
|
--radius-full: 9999px;
|
|
429
445
|
--spacing-nadicode-xxs: 4px;
|
|
446
|
+
--spacing-nadicode-filter-chip-gap: 6px;
|
|
430
447
|
--spacing-nadicode-xs: 8px;
|
|
431
448
|
--spacing-nadicode-sm: 12px;
|
|
432
449
|
--spacing-nadicode-md: 16px;
|
|
@@ -483,4 +500,6 @@
|
|
|
483
500
|
--spacing-nadicode-h-bento-mobile-copy: 248px;
|
|
484
501
|
--spacing-nadicode-h-bento-mobile-main: 537px;
|
|
485
502
|
--spacing-nadicode-h-bento-strip: 20px;
|
|
503
|
+
--spacing-nadicode-filter-chip-height: 28px;
|
|
504
|
+
--spacing-nadicode-filter-chip-icon: 14px;
|
|
486
505
|
}
|
|
@@ -1328,55 +1328,55 @@
|
|
|
1328
1328
|
"$value": {
|
|
1329
1329
|
"colorSpace": "srgb",
|
|
1330
1330
|
"components": [
|
|
1331
|
-
0.
|
|
1332
|
-
0.
|
|
1333
|
-
0.
|
|
1331
|
+
0.561,
|
|
1332
|
+
0.561,
|
|
1333
|
+
0.561
|
|
1334
1334
|
],
|
|
1335
|
-
"hex": "#
|
|
1335
|
+
"hex": "#8f8f8f"
|
|
1336
1336
|
}
|
|
1337
1337
|
},
|
|
1338
1338
|
"dark-state-running": {
|
|
1339
1339
|
"$value": {
|
|
1340
1340
|
"colorSpace": "srgb",
|
|
1341
1341
|
"components": [
|
|
1342
|
-
0.
|
|
1343
|
-
0.
|
|
1344
|
-
0.
|
|
1342
|
+
0.31,
|
|
1343
|
+
0.416,
|
|
1344
|
+
0.902
|
|
1345
1345
|
],
|
|
1346
|
-
"hex": "#
|
|
1346
|
+
"hex": "#4f6ae6"
|
|
1347
1347
|
}
|
|
1348
1348
|
},
|
|
1349
1349
|
"dark-state-review": {
|
|
1350
1350
|
"$value": {
|
|
1351
1351
|
"colorSpace": "srgb",
|
|
1352
1352
|
"components": [
|
|
1353
|
-
|
|
1354
|
-
0.
|
|
1355
|
-
0.
|
|
1353
|
+
0.961,
|
|
1354
|
+
0.651,
|
|
1355
|
+
0.137
|
|
1356
1356
|
],
|
|
1357
|
-
"hex": "#
|
|
1357
|
+
"hex": "#f5a623"
|
|
1358
1358
|
}
|
|
1359
1359
|
},
|
|
1360
1360
|
"dark-state-blocked": {
|
|
1361
1361
|
"$value": {
|
|
1362
1362
|
"colorSpace": "srgb",
|
|
1363
1363
|
"components": [
|
|
1364
|
-
0.
|
|
1365
|
-
0.
|
|
1366
|
-
0.
|
|
1364
|
+
0.804,
|
|
1365
|
+
0.129,
|
|
1366
|
+
0.165
|
|
1367
1367
|
],
|
|
1368
|
-
"hex": "#
|
|
1368
|
+
"hex": "#cd212a"
|
|
1369
1369
|
}
|
|
1370
1370
|
},
|
|
1371
1371
|
"dark-state-complete": {
|
|
1372
1372
|
"$value": {
|
|
1373
1373
|
"colorSpace": "srgb",
|
|
1374
1374
|
"components": [
|
|
1375
|
-
0
|
|
1376
|
-
0.
|
|
1377
|
-
0.
|
|
1375
|
+
0,
|
|
1376
|
+
0.549,
|
|
1377
|
+
0.271
|
|
1378
1378
|
],
|
|
1379
|
-
"hex": "#
|
|
1379
|
+
"hex": "#008c45"
|
|
1380
1380
|
}
|
|
1381
1381
|
},
|
|
1382
1382
|
"dark-selection-bg": {
|
|
@@ -1423,6 +1423,50 @@
|
|
|
1423
1423
|
"hex": "#7d99f2"
|
|
1424
1424
|
}
|
|
1425
1425
|
},
|
|
1426
|
+
"dark-chart-2": {
|
|
1427
|
+
"$value": {
|
|
1428
|
+
"colorSpace": "srgb",
|
|
1429
|
+
"components": [
|
|
1430
|
+
0.09,
|
|
1431
|
+
0.71,
|
|
1432
|
+
0.408
|
|
1433
|
+
],
|
|
1434
|
+
"hex": "#17b568"
|
|
1435
|
+
}
|
|
1436
|
+
},
|
|
1437
|
+
"dark-chart-3": {
|
|
1438
|
+
"$value": {
|
|
1439
|
+
"colorSpace": "srgb",
|
|
1440
|
+
"components": [
|
|
1441
|
+
1,
|
|
1442
|
+
0.851,
|
|
1443
|
+
0.49
|
|
1444
|
+
],
|
|
1445
|
+
"hex": "#ffd97d"
|
|
1446
|
+
}
|
|
1447
|
+
},
|
|
1448
|
+
"dark-chart-4": {
|
|
1449
|
+
"$value": {
|
|
1450
|
+
"colorSpace": "srgb",
|
|
1451
|
+
"components": [
|
|
1452
|
+
0.949,
|
|
1453
|
+
0.502,
|
|
1454
|
+
0.522
|
|
1455
|
+
],
|
|
1456
|
+
"hex": "#f28085"
|
|
1457
|
+
}
|
|
1458
|
+
},
|
|
1459
|
+
"dark-chart-5": {
|
|
1460
|
+
"$value": {
|
|
1461
|
+
"colorSpace": "srgb",
|
|
1462
|
+
"components": [
|
|
1463
|
+
0.2,
|
|
1464
|
+
0.82,
|
|
1465
|
+
0.796
|
|
1466
|
+
],
|
|
1467
|
+
"hex": "#33d1cb"
|
|
1468
|
+
}
|
|
1469
|
+
},
|
|
1426
1470
|
"dark-chart-6": {
|
|
1427
1471
|
"$value": {
|
|
1428
1472
|
"colorSpace": "srgb",
|
|
@@ -1443,6 +1487,12 @@
|
|
|
1443
1487
|
"unit": "px"
|
|
1444
1488
|
}
|
|
1445
1489
|
},
|
|
1490
|
+
"filter-chip-gap": {
|
|
1491
|
+
"$value": {
|
|
1492
|
+
"value": 6,
|
|
1493
|
+
"unit": "px"
|
|
1494
|
+
}
|
|
1495
|
+
},
|
|
1446
1496
|
"xs": {
|
|
1447
1497
|
"$value": {
|
|
1448
1498
|
"value": 8,
|
|
@@ -1778,6 +1828,18 @@
|
|
|
1778
1828
|
"value": 20,
|
|
1779
1829
|
"unit": "px"
|
|
1780
1830
|
}
|
|
1831
|
+
},
|
|
1832
|
+
"filter-chip-height": {
|
|
1833
|
+
"$value": {
|
|
1834
|
+
"value": 28,
|
|
1835
|
+
"unit": "px"
|
|
1836
|
+
}
|
|
1837
|
+
},
|
|
1838
|
+
"filter-chip-icon": {
|
|
1839
|
+
"$value": {
|
|
1840
|
+
"value": 14,
|
|
1841
|
+
"unit": "px"
|
|
1842
|
+
}
|
|
1781
1843
|
}
|
|
1782
1844
|
},
|
|
1783
1845
|
"rounded": {
|