@tensor_1/tokens 2.15.0 → 2.17.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.
@@ -23,6 +23,7 @@
23
23
  --uix-accent-hover: color-mix(in srgb, var(--uix-accent) 88%, #000000);
24
24
  --uix-accent-fg: var(--uix-brand-fg,#FFFFFF);
25
25
  --uix-link: var(--uix-brand,#1447E6);
26
+ --uix-accent-text: color-mix(in srgb, var(--uix-accent) 65%, #000000);
26
27
  --uix-ring: var(--uix-brand,#1447E6);
27
28
  --uix-brand-muted: color-mix(in srgb, var(--uix-accent) 12%, transparent);
28
29
  --uix-success: #047857;
@@ -138,19 +139,19 @@
138
139
  --uix-font-sans: "Inter",system-ui,sans-serif;
139
140
  --uix-font-heading: "IBM Plex Sans","Inter",system-ui,sans-serif;
140
141
  --uix-font-mono: "IBM Plex Mono",ui-monospace,monospace;
141
- --uix-text-display: 40px;
142
+ --uix-text-display: 2.5rem;
142
143
  --uix-leading-display: 1.05;
143
- --uix-text-data-hero: 34px;
144
+ --uix-text-data-hero: 2.125rem;
144
145
  --uix-leading-data-hero: 1.1;
145
- --uix-text-h2: 24px;
146
+ --uix-text-h2: 1.5rem;
146
147
  --uix-leading-h2: 1.15;
147
- --uix-text-h3: 15px;
148
+ --uix-text-h3: 0.9375rem;
148
149
  --uix-leading-h3: 1.3;
149
- --uix-text-body: 14px;
150
+ --uix-text-body: 0.875rem;
150
151
  --uix-leading-body: 1.5;
151
- --uix-text-meta: 12.5px;
152
+ --uix-text-meta: 0.78125rem;
152
153
  --uix-leading-meta: 1.4;
153
- --uix-text-eyebrow: 11px;
154
+ --uix-text-eyebrow: 0.6875rem;
154
155
  --uix-leading-eyebrow: 1.2;
155
156
  --uix-tracking-tight: -0.02em;
156
157
  --uix-tracking-eyebrow: 0.06em;
@@ -172,6 +173,7 @@
172
173
  --uix-accent: var(--uix-brand,#2563EB);
173
174
  --uix-accent-hover: color-mix(in srgb, var(--uix-accent) 82%, #FFFFFF);
174
175
  --uix-link: color-mix(in srgb, var(--uix-brand,#5B8DEF) 70%, #FFFFFF);
176
+ --uix-accent-text: color-mix(in srgb, var(--uix-accent) 70%, #FFFFFF);
175
177
  --uix-ring: var(--uix-brand,#3080FF);
176
178
  --uix-brand-muted: color-mix(in srgb, var(--uix-accent) 16%, transparent);
177
179
  --uix-success: #00D294;
@@ -24,6 +24,7 @@ module.exports = {
24
24
  "uix-accent-hover": "var(--uix-accent-hover)",
25
25
  "uix-accent-fg": "var(--uix-accent-fg)",
26
26
  "uix-link": "var(--uix-link)",
27
+ "uix-accent-text": "var(--uix-accent-text)",
27
28
  "uix-ring": "var(--uix-ring)",
28
29
  "uix-brand-muted": "var(--uix-brand-muted)",
29
30
  "uix-success": "var(--uix-success)",
@@ -21,6 +21,7 @@
21
21
  --color-uix-accent-hover: var(--uix-accent-hover);
22
22
  --color-uix-accent-fg: var(--uix-accent-fg);
23
23
  --color-uix-link: var(--uix-link);
24
+ --color-uix-accent-text: var(--uix-accent-text);
24
25
  --color-uix-ring: var(--uix-ring);
25
26
  --color-uix-brand-muted: var(--uix-brand-muted);
26
27
  --color-uix-success: var(--uix-success);
@@ -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" | "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" | "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";
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>>;
@@ -24,6 +24,7 @@ export const cssVar = {
24
24
  "accent-hover": "var(--uix-accent-hover)",
25
25
  "accent-fg": "var(--uix-accent-fg)",
26
26
  "link": "var(--uix-link)",
27
+ "accent-text": "var(--uix-accent-text)",
27
28
  "ring": "var(--uix-ring)",
28
29
  "brand-muted": "var(--uix-brand-muted)",
29
30
  "success": "var(--uix-success)",
@@ -178,6 +179,7 @@ export const light = {
178
179
  "accent-hover": "color-mix(in srgb, var(--uix-accent) 88%, #000000)",
179
180
  "accent-fg": "#FFFFFF",
180
181
  "link": "#1447E6",
182
+ "accent-text": "color-mix(in srgb, var(--uix-accent) 65%, #000000)",
181
183
  "ring": "#1447E6",
182
184
  "brand-muted": "color-mix(in srgb, var(--uix-accent) 12%, transparent)",
183
185
  "success": "#047857",
@@ -293,19 +295,19 @@ export const light = {
293
295
  "font-sans": "\"Inter\",system-ui,sans-serif",
294
296
  "font-heading": "\"IBM Plex Sans\",\"Inter\",system-ui,sans-serif",
295
297
  "font-mono": "\"IBM Plex Mono\",ui-monospace,monospace",
296
- "text-display": "40px",
298
+ "text-display": "2.5rem",
297
299
  "leading-display": "1.05",
298
- "text-data-hero": "34px",
300
+ "text-data-hero": "2.125rem",
299
301
  "leading-data-hero": "1.1",
300
- "text-h2": "24px",
302
+ "text-h2": "1.5rem",
301
303
  "leading-h2": "1.15",
302
- "text-h3": "15px",
304
+ "text-h3": "0.9375rem",
303
305
  "leading-h3": "1.3",
304
- "text-body": "14px",
306
+ "text-body": "0.875rem",
305
307
  "leading-body": "1.5",
306
- "text-meta": "12.5px",
308
+ "text-meta": "0.78125rem",
307
309
  "leading-meta": "1.4",
308
- "text-eyebrow": "11px",
310
+ "text-eyebrow": "0.6875rem",
309
311
  "leading-eyebrow": "1.2",
310
312
  "tracking-tight": "-0.02em",
311
313
  "tracking-eyebrow": "0.06em",
@@ -327,6 +329,7 @@ export const dark = {
327
329
  "accent": "#2563EB",
328
330
  "accent-hover": "color-mix(in srgb, var(--uix-accent) 82%, #FFFFFF)",
329
331
  "link": "#5B8DEF",
332
+ "accent-text": "color-mix(in srgb, var(--uix-accent) 70%, #FFFFFF)",
330
333
  "ring": "#3080FF",
331
334
  "brand-muted": "color-mix(in srgb, var(--uix-accent) 16%, transparent)",
332
335
  "success": "#00D294",
@@ -414,11 +417,4 @@ export const num = {
414
417
  "space-10": 64,
415
418
  "space-11": 80,
416
419
  "space-12": 96,
417
- "text-display": 40,
418
- "text-data-hero": 34,
419
- "text-h2": 24,
420
- "text-h3": 15,
421
- "text-body": 14,
422
- "text-meta": 12.5,
423
- "text-eyebrow": 11,
424
420
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tensor_1/tokens",
3
- "version": "2.15.0",
3
+ "version": "2.17.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": [
@@ -9,7 +9,7 @@
9
9
  border: 1px solid var(--uix-border); border-radius: var(--uix-radius-lg); overflow: hidden;
10
10
  transition: grid-template-columns var(--uix-dur) var(--uix-ease-out), grid-template-rows var(--uix-dur) var(--uix-ease-out);
11
11
  }
12
- .uix-shell__sidebar { grid-row: 1 / 3; background: var(--uix-bg-subtle); border-right: 1px solid var(--uix-border); overflow-y: auto; overflow-x: hidden; }
12
+ .uix-shell__sidebar { grid-row: 1 / 3; background: var(--uix-bg-subtle); border-right: 1px solid var(--uix-border); overflow-y: auto; overflow-x: hidden; visibility: visible; transition: visibility var(--uix-dur) var(--uix-ease-out); }
13
13
  .uix-shell__topbar { grid-column: 2; display: flex; align-items: center; gap: var(--uix-space-3); padding: 0 var(--uix-space-6); background: var(--uix-bg-app); border-bottom: 1px solid var(--uix-border); }
14
14
  .uix-shell__main { grid-column: 2; overflow: auto; padding: var(--uix-space-7); background: var(--uix-bg-app); }
15
15
 
@@ -18,17 +18,39 @@
18
18
  only) → hidden (0). data-collapsed stays a back-compat alias for the rail. */
19
19
  .uix-shell[data-nav="rail"], .uix-shell[data-collapsed] { grid-template-columns: var(--uix-sidebar-w-rail) 1fr; }
20
20
  .uix-shell[data-nav="hidden"] { grid-template-columns: 0 1fr; }
21
+ /* the 0-width column still renders its links — visibility removes them from the tab
22
+ order / accessibility tree while keeping the width transition (UIX-A11Y-2) */
23
+ .uix-shell[data-nav="hidden"] .uix-shell__sidebar { visibility: hidden; }
21
24
 
22
25
  /* ── focus / immersive mode ───────────────────────────────────────────────────
23
26
  A table-scoped escape hatch: hide the sidebar AND the topbar so a dense grid
24
27
  uses the whole frame. The app toggles [data-focus] (from a toolbar maximize
25
28
  control) and restores the previous nav state + focus on Esc. */
26
29
  .uix-shell[data-focus] { grid-template-columns: 0 1fr; grid-template-rows: 0 1fr; }
30
+ .uix-shell[data-focus] .uix-shell__sidebar { visibility: hidden; } /* see [data-nav="hidden"] above (UIX-A11Y-2) */
27
31
  .uix-shell[data-focus] .uix-shell__topbar { display: none; }
28
32
 
29
33
  /* a floating host for the "exit focus" affordance (Esc also exits) */
30
34
  .uix-shell__focus-exit { position: absolute; top: var(--uix-space-3); right: var(--uix-space-3); z-index: var(--uix-z-overlay); }
31
35
 
36
+ /* ── skip link ────────────────────────────────────────────────────────────────
37
+ First tab stop in the shell (UIX-A11Y-2): visually hidden until keyboard focus,
38
+ then a small pill floating over the shell's top-left corner. */
39
+ .uix-skiplink {
40
+ position: absolute; top: var(--uix-space-3); left: var(--uix-space-3); z-index: var(--uix-z-overlay);
41
+ width: 1px; height: 1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap;
42
+ }
43
+ .uix-skiplink:focus-visible {
44
+ width: auto; height: auto; clip: auto;
45
+ display: inline-flex; align-items: center;
46
+ padding: var(--uix-space-2) var(--uix-space-4);
47
+ background: var(--uix-surface); color: var(--uix-text);
48
+ border: 1px solid var(--uix-border); border-radius: var(--uix-radius-pill);
49
+ box-shadow: var(--uix-shadow-popover);
50
+ outline: 2px solid var(--uix-ring); outline-offset: 2px;
51
+ font-size: var(--uix-text-meta); font-weight: 500; text-decoration: none;
52
+ }
53
+
32
54
  /* ── full-bleed main ──────────────────────────────────────────────────────────
33
55
  Opt-in per surface: a genuinely wide grid drops the content gutter and runs
34
56
  edge to edge, reclaiming 2 x --uix-space-7. Not the default — most pages want
@@ -1,9 +1,83 @@
1
- /* uix chart container + legend — palette + framing only; pair sample SVGs / a chart lib using --uix-chart-*. */
1
+ /* uix chart — analytical card chrome and token-aware legend/annotation primitives.
2
+ Pair with semantic SVG/canvas output or the optional @tensor_1/react chart adapter. */
2
3
  @layer uix.components {
3
- .uix-chart { background: var(--uix-surface); border: 1px solid var(--uix-border); border-radius: var(--uix-radius-lg); padding: var(--uix-space-5); }
4
- .uix-chart__title { font-size: var(--uix-text-h3); font-weight: 600; }
5
- .uix-chart__subtitle { font-size: var(--uix-text-meta); color: var(--uix-text-muted); margin-bottom: var(--uix-space-4); }
6
- .uix-legend { display: flex; flex-wrap: wrap; gap: var(--uix-space-3); margin-top: var(--uix-space-3); }
7
- .uix-legend__item { display: inline-flex; align-items: center; gap: var(--uix-space-2); font-size: var(--uix-text-meta); color: var(--uix-text-hushed); }
8
- .uix-legend__swatch { width: 10px; height: 10px; border-radius: var(--uix-radius-xs); flex: none; }
4
+ .uix-chart {
5
+ position: relative; min-width: 0; overflow: hidden; padding: var(--uix-space-5);
6
+ border: 1px solid var(--uix-border); border-radius: var(--uix-radius-lg);
7
+ background: var(--uix-surface); box-shadow: var(--uix-shadow-sm);
8
+ }
9
+ .uix-chart--flat { box-shadow: none; }
10
+ .uix-chart--hero { padding: var(--uix-space-6); }
11
+ .uix-chart__header {
12
+ display: flex; align-items: flex-start; justify-content: space-between;
13
+ gap: var(--uix-space-4); min-width: 0; margin-bottom: var(--uix-space-4);
14
+ }
15
+ .uix-chart__heading { min-width: 0; }
16
+ .uix-chart__eyebrow {
17
+ margin-bottom: var(--uix-space-2); color: var(--uix-text-muted);
18
+ font-size: var(--uix-text-eyebrow); font-weight: 600;
19
+ letter-spacing: var(--uix-tracking-eyebrow); text-transform: uppercase;
20
+ }
21
+ .uix-chart__title { color: var(--uix-text); font-size: var(--uix-text-h3); font-weight: 600; }
22
+ .uix-chart__subtitle { color: var(--uix-text-muted); font-size: var(--uix-text-meta); line-height: var(--uix-leading-meta); }
23
+ .uix-chart__title + .uix-chart__subtitle { margin-top: var(--uix-space-1); }
24
+ .uix-chart__metric { flex: none; text-align: right; }
25
+ .uix-chart__metric-value {
26
+ color: var(--uix-text); font-family: var(--uix-font-mono); font-size: var(--uix-text-h2);
27
+ font-weight: 600; letter-spacing: var(--uix-tracking-tight); line-height: var(--uix-leading-h2);
28
+ }
29
+ .uix-chart__metric-label { margin-top: var(--uix-space-1); color: var(--uix-text-muted); font-size: var(--uix-text-meta); }
30
+ .uix-chart__delta {
31
+ display: inline-flex; align-items: center; gap: var(--uix-space-1);
32
+ margin-top: var(--uix-space-2); color: var(--uix-text-hushed); font-size: var(--uix-text-meta); font-weight: 600;
33
+ }
34
+ .uix-chart__delta[data-tone="positive"] { color: var(--uix-success); }
35
+ .uix-chart__delta[data-tone="negative"] { color: var(--uix-danger-text); }
36
+ .uix-chart__delta[data-tone="warning"] { color: var(--uix-warning-text); }
37
+ .uix-chart__plot { position: relative; min-width: 0; }
38
+ .uix-chart__plot[data-loading] { display: grid; min-height: 180px; place-items: center; border-radius: var(--uix-radius-md); background: var(--uix-bg-subtle); }
39
+ .uix-chart__plot[data-loading]::after { content: "Loading chart…"; color: var(--uix-text-muted); font-size: var(--uix-text-meta); }
40
+ .uix-chart__plot[data-loading] > * { position: absolute; opacity: 0; pointer-events: none; }
41
+ .uix-chart__plot[data-empty] {
42
+ display: grid; min-height: 180px; place-items: center; padding: var(--uix-space-6);
43
+ border: 1px dashed var(--uix-border-strong); border-radius: var(--uix-radius-md);
44
+ color: var(--uix-text-muted); text-align: center;
45
+ }
46
+ .uix-chart__annotation {
47
+ display: flex; align-items: flex-start; gap: var(--uix-space-2);
48
+ margin-top: var(--uix-space-3); padding: var(--uix-space-3);
49
+ border-left: 3px solid var(--uix-accent); border-radius: 0 var(--uix-radius-sm) var(--uix-radius-sm) 0;
50
+ background: var(--uix-brand-muted); color: var(--uix-text-hushed);
51
+ font-size: var(--uix-text-meta); line-height: var(--uix-leading-meta);
52
+ }
53
+ .uix-chart__footer {
54
+ display: flex; align-items: center; justify-content: space-between;
55
+ gap: var(--uix-space-4); min-width: 0; margin-top: var(--uix-space-4);
56
+ padding-top: var(--uix-space-3); border-top: 1px solid var(--uix-border);
57
+ color: var(--uix-text-muted); font-size: var(--uix-text-meta);
58
+ }
59
+ .uix-chart__source { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
60
+ .uix-legend { display: flex; flex-wrap: wrap; gap: var(--uix-space-2) var(--uix-space-4); margin: 0; padding: 0; list-style: none; }
61
+ .uix-legend__item { display: inline-flex; align-items: center; gap: var(--uix-space-2); color: var(--uix-text-hushed); font-size: var(--uix-text-meta); }
62
+ .uix-legend__swatch { width: 10px; height: 10px; flex: none; border-radius: var(--uix-radius-xs); background: var(--legend-color, var(--uix-chart-1)); }
63
+ .uix-legend__swatch--line { width: 18px; height: 3px; border-radius: var(--uix-radius-pill); }
64
+ .uix-legend__swatch--dash { width: 18px; height: 0; border-top: 2px dashed var(--legend-color, var(--uix-chart-1)); border-radius: 0; background: transparent; }
65
+
66
+ /* Runtime-free throughput/history strip. Put its accessible summary on the parent figure. */
67
+ .uix-chart-ticks { display: grid; grid-template-columns: repeat(var(--tick-count, 12), minmax(3px, 1fr)); align-items: end; gap: var(--uix-space-1); height: 72px; }
68
+ .uix-chart-tick {
69
+ min-height: 4px; height: calc(var(--tick-value, .25) * 100%);
70
+ border-radius: var(--uix-radius-xs) var(--uix-radius-xs) 0 0;
71
+ background: var(--tick-color, var(--uix-chart-1));
72
+ }
73
+ .uix-chart-tick[data-state="quiet"] { --tick-color: var(--uix-bg-active); }
74
+ .uix-chart-tick[data-state="warning"] { --tick-color: var(--uix-warning); }
75
+ .uix-chart-tick[data-state="danger"] { --tick-color: var(--uix-danger); }
76
+ .uix-chart-tick[data-current] { box-shadow: 0 0 0 2px var(--uix-surface), 0 0 0 4px var(--uix-ring); }
77
+ @media (max-width: 520px) {
78
+ .uix-chart, .uix-chart--hero { padding: var(--uix-space-4); }
79
+ .uix-chart__header { flex-direction: column; }
80
+ .uix-chart__metric { text-align: left; }
81
+ .uix-chart__footer { align-items: flex-start; flex-direction: column; gap: var(--uix-space-2); }
82
+ }
9
83
  }
@@ -14,7 +14,8 @@
14
14
  }
15
15
  .uix-checkbox > input:checked + .uix-checkbox__box,
16
16
  .uix-checkbox > input:indeterminate + .uix-checkbox__box { background: var(--uix-accent); border-color: var(--uix-accent); }
17
- .uix-checkbox > input:checked + .uix-checkbox__box svg { opacity: 1; transform: none; }
17
+ .uix-checkbox > input:checked + .uix-checkbox__box svg,
18
+ .uix-checkbox > input:indeterminate + .uix-checkbox__box svg { opacity: 1; transform: none; } /* indeterminate shows its dash icon, not just the filled box (UIX-A11Y-3) */
18
19
  .uix-checkbox > input:focus-visible + .uix-checkbox__box { outline: 2px solid var(--uix-ring); outline-offset: 2px; }
19
20
  .uix-checkbox > input:disabled ~ * { opacity: .5; }
20
21
  }
@@ -3,6 +3,9 @@
3
3
  .uix-cmdk { width: min(560px, 92vw); border: 1px solid var(--uix-border); border-radius: var(--uix-radius-lg); background: var(--uix-surface-2); box-shadow: var(--uix-shadow-overlay); overflow: hidden; }
4
4
  .uix-cmdk__input { width: 100%; height: 48px; border: 0; border-bottom: 1px solid var(--uix-border); background: transparent; color: var(--uix-text); font: inherit; font-size: var(--uix-text-h3); padding: 0 var(--uix-space-4); }
5
5
  .uix-cmdk__input:focus { outline: none; }
6
+ /* visible focus replacement for the suppressed outline (UIX-A11Y-1): the divider under the
7
+ input thickens to a 2px ring-colored line */
8
+ .uix-cmdk__input:focus-visible { border-bottom-color: var(--uix-ring); box-shadow: 0 1px 0 0 var(--uix-ring); }
6
9
  .uix-cmdk__list { max-height: 320px; overflow-y: auto; padding: var(--uix-space-2); }
7
10
  .uix-cmdk__group { font-size: var(--uix-text-eyebrow); letter-spacing: var(--uix-tracking-eyebrow); text-transform: uppercase; color: var(--uix-text-muted); padding: var(--uix-space-2) var(--uix-space-3) var(--uix-space-1); }
8
11
  .uix-cmdk__item { display: flex; align-items: center; gap: var(--uix-space-3); padding: var(--uix-space-3) var(--uix-space-3); border-radius: var(--uix-radius-sm); color: var(--uix-text); cursor: pointer; font-size: var(--uix-text-body); }
@@ -22,9 +22,22 @@
22
22
  color: var(--tone-fg, var(--uix-text-muted));
23
23
  }
24
24
  .uix-node__icon svg { width: var(--uix-icon-sm); height: var(--uix-icon-sm); }
25
+ .uix-node--no-icon { grid-template-columns: 1fr; }
25
26
  .uix-node__body { min-width: 0; }
27
+ .uix-node__eyebrow {
28
+ margin-bottom: var(--uix-space-1); color: var(--tone-fg, var(--uix-text-muted));
29
+ font-size: var(--uix-text-eyebrow); font-weight: 600;
30
+ letter-spacing: var(--uix-tracking-eyebrow); text-transform: uppercase;
31
+ }
26
32
  .uix-node__title { font-weight: 500; line-height: 1.25; }
27
33
  .uix-node__meta { font-size: var(--uix-text-meta); color: var(--uix-text-muted); }
34
+ .uix-node__footer {
35
+ grid-column: 1 / -1; display: flex; align-items: center; justify-content: space-between;
36
+ gap: var(--uix-space-3); min-width: 0; margin-top: var(--uix-space-1);
37
+ padding-top: var(--uix-space-2); border-top: 1px solid var(--uix-border);
38
+ color: var(--uix-text-hushed); font-size: var(--uix-text-meta);
39
+ }
40
+ .uix-node--wide { min-width: 208px; max-width: 280px; }
28
41
  .uix-node__status {
29
42
  display: inline-flex; align-items: center; gap: var(--uix-space-2); margin-top: var(--uix-space-1);
30
43
  font-size: var(--uix-text-eyebrow); letter-spacing: var(--uix-tracking-eyebrow);
@@ -87,6 +100,12 @@
87
100
  position: relative; width: 100%;
88
101
  color: var(--uix-border-strong); /* edges inherit via currentColor */
89
102
  }
103
+ .uix-flow--panel {
104
+ padding: var(--uix-space-6); border: 1px solid var(--uix-border);
105
+ border-radius: var(--uix-radius-lg); background-color: var(--uix-bg-subtle);
106
+ background-image: radial-gradient(var(--uix-border) 1px, transparent 1px);
107
+ background-size: 22px 22px; box-shadow: inset 0 1px 0 var(--uix-surface);
108
+ }
90
109
  .uix-flow__edges {
91
110
  position: absolute; inset: 0; width: 100%; height: 100%;
92
111
  overflow: visible; pointer-events: none; /* never block node hover/focus */
@@ -120,6 +139,8 @@
120
139
  }
121
140
  .uix-flow__connector[data-done] { border-color: var(--uix-success); }
122
141
  .uix-flow__connector[data-done]::after { border-color: var(--uix-success); }
142
+ .uix-flow__connector[data-running] { border-color: var(--uix-accent); border-top-style: dashed; }
143
+ .uix-flow__connector[data-running]::after { border-color: var(--uix-accent); }
123
144
 
124
145
  /* ---- branch / loop / mindmap: absolutely-positioned nodes over an SVG edge layer.
125
146
  Container aspect-ratio matches each SVG viewBox so % node positions and path
@@ -193,4 +214,10 @@
193
214
  .uix-flow:hover .uix-flow__edge,
194
215
  .uix-flow:focus-within .uix-flow__edge { animation: none; }
195
216
  }
217
+
218
+ @media (max-width: 720px) {
219
+ .uix-flow--panel { padding: var(--uix-space-4); overflow-x: auto; }
220
+ .uix-flow--linear .uix-flow__row { min-width: max-content; flex-wrap: nowrap; }
221
+ .uix-flow--linear .uix-flow__connector { flex-basis: 38px; }
222
+ }
196
223
  }
@@ -3,6 +3,11 @@
3
3
  .uix-form-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: var(--uix-space-5); }
4
4
  .uix-fieldset { border: 1px solid var(--uix-border); border-radius: var(--uix-radius-lg); padding: var(--uix-space-6); }
5
5
  .uix-fieldset > legend { padding: 0 var(--uix-space-2); font-size: var(--uix-text-meta); font-weight: 600; color: var(--uix-text); }
6
+ /* Labeled RadioGroup renders as a fieldset (UIX-A11Y-3): strip the UA chrome so it
7
+ looks identical to the plain-div group; the legend spaces itself (fieldset gap
8
+ doesn't reach a legend). */
9
+ fieldset.uix-radio-group { border: 0; margin: 0; padding: 0; min-inline-size: auto; }
10
+ .uix-radio-group__legend { padding: 0; margin: 0 0 var(--uix-space-2); font-size: var(--uix-text-meta); font-weight: 600; color: var(--uix-text); }
6
11
  .uix-form-inline { display: flex; flex-wrap: wrap; align-items: flex-end; gap: var(--uix-space-4); }
7
12
  .uix-validation-summary {
8
13
  border: 1px solid var(--uix-danger); background: var(--uix-danger-bg); color: var(--uix-text);
@@ -4,10 +4,19 @@
4
4
  .uix-inbox__list { border-right: 1px solid var(--uix-border); overflow-y: auto; background: var(--uix-surface); }
5
5
  .uix-inbox__item { position: relative; display: flex; flex-direction: column; gap: var(--uix-space-1); padding: var(--uix-space-3) var(--uix-space-4); border-bottom: 1px solid var(--uix-border); cursor: pointer; }
6
6
  .uix-inbox__item:hover { background: var(--uix-bg-hover); }
7
+ /* keyboard active option (aria-activedescendant) mirrors the hover style (UIX-A11Y-2) */
8
+ .uix-inbox__item[data-active] { background: var(--uix-bg-hover); }
7
9
  .uix-inbox__item[aria-selected="true"] { background: linear-gradient(to right, var(--uix-accent) 3px, var(--uix-brand-muted) 3px); }
8
10
  .uix-inbox__item[data-unread] .uix-inbox__subject { font-weight: 600; }
9
11
  .uix-inbox__subject { font-size: var(--uix-text-body); }
10
12
  .uix-inbox__preview { font-size: var(--uix-text-meta); color: var(--uix-text-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
11
13
  .uix-inbox__detail { overflow-y: auto; padding: var(--uix-space-5); background: var(--uix-bg-app); }
12
- @media (max-width: 700px) { .uix-inbox { grid-template-columns: 1fr; } .uix-inbox__detail { display: none; } }
14
+ /* narrow viewports stack to one pane: list by default, detail when the app sets
15
+ view="detail" — with a consumer-rendered Back control in the detail pane (UIX-A11Y-2) */
16
+ @media (max-width: 700px) {
17
+ .uix-inbox { grid-template-columns: 1fr; }
18
+ .uix-inbox__detail { display: none; }
19
+ .uix-inbox[data-view="detail"] .uix-inbox__list { display: none; }
20
+ .uix-inbox[data-view="detail"] .uix-inbox__detail { display: block; }
21
+ }
13
22
  }
@@ -39,7 +39,8 @@
39
39
  * 2 · TITLE / NAME SLOTS — quiet by default. `:not(.uix-btn)` so an anchor deliberately
40
40
  * styled as a button inside a title slot keeps its button treatment.
41
41
  * 3 · DATA CELLS — table cells and description-list values. `:not([class])` so
42
- * class-bearing anchors (`.uix-btn--link`, pills, tags) stay styled.
42
+ * class-bearing anchors (`.uix-btn--link`, pills, tags) stay styled. Table BODY
43
+ * links skip the hover underline too — see table.css (the row hover is the cue).
43
44
  * 4 · CONTAINER ANCHORS — the anchor IS the kit block (`<a class="uix-card">`). Without
44
45
  * this the base `a { color }` tints every word in the block brand-blue.
45
46
  * Depends only on --uix-* tokens. */
@@ -79,7 +80,8 @@
79
80
  .uix-audit__actor
80
81
  ) a:not(.uix-btn):is(:hover, :focus-visible),
81
82
 
82
- :is(.uix-table td, .uix-dl dd) a:not([class]):is(:hover, :focus-visible) { text-decoration: underline; }
83
+ /* body-row links are excluded: table.css keeps them calm on hover (the row tint is the cue) */
84
+ :is(.uix-table :is(thead, tfoot) td, .uix-dl dd) a:not([class]):is(:hover, :focus-visible) { text-decoration: underline; }
83
85
 
84
86
  /* Container anchors never underline: the anchor wraps the whole block, so an underline
85
87
  would strike through every word in it. They take the kit's standard row-hover tint
@@ -22,7 +22,9 @@
22
22
  @starting-style { .uix-dialog[open]::backdrop { opacity: 0; } }
23
23
 
24
24
  .uix-dialog__header { display: flex; align-items: center; gap: var(--uix-space-3); padding: var(--uix-space-4) var(--uix-space-5); border-bottom: 1px solid var(--uix-border); }
25
- .uix-dialog__title { font-size: var(--uix-text-h3); font-weight: 600; }
25
+ /* title is an <h2> for SR navigation (UIX-A11Y-1); inherits neutralize the base h2
26
+ heading font/tracking/leading so it renders exactly like the old <div> */
27
+ .uix-dialog__title { font-size: var(--uix-text-h3); font-weight: 600; font-family: inherit; letter-spacing: inherit; line-height: inherit; }
26
28
  .uix-dialog__close { margin-left: auto; border: 0; background: transparent; color: var(--uix-text-muted); cursor: pointer; width: 30px; height: 30px; display: grid; place-items: center; border-radius: var(--uix-radius-sm); }
27
29
  .uix-dialog__close:hover { background: var(--uix-bg-hover); color: var(--uix-text); }
28
30
  .uix-dialog__close svg { width: var(--uix-icon-md); height: var(--uix-icon-md); }
@@ -27,7 +27,13 @@
27
27
  .uix-peek__nav { display: inline-flex; gap: var(--uix-space-1); }
28
28
  .uix-peek__navbtn { width: 28px; height: 28px; display: grid; place-items: center; border: 1px solid var(--uix-border); background: var(--uix-surface); color: var(--uix-text); border-radius: var(--uix-radius-sm); cursor: pointer; }
29
29
  .uix-peek__navbtn:hover { background: var(--uix-bg-hover); }
30
- .uix-peek__title { font-size: var(--uix-text-h3); font-weight: 600; }
30
+ /* boundary nav uses aria-disabled (still focusable, so focus isn't stranded — UIX-A11Y-1);
31
+ mute it and suppress the hover cue like a disabled control */
32
+ .uix-peek__navbtn[aria-disabled="true"] { color: var(--uix-text-muted); cursor: default; }
33
+ .uix-peek__navbtn[aria-disabled="true"]:hover { background: var(--uix-surface); }
34
+ /* title is an <h2> for SR navigation (UIX-A11Y-1); inherits neutralize the base h2
35
+ heading font/tracking/leading so it renders exactly like the old <div> */
36
+ .uix-peek__title { font-size: var(--uix-text-h3); font-weight: 600; font-family: inherit; letter-spacing: inherit; line-height: inherit; }
31
37
  .uix-peek__title a { color: var(--uix-link); }
32
38
  .uix-peek__close { margin-left: auto; border: 0; background: transparent; color: var(--uix-text-muted); cursor: pointer; width: 30px; height: 30px; display: grid; place-items: center; border-radius: var(--uix-radius-sm); }
33
39
  .uix-peek__close:hover { background: var(--uix-bg-hover); color: var(--uix-text); }
@@ -1,9 +1,144 @@
1
- /* uix deal / pipeline stage bar — depends only on --uix-* tokens. */
1
+ /* uix pipeline — compact stage bar + detailed operational stage rail.
2
+ Depends only on --uix-* tokens; state is always repeated in visible text. */
2
3
  @layer uix.components {
3
- .uix-pipeline { display: flex; gap: var(--uix-space-1); }
4
- .uix-pipeline__stage { flex: 1; text-align: center; padding: var(--uix-space-2) var(--uix-space-2); font-size: var(--uix-text-meta); color: var(--uix-text-muted); background: var(--uix-bg-subtle); }
4
+ .uix-pipeline {
5
+ display: flex;
6
+ gap: var(--uix-space-1);
7
+ min-width: 0;
8
+ margin: 0;
9
+ padding: 0;
10
+ list-style: none;
11
+ }
12
+ .uix-pipeline__stage {
13
+ position: relative;
14
+ flex: 1;
15
+ min-width: 0;
16
+ padding: var(--uix-space-2);
17
+ text-align: center;
18
+ font-size: var(--uix-text-meta);
19
+ color: var(--stage-fg, var(--uix-text-muted));
20
+ background: var(--stage-bg, var(--uix-bg-subtle));
21
+ border-color: var(--stage-border, transparent);
22
+ }
5
23
  .uix-pipeline__stage:first-child { border-radius: var(--uix-radius-pill) 0 0 var(--uix-radius-pill); }
6
24
  .uix-pipeline__stage:last-child { border-radius: 0 var(--uix-radius-pill) var(--uix-radius-pill) 0; }
7
- .uix-pipeline__stage[data-state="done"] { background: var(--uix-accent); color: var(--uix-accent-fg); }
8
- .uix-pipeline__stage[data-state="active"] { background: var(--uix-brand-muted); color: var(--uix-link); font-weight: 600; }
25
+ .uix-pipeline__stage[data-state="done"],
26
+ .uix-pipeline__stage[data-state="complete"] {
27
+ --stage-bg: var(--uix-accent); --stage-fg: var(--uix-accent-fg); --stage-dot: var(--uix-success);
28
+ }
29
+ .uix-pipeline__stage[data-state="active"],
30
+ .uix-pipeline__stage[data-state="current"],
31
+ .uix-pipeline__stage[data-state="running"] {
32
+ --stage-bg: var(--uix-brand-muted); --stage-fg: var(--uix-link);
33
+ --stage-border: var(--uix-accent); --stage-dot: var(--uix-accent); font-weight: 600;
34
+ }
35
+ .uix-pipeline__stage[data-state="failed"],
36
+ .uix-pipeline__stage[data-state="error"] {
37
+ --stage-bg: var(--uix-danger-bg); --stage-fg: var(--uix-danger-text);
38
+ --stage-border: var(--uix-danger); --stage-dot: var(--uix-danger);
39
+ }
40
+ .uix-pipeline__stage[data-state="blocked"] {
41
+ --stage-bg: var(--uix-warning-bg); --stage-fg: var(--uix-warning-text);
42
+ --stage-border: var(--uix-warning); --stage-dot: var(--uix-warning);
43
+ }
44
+ .uix-pipeline__stage[data-state="waiting"],
45
+ .uix-pipeline__stage[data-state="pending"] { --stage-dot: var(--uix-text-muted); }
46
+
47
+ /* Detailed mode scrolls at narrow widths instead of crushing timing and state. */
48
+ .uix-pipeline--detailed {
49
+ position: relative;
50
+ gap: 0;
51
+ overflow-x: auto;
52
+ padding: var(--uix-space-1) var(--uix-space-1) var(--uix-space-4);
53
+ scrollbar-width: thin;
54
+ scrollbar-color: var(--uix-border-strong) transparent;
55
+ scroll-snap-type: x proximity;
56
+ }
57
+ .uix-pipeline--detailed::before {
58
+ content: "";
59
+ position: absolute;
60
+ top: calc(var(--uix-space-1) + 21px);
61
+ right: var(--uix-space-8);
62
+ left: var(--uix-space-8);
63
+ height: 2px;
64
+ background: var(--uix-border);
65
+ }
66
+ .uix-pipeline--detailed .uix-pipeline__stage {
67
+ flex: 1 0 168px;
68
+ display: grid;
69
+ grid-template-rows: 42px auto;
70
+ gap: var(--uix-space-3);
71
+ padding: 0 var(--uix-space-2);
72
+ text-align: left;
73
+ color: var(--uix-text);
74
+ background: transparent;
75
+ border: 0;
76
+ border-radius: 0;
77
+ scroll-snap-align: start;
78
+ }
79
+ .uix-pipeline__marker {
80
+ position: relative;
81
+ z-index: var(--uix-z-raised);
82
+ display: grid;
83
+ place-items: center;
84
+ align-self: start;
85
+ width: 42px;
86
+ height: 42px;
87
+ border: 1px solid var(--stage-border, var(--uix-border-strong));
88
+ border-radius: var(--uix-radius-pill);
89
+ background: var(--stage-bg, var(--uix-surface));
90
+ color: var(--stage-fg, var(--uix-text-muted));
91
+ box-shadow: 0 0 0 var(--uix-space-1) var(--uix-surface), var(--uix-shadow-sm);
92
+ font-family: var(--uix-font-mono);
93
+ font-size: var(--uix-text-meta);
94
+ font-weight: 600;
95
+ }
96
+ .uix-pipeline__marker svg { width: var(--uix-icon-sm); height: var(--uix-icon-sm); }
97
+ .uix-pipeline__content {
98
+ min-width: 0;
99
+ padding: var(--uix-space-3);
100
+ border: 1px solid var(--stage-border, var(--uix-border));
101
+ border-radius: var(--uix-radius-md);
102
+ background: var(--uix-surface);
103
+ box-shadow: var(--uix-shadow-sm);
104
+ }
105
+ .uix-pipeline__stage[data-state="active"] .uix-pipeline__content,
106
+ .uix-pipeline__stage[data-state="current"] .uix-pipeline__content,
107
+ .uix-pipeline__stage[data-state="running"] .uix-pipeline__content {
108
+ box-shadow: var(--uix-shadow-sm), 0 0 0 3px var(--uix-brand-muted);
109
+ }
110
+ .uix-pipeline__eyebrow {
111
+ display: flex; align-items: center; justify-content: space-between; gap: var(--uix-space-2);
112
+ margin-bottom: var(--uix-space-2); color: var(--stage-fg, var(--uix-text-muted));
113
+ font-size: var(--uix-text-eyebrow); font-weight: 600;
114
+ letter-spacing: var(--uix-tracking-eyebrow); text-transform: uppercase;
115
+ }
116
+ .uix-pipeline__state { display: inline-flex; align-items: center; gap: var(--uix-space-2); }
117
+ .uix-pipeline__state::before {
118
+ content: ""; width: 7px; height: 7px; flex: none; border-radius: 50%;
119
+ background: var(--stage-dot, var(--uix-text-muted));
120
+ }
121
+ .uix-pipeline__stage[data-state="blocked"] .uix-pipeline__state::before { border-radius: var(--uix-radius-xs); }
122
+ .uix-pipeline__title {
123
+ overflow: hidden; color: var(--uix-text); font-size: var(--uix-text-body); font-weight: 600;
124
+ line-height: var(--uix-leading-body); text-overflow: ellipsis; white-space: nowrap;
125
+ }
126
+ .uix-pipeline__description {
127
+ margin-top: var(--uix-space-1); color: var(--uix-text-muted);
128
+ font-size: var(--uix-text-meta); font-weight: 400; line-height: var(--uix-leading-meta);
129
+ }
130
+ .uix-pipeline__meta {
131
+ display: flex; align-items: center; gap: var(--uix-space-2); min-width: 0;
132
+ margin-top: var(--uix-space-3); padding-top: var(--uix-space-3); border-top: 1px solid var(--uix-border);
133
+ color: var(--uix-text-hushed); font-size: var(--uix-text-meta); font-weight: 400;
134
+ }
135
+ .uix-pipeline__meta > :last-child { margin-left: auto; }
136
+ .uix-pipeline__stage:focus-visible,
137
+ .uix-pipeline__stage:has(:focus-visible) .uix-pipeline__content {
138
+ outline: none; border-color: var(--uix-ring);
139
+ box-shadow: 0 0 0 2px var(--uix-surface), 0 0 0 4px var(--uix-ring);
140
+ }
141
+ @media (max-width: 640px) {
142
+ .uix-pipeline--detailed .uix-pipeline__stage { flex-basis: min(78vw, 240px); }
143
+ }
9
144
  }
@@ -7,6 +7,6 @@
7
7
  transition: background-color var(--uix-dur-fast) var(--uix-ease-out), color var(--uix-dur-fast) var(--uix-ease-out);
8
8
  }
9
9
  .uix-segmented__option:hover { color: var(--uix-text); }
10
- .uix-segmented__option[aria-selected="true"], .uix-segmented__option[aria-pressed="true"] { background: var(--uix-surface); color: var(--uix-text); box-shadow: var(--uix-shadow-sm); }
10
+ .uix-segmented__option[aria-pressed="true"] { background: var(--uix-surface); color: var(--uix-text); box-shadow: var(--uix-shadow-sm); }
11
11
  .uix-segmented__option:focus-visible { outline: 2px solid var(--uix-ring); outline-offset: 1px; }
12
12
  }