@tensor_1/tokens 2.9.0 → 2.10.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 +99 -17
- package/build/css/styles.css +144 -25
- package/build/css/tokens.css +7 -7
- package/build/ts/tokens.js +7 -14
- package/package.json +1 -1
- package/tokens/base/typography.json +7 -7
package/build/css/components.css
CHANGED
|
@@ -207,7 +207,8 @@
|
|
|
207
207
|
}
|
|
208
208
|
.uix-checkbox > input:checked + .uix-checkbox__box,
|
|
209
209
|
.uix-checkbox > input:indeterminate + .uix-checkbox__box { background: var(--uix-accent); border-color: var(--uix-accent); }
|
|
210
|
-
.uix-checkbox > input:checked + .uix-checkbox__box svg
|
|
210
|
+
.uix-checkbox > input:checked + .uix-checkbox__box svg,
|
|
211
|
+
.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) */
|
|
211
212
|
.uix-checkbox > input:focus-visible + .uix-checkbox__box { outline: 2px solid var(--uix-ring); outline-offset: 2px; }
|
|
212
213
|
.uix-checkbox > input:disabled ~ * { opacity: .5; }
|
|
213
214
|
}
|
|
@@ -259,7 +260,7 @@
|
|
|
259
260
|
transition: background-color var(--uix-dur-fast) var(--uix-ease-out), color var(--uix-dur-fast) var(--uix-ease-out);
|
|
260
261
|
}
|
|
261
262
|
.uix-segmented__option:hover { color: var(--uix-text); }
|
|
262
|
-
.uix-segmented__option[aria-
|
|
263
|
+
.uix-segmented__option[aria-pressed="true"] { background: var(--uix-surface); color: var(--uix-text); box-shadow: var(--uix-shadow-sm); }
|
|
263
264
|
.uix-segmented__option:focus-visible { outline: 2px solid var(--uix-ring); outline-offset: 1px; }
|
|
264
265
|
}
|
|
265
266
|
/* uix slider (native range, styled) — depends only on --uix-* tokens. */
|
|
@@ -333,7 +334,9 @@
|
|
|
333
334
|
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);
|
|
334
335
|
background: var(--uix-bg-active); color: var(--uix-text); font-size: var(--uix-text-meta);
|
|
335
336
|
}
|
|
336
|
-
.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); }
|
|
337
|
+
.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); }
|
|
338
|
+
/* Invisible overlay grows the 16px visual to a 24px hit target (UIX-A11Y-3). */
|
|
339
|
+
.uix-tag__remove::before { content: ""; position: absolute; inset: -4px; }
|
|
337
340
|
.uix-tag__remove:hover { background: var(--uix-bg-hover); color: var(--uix-text); }
|
|
338
341
|
.uix-tag__remove svg { width: 12px; height: 12px; }
|
|
339
342
|
}
|
|
@@ -342,6 +345,11 @@
|
|
|
342
345
|
.uix-form-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: var(--uix-space-5); }
|
|
343
346
|
.uix-fieldset { border: 1px solid var(--uix-border); border-radius: var(--uix-radius-lg); padding: var(--uix-space-6); }
|
|
344
347
|
.uix-fieldset > legend { padding: 0 var(--uix-space-2); font-size: var(--uix-text-meta); font-weight: 600; color: var(--uix-text); }
|
|
348
|
+
/* Labeled RadioGroup renders as a fieldset (UIX-A11Y-3): strip the UA chrome so it
|
|
349
|
+
looks identical to the plain-div group; the legend spaces itself (fieldset gap
|
|
350
|
+
doesn't reach a legend). */
|
|
351
|
+
fieldset.uix-radio-group { border: 0; margin: 0; padding: 0; min-inline-size: auto; }
|
|
352
|
+
.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); }
|
|
345
353
|
.uix-form-inline { display: flex; flex-wrap: wrap; align-items: flex-end; gap: var(--uix-space-4); }
|
|
346
354
|
.uix-validation-summary {
|
|
347
355
|
border: 1px solid var(--uix-danger); background: var(--uix-danger-bg); color: var(--uix-text);
|
|
@@ -362,7 +370,7 @@
|
|
|
362
370
|
border: 1px solid var(--uix-border); border-radius: var(--uix-radius-lg); overflow: hidden;
|
|
363
371
|
transition: grid-template-columns var(--uix-dur) var(--uix-ease-out), grid-template-rows var(--uix-dur) var(--uix-ease-out);
|
|
364
372
|
}
|
|
365
|
-
.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; }
|
|
373
|
+
.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); }
|
|
366
374
|
.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); }
|
|
367
375
|
.uix-shell__main { grid-column: 2; overflow: auto; padding: var(--uix-space-7); background: var(--uix-bg-app); }
|
|
368
376
|
|
|
@@ -371,17 +379,39 @@
|
|
|
371
379
|
only) → hidden (0). data-collapsed stays a back-compat alias for the rail. */
|
|
372
380
|
.uix-shell[data-nav="rail"], .uix-shell[data-collapsed] { grid-template-columns: var(--uix-sidebar-w-rail) 1fr; }
|
|
373
381
|
.uix-shell[data-nav="hidden"] { grid-template-columns: 0 1fr; }
|
|
382
|
+
/* the 0-width column still renders its links — visibility removes them from the tab
|
|
383
|
+
order / accessibility tree while keeping the width transition (UIX-A11Y-2) */
|
|
384
|
+
.uix-shell[data-nav="hidden"] .uix-shell__sidebar { visibility: hidden; }
|
|
374
385
|
|
|
375
386
|
/* ── focus / immersive mode ───────────────────────────────────────────────────
|
|
376
387
|
A table-scoped escape hatch: hide the sidebar AND the topbar so a dense grid
|
|
377
388
|
uses the whole frame. The app toggles [data-focus] (from a toolbar maximize
|
|
378
389
|
control) and restores the previous nav state + focus on Esc. */
|
|
379
390
|
.uix-shell[data-focus] { grid-template-columns: 0 1fr; grid-template-rows: 0 1fr; }
|
|
391
|
+
.uix-shell[data-focus] .uix-shell__sidebar { visibility: hidden; } /* see [data-nav="hidden"] above (UIX-A11Y-2) */
|
|
380
392
|
.uix-shell[data-focus] .uix-shell__topbar { display: none; }
|
|
381
393
|
|
|
382
394
|
/* a floating host for the "exit focus" affordance (Esc also exits) */
|
|
383
395
|
.uix-shell__focus-exit { position: absolute; top: var(--uix-space-3); right: var(--uix-space-3); z-index: var(--uix-z-overlay); }
|
|
384
396
|
|
|
397
|
+
/* ── skip link ────────────────────────────────────────────────────────────────
|
|
398
|
+
First tab stop in the shell (UIX-A11Y-2): visually hidden until keyboard focus,
|
|
399
|
+
then a small pill floating over the shell's top-left corner. */
|
|
400
|
+
.uix-skiplink {
|
|
401
|
+
position: absolute; top: var(--uix-space-3); left: var(--uix-space-3); z-index: var(--uix-z-overlay);
|
|
402
|
+
width: 1px; height: 1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap;
|
|
403
|
+
}
|
|
404
|
+
.uix-skiplink:focus-visible {
|
|
405
|
+
width: auto; height: auto; clip: auto;
|
|
406
|
+
display: inline-flex; align-items: center;
|
|
407
|
+
padding: var(--uix-space-2) var(--uix-space-4);
|
|
408
|
+
background: var(--uix-surface); color: var(--uix-text);
|
|
409
|
+
border: 1px solid var(--uix-border); border-radius: var(--uix-radius-pill);
|
|
410
|
+
box-shadow: var(--uix-shadow-popover);
|
|
411
|
+
outline: 2px solid var(--uix-ring); outline-offset: 2px;
|
|
412
|
+
font-size: var(--uix-text-meta); font-weight: 500; text-decoration: none;
|
|
413
|
+
}
|
|
414
|
+
|
|
385
415
|
/* ── full-bleed main ──────────────────────────────────────────────────────────
|
|
386
416
|
Opt-in per surface: a genuinely wide grid drops the content gutter and runs
|
|
387
417
|
edge to edge, reclaiming 2 x --uix-space-7. Not the default — most pages want
|
|
@@ -422,9 +452,14 @@
|
|
|
422
452
|
.uix-navitem__badge { font-size: var(--uix-text-meta); color: var(--uix-text-muted); }
|
|
423
453
|
/* on the active tint, muted badge dips below AA — hushed composites darker on the tint */
|
|
424
454
|
.uix-navitem[aria-current="page"] .uix-navitem__badge { color: var(--uix-text-hushed); }
|
|
425
|
-
.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); }
|
|
455
|
+
.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); }
|
|
456
|
+
/* invisible halo → 24px effective target with zero visual change (UIX-A11Y-2) */
|
|
457
|
+
.uix-navitem__star::before { content: ""; position: absolute; inset: -1px; }
|
|
426
458
|
.uix-navitem__star svg { width: 15px; height: 15px; }
|
|
427
|
-
|
|
459
|
+
/* keyboard reveal mirrors the hover reveal (UIX-A11Y-2) */
|
|
460
|
+
.uix-navitem:hover .uix-navitem__star,
|
|
461
|
+
.uix-navitem__star:focus-visible,
|
|
462
|
+
.uix-navitem:focus-within .uix-navitem__star { opacity: 1; }
|
|
428
463
|
.uix-navitem__star[data-on] { opacity: 1; color: var(--uix-warning); }
|
|
429
464
|
.uix-navitem__star[data-on] svg { fill: currentColor; }
|
|
430
465
|
|
|
@@ -435,19 +470,32 @@
|
|
|
435
470
|
.uix-navgroup__chevron { width: var(--uix-icon-sm); height: var(--uix-icon-sm); }
|
|
436
471
|
.uix-navgroup__panel { display: grid; grid-template-rows: 1fr; transition: grid-template-rows var(--uix-dur) var(--uix-ease-out); }
|
|
437
472
|
.uix-navgroup__trigger[aria-expanded="false"] + .uix-navgroup__panel { grid-template-rows: 0fr; }
|
|
438
|
-
|
|
473
|
+
/* visibility keeps the 0fr-collapsed links out of the tab order / accessibility tree
|
|
474
|
+
(UIX-A11Y-2); the transition delays hiding until the row collapse finishes, and
|
|
475
|
+
visibility snaps back to visible instantly on expand, so nothing visibly glitches. */
|
|
476
|
+
.uix-navgroup__panel > div { overflow: hidden; visibility: visible; transition: visibility var(--uix-dur) var(--uix-ease-out); }
|
|
477
|
+
.uix-navgroup__trigger[aria-expanded="false"] + .uix-navgroup__panel > div { visibility: hidden; }
|
|
439
478
|
.uix-subitem { padding-left: var(--uix-space-5); }
|
|
440
479
|
.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; }
|
|
441
480
|
|
|
442
481
|
/* collapsed rail */
|
|
443
482
|
.uix-sidebar[data-collapsed], .uix-sidebar[data-nav="rail"] { width: var(--uix-sidebar-w-rail); }
|
|
444
|
-
.uix-sidebar[data-collapsed] .uix-navitem__label,
|
|
445
483
|
.uix-sidebar[data-collapsed] .uix-navitem__badge,
|
|
446
484
|
.uix-sidebar[data-collapsed] .uix-navitem__star,
|
|
447
485
|
.uix-sidebar[data-collapsed] .uix-sidebar__eyebrow,
|
|
448
486
|
.uix-sidebar[data-collapsed] .uix-sidebar__brand,
|
|
449
487
|
.uix-sidebar[data-collapsed] .uix-navgroup__chevron,
|
|
450
488
|
.uix-sidebar[data-collapsed] .uix-navgroup__panel { display: none; }
|
|
489
|
+
/* rail labels stay in the accessibility tree — clip pattern (mirrors .uix-visually-hidden),
|
|
490
|
+
not display:none, so icon-only nav items keep their names (UIX-A11Y-2). position:absolute
|
|
491
|
+
removes the label from the flex row, so the centered rail layout is unaffected. */
|
|
492
|
+
.uix-sidebar[data-collapsed] .uix-navitem__label {
|
|
493
|
+
position: absolute !important;
|
|
494
|
+
width: 1px; height: 1px;
|
|
495
|
+
padding: 0; margin: -1px;
|
|
496
|
+
overflow: hidden; clip: rect(0, 0, 0, 0);
|
|
497
|
+
white-space: nowrap; border: 0;
|
|
498
|
+
}
|
|
451
499
|
/* center the icon-only rail; head keeps just the toggle, centered */
|
|
452
500
|
.uix-sidebar[data-collapsed] .uix-navitem { justify-content: center; padding: 0; gap: 0; }
|
|
453
501
|
.uix-sidebar[data-collapsed] .uix-sidebar__head { justify-content: center; padding-inline: 0; }
|
|
@@ -528,6 +576,9 @@
|
|
|
528
576
|
.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; }
|
|
529
577
|
.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); }
|
|
530
578
|
.uix-cmdk__input:focus { outline: none; }
|
|
579
|
+
/* visible focus replacement for the suppressed outline (UIX-A11Y-1): the divider under the
|
|
580
|
+
input thickens to a 2px ring-colored line */
|
|
581
|
+
.uix-cmdk__input:focus-visible { border-bottom-color: var(--uix-ring); box-shadow: 0 1px 0 0 var(--uix-ring); }
|
|
531
582
|
.uix-cmdk__list { max-height: 320px; overflow-y: auto; padding: var(--uix-space-2); }
|
|
532
583
|
.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); }
|
|
533
584
|
.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); }
|
|
@@ -586,6 +637,8 @@
|
|
|
586
637
|
.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); }
|
|
587
638
|
.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); }
|
|
588
639
|
.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); }
|
|
640
|
+
/* direction glyph inside the chip (UIX-A11Y-4) — sized to sit on the text baseline row */
|
|
641
|
+
.uix-stat__trend svg { width: 10px; height: 10px; flex: none; }
|
|
589
642
|
.uix-stat__trend--up { color: var(--uix-success); background: var(--uix-success-bg); }
|
|
590
643
|
.uix-stat__trend--down { color: var(--uix-danger-text); background: var(--uix-danger-bg); }
|
|
591
644
|
}
|
|
@@ -646,18 +699,28 @@
|
|
|
646
699
|
/* multi-column sort ordinal (⇧+click adds a secondary key) */
|
|
647
700
|
.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); }
|
|
648
701
|
|
|
702
|
+
/* sortable header's real <button> (UIX-A11Y-2): visually indistinguishable from the old
|
|
703
|
+
plain-text th — inherited font/colour, no chrome — with an inset overlay so the whole
|
|
704
|
+
cell stays the click target (the sticky th is its containing block). The sort arrow and
|
|
705
|
+
ordinal stay as th pseudo-content so they never pollute the button's accessible name. */
|
|
706
|
+
.uix-th__sortbtn { font: inherit; color: inherit; background: none; border: 0; padding: 0; text-align: inherit; cursor: pointer; }
|
|
707
|
+
.uix-th__sortbtn::before { content: ""; position: absolute; inset: 0; }
|
|
708
|
+
|
|
649
709
|
.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; }
|
|
650
710
|
.uix-table tbody tr { background: var(--uix-row); }
|
|
651
711
|
.uix-table tbody tr:nth-child(even) { background: var(--uix-row-alt); }
|
|
652
712
|
.uix-table--no-zebra tbody tr, .uix-table--no-zebra tbody tr:nth-child(even) { background: var(--uix-row); }
|
|
653
713
|
.uix-table tbody tr[data-pinned] { background: var(--uix-row-pinned-bg); }
|
|
654
|
-
|
|
714
|
+
/* [data-selected] carries row-selection styling; aria-selected is invalid on a native
|
|
715
|
+
table row — AT state comes from the row checkbox (UIX-A11Y-2). */
|
|
716
|
+
.uix-table tbody tr[data-selected] { background: var(--uix-row-selected-bg); }
|
|
655
717
|
.uix-table tbody tr:hover { background: var(--uix-bg-hover); }
|
|
656
718
|
.uix-table[data-density="compact"] td, .uix-table--compact td { height: var(--uix-row-h-compact); }
|
|
657
719
|
.uix-table[data-density="comfortable"] td { height: var(--uix-row-h-comfortable); }
|
|
658
720
|
|
|
659
721
|
.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); }
|
|
660
|
-
|
|
722
|
+
/* :focus-visible reveal mirrors .uix-rowact so keyboard users can find the pin (UIX-A11Y-2) */
|
|
723
|
+
.uix-table tbody tr:hover .uix-table__pin, .uix-table__pin:focus-visible, .uix-table__pin[data-on] { opacity: 1; }
|
|
661
724
|
.uix-table__pin:hover { background: var(--uix-bg-active); color: var(--uix-text); }
|
|
662
725
|
.uix-table__pin[data-on] { color: var(--uix-accent); }
|
|
663
726
|
.uix-table__pin svg { width: 15px; height: 15px; }
|
|
@@ -671,7 +734,7 @@
|
|
|
671
734
|
.uix-table--pinned-col.uix-table--no-zebra tbody tr td:first-child,
|
|
672
735
|
.uix-table--pinned-col.uix-table--no-zebra tbody tr:nth-child(even) td:first-child { background: var(--uix-row); }
|
|
673
736
|
.uix-table--pinned-col tbody tr[data-pinned] td:first-child { background: var(--uix-row-pinned-bg); }
|
|
674
|
-
.uix-table--pinned-col tbody tr[
|
|
737
|
+
.uix-table--pinned-col tbody tr[data-selected] td:first-child { background: var(--uix-row-selected-bg); }
|
|
675
738
|
.uix-table--pinned-col tbody tr:hover td:first-child { background: var(--uix-bg-hover); }
|
|
676
739
|
|
|
677
740
|
/* ── column sizing + cell behaviour (a shared vocabulary, not per-app px) ──────── */
|
|
@@ -770,7 +833,7 @@
|
|
|
770
833
|
.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; }
|
|
771
834
|
.uix-table--cards tbody, .uix-table--cards tr, .uix-table--cards td { display: block; width: auto; }
|
|
772
835
|
.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); }
|
|
773
|
-
.uix-table--cards tbody tr[
|
|
836
|
+
.uix-table--cards tbody tr[data-selected] { box-shadow: 0 0 0 2px var(--uix-accent); }
|
|
774
837
|
.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; }
|
|
775
838
|
.uix-table--cards td:last-child { border-bottom: 0; }
|
|
776
839
|
.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; }
|
|
@@ -876,7 +939,8 @@
|
|
|
876
939
|
background: var(--uix-text); color: var(--uix-bg-app);
|
|
877
940
|
font-size: var(--uix-text-meta); font-weight: 500; line-height: 1.4;
|
|
878
941
|
padding: var(--uix-space-2) var(--uix-space-3); border-radius: var(--uix-radius-sm);
|
|
879
|
-
|
|
942
|
+
/* no pointer-events:none — the bubble must be hoverable (WCAG 1.4.13, UIX-A11Y-1) */
|
|
943
|
+
box-shadow: var(--uix-shadow-popover); white-space: normal;
|
|
880
944
|
opacity: 0; transition: opacity var(--uix-dur-fast) var(--uix-ease-out);
|
|
881
945
|
}
|
|
882
946
|
.uix-tooltip__bubble:popover-open { opacity: 1; }
|
|
@@ -919,7 +983,8 @@
|
|
|
919
983
|
}
|
|
920
984
|
/* uix timeline / activity feed — depends only on --uix-* tokens. */
|
|
921
985
|
@layer uix.components {
|
|
922
|
-
|
|
986
|
+
/* list reset — the React Timeline renders <ol>/<li> for semantics; keep visuals pixel-identical (UIX-A11Y-4) */
|
|
987
|
+
.uix-timeline { display: flex; flex-direction: column; list-style: none; margin: 0; padding: 0; }
|
|
923
988
|
.uix-timeline__item { display: grid; grid-template-columns: 24px 1fr; gap: var(--uix-space-3); }
|
|
924
989
|
.uix-timeline__rail { display: flex; flex-direction: column; align-items: center; }
|
|
925
990
|
.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); }
|
|
@@ -1041,7 +1106,9 @@
|
|
|
1041
1106
|
@starting-style { .uix-dialog[open]::backdrop { opacity: 0; } }
|
|
1042
1107
|
|
|
1043
1108
|
.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); }
|
|
1044
|
-
|
|
1109
|
+
/* title is an <h2> for SR navigation (UIX-A11Y-1); inherits neutralize the base h2
|
|
1110
|
+
heading font/tracking/leading so it renders exactly like the old <div> */
|
|
1111
|
+
.uix-dialog__title { font-size: var(--uix-text-h3); font-weight: 600; font-family: inherit; letter-spacing: inherit; line-height: inherit; }
|
|
1045
1112
|
.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); }
|
|
1046
1113
|
.uix-dialog__close:hover { background: var(--uix-bg-hover); color: var(--uix-text); }
|
|
1047
1114
|
.uix-dialog__close svg { width: var(--uix-icon-md); height: var(--uix-icon-md); }
|
|
@@ -1101,7 +1168,13 @@
|
|
|
1101
1168
|
.uix-peek__nav { display: inline-flex; gap: var(--uix-space-1); }
|
|
1102
1169
|
.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; }
|
|
1103
1170
|
.uix-peek__navbtn:hover { background: var(--uix-bg-hover); }
|
|
1104
|
-
|
|
1171
|
+
/* boundary nav uses aria-disabled (still focusable, so focus isn't stranded — UIX-A11Y-1);
|
|
1172
|
+
mute it and suppress the hover cue like a disabled control */
|
|
1173
|
+
.uix-peek__navbtn[aria-disabled="true"] { color: var(--uix-text-muted); cursor: default; }
|
|
1174
|
+
.uix-peek__navbtn[aria-disabled="true"]:hover { background: var(--uix-surface); }
|
|
1175
|
+
/* title is an <h2> for SR navigation (UIX-A11Y-1); inherits neutralize the base h2
|
|
1176
|
+
heading font/tracking/leading so it renders exactly like the old <div> */
|
|
1177
|
+
.uix-peek__title { font-size: var(--uix-text-h3); font-weight: 600; font-family: inherit; letter-spacing: inherit; line-height: inherit; }
|
|
1105
1178
|
.uix-peek__title a { color: var(--uix-link); }
|
|
1106
1179
|
.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); }
|
|
1107
1180
|
.uix-peek__close:hover { background: var(--uix-bg-hover); color: var(--uix-text); }
|
|
@@ -1254,12 +1327,21 @@
|
|
|
1254
1327
|
.uix-inbox__list { border-right: 1px solid var(--uix-border); overflow-y: auto; background: var(--uix-surface); }
|
|
1255
1328
|
.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; }
|
|
1256
1329
|
.uix-inbox__item:hover { background: var(--uix-bg-hover); }
|
|
1330
|
+
/* keyboard active option (aria-activedescendant) mirrors the hover style (UIX-A11Y-2) */
|
|
1331
|
+
.uix-inbox__item[data-active] { background: var(--uix-bg-hover); }
|
|
1257
1332
|
.uix-inbox__item[aria-selected="true"] { background: linear-gradient(to right, var(--uix-accent) 3px, var(--uix-brand-muted) 3px); }
|
|
1258
1333
|
.uix-inbox__item[data-unread] .uix-inbox__subject { font-weight: 600; }
|
|
1259
1334
|
.uix-inbox__subject { font-size: var(--uix-text-body); }
|
|
1260
1335
|
.uix-inbox__preview { font-size: var(--uix-text-meta); color: var(--uix-text-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
1261
1336
|
.uix-inbox__detail { overflow-y: auto; padding: var(--uix-space-5); background: var(--uix-bg-app); }
|
|
1262
|
-
|
|
1337
|
+
/* narrow viewports stack to one pane: list by default, detail when the app sets
|
|
1338
|
+
view="detail" — with a consumer-rendered Back control in the detail pane (UIX-A11Y-2) */
|
|
1339
|
+
@media (max-width: 700px) {
|
|
1340
|
+
.uix-inbox { grid-template-columns: 1fr; }
|
|
1341
|
+
.uix-inbox__detail { display: none; }
|
|
1342
|
+
.uix-inbox[data-view="detail"] .uix-inbox__list { display: none; }
|
|
1343
|
+
.uix-inbox[data-view="detail"] .uix-inbox__detail { display: block; }
|
|
1344
|
+
}
|
|
1263
1345
|
}
|
|
1264
1346
|
/* uix notification center — depends only on --uix-* tokens. */
|
|
1265
1347
|
@layer uix.components {
|
package/build/css/styles.css
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
@layer uix.tokens, uix.base, uix.util, uix.motion, uix.components;
|
|
2
|
+
@layer uix.tokens, uix.base, uix.util, uix.motion, uix.components, uix.forced-colors;
|
|
3
3
|
/* uix-styleguide — aggregate stylesheet. Declares the cascade-layer order, then imports each layer.
|
|
4
4
|
Component @imports are appended here as phases land (each component file declares @layer uix.components). */
|
|
5
5
|
/* uix tokens — REDIRECT (no longer hand-authored).
|
|
@@ -149,19 +149,19 @@
|
|
|
149
149
|
--uix-font-sans: "Inter",system-ui,sans-serif;
|
|
150
150
|
--uix-font-heading: "IBM Plex Sans","Inter",system-ui,sans-serif;
|
|
151
151
|
--uix-font-mono: "IBM Plex Mono",ui-monospace,monospace;
|
|
152
|
-
--uix-text-display:
|
|
152
|
+
--uix-text-display: 2.5rem;
|
|
153
153
|
--uix-leading-display: 1.05;
|
|
154
|
-
--uix-text-data-hero:
|
|
154
|
+
--uix-text-data-hero: 2.125rem;
|
|
155
155
|
--uix-leading-data-hero: 1.1;
|
|
156
|
-
--uix-text-h2:
|
|
156
|
+
--uix-text-h2: 1.5rem;
|
|
157
157
|
--uix-leading-h2: 1.15;
|
|
158
|
-
--uix-text-h3:
|
|
158
|
+
--uix-text-h3: 0.9375rem;
|
|
159
159
|
--uix-leading-h3: 1.3;
|
|
160
|
-
--uix-text-body:
|
|
160
|
+
--uix-text-body: 0.875rem;
|
|
161
161
|
--uix-leading-body: 1.5;
|
|
162
|
-
--uix-text-meta:
|
|
162
|
+
--uix-text-meta: 0.78125rem;
|
|
163
163
|
--uix-leading-meta: 1.4;
|
|
164
|
-
--uix-text-eyebrow:
|
|
164
|
+
--uix-text-eyebrow: 0.6875rem;
|
|
165
165
|
--uix-leading-eyebrow: 1.2;
|
|
166
166
|
--uix-tracking-tight: -0.02em;
|
|
167
167
|
--uix-tracking-eyebrow: 0.06em;
|
|
@@ -272,6 +272,9 @@
|
|
|
272
272
|
h3 { font-size: var(--uix-text-h3); line-height: var(--uix-leading-h3); }
|
|
273
273
|
|
|
274
274
|
img, svg, video, canvas { display: block; max-width: 100%; }
|
|
275
|
+
/* the display:block reset above (and any component display) would defeat the `hidden`
|
|
276
|
+
attribute; restore it globally. `until-found` keeps find-in-page auto-reveal (UIX-A11Y-4). */
|
|
277
|
+
[hidden]:not([hidden="until-found"]) { display: none !important; }
|
|
275
278
|
input, button, textarea, select { font: inherit; color: inherit; }
|
|
276
279
|
code, kbd, pre, samp { font-family: var(--uix-font-mono); }
|
|
277
280
|
|
|
@@ -503,7 +506,8 @@
|
|
|
503
506
|
}
|
|
504
507
|
.uix-checkbox > input:checked + .uix-checkbox__box,
|
|
505
508
|
.uix-checkbox > input:indeterminate + .uix-checkbox__box { background: var(--uix-accent); border-color: var(--uix-accent); }
|
|
506
|
-
.uix-checkbox > input:checked + .uix-checkbox__box svg
|
|
509
|
+
.uix-checkbox > input:checked + .uix-checkbox__box svg,
|
|
510
|
+
.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) */
|
|
507
511
|
.uix-checkbox > input:focus-visible + .uix-checkbox__box { outline: 2px solid var(--uix-ring); outline-offset: 2px; }
|
|
508
512
|
.uix-checkbox > input:disabled ~ * { opacity: .5; }
|
|
509
513
|
}
|
|
@@ -555,7 +559,7 @@
|
|
|
555
559
|
transition: background-color var(--uix-dur-fast) var(--uix-ease-out), color var(--uix-dur-fast) var(--uix-ease-out);
|
|
556
560
|
}
|
|
557
561
|
.uix-segmented__option:hover { color: var(--uix-text); }
|
|
558
|
-
.uix-segmented__option[aria-
|
|
562
|
+
.uix-segmented__option[aria-pressed="true"] { background: var(--uix-surface); color: var(--uix-text); box-shadow: var(--uix-shadow-sm); }
|
|
559
563
|
.uix-segmented__option:focus-visible { outline: 2px solid var(--uix-ring); outline-offset: 1px; }
|
|
560
564
|
}
|
|
561
565
|
/* uix slider (native range, styled) — depends only on --uix-* tokens. */
|
|
@@ -629,7 +633,9 @@
|
|
|
629
633
|
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);
|
|
630
634
|
background: var(--uix-bg-active); color: var(--uix-text); font-size: var(--uix-text-meta);
|
|
631
635
|
}
|
|
632
|
-
.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); }
|
|
636
|
+
.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); }
|
|
637
|
+
/* Invisible overlay grows the 16px visual to a 24px hit target (UIX-A11Y-3). */
|
|
638
|
+
.uix-tag__remove::before { content: ""; position: absolute; inset: -4px; }
|
|
633
639
|
.uix-tag__remove:hover { background: var(--uix-bg-hover); color: var(--uix-text); }
|
|
634
640
|
.uix-tag__remove svg { width: 12px; height: 12px; }
|
|
635
641
|
}
|
|
@@ -638,6 +644,11 @@
|
|
|
638
644
|
.uix-form-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: var(--uix-space-5); }
|
|
639
645
|
.uix-fieldset { border: 1px solid var(--uix-border); border-radius: var(--uix-radius-lg); padding: var(--uix-space-6); }
|
|
640
646
|
.uix-fieldset > legend { padding: 0 var(--uix-space-2); font-size: var(--uix-text-meta); font-weight: 600; color: var(--uix-text); }
|
|
647
|
+
/* Labeled RadioGroup renders as a fieldset (UIX-A11Y-3): strip the UA chrome so it
|
|
648
|
+
looks identical to the plain-div group; the legend spaces itself (fieldset gap
|
|
649
|
+
doesn't reach a legend). */
|
|
650
|
+
fieldset.uix-radio-group { border: 0; margin: 0; padding: 0; min-inline-size: auto; }
|
|
651
|
+
.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); }
|
|
641
652
|
.uix-form-inline { display: flex; flex-wrap: wrap; align-items: flex-end; gap: var(--uix-space-4); }
|
|
642
653
|
.uix-validation-summary {
|
|
643
654
|
border: 1px solid var(--uix-danger); background: var(--uix-danger-bg); color: var(--uix-text);
|
|
@@ -658,7 +669,7 @@
|
|
|
658
669
|
border: 1px solid var(--uix-border); border-radius: var(--uix-radius-lg); overflow: hidden;
|
|
659
670
|
transition: grid-template-columns var(--uix-dur) var(--uix-ease-out), grid-template-rows var(--uix-dur) var(--uix-ease-out);
|
|
660
671
|
}
|
|
661
|
-
.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; }
|
|
672
|
+
.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); }
|
|
662
673
|
.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); }
|
|
663
674
|
.uix-shell__main { grid-column: 2; overflow: auto; padding: var(--uix-space-7); background: var(--uix-bg-app); }
|
|
664
675
|
|
|
@@ -667,17 +678,39 @@
|
|
|
667
678
|
only) → hidden (0). data-collapsed stays a back-compat alias for the rail. */
|
|
668
679
|
.uix-shell[data-nav="rail"], .uix-shell[data-collapsed] { grid-template-columns: var(--uix-sidebar-w-rail) 1fr; }
|
|
669
680
|
.uix-shell[data-nav="hidden"] { grid-template-columns: 0 1fr; }
|
|
681
|
+
/* the 0-width column still renders its links — visibility removes them from the tab
|
|
682
|
+
order / accessibility tree while keeping the width transition (UIX-A11Y-2) */
|
|
683
|
+
.uix-shell[data-nav="hidden"] .uix-shell__sidebar { visibility: hidden; }
|
|
670
684
|
|
|
671
685
|
/* ── focus / immersive mode ───────────────────────────────────────────────────
|
|
672
686
|
A table-scoped escape hatch: hide the sidebar AND the topbar so a dense grid
|
|
673
687
|
uses the whole frame. The app toggles [data-focus] (from a toolbar maximize
|
|
674
688
|
control) and restores the previous nav state + focus on Esc. */
|
|
675
689
|
.uix-shell[data-focus] { grid-template-columns: 0 1fr; grid-template-rows: 0 1fr; }
|
|
690
|
+
.uix-shell[data-focus] .uix-shell__sidebar { visibility: hidden; } /* see [data-nav="hidden"] above (UIX-A11Y-2) */
|
|
676
691
|
.uix-shell[data-focus] .uix-shell__topbar { display: none; }
|
|
677
692
|
|
|
678
693
|
/* a floating host for the "exit focus" affordance (Esc also exits) */
|
|
679
694
|
.uix-shell__focus-exit { position: absolute; top: var(--uix-space-3); right: var(--uix-space-3); z-index: var(--uix-z-overlay); }
|
|
680
695
|
|
|
696
|
+
/* ── skip link ────────────────────────────────────────────────────────────────
|
|
697
|
+
First tab stop in the shell (UIX-A11Y-2): visually hidden until keyboard focus,
|
|
698
|
+
then a small pill floating over the shell's top-left corner. */
|
|
699
|
+
.uix-skiplink {
|
|
700
|
+
position: absolute; top: var(--uix-space-3); left: var(--uix-space-3); z-index: var(--uix-z-overlay);
|
|
701
|
+
width: 1px; height: 1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap;
|
|
702
|
+
}
|
|
703
|
+
.uix-skiplink:focus-visible {
|
|
704
|
+
width: auto; height: auto; clip: auto;
|
|
705
|
+
display: inline-flex; align-items: center;
|
|
706
|
+
padding: var(--uix-space-2) var(--uix-space-4);
|
|
707
|
+
background: var(--uix-surface); color: var(--uix-text);
|
|
708
|
+
border: 1px solid var(--uix-border); border-radius: var(--uix-radius-pill);
|
|
709
|
+
box-shadow: var(--uix-shadow-popover);
|
|
710
|
+
outline: 2px solid var(--uix-ring); outline-offset: 2px;
|
|
711
|
+
font-size: var(--uix-text-meta); font-weight: 500; text-decoration: none;
|
|
712
|
+
}
|
|
713
|
+
|
|
681
714
|
/* ── full-bleed main ──────────────────────────────────────────────────────────
|
|
682
715
|
Opt-in per surface: a genuinely wide grid drops the content gutter and runs
|
|
683
716
|
edge to edge, reclaiming 2 x --uix-space-7. Not the default — most pages want
|
|
@@ -718,9 +751,14 @@
|
|
|
718
751
|
.uix-navitem__badge { font-size: var(--uix-text-meta); color: var(--uix-text-muted); }
|
|
719
752
|
/* on the active tint, muted badge dips below AA — hushed composites darker on the tint */
|
|
720
753
|
.uix-navitem[aria-current="page"] .uix-navitem__badge { color: var(--uix-text-hushed); }
|
|
721
|
-
.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); }
|
|
754
|
+
.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); }
|
|
755
|
+
/* invisible halo → 24px effective target with zero visual change (UIX-A11Y-2) */
|
|
756
|
+
.uix-navitem__star::before { content: ""; position: absolute; inset: -1px; }
|
|
722
757
|
.uix-navitem__star svg { width: 15px; height: 15px; }
|
|
723
|
-
|
|
758
|
+
/* keyboard reveal mirrors the hover reveal (UIX-A11Y-2) */
|
|
759
|
+
.uix-navitem:hover .uix-navitem__star,
|
|
760
|
+
.uix-navitem__star:focus-visible,
|
|
761
|
+
.uix-navitem:focus-within .uix-navitem__star { opacity: 1; }
|
|
724
762
|
.uix-navitem__star[data-on] { opacity: 1; color: var(--uix-warning); }
|
|
725
763
|
.uix-navitem__star[data-on] svg { fill: currentColor; }
|
|
726
764
|
|
|
@@ -731,19 +769,32 @@
|
|
|
731
769
|
.uix-navgroup__chevron { width: var(--uix-icon-sm); height: var(--uix-icon-sm); }
|
|
732
770
|
.uix-navgroup__panel { display: grid; grid-template-rows: 1fr; transition: grid-template-rows var(--uix-dur) var(--uix-ease-out); }
|
|
733
771
|
.uix-navgroup__trigger[aria-expanded="false"] + .uix-navgroup__panel { grid-template-rows: 0fr; }
|
|
734
|
-
|
|
772
|
+
/* visibility keeps the 0fr-collapsed links out of the tab order / accessibility tree
|
|
773
|
+
(UIX-A11Y-2); the transition delays hiding until the row collapse finishes, and
|
|
774
|
+
visibility snaps back to visible instantly on expand, so nothing visibly glitches. */
|
|
775
|
+
.uix-navgroup__panel > div { overflow: hidden; visibility: visible; transition: visibility var(--uix-dur) var(--uix-ease-out); }
|
|
776
|
+
.uix-navgroup__trigger[aria-expanded="false"] + .uix-navgroup__panel > div { visibility: hidden; }
|
|
735
777
|
.uix-subitem { padding-left: var(--uix-space-5); }
|
|
736
778
|
.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; }
|
|
737
779
|
|
|
738
780
|
/* collapsed rail */
|
|
739
781
|
.uix-sidebar[data-collapsed], .uix-sidebar[data-nav="rail"] { width: var(--uix-sidebar-w-rail); }
|
|
740
|
-
.uix-sidebar[data-collapsed] .uix-navitem__label,
|
|
741
782
|
.uix-sidebar[data-collapsed] .uix-navitem__badge,
|
|
742
783
|
.uix-sidebar[data-collapsed] .uix-navitem__star,
|
|
743
784
|
.uix-sidebar[data-collapsed] .uix-sidebar__eyebrow,
|
|
744
785
|
.uix-sidebar[data-collapsed] .uix-sidebar__brand,
|
|
745
786
|
.uix-sidebar[data-collapsed] .uix-navgroup__chevron,
|
|
746
787
|
.uix-sidebar[data-collapsed] .uix-navgroup__panel { display: none; }
|
|
788
|
+
/* rail labels stay in the accessibility tree — clip pattern (mirrors .uix-visually-hidden),
|
|
789
|
+
not display:none, so icon-only nav items keep their names (UIX-A11Y-2). position:absolute
|
|
790
|
+
removes the label from the flex row, so the centered rail layout is unaffected. */
|
|
791
|
+
.uix-sidebar[data-collapsed] .uix-navitem__label {
|
|
792
|
+
position: absolute !important;
|
|
793
|
+
width: 1px; height: 1px;
|
|
794
|
+
padding: 0; margin: -1px;
|
|
795
|
+
overflow: hidden; clip: rect(0, 0, 0, 0);
|
|
796
|
+
white-space: nowrap; border: 0;
|
|
797
|
+
}
|
|
747
798
|
/* center the icon-only rail; head keeps just the toggle, centered */
|
|
748
799
|
.uix-sidebar[data-collapsed] .uix-navitem { justify-content: center; padding: 0; gap: 0; }
|
|
749
800
|
.uix-sidebar[data-collapsed] .uix-sidebar__head { justify-content: center; padding-inline: 0; }
|
|
@@ -824,6 +875,9 @@
|
|
|
824
875
|
.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; }
|
|
825
876
|
.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); }
|
|
826
877
|
.uix-cmdk__input:focus { outline: none; }
|
|
878
|
+
/* visible focus replacement for the suppressed outline (UIX-A11Y-1): the divider under the
|
|
879
|
+
input thickens to a 2px ring-colored line */
|
|
880
|
+
.uix-cmdk__input:focus-visible { border-bottom-color: var(--uix-ring); box-shadow: 0 1px 0 0 var(--uix-ring); }
|
|
827
881
|
.uix-cmdk__list { max-height: 320px; overflow-y: auto; padding: var(--uix-space-2); }
|
|
828
882
|
.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); }
|
|
829
883
|
.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); }
|
|
@@ -882,6 +936,8 @@
|
|
|
882
936
|
.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); }
|
|
883
937
|
.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); }
|
|
884
938
|
.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); }
|
|
939
|
+
/* direction glyph inside the chip (UIX-A11Y-4) — sized to sit on the text baseline row */
|
|
940
|
+
.uix-stat__trend svg { width: 10px; height: 10px; flex: none; }
|
|
885
941
|
.uix-stat__trend--up { color: var(--uix-success); background: var(--uix-success-bg); }
|
|
886
942
|
.uix-stat__trend--down { color: var(--uix-danger-text); background: var(--uix-danger-bg); }
|
|
887
943
|
}
|
|
@@ -942,18 +998,28 @@
|
|
|
942
998
|
/* multi-column sort ordinal (⇧+click adds a secondary key) */
|
|
943
999
|
.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); }
|
|
944
1000
|
|
|
1001
|
+
/* sortable header's real <button> (UIX-A11Y-2): visually indistinguishable from the old
|
|
1002
|
+
plain-text th — inherited font/colour, no chrome — with an inset overlay so the whole
|
|
1003
|
+
cell stays the click target (the sticky th is its containing block). The sort arrow and
|
|
1004
|
+
ordinal stay as th pseudo-content so they never pollute the button's accessible name. */
|
|
1005
|
+
.uix-th__sortbtn { font: inherit; color: inherit; background: none; border: 0; padding: 0; text-align: inherit; cursor: pointer; }
|
|
1006
|
+
.uix-th__sortbtn::before { content: ""; position: absolute; inset: 0; }
|
|
1007
|
+
|
|
945
1008
|
.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; }
|
|
946
1009
|
.uix-table tbody tr { background: var(--uix-row); }
|
|
947
1010
|
.uix-table tbody tr:nth-child(even) { background: var(--uix-row-alt); }
|
|
948
1011
|
.uix-table--no-zebra tbody tr, .uix-table--no-zebra tbody tr:nth-child(even) { background: var(--uix-row); }
|
|
949
1012
|
.uix-table tbody tr[data-pinned] { background: var(--uix-row-pinned-bg); }
|
|
950
|
-
|
|
1013
|
+
/* [data-selected] carries row-selection styling; aria-selected is invalid on a native
|
|
1014
|
+
table row — AT state comes from the row checkbox (UIX-A11Y-2). */
|
|
1015
|
+
.uix-table tbody tr[data-selected] { background: var(--uix-row-selected-bg); }
|
|
951
1016
|
.uix-table tbody tr:hover { background: var(--uix-bg-hover); }
|
|
952
1017
|
.uix-table[data-density="compact"] td, .uix-table--compact td { height: var(--uix-row-h-compact); }
|
|
953
1018
|
.uix-table[data-density="comfortable"] td { height: var(--uix-row-h-comfortable); }
|
|
954
1019
|
|
|
955
1020
|
.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); }
|
|
956
|
-
|
|
1021
|
+
/* :focus-visible reveal mirrors .uix-rowact so keyboard users can find the pin (UIX-A11Y-2) */
|
|
1022
|
+
.uix-table tbody tr:hover .uix-table__pin, .uix-table__pin:focus-visible, .uix-table__pin[data-on] { opacity: 1; }
|
|
957
1023
|
.uix-table__pin:hover { background: var(--uix-bg-active); color: var(--uix-text); }
|
|
958
1024
|
.uix-table__pin[data-on] { color: var(--uix-accent); }
|
|
959
1025
|
.uix-table__pin svg { width: 15px; height: 15px; }
|
|
@@ -967,7 +1033,7 @@
|
|
|
967
1033
|
.uix-table--pinned-col.uix-table--no-zebra tbody tr td:first-child,
|
|
968
1034
|
.uix-table--pinned-col.uix-table--no-zebra tbody tr:nth-child(even) td:first-child { background: var(--uix-row); }
|
|
969
1035
|
.uix-table--pinned-col tbody tr[data-pinned] td:first-child { background: var(--uix-row-pinned-bg); }
|
|
970
|
-
.uix-table--pinned-col tbody tr[
|
|
1036
|
+
.uix-table--pinned-col tbody tr[data-selected] td:first-child { background: var(--uix-row-selected-bg); }
|
|
971
1037
|
.uix-table--pinned-col tbody tr:hover td:first-child { background: var(--uix-bg-hover); }
|
|
972
1038
|
|
|
973
1039
|
/* ── column sizing + cell behaviour (a shared vocabulary, not per-app px) ──────── */
|
|
@@ -1066,7 +1132,7 @@
|
|
|
1066
1132
|
.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; }
|
|
1067
1133
|
.uix-table--cards tbody, .uix-table--cards tr, .uix-table--cards td { display: block; width: auto; }
|
|
1068
1134
|
.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); }
|
|
1069
|
-
.uix-table--cards tbody tr[
|
|
1135
|
+
.uix-table--cards tbody tr[data-selected] { box-shadow: 0 0 0 2px var(--uix-accent); }
|
|
1070
1136
|
.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; }
|
|
1071
1137
|
.uix-table--cards td:last-child { border-bottom: 0; }
|
|
1072
1138
|
.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; }
|
|
@@ -1217,7 +1283,8 @@
|
|
|
1217
1283
|
background: var(--uix-text); color: var(--uix-bg-app);
|
|
1218
1284
|
font-size: var(--uix-text-meta); font-weight: 500; line-height: 1.4;
|
|
1219
1285
|
padding: var(--uix-space-2) var(--uix-space-3); border-radius: var(--uix-radius-sm);
|
|
1220
|
-
|
|
1286
|
+
/* no pointer-events:none — the bubble must be hoverable (WCAG 1.4.13, UIX-A11Y-1) */
|
|
1287
|
+
box-shadow: var(--uix-shadow-popover); white-space: normal;
|
|
1221
1288
|
opacity: 0; transition: opacity var(--uix-dur-fast) var(--uix-ease-out);
|
|
1222
1289
|
}
|
|
1223
1290
|
.uix-tooltip__bubble:popover-open { opacity: 1; }
|
|
@@ -1260,7 +1327,8 @@
|
|
|
1260
1327
|
}
|
|
1261
1328
|
/* uix timeline / activity feed — depends only on --uix-* tokens. */
|
|
1262
1329
|
@layer uix.components {
|
|
1263
|
-
|
|
1330
|
+
/* list reset — the React Timeline renders <ol>/<li> for semantics; keep visuals pixel-identical (UIX-A11Y-4) */
|
|
1331
|
+
.uix-timeline { display: flex; flex-direction: column; list-style: none; margin: 0; padding: 0; }
|
|
1264
1332
|
.uix-timeline__item { display: grid; grid-template-columns: 24px 1fr; gap: var(--uix-space-3); }
|
|
1265
1333
|
.uix-timeline__rail { display: flex; flex-direction: column; align-items: center; }
|
|
1266
1334
|
.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); }
|
|
@@ -1382,7 +1450,9 @@
|
|
|
1382
1450
|
@starting-style { .uix-dialog[open]::backdrop { opacity: 0; } }
|
|
1383
1451
|
|
|
1384
1452
|
.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); }
|
|
1385
|
-
|
|
1453
|
+
/* title is an <h2> for SR navigation (UIX-A11Y-1); inherits neutralize the base h2
|
|
1454
|
+
heading font/tracking/leading so it renders exactly like the old <div> */
|
|
1455
|
+
.uix-dialog__title { font-size: var(--uix-text-h3); font-weight: 600; font-family: inherit; letter-spacing: inherit; line-height: inherit; }
|
|
1386
1456
|
.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); }
|
|
1387
1457
|
.uix-dialog__close:hover { background: var(--uix-bg-hover); color: var(--uix-text); }
|
|
1388
1458
|
.uix-dialog__close svg { width: var(--uix-icon-md); height: var(--uix-icon-md); }
|
|
@@ -1442,7 +1512,13 @@
|
|
|
1442
1512
|
.uix-peek__nav { display: inline-flex; gap: var(--uix-space-1); }
|
|
1443
1513
|
.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; }
|
|
1444
1514
|
.uix-peek__navbtn:hover { background: var(--uix-bg-hover); }
|
|
1445
|
-
|
|
1515
|
+
/* boundary nav uses aria-disabled (still focusable, so focus isn't stranded — UIX-A11Y-1);
|
|
1516
|
+
mute it and suppress the hover cue like a disabled control */
|
|
1517
|
+
.uix-peek__navbtn[aria-disabled="true"] { color: var(--uix-text-muted); cursor: default; }
|
|
1518
|
+
.uix-peek__navbtn[aria-disabled="true"]:hover { background: var(--uix-surface); }
|
|
1519
|
+
/* title is an <h2> for SR navigation (UIX-A11Y-1); inherits neutralize the base h2
|
|
1520
|
+
heading font/tracking/leading so it renders exactly like the old <div> */
|
|
1521
|
+
.uix-peek__title { font-size: var(--uix-text-h3); font-weight: 600; font-family: inherit; letter-spacing: inherit; line-height: inherit; }
|
|
1446
1522
|
.uix-peek__title a { color: var(--uix-link); }
|
|
1447
1523
|
.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); }
|
|
1448
1524
|
.uix-peek__close:hover { background: var(--uix-bg-hover); color: var(--uix-text); }
|
|
@@ -1595,12 +1671,21 @@
|
|
|
1595
1671
|
.uix-inbox__list { border-right: 1px solid var(--uix-border); overflow-y: auto; background: var(--uix-surface); }
|
|
1596
1672
|
.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; }
|
|
1597
1673
|
.uix-inbox__item:hover { background: var(--uix-bg-hover); }
|
|
1674
|
+
/* keyboard active option (aria-activedescendant) mirrors the hover style (UIX-A11Y-2) */
|
|
1675
|
+
.uix-inbox__item[data-active] { background: var(--uix-bg-hover); }
|
|
1598
1676
|
.uix-inbox__item[aria-selected="true"] { background: linear-gradient(to right, var(--uix-accent) 3px, var(--uix-brand-muted) 3px); }
|
|
1599
1677
|
.uix-inbox__item[data-unread] .uix-inbox__subject { font-weight: 600; }
|
|
1600
1678
|
.uix-inbox__subject { font-size: var(--uix-text-body); }
|
|
1601
1679
|
.uix-inbox__preview { font-size: var(--uix-text-meta); color: var(--uix-text-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
1602
1680
|
.uix-inbox__detail { overflow-y: auto; padding: var(--uix-space-5); background: var(--uix-bg-app); }
|
|
1603
|
-
|
|
1681
|
+
/* narrow viewports stack to one pane: list by default, detail when the app sets
|
|
1682
|
+
view="detail" — with a consumer-rendered Back control in the detail pane (UIX-A11Y-2) */
|
|
1683
|
+
@media (max-width: 700px) {
|
|
1684
|
+
.uix-inbox { grid-template-columns: 1fr; }
|
|
1685
|
+
.uix-inbox__detail { display: none; }
|
|
1686
|
+
.uix-inbox[data-view="detail"] .uix-inbox__list { display: none; }
|
|
1687
|
+
.uix-inbox[data-view="detail"] .uix-inbox__detail { display: block; }
|
|
1688
|
+
}
|
|
1604
1689
|
}
|
|
1605
1690
|
/* uix notification center — depends only on --uix-* tokens. */
|
|
1606
1691
|
@layer uix.components {
|
|
@@ -2129,3 +2214,37 @@
|
|
|
2129
2214
|
.uix-table td a:not([class]):hover,
|
|
2130
2215
|
.uix-table td a:not([class]):focus-visible { text-decoration: underline; }
|
|
2131
2216
|
}
|
|
2217
|
+
/* forced-colors (WHCM) repairs — last layer so its system-color fixes win over component rules (UIX-A11Y-4) */
|
|
2218
|
+
/* uix forced-colors — Windows High Contrast / forced-colors repairs (UIX-A11Y-4).
|
|
2219
|
+
Forced-colors mode strips author backgrounds and box-shadows, so controls whose state or
|
|
2220
|
+
focus cue rides on those go invisible. Repairs below redraw ONLY those affordances with
|
|
2221
|
+
CSS system colors; everything else stays honest to the user's forced palette. Loaded as
|
|
2222
|
+
the last layer (see main.css) so these rules win over component declarations. */
|
|
2223
|
+
@layer uix.forced-colors {
|
|
2224
|
+
@media (forced-colors: active) {
|
|
2225
|
+
/* switch — track + thumb are background-only; redraw with system colors */
|
|
2226
|
+
.uix-switch__track { border: 1px solid ButtonText; background: Canvas; forced-color-adjust: none; }
|
|
2227
|
+
.uix-switch__track::after { background: ButtonText; box-shadow: none; }
|
|
2228
|
+
.uix-switch > input:checked + .uix-switch__track { background: SelectedItem; border-color: SelectedItem; }
|
|
2229
|
+
.uix-switch > input:checked + .uix-switch__track::after { background: SelectedItemText; }
|
|
2230
|
+
|
|
2231
|
+
/* radio — the checked ::after dot is a token background, forced away otherwise */
|
|
2232
|
+
.uix-radio > input:checked + .uix-radio__dot::after { background: SelectedItem; forced-color-adjust: none; }
|
|
2233
|
+
|
|
2234
|
+
/* checkbox — checked/indeterminate box fill + check glyph */
|
|
2235
|
+
.uix-checkbox > input:checked + .uix-checkbox__box,
|
|
2236
|
+
.uix-checkbox > input:indeterminate + .uix-checkbox__box {
|
|
2237
|
+
background: SelectedItem; border-color: SelectedItem; forced-color-adjust: none;
|
|
2238
|
+
}
|
|
2239
|
+
.uix-checkbox > input:checked + .uix-checkbox__box svg { color: SelectedItemText; }
|
|
2240
|
+
|
|
2241
|
+
/* progress + meter — track and fill are both plain backgrounds */
|
|
2242
|
+
.uix-progress, .uix-meter { border: 1px solid ButtonText; }
|
|
2243
|
+
.uix-progress__bar, .uix-meter__fill { background: SelectedItem; forced-color-adjust: none; }
|
|
2244
|
+
|
|
2245
|
+
/* text fields — components replace the focus outline with a box-shadow ring, which WHCM strips */
|
|
2246
|
+
.uix-input:focus-visible, .uix-textarea:focus-visible, .uix-select:focus-visible {
|
|
2247
|
+
outline: 2px solid Highlight; outline-offset: 1px;
|
|
2248
|
+
}
|
|
2249
|
+
}
|
|
2250
|
+
}
|
package/build/css/tokens.css
CHANGED
|
@@ -138,19 +138,19 @@
|
|
|
138
138
|
--uix-font-sans: "Inter",system-ui,sans-serif;
|
|
139
139
|
--uix-font-heading: "IBM Plex Sans","Inter",system-ui,sans-serif;
|
|
140
140
|
--uix-font-mono: "IBM Plex Mono",ui-monospace,monospace;
|
|
141
|
-
--uix-text-display:
|
|
141
|
+
--uix-text-display: 2.5rem;
|
|
142
142
|
--uix-leading-display: 1.05;
|
|
143
|
-
--uix-text-data-hero:
|
|
143
|
+
--uix-text-data-hero: 2.125rem;
|
|
144
144
|
--uix-leading-data-hero: 1.1;
|
|
145
|
-
--uix-text-h2:
|
|
145
|
+
--uix-text-h2: 1.5rem;
|
|
146
146
|
--uix-leading-h2: 1.15;
|
|
147
|
-
--uix-text-h3:
|
|
147
|
+
--uix-text-h3: 0.9375rem;
|
|
148
148
|
--uix-leading-h3: 1.3;
|
|
149
|
-
--uix-text-body:
|
|
149
|
+
--uix-text-body: 0.875rem;
|
|
150
150
|
--uix-leading-body: 1.5;
|
|
151
|
-
--uix-text-meta:
|
|
151
|
+
--uix-text-meta: 0.78125rem;
|
|
152
152
|
--uix-leading-meta: 1.4;
|
|
153
|
-
--uix-text-eyebrow:
|
|
153
|
+
--uix-text-eyebrow: 0.6875rem;
|
|
154
154
|
--uix-leading-eyebrow: 1.2;
|
|
155
155
|
--uix-tracking-tight: -0.02em;
|
|
156
156
|
--uix-tracking-eyebrow: 0.06em;
|
package/build/ts/tokens.js
CHANGED
|
@@ -293,19 +293,19 @@ export const light = {
|
|
|
293
293
|
"font-sans": "\"Inter\",system-ui,sans-serif",
|
|
294
294
|
"font-heading": "\"IBM Plex Sans\",\"Inter\",system-ui,sans-serif",
|
|
295
295
|
"font-mono": "\"IBM Plex Mono\",ui-monospace,monospace",
|
|
296
|
-
"text-display": "
|
|
296
|
+
"text-display": "2.5rem",
|
|
297
297
|
"leading-display": "1.05",
|
|
298
|
-
"text-data-hero": "
|
|
298
|
+
"text-data-hero": "2.125rem",
|
|
299
299
|
"leading-data-hero": "1.1",
|
|
300
|
-
"text-h2": "
|
|
300
|
+
"text-h2": "1.5rem",
|
|
301
301
|
"leading-h2": "1.15",
|
|
302
|
-
"text-h3": "
|
|
302
|
+
"text-h3": "0.9375rem",
|
|
303
303
|
"leading-h3": "1.3",
|
|
304
|
-
"text-body": "
|
|
304
|
+
"text-body": "0.875rem",
|
|
305
305
|
"leading-body": "1.5",
|
|
306
|
-
"text-meta": "
|
|
306
|
+
"text-meta": "0.78125rem",
|
|
307
307
|
"leading-meta": "1.4",
|
|
308
|
-
"text-eyebrow": "
|
|
308
|
+
"text-eyebrow": "0.6875rem",
|
|
309
309
|
"leading-eyebrow": "1.2",
|
|
310
310
|
"tracking-tight": "-0.02em",
|
|
311
311
|
"tracking-eyebrow": "0.06em",
|
|
@@ -414,11 +414,4 @@ export const num = {
|
|
|
414
414
|
"space-10": 64,
|
|
415
415
|
"space-11": 80,
|
|
416
416
|
"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
417
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tensor_1/tokens",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.10.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
|
"license": "UNLICENSED",
|
|
@@ -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" },
|