@nadicodeai/design-system 0.5.3 → 0.7.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/AGENTS.md +9 -10
- package/DESIGN.md +125 -36
- package/README.md +1 -1
- package/dist/css/components/agent-avatar.css +15 -5
- package/dist/css/components/approval-gate.css +10 -8
- package/dist/css/components/artifact-preview.css +17 -5
- package/dist/css/components/chat-bubble-agent.css +15 -5
- package/dist/css/components/chat-thread.css +5 -4
- package/dist/css/components/handoff-banner.css +1 -1
- package/dist/css/components/run-timeline.css +36 -11
- package/dist/css/components/state-row.css +15 -5
- package/dist/css/components/state-tag.css +4 -3
- package/dist/css/components/status-tag.css +101 -0
- package/dist/css/components/tool-call-trace.css +1 -1
- package/dist/css/components/typing-dots.css +15 -5
- package/dist/css/foundation.css +8 -0
- package/dist/css/index.css +6 -2
- package/dist/css/layout.css +7 -8
- package/dist/css/primitives.css +16 -33
- package/dist/css/tokens.generated.css +31 -0
- package/dist/tailwind/nadicode.tailwind.json +30 -0
- package/dist/tailwind/nadicode.theme.css +66 -11
- package/dist/tokens/nadicode.dtcg.json +196 -1
- package/package.json +2 -2
|
@@ -69,7 +69,12 @@
|
|
|
69
69
|
height: var(--nc-run-timeline-node);
|
|
70
70
|
margin-top: 4px;
|
|
71
71
|
/* Center the node on the rail: rail center minus half the node width. */
|
|
72
|
-
margin-left: calc(
|
|
72
|
+
margin-left: calc(
|
|
73
|
+
var(--nc-run-timeline-rail) -
|
|
74
|
+
(var(--nc-run-timeline-node) / 2) -
|
|
75
|
+
14px -
|
|
76
|
+
var(--nc-run-timeline-node)
|
|
77
|
+
);
|
|
73
78
|
border-radius: var(--nc-rounded-full);
|
|
74
79
|
background: var(--nc-canvas);
|
|
75
80
|
box-shadow: 0 0 0 var(--nc-guide) var(--nc-line);
|
|
@@ -123,13 +128,33 @@
|
|
|
123
128
|
/* State variants — color carries state, sourced from the shared `--nc-state-*`
|
|
124
129
|
tokens (the same vocabulary as state-tag/state-row). The node core and the
|
|
125
130
|
content left edge both take the state token; shape is unchanged. */
|
|
126
|
-
.nc-run-timeline-step[data-state="ready"]
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
.nc-run-timeline-step[data-state="
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
.nc-run-timeline-step[data-state="
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
.nc-run-timeline-step[data-state="
|
|
131
|
+
.nc-run-timeline-step[data-state="ready"] .nc-run-timeline-node {
|
|
132
|
+
color: var(--nc-state-ready);
|
|
133
|
+
}
|
|
134
|
+
.nc-run-timeline-step[data-state="ready"] .nc-run-timeline-content {
|
|
135
|
+
border-left-color: var(--nc-state-ready);
|
|
136
|
+
}
|
|
137
|
+
.nc-run-timeline-step[data-state="running"] .nc-run-timeline-node {
|
|
138
|
+
color: var(--nc-state-running);
|
|
139
|
+
}
|
|
140
|
+
.nc-run-timeline-step[data-state="running"] .nc-run-timeline-content {
|
|
141
|
+
border-left-color: var(--nc-state-running);
|
|
142
|
+
}
|
|
143
|
+
.nc-run-timeline-step[data-state="review"] .nc-run-timeline-node {
|
|
144
|
+
color: var(--nc-state-review);
|
|
145
|
+
}
|
|
146
|
+
.nc-run-timeline-step[data-state="review"] .nc-run-timeline-content {
|
|
147
|
+
border-left-color: var(--nc-state-review);
|
|
148
|
+
}
|
|
149
|
+
.nc-run-timeline-step[data-state="blocked"] .nc-run-timeline-node {
|
|
150
|
+
color: var(--nc-state-blocked);
|
|
151
|
+
}
|
|
152
|
+
.nc-run-timeline-step[data-state="blocked"] .nc-run-timeline-content {
|
|
153
|
+
border-left-color: var(--nc-state-blocked);
|
|
154
|
+
}
|
|
155
|
+
.nc-run-timeline-step[data-state="complete"] .nc-run-timeline-node {
|
|
156
|
+
color: var(--nc-state-complete);
|
|
157
|
+
}
|
|
158
|
+
.nc-run-timeline-step[data-state="complete"] .nc-run-timeline-content {
|
|
159
|
+
border-left-color: var(--nc-state-complete);
|
|
160
|
+
}
|
|
@@ -47,8 +47,18 @@
|
|
|
47
47
|
color: var(--nc-state-running);
|
|
48
48
|
background: currentColor;
|
|
49
49
|
}
|
|
50
|
-
.nc-state-row[data-kind="ready"]
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
.nc-state-row[data-kind="
|
|
54
|
-
|
|
50
|
+
.nc-state-row[data-kind="ready"] .nc-state-row-dot {
|
|
51
|
+
color: var(--nc-state-ready);
|
|
52
|
+
}
|
|
53
|
+
.nc-state-row[data-kind="running"] .nc-state-row-dot {
|
|
54
|
+
color: var(--nc-state-running);
|
|
55
|
+
}
|
|
56
|
+
.nc-state-row[data-kind="review"] .nc-state-row-dot {
|
|
57
|
+
color: var(--nc-state-review);
|
|
58
|
+
}
|
|
59
|
+
.nc-state-row[data-kind="blocked"] .nc-state-row-dot {
|
|
60
|
+
color: var(--nc-state-blocked);
|
|
61
|
+
}
|
|
62
|
+
.nc-state-row[data-kind="complete"] .nc-state-row-dot {
|
|
63
|
+
color: var(--nc-state-complete);
|
|
64
|
+
}
|
|
@@ -26,9 +26,10 @@
|
|
|
26
26
|
letter-spacing: 0;
|
|
27
27
|
white-space: nowrap;
|
|
28
28
|
/* Confirm move: state transitions at the 150–200 ms feedback band. */
|
|
29
|
-
transition:
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
transition:
|
|
30
|
+
background-color var(--nc-duration-confirm) var(--nc-ease-out-strong),
|
|
31
|
+
border-color var(--nc-duration-confirm) var(--nc-ease-out-strong),
|
|
32
|
+
color var(--nc-duration-confirm) var(--nc-ease-out-strong);
|
|
32
33
|
}
|
|
33
34
|
|
|
34
35
|
/*
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* status-tag — the entity-status system (DESIGN.md `status-tag-*` family).
|
|
3
|
+
* Sibling of `state-tag`, not a replacement: `state-tag` stays the run-state
|
|
4
|
+
* rail (ready/running/review/blocked/complete), carried by a 3px border-left
|
|
5
|
+
* on a neutral canvas. `status-tag` is the entity-status vocabulary — agent,
|
|
6
|
+
* credential, activation, customer, invitation, subscription, and health
|
|
7
|
+
* values that live on records, not on a run. It carries state a different
|
|
8
|
+
* way: a subtle tinted rectangle where BOTH the background and the text
|
|
9
|
+
* shift together, never a border-left rail, and it never touches the
|
|
10
|
+
* `--nc-state-*` token family.
|
|
11
|
+
*
|
|
12
|
+
* Shape: a small sans rectangle (`{rounded.md}`, not a capsule), never
|
|
13
|
+
* Geist Mono. Tone comes from `[data-tone]` (gray/green/red/amber/blue), not
|
|
14
|
+
* BEM modifiers, and each tone is a full background+text ramp pair pulled
|
|
15
|
+
* directly from the color ramps (gray/green-italia/red-italia/amber/
|
|
16
|
+
* blue-cobalto) rather than through a semantic alias — status-tag consumes
|
|
17
|
+
* ramp steps directly, matching `state-tag`'s "shape carries meaning, color
|
|
18
|
+
* carries variant" discipline but expressed as a bg/text pair instead of a
|
|
19
|
+
* border.
|
|
20
|
+
*
|
|
21
|
+
* Doctrine: gray is the default tone. Color is reserved for marking health
|
|
22
|
+
* and exceptions — every terminal/no-action state renders gray. Subtle-only
|
|
23
|
+
* (no solid/filled variants), no icons inside the badge, no text-transform,
|
|
24
|
+
* labels render verbatim from the i18n dictionary that owns them.
|
|
25
|
+
*/
|
|
26
|
+
.nc-status-tag {
|
|
27
|
+
display: inline-flex;
|
|
28
|
+
align-items: center;
|
|
29
|
+
height: 24px;
|
|
30
|
+
padding: 0 10px;
|
|
31
|
+
border: 0;
|
|
32
|
+
border-radius: var(--nc-rounded-md);
|
|
33
|
+
font-family: Geist, Inter, system-ui, -apple-system, sans-serif;
|
|
34
|
+
font-size: 12px;
|
|
35
|
+
font-weight: 500;
|
|
36
|
+
line-height: 16px;
|
|
37
|
+
letter-spacing: 0;
|
|
38
|
+
white-space: nowrap;
|
|
39
|
+
/* Confirm move: state transitions at the 150–200 ms feedback band, same as
|
|
40
|
+
state-tag — color arrives WITH the meaning, never before it. */
|
|
41
|
+
transition:
|
|
42
|
+
background-color var(--nc-duration-confirm) var(--nc-ease-out-strong),
|
|
43
|
+
color var(--nc-duration-confirm) var(--nc-ease-out-strong);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.nc-status-tag[data-tone="gray"] {
|
|
47
|
+
background: var(--nc-gray-200);
|
|
48
|
+
color: var(--nc-gray-900);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.nc-status-tag[data-tone="green"] {
|
|
52
|
+
background: var(--nc-green-italia-200);
|
|
53
|
+
color: var(--nc-green-italia-900);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.nc-status-tag[data-tone="red"] {
|
|
57
|
+
background: var(--nc-red-italia-200);
|
|
58
|
+
color: var(--nc-red-italia-900);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.nc-status-tag[data-tone="amber"] {
|
|
62
|
+
background: var(--nc-amber-200);
|
|
63
|
+
color: var(--nc-amber-900);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.nc-status-tag[data-tone="blue"] {
|
|
67
|
+
background: var(--nc-blue-cobalto-200);
|
|
68
|
+
color: var(--nc-blue-cobalto-900);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/*
|
|
72
|
+
* Dark console: each tone flips to its own dark-ramp pair rather than a
|
|
73
|
+
* shared canvas/ink remap (unlike state-tag's neutral chip), because tone
|
|
74
|
+
* here is carried by a full bg+text pair, not a single border-left accent.
|
|
75
|
+
* Scoped per tone so gray's pair (dark-canvas-soft-2/gray-600) does not
|
|
76
|
+
* collide with the chromatic tones' 1000/400 pairs.
|
|
77
|
+
*/
|
|
78
|
+
.dark .nc-status-tag[data-tone="gray"] {
|
|
79
|
+
background: var(--nc-dark-canvas-soft-2);
|
|
80
|
+
color: var(--nc-gray-600);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.dark .nc-status-tag[data-tone="green"] {
|
|
84
|
+
background: var(--nc-green-italia-1000);
|
|
85
|
+
color: var(--nc-green-italia-400);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.dark .nc-status-tag[data-tone="red"] {
|
|
89
|
+
background: var(--nc-red-italia-1000);
|
|
90
|
+
color: var(--nc-red-italia-400);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.dark .nc-status-tag[data-tone="amber"] {
|
|
94
|
+
background: var(--nc-amber-1000);
|
|
95
|
+
color: var(--nc-amber-400);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.dark .nc-status-tag[data-tone="blue"] {
|
|
99
|
+
background: var(--nc-blue-cobalto-1000);
|
|
100
|
+
color: var(--nc-blue-cobalto-400);
|
|
101
|
+
}
|
|
@@ -32,5 +32,5 @@
|
|
|
32
32
|
vertical-align: -2px;
|
|
33
33
|
background-color: var(--nc-muted);
|
|
34
34
|
-webkit-mask: url("../../icons/chevron-right.svg") center / contain no-repeat;
|
|
35
|
-
|
|
35
|
+
mask: url("../../icons/chevron-right.svg") center / contain no-repeat;
|
|
36
36
|
}
|
|
@@ -30,11 +30,21 @@
|
|
|
30
30
|
/* AC-016 accent map → existing --nc-* tokens; identical to chat-bubble-agent and
|
|
31
31
|
agent-avatar. green→link, cyan→info (blue-cobalto; killed cyan token retired
|
|
32
32
|
per Italia contract §6), amber→warning-deep, ink→ink, red→error. No hard-coded hex. */
|
|
33
|
-
.nc-typing-dots[data-accent="green"]
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
.nc-typing-dots[data-accent="
|
|
37
|
-
|
|
33
|
+
.nc-typing-dots[data-accent="green"] {
|
|
34
|
+
--nc-accent: var(--nc-link);
|
|
35
|
+
}
|
|
36
|
+
.nc-typing-dots[data-accent="cyan"] {
|
|
37
|
+
--nc-accent: var(--nc-info);
|
|
38
|
+
}
|
|
39
|
+
.nc-typing-dots[data-accent="amber"] {
|
|
40
|
+
--nc-accent: var(--nc-warning-deep);
|
|
41
|
+
}
|
|
42
|
+
.nc-typing-dots[data-accent="ink"] {
|
|
43
|
+
--nc-accent: var(--nc-ink);
|
|
44
|
+
}
|
|
45
|
+
.nc-typing-dots[data-accent="red"] {
|
|
46
|
+
--nc-accent: var(--nc-error);
|
|
47
|
+
}
|
|
38
48
|
|
|
39
49
|
.nc-typing-dots-dot {
|
|
40
50
|
width: 5px;
|
package/dist/css/foundation.css
CHANGED
|
@@ -136,6 +136,14 @@ body {
|
|
|
136
136
|
letter-spacing: var(--nc-type-caption-letter-spacing);
|
|
137
137
|
}
|
|
138
138
|
|
|
139
|
+
.nc-type-caption-strong {
|
|
140
|
+
font-family: var(--nc-type-caption-strong-font-family);
|
|
141
|
+
font-size: var(--nc-type-caption-strong-font-size);
|
|
142
|
+
font-weight: var(--nc-type-caption-strong-font-weight);
|
|
143
|
+
line-height: var(--nc-type-caption-strong-line-height);
|
|
144
|
+
letter-spacing: var(--nc-type-caption-strong-letter-spacing);
|
|
145
|
+
}
|
|
146
|
+
|
|
139
147
|
.nc-type-caption-mono {
|
|
140
148
|
font-family: var(--nc-type-caption-mono-font-family);
|
|
141
149
|
font-size: var(--nc-type-caption-mono-font-size);
|
package/dist/css/index.css
CHANGED
|
@@ -11,8 +11,9 @@
|
|
|
11
11
|
* the structural-geometry foundation (`layout` + `primitives` — kernel grid,
|
|
12
12
|
* single-owner seams, `.nc-marker` corner crosshairs, cell/row grid math, the
|
|
13
13
|
* stage system), the brand display atoms shadcn/Radix has no equivalent for (the
|
|
14
|
-
* 13 agent-chat atoms + the run-state `state-tag` family +
|
|
15
|
-
* token/motion layers. The brand book
|
|
14
|
+
* 13 agent-chat atoms + the run-state `state-tag` family + the entity-status
|
|
15
|
+
* `status-tag` family + `image`), and the token/motion layers. The brand book
|
|
16
|
+
* and every static surface import this
|
|
16
17
|
* bundle raw — no Tailwind build step runs over `src/css/`, so the geometry is
|
|
17
18
|
* `@layer` CSS, not `@utility` directives a browser would receive un-compiled.
|
|
18
19
|
* The kept-geometry invariant guards stay live (kernel-css-architecture /
|
|
@@ -31,6 +32,9 @@
|
|
|
31
32
|
/* Run-state tags (ADR 0007 D3). Agentic run-state, kept as CSS. */
|
|
32
33
|
@import url("./components/state-tag.css") layer(components);
|
|
33
34
|
|
|
35
|
+
/* Entity-status tags. Record-level status vocabulary, sibling of state-tag. */
|
|
36
|
+
@import url("./components/status-tag.css") layer(components);
|
|
37
|
+
|
|
34
38
|
/* Agent-chat atoms (M6 / Part B). Conversation surface + role-grammar atoms. */
|
|
35
39
|
@import url("./components/chat-thread.css") layer(components);
|
|
36
40
|
@import url("./components/chat-bubble-user.css") layer(components);
|
package/dist/css/layout.css
CHANGED
|
@@ -210,14 +210,13 @@
|
|
|
210
210
|
display: none;
|
|
211
211
|
min-width: 0;
|
|
212
212
|
min-height: 0;
|
|
213
|
-
background:
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
);
|
|
213
|
+
background: repeating-linear-gradient(
|
|
214
|
+
125deg,
|
|
215
|
+
var(--nc-canvas) 0,
|
|
216
|
+
var(--nc-canvas) 6px,
|
|
217
|
+
var(--nc-line) 6px,
|
|
218
|
+
var(--nc-line) 7px
|
|
219
|
+
);
|
|
221
220
|
}
|
|
222
221
|
|
|
223
222
|
/* The fill owns its single inner boundary rail so the texture is bounded on
|
package/dist/css/primitives.css
CHANGED
|
@@ -127,7 +127,11 @@
|
|
|
127
127
|
--nc-blueprint-line: var(--nc-line);
|
|
128
128
|
background-image:
|
|
129
129
|
linear-gradient(to right, var(--nc-blueprint-line) var(--nc-guide), transparent var(--nc-guide)),
|
|
130
|
-
linear-gradient(
|
|
130
|
+
linear-gradient(
|
|
131
|
+
to bottom,
|
|
132
|
+
var(--nc-blueprint-line) var(--nc-guide),
|
|
133
|
+
transparent var(--nc-guide)
|
|
134
|
+
);
|
|
131
135
|
background-size:
|
|
132
136
|
calc(100% / var(--nc-blueprint-columns)) calc(100% / var(--nc-blueprint-rows)),
|
|
133
137
|
calc(100% / var(--nc-blueprint-columns)) calc(100% / var(--nc-blueprint-rows));
|
|
@@ -137,7 +141,7 @@
|
|
|
137
141
|
scaffolding (used by atmospheric surfaces like the brand hero). */
|
|
138
142
|
.nc-blueprint-field[data-feather="top"] {
|
|
139
143
|
-webkit-mask-image: linear-gradient(to bottom, transparent 0%, black 22%, black 100%);
|
|
140
|
-
|
|
144
|
+
mask-image: linear-gradient(to bottom, transparent 0%, black 22%, black 100%);
|
|
141
145
|
}
|
|
142
146
|
|
|
143
147
|
.nc-rule-svg {
|
|
@@ -195,28 +199,6 @@
|
|
|
195
199
|
width: 38%;
|
|
196
200
|
}
|
|
197
201
|
|
|
198
|
-
.nc-status-tag {
|
|
199
|
-
display: inline-flex;
|
|
200
|
-
width: fit-content;
|
|
201
|
-
min-height: 28px;
|
|
202
|
-
align-items: center;
|
|
203
|
-
justify-content: center;
|
|
204
|
-
border: var(--nc-guide) solid var(--nc-line);
|
|
205
|
-
/* status-tag = {rounded.sm} (DESIGN.md). */
|
|
206
|
-
border-radius: var(--nc-rounded-sm);
|
|
207
|
-
padding: 5px 9px;
|
|
208
|
-
background: var(--nc-canvas-soft);
|
|
209
|
-
color: var(--nc-body);
|
|
210
|
-
font-family: "Geist Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, monospace;
|
|
211
|
-
font-size: 12px;
|
|
212
|
-
line-height: 16px;
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
.nc-status-tag[data-proof-state="approved"] {
|
|
216
|
-
border-color: color-mix(in srgb, var(--nc-link) 35%, var(--nc-line));
|
|
217
|
-
background: color-mix(in srgb, var(--nc-link-bg-soft) 48%, var(--nc-canvas));
|
|
218
|
-
}
|
|
219
|
-
|
|
220
202
|
/* nc-icon — the icon slot. Icons are derived from Lucide (ISC) by a build
|
|
221
203
|
transform that bakes the house render into the SVG (see scripts/generate-icons.ts).
|
|
222
204
|
This primitive renders an INLINE <svg> child and re-asserts that key — 1.5px
|
|
@@ -305,8 +287,8 @@
|
|
|
305
287
|
}
|
|
306
288
|
|
|
307
289
|
.nc-filter-chip:focus-visible {
|
|
308
|
-
outline:
|
|
309
|
-
outline-offset:
|
|
290
|
+
outline: var(--nc-focus-ring-width) solid var(--nc-focus-ring);
|
|
291
|
+
outline-offset: 0;
|
|
310
292
|
}
|
|
311
293
|
|
|
312
294
|
/* nc-link-inline — the inline body link style (DESIGN.md link-inline). It reads
|
|
@@ -319,10 +301,11 @@
|
|
|
319
301
|
text-decoration: underline;
|
|
320
302
|
text-underline-offset: 2px;
|
|
321
303
|
text-decoration-thickness: var(--nc-guide);
|
|
322
|
-
transition:
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
304
|
+
transition:
|
|
305
|
+
background-color var(--nc-duration-stagger) var(--nc-ease-out-strong),
|
|
306
|
+
border-color var(--nc-duration-stagger) var(--nc-ease-out-strong),
|
|
307
|
+
color var(--nc-duration-stagger) var(--nc-ease-out-strong),
|
|
308
|
+
opacity var(--nc-duration-stagger) var(--nc-ease-out-strong);
|
|
326
309
|
}
|
|
327
310
|
|
|
328
311
|
@media (hover: hover) and (pointer: fine) {
|
|
@@ -332,9 +315,9 @@
|
|
|
332
315
|
}
|
|
333
316
|
|
|
334
317
|
.nc-link-inline:focus-visible {
|
|
335
|
-
outline:
|
|
336
|
-
outline-offset:
|
|
337
|
-
border-radius: var(--nc-rounded-
|
|
318
|
+
outline: var(--nc-focus-ring-width) solid var(--nc-focus-ring);
|
|
319
|
+
outline-offset: 0;
|
|
320
|
+
border-radius: var(--nc-rounded-md);
|
|
338
321
|
}
|
|
339
322
|
|
|
340
323
|
/* nc-label-mono — the mono eyebrow/kicker for section labels and low-priority
|
|
@@ -7,6 +7,10 @@
|
|
|
7
7
|
/* Colors */
|
|
8
8
|
--nc-primary: #008c45;
|
|
9
9
|
--nc-on-primary: #ffffff;
|
|
10
|
+
--nc-action: #007a3c;
|
|
11
|
+
--nc-action-foreground: #ffffff;
|
|
12
|
+
--nc-action-hover: #00602f;
|
|
13
|
+
--nc-action-active: #00301a;
|
|
10
14
|
--nc-ink: #171717;
|
|
11
15
|
--nc-body: #4d4d4d;
|
|
12
16
|
--nc-muted: #888888;
|
|
@@ -14,8 +18,11 @@
|
|
|
14
18
|
--nc-canvas-soft: #fafafa;
|
|
15
19
|
--nc-canvas-soft-2: #f5f5f5;
|
|
16
20
|
--nc-line: #e5e5e5;
|
|
21
|
+
--nc-input: #8f8f8f;
|
|
17
22
|
--nc-seam: #e4e7ec;
|
|
18
23
|
--nc-cross: #a1a1a1;
|
|
24
|
+
--nc-focus-ring: #007a3c;
|
|
25
|
+
--nc-scrim: #171717;
|
|
19
26
|
--nc-link: #007a3c;
|
|
20
27
|
--nc-link-deep: #00602f;
|
|
21
28
|
--nc-link-bg-soft: #d9f6e4;
|
|
@@ -120,9 +127,15 @@
|
|
|
120
127
|
--nc-dark-seam: #1f1f1f;
|
|
121
128
|
--nc-dark-primary: #ededed;
|
|
122
129
|
--nc-dark-on-primary: #0a0a0a;
|
|
130
|
+
--nc-dark-action: #ededed;
|
|
131
|
+
--nc-dark-action-foreground: #0a0a0a;
|
|
132
|
+
--nc-dark-action-hover: #d4d4d4;
|
|
133
|
+
--nc-dark-action-active: #a3a3a3;
|
|
123
134
|
--nc-dark-link: #9fe6bc;
|
|
124
135
|
--nc-dark-link-deep: #c3f0d4;
|
|
125
136
|
--nc-dark-link-bg-soft: #00301a;
|
|
137
|
+
--nc-dark-focus-ring: #9fe6bc;
|
|
138
|
+
--nc-dark-scrim: #f5f5f5;
|
|
126
139
|
--nc-dark-error: #f7b3b5;
|
|
127
140
|
--nc-dark-error-soft: #4a000e;
|
|
128
141
|
--nc-dark-error-deep: #fad3d4;
|
|
@@ -171,6 +184,10 @@
|
|
|
171
184
|
--nc-6xl: 128px;
|
|
172
185
|
--nc-section: 192px;
|
|
173
186
|
--nc-guide: 1px;
|
|
187
|
+
--nc-focus-ring-width: 3px;
|
|
188
|
+
--nc-control-height: 32px;
|
|
189
|
+
--nc-control-padding-inline: 10px;
|
|
190
|
+
--nc-touch-target: 44px;
|
|
174
191
|
--nc-page-pad: 24px;
|
|
175
192
|
--nc-page-max-mobile: 448px;
|
|
176
193
|
--nc-page-max-tablet: 624px;
|
|
@@ -225,6 +242,8 @@
|
|
|
225
242
|
--nc-rounded-md: 6px;
|
|
226
243
|
--nc-rounded-lg: 8px;
|
|
227
244
|
--nc-rounded-xl: 10px;
|
|
245
|
+
--nc-rounded-2xl: 12px;
|
|
246
|
+
--nc-rounded-3xl: 16px;
|
|
228
247
|
--nc-rounded-pill-sm: 64px;
|
|
229
248
|
--nc-rounded-pill: 100px;
|
|
230
249
|
--nc-rounded-full: 9999px;
|
|
@@ -295,6 +314,11 @@
|
|
|
295
314
|
--nc-type-caption-font-weight: 400;
|
|
296
315
|
--nc-type-caption-line-height: 16px;
|
|
297
316
|
--nc-type-caption-letter-spacing: 0px;
|
|
317
|
+
--nc-type-caption-strong-font-family: Geist, Inter, system-ui, -apple-system, sans-serif;
|
|
318
|
+
--nc-type-caption-strong-font-size: 12px;
|
|
319
|
+
--nc-type-caption-strong-font-weight: 500;
|
|
320
|
+
--nc-type-caption-strong-line-height: 16px;
|
|
321
|
+
--nc-type-caption-strong-letter-spacing: 0px;
|
|
298
322
|
--nc-type-caption-mono-font-family: Geist Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, monospace;
|
|
299
323
|
--nc-type-caption-mono-font-size: 12px;
|
|
300
324
|
--nc-type-caption-mono-font-weight: 500;
|
|
@@ -315,4 +339,11 @@
|
|
|
315
339
|
--nc-type-button-lg-font-weight: 500;
|
|
316
340
|
--nc-type-button-lg-line-height: 24px;
|
|
317
341
|
--nc-type-button-lg-letter-spacing: 0px;
|
|
342
|
+
|
|
343
|
+
/* Material opacity and shadows (strictly parsed from DESIGN.md prose) */
|
|
344
|
+
--nc-material-scrim-opacity: 10%;
|
|
345
|
+
--nc-material-shadow-tooltip: 0 1px 1px rgb(0 0 0 / 2%), 0 4px 8px rgb(0 0 0 / 4%);
|
|
346
|
+
--nc-material-shadow-menu: 0 1px 1px rgb(0 0 0 / 2%), 0 4px 8px -4px rgb(0 0 0 / 4%), 0 16px 24px -8px rgb(0 0 0 / 6%);
|
|
347
|
+
--nc-material-shadow-dialog: 0 1px 1px rgb(0 0 0 / 2%), 0 8px 16px -4px rgb(0 0 0 / 4%), 0 24px 32px -8px rgb(0 0 0 / 6%);
|
|
348
|
+
--nc-material-shadow-sheet: 0 2px 2px rgb(0 0 0 / 4%), 0 8px 16px -4px rgb(0 0 0 / 4%);
|
|
318
349
|
}
|
|
@@ -4,6 +4,10 @@
|
|
|
4
4
|
"colors": {
|
|
5
5
|
"primary": "#008c45",
|
|
6
6
|
"on-primary": "#ffffff",
|
|
7
|
+
"action": "#007a3c",
|
|
8
|
+
"action-foreground": "#ffffff",
|
|
9
|
+
"action-hover": "#00602f",
|
|
10
|
+
"action-active": "#00301a",
|
|
7
11
|
"ink": "#171717",
|
|
8
12
|
"body": "#4d4d4d",
|
|
9
13
|
"muted": "#888888",
|
|
@@ -11,8 +15,11 @@
|
|
|
11
15
|
"canvas-soft": "#fafafa",
|
|
12
16
|
"canvas-soft-2": "#f5f5f5",
|
|
13
17
|
"line": "#e5e5e5",
|
|
18
|
+
"input": "#8f8f8f",
|
|
14
19
|
"seam": "#e4e7ec",
|
|
15
20
|
"cross": "#a1a1a1",
|
|
21
|
+
"focus-ring": "#007a3c",
|
|
22
|
+
"scrim": "#171717",
|
|
16
23
|
"link": "#007a3c",
|
|
17
24
|
"link-deep": "#00602f",
|
|
18
25
|
"link-bg-soft": "#d9f6e4",
|
|
@@ -117,9 +124,15 @@
|
|
|
117
124
|
"dark-seam": "#1f1f1f",
|
|
118
125
|
"dark-primary": "#ededed",
|
|
119
126
|
"dark-on-primary": "#0a0a0a",
|
|
127
|
+
"dark-action": "#ededed",
|
|
128
|
+
"dark-action-foreground": "#0a0a0a",
|
|
129
|
+
"dark-action-hover": "#d4d4d4",
|
|
130
|
+
"dark-action-active": "#a3a3a3",
|
|
120
131
|
"dark-link": "#9fe6bc",
|
|
121
132
|
"dark-link-deep": "#c3f0d4",
|
|
122
133
|
"dark-link-bg-soft": "#00301a",
|
|
134
|
+
"dark-focus-ring": "#9fe6bc",
|
|
135
|
+
"dark-scrim": "#f5f5f5",
|
|
123
136
|
"dark-error": "#f7b3b5",
|
|
124
137
|
"dark-error-soft": "#4a000e",
|
|
125
138
|
"dark-error-deep": "#fad3d4",
|
|
@@ -193,6 +206,9 @@
|
|
|
193
206
|
"caption": [
|
|
194
207
|
"Geist, Inter, system-ui, -apple-system, sans-serif"
|
|
195
208
|
],
|
|
209
|
+
"caption-strong": [
|
|
210
|
+
"Geist, Inter, system-ui, -apple-system, sans-serif"
|
|
211
|
+
],
|
|
196
212
|
"caption-mono": [
|
|
197
213
|
"Geist Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, monospace"
|
|
198
214
|
],
|
|
@@ -311,6 +327,14 @@
|
|
|
311
327
|
"fontWeight": "400"
|
|
312
328
|
}
|
|
313
329
|
],
|
|
330
|
+
"caption-strong": [
|
|
331
|
+
"12px",
|
|
332
|
+
{
|
|
333
|
+
"lineHeight": "16px",
|
|
334
|
+
"letterSpacing": "0px",
|
|
335
|
+
"fontWeight": "500"
|
|
336
|
+
}
|
|
337
|
+
],
|
|
314
338
|
"caption-mono": [
|
|
315
339
|
"12px",
|
|
316
340
|
{
|
|
@@ -351,6 +375,8 @@
|
|
|
351
375
|
"md": "6px",
|
|
352
376
|
"lg": "8px",
|
|
353
377
|
"xl": "10px",
|
|
378
|
+
"2xl": "12px",
|
|
379
|
+
"3xl": "16px",
|
|
354
380
|
"pill-sm": "64px",
|
|
355
381
|
"pill": "100px",
|
|
356
382
|
"full": "9999px"
|
|
@@ -370,6 +396,10 @@
|
|
|
370
396
|
"6xl": "128px",
|
|
371
397
|
"section": "192px",
|
|
372
398
|
"guide": "1px",
|
|
399
|
+
"focus-ring-width": "3px",
|
|
400
|
+
"control-height": "32px",
|
|
401
|
+
"control-padding-inline": "10px",
|
|
402
|
+
"touch-target": "44px",
|
|
373
403
|
"page-pad": "24px",
|
|
374
404
|
"page-max-mobile": "448px",
|
|
375
405
|
"page-max-tablet": "624px",
|