@tensor_1/tokens 2.11.0 → 2.12.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.
Files changed (75) hide show
  1. package/README.md +2 -0
  2. package/build/css/components.css +1 -1847
  3. package/build/css/styles.css +1 -2188
  4. package/package.json +12 -2
  5. package/styles/components/alert.css +16 -0
  6. package/styles/components/app-shell.css +37 -0
  7. package/styles/components/attachment.css +10 -0
  8. package/styles/components/audit-log.css +11 -0
  9. package/styles/components/avatar.css +25 -0
  10. package/styles/components/breadcrumbs.css +10 -0
  11. package/styles/components/button.css +49 -0
  12. package/styles/components/calendar.css +13 -0
  13. package/styles/components/card.css +9 -0
  14. package/styles/components/chart.css +9 -0
  15. package/styles/components/checkbox.css +20 -0
  16. package/styles/components/combobox.css +16 -0
  17. package/styles/components/command-palette.css +14 -0
  18. package/styles/components/comments.css +17 -0
  19. package/styles/components/contact-card.css +12 -0
  20. package/styles/components/description-list.css +6 -0
  21. package/styles/components/detail-layout.css +7 -0
  22. package/styles/components/drawer.css +24 -0
  23. package/styles/components/editorial-home.css +185 -0
  24. package/styles/components/file-upload.css +14 -0
  25. package/styles/components/flow.css +196 -0
  26. package/styles/components/form.css +14 -0
  27. package/styles/components/heartbeat.css +12 -0
  28. package/styles/components/inbox.css +13 -0
  29. package/styles/components/input.css +39 -0
  30. package/styles/components/kanban.css +14 -0
  31. package/styles/components/kbd.css +8 -0
  32. package/styles/components/labels.css +13 -0
  33. package/styles/components/lightbox.css +13 -0
  34. package/styles/components/link.css +98 -0
  35. package/styles/components/list.css +10 -0
  36. package/styles/components/media.css +9 -0
  37. package/styles/components/menu.css +15 -0
  38. package/styles/components/meter.css +9 -0
  39. package/styles/components/modal.css +31 -0
  40. package/styles/components/notification-center.css +14 -0
  41. package/styles/components/page-header.css +9 -0
  42. package/styles/components/pagination.css +14 -0
  43. package/styles/components/peek.css +46 -0
  44. package/styles/components/pipeline.css +9 -0
  45. package/styles/components/popover.css +11 -0
  46. package/styles/components/progress.css +12 -0
  47. package/styles/components/prose.css +27 -0
  48. package/styles/components/radio.css +20 -0
  49. package/styles/components/reactions.css +22 -0
  50. package/styles/components/segmented.css +12 -0
  51. package/styles/components/select.css +23 -0
  52. package/styles/components/sidebar.css +102 -0
  53. package/styles/components/sla.css +8 -0
  54. package/styles/components/slider.css +16 -0
  55. package/styles/components/spinner.css +10 -0
  56. package/styles/components/stat-tile.css +11 -0
  57. package/styles/components/states.css +13 -0
  58. package/styles/components/status-pill.css +37 -0
  59. package/styles/components/stepper.css +13 -0
  60. package/styles/components/steps.css +18 -0
  61. package/styles/components/switch.css +19 -0
  62. package/styles/components/table-toolbar.css +20 -0
  63. package/styles/components/table.css +160 -0
  64. package/styles/components/tabs.css +31 -0
  65. package/styles/components/tag-input.css +16 -0
  66. package/styles/components/textarea.css +15 -0
  67. package/styles/components/timeline.css +11 -0
  68. package/styles/components/toast.css +21 -0
  69. package/styles/components/tooltip.css +35 -0
  70. package/styles/components/tree.css +17 -0
  71. package/styles/components/typography.css +45 -0
  72. package/styles/components/utility-bits.css +14 -0
  73. package/styles/components/view-menu.css +14 -0
  74. package/styles/motion.css +35 -0
  75. package/styles/utilities.css +26 -0
@@ -0,0 +1,12 @@
1
+ /* uix progress bar + ring — depends only on --uix-* tokens. */
2
+ @layer uix.components {
3
+ .uix-progress { height: 8px; background: var(--uix-bg-active); border-radius: var(--uix-radius-pill); overflow: hidden; }
4
+ .uix-progress__bar { height: 100%; background: var(--uix-accent); border-radius: inherit; transition: width var(--uix-dur) var(--uix-ease-out); }
5
+ .uix-progress--indeterminate { position: relative; }
6
+ .uix-progress--indeterminate .uix-progress__bar { width: 40%; animation: uix-progress-slide 1.2s var(--uix-ease-in-out) infinite; }
7
+ @keyframes uix-progress-slide { 0% { transform: translateX(-110%); } 100% { transform: translateX(280%); } }
8
+
9
+ .uix-ring { width: 44px; height: 44px; border-radius: 50%; display: grid; place-items: center;
10
+ background: conic-gradient(var(--uix-accent) calc(var(--val, .66) * 360deg), var(--uix-bg-active) 0); }
11
+ .uix-ring__inner { width: 32px; height: 32px; border-radius: 50%; background: var(--uix-surface); display: grid; place-items: center; font-size: var(--uix-text-meta); font-weight: 600; }
12
+ }
@@ -0,0 +1,27 @@
1
+ /* uix prose content card + note callouts — for KB articles, descriptions, release notes. Depends only on --uix-* tokens. */
2
+ @layer uix.components {
3
+ .uix-prose { max-width: 66ch; color: var(--uix-text); }
4
+ .uix-prose > * + * { margin-top: var(--uix-space-3); }
5
+ .uix-prose h3 { font-size: var(--uix-text-h2); font-weight: 600; }
6
+ .uix-prose h4 { font-size: var(--uix-text-h3); font-weight: 600; margin-top: var(--uix-space-5); }
7
+ .uix-prose p { line-height: var(--uix-leading-body); color: var(--uix-text-hushed); }
8
+ .uix-prose a { color: var(--uix-link); }
9
+ .uix-prose ul, .uix-prose ol { padding-left: var(--uix-space-5); }
10
+ .uix-prose li + li { margin-top: var(--uix-space-1); }
11
+ .uix-prose code { font-family: var(--uix-font-mono); font-size: .9em; background: var(--uix-bg-subtle); padding: 1px var(--uix-space-2); border-radius: var(--uix-radius-xs); }
12
+ .uix-prose blockquote { border-left: 3px solid var(--uix-border-strong); padding-left: var(--uix-space-3); color: var(--uix-text-muted); }
13
+
14
+ .uix-note { display: flex; gap: var(--uix-space-3); padding: var(--uix-space-3) var(--uix-space-4); border-radius: var(--uix-radius-md); border: 1px solid var(--uix-border); background: var(--uix-surface); }
15
+ .uix-note__icon { flex: none; }
16
+ .uix-note__icon svg { width: var(--uix-icon-md); height: var(--uix-icon-md); }
17
+ .uix-note__body { font-size: var(--uix-text-body); color: var(--uix-text); }
18
+ .uix-note__body > * + * { margin-top: var(--uix-space-2); }
19
+ .uix-note--info { background: var(--uix-info-bg); border-color: color-mix(in srgb, var(--uix-info) 30%, transparent); }
20
+ .uix-note--info .uix-note__icon { color: var(--uix-info); }
21
+ .uix-note--success { background: var(--uix-success-bg); border-color: color-mix(in srgb, var(--uix-success) 30%, transparent); }
22
+ .uix-note--success .uix-note__icon { color: var(--uix-success); }
23
+ .uix-note--warning { background: var(--uix-warning-bg); border-color: color-mix(in srgb, var(--uix-warning) 30%, transparent); }
24
+ .uix-note--warning .uix-note__icon { color: var(--uix-warning); }
25
+ .uix-note--danger { background: var(--uix-danger-bg); border-color: color-mix(in srgb, var(--uix-danger) 30%, transparent); }
26
+ .uix-note--danger .uix-note__icon { color: var(--uix-danger); }
27
+ }
@@ -0,0 +1,20 @@
1
+ /* uix radio + radio-group — depends only on --uix-* tokens. */
2
+ @layer uix.components {
3
+ .uix-radio-group { display: flex; flex-direction: column; gap: var(--uix-space-2); }
4
+ .uix-radio { display: inline-flex; align-items: center; gap: var(--uix-space-2); cursor: pointer; font-size: var(--uix-text-body); color: var(--uix-text); }
5
+ .uix-radio > input { position: absolute; opacity: 0; width: 1px; height: 1px; }
6
+ .uix-radio__dot {
7
+ width: 18px; height: 18px; flex: none; border-radius: 50%;
8
+ border: 1px solid var(--uix-border-strong); background: var(--uix-surface);
9
+ display: grid; place-items: center;
10
+ transition: border-color var(--uix-dur-fast) var(--uix-ease-out);
11
+ }
12
+ .uix-radio__dot::after {
13
+ content: ""; width: 8px; height: 8px; border-radius: 50%; background: var(--uix-accent);
14
+ opacity: 0; transform: scale(.4); transition: opacity var(--uix-dur-fast) var(--uix-ease-out), transform var(--uix-dur-fast) var(--uix-ease-spring);
15
+ }
16
+ .uix-radio > input:checked + .uix-radio__dot { border-color: var(--uix-accent); }
17
+ .uix-radio > input:checked + .uix-radio__dot::after { opacity: 1; transform: none; }
18
+ .uix-radio > input:focus-visible + .uix-radio__dot { outline: 2px solid var(--uix-ring); outline-offset: 2px; }
19
+ .uix-radio > input:disabled ~ * { opacity: .5; }
20
+ }
@@ -0,0 +1,22 @@
1
+ /* uix emoji reactions — pills with counts + an add-reaction picker popover. Depends only on --uix-* tokens. */
2
+ @layer uix.components {
3
+ .uix-reactions { display: flex; flex-wrap: wrap; align-items: center; gap: var(--uix-space-2); margin-top: var(--uix-space-2); }
4
+ .uix-reaction {
5
+ display: inline-flex; align-items: center; gap: var(--uix-space-2); padding: 1px var(--uix-space-2); line-height: 1.7;
6
+ border-radius: var(--uix-radius-pill); border: 1px solid var(--uix-border); background: var(--uix-surface);
7
+ color: var(--uix-text-hushed); font: inherit; font-size: var(--uix-text-meta); cursor: pointer;
8
+ }
9
+ .uix-reaction:hover { border-color: var(--uix-border-strong); }
10
+ .uix-reaction[data-mine] { background: var(--uix-brand-muted); border-color: var(--uix-accent); color: var(--uix-accent); }
11
+ .uix-reaction__count { font-variant-numeric: tabular-nums; }
12
+ .uix-reaction-add {
13
+ display: inline-flex; align-items: center; justify-content: center; width: 30px; height: 24px;
14
+ border-radius: var(--uix-radius-pill); border: 1px dashed var(--uix-border-strong); background: transparent;
15
+ color: var(--uix-text-muted); cursor: pointer;
16
+ }
17
+ .uix-reaction-add:hover { color: var(--uix-text); border-color: var(--uix-text-muted); }
18
+ .uix-reaction-add svg { width: var(--uix-icon-sm); height: var(--uix-icon-sm); }
19
+ .uix-emoji-picker { display: flex; flex-wrap: wrap; gap: var(--uix-space-1); width: 196px; }
20
+ .uix-emoji-picker__btn { font-size: 18px; line-height: 1; padding: var(--uix-space-2); border: 0; background: transparent; border-radius: var(--uix-radius-sm); cursor: pointer; }
21
+ .uix-emoji-picker__btn:hover { background: var(--uix-bg-hover); }
22
+ }
@@ -0,0 +1,12 @@
1
+ /* uix segmented control — depends only on --uix-* tokens. */
2
+ @layer uix.components {
3
+ .uix-segmented { display: inline-flex; padding: var(--uix-space-1); gap: var(--uix-space-1); background: var(--uix-bg-subtle); border: 1px solid var(--uix-border); border-radius: var(--uix-radius-md); }
4
+ .uix-segmented__option {
5
+ border: 0; background: transparent; color: var(--uix-text-hushed); font: inherit; font-size: var(--uix-text-meta); font-weight: 500;
6
+ padding: var(--uix-space-2) var(--uix-space-3); border-radius: calc(var(--uix-radius-md) - 3px); cursor: pointer;
7
+ transition: background-color var(--uix-dur-fast) var(--uix-ease-out), color var(--uix-dur-fast) var(--uix-ease-out);
8
+ }
9
+ .uix-segmented__option:hover { color: var(--uix-text); }
10
+ .uix-segmented__option[aria-selected="true"], .uix-segmented__option[aria-pressed="true"] { background: var(--uix-surface); color: var(--uix-text); box-shadow: var(--uix-shadow-sm); }
11
+ .uix-segmented__option:focus-visible { outline: 2px solid var(--uix-ring); outline-offset: 1px; }
12
+ }
@@ -0,0 +1,23 @@
1
+ /* uix select (native, styled) — depends only on --uix-* tokens. */
2
+ @layer uix.components {
3
+ .uix-select {
4
+ height: var(--uix-control-h); width: 100%; padding: 0 var(--uix-space-8) 0 var(--uix-space-3); appearance: none;
5
+ border: 1px solid var(--uix-border); border-radius: var(--uix-radius-md);
6
+ background-color: var(--uix-surface); color: var(--uix-text); font: inherit; font-size: var(--uix-text-body); cursor: pointer;
7
+ background-repeat: no-repeat; background-position: right 12px center;
8
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23737373' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
9
+ transition: border-color var(--uix-dur-fast) var(--uix-ease-out), box-shadow var(--uix-dur-fast) var(--uix-ease-out);
10
+ }
11
+ .uix-select:hover { border-color: var(--uix-border-strong); }
12
+ .uix-select:focus { outline: none; border-color: var(--uix-ring); box-shadow: 0 0 0 3px var(--uix-brand-muted); }
13
+ .uix-select:disabled { opacity: .55; cursor: not-allowed; background-color: var(--uix-bg-subtle); }
14
+ .uix-select--sm { height: 28px; font-size: var(--uix-text-meta); }
15
+
16
+ /* command-palette-style rich select: a trigger that opens a .uix-cmdk popover (search + options) */
17
+ .uix-select-trigger { display: inline-flex; align-items: center; gap: var(--uix-space-2); height: var(--uix-control-h); padding: 0 var(--uix-space-3); min-width: 220px;
18
+ border: 1px solid var(--uix-border); border-radius: var(--uix-radius-md); background: var(--uix-surface); color: var(--uix-text);
19
+ font: inherit; font-size: var(--uix-text-body); cursor: pointer; transition: border-color var(--uix-dur-fast) var(--uix-ease-out); }
20
+ .uix-select-trigger:hover { border-color: var(--uix-border-strong); }
21
+ .uix-select-trigger:focus-visible { outline: 2px solid var(--uix-ring); outline-offset: 2px; }
22
+ .uix-select-trigger__chevron { margin-left: auto; color: var(--uix-text-muted); width: var(--uix-icon-sm); height: var(--uix-icon-sm); }
23
+ }
@@ -0,0 +1,102 @@
1
+ /* uix sidebar nav — items, favorites, collapsible sub-items, collapsed rail. Depends only on --uix-* tokens. */
2
+ @layer uix.components {
3
+ .uix-sidebar { width: var(--uix-sidebar-w); background: var(--uix-bg-subtle); display: flex; flex-direction: column; gap: var(--uix-space-1); padding: var(--uix-space-2); overflow-x: hidden; overflow-y: auto; }
4
+ .uix-sidebar__eyebrow {
5
+ font-size: var(--uix-text-eyebrow); letter-spacing: var(--uix-tracking-eyebrow); text-transform: uppercase;
6
+ color: var(--uix-text-muted); padding: var(--uix-space-3) var(--uix-space-3) var(--uix-space-1);
7
+ }
8
+
9
+ /* brand header */
10
+ .uix-sidebar__head { display: flex; align-items: center; justify-content: space-between; gap: var(--uix-space-2); padding: var(--uix-space-1) var(--uix-space-2) var(--uix-space-2); }
11
+ .uix-sidebar__brand { min-width: 0; font-size: var(--uix-text-h3); font-weight: 700; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
12
+ .uix-sidebar__toggle {
13
+ display: grid; place-items: center; width: 28px; height: 28px; flex: none;
14
+ border: 0; background: transparent; color: var(--uix-text-muted); cursor: pointer; border-radius: var(--uix-radius-sm);
15
+ transition: background-color var(--uix-dur-fast) var(--uix-ease-out), color var(--uix-dur-fast) var(--uix-ease-out);
16
+ }
17
+ .uix-sidebar__toggle:hover { background: var(--uix-bg-hover); color: var(--uix-text); }
18
+ .uix-sidebar__toggle svg { width: 18px; height: 18px; }
19
+
20
+ .uix-navitem {
21
+ display: flex; align-items: center; gap: var(--uix-space-3); height: 36px; padding: 0 var(--uix-space-3);
22
+ border-radius: var(--uix-radius-sm); color: var(--uix-text-hushed); cursor: pointer; text-decoration: none;
23
+ border: 0; background: transparent; font: inherit; font-size: var(--uix-text-body); width: 100%; text-align: left;
24
+ transition: background-color var(--uix-dur-fast) var(--uix-ease-out), color var(--uix-dur-fast) var(--uix-ease-out);
25
+ }
26
+ .uix-navitem:hover { background: var(--uix-bg-hover); color: var(--uix-text); text-decoration: none; }
27
+ /* active uses --uix-link (the brightened-on-dark accent) not raw --uix-accent: the deep accent
28
+ fails AA as text on the brand-muted tint in dark; link reads legibly in both themes. */
29
+ .uix-navitem[aria-current="page"] { background: var(--uix-brand-muted); color: var(--uix-link); font-weight: 500; }
30
+ .uix-navitem__icon { width: var(--uix-icon-md); height: var(--uix-icon-md); flex: none; }
31
+ .uix-navitem__label { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
32
+ .uix-navitem__badge { font-size: var(--uix-text-meta); color: var(--uix-text-muted); }
33
+ /* on the active tint, muted badge dips below AA — hushed composites darker on the tint */
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); }
36
+ .uix-navitem__star svg { width: 15px; height: 15px; }
37
+ .uix-navitem:hover .uix-navitem__star { opacity: 1; }
38
+ .uix-navitem__star[data-on] { opacity: 1; color: var(--uix-warning); }
39
+ .uix-navitem__star[data-on] svg { fill: currentColor; }
40
+
41
+ /* controlled favourites disclosure */
42
+ .uix-favourites { margin-bottom: var(--uix-space-1); }
43
+ .uix-favourites__chevron { flex-shrink: 0; }
44
+ .uix-favourites__heading {
45
+ display: flex; width: 100%; align-items: center; gap: calc(var(--uix-space-1) * 1.5);
46
+ padding: var(--uix-space-2) var(--uix-space-1) var(--uix-space-1);
47
+ border: 0; background: transparent; cursor: pointer; color: inherit;
48
+ }
49
+ .uix-favourites__list { display: flex; flex-direction: column; gap: calc(var(--uix-space-1) / 4); list-style: none; margin: 0; padding: 0; }
50
+ .uix-favourites__empty { padding: calc(var(--uix-space-1) * 1.5) var(--uix-space-2); color: color-mix(in srgb, var(--uix-text) 50%, transparent); }
51
+ .uix-favourites__row { position: relative; display: flex; align-items: center; }
52
+ .uix-favourites__link { min-width: 0; flex: 1; }
53
+ .uix-favourites__menu-trigger {
54
+ margin-left: auto; display: inline-flex; height: 20px; width: 20px; flex-shrink: 0;
55
+ align-items: center; justify-content: center; border: 0; border-radius: calc(var(--uix-radius-xs) / 2);
56
+ background: transparent; cursor: pointer; color: color-mix(in srgb, var(--uix-text) 50%, transparent);
57
+ opacity: 0; transition: opacity var(--uix-dur-fast) var(--uix-ease-out);
58
+ }
59
+ .uix-favourites__row:hover .uix-favourites__menu-trigger,
60
+ .uix-favourites__row:focus-within .uix-favourites__menu-trigger,
61
+ .uix-favourites__menu-trigger[aria-expanded="true"] { opacity: 1; }
62
+ .uix-favourites__backdrop { position: fixed; inset: 0; cursor: default; background: transparent; z-index: calc(var(--uix-z-tooltip) + 10); }
63
+ .uix-favourites__menu {
64
+ position: absolute; right: 0; top: calc(100% + 2px); z-index: calc(var(--uix-z-tooltip) + 20); min-width: 160px;
65
+ overflow: hidden; margin: 0; padding: var(--uix-space-1) 0; list-style: none;
66
+ border-radius: calc((var(--uix-radius-xs) + var(--uix-radius-sm)) / 2);
67
+ border: 1px solid var(--uix-border); background: var(--uix-surface); box-shadow: var(--uix-shadow-popover);
68
+ }
69
+ .uix-favourites__menu-item {
70
+ display: flex; width: 100%; align-items: center;
71
+ padding: calc(var(--uix-space-1) * 1.5) var(--uix-space-3); border: 0;
72
+ background: transparent; cursor: pointer; text-align: left;
73
+ font-size: calc(var(--uix-text-body) * 0.9285714286);
74
+ color: color-mix(in srgb, var(--uix-text) 85%, transparent);
75
+ transition: background-color var(--uix-dur-fast) var(--uix-ease-out);
76
+ }
77
+ .uix-favourites__menu-item:hover { background: var(--uix-bg-hover); }
78
+
79
+ /* collapsible group */
80
+ .uix-navgroup { }
81
+ .uix-navgroup__trigger .uix-navgroup__chevron { margin-left: auto; transition: transform var(--uix-dur) var(--uix-ease-out); }
82
+ .uix-navgroup__trigger[aria-expanded="false"] .uix-navgroup__chevron { transform: rotate(-90deg); }
83
+ .uix-navgroup__chevron { width: var(--uix-icon-sm); height: var(--uix-icon-sm); }
84
+ .uix-navgroup__panel { display: grid; grid-template-rows: 1fr; transition: grid-template-rows var(--uix-dur) var(--uix-ease-out); }
85
+ .uix-navgroup__trigger[aria-expanded="false"] + .uix-navgroup__panel { grid-template-rows: 0fr; }
86
+ .uix-navgroup__panel > div { overflow: hidden; }
87
+ .uix-subitem { padding-left: var(--uix-space-5); }
88
+ .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
+
90
+ /* collapsed rail */
91
+ .uix-sidebar[data-collapsed], .uix-sidebar[data-nav="rail"] { width: var(--uix-sidebar-w-rail); }
92
+ .uix-sidebar[data-collapsed] .uix-navitem__label,
93
+ .uix-sidebar[data-collapsed] .uix-navitem__badge,
94
+ .uix-sidebar[data-collapsed] .uix-navitem__star,
95
+ .uix-sidebar[data-collapsed] .uix-sidebar__eyebrow,
96
+ .uix-sidebar[data-collapsed] .uix-sidebar__brand,
97
+ .uix-sidebar[data-collapsed] .uix-navgroup__chevron,
98
+ .uix-sidebar[data-collapsed] .uix-navgroup__panel { display: none; }
99
+ /* center the icon-only rail; head keeps just the toggle, centered */
100
+ .uix-sidebar[data-collapsed] .uix-navitem { justify-content: center; padding: 0; gap: 0; }
101
+ .uix-sidebar[data-collapsed] .uix-sidebar__head { justify-content: center; padding-inline: 0; }
102
+ }
@@ -0,0 +1,8 @@
1
+ /* uix SLA indicator / timer (breach states) — depends only on --uix-* tokens. */
2
+ @layer uix.components {
3
+ .uix-sla { display: inline-flex; align-items: center; gap: var(--uix-space-2); font-size: var(--uix-text-meta); font-weight: 500; color: var(--uix-text-hushed); }
4
+ .uix-sla svg { width: 14px; height: 14px; }
5
+ .uix-sla[data-state="ok"] { color: var(--uix-success); }
6
+ .uix-sla[data-state="at-risk"] { color: var(--uix-warning-text); }
7
+ .uix-sla[data-state="breach"] { color: var(--uix-danger-text); }
8
+ }
@@ -0,0 +1,16 @@
1
+ /* uix slider (native range, styled) — depends only on --uix-* tokens. */
2
+ @layer uix.components {
3
+ .uix-slider { -webkit-appearance: none; appearance: none; width: 220px; height: 20px; background: transparent; cursor: pointer; }
4
+ .uix-slider::-webkit-slider-runnable-track { height: 6px; border-radius: var(--uix-radius-pill); background: var(--uix-bg-active); }
5
+ .uix-slider::-moz-range-track { height: 6px; border-radius: var(--uix-radius-pill); background: var(--uix-bg-active); }
6
+ .uix-slider::-moz-range-progress { height: 6px; border-radius: var(--uix-radius-pill); background: var(--uix-accent); }
7
+ .uix-slider::-webkit-slider-thumb {
8
+ -webkit-appearance: none; appearance: none; margin-top: -6px; width: 18px; height: 18px; border-radius: 50%;
9
+ background: var(--uix-surface); border: 2px solid var(--uix-accent); box-shadow: var(--uix-shadow-sm);
10
+ transition: transform var(--uix-dur-fast) var(--uix-ease-out);
11
+ }
12
+ .uix-slider::-moz-range-thumb { width: 18px; height: 18px; border: 2px solid var(--uix-accent); border-radius: 50%; background: var(--uix-surface); box-shadow: var(--uix-shadow-sm); }
13
+ .uix-slider:active::-webkit-slider-thumb { transform: scale(1.12); }
14
+ .uix-slider:focus-visible::-webkit-slider-thumb { outline: 2px solid var(--uix-ring); outline-offset: 2px; }
15
+ .uix-slider:disabled { opacity: .5; cursor: not-allowed; }
16
+ }
@@ -0,0 +1,10 @@
1
+ /* uix spinner + progress overlay — depends only on --uix-* tokens. */
2
+ @layer uix.components {
3
+ .uix-spinner { width: 20px; height: 20px; border: 2px solid var(--uix-border-strong); border-right-color: transparent; border-radius: 50%; display: inline-block; animation: uix-spin .6s linear infinite; }
4
+ .uix-spinner--accent { border-color: var(--uix-accent); border-right-color: transparent; }
5
+ .uix-spinner--lg { width: 32px; height: 32px; border-width: 3px; }
6
+ .uix-overlay-progress {
7
+ position: absolute; inset: 0; display: grid; place-items: center; border-radius: inherit;
8
+ background: color-mix(in srgb, var(--uix-bg-app) 60%, transparent); backdrop-filter: blur(2px);
9
+ }
10
+ }
@@ -0,0 +1,11 @@
1
+ /* uix KPI / stat tile — depends only on --uix-* tokens. */
2
+ @layer uix.components {
3
+ .uix-stat { background: var(--uix-surface); border: 1px solid var(--uix-border); border-radius: var(--uix-radius-lg); padding: var(--uix-space-6); }
4
+ .uix-stat__label { font-size: var(--uix-text-eyebrow); letter-spacing: var(--uix-tracking-eyebrow); text-transform: uppercase; color: var(--uix-text-muted); display: flex; align-items: center; justify-content: space-between; gap: var(--uix-space-2); }
5
+ .uix-stat__label svg { width: var(--uix-icon-md); height: var(--uix-icon-md); }
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
+ .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
+ .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
+ .uix-stat__trend--up { color: var(--uix-success); background: var(--uix-success-bg); }
10
+ .uix-stat__trend--down { color: var(--uix-danger-text); background: var(--uix-danger-bg); }
11
+ }
@@ -0,0 +1,13 @@
1
+ /* uix states — empty + skeleton loaders. Depends only on --uix-* tokens. */
2
+ @layer uix.components {
3
+ .uix-empty { display: flex; flex-direction: column; align-items: center; gap: var(--uix-space-3); text-align: center; padding: var(--uix-space-8); color: var(--uix-text-muted); }
4
+ .uix-empty__icon { width: 44px; height: 44px; display: grid; place-items: center; border-radius: 50%; background: var(--uix-bg-subtle); color: var(--uix-text-muted); }
5
+ .uix-empty__icon svg { width: 22px; height: 22px; }
6
+ .uix-empty__title { font-size: var(--uix-text-h3); font-weight: 600; color: var(--uix-text); }
7
+ /* error tone — ErrorState reuses .uix-empty with a danger-toned icon */
8
+ .uix-empty__icon--danger { background: var(--uix-danger-bg); color: var(--uix-danger); }
9
+
10
+ .uix-skeleton { background: linear-gradient(90deg, var(--uix-bg-subtle) 25%, var(--uix-bg-hover) 50%, var(--uix-bg-subtle) 75%); background-size: 200% 100%; animation: uix-shimmer 1.4s linear infinite; border-radius: var(--uix-radius-sm); }
11
+ .uix-skeleton--text { height: 12px; border-radius: var(--uix-radius-pill); }
12
+ .uix-skeleton--circle { border-radius: 50%; }
13
+ }
@@ -0,0 +1,37 @@
1
+ /* uix status pill — tone API (status / priority / SLA). Depends only on --uix-* tokens. */
2
+ @layer uix.components {
3
+ .uix-pill {
4
+ display: inline-flex; align-items: center; gap: var(--uix-space-2); padding: var(--uix-space-1) var(--uix-space-3); border-radius: var(--uix-radius-pill);
5
+ font-size: var(--uix-text-meta); font-weight: 500; line-height: 1.4;
6
+ background: var(--tone-bg, var(--uix-bg-active)); color: var(--tone-fg, var(--uix-text-hushed));
7
+ }
8
+ .uix-pill__dot { width: 7px; height: 7px; border-radius: 50%; background: var(--tone-dot, currentColor); flex: none; }
9
+ .uix-pill--neutral { --tone-bg: var(--uix-bg-active); --tone-fg: var(--uix-text-hushed); --tone-dot: var(--uix-text-muted); }
10
+ .uix-pill--success { --tone-bg: var(--uix-success-bg); --tone-fg: var(--uix-success); --tone-dot: var(--uix-success); }
11
+ .uix-pill--info { --tone-bg: var(--uix-info-bg); --tone-fg: var(--uix-info-text); --tone-dot: var(--uix-info); }
12
+ .uix-pill--warning { --tone-bg: var(--uix-warning-bg); --tone-fg: var(--uix-warning-text); --tone-dot: var(--uix-warning); }
13
+ .uix-pill--danger { --tone-bg: var(--uix-danger-bg); --tone-fg: var(--uix-danger-text); --tone-dot: var(--uix-danger); }
14
+ /* critical = the one SOLID fill (most urgent); muted = a quiet, chrome-less label */
15
+ .uix-pill--critical { --tone-bg: var(--uix-danger); --tone-fg: var(--uix-danger-fg); --tone-dot: var(--uix-danger-fg); }
16
+ .uix-pill--muted { --tone-bg: transparent; --tone-fg: var(--uix-text-muted); --tone-dot: var(--uix-text-muted); }
17
+ /* time-pressure tones (U1 tokens — distinct from severity and validation-error) */
18
+ .uix-pill--attention { --tone-bg: var(--uix-attention-bg); --tone-fg: var(--uix-attention-text); --tone-dot: var(--uix-attention); }
19
+ .uix-pill--overdue { --tone-bg: var(--uix-overdue-bg); --tone-fg: var(--uix-overdue-text); --tone-dot: var(--uix-overdue); }
20
+ /* SLA tones — ok=success, at-risk=attention, breached=overdue */
21
+ .uix-pill--sla-ok { --tone-bg: var(--uix-success-bg); --tone-fg: var(--uix-success); --tone-dot: var(--uix-success); }
22
+ .uix-pill--sla-at-risk { --tone-bg: var(--uix-attention-bg); --tone-fg: var(--uix-attention-text); --tone-dot: var(--uix-attention); }
23
+ .uix-pill--sla-breached { --tone-bg: var(--uix-overdue-bg); --tone-fg: var(--uix-overdue-text); --tone-dot: var(--uix-overdue); }
24
+ /* Priority/severity tones — P1=danger, P2=warning, P3=amber, P4=info, P5=neutral (complete 5-tier ramp) */
25
+ .uix-pill--p1 { --tone-bg: var(--uix-danger-bg); --tone-fg: var(--uix-danger-text); --tone-dot: var(--uix-danger); }
26
+ .uix-pill--p2 { --tone-bg: var(--uix-warning-bg); --tone-fg: var(--uix-warning-text); --tone-dot: var(--uix-warning); }
27
+ .uix-pill--p3 { --tone-bg: var(--uix-amber-bg); --tone-fg: var(--uix-amber-text); --tone-dot: var(--uix-amber); }
28
+ .uix-pill--p4 { --tone-bg: var(--uix-info-bg); --tone-fg: var(--uix-info-text); --tone-dot: var(--uix-info); }
29
+ .uix-pill--p5 { --tone-bg: var(--uix-bg-active); --tone-fg: var(--uix-text-hushed); --tone-dot: var(--uix-text-muted); }
30
+
31
+ /* outline treatment — transparent fill, tone-tinted border, tone-colored text. The border tints
32
+ the tone hue (--tone-fg) at 40%; neutral/muted use the structural borders, critical reads strongest. */
33
+ .uix-pill--outline { background: transparent; border: 1px solid var(--tone-line, color-mix(in srgb, var(--tone-fg) 40%, transparent)); }
34
+ .uix-pill--outline.uix-pill--neutral { --tone-line: var(--uix-border-strong); }
35
+ .uix-pill--outline.uix-pill--muted { --tone-line: var(--uix-border); }
36
+ .uix-pill--outline.uix-pill--critical { color: var(--uix-danger-text); --tone-dot: var(--uix-danger); --tone-line: color-mix(in srgb, var(--uix-danger) 60%, transparent); }
37
+ }
@@ -0,0 +1,13 @@
1
+ /* uix number stepper — depends only on --uix-* tokens. */
2
+ @layer uix.components {
3
+ .uix-stepper { display: inline-flex; align-items: center; height: var(--uix-control-h); overflow: hidden;
4
+ border: 1px solid var(--uix-border); border-radius: var(--uix-radius-md); background: var(--uix-surface); }
5
+ .uix-stepper__btn { width: 32px; align-self: stretch; border: 0; background: transparent; color: var(--uix-text); cursor: pointer;
6
+ display: grid; place-items: center; transition: background-color var(--uix-dur-fast) var(--uix-ease-out); }
7
+ .uix-stepper__btn:hover { background: var(--uix-bg-hover); }
8
+ .uix-stepper__btn svg { width: var(--uix-icon-sm); height: var(--uix-icon-sm); }
9
+ .uix-stepper__input { width: 52px; text-align: center; border: 0; height: 100%; background: transparent; color: var(--uix-text);
10
+ font: inherit; border-inline: 1px solid var(--uix-border); -moz-appearance: textfield; }
11
+ .uix-stepper__input::-webkit-outer-spin-button, .uix-stepper__input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
12
+ .uix-stepper:focus-within { border-color: var(--uix-ring); box-shadow: 0 0 0 3px var(--uix-brand-muted); }
13
+ }
@@ -0,0 +1,18 @@
1
+ /* uix steps / wizard — depends only on --uix-* tokens. */
2
+ @layer uix.components {
3
+ .uix-steps { display: flex; align-items: center; gap: 0; }
4
+ .uix-step { display: flex; align-items: center; gap: var(--uix-space-3); color: var(--uix-text-muted); }
5
+ .uix-step__marker {
6
+ width: 26px; height: 26px; flex: none; border-radius: 50%; display: grid; place-items: center;
7
+ border: 1px solid var(--uix-border-strong); background: var(--uix-surface); font-size: var(--uix-text-meta); font-weight: 600;
8
+ line-height: 1; /* hug the glyph so place-items:center truly centers single digits/symbols */
9
+ }
10
+ .uix-step__label { font-size: var(--uix-text-meta); font-weight: 500; }
11
+ .uix-step__connector { flex: 1; height: 1px; min-width: 28px; background: var(--uix-border); margin: 0 var(--uix-space-3); }
12
+ .uix-step[data-state="active"] { color: var(--uix-text); }
13
+ .uix-step[data-state="active"] .uix-step__marker { border-color: var(--uix-accent); color: var(--uix-accent); box-shadow: 0 0 0 3px var(--uix-brand-muted); }
14
+ .uix-step[data-state="done"] { color: var(--uix-text); }
15
+ .uix-step[data-state="done"] .uix-step__marker { background: var(--uix-accent); border-color: var(--uix-accent); color: var(--uix-accent-fg); }
16
+ .uix-step[data-state="done"] + .uix-step__connector,
17
+ .uix-step__connector[data-done] { background: var(--uix-accent); }
18
+ }
@@ -0,0 +1,19 @@
1
+ /* uix switch — depends only on --uix-* tokens. */
2
+ @layer uix.components {
3
+ .uix-switch { display: inline-flex; align-items: center; gap: var(--uix-space-2); cursor: pointer; color: var(--uix-text); font-size: var(--uix-text-body); }
4
+ .uix-switch > input { position: absolute; opacity: 0; width: 1px; height: 1px; }
5
+ .uix-switch__track {
6
+ width: 36px; height: 20px; flex: none; border-radius: var(--uix-radius-pill);
7
+ background: var(--uix-bg-active); position: relative;
8
+ transition: background-color var(--uix-dur) var(--uix-ease-out);
9
+ }
10
+ .uix-switch__track::after {
11
+ content: ""; position: absolute; top: 2px; left: 2px; width: 16px; height: 16px; border-radius: 50%;
12
+ background: var(--uix-text-reverse); box-shadow: var(--uix-shadow-sm);
13
+ transition: transform var(--uix-dur) var(--uix-ease-out);
14
+ }
15
+ .uix-switch > input:checked + .uix-switch__track { background: var(--uix-accent); }
16
+ .uix-switch > input:checked + .uix-switch__track::after { transform: translateX(16px); }
17
+ .uix-switch > input:focus-visible + .uix-switch__track { outline: 2px solid var(--uix-ring); outline-offset: 2px; }
18
+ .uix-switch > input:disabled + .uix-switch__track { opacity: .5; }
19
+ }
@@ -0,0 +1,20 @@
1
+ /* uix table toolbar + two-row filter bar (status / type). Depends only on --uix-* tokens. */
2
+ @layer uix.components {
3
+ .uix-toolbar { display: flex; flex-wrap: wrap; align-items: center; gap: var(--uix-space-2); margin-bottom: var(--uix-space-3); }
4
+ .uix-toolbar__spacer { flex: 1; }
5
+
6
+ /* responsive: the status + type groups sit on ONE line when they fit, wrap to two only when cramped */
7
+ .uix-filterbar { display: flex; flex-wrap: wrap; gap: var(--uix-space-2) var(--uix-space-5); margin-bottom: var(--uix-space-3); }
8
+ .uix-filterrow { display: flex; flex-wrap: wrap; align-items: center; gap: var(--uix-space-2); }
9
+ .uix-filterrow__label { font-size: var(--uix-text-meta); color: var(--uix-text-muted); width: 54px; flex: none; }
10
+
11
+ .uix-chip {
12
+ display: inline-flex; align-items: center; gap: var(--uix-space-2); padding: var(--uix-space-1) var(--uix-space-3); border-radius: var(--uix-radius-pill);
13
+ border: 1px solid var(--uix-border); background: var(--uix-surface); color: var(--uix-text-hushed);
14
+ font: inherit; font-size: var(--uix-text-meta); cursor: pointer;
15
+ transition: background-color var(--uix-dur-fast) var(--uix-ease-out), border-color var(--uix-dur-fast) var(--uix-ease-out), color var(--uix-dur-fast) var(--uix-ease-out);
16
+ }
17
+ .uix-chip:hover { border-color: var(--uix-border-strong); color: var(--uix-text); }
18
+ .uix-chip[data-on] { background: var(--uix-brand-muted); border-color: var(--uix-accent); color: var(--uix-accent); }
19
+ .uix-chip__count { font-variant-numeric: tabular-nums; opacity: .7; }
20
+ }
@@ -0,0 +1,160 @@
1
+ /* uix data table — zebra, sticky header, sort, selection, density, pinned rows,
2
+ column sizing, bulk actions, row actions, expandable rows, inline edit, resize,
3
+ search highlight, responsive ladder + compare. Depends only on --uix-* tokens. */
4
+ @layer uix.components {
5
+ .uix-table-wrap { overflow: auto; max-height: 460px; border: 1px solid var(--uix-border); border-radius: var(--uix-radius-lg); background: var(--uix-surface); }
6
+ .uix-table { width: 100%; border-collapse: separate; border-spacing: 0; font-size: var(--uix-text-body); }
7
+
8
+ .uix-table thead th {
9
+ position: sticky; top: 0; z-index: var(--uix-z-raised); background: var(--uix-surface); text-align: left;
10
+ font-size: var(--uix-text-meta); font-weight: 600; color: var(--uix-text-hushed);
11
+ padding: 0 var(--uix-space-4); height: 44px; border-bottom: 1px solid var(--uix-border); white-space: nowrap;
12
+ }
13
+ .uix-table th[data-sort] { cursor: pointer; user-select: none; }
14
+ .uix-table th[data-sort]:hover { color: var(--uix-text); }
15
+ .uix-table th[data-sort]::after { content: " ↕"; opacity: .35; }
16
+ .uix-table th[aria-sort="ascending"]::after { content: " ↑"; opacity: 1; color: var(--uix-accent); }
17
+ .uix-table th[aria-sort="descending"]::after { content: " ↓"; opacity: 1; color: var(--uix-accent); }
18
+ /* multi-column sort ordinal (⇧+click adds a secondary key) */
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
+
21
+ .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); }
23
+ .uix-table tbody tr:nth-child(even) { background: var(--uix-row-alt); }
24
+ .uix-table--no-zebra tbody tr, .uix-table--no-zebra tbody tr:nth-child(even) { background: var(--uix-row); }
25
+ .uix-table tbody tr[data-pinned] { background: var(--uix-row-pinned-bg); }
26
+ .uix-table tbody tr[aria-selected="true"] { background: var(--uix-row-selected-bg); }
27
+ .uix-table tbody tr:hover { background: var(--uix-bg-hover); }
28
+ .uix-table[data-density="compact"] td, .uix-table--compact td { height: var(--uix-row-h-compact); }
29
+ .uix-table[data-density="comfortable"] td { height: var(--uix-row-h-comfortable); }
30
+
31
+ .uix-table__pin { border: 0; background: transparent; color: var(--uix-text-muted); cursor: pointer; padding: var(--uix-space-1); border-radius: var(--uix-radius-xs); opacity: 0; transition: opacity var(--uix-dur-fast) var(--uix-ease-out); }
32
+ .uix-table tbody tr:hover .uix-table__pin, .uix-table__pin[data-on] { opacity: 1; }
33
+ .uix-table__pin:hover { background: var(--uix-bg-active); color: var(--uix-text); }
34
+ .uix-table__pin[data-on] { color: var(--uix-accent); }
35
+ .uix-table__pin svg { width: 15px; height: 15px; }
36
+ .uix-table__pin[data-on] svg { fill: currentColor; }
37
+
38
+ /* frozen first column (opt-in via .uix-table--pinned-col) */
39
+ .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
+ .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); }
42
+ .uix-table--pinned-col tbody tr:nth-child(even) td:first-child { background: var(--uix-row-alt); }
43
+ .uix-table--pinned-col.uix-table--no-zebra tbody tr td:first-child,
44
+ .uix-table--pinned-col.uix-table--no-zebra tbody tr:nth-child(even) td:first-child { background: var(--uix-row); }
45
+ .uix-table--pinned-col tbody tr[data-pinned] td:first-child { background: var(--uix-row-pinned-bg); }
46
+ .uix-table--pinned-col tbody tr[aria-selected="true"] td:first-child { background: var(--uix-row-selected-bg); }
47
+ .uix-table--pinned-col tbody tr:hover td:first-child { background: var(--uix-bg-hover); }
48
+
49
+ /* ── column sizing + cell behaviour (a shared vocabulary, not per-app px) ──────── */
50
+ .uix-table--fixed { table-layout: fixed; width: 100%; }
51
+ .uix-col--w-xs { width: var(--uix-col-w-xs); }
52
+ .uix-col--w-sm { width: var(--uix-col-w-sm); }
53
+ .uix-col--w-md { width: var(--uix-col-w-md); }
54
+ .uix-col--w-lg { width: var(--uix-col-w-lg); }
55
+ .uix-col--w-xl { width: var(--uix-col-w-xl); }
56
+ .uix-col--flex,
57
+ .uix-col--primary { width: auto; min-width: var(--uix-col-title-min); }
58
+ .uix-col--truncate { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
59
+ .uix-col--wrap { white-space: normal; overflow-wrap: anywhere; }
60
+ .uix-col--num { font-variant-numeric: tabular-nums; }
61
+ .uix-table th.uix-col--num, .uix-table td.uix-col--num { text-align: right; }
62
+
63
+ /* ── cell content vocabulary — a fixed set of renderers keeps tables consistent ── */
64
+ .uix-cell-strong { font-weight: 600; }
65
+ .uix-cell-sub { display: block; font-size: var(--uix-text-meta); color: var(--uix-text-muted); }
66
+ .uix-cell-mono { font-family: var(--uix-font-mono); font-size: var(--uix-text-meta); }
67
+
68
+ /* ── id cell — the canonical row click-through (row → peek, ↗ → full record) ───── */
69
+ .uix-id-cell__btn {
70
+ border: 0; background: transparent; cursor: pointer; padding: 0;
71
+ color: var(--uix-text); font: inherit;
72
+ display: inline-flex; align-items: center; gap: var(--uix-space-1); white-space: nowrap;
73
+ }
74
+ .uix-id-cell__btn:hover { color: var(--uix-accent); }
75
+ .uix-id-cell__btn:focus-visible { outline: 2px solid var(--uix-ring); outline-offset: 2px; border-radius: var(--uix-radius-xs); }
76
+ .uix-id-cell__arrow {
77
+ width: var(--uix-icon-sm); height: var(--uix-icon-sm); flex-shrink: 0; color: var(--uix-text-muted);
78
+ opacity: 0; transition: opacity var(--uix-dur-fast) var(--uix-ease-out);
79
+ }
80
+ .uix-table tbody tr:hover .uix-id-cell__arrow { opacity: 1; }
81
+
82
+ /* ── selection column + select-all ────────────────────────────────────────────── */
83
+ .uix-table th.uix-table__selcol, .uix-table td.uix-table__selcell { width: 44px; padding-left: var(--uix-space-3); padding-right: 0; text-align: center; }
84
+
85
+ /* contextual bulk-action bar — appears when >=1 row is selected */
86
+ .uix-bulkbar {
87
+ display: flex; align-items: center; gap: var(--uix-space-3);
88
+ padding: var(--uix-space-2) var(--uix-space-3); margin-bottom: var(--uix-space-3);
89
+ border: 1px solid var(--uix-accent); border-radius: var(--uix-radius-md);
90
+ background: var(--uix-brand-muted); color: var(--uix-text);
91
+ animation: uix-bulkbar-in var(--uix-dur) var(--uix-ease-out);
92
+ }
93
+ .uix-bulkbar[hidden] { display: none; }
94
+ .uix-bulkbar__count { font-size: var(--uix-text-meta); font-weight: 600; color: var(--uix-accent); font-variant-numeric: tabular-nums; }
95
+ .uix-bulkbar__spacer { flex: 1; }
96
+ @keyframes uix-bulkbar-in { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: none; } }
97
+ @media (prefers-reduced-motion: reduce) { .uix-bulkbar { animation: none; } }
98
+
99
+ /* ── row hover actions + kebab ─────────────────────────────────────────────────── */
100
+ .uix-table__actions { width: 84px; text-align: right; white-space: nowrap; }
101
+ .uix-rowact { border: 0; background: transparent; color: var(--uix-text-muted); cursor: pointer; padding: var(--uix-space-1); border-radius: var(--uix-radius-sm); opacity: 0; transition: opacity var(--uix-dur-fast) var(--uix-ease-out), background-color var(--uix-dur-fast) var(--uix-ease-out); }
102
+ .uix-rowact svg { width: 16px; height: 16px; display: block; }
103
+ .uix-table tbody tr:hover .uix-rowact, .uix-rowact:focus-visible, .uix-rowact[aria-expanded="true"] { opacity: 1; }
104
+ .uix-rowact:hover { background: var(--uix-bg-active); color: var(--uix-text); }
105
+
106
+ /* ── expandable inline row ─────────────────────────────────────────────────────── */
107
+ .uix-table__expand { border: 0; background: transparent; cursor: pointer; color: var(--uix-text-muted); padding: var(--uix-space-1); border-radius: var(--uix-radius-xs); display: inline-grid; place-items: center; }
108
+ .uix-table__expand svg { width: 16px; height: 16px; transition: transform var(--uix-dur-fast) var(--uix-ease-out); }
109
+ .uix-table__expand[aria-expanded="true"] svg { transform: rotate(90deg); }
110
+ .uix-table__expand:hover { background: var(--uix-bg-active); color: var(--uix-text); }
111
+ tr.uix-table__detail > td { background: var(--uix-bg-subtle); padding: 0 var(--uix-space-4); }
112
+ .uix-table__detail-inner { padding: var(--uix-space-4) var(--uix-space-1) var(--uix-space-5); display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: var(--uix-space-4) var(--uix-space-7); }
113
+ .uix-kv { font-size: var(--uix-text-meta); }
114
+ .uix-kv__k { color: var(--uix-text-muted); margin-bottom: var(--uix-space-1); }
115
+ .uix-kv__v { color: var(--uix-text); }
116
+ @media (prefers-reduced-motion: reduce) { .uix-table__expand svg { transition: none; } }
117
+
118
+ /* ── inline cell edit ──────────────────────────────────────────────────────────── */
119
+ .uix-cell-edit { display: inline-flex; align-items: center; gap: var(--uix-space-2); cursor: text; border-radius: var(--uix-radius-sm); padding: var(--uix-space-1) var(--uix-space-2); margin: calc(-1 * var(--uix-space-1)) calc(-1 * var(--uix-space-2)); transition: background-color var(--uix-dur-fast) var(--uix-ease-out), box-shadow var(--uix-dur-fast) var(--uix-ease-out); }
120
+ .uix-cell-edit:hover { background: var(--uix-bg-active); }
121
+ .uix-cell-edit__pencil { width: 13px; height: 13px; color: var(--uix-text-muted); opacity: 0; transition: opacity var(--uix-dur-fast) var(--uix-ease-out); }
122
+ .uix-table tbody tr:hover .uix-cell-edit__pencil { opacity: 1; }
123
+ .uix-cell-edit[data-editing] { background: var(--uix-surface); box-shadow: 0 0 0 2px var(--uix-ring); cursor: default; }
124
+ .uix-cell-edit__ok { color: var(--uix-success); width: 14px; height: 14px; opacity: 0; transition: opacity var(--uix-dur-fast) var(--uix-ease-out); }
125
+ .uix-cell-edit[data-saved] .uix-cell-edit__ok { opacity: 1; }
126
+ .uix-cell-edit input, .uix-cell-edit select { border: 0; background: transparent; font: inherit; color: inherit; outline: none; }
127
+
128
+ /* ── column resize grip (drag the header's right edge) ─────────────────────────── */
129
+ .uix-table__resize { position: absolute; top: 0; right: -3px; width: 8px; height: 100%; cursor: col-resize; z-index: var(--uix-z-raised); user-select: none; touch-action: none; }
130
+ .uix-table__resize::after { content: ""; position: absolute; top: 25%; right: 3px; width: 2px; height: 50%; background: transparent; border-radius: var(--uix-radius-pill); transition: background-color var(--uix-dur-fast) var(--uix-ease-out); }
131
+ .uix-table thead th:hover .uix-table__resize::after, .uix-table__resize[data-drag]::after { background: var(--uix-accent); }
132
+
133
+ /* ── search match highlight ────────────────────────────────────────────────────── */
134
+ .uix-mark { background: var(--uix-warning-bg); color: var(--uix-text); border-radius: var(--uix-radius-xs); padding: 0 0.15em; box-shadow: inset 0 -1px 0 color-mix(in srgb, var(--uix-warning) 60%, transparent); }
135
+
136
+ /* ── responsive ladder — priority-column drop, then card transform ─────────────── */
137
+ .uix-table--priority th[data-priority="low"], .uix-table--priority td[data-priority="low"] { display: none; }
138
+ .uix-table--priority-mid th[data-priority="low"], .uix-table--priority-mid td[data-priority="low"],
139
+ .uix-table--priority-mid th[data-priority="mid"], .uix-table--priority-mid td[data-priority="mid"] { display: none; }
140
+
141
+ .uix-table--cards { display: block; }
142
+ .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
+ .uix-table--cards tbody, .uix-table--cards tr, .uix-table--cards td { display: block; width: auto; }
144
+ .uix-table--cards tbody tr { border: 1px solid var(--uix-border); border-radius: var(--uix-radius-md); background: var(--uix-surface); margin: 0 0 var(--uix-space-3); padding: var(--uix-space-1) var(--uix-space-4); box-shadow: var(--uix-shadow-sm); }
145
+ .uix-table--cards tbody tr[aria-selected="true"] { box-shadow: 0 0 0 2px var(--uix-accent); }
146
+ .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
+ .uix-table--cards td:last-child { border-bottom: 0; }
148
+ .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; }
149
+ .uix-table--cards td[data-col="id"] { font-size: var(--uix-text-h3); font-weight: 600; border-bottom: 1px solid var(--uix-border); padding-bottom: var(--uix-space-3); }
150
+ .uix-table--cards td[data-col="id"]::before { display: none; }
151
+ .uix-table--cards td[data-col="select"], .uix-table--cards td[data-col="actions"], .uix-table--cards td[data-col="expand"] { display: none; }
152
+
153
+ /* ── compare view — two records field-by-field on a narrow screen ──────────────── */
154
+ .uix-compare { border: 1px solid var(--uix-border); border-radius: var(--uix-radius-lg); overflow: hidden; font-size: var(--uix-text-meta); }
155
+ .uix-compare__head, .uix-compare__row { display: grid; grid-template-columns: 1fr 1fr; }
156
+ .uix-compare__head > div, .uix-compare__cell { padding: var(--uix-space-3); background: var(--uix-surface); border-top: 1px solid var(--uix-border); }
157
+ .uix-compare__head > div { font-weight: 600; border-top: 0; }
158
+ .uix-compare__head > div + div, .uix-compare__cell + .uix-compare__cell { border-left: 1px solid var(--uix-border); }
159
+ .uix-compare__attr { grid-column: 1 / -1; background: var(--uix-bg-subtle); padding: var(--uix-space-1) var(--uix-space-3); border-top: 1px solid var(--uix-border); font-size: var(--uix-text-eyebrow); letter-spacing: var(--uix-tracking-eyebrow); text-transform: uppercase; color: var(--uix-text-muted); }
160
+ }
@@ -0,0 +1,31 @@
1
+ /* uix tabs — line / enclosed / pill. Depends only on --uix-* tokens. */
2
+ @layer uix.components {
3
+ .uix-tabs { display: flex; gap: var(--uix-space-1); }
4
+ .uix-tab {
5
+ border: 0; background: transparent; font: inherit; font-size: var(--uix-text-body); font-weight: 500;
6
+ color: var(--uix-text-hushed); padding: var(--uix-space-3) var(--uix-space-3); cursor: pointer; position: relative;
7
+ transition: color var(--uix-dur-fast) var(--uix-ease-out), background-color var(--uix-dur-fast) var(--uix-ease-out);
8
+ }
9
+ .uix-tab:hover { color: var(--uix-text); }
10
+ .uix-tab[aria-selected="true"] { color: var(--uix-text); }
11
+ .uix-tab:focus-visible { outline: 2px solid var(--uix-ring); outline-offset: -2px; border-radius: var(--uix-radius-sm); }
12
+
13
+ /* line */
14
+ .uix-tabs--line { border-bottom: 1px solid var(--uix-border); }
15
+ .uix-tabs--line .uix-tab::after {
16
+ content: ""; position: absolute; left: 8px; right: 8px; bottom: -1px; height: 2px;
17
+ background: var(--uix-accent); border-radius: var(--uix-radius-pill);
18
+ transform: scaleX(0); transition: transform var(--uix-dur) var(--uix-ease-out);
19
+ }
20
+ .uix-tabs--line .uix-tab[aria-selected="true"]::after { transform: scaleX(1); }
21
+
22
+ /* enclosed */
23
+ .uix-tabs--enclosed { gap: 0; border-bottom: 1px solid var(--uix-border); }
24
+ .uix-tabs--enclosed .uix-tab { border: 1px solid transparent; border-top-left-radius: var(--uix-radius-md); border-top-right-radius: var(--uix-radius-md); margin-bottom: -1px; }
25
+ .uix-tabs--enclosed .uix-tab[aria-selected="true"] { border-color: var(--uix-border); border-bottom-color: var(--uix-bg-app); background: var(--uix-bg-app); }
26
+
27
+ /* pill */
28
+ .uix-tabs--pill { display: inline-flex; background: var(--uix-bg-subtle); padding: var(--uix-space-1); border-radius: var(--uix-radius-md); }
29
+ .uix-tabs--pill .uix-tab { padding: var(--uix-space-2) var(--uix-space-4); border-radius: calc(var(--uix-radius-md) - 3px); }
30
+ .uix-tabs--pill .uix-tab[aria-selected="true"] { background: var(--uix-surface); box-shadow: var(--uix-shadow-sm); }
31
+ }