@tensor_1/tokens 2.49.0 → 2.51.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.
@@ -147,6 +147,7 @@
147
147
  --uix-radius-pill: 999px;
148
148
  --uix-row-h: 56px;
149
149
  --uix-row-h-compact: 44px;
150
+ --uix-row-h-standard: 56px;
150
151
  --uix-row-h-comfortable: 68px;
151
152
  --uix-control-h: 36px;
152
153
  --uix-sidebar-w: 248px;
@@ -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" | "success-text" | "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" | "neutral-solid" | "neutral-text" | "neutral-bg" | "neutral-border" | "chart-1" | "chart-2" | "chart-3" | "chart-4" | "chart-5" | "chart-6" | "chart-7" | "chart-8" | "chart-neutral" | "chart-grid" | "chart-axis" | "chart-reference" | "chart-zone-warning" | "chart-zone-danger" | "chart-forecast-band" | "chart-event" | "chart-partial" | "chart-comparison" | "row" | "row-alt" | "row-pinned-bg" | "row-selected-bg" | "scrollbar-thumb" | "scrollbar-thumb-hover" | "scrollbar-track" | "scrim" | "scrim-strong" | "print-ink" | "print-ink-quiet" | "print-paper" | "print-paper-quiet" | "print-line" | "print-danger" | "shadow-sm" | "shadow-md" | "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" | "dur-exit-fast" | "dur-exit" | "dur-exit-slow" | "dur-highlight" | "dur-change" | "delay-pending" | "hold-pending" | "hold-result" | "delay-tooltip" | "delay-tooltip-skip" | "loop-spin" | "loop-progress" | "loop-shimmer" | "loop-ping" | "loop-blink" | "loop-pulse" | "lift" | "z-raised" | "z-sticky" | "z-dropdown" | "z-overlay" | "z-tooltip" | "z-toast" | "radius-xs" | "radius-sm" | "radius-md" | "radius-lg" | "radius-xl" | "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" | "success-text" | "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" | "neutral-solid" | "neutral-text" | "neutral-bg" | "neutral-border" | "chart-1" | "chart-2" | "chart-3" | "chart-4" | "chart-5" | "chart-6" | "chart-7" | "chart-8" | "chart-neutral" | "chart-grid" | "chart-axis" | "chart-reference" | "chart-zone-warning" | "chart-zone-danger" | "chart-forecast-band" | "chart-event" | "chart-partial" | "chart-comparison" | "row" | "row-alt" | "row-pinned-bg" | "row-selected-bg" | "scrollbar-thumb" | "scrollbar-thumb-hover" | "scrollbar-track" | "scrim" | "scrim-strong" | "print-ink" | "print-ink-quiet" | "print-paper" | "print-paper-quiet" | "print-line" | "print-danger" | "shadow-sm" | "shadow-md" | "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" | "dur-exit-fast" | "dur-exit" | "dur-exit-slow" | "dur-highlight" | "dur-change" | "delay-pending" | "hold-pending" | "hold-result" | "delay-tooltip" | "delay-tooltip-skip" | "loop-spin" | "loop-progress" | "loop-shimmer" | "loop-ping" | "loop-blink" | "loop-pulse" | "lift" | "z-raised" | "z-sticky" | "z-dropdown" | "z-overlay" | "z-tooltip" | "z-toast" | "radius-xs" | "radius-sm" | "radius-md" | "radius-lg" | "radius-xl" | "radius-pill" | "row-h" | "row-h-compact" | "row-h-standard" | "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>>;
@@ -148,6 +148,7 @@ export const cssVar = {
148
148
  "radius-pill": "var(--uix-radius-pill)",
149
149
  "row-h": "var(--uix-row-h)",
150
150
  "row-h-compact": "var(--uix-row-h-compact)",
151
+ "row-h-standard": "var(--uix-row-h-standard)",
151
152
  "row-h-comfortable": "var(--uix-row-h-comfortable)",
152
153
  "control-h": "var(--uix-control-h)",
153
154
  "sidebar-w": "var(--uix-sidebar-w)",
@@ -343,6 +344,7 @@ export const light = {
343
344
  "radius-pill": "999px",
344
345
  "row-h": "56px",
345
346
  "row-h-compact": "44px",
347
+ "row-h-standard": "56px",
346
348
  "row-h-comfortable": "68px",
347
349
  "control-h": "36px",
348
350
  "sidebar-w": "248px",
@@ -487,6 +489,7 @@ export const num = {
487
489
  "radius-pill": 999,
488
490
  "row-h": 56,
489
491
  "row-h-compact": 44,
492
+ "row-h-standard": 56,
490
493
  "row-h-comfortable": 68,
491
494
  "control-h": 36,
492
495
  "sidebar-w": 248,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tensor_1/tokens",
3
- "version": "2.49.0",
3
+ "version": "2.51.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": [
@@ -37,4 +37,114 @@
37
37
  }
38
38
  /* a phone: the search takes its own row */
39
39
  @media (max-width: 40rem) { .uix-data-workspace__search { flex: 1 1 100%; } }
40
+
41
+ /* ── 2.50: adoption gaps (HAR-2622..2626, ADR-0005 addendum) ─────────────────────────── */
42
+ /* the product's notices between the toolbar (and bulk bar) and the rows */
43
+ .uix-data-workspace__before { display: grid; gap: var(--uix-space-2); min-width: 0; }
44
+ /* a note above the saved-view list ("Saved views could not be loaded") */
45
+ .uix-data-workspace__views-note {
46
+ max-inline-size: 20rem; padding: var(--uix-space-2) var(--uix-space-3); border-bottom: 1px solid var(--uix-border);
47
+ color: var(--uix-text-muted); font-size: var(--uix-text-meta);
48
+ }
49
+ /* "Nothing matches" with the product's action beside Clear filters */
50
+ .uix-data-workspace__state-actions { display: flex; flex-wrap: wrap; justify-content: center; gap: var(--uix-space-2); }
51
+
52
+ /* the rich record-id cell: a strong line over a muted one, inside the same button or link */
53
+ .uix-data-workspace__id { max-inline-size: 100%; }
54
+ .uix-data-workspace__id-text { display: inline-flex; flex-direction: column; align-items: flex-start; min-inline-size: 0; text-align: start; }
55
+ .uix-data-workspace__id-text > * { max-inline-size: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
56
+ .uix-data-workspace__id-link { color: var(--uix-text); text-decoration: none; }
57
+ /* in a fixed layout the id column has a width: a long id ends in an ellipsis there, not drawn
58
+ over the next column (an auto layout grows the column instead) */
59
+ .uix-data-workspace .uix-table--fixed td.uix-id-cell { overflow: hidden; }
60
+ .uix-data-workspace__id .uix-id-cell__btn { min-inline-size: 0; max-inline-size: 100%; }
61
+ .uix-data-workspace__id-label { min-inline-size: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
62
+
63
+ /* row groups: each group is a tbody under its header row. The zebra restarts under every header
64
+ with a plain row: the group swaps the two row colours its rows read (no selector here outranks
65
+ a row state; table.css keeps their order). */
66
+ .uix-data-workspace__grid--grouped { --uix-dw-row: var(--uix-row); --uix-dw-row-alt: var(--uix-row-alt); }
67
+ .uix-data-workspace__grid--grouped .uix-data-workspace__group { --uix-row: var(--uix-dw-row-alt); --uix-row-alt: var(--uix-dw-row); }
68
+ .uix-table tbody tr:where(.uix-data-workspace__group-head) { --uix-row-bg: var(--uix-bg-subtle); }
69
+ .uix-data-workspace__group-head > :is(th, td) {
70
+ height: auto; padding-block: var(--uix-space-2); border-bottom: 1px solid var(--uix-border);
71
+ background: linear-gradient(var(--uix-row-bg), var(--uix-row-bg)), var(--uix-surface);
72
+ }
73
+ /* a group header is as tall as its content at every density: the density heights on the table
74
+ (0,3,1) outrank the rule above, so this one names the header row at a higher weight */
75
+ .uix-data-workspace .uix-table tbody tr.uix-data-workspace__group-head > :is(th, td) { height: auto; }
76
+ .uix-data-workspace__group-label { font-weight: 400; text-align: start; }
77
+ /* the label spans several columns: its words stay in view while the table scrolls sideways,
78
+ the cell itself does not stick (it would slide over the aggregates) */
79
+ .uix-data-workspace .uix-data-workspace__group-head > th { position: static; box-shadow: none; }
80
+ .uix-data-workspace__group-title {
81
+ position: sticky; inset-inline-start: var(--uix-space-4); display: inline-flex; flex-wrap: wrap; align-items: center;
82
+ gap: var(--uix-space-1) var(--uix-space-2); max-inline-size: 100%;
83
+ }
84
+ .uix-data-workspace__grid--pin-id .uix-data-workspace__group-title { inset-inline-start: calc(var(--uix-selcol-w) + var(--uix-space-4)); }
85
+ .uix-data-workspace__group-toggle {
86
+ display: inline-grid; place-items: center; width: 24px; height: 24px; flex: none; padding: 0; border: 0;
87
+ border-radius: var(--uix-radius-xs); background: transparent; color: var(--uix-text-muted); cursor: pointer;
88
+ }
89
+ .uix-data-workspace__group-toggle svg { width: 16px; height: 16px; transition: transform var(--uix-dur-fast) var(--uix-ease-out); }
90
+ .uix-data-workspace__group-toggle[aria-expanded="true"] svg { transform: rotate(90deg); }
91
+ .uix-data-workspace__group-toggle:focus-visible { outline: 2px solid var(--uix-ring); outline-offset: 1px; }
92
+ @media (hover: hover) and (pointer: fine) { .uix-data-workspace__group-toggle:hover { background: var(--uix-bg-active); color: var(--uix-text); } }
93
+ .uix-data-workspace__group-name { font-weight: 600; color: var(--uix-text); }
94
+ .uix-data-workspace__group-count, .uix-data-workspace__group-agg { color: var(--uix-text-muted); font-size: var(--uix-text-meta); font-variant-numeric: tabular-nums; }
95
+ @media (prefers-reduced-motion: reduce) { .uix-data-workspace__group-toggle svg { transition: none; } }
96
+
97
+ /* the keyboard row model: one row in the tab order; its ring sits inside the row, so moving
98
+ focus never shifts the layout and the wrap's edge never clips it */
99
+ /* a row a click activates (onRowActivate) */
100
+ .uix-data-workspace__grid--click tbody tr[data-uix-row-id] { cursor: pointer; }
101
+ /* The frozen cells paint over a row's outline, so every cell draws its edge of the ring too
102
+ (forced colours drop box-shadow and keep the outline). A card has no frozen cells: its outline is enough. */
103
+ .uix-data-workspace__grid--rows tbody tr:focus-visible { outline: 2px solid var(--uix-ring); outline-offset: -2px; }
104
+ .uix-data-workspace__table .uix-data-workspace__grid--rows:not(.uix-table--cards) tbody tr[data-uix-row-id]:focus-visible > td { box-shadow: inset 0 2px 0 var(--uix-ring), inset 0 -1px 0 var(--uix-ring); border-bottom-color: var(--uix-ring); }
105
+ .uix-data-workspace__table .uix-data-workspace__grid--rows:not(.uix-table--cards) tbody tr[data-uix-row-id]:focus-visible > td:first-child { box-shadow: inset 2px 0 0 var(--uix-ring), inset 0 2px 0 var(--uix-ring), inset 0 -1px 0 var(--uix-ring); border-bottom-color: var(--uix-ring); }
106
+ .uix-data-workspace__table .uix-data-workspace__grid--rows:not(.uix-table--cards) tbody tr[data-uix-row-id]:focus-visible > td:last-child { box-shadow: inset -2px 0 0 var(--uix-ring), inset 0 2px 0 var(--uix-ring), inset 0 -1px 0 var(--uix-ring); border-bottom-color: var(--uix-ring); }
107
+ /* windowing: the rows outside the window are two plain spacers */
108
+ .uix-table tbody tr:where(.uix-data-workspace__spacer) { --uix-row-bg: transparent; }
109
+ .uix-data-workspace__spacer > td { padding: 0; border: 0; }
110
+
111
+ /* cards (mobile="cards", under 768 px of workspace): the wrap drops its frame and each row is a
112
+ card, a grid in flow. Its first line is the checkbox and the id; every value spans the card
113
+ below, labelled; the row's actions close the card, always shown (a card has no hover to
114
+ reveal them), so word actions ("Renew · Return") never run over a long title. */
115
+ .uix-data-workspace__table--cards { border: 0; border-radius: 0; background: none; }
116
+ .uix-data-workspace .uix-table--cards tbody tr:not(.uix-data-workspace__group-head) {
117
+ display: grid; grid-template-columns: auto minmax(0, 1fr); align-items: stretch;
118
+ }
119
+ .uix-data-workspace .uix-table--cards tbody tr:not(.uix-data-workspace__group-head) > td { grid-column: 1 / -1; }
120
+ .uix-data-workspace .uix-table--cards tbody tr:not(.uix-data-workspace__group-head) > td:is([data-col="select"], [data-col="id"]) {
121
+ grid-row: 1; padding: var(--uix-space-2) 0 var(--uix-space-3); border-bottom: 1px solid var(--uix-border);
122
+ }
123
+ /* placed with the same selector as the span-all rule above, so they outrank it */
124
+ .uix-data-workspace .uix-table--cards tbody tr:not(.uix-data-workspace__group-head) > td[data-col="select"] { display: block; grid-column: 1; width: auto; }
125
+ /* no column gap: the line under the first line runs unbroken under the checkbox and the id */
126
+ .uix-data-workspace .uix-table--cards tbody tr:not(.uix-data-workspace__group-head) > td[data-col="id"] { grid-column: 2 / -1; padding-inline-start: var(--uix-space-3); }
127
+ .uix-data-workspace .uix-table--cards tbody tr:not(.uix-data-workspace__group-head):not(:has(> td[data-col="select"])) > td[data-col="id"] { grid-column: 1 / -1; padding-inline-start: 0; }
128
+ .uix-data-workspace .uix-table--cards tbody tr:not(.uix-data-workspace__group-head) > td[data-col="actions"] {
129
+ display: flex; flex-wrap: wrap; justify-content: flex-end; align-items: center; gap: var(--uix-space-1) var(--uix-space-2);
130
+ grid-column: 1 / -1; width: auto; min-inline-size: 0; padding: var(--uix-space-2) 0;
131
+ }
132
+ .uix-data-workspace .uix-table--cards td[data-col="select"]::before, .uix-data-workspace .uix-table--cards td[data-col="actions"]::before { content: none; }
133
+ .uix-data-workspace .uix-table--cards td[data-col="actions"] .uix-rowact { opacity: 1; }
134
+ /* the id's words wrap in a card rather than run under the actions */
135
+ .uix-data-workspace .uix-table--cards .uix-data-workspace__id, .uix-data-workspace .uix-table--cards .uix-id-cell__btn { white-space: normal; text-align: start; }
136
+ .uix-data-workspace .uix-table--cards .uix-data-workspace__id-text > *, .uix-data-workspace .uix-table--cards .uix-data-workspace__id-label { white-space: normal; overflow-wrap: anywhere; }
137
+ /* a group's header in cards: one line above its cards (checkbox, toggle, name, count, then the aggregates) */
138
+ .uix-data-workspace .uix-table--cards tbody tr.uix-data-workspace__group-head {
139
+ display: flex; flex-wrap: wrap; align-items: center; gap: var(--uix-space-1) var(--uix-space-3);
140
+ margin: var(--uix-space-5) 0 var(--uix-space-2); padding: 0; border: 0; box-shadow: none; background: none;
141
+ }
142
+ .uix-data-workspace .uix-table--cards tbody:first-of-type tr.uix-data-workspace__group-head { margin-block-start: 0; }
143
+ .uix-data-workspace .uix-table--cards .uix-data-workspace__group-head > :is(th, td) {
144
+ display: flex; align-items: center; gap: var(--uix-space-2); position: static; width: auto; height: auto;
145
+ padding: 0; border: 0; background: none; text-align: start;
146
+ }
147
+ .uix-data-workspace .uix-table--cards .uix-data-workspace__group-label { flex: 1 1 auto; }
148
+ .uix-data-workspace .uix-table--cards .uix-data-workspace__group-title { position: static; }
149
+ .uix-data-workspace .uix-table--cards .uix-data-workspace__group-agg:empty { display: none; }
40
150
  }
@@ -48,6 +48,8 @@
48
48
  font-size: 10pt;
49
49
  line-height: 1.45;
50
50
  --uix-row-h: var(--uix-row-h-compact);
51
+ /* the paper's rows are compact, also in a table that names standard (HAR-2631) */
52
+ --uix-row-h-standard: var(--uix-row-h-compact);
51
53
  background: var(--uix-print-paper);
52
54
  color: var(--uix-print-ink);
53
55
  box-shadow: var(--uix-shadow-md);
@@ -5,7 +5,11 @@
5
5
  /* TENSOR RX-125 (UIX-07): no height cap by default — a nested scroller hid rows
6
6
  below 460px on every table. Opt in with .uix-table-wrap--scroll or set
7
7
  --uix-table-max-height. */
8
- .uix-table-wrap { overflow: auto; border: 1px solid var(--uix-border); border-radius: var(--uix-radius-lg); background: var(--uix-surface); }
8
+ /* position: relative (HAR-2632): the wrap is the frame for anything absolute in a cell (a
9
+ visually hidden label), which otherwise sat at its place in the scrolled table, outside the
10
+ wrap, and widened the page (TENSOR: 1377 px of content in a 1032 px main). Sticky headers and
11
+ frozen cells, the sticky busy bar and the top-layer menus and popovers do not depend on it. */
12
+ .uix-table-wrap { position: relative; overflow: auto; border: 1px solid var(--uix-border); border-radius: var(--uix-radius-lg); background: var(--uix-surface); }
9
13
  .uix-table-wrap--scroll { max-height: var(--uix-table-max-height, 460px); }
10
14
  .uix-table { width: 100%; border-collapse: separate; border-spacing: 0; font-size: var(--uix-text-body); }
11
15
 
@@ -27,6 +31,10 @@
27
31
  /* multi-column sort ordinal (⇧+click adds a secondary key) */
28
32
  .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); }
29
33
 
34
+ /* With Th sortOrderLabel the ordinal is said in words inside the button (2.50, HAR-2623), so the
35
+ drawn number gets empty alt text; an engine without the alt syntax keeps the rule above. */
36
+ .uix-table th[data-sort-order][data-sort-labelled]::before { content: attr(data-sort-order) / ""; }
37
+
30
38
  /* sortable header's real <button> (UIX-A11Y-2): visually indistinguishable from the old
31
39
  plain-text th — inherited font/colour, no chrome — with an inset overlay so the whole
32
40
  cell stays the click target (the sticky th is its containing block). The sort arrow and
@@ -49,13 +57,24 @@
49
57
  .uix-table--no-zebra tbody tr:where(:nth-child(even)) { --uix-row-bg: var(--uix-row); }
50
58
  .uix-table tbody tr:where([data-pinned]) { --uix-row-bg: var(--uix-row-pinned-bg); }
51
59
  .uix-table tbody tr:where([data-selected]) { --uix-row-bg: var(--uix-row-selected-bg); }
60
+ /* Muted text in a selected row reads on the selection tint at AA (HAR-2635: 4.36:1 before). It is
61
+ derived, not a fixed colour: the table keeps the muted colour of its scope (a theme, more
62
+ contrast, print), and a selected row moves it 30 % toward that scope's text, so any scope that
63
+ sets --uix-text-muted gets a darker (light) or lighter (dark) muted on its selection, never a
64
+ weaker one. */
65
+ .uix-table { --uix-table-muted: var(--uix-text-muted); }
66
+ .uix-table tbody tr:where([data-selected], [aria-selected="true"]) { --uix-text-muted: color-mix(in srgb, var(--uix-table-muted) 70%, var(--uix-text)); }
52
67
  @media (hover: hover) { .uix-table tbody tr:where(:hover) { --uix-row-bg: var(--uix-bg-hover); } }
53
68
  /* Row links stay calm on hover/focus: the row tint is the affordance, so neither the base
54
69
  layer's `a:hover` underline nor link.css reaches them. `:not(.uix-btn)` keeps buttons
55
70
  styled; the global :focus-visible ring still marks keyboard focus. */
56
71
  .uix-table tbody a:not(.uix-btn):is(:hover, :focus-visible) { color: var(--uix-text); text-decoration: none; }
57
- .uix-table[data-density="compact"] td, .uix-table--compact td { height: var(--uix-row-h-compact); }
58
- .uix-table[data-density="comfortable"] td { height: var(--uix-row-h-comfortable); }
72
+ /* not in cards: a card's cells are as tall as their content (HAR-2631 item 3, the density rules
73
+ outranked the cards reset and a two-line id ran over the card's top border) */
74
+ .uix-table:not(.uix-table--cards)[data-density="compact"] td, .uix-table--compact:not(.uix-table--cards) td { height: var(--uix-row-h-compact); }
75
+ .uix-table:not(.uix-table--cards)[data-density="comfortable"] td { height: var(--uix-row-h-comfortable); }
76
+ /* a table that asks for standard keeps it under a page-wide --uix-row-h re-point (HAR-2631) */
77
+ .uix-table:not(.uix-table--cards)[data-density="standard"] td { height: var(--uix-row-h-standard); }
59
78
 
60
79
  .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); transition: opacity var(--uix-dur-fast) var(--uix-ease-out); }
61
80
  /* Hidden until hover only where hover exists; a touch screen always shows the pin. The
@@ -8,6 +8,7 @@
8
8
 
9
9
  "row-h": { "$type": "dimension", "$value": "56px" },
10
10
  "row-h-compact": { "$type": "dimension", "$value": "44px" },
11
+ "row-h-standard": { "$type": "dimension", "$value": "56px", "$description": "The standard row height, held by a table that asks for it (Table density=\"standard\", HAR-2631): a page-wide re-point of --uix-row-h (a density or spacing preference) does not reach it. A table that names no density follows --uix-row-h." },
11
12
  "row-h-comfortable": { "$type": "dimension", "$value": "68px" },
12
13
  "control-h": { "$type": "dimension", "$value": "36px" },
13
14
  "sidebar-w": { "$type": "dimension", "$value": "248px" },