@tensor_1/tokens 2.10.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 (78) hide show
  1. package/README.md +2 -0
  2. package/build/css/components.css +1 -1872
  3. package/build/css/styles.css +1 -2250
  4. package/build/css/tokens.css +7 -7
  5. package/build/ts/tokens.js +14 -7
  6. package/package.json +12 -2
  7. package/styles/components/alert.css +16 -0
  8. package/styles/components/app-shell.css +37 -0
  9. package/styles/components/attachment.css +10 -0
  10. package/styles/components/audit-log.css +11 -0
  11. package/styles/components/avatar.css +25 -0
  12. package/styles/components/breadcrumbs.css +10 -0
  13. package/styles/components/button.css +49 -0
  14. package/styles/components/calendar.css +13 -0
  15. package/styles/components/card.css +9 -0
  16. package/styles/components/chart.css +9 -0
  17. package/styles/components/checkbox.css +20 -0
  18. package/styles/components/combobox.css +16 -0
  19. package/styles/components/command-palette.css +14 -0
  20. package/styles/components/comments.css +17 -0
  21. package/styles/components/contact-card.css +12 -0
  22. package/styles/components/description-list.css +6 -0
  23. package/styles/components/detail-layout.css +7 -0
  24. package/styles/components/drawer.css +24 -0
  25. package/styles/components/editorial-home.css +185 -0
  26. package/styles/components/file-upload.css +14 -0
  27. package/styles/components/flow.css +196 -0
  28. package/styles/components/form.css +14 -0
  29. package/styles/components/heartbeat.css +12 -0
  30. package/styles/components/inbox.css +13 -0
  31. package/styles/components/input.css +39 -0
  32. package/styles/components/kanban.css +14 -0
  33. package/styles/components/kbd.css +8 -0
  34. package/styles/components/labels.css +13 -0
  35. package/styles/components/lightbox.css +13 -0
  36. package/styles/components/link.css +98 -0
  37. package/styles/components/list.css +10 -0
  38. package/styles/components/media.css +9 -0
  39. package/styles/components/menu.css +15 -0
  40. package/styles/components/meter.css +9 -0
  41. package/styles/components/modal.css +31 -0
  42. package/styles/components/notification-center.css +14 -0
  43. package/styles/components/page-header.css +9 -0
  44. package/styles/components/pagination.css +14 -0
  45. package/styles/components/peek.css +46 -0
  46. package/styles/components/pipeline.css +9 -0
  47. package/styles/components/popover.css +11 -0
  48. package/styles/components/progress.css +12 -0
  49. package/styles/components/prose.css +27 -0
  50. package/styles/components/radio.css +20 -0
  51. package/styles/components/reactions.css +22 -0
  52. package/styles/components/segmented.css +12 -0
  53. package/styles/components/select.css +23 -0
  54. package/styles/components/sidebar.css +102 -0
  55. package/styles/components/sla.css +8 -0
  56. package/styles/components/slider.css +16 -0
  57. package/styles/components/spinner.css +10 -0
  58. package/styles/components/stat-tile.css +11 -0
  59. package/styles/components/states.css +13 -0
  60. package/styles/components/status-pill.css +37 -0
  61. package/styles/components/stepper.css +13 -0
  62. package/styles/components/steps.css +18 -0
  63. package/styles/components/switch.css +19 -0
  64. package/styles/components/table-toolbar.css +20 -0
  65. package/styles/components/table.css +160 -0
  66. package/styles/components/tabs.css +31 -0
  67. package/styles/components/tag-input.css +16 -0
  68. package/styles/components/textarea.css +15 -0
  69. package/styles/components/timeline.css +11 -0
  70. package/styles/components/toast.css +21 -0
  71. package/styles/components/tooltip.css +35 -0
  72. package/styles/components/tree.css +17 -0
  73. package/styles/components/typography.css +45 -0
  74. package/styles/components/utility-bits.css +14 -0
  75. package/styles/components/view-menu.css +14 -0
  76. package/styles/motion.css +35 -0
  77. package/styles/utilities.css +26 -0
  78. package/tokens/base/typography.json +7 -7
@@ -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
+ }
@@ -0,0 +1,16 @@
1
+ /* uix tag input / multi-select chips — depends only on --uix-* tokens. */
2
+ @layer uix.components {
3
+ .uix-taginput {
4
+ display: flex; flex-wrap: wrap; align-items: center; gap: var(--uix-space-2); min-height: var(--uix-control-h); padding: var(--uix-space-1) var(--uix-space-2);
5
+ border: 1px solid var(--uix-border); border-radius: var(--uix-radius-md); background: var(--uix-surface);
6
+ }
7
+ .uix-taginput:focus-within { border-color: var(--uix-ring); box-shadow: 0 0 0 3px var(--uix-brand-muted); }
8
+ .uix-taginput__field { flex: 1; min-width: 80px; border: 0; outline: none; background: transparent; color: var(--uix-text); font: inherit; }
9
+ .uix-tag {
10
+ display: inline-flex; align-items: center; gap: var(--uix-space-1); padding: var(--uix-space-1) var(--uix-space-1) var(--uix-space-1) var(--uix-space-2); border-radius: var(--uix-radius-sm);
11
+ background: var(--uix-bg-active); color: var(--uix-text); font-size: var(--uix-text-meta);
12
+ }
13
+ .uix-tag__remove { display: grid; place-items: center; width: 16px; height: 16px; border: 0; background: transparent; color: var(--uix-text-muted); cursor: pointer; border-radius: var(--uix-radius-xs); }
14
+ .uix-tag__remove:hover { background: var(--uix-bg-hover); color: var(--uix-text); }
15
+ .uix-tag__remove svg { width: 12px; height: 12px; }
16
+ }
@@ -0,0 +1,15 @@
1
+ /* uix textarea — depends only on --uix-* tokens. */
2
+ @layer uix.components {
3
+ .uix-textarea {
4
+ width: 100%; min-height: 84px; padding: var(--uix-space-3) var(--uix-space-3); resize: vertical;
5
+ border: 1px solid var(--uix-border); border-radius: var(--uix-radius-md);
6
+ background: var(--uix-surface); color: var(--uix-text); font: inherit; font-size: var(--uix-text-body);
7
+ line-height: var(--uix-leading-body);
8
+ transition: border-color var(--uix-dur-fast) var(--uix-ease-out), box-shadow var(--uix-dur-fast) var(--uix-ease-out);
9
+ }
10
+ .uix-textarea::placeholder { color: var(--uix-text-muted); }
11
+ .uix-textarea:hover { border-color: var(--uix-border-strong); }
12
+ .uix-textarea:focus { outline: none; border-color: var(--uix-ring); box-shadow: 0 0 0 3px var(--uix-brand-muted); }
13
+ .uix-textarea:disabled { opacity: .55; background: var(--uix-bg-subtle); }
14
+ .uix-textarea[aria-invalid="true"] { border-color: var(--uix-danger); }
15
+ }
@@ -0,0 +1,11 @@
1
+ /* uix timeline / activity feed — depends only on --uix-* tokens. */
2
+ @layer uix.components {
3
+ .uix-timeline { display: flex; flex-direction: column; }
4
+ .uix-timeline__item { display: grid; grid-template-columns: 24px 1fr; gap: var(--uix-space-3); }
5
+ .uix-timeline__rail { display: flex; flex-direction: column; align-items: center; }
6
+ .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); }
7
+ .uix-timeline__line { width: 1px; flex: 1; background: var(--uix-border); margin: var(--uix-space-1) 0; }
8
+ .uix-timeline__item:last-child .uix-timeline__line { display: none; }
9
+ .uix-timeline__body { padding-bottom: var(--uix-space-5); }
10
+ .uix-timeline__meta { font-size: var(--uix-text-meta); color: var(--uix-text-muted); }
11
+ }
@@ -0,0 +1,21 @@
1
+ /* uix toast / notification — depends only on --uix-* tokens. JS appends to .uix-toaster. */
2
+ @layer uix.components {
3
+ .uix-toaster { position: fixed; bottom: 16px; right: 16px; z-index: var(--uix-z-toast); display: flex; flex-direction: column; gap: var(--uix-space-2); width: 340px; max-width: calc(100vw - 32px); }
4
+ .uix-toast {
5
+ display: flex; gap: var(--uix-space-3); align-items: flex-start; padding: var(--uix-space-3) var(--uix-space-4); border-radius: var(--uix-radius-md);
6
+ background: var(--uix-surface-2); border: 1px solid var(--uix-border); box-shadow: var(--uix-shadow-popover);
7
+ animation: uix-slide-in-right var(--uix-dur-slow) var(--uix-ease-out);
8
+ }
9
+ .uix-toast[data-leaving] { animation: uix-toast-out var(--uix-dur) var(--uix-ease-in) forwards; }
10
+ @keyframes uix-toast-out { to { opacity: 0; transform: translateX(16px); } }
11
+ .uix-toast__icon { flex: none; margin-top: 1px; }
12
+ .uix-toast__icon svg { width: var(--uix-icon-md); height: var(--uix-icon-md); }
13
+ .uix-toast__body { flex: 1; }
14
+ .uix-toast__title { font-weight: 600; font-size: var(--uix-text-body); }
15
+ .uix-toast__msg { font-size: var(--uix-text-meta); color: var(--uix-text-muted); margin-top: var(--uix-space-1); }
16
+ .uix-toast__close { border: 0; background: transparent; color: var(--uix-text-muted); cursor: pointer; padding: var(--uix-space-1) var(--uix-space-2); border-radius: var(--uix-radius-xs); }
17
+ .uix-toast__close:hover { background: var(--uix-bg-hover); color: var(--uix-text); }
18
+ .uix-toast--success .uix-toast__icon { color: var(--uix-success); }
19
+ .uix-toast--danger .uix-toast__icon { color: var(--uix-danger); }
20
+ .uix-toast--info .uix-toast__icon { color: var(--uix-info); }
21
+ }
@@ -0,0 +1,35 @@
1
+ /* uix tooltip. Two flavours, both depend only on --uix-* tokens:
2
+ • .uix-tooltip__bubble — the React <Tooltip>: renders in the top layer via the
3
+ Popover API, so it escapes any overflow:hidden/scroll ancestor (UIX-FIX-02).
4
+ JS sets position/left/top; CSS owns appearance + the fade.
5
+ • [data-uix-tip] — the legacy CSS-only tooltip, kept for back-compat. It is
6
+ position:absolute and so is clipped by an overflow ancestor; prefer <Tooltip>. */
7
+ @layer uix.components {
8
+ .uix-tooltip { display: inline-flex; }
9
+
10
+ .uix-tooltip__bubble {
11
+ position: fixed; margin: 0; inset: auto; border: 0;
12
+ width: max-content; max-width: 16rem;
13
+ background: var(--uix-text); color: var(--uix-bg-app);
14
+ font-size: var(--uix-text-meta); font-weight: 500; line-height: 1.4;
15
+ padding: var(--uix-space-2) var(--uix-space-3); border-radius: var(--uix-radius-sm);
16
+ box-shadow: var(--uix-shadow-popover); white-space: normal; pointer-events: none;
17
+ opacity: 0; transition: opacity var(--uix-dur-fast) var(--uix-ease-out);
18
+ }
19
+ .uix-tooltip__bubble:popover-open { opacity: 1; }
20
+ @starting-style { .uix-tooltip__bubble:popover-open { opacity: 0; } }
21
+
22
+ /* legacy CSS-only tooltip — clipped by overflow ancestors; superseded by .uix-tooltip__bubble */
23
+ [data-uix-tip] { position: relative; }
24
+ [data-uix-tip]::after {
25
+ content: attr(data-uix-tip); position: absolute; bottom: calc(100% + 6px); left: 50%;
26
+ transform: translateX(-50%) translateY(var(--uix-lift));
27
+ background: var(--uix-text); color: var(--uix-bg-app); font-size: var(--uix-text-meta); font-weight: 500;
28
+ padding: var(--uix-space-2) var(--uix-space-3); border-radius: var(--uix-radius-sm); white-space: nowrap; box-shadow: var(--uix-shadow-popover);
29
+ opacity: 0; pointer-events: none; z-index: var(--uix-z-tooltip);
30
+ transition: opacity var(--uix-dur-fast) var(--uix-ease-out), transform var(--uix-dur-fast) var(--uix-ease-out);
31
+ }
32
+ [data-uix-tip]:hover::after, [data-uix-tip]:focus-visible::after { opacity: 1; transform: translateX(-50%) translateY(0); }
33
+ /* when JS upgrades [data-uix-tip] to a top-layer bubble, drop the clipped CSS-only one */
34
+ .uix-has-js-tip [data-uix-tip]::after { content: none; }
35
+ }
@@ -0,0 +1,17 @@
1
+ /* uix tree view — WAI-ARIA tree (role=tree/treeitem/group). Depends only on --uix-* tokens.
2
+ ARIA (aria-expanded / aria-selected / aria-level) lives on the treeitem <li>, so the chevron,
3
+ selection, and collapse styling all key off the item, not the row (UIX-FIX-04). */
4
+ @layer uix.components {
5
+ .uix-tree, .uix-tree ul { list-style: none; margin: 0; padding: 0; }
6
+ .uix-tree__group { padding-left: var(--uix-space-5); }
7
+ .uix-tree__item { outline: none; } /* the focus ring is drawn on the row, below */
8
+ .uix-tree__row { display: flex; align-items: center; gap: var(--uix-space-2); padding: var(--uix-space-2) var(--uix-space-2); border-radius: var(--uix-radius-sm); cursor: pointer; color: var(--uix-text); font-size: var(--uix-text-body); }
9
+ .uix-tree__label { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
10
+ .uix-tree__item > .uix-tree__row:hover { background: var(--uix-bg-hover); }
11
+ .uix-tree__item[aria-selected="true"] > .uix-tree__row { background: var(--uix-bg-active); }
12
+ .uix-tree__item:focus-visible > .uix-tree__row { outline: 2px solid var(--uix-ring); outline-offset: -2px; }
13
+ .uix-tree__toggle { width: 16px; height: 16px; flex: none; display: grid; place-items: center; color: var(--uix-text-muted); transition: transform var(--uix-dur) var(--uix-ease-out); }
14
+ .uix-tree__toggle svg { width: 14px; height: 14px; }
15
+ .uix-tree__item[aria-expanded="false"] > .uix-tree__row .uix-tree__toggle { transform: rotate(-90deg); }
16
+ .uix-tree__item[aria-expanded="false"] > .uix-tree__group { display: none; }
17
+ }
@@ -0,0 +1,45 @@
1
+ /* uix typography utilities — class-based application of the --uix-text-* scale.
2
+ A `<span class="uix-text-h3">` reads identically to an `<h3>`; consumers reach
3
+ for these instead of re-deriving the scale inline. (House products migrating
4
+ off bespoke `type-*` classes map 1:1 onto these — same sizes/leading/weights.)
5
+ Depends only on --uix-* tokens. */
6
+ @layer uix.components {
7
+ .uix-text-display {
8
+ font-size: var(--uix-text-display); line-height: var(--uix-leading-display);
9
+ font-weight: 400; letter-spacing: var(--uix-tracking-tight); color: var(--uix-text);
10
+ }
11
+ .uix-text-h1 {
12
+ font-size: var(--uix-text-display); line-height: var(--uix-leading-display);
13
+ font-weight: 400; letter-spacing: var(--uix-tracking-tight); color: var(--uix-text);
14
+ }
15
+ .uix-text-h2 {
16
+ font-size: var(--uix-text-h2); line-height: var(--uix-leading-h2);
17
+ font-weight: 400; letter-spacing: -0.01em; color: var(--uix-text);
18
+ }
19
+ .uix-text-h3 {
20
+ font-size: var(--uix-text-h3); line-height: var(--uix-leading-h3);
21
+ font-weight: 700; color: var(--uix-text);
22
+ }
23
+ .uix-text-body {
24
+ font-size: var(--uix-text-body); line-height: var(--uix-leading-body);
25
+ font-weight: 400; color: var(--uix-text);
26
+ }
27
+ .uix-text-body-hushed {
28
+ font-size: var(--uix-text-body); line-height: var(--uix-leading-body);
29
+ font-weight: 400; color: var(--uix-text-hushed);
30
+ }
31
+ .uix-text-meta {
32
+ font-size: var(--uix-text-meta); line-height: var(--uix-leading-meta);
33
+ font-weight: 400; color: var(--uix-text-hushed);
34
+ }
35
+ .uix-text-eyebrow {
36
+ font-size: var(--uix-text-eyebrow); line-height: var(--uix-leading-eyebrow);
37
+ font-weight: 700; letter-spacing: var(--uix-tracking-eyebrow);
38
+ text-transform: uppercase; color: var(--uix-text-hushed);
39
+ }
40
+ .uix-text-data-hero {
41
+ font-size: var(--uix-text-data-hero); line-height: 1.1;
42
+ font-weight: 400; letter-spacing: -0.01em; color: var(--uix-text);
43
+ font-variant-numeric: tabular-nums;
44
+ }
45
+ }
@@ -0,0 +1,14 @@
1
+ /* uix utility/typography bits — code, pre, blockquote, divider, status dots. Depends only on --uix-* tokens. */
2
+ @layer uix.components {
3
+ .uix-code { font-family: var(--uix-font-mono); font-size: .9em; background: var(--uix-bg-subtle); border: 1px solid var(--uix-border); border-radius: var(--uix-radius-xs); padding: .1em .4em; color: var(--uix-text); }
4
+ .uix-pre { font-family: var(--uix-font-mono); font-size: var(--uix-text-meta); line-height: 1.5; background: var(--uix-bg-subtle); border: 1px solid var(--uix-border); border-radius: var(--uix-radius-md); padding: var(--uix-space-4) var(--uix-space-4); overflow-x: auto; color: var(--uix-text); }
5
+ .uix-blockquote { border-left: 3px solid var(--uix-accent); padding: var(--uix-space-1) 0 var(--uix-space-1) var(--uix-space-4); color: var(--uix-text-hushed); font-style: italic; }
6
+ .uix-divider { height: 1px; background: var(--uix-border); border: 0; margin: var(--uix-space-4) 0; }
7
+ .uix-divider--label { display: flex; align-items: center; gap: var(--uix-space-3); color: var(--uix-text-muted); font-size: var(--uix-text-meta); background: transparent; height: auto; }
8
+ .uix-divider--label::before, .uix-divider--label::after { content: ""; flex: 1; height: 1px; background: var(--uix-border); }
9
+ .uix-dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; background: var(--uix-text-muted); }
10
+ .uix-dot--success { background: var(--uix-success); }
11
+ .uix-dot--warning { background: var(--uix-warning); }
12
+ .uix-dot--danger { background: var(--uix-danger); }
13
+ .uix-dot--info { background: var(--uix-info); }
14
+ }
@@ -0,0 +1,14 @@
1
+ /* uix table View menu — consolidates density / zebra / freeze / columns into one popover.
2
+ Reuses .uix-popover (surface + animation), .uix-segmented, .uix-switch. Depends only on --uix-* tokens. */
3
+ @layer uix.components {
4
+ .uix-view-menu { min-width: 248px; padding: var(--uix-space-2); }
5
+ .uix-view-menu__group { padding: var(--uix-space-2) var(--uix-space-2); }
6
+ .uix-view-menu__group + .uix-view-menu__group { border-top: 1px solid var(--uix-border); }
7
+ .uix-view-menu__label { font-size: var(--uix-text-eyebrow); letter-spacing: var(--uix-tracking-eyebrow); text-transform: uppercase; color: var(--uix-text-muted); margin-bottom: var(--uix-space-2); }
8
+ .uix-view-menu__row { display: flex; align-items: center; justify-content: space-between; gap: var(--uix-space-3); font-size: var(--uix-text-body); color: var(--uix-text); cursor: pointer; }
9
+ .uix-view-menu__row + .uix-view-menu__row { margin-top: var(--uix-space-3); }
10
+ .uix-view-menu .uix-segmented { display: flex; width: 100%; }
11
+ .uix-view-menu .uix-segmented__option { flex: 1; text-align: center; }
12
+ .uix-view-menu__cols { display: flex; flex-direction: column; gap: var(--uix-space-1); max-height: 180px; overflow: auto; }
13
+ .uix-view-menu__cols .uix-menu__item { font-size: var(--uix-text-meta); }
14
+ }
@@ -0,0 +1,35 @@
1
+ /* uix motion — shared keyframes, enter/exit helpers, and the reduced-motion guard.
2
+ Components reference these tokens/keyframes; overlays pair the helpers with @starting-style. */
3
+
4
+ /* Reduced-motion guard — UNLAYERED so its !important beats every component transition. */
5
+ @media (prefers-reduced-motion: reduce) {
6
+ *, *::before, *::after {
7
+ animation-duration: .001ms !important;
8
+ animation-iteration-count: 1 !important;
9
+ transition-duration: .001ms !important;
10
+ scroll-behavior: auto !important;
11
+ }
12
+ }
13
+
14
+ /* Keyframes (cascade-neutral). */
15
+ @keyframes uix-fade-in { from { opacity: 0; } to { opacity: 1; } }
16
+ @keyframes uix-pop-in {
17
+ from { opacity: 0; transform: scale(.96) translateY(var(--uix-lift)); }
18
+ to { opacity: 1; transform: none; }
19
+ }
20
+ @keyframes uix-slide-in-right { from { opacity: 0; transform: translateX(16px); } to { opacity: 1; transform: none; } }
21
+ @keyframes uix-slide-in-up { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }
22
+ @keyframes uix-spin { to { transform: rotate(1turn); } }
23
+ @keyframes uix-shimmer { from { background-position: 200% 0; } to { background-position: -200% 0; } }
24
+
25
+ @layer uix.motion {
26
+ .uix-anim-fade { animation: uix-fade-in var(--uix-dur) var(--uix-ease-out); }
27
+ .uix-anim-pop { animation: uix-pop-in var(--uix-dur-fast) var(--uix-ease-out); }
28
+ .uix-anim-up { animation: uix-slide-in-up var(--uix-dur) var(--uix-ease-out); }
29
+
30
+ /* Hover-lift affordance for interactive cards/tiles. Gated so touch devices don't get a stuck hover. */
31
+ .uix-lift-hover { transition: transform var(--uix-dur-fast) var(--uix-ease-out), box-shadow var(--uix-dur-fast) var(--uix-ease-out); }
32
+ @media (hover: hover) and (pointer: fine) {
33
+ .uix-lift-hover:hover { transform: translateY(calc(-1 * var(--uix-lift))); box-shadow: var(--uix-shadow-popover); }
34
+ }
35
+ }
@@ -0,0 +1,26 @@
1
+ /* uix utilities — a few layout/a11y helpers. Keep this small; tokens + components do the heavy lifting. */
2
+ @layer uix.util {
3
+ /* visually hidden but available to screen readers */
4
+ .uix-visually-hidden {
5
+ position: absolute !important;
6
+ width: 1px; height: 1px;
7
+ padding: 0; margin: -1px;
8
+ overflow: hidden; clip: rect(0, 0, 0, 0);
9
+ white-space: nowrap; border: 0;
10
+ }
11
+
12
+ /* vertical rhythm — set gap via --gap (defaults to --uix-space-4 / 16px) */
13
+ .uix-stack { display: flex; flex-direction: column; gap: var(--gap, var(--uix-space-4)); }
14
+ /* horizontal grouping that wraps */
15
+ .uix-cluster { display: flex; flex-wrap: wrap; align-items: center; gap: var(--gap, var(--uix-space-2)); }
16
+
17
+ .uix-truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
18
+
19
+ /* elevation — apply the surface shadow tokens as a utility (cards/panels,
20
+ floating popovers/menus/dialogs, pressed/active pills). In dark mode
21
+ --uix-shadow-sm resolves to the inset top highlight, so elevated surfaces
22
+ keep their lift cue without a heavy drop shadow. */
23
+ .uix-elevated { box-shadow: var(--uix-shadow-sm); }
24
+ .uix-elevated-popover { box-shadow: var(--uix-shadow-popover); }
25
+ .uix-elevated-pill { box-shadow: var(--uix-shadow-sm); }
26
+ }
@@ -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": "2.5rem" },
6
+ "text-display": { "$type": "dimension", "$value": "40px" },
7
7
  "leading-display":{ "$type": "number", "$value": "1.05" },
8
- "text-data-hero": { "$type": "dimension", "$value": "2.125rem" },
8
+ "text-data-hero": { "$type": "dimension", "$value": "34px" },
9
9
  "leading-data-hero": { "$type": "number", "$value": "1.1" },
10
- "text-h2": { "$type": "dimension", "$value": "1.5rem" },
10
+ "text-h2": { "$type": "dimension", "$value": "24px" },
11
11
  "leading-h2":{ "$type": "number", "$value": "1.15" },
12
- "text-h3": { "$type": "dimension", "$value": "0.9375rem" },
12
+ "text-h3": { "$type": "dimension", "$value": "15px" },
13
13
  "leading-h3":{ "$type": "number", "$value": "1.3" },
14
- "text-body": { "$type": "dimension", "$value": "0.875rem" },
14
+ "text-body": { "$type": "dimension", "$value": "14px" },
15
15
  "leading-body":{ "$type": "number", "$value": "1.5" },
16
- "text-meta": { "$type": "dimension", "$value": "0.78125rem" },
16
+ "text-meta": { "$type": "dimension", "$value": "12.5px" },
17
17
  "leading-meta":{ "$type": "number", "$value": "1.4" },
18
- "text-eyebrow": { "$type": "dimension", "$value": "0.6875rem" },
18
+ "text-eyebrow": { "$type": "dimension", "$value": "11px" },
19
19
  "leading-eyebrow":{ "$type": "number", "$value": "1.2" },
20
20
 
21
21
  "tracking-tight": { "$type": "dimension", "$value": "-0.02em" },