@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.
@@ -32,7 +32,9 @@
32
32
  .uix-navitem__badge { font-size: var(--uix-text-meta); color: var(--uix-text-muted); }
33
33
  /* on the active tint, muted badge dips below AA — hushed composites darker on the tint */
34
34
  .uix-navitem[aria-current="page"] .uix-navitem__badge { color: var(--uix-text-hushed); }
35
- .uix-navitem__star { display: grid; place-items: center; width: 22px; height: 22px; border: 0; background: transparent; color: var(--uix-text-muted); cursor: pointer; border-radius: var(--uix-radius-xs); opacity: 0; transition: opacity var(--uix-dur-fast) var(--uix-ease-out); }
35
+ .uix-navitem__star { position: relative; display: grid; place-items: center; width: 22px; height: 22px; border: 0; background: transparent; color: var(--uix-text-muted); cursor: pointer; border-radius: var(--uix-radius-xs); opacity: 0; transition: opacity var(--uix-dur-fast) var(--uix-ease-out); }
36
+ /* invisible halo → 24px effective target with zero visual change (UIX-A11Y-2) */
37
+ .uix-navitem__star::before { content: ""; position: absolute; inset: -1px; }
36
38
  .uix-navitem__star svg { width: 15px; height: 15px; }
37
39
  .uix-navitem:hover .uix-navitem__star, .uix-navitem:focus-within .uix-navitem__star, .uix-navitem__star:focus-visible { opacity: 1; }
38
40
  .uix-navitem__star[data-on] { opacity: 1; color: var(--uix-warning); }
@@ -83,26 +85,39 @@
83
85
  .uix-navgroup__chevron { width: var(--uix-icon-sm); height: var(--uix-icon-sm); }
84
86
  .uix-navgroup__panel { display: grid; grid-template-rows: 1fr; transition: grid-template-rows var(--uix-dur) var(--uix-ease-out); }
85
87
  .uix-navgroup__trigger[aria-expanded="false"] + .uix-navgroup__panel { grid-template-rows: 0fr; }
86
- .uix-navgroup__panel > div { overflow: hidden; }
88
+ /* visibility keeps the 0fr-collapsed links out of the tab order / accessibility tree
89
+ (UIX-A11Y-2); the transition delays hiding until the row collapse finishes, and
90
+ visibility snaps back to visible instantly on expand, so nothing visibly glitches. */
91
+ .uix-navgroup__panel > div { overflow: hidden; visibility: visible; transition: visibility var(--uix-dur) var(--uix-ease-out); }
92
+ .uix-navgroup__trigger[aria-expanded="false"] + .uix-navgroup__panel > div { visibility: hidden; }
87
93
  .uix-subitem { padding-left: var(--uix-space-5); }
88
94
  .uix-subitem .uix-navitem__label::before { content: ""; display: inline-block; width: 4px; height: 4px; border-radius: 50%; background: var(--uix-text-muted); margin-right: var(--uix-space-3); vertical-align: middle; }
89
95
 
90
96
  /* collapsed rail */
91
97
  .uix-sidebar[data-collapsed], .uix-sidebar[data-nav="rail"] { width: var(--uix-sidebar-w-rail); }
92
- .uix-sidebar[data-collapsed] .uix-navitem__label,
93
98
  .uix-sidebar[data-collapsed] .uix-navitem__badge,
94
99
  .uix-sidebar[data-collapsed] .uix-navitem__star,
95
100
  .uix-sidebar[data-collapsed] .uix-sidebar__eyebrow,
96
101
  .uix-sidebar[data-collapsed] .uix-sidebar__brand,
97
102
  .uix-sidebar[data-collapsed] .uix-navgroup__chevron,
98
103
  .uix-sidebar[data-collapsed] .uix-navgroup__panel { display: none; }
99
- .uix-sidebar[data-nav="rail"] .uix-navitem__label,
100
104
  .uix-sidebar[data-nav="rail"] .uix-navitem__badge,
101
105
  .uix-sidebar[data-nav="rail"] .uix-navitem__star,
102
106
  .uix-sidebar[data-nav="rail"] .uix-sidebar__eyebrow,
103
107
  .uix-sidebar[data-nav="rail"] .uix-sidebar__brand,
104
108
  .uix-sidebar[data-nav="rail"] .uix-navgroup__chevron,
105
109
  .uix-sidebar[data-nav="rail"] .uix-navgroup__panel { display: none; }
110
+ /* rail labels stay in the accessibility tree — clip pattern (mirrors .uix-visually-hidden),
111
+ not display:none, so icon-only nav items keep their names (UIX-A11Y-2). position:absolute
112
+ removes the label from the flex row, so the centered rail layout is unaffected. */
113
+ .uix-sidebar[data-collapsed] .uix-navitem__label,
114
+ .uix-sidebar[data-nav="rail"] .uix-navitem__label {
115
+ position: absolute !important;
116
+ width: 1px; height: 1px;
117
+ padding: 0; margin: -1px;
118
+ overflow: hidden; clip: rect(0, 0, 0, 0);
119
+ white-space: nowrap; border: 0;
120
+ }
106
121
  /* center the icon-only rail; head keeps just the toggle, centered */
107
122
  .uix-sidebar[data-collapsed] .uix-navitem { justify-content: center; padding: 0; gap: 0; }
108
123
  .uix-sidebar[data-collapsed] .uix-sidebar__head { justify-content: center; padding-inline: 0; }
@@ -6,6 +6,8 @@
6
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
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); }
8
8
  .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
+ /* direction glyph inside the chip (UIX-A11Y-4) — sized to sit on the text baseline row */
10
+ .uix-stat__trend svg { width: 10px; height: 10px; flex: none; }
9
11
  .uix-stat__trend--up { color: var(--uix-success); background: var(--uix-success-bg); }
10
12
  .uix-stat__trend--down { color: var(--uix-danger-text); background: var(--uix-danger-bg); }
11
13
  }
@@ -15,7 +15,8 @@
15
15
  transition: background-color var(--uix-dur-fast) var(--uix-ease-out), border-color var(--uix-dur-fast) var(--uix-ease-out), color var(--uix-dur-fast) var(--uix-ease-out);
16
16
  }
17
17
  .uix-chip:hover { border-color: var(--uix-border-strong); color: var(--uix-text); }
18
- .uix-chip[data-on] { background: var(--uix-brand-muted); border-color: var(--uix-accent); color: var(--uix-accent); }
18
+ .uix-chip[data-on] { background: var(--uix-brand-muted); border-color: var(--uix-accent); color: var(--uix-accent-text); }
19
+ .uix-chip:focus-visible { outline: 2px solid var(--uix-ring); outline-offset: 2px; }
19
20
  .uix-chip__count { font-variant-numeric: tabular-nums; opacity: .7; }
20
21
  .uix-filter-popover { display: grid; gap: var(--uix-space-4); min-width: 260px; padding: var(--uix-space-4); }
21
22
  .uix-filter-popover .uix-label { display: grid; gap: var(--uix-space-2); }
@@ -18,18 +18,32 @@
18
18
  /* multi-column sort ordinal (⇧+click adds a secondary key) */
19
19
  .uix-table th[data-sort-order]::before { content: attr(data-sort-order); display: inline-block; margin-right: var(--uix-space-1); font-size: var(--uix-text-eyebrow); font-variant-numeric: tabular-nums; color: var(--uix-accent); }
20
20
 
21
+ /* sortable header's real <button> (UIX-A11Y-2): visually indistinguishable from the old
22
+ plain-text th — inherited font/colour, no chrome — with an inset overlay so the whole
23
+ cell stays the click target (the sticky th is its containing block). The sort arrow and
24
+ ordinal stay as th pseudo-content so they never pollute the button's accessible name. */
25
+ .uix-th__sortbtn { font: inherit; color: inherit; background: none; border: 0; padding: 0; text-align: inherit; cursor: pointer; }
26
+ .uix-th__sortbtn::before { content: ""; position: absolute; inset: 0; }
27
+
21
28
  .uix-table td { padding: 0 var(--uix-space-4); height: var(--uix-row-h); border-bottom: 1px solid var(--uix-border); color: var(--uix-text); vertical-align: middle; }
22
- .uix-table tbody tr { background: var(--uix-row); }
29
+ .uix-table tbody tr { background: var(--uix-row); transition: background-color var(--uix-dur-fast) var(--uix-ease-out); }
23
30
  .uix-table tbody tr:nth-child(even) { background: var(--uix-row-alt); }
24
31
  .uix-table--no-zebra tbody tr, .uix-table--no-zebra tbody tr:nth-child(even) { background: var(--uix-row); }
25
32
  .uix-table tbody tr[data-pinned] { background: var(--uix-row-pinned-bg); }
26
- .uix-table tbody tr[aria-selected="true"] { background: var(--uix-row-selected-bg); }
33
+ /* [data-selected] carries row-selection styling; aria-selected is invalid on a native
34
+ table row — AT state comes from the row checkbox (UIX-A11Y-2). */
35
+ .uix-table tbody tr[data-selected] { background: var(--uix-row-selected-bg); }
27
36
  .uix-table tbody tr:hover { background: var(--uix-bg-hover); }
37
+ /* Row links stay calm on hover/focus: the row tint is the affordance, so neither the base
38
+ layer's `a:hover` underline nor link.css reaches them. `:not(.uix-btn)` keeps buttons
39
+ styled; the global :focus-visible ring still marks keyboard focus. */
40
+ .uix-table tbody a:not(.uix-btn):is(:hover, :focus-visible) { color: var(--uix-text); text-decoration: none; }
28
41
  .uix-table[data-density="compact"] td, .uix-table--compact td { height: var(--uix-row-h-compact); }
29
42
  .uix-table[data-density="comfortable"] td { height: var(--uix-row-h-comfortable); }
30
43
 
31
44
  .uix-table__pin { border: 0; background: transparent; color: var(--uix-text-muted); cursor: pointer; padding: var(--uix-space-1); border-radius: var(--uix-radius-xs); opacity: 0; transition: opacity var(--uix-dur-fast) var(--uix-ease-out); }
32
- .uix-table tbody tr:hover .uix-table__pin, .uix-table__pin[data-on] { opacity: 1; }
45
+ /* :focus-visible reveal mirrors .uix-rowact so keyboard users can find the pin (UIX-A11Y-2) */
46
+ .uix-table tbody tr:hover .uix-table__pin, .uix-table__pin:focus-visible, .uix-table__pin[data-on] { opacity: 1; }
33
47
  .uix-table__pin:hover { background: var(--uix-bg-active); color: var(--uix-text); }
34
48
  .uix-table__pin[data-on] { color: var(--uix-accent); }
35
49
  .uix-table__pin svg { width: 15px; height: 15px; }
@@ -38,13 +52,16 @@
38
52
  /* frozen first column (opt-in via .uix-table--pinned-col) */
39
53
  .uix-table--pinned-col th:first-child, .uix-table--pinned-col td:first-child { position: sticky; left: 0; z-index: var(--uix-z-raised); box-shadow: 1px 0 0 var(--uix-border); }
40
54
  .uix-table--pinned-col thead th:first-child { z-index: var(--uix-z-sticky); background: var(--uix-surface); }
41
- .uix-table--pinned-col tbody tr td:first-child { background: var(--uix-row); }
55
+ .uix-table--pinned-col tbody tr td:first-child { background: var(--uix-row); transition: background-color var(--uix-dur-fast) var(--uix-ease-out); }
42
56
  .uix-table--pinned-col tbody tr:nth-child(even) td:first-child { background: var(--uix-row-alt); }
43
57
  .uix-table--pinned-col.uix-table--no-zebra tbody tr td:first-child,
44
58
  .uix-table--pinned-col.uix-table--no-zebra tbody tr:nth-child(even) td:first-child { background: var(--uix-row); }
45
59
  .uix-table--pinned-col tbody tr[data-pinned] td:first-child { background: var(--uix-row-pinned-bg); }
46
- .uix-table--pinned-col tbody tr[aria-selected="true"] td:first-child { background: var(--uix-row-selected-bg); }
60
+ .uix-table--pinned-col tbody tr[data-selected] td:first-child { background: var(--uix-row-selected-bg); }
47
61
  .uix-table--pinned-col tbody tr:hover td:first-child { background: var(--uix-bg-hover); }
62
+ @media (prefers-reduced-motion: reduce) {
63
+ .uix-table tbody tr, .uix-table--pinned-col tbody tr td:first-child { transition: none; }
64
+ }
48
65
 
49
66
  /* ── column sizing + cell behaviour (a shared vocabulary, not per-app px) ──────── */
50
67
  .uix-table--fixed { table-layout: fixed; width: 100%; }
@@ -142,7 +159,7 @@
142
159
  .uix-table--cards thead { position: absolute; width: 1px; height: 1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }
143
160
  .uix-table--cards tbody, .uix-table--cards tr, .uix-table--cards td { display: block; width: auto; }
144
161
  .uix-table--cards tbody tr { border: 1px solid var(--uix-border); border-radius: var(--uix-radius-md); background: var(--uix-surface); margin: 0 0 var(--uix-space-3); padding: var(--uix-space-1) var(--uix-space-4); box-shadow: var(--uix-shadow-sm); }
145
- .uix-table--cards tbody tr[aria-selected="true"] { box-shadow: 0 0 0 2px var(--uix-accent); }
162
+ .uix-table--cards tbody tr[data-selected] { box-shadow: 0 0 0 2px var(--uix-accent); }
146
163
  .uix-table--cards td { height: auto; display: flex; justify-content: space-between; align-items: center; gap: var(--uix-space-5); padding: var(--uix-space-2) 0; border-bottom: 1px solid var(--uix-border); text-align: right; white-space: normal; }
147
164
  .uix-table--cards td:last-child { border-bottom: 0; }
148
165
  .uix-table--cards td::before { content: attr(data-label); color: var(--uix-text-muted); font-size: var(--uix-text-meta); font-weight: 500; text-align: left; flex: none; }
@@ -10,7 +10,9 @@
10
10
  display: inline-flex; align-items: center; gap: var(--uix-space-1); padding: var(--uix-space-1) var(--uix-space-1) var(--uix-space-1) var(--uix-space-2); border-radius: var(--uix-radius-sm);
11
11
  background: var(--uix-bg-active); color: var(--uix-text); font-size: var(--uix-text-meta);
12
12
  }
13
- .uix-tag__remove { display: grid; place-items: center; width: 16px; height: 16px; border: 0; background: transparent; color: var(--uix-text-muted); cursor: pointer; border-radius: var(--uix-radius-xs); }
13
+ .uix-tag__remove { position: relative; display: grid; place-items: center; width: 16px; height: 16px; border: 0; background: transparent; color: var(--uix-text-muted); cursor: pointer; border-radius: var(--uix-radius-xs); }
14
+ /* Invisible overlay grows the 16px visual to a 24px hit target (UIX-A11Y-3). */
15
+ .uix-tag__remove::before { content: ""; position: absolute; inset: -4px; }
14
16
  .uix-tag__remove:hover { background: var(--uix-bg-hover); color: var(--uix-text); }
15
17
  .uix-tag__remove svg { width: 12px; height: 12px; }
16
18
  }
@@ -1,6 +1,7 @@
1
1
  /* uix timeline / activity feed — depends only on --uix-* tokens. */
2
2
  @layer uix.components {
3
- .uix-timeline { display: flex; flex-direction: column; }
3
+ /* list reset — the React Timeline renders <ol>/<li> for semantics; keep visuals pixel-identical (UIX-A11Y-4) */
4
+ .uix-timeline { display: flex; flex-direction: column; list-style: none; margin: 0; padding: 0; }
4
5
  .uix-timeline__item { display: grid; grid-template-columns: 24px 1fr; gap: var(--uix-space-3); }
5
6
  .uix-timeline__rail { display: flex; flex-direction: column; align-items: center; }
6
7
  .uix-timeline__node { width: 12px; height: 12px; border-radius: 50%; background: var(--uix-accent); margin-top: var(--uix-space-1); flex: none; box-shadow: 0 0 0 3px var(--uix-brand-muted); }
@@ -13,7 +13,8 @@
13
13
  background: var(--uix-text); color: var(--uix-bg-app);
14
14
  font-size: var(--uix-text-meta); font-weight: 500; line-height: 1.4;
15
15
  padding: var(--uix-space-2) var(--uix-space-3); border-radius: var(--uix-radius-sm);
16
- box-shadow: var(--uix-shadow-popover); white-space: normal; pointer-events: none;
16
+ /* no pointer-events:none — the bubble must be hoverable (WCAG 1.4.13, UIX-A11Y-1) */
17
+ box-shadow: var(--uix-shadow-popover); white-space: normal;
17
18
  opacity: 0; transition: opacity var(--uix-dur-fast) var(--uix-ease-out);
18
19
  }
19
20
  .uix-tooltip__bubble:popover-open { opacity: 1; }
@@ -21,6 +21,7 @@
21
21
  "accent-hover": { "$type": "color", "$value": "color-mix(in srgb, var(--uix-accent) 88%, #000000)", "$description": "Primary-button hover. Theme-aware: derived from the live accent so it tracks the brand override (light darkens, dark lightens — see tokens/dark)." },
22
22
  "accent-fg": { "$type": "color", "$value": "var(--uix-brand-fg,#FFFFFF)", "$description": "Runtime: chains through --uix-brand-fg." },
23
23
  "link": { "$type": "color", "$value": "var(--uix-brand,#1447E6)", "$description": "Runtime: chains through --uix-brand." },
24
+ "accent-text": { "$type": "color", "$value": "color-mix(in srgb, var(--uix-accent) 65%, #000000)", "$description": "The brand hue as TEXT on a neutral or --uix-brand-muted surface (a selected filter chip, an active tab label). The raw accent is a fill colour: a bright brand (POSx green, mission-control blue) reads below 3:1 as text on its own tint. Darkened from the live accent so it tracks the brand override; the worst shipped theme is 5.5:1 on brand-muted. Not for text ON a solid accent fill, which is --uix-accent-fg." },
24
25
  "ring": { "$type": "color", "$value": "var(--uix-brand,#1447E6)", "$description": "Runtime: chains through --uix-brand." },
25
26
  "brand-muted": { "$type": "color", "$value": "color-mix(in srgb, var(--uix-accent) 12%, transparent)", "$description": "Runtime: color-mix of the live accent." },
26
27
 
@@ -3,19 +3,19 @@
3
3
  "font-heading": { "$type": "fontFamily", "$value": "\"IBM Plex Sans\",\"Inter\",system-ui,sans-serif" },
4
4
  "font-mono": { "$type": "fontFamily", "$value": "\"IBM Plex Mono\",ui-monospace,monospace" },
5
5
 
6
- "text-display": { "$type": "dimension", "$value": "40px" },
6
+ "text-display": { "$type": "dimension", "$value": "2.5rem" },
7
7
  "leading-display":{ "$type": "number", "$value": "1.05" },
8
- "text-data-hero": { "$type": "dimension", "$value": "34px" },
8
+ "text-data-hero": { "$type": "dimension", "$value": "2.125rem" },
9
9
  "leading-data-hero": { "$type": "number", "$value": "1.1" },
10
- "text-h2": { "$type": "dimension", "$value": "24px" },
10
+ "text-h2": { "$type": "dimension", "$value": "1.5rem" },
11
11
  "leading-h2":{ "$type": "number", "$value": "1.15" },
12
- "text-h3": { "$type": "dimension", "$value": "15px" },
12
+ "text-h3": { "$type": "dimension", "$value": "0.9375rem" },
13
13
  "leading-h3":{ "$type": "number", "$value": "1.3" },
14
- "text-body": { "$type": "dimension", "$value": "14px" },
14
+ "text-body": { "$type": "dimension", "$value": "0.875rem" },
15
15
  "leading-body":{ "$type": "number", "$value": "1.5" },
16
- "text-meta": { "$type": "dimension", "$value": "12.5px" },
16
+ "text-meta": { "$type": "dimension", "$value": "0.78125rem" },
17
17
  "leading-meta":{ "$type": "number", "$value": "1.4" },
18
- "text-eyebrow": { "$type": "dimension", "$value": "11px" },
18
+ "text-eyebrow": { "$type": "dimension", "$value": "0.6875rem" },
19
19
  "leading-eyebrow":{ "$type": "number", "$value": "1.2" },
20
20
 
21
21
  "tracking-tight": { "$type": "dimension", "$value": "-0.02em" },
@@ -16,6 +16,7 @@
16
16
  "accent": { "$type": "color", "$value": "var(--uix-brand,#2563EB)" },
17
17
  "accent-hover": { "$type": "color", "$value": "color-mix(in srgb, var(--uix-accent) 82%, #FFFFFF)", "$description": "On dark, primary-button hover LIGHTENS the accent (the light-theme value darkens). Tracks the live brand override." },
18
18
  "link": { "$type": "color", "$value": "color-mix(in srgb, var(--uix-brand,#5B8DEF) 70%, #FFFFFF)", "$description": "Brightened on dark so links read clearly as links and stay distinct from the solid accent button background." },
19
+ "accent-text": { "$type": "color", "$value": "color-mix(in srgb, var(--uix-accent) 70%, #FFFFFF)", "$description": "On dark, accent-hued text LIGHTENS the accent (the light-theme value darkens): the solid dark accent measured 3.2:1 on its own 16% tint. Same 70% weight as --uix-link." },
19
20
  "ring": { "$type": "color", "$value": "var(--uix-brand,#3080FF)" },
20
21
  "brand-muted": { "$type": "color", "$value": "color-mix(in srgb, var(--uix-accent) 16%, transparent)" },
21
22