@tensor_1/tokens 2.19.2 → 2.20.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.
@@ -33,6 +33,7 @@
33
33
  --uix-warning-fg: #1A1A1A;
34
34
  --uix-warning-bg: #FEF3D6;
35
35
  --uix-warning-text: #92400E;
36
+ --uix-warning-border: #D97706;
36
37
  --uix-info: #1447E6;
37
38
  --uix-info-fg: #FFFFFF;
38
39
  --uix-info-bg: #E3EBFF;
@@ -40,6 +41,7 @@
40
41
  --uix-danger: #E40014;
41
42
  --uix-danger-fg: #FFFFFF;
42
43
  --uix-danger-bg: #FFE4E6;
44
+ --uix-danger-border: #E40014;
43
45
  --uix-danger-text: #C20012;
44
46
  --uix-amber: #C98A1E;
45
47
  --uix-amber-text: #795006;
@@ -182,6 +184,7 @@
182
184
  --uix-warning: #FCBB00;
183
185
  --uix-warning-fg: #1A1A1A;
184
186
  --uix-warning-bg: rgba(249,156,0,.16);
187
+ --uix-warning-border: #CA8A04;
185
188
  --uix-warning-text: var(--uix-warning,#FCBB00);
186
189
  --uix-info: #2563EB;
187
190
  --uix-info-fg: #FFFFFF;
@@ -190,6 +193,7 @@
190
193
  --uix-danger: #DC2626;
191
194
  --uix-danger-fg: #FFFFFF;
192
195
  --uix-danger-bg: rgba(220,38,38,.20);
196
+ --uix-danger-border: #DC2626;
193
197
  --uix-danger-text: #F87171;
194
198
  --uix-amber: #E6B25C;
195
199
  --uix-amber-text: #E6B25C;
@@ -34,6 +34,7 @@ module.exports = {
34
34
  "uix-warning-fg": "var(--uix-warning-fg)",
35
35
  "uix-warning-bg": "var(--uix-warning-bg)",
36
36
  "uix-warning-text": "var(--uix-warning-text)",
37
+ "uix-warning-border": "var(--uix-warning-border)",
37
38
  "uix-info": "var(--uix-info)",
38
39
  "uix-info-fg": "var(--uix-info-fg)",
39
40
  "uix-info-bg": "var(--uix-info-bg)",
@@ -41,6 +42,7 @@ module.exports = {
41
42
  "uix-danger": "var(--uix-danger)",
42
43
  "uix-danger-fg": "var(--uix-danger-fg)",
43
44
  "uix-danger-bg": "var(--uix-danger-bg)",
45
+ "uix-danger-border": "var(--uix-danger-border)",
44
46
  "uix-danger-text": "var(--uix-danger-text)",
45
47
  "uix-amber": "var(--uix-amber)",
46
48
  "uix-amber-text": "var(--uix-amber-text)",
@@ -31,6 +31,7 @@
31
31
  --color-uix-warning-fg: var(--uix-warning-fg);
32
32
  --color-uix-warning-bg: var(--uix-warning-bg);
33
33
  --color-uix-warning-text: var(--uix-warning-text);
34
+ --color-uix-warning-border: var(--uix-warning-border);
34
35
  --color-uix-info: var(--uix-info);
35
36
  --color-uix-info-fg: var(--uix-info-fg);
36
37
  --color-uix-info-bg: var(--uix-info-bg);
@@ -38,6 +39,7 @@
38
39
  --color-uix-danger: var(--uix-danger);
39
40
  --color-uix-danger-fg: var(--uix-danger-fg);
40
41
  --color-uix-danger-bg: var(--uix-danger-bg);
42
+ --color-uix-danger-border: var(--uix-danger-border);
41
43
  --color-uix-danger-text: var(--uix-danger-text);
42
44
  --color-uix-amber: var(--uix-amber);
43
45
  --color-uix-amber-text: var(--uix-amber-text);
@@ -1,5 +1,5 @@
1
1
  /* GENERATED — do not edit. */
2
- export type UixTokenName = "bg-app" | "bg-subtle" | "bg-hover" | "bg-active" | "surface" | "surface-2" | "surface-3" | "border" | "border-strong" | "text" | "text-hushed" | "text-muted" | "text-reverse" | "text-hushed-reverse" | "accent" | "accent-dark" | "accent-light" | "accent-hover" | "accent-fg" | "link" | "accent-text" | "ring" | "brand-muted" | "success" | "success-fg" | "success-bg" | "warning" | "warning-fg" | "warning-bg" | "warning-text" | "info" | "info-fg" | "info-bg" | "info-text" | "danger" | "danger-fg" | "danger-bg" | "danger-text" | "amber" | "amber-text" | "amber-bg" | "attention" | "attention-bg" | "attention-text" | "attention-solid" | "overdue" | "overdue-bg" | "overdue-text" | "overdue-solid" | "sev-4" | "sev-4-bg" | "sev-4-text" | "sev-5" | "sev-5-bg" | "sev-5-text" | "success-solid" | "warning-solid" | "info-solid" | "danger-solid" | "chart-1" | "chart-2" | "chart-3" | "chart-4" | "chart-5" | "chart-6" | "chart-7" | "chart-8" | "chart-neutral" | "row" | "row-alt" | "row-pinned-bg" | "row-selected-bg" | "scrollbar-thumb" | "scrollbar-thumb-hover" | "scrollbar-track" | "scrim" | "scrim-strong" | "shadow-sm" | "shadow-popover" | "shadow-overlay" | "highlight-top" | "ease-out" | "ease-out-strong" | "ease-in" | "ease-in-out" | "ease-spring" | "dur-fast" | "dur" | "dur-slow" | "dur-slower" | "lift" | "z-raised" | "z-sticky" | "z-dropdown" | "z-overlay" | "z-tooltip" | "z-toast" | "radius-xs" | "radius-sm" | "radius-md" | "radius-lg" | "radius-pill" | "row-h" | "row-h-compact" | "row-h-comfortable" | "control-h" | "sidebar-w" | "sidebar-w-rail" | "topbar-h" | "scrollbar-size" | "icon-sm" | "icon-md" | "icon-lg" | "peek-w" | "col-w-xs" | "col-w-sm" | "col-w-md" | "col-w-lg" | "col-w-xl" | "col-title-min" | "space-0" | "space-1" | "space-2" | "space-3" | "space-4" | "space-5" | "space-6" | "space-7" | "space-8" | "space-9" | "space-10" | "space-11" | "space-12" | "font-sans" | "font-heading" | "font-mono" | "text-display" | "leading-display" | "text-data-hero" | "leading-data-hero" | "text-h2" | "leading-h2" | "text-h3" | "leading-h3" | "text-body" | "leading-body" | "text-meta" | "leading-meta" | "text-eyebrow" | "leading-eyebrow" | "tracking-tight" | "tracking-eyebrow";
2
+ export type UixTokenName = "bg-app" | "bg-subtle" | "bg-hover" | "bg-active" | "surface" | "surface-2" | "surface-3" | "border" | "border-strong" | "text" | "text-hushed" | "text-muted" | "text-reverse" | "text-hushed-reverse" | "accent" | "accent-dark" | "accent-light" | "accent-hover" | "accent-fg" | "link" | "accent-text" | "ring" | "brand-muted" | "success" | "success-fg" | "success-bg" | "warning" | "warning-fg" | "warning-bg" | "warning-text" | "warning-border" | "info" | "info-fg" | "info-bg" | "info-text" | "danger" | "danger-fg" | "danger-bg" | "danger-border" | "danger-text" | "amber" | "amber-text" | "amber-bg" | "attention" | "attention-bg" | "attention-text" | "attention-solid" | "overdue" | "overdue-bg" | "overdue-text" | "overdue-solid" | "sev-4" | "sev-4-bg" | "sev-4-text" | "sev-5" | "sev-5-bg" | "sev-5-text" | "success-solid" | "warning-solid" | "info-solid" | "danger-solid" | "chart-1" | "chart-2" | "chart-3" | "chart-4" | "chart-5" | "chart-6" | "chart-7" | "chart-8" | "chart-neutral" | "row" | "row-alt" | "row-pinned-bg" | "row-selected-bg" | "scrollbar-thumb" | "scrollbar-thumb-hover" | "scrollbar-track" | "scrim" | "scrim-strong" | "shadow-sm" | "shadow-popover" | "shadow-overlay" | "highlight-top" | "ease-out" | "ease-out-strong" | "ease-in" | "ease-in-out" | "ease-spring" | "dur-fast" | "dur" | "dur-slow" | "dur-slower" | "lift" | "z-raised" | "z-sticky" | "z-dropdown" | "z-overlay" | "z-tooltip" | "z-toast" | "radius-xs" | "radius-sm" | "radius-md" | "radius-lg" | "radius-pill" | "row-h" | "row-h-compact" | "row-h-comfortable" | "control-h" | "sidebar-w" | "sidebar-w-rail" | "topbar-h" | "scrollbar-size" | "icon-sm" | "icon-md" | "icon-lg" | "peek-w" | "col-w-xs" | "col-w-sm" | "col-w-md" | "col-w-lg" | "col-w-xl" | "col-title-min" | "space-0" | "space-1" | "space-2" | "space-3" | "space-4" | "space-5" | "space-6" | "space-7" | "space-8" | "space-9" | "space-10" | "space-11" | "space-12" | "font-sans" | "font-heading" | "font-mono" | "text-display" | "leading-display" | "text-data-hero" | "leading-data-hero" | "text-h2" | "leading-h2" | "text-h3" | "leading-h3" | "text-body" | "leading-body" | "text-meta" | "leading-meta" | "text-eyebrow" | "leading-eyebrow" | "tracking-tight" | "tracking-eyebrow";
3
3
  export declare const cssVar: Record<UixTokenName, string>;
4
4
  export declare const light: Record<UixTokenName, string>;
5
5
  export declare const dark: Partial<Record<UixTokenName, string>>;
@@ -34,6 +34,7 @@ export const cssVar = {
34
34
  "warning-fg": "var(--uix-warning-fg)",
35
35
  "warning-bg": "var(--uix-warning-bg)",
36
36
  "warning-text": "var(--uix-warning-text)",
37
+ "warning-border": "var(--uix-warning-border)",
37
38
  "info": "var(--uix-info)",
38
39
  "info-fg": "var(--uix-info-fg)",
39
40
  "info-bg": "var(--uix-info-bg)",
@@ -41,6 +42,7 @@ export const cssVar = {
41
42
  "danger": "var(--uix-danger)",
42
43
  "danger-fg": "var(--uix-danger-fg)",
43
44
  "danger-bg": "var(--uix-danger-bg)",
45
+ "danger-border": "var(--uix-danger-border)",
44
46
  "danger-text": "var(--uix-danger-text)",
45
47
  "amber": "var(--uix-amber)",
46
48
  "amber-text": "var(--uix-amber-text)",
@@ -189,6 +191,7 @@ export const light = {
189
191
  "warning-fg": "#1A1A1A",
190
192
  "warning-bg": "#FEF3D6",
191
193
  "warning-text": "#92400E",
194
+ "warning-border": "#D97706",
192
195
  "info": "#1447E6",
193
196
  "info-fg": "#FFFFFF",
194
197
  "info-bg": "#E3EBFF",
@@ -196,6 +199,7 @@ export const light = {
196
199
  "danger": "#E40014",
197
200
  "danger-fg": "#FFFFFF",
198
201
  "danger-bg": "#FFE4E6",
202
+ "danger-border": "#E40014",
199
203
  "danger-text": "#C20012",
200
204
  "amber": "#C98A1E",
201
205
  "amber-text": "#795006",
@@ -338,6 +342,7 @@ export const dark = {
338
342
  "warning": "#FCBB00",
339
343
  "warning-fg": "#1A1A1A",
340
344
  "warning-bg": "rgba(249,156,0,.16)",
345
+ "warning-border": "#CA8A04",
341
346
  "warning-text": "#FCBB00",
342
347
  "info": "#2563EB",
343
348
  "info-fg": "#FFFFFF",
@@ -346,6 +351,7 @@ export const dark = {
346
351
  "danger": "#DC2626",
347
352
  "danger-fg": "#FFFFFF",
348
353
  "danger-bg": "rgba(220,38,38,.20)",
354
+ "danger-border": "#DC2626",
349
355
  "danger-text": "#F87171",
350
356
  "amber": "#E6B25C",
351
357
  "amber-text": "#E6B25C",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tensor_1/tokens",
3
- "version": "2.19.2",
3
+ "version": "2.20.0",
4
4
  "description": "UIx v2 design tokens — the --uix-* contract for house products (Tensor, POSx, SHOPx). One DTCG source -> CSS variables, Tailwind theme, and typed TS constants.",
5
5
  "type": "module",
6
6
  "sideEffects": [
@@ -0,0 +1,8 @@
1
+ /* uix copy button — an icon-only ghost button that copies a value and confirms with a check.
2
+ Pair it with .uix-btn .uix-btn--ghost .uix-btn--icon; depends only on --uix-* tokens. */
3
+ @layer uix.components {
4
+ .uix-copy-button { flex: none; color: var(--uix-text-muted); }
5
+ .uix-copy-button:hover { color: var(--uix-text); }
6
+ .uix-copy-button svg { width: var(--uix-icon-sm); height: var(--uix-icon-sm); }
7
+ .uix-copy-button[data-copied] { color: var(--uix-success); }
8
+ }
@@ -2,12 +2,39 @@
2
2
  @layer uix.components {
3
3
  .uix-stat { background: var(--uix-surface); border: 1px solid var(--uix-border); border-radius: var(--uix-radius-lg); padding: var(--uix-space-6); }
4
4
  .uix-stat__label { font-size: var(--uix-text-eyebrow); letter-spacing: var(--uix-tracking-eyebrow); text-transform: uppercase; color: var(--uix-text-muted); display: flex; align-items: center; justify-content: space-between; gap: var(--uix-space-2); }
5
+ .uix-stat__label > span { min-width: 0; overflow-wrap: anywhere; }
5
6
  .uix-stat__label svg { width: var(--uix-icon-md); height: var(--uix-icon-md); }
6
- .uix-stat__value { font-size: var(--uix-text-data-hero); font-weight: 600; line-height: var(--uix-leading-data-hero); margin-top: var(--uix-space-3); }
7
- .uix-stat__meta { font-size: var(--uix-text-meta); color: var(--uix-text-muted); margin-top: var(--uix-space-2); display: flex; align-items: center; gap: var(--uix-space-2); }
7
+ .uix-stat__value { display: block; font-size: var(--uix-text-data-hero); font-weight: 600; line-height: var(--uix-leading-data-hero); margin-top: var(--uix-space-3); overflow-wrap: anywhere; }
8
+ .uix-stat__meta { font-size: var(--uix-text-meta); color: var(--uix-text-muted); margin-top: var(--uix-space-2); display: flex; flex-wrap: wrap; align-items: center; gap: var(--uix-space-2); overflow-wrap: anywhere; }
8
9
  .uix-stat__trend { display: inline-flex; align-items: center; gap: var(--uix-space-1); font-size: var(--uix-text-meta); font-weight: 600; padding: var(--uix-space-1) var(--uix-space-2); border-radius: var(--uix-radius-pill); }
9
10
  /* direction glyph inside the chip (UIX-A11Y-4) — sized to sit on the text baseline row */
10
11
  .uix-stat__trend svg { width: 10px; height: 10px; flex: none; }
11
12
  .uix-stat__trend--up { color: var(--uix-success); background: var(--uix-success-bg); }
12
13
  .uix-stat__trend--down { color: var(--uix-danger-text); background: var(--uix-danger-bg); }
14
+
15
+ /* tones — an outlined tile whose value carries the tone; the label keeps its muted colour */
16
+ .uix-stat--warning { border-color: var(--uix-warning-border); }
17
+ .uix-stat--warning .uix-stat__value { color: var(--uix-warning-text); }
18
+ .uix-stat--danger { border-color: var(--uix-danger-border); }
19
+ .uix-stat--danger .uix-stat__value { color: var(--uix-danger-text); }
20
+
21
+ /* compact — for dense fact bands */
22
+ .uix-stat--compact { padding: var(--uix-space-3) var(--uix-space-4); }
23
+ .uix-stat--compact .uix-stat__value { font-size: var(--uix-text-h3); line-height: var(--uix-leading-h3); margin-top: var(--uix-space-1); }
24
+ .uix-stat--compact .uix-stat__meta { margin-top: var(--uix-space-1); }
25
+
26
+ /* interactive — the whole tile is a <button> that opens an editor */
27
+ .uix-stat--interactive {
28
+ display: block; width: 100%; font: inherit; color: inherit; text-align: start; cursor: pointer;
29
+ transition: background-color var(--uix-dur-fast) var(--uix-ease-out), border-color var(--uix-dur-fast) var(--uix-ease-out);
30
+ }
31
+ .uix-stat--interactive:hover { background: var(--uix-bg-hover); border-color: var(--uix-border-strong); }
32
+ .uix-stat--interactive.uix-stat--warning:hover { border-color: var(--uix-warning-border); }
33
+ .uix-stat--interactive.uix-stat--danger:hover { border-color: var(--uix-danger-border); }
34
+ .uix-stat--interactive:focus-visible { outline: 2px solid var(--uix-ring); outline-offset: 2px; }
35
+ .uix-stat--interactive[aria-expanded="true"] { border-color: var(--uix-ring); }
36
+ .uix-stat__chevron { display: inline-flex; flex: none; margin-inline-start: auto; color: var(--uix-text-muted); }
37
+ .uix-stat__label .uix-stat__chevron svg { width: var(--uix-icon-sm); height: var(--uix-icon-sm); transition: transform var(--uix-dur-fast) var(--uix-ease-out); }
38
+ .uix-stat--interactive[aria-expanded="true"] .uix-stat__chevron svg { transform: rotate(180deg); }
39
+ @media (prefers-reduced-motion: reduce) { .uix-stat--interactive, .uix-stat__label .uix-stat__chevron svg { transition: none; } }
13
40
  }
@@ -4,6 +4,8 @@
4
4
  .uix-tab {
5
5
  border: 0; background: transparent; font: inherit; font-size: var(--uix-text-body); font-weight: 500;
6
6
  color: var(--uix-text-hushed); padding: var(--uix-space-3) var(--uix-space-3); cursor: pointer; position: relative;
7
+ /* long or translated labels wrap (two lines at the 16rem cap) instead of truncating */
8
+ white-space: normal; max-width: 16rem; text-align: start;
7
9
  transition: color var(--uix-dur-fast) var(--uix-ease-out), background-color var(--uix-dur-fast) var(--uix-ease-out);
8
10
  }
9
11
  .uix-tab:hover { color: var(--uix-text); }
@@ -28,4 +30,38 @@
28
30
  .uix-tabs--pill { display: inline-flex; background: var(--uix-bg-subtle); padding: var(--uix-space-1); border-radius: var(--uix-radius-md); }
29
31
  .uix-tabs--pill .uix-tab { padding: var(--uix-space-2) var(--uix-space-4); border-radius: calc(var(--uix-radius-md) - 3px); }
30
32
  .uix-tabs--pill .uix-tab[aria-selected="true"] { background: var(--uix-surface); box-shadow: var(--uix-shadow-sm); }
33
+
34
+ /* overflow="scroll" — one scrolling row inside .uix-tabs-scroller; edge buttons appear only
35
+ on the side that has hidden tabs. Keyboard users move with Arrow/Home/End, so the buttons
36
+ are pointer-only (aria-hidden, tabindex -1). */
37
+ .uix-tabs-scroller { position: relative; min-width: 0; max-width: 100%; }
38
+ .uix-tabs--scroll {
39
+ display: flex; flex-wrap: nowrap; overflow-x: auto; overflow-y: hidden;
40
+ scrollbar-width: none; scroll-behavior: smooth; overscroll-behavior-x: contain;
41
+ }
42
+ .uix-tabs--scroll::-webkit-scrollbar { display: none; }
43
+ .uix-tabs--scroll .uix-tab { flex: none; }
44
+ /* a scroll container clips the -1px overlaps the line/enclosed variants use, so the base
45
+ rule is drawn inside the box instead */
46
+ .uix-tabs--scroll.uix-tabs--line, .uix-tabs--scroll.uix-tabs--enclosed { border-bottom: 0; box-shadow: inset 0 -1px 0 var(--uix-border); }
47
+ .uix-tabs--scroll.uix-tabs--line .uix-tab::after { bottom: 0; }
48
+ .uix-tabs--scroll.uix-tabs--enclosed .uix-tab { margin-bottom: 0; }
49
+ .uix-tabs--scroll.uix-tabs--pill { display: flex; }
50
+
51
+ .uix-tabs-scroller__prev, .uix-tabs-scroller__next {
52
+ position: absolute; top: 0; bottom: 0; z-index: var(--uix-z-raised);
53
+ display: flex; align-items: center; justify-content: center;
54
+ width: var(--uix-control-h); padding: 0; border: 0; cursor: pointer;
55
+ color: var(--uix-text-hushed); font: inherit;
56
+ }
57
+ .uix-tabs-scroller__prev[hidden], .uix-tabs-scroller__next[hidden] { display: none; }
58
+ .uix-tabs-scroller__prev { inset-inline-start: 0; background: linear-gradient(to right, var(--uix-bg-app) 60%, transparent); }
59
+ .uix-tabs-scroller__next { inset-inline-end: 0; background: linear-gradient(to left, var(--uix-bg-app) 60%, transparent); }
60
+ .uix-tabs-scroller__prev:dir(rtl) { background: linear-gradient(to left, var(--uix-bg-app) 60%, transparent); }
61
+ .uix-tabs-scroller__next:dir(rtl) { background: linear-gradient(to right, var(--uix-bg-app) 60%, transparent); }
62
+ .uix-tabs-scroller__prev:hover, .uix-tabs-scroller__next:hover { color: var(--uix-text); }
63
+ .uix-tabs-scroller__prev svg, .uix-tabs-scroller__next svg { width: var(--uix-icon-sm); height: var(--uix-icon-sm); }
64
+ .uix-tabs-scroller__prev:dir(rtl) svg, .uix-tabs-scroller__next:dir(rtl) svg { transform: scaleX(-1); }
65
+
66
+ @media (prefers-reduced-motion: reduce) { .uix-tabs--scroll { scroll-behavior: auto; } }
31
67
  }
@@ -32,6 +32,7 @@
32
32
  "warning-fg": { "$type": "color", "$value": "#1A1A1A" },
33
33
  "warning-bg": { "$type": "color", "$value": "#FEF3D6" },
34
34
  "warning-text": { "$type": "color", "$value": "#92400E", "$description": "Warning-toned TEXT, legible on the faint --uix-warning-bg in light mode — the bright --uix-warning (#F99C00) fails contrast on pale yellow, so the foreground is a hand-darkened amber. Dark mode overrides to track --uix-warning. Used by status-pill --warning." },
35
+ "warning-border": { "$type": "color", "$value": "#D97706", "$description": "Warning-toned BORDER for an outlined container on a neutral surface (stat tile --warning). The bright --uix-warning is 2.1:1 on white; this amber clears the 3:1 non-text minimum on --uix-surface and --uix-bg-app." },
35
36
  "info": { "$type": "color", "$value": "#1447E6" },
36
37
  "info-fg": { "$type": "color", "$value": "#FFFFFF" },
37
38
  "info-bg": { "$type": "color", "$value": "#E3EBFF" },
@@ -39,6 +40,7 @@
39
40
  "danger": { "$type": "color", "$value": "#E40014" },
40
41
  "danger-fg": { "$type": "color", "$value": "#FFFFFF" },
41
42
  "danger-bg": { "$type": "color", "$value": "#FFE4E6" },
43
+ "danger-border": { "$type": "color", "$value": "#E40014", "$description": "Danger-toned BORDER for an outlined container on a neutral surface (stat tile --danger). 4.9:1 on white, so it clears the 3:1 non-text minimum; a separate role so a theme can soften the outline without touching the solid --uix-danger." },
42
44
  "danger-text": { "$type": "color", "$value": "#C20012", "$description": "Danger-toned TEXT, legible on --uix-danger-bg (the bright --uix-danger #E40014 is only 4.05:1 on #FFE4E6). A hand-darkened red for text; --uix-danger stays the SOLID role (danger button bg, critical pill, dots). Dark mode brightens it. Used by pill/alert/stat-trend/field-error/menu/sla/node/audit --danger." },
43
45
  "amber": { "$type": "color", "$value": "#C98A1E", "$description": "SEV-3 / medium-severity tone — the third tier of the severity ramp (danger = SEV-1, warning = SEV-2, amber = SEV-3). A muted ochre, deliberately distinct from the brighter --uix-warning so the three tiers read apart." },
44
46
  "amber-text": { "$type": "color", "$value": "#795006", "$description": "Amber-toned TEXT, legible on a faint amber tint and on dark surfaces (the SEV-3 ochre is too light as text on pale fills). Dark mode brightens it to track --uix-amber. Used by severity-3 badges." },
@@ -26,6 +26,7 @@
26
26
  "warning": { "$type": "color", "$value": "#FCBB00" },
27
27
  "warning-fg": { "$type": "color", "$value": "#1A1A1A" },
28
28
  "warning-bg": { "$type": "color", "$value": "rgba(249,156,0,.16)" },
29
+ "warning-border": { "$type": "color", "$value": "#CA8A04", "$description": "On dark, a deeper amber than the bright --uix-warning so the outline reads as a tone rather than a highlight; 6:1 on --uix-surface #111111." },
29
30
  "warning-text": { "$type": "color", "$value": "var(--uix-warning,#FCBB00)", "$description": "On dark the faint bg is dark enough that the bright warning hue reads as text — track --uix-warning live (fallback to the dark warning value)." },
30
31
  "info": { "$type": "color", "$value": "#2563EB" },
31
32
  "info-fg": { "$type": "color", "$value": "#FFFFFF" },
@@ -34,6 +35,7 @@
34
35
  "danger": { "$type": "color", "$value": "#DC2626" },
35
36
  "danger-fg": { "$type": "color", "$value": "#FFFFFF" },
36
37
  "danger-bg": { "$type": "color", "$value": "rgba(220,38,38,.20)" },
38
+ "danger-border": { "$type": "color", "$value": "#DC2626", "$description": "On dark, the solid danger red as an outline; 4.3:1 on --uix-surface #111111." },
37
39
  "danger-text": { "$type": "color", "$value": "#F87171", "$description": "On dark, the deep --uix-danger #DC2626 fails as text on the faint danger tint and on plain surfaces — brightened so pill/field-error/stat-trend/menu/node/audit text reads AA. --uix-danger stays the solid critical-pill / button bg (with white --uix-danger-fg)." },
38
40
  "amber": { "$type": "color", "$value": "#E6B25C", "$description": "SEV-3 tone lightened for dark surfaces (the light-mode ochre #C98A1E is too dark on dark)." },
39
41
  "amber-text": { "$type": "color", "$value": "#E6B25C", "$description": "On dark the lightened amber reads as text directly — tracks --uix-amber." },