@tensor_1/tokens 2.16.0 → 2.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/css/components.css +1 -1
- package/build/css/styles.css +1 -1
- package/build/css/tokens.css +7 -7
- package/build/ts/tokens.js +7 -14
- package/package.json +1 -1
- package/styles/components/app-shell.css +23 -1
- package/styles/components/checkbox.css +2 -1
- package/styles/components/command-palette.css +3 -0
- package/styles/components/form.css +5 -0
- package/styles/components/inbox.css +10 -1
- package/styles/components/link.css +4 -2
- package/styles/components/modal.css +3 -1
- package/styles/components/peek.css +7 -1
- package/styles/components/relationship-graph.css +34 -0
- package/styles/components/segmented.css +1 -1
- package/styles/components/sidebar.css +19 -4
- package/styles/components/stat-tile.css +2 -0
- package/styles/components/table.css +23 -6
- package/styles/components/tag-input.css +3 -1
- package/styles/components/timeline.css +2 -1
- package/styles/components/tooltip.css +2 -1
- package/tokens/base/typography.json +7 -7
package/build/css/tokens.css
CHANGED
|
@@ -139,19 +139,19 @@
|
|
|
139
139
|
--uix-font-sans: "Inter",system-ui,sans-serif;
|
|
140
140
|
--uix-font-heading: "IBM Plex Sans","Inter",system-ui,sans-serif;
|
|
141
141
|
--uix-font-mono: "IBM Plex Mono",ui-monospace,monospace;
|
|
142
|
-
--uix-text-display:
|
|
142
|
+
--uix-text-display: 2.5rem;
|
|
143
143
|
--uix-leading-display: 1.05;
|
|
144
|
-
--uix-text-data-hero:
|
|
144
|
+
--uix-text-data-hero: 2.125rem;
|
|
145
145
|
--uix-leading-data-hero: 1.1;
|
|
146
|
-
--uix-text-h2:
|
|
146
|
+
--uix-text-h2: 1.5rem;
|
|
147
147
|
--uix-leading-h2: 1.15;
|
|
148
|
-
--uix-text-h3:
|
|
148
|
+
--uix-text-h3: 0.9375rem;
|
|
149
149
|
--uix-leading-h3: 1.3;
|
|
150
|
-
--uix-text-body:
|
|
150
|
+
--uix-text-body: 0.875rem;
|
|
151
151
|
--uix-leading-body: 1.5;
|
|
152
|
-
--uix-text-meta:
|
|
152
|
+
--uix-text-meta: 0.78125rem;
|
|
153
153
|
--uix-leading-meta: 1.4;
|
|
154
|
-
--uix-text-eyebrow:
|
|
154
|
+
--uix-text-eyebrow: 0.6875rem;
|
|
155
155
|
--uix-leading-eyebrow: 1.2;
|
|
156
156
|
--uix-tracking-tight: -0.02em;
|
|
157
157
|
--uix-tracking-eyebrow: 0.06em;
|
package/build/ts/tokens.js
CHANGED
|
@@ -295,19 +295,19 @@ export const light = {
|
|
|
295
295
|
"font-sans": "\"Inter\",system-ui,sans-serif",
|
|
296
296
|
"font-heading": "\"IBM Plex Sans\",\"Inter\",system-ui,sans-serif",
|
|
297
297
|
"font-mono": "\"IBM Plex Mono\",ui-monospace,monospace",
|
|
298
|
-
"text-display": "
|
|
298
|
+
"text-display": "2.5rem",
|
|
299
299
|
"leading-display": "1.05",
|
|
300
|
-
"text-data-hero": "
|
|
300
|
+
"text-data-hero": "2.125rem",
|
|
301
301
|
"leading-data-hero": "1.1",
|
|
302
|
-
"text-h2": "
|
|
302
|
+
"text-h2": "1.5rem",
|
|
303
303
|
"leading-h2": "1.15",
|
|
304
|
-
"text-h3": "
|
|
304
|
+
"text-h3": "0.9375rem",
|
|
305
305
|
"leading-h3": "1.3",
|
|
306
|
-
"text-body": "
|
|
306
|
+
"text-body": "0.875rem",
|
|
307
307
|
"leading-body": "1.5",
|
|
308
|
-
"text-meta": "
|
|
308
|
+
"text-meta": "0.78125rem",
|
|
309
309
|
"leading-meta": "1.4",
|
|
310
|
-
"text-eyebrow": "
|
|
310
|
+
"text-eyebrow": "0.6875rem",
|
|
311
311
|
"leading-eyebrow": "1.2",
|
|
312
312
|
"tracking-tight": "-0.02em",
|
|
313
313
|
"tracking-eyebrow": "0.06em",
|
|
@@ -417,11 +417,4 @@ export const num = {
|
|
|
417
417
|
"space-10": 64,
|
|
418
418
|
"space-11": 80,
|
|
419
419
|
"space-12": 96,
|
|
420
|
-
"text-display": 40,
|
|
421
|
-
"text-data-hero": 34,
|
|
422
|
-
"text-h2": 24,
|
|
423
|
-
"text-h3": 15,
|
|
424
|
-
"text-body": 14,
|
|
425
|
-
"text-meta": 12.5,
|
|
426
|
-
"text-eyebrow": 11,
|
|
427
420
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tensor_1/tokens",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.18.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
|
|
@@ -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
|
|
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); }
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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); }
|
|
@@ -18,4 +18,38 @@
|
|
|
18
18
|
.uix-relationship-graph--compact .uix-relationship-graph__visual,.uix-relationship-graph--compact .uix-relationship-graph__visual svg { min-height:16rem; height:16rem; }
|
|
19
19
|
.uix-relationship-graph--state { padding:var(--uix-space-8); border:1px dashed var(--uix-border-strong); border-radius:var(--uix-radius-lg); }
|
|
20
20
|
@media (max-width:640px) { .uix-relationship-graph__list li { display:grid; } }
|
|
21
|
+
|
|
22
|
+
/* Layered mode (ADR-0002): HTML node buttons over an SVG edge layer, one transformed stage. */
|
|
23
|
+
.uix-relationship-graph--layered .uix-relationship-graph__toolbar button:disabled { opacity:.5; cursor:not-allowed; }
|
|
24
|
+
.uix-relationship-graph__viewport { position:relative; height:var(--uix-relationship-graph-height, 22rem); overflow:hidden; border:1px solid var(--uix-border); border-radius:var(--uix-radius-lg); background:var(--uix-bg-subtle); cursor:grab; touch-action:pan-y; }
|
|
25
|
+
.uix-relationship-graph__viewport:active { cursor:grabbing; }
|
|
26
|
+
.uix-relationship-graph__stage { position:absolute; top:0; left:0; transform-origin:0 0; }
|
|
27
|
+
.uix-relationship-graph__stage[data-animate] { transition:transform var(--uix-dur) var(--uix-ease-out); }
|
|
28
|
+
.uix-relationship-graph__edges { position:absolute; top:0; left:0; overflow:visible; pointer-events:none; }
|
|
29
|
+
.uix-relationship-graph__link path { fill:none; stroke:color-mix(in srgb, var(--uix-text) 28%, transparent); stroke-width:1.5px; }
|
|
30
|
+
.uix-relationship-graph__link polygon { fill:color-mix(in srgb, var(--uix-text) 45%, transparent); }
|
|
31
|
+
.uix-relationship-graph__link text { fill:var(--uix-text-muted); font-family:var(--uix-font-sans); font-size:var(--uix-text-eyebrow); paint-order:stroke; stroke:var(--uix-bg-subtle); stroke-width:4px; stroke-linejoin:round; }
|
|
32
|
+
.uix-relationship-graph__link[data-kind="lateral"] path, .uix-relationship-graph__link[data-kind="cycle"] path { stroke-dasharray:5 4; }
|
|
33
|
+
.uix-relationship-graph__link[data-emphasis] path { stroke:color-mix(in srgb, var(--uix-text) 55%, transparent); }
|
|
34
|
+
.uix-relationship-graph__link[data-active] path { stroke:var(--uix-accent); stroke-width:2.5px; }
|
|
35
|
+
.uix-relationship-graph__link[data-active] polygon { fill:var(--uix-accent); }
|
|
36
|
+
.uix-relationship-graph__link[data-active] text { fill:var(--uix-text); }
|
|
37
|
+
.uix-relationship-graph__link[data-conflicted] path { stroke:var(--uix-danger); }
|
|
38
|
+
.uix-relationship-graph__link[data-dimmed] { opacity:.35; }
|
|
39
|
+
.uix-relationship-graph__column { position:absolute; top:var(--uix-space-4); overflow:hidden; color:var(--uix-text-muted); font-size:var(--uix-text-meta); white-space:nowrap; text-overflow:ellipsis; text-transform:uppercase; letter-spacing:.04em; pointer-events:none; }
|
|
40
|
+
.uix-relationship-graph__item { position:absolute; display:flex; flex-direction:column; justify-content:center; gap:var(--uix-space-1); padding:var(--uix-space-2) var(--uix-space-3); border:1px solid var(--uix-border-strong); border-radius:var(--uix-radius-md); background:var(--uix-surface); color:var(--uix-text); font:inherit; text-align:left; cursor:pointer; transition:border-color var(--uix-dur-fast) var(--uix-ease-out), opacity var(--uix-dur-fast) var(--uix-ease-out); }
|
|
41
|
+
.uix-relationship-graph__item:hover { border-color:var(--uix-accent); }
|
|
42
|
+
.uix-relationship-graph__item:focus-visible { outline:2px solid var(--uix-ring); outline-offset:2px; }
|
|
43
|
+
.uix-relationship-graph__item[data-root] { border-width:2px; }
|
|
44
|
+
.uix-relationship-graph__item[data-selected], .uix-relationship-graph__item[data-highlighted] { border-color:var(--uix-accent); background:color-mix(in srgb, var(--uix-accent) 8%, var(--uix-surface)); }
|
|
45
|
+
.uix-relationship-graph__item[data-conflicted] { border-color:var(--uix-danger); border-style:dashed; }
|
|
46
|
+
.uix-relationship-graph__item[data-dimmed] { opacity:.45; }
|
|
47
|
+
.uix-relationship-graph__item[data-kind="cluster"] { border-style:dashed; background:var(--uix-surface-2); }
|
|
48
|
+
.uix-relationship-graph__item-label { min-width:0; display:-webkit-box; overflow:hidden; -webkit-box-orient:vertical; -webkit-line-clamp:2; overflow-wrap:anywhere; font-size:var(--uix-text-body); line-height:1.25; }
|
|
49
|
+
.uix-relationship-graph__item-meta { min-width:0; overflow:hidden; color:var(--uix-text-muted); font-size:var(--uix-text-meta); white-space:nowrap; text-overflow:ellipsis; }
|
|
50
|
+
.uix-relationship-graph__item-flag { position:absolute; top:-9px; right:var(--uix-space-2); padding:0 var(--uix-space-1); border:1px solid var(--uix-border); border-radius:var(--uix-radius-pill); background:var(--uix-surface); color:var(--uix-text-muted); font-size:var(--uix-text-meta); line-height:1.4; }
|
|
51
|
+
.uix-relationship-graph__collapse { position:absolute; height:22px; padding:0 var(--uix-space-2); border:1px dashed var(--uix-border-strong); border-radius:var(--uix-radius-pill); background:var(--uix-surface); color:var(--uix-text-muted); font-size:var(--uix-text-meta); cursor:pointer; }
|
|
52
|
+
.uix-relationship-graph__collapse:focus-visible { outline:2px solid var(--uix-ring); outline-offset:2px; }
|
|
53
|
+
.uix-relationship-graph--compact .uix-relationship-graph__item { padding:var(--uix-space-1) var(--uix-space-2); }
|
|
54
|
+
@media (forced-colors: active) { .uix-relationship-graph__link path { stroke:CanvasText; } .uix-relationship-graph__link polygon { fill:CanvasText; } .uix-relationship-graph__item { border-color:ButtonText; } }
|
|
21
55
|
}
|
|
@@ -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-
|
|
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
|
}
|
|
@@ -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
|
-
|
|
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
|
}
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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[
|
|
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[
|
|
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
|
-
|
|
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
|
-
|
|
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; }
|
|
@@ -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": "
|
|
6
|
+
"text-display": { "$type": "dimension", "$value": "2.5rem" },
|
|
7
7
|
"leading-display":{ "$type": "number", "$value": "1.05" },
|
|
8
|
-
"text-data-hero": { "$type": "dimension", "$value": "
|
|
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": "
|
|
10
|
+
"text-h2": { "$type": "dimension", "$value": "1.5rem" },
|
|
11
11
|
"leading-h2":{ "$type": "number", "$value": "1.15" },
|
|
12
|
-
"text-h3": { "$type": "dimension", "$value": "
|
|
12
|
+
"text-h3": { "$type": "dimension", "$value": "0.9375rem" },
|
|
13
13
|
"leading-h3":{ "$type": "number", "$value": "1.3" },
|
|
14
|
-
"text-body": { "$type": "dimension", "$value": "
|
|
14
|
+
"text-body": { "$type": "dimension", "$value": "0.875rem" },
|
|
15
15
|
"leading-body":{ "$type": "number", "$value": "1.5" },
|
|
16
|
-
"text-meta": { "$type": "dimension", "$value": "
|
|
16
|
+
"text-meta": { "$type": "dimension", "$value": "0.78125rem" },
|
|
17
17
|
"leading-meta":{ "$type": "number", "$value": "1.4" },
|
|
18
|
-
"text-eyebrow": { "$type": "dimension", "$value": "
|
|
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" },
|