@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
package/package.json CHANGED
@@ -1,8 +1,11 @@
1
1
  {
2
2
  "name": "@tensor_1/tokens",
3
- "version": "2.11.0",
3
+ "version": "2.12.0",
4
4
  "description": "UIx v2 design tokens — the --uix-* contract for house products (Tensor, POSx, SHOPx). One DTCG source -> CSS variables, Tailwind theme, and typed TS constants.",
5
5
  "type": "module",
6
+ "sideEffects": [
7
+ "**/*.css"
8
+ ],
6
9
  "license": "UNLICENSED",
7
10
  "repository": {
8
11
  "type": "git",
@@ -15,12 +18,18 @@
15
18
  "files": [
16
19
  "build",
17
20
  "themes/*.css",
18
- "tokens"
21
+ "tokens",
22
+ "styles/components/*.css",
23
+ "styles/utilities.css",
24
+ "styles/motion.css"
19
25
  ],
20
26
  "exports": {
21
27
  "./css": "./build/css/tokens.css",
22
28
  "./styles": "./build/css/components.css",
23
29
  "./bundle": "./build/css/styles.css",
30
+ "./components/*": "./styles/components/*.css",
31
+ "./utilities": "./styles/utilities.css",
32
+ "./motion": "./styles/motion.css",
24
33
  "./tailwind": "./build/tailwind/theme.css",
25
34
  "./tailwind/preset": "./build/tailwind/preset.cjs",
26
35
  "./ts": {
@@ -45,6 +54,7 @@
45
54
  "prepublishOnly": "npm run build && npm run test:parity && npm run test:contract"
46
55
  },
47
56
  "devDependencies": {
57
+ "esbuild": "^0.27.0",
48
58
  "postcss": "^8.4.0",
49
59
  "postcss-import": "^16.1.1",
50
60
  "style-dictionary": "^4.0.0"
@@ -0,0 +1,16 @@
1
+ /* uix alert / inline banner — tone API. Depends only on --uix-* tokens. */
2
+ @layer uix.components {
3
+ .uix-alert {
4
+ display: flex; gap: var(--uix-space-3); padding: var(--uix-space-3) var(--uix-space-4); border-radius: var(--uix-radius-md);
5
+ border: 1px solid var(--tone-border, var(--uix-border)); background: var(--tone-bg, var(--uix-bg-subtle));
6
+ color: var(--uix-text); font-size: var(--uix-text-body);
7
+ }
8
+ .uix-alert__icon { color: var(--tone-fg, var(--uix-text)); flex: none; }
9
+ .uix-alert__icon svg { width: var(--uix-icon-md); height: var(--uix-icon-md); }
10
+ .uix-alert__title { font-weight: 600; margin-bottom: var(--uix-space-1); }
11
+ .uix-alert__body { font-size: var(--uix-text-meta); color: var(--uix-text-hushed); }
12
+ .uix-alert--info { --tone-bg: var(--uix-info-bg); --tone-border: color-mix(in srgb, var(--uix-info) 30%, transparent); --tone-fg: var(--uix-info-text); }
13
+ .uix-alert--success { --tone-bg: var(--uix-success-bg); --tone-border: color-mix(in srgb, var(--uix-success) 30%, transparent); --tone-fg: var(--uix-success); }
14
+ .uix-alert--warning { --tone-bg: var(--uix-warning-bg); --tone-border: color-mix(in srgb, var(--uix-warning) 40%, transparent); --tone-fg: var(--uix-warning); }
15
+ .uix-alert--danger { --tone-bg: var(--uix-danger-bg); --tone-border: color-mix(in srgb, var(--uix-danger) 30%, transparent); --tone-fg: var(--uix-danger-text); }
16
+ }
@@ -0,0 +1,37 @@
1
+ /* uix app shell — sidebar + topbar + content grid. Depends only on --uix-* tokens. */
2
+ @layer uix.components {
3
+ .uix-shell {
4
+ position: relative;
5
+ display: grid;
6
+ grid-template-columns: var(--uix-sidebar-w) 1fr;
7
+ grid-template-rows: var(--uix-topbar-h) 1fr;
8
+ height: 100%; min-height: 360px;
9
+ border: 1px solid var(--uix-border); border-radius: var(--uix-radius-lg); overflow: hidden;
10
+ transition: grid-template-columns var(--uix-dur) var(--uix-ease-out), grid-template-rows var(--uix-dur) var(--uix-ease-out);
11
+ }
12
+ .uix-shell__sidebar { grid-row: 1 / 3; background: var(--uix-bg-subtle); border-right: 1px solid var(--uix-border); overflow-y: auto; overflow-x: hidden; }
13
+ .uix-shell__topbar { grid-column: 2; display: flex; align-items: center; gap: var(--uix-space-3); padding: 0 var(--uix-space-6); background: var(--uix-bg-app); border-bottom: 1px solid var(--uix-border); }
14
+ .uix-shell__main { grid-column: 2; overflow: auto; padding: var(--uix-space-7); background: var(--uix-bg-app); }
15
+
16
+ /* ── nav width tiers ──────────────────────────────────────────────────────────
17
+ Progressive reveal for wide, many-column tables: full (default) → rail (icon
18
+ only) → hidden (0). data-collapsed stays a back-compat alias for the rail. */
19
+ .uix-shell[data-nav="rail"], .uix-shell[data-collapsed] { grid-template-columns: var(--uix-sidebar-w-rail) 1fr; }
20
+ .uix-shell[data-nav="hidden"] { grid-template-columns: 0 1fr; }
21
+
22
+ /* ── focus / immersive mode ───────────────────────────────────────────────────
23
+ A table-scoped escape hatch: hide the sidebar AND the topbar so a dense grid
24
+ uses the whole frame. The app toggles [data-focus] (from a toolbar maximize
25
+ control) and restores the previous nav state + focus on Esc. */
26
+ .uix-shell[data-focus] { grid-template-columns: 0 1fr; grid-template-rows: 0 1fr; }
27
+ .uix-shell[data-focus] .uix-shell__topbar { display: none; }
28
+
29
+ /* a floating host for the "exit focus" affordance (Esc also exits) */
30
+ .uix-shell__focus-exit { position: absolute; top: var(--uix-space-3); right: var(--uix-space-3); z-index: var(--uix-z-overlay); }
31
+
32
+ /* ── full-bleed main ──────────────────────────────────────────────────────────
33
+ Opt-in per surface: a genuinely wide grid drops the content gutter and runs
34
+ edge to edge, reclaiming 2 x --uix-space-7. Not the default — most pages want
35
+ the gutter. Pair with a frozen identifier column for horizontal scroll. */
36
+ .uix-shell__main--bleed { padding: 0; }
37
+ }
@@ -0,0 +1,10 @@
1
+ /* uix attachment list — depends only on --uix-* tokens. */
2
+ @layer uix.components {
3
+ .uix-attachments { display: flex; flex-direction: column; gap: var(--uix-space-2); }
4
+ .uix-attachment { display: flex; align-items: center; gap: var(--uix-space-3); padding: var(--uix-space-2) var(--uix-space-3); border: 1px solid var(--uix-border); border-radius: var(--uix-radius-md); background: var(--uix-surface); }
5
+ .uix-attachment__icon { width: 32px; height: 32px; flex: none; border-radius: var(--uix-radius-sm); background: var(--uix-bg-subtle); display: grid; place-items: center; color: var(--uix-text-muted); }
6
+ .uix-attachment__icon svg { width: var(--uix-icon-md); height: var(--uix-icon-md); }
7
+ .uix-attachment__name { font-size: var(--uix-text-body); }
8
+ .uix-attachment__size { font-size: var(--uix-text-meta); color: var(--uix-text-muted); }
9
+ .uix-attachment__actions { margin-left: auto; }
10
+ }
@@ -0,0 +1,11 @@
1
+ /* uix audit-log entry — depends only on --uix-* tokens. */
2
+ @layer uix.components {
3
+ .uix-audit { display: flex; flex-direction: column; }
4
+ .uix-audit__row { display: grid; grid-template-columns: auto 1fr auto; gap: var(--uix-space-3); align-items: center; padding: var(--uix-space-3) 0; border-bottom: 1px solid var(--uix-border); font-size: var(--uix-text-meta); }
5
+ .uix-audit__row:last-child { border-bottom: 0; }
6
+ .uix-audit__actor { font-weight: 500; color: var(--uix-text); }
7
+ .uix-audit__detail { color: var(--uix-text-hushed); }
8
+ .uix-audit__detail ins { background: var(--uix-success-bg); color: var(--uix-success); text-decoration: none; padding: 0 var(--uix-space-1); border-radius: var(--uix-radius-xs); }
9
+ .uix-audit__detail del { background: var(--uix-danger-bg); color: var(--uix-danger-text); text-decoration: line-through; padding: 0 var(--uix-space-1); border-radius: var(--uix-radius-xs); }
10
+ .uix-audit__time { color: var(--uix-text-muted); white-space: nowrap; }
11
+ }
@@ -0,0 +1,25 @@
1
+ /* uix avatar / avatar-group / user-chip — depends only on --uix-* tokens. */
2
+ @layer uix.components {
3
+ .uix-avatar {
4
+ width: 32px; height: 32px; flex: none; border-radius: 50%; background: var(--uix-bg-active); color: var(--uix-text);
5
+ display: inline-flex; align-items: center; justify-content: center; font-size: var(--uix-text-meta); font-weight: 600;
6
+ line-height: 1; overflow: hidden; position: relative;
7
+ }
8
+ .uix-avatar img { width: 100%; height: 100%; object-fit: cover; }
9
+ .uix-avatar--sm { width: 24px; height: 24px; font-size: var(--uix-text-eyebrow); }
10
+ .uix-avatar--lg { width: 44px; height: 44px; }
11
+ .uix-avatar__status { position: absolute; right: -1px; bottom: -1px; width: 10px; height: 10px; border-radius: 50%; border: 2px solid var(--uix-surface); background: var(--uix-success); }
12
+ .uix-avatar-group { display: inline-flex; }
13
+ .uix-avatar-group .uix-avatar { box-shadow: 0 0 0 2px var(--uix-surface); margin-left: calc(-1 * var(--uix-space-2)); }
14
+ .uix-avatar-group .uix-avatar:first-child { margin-left: 0; }
15
+ .uix-user-chip { display: inline-flex; align-items: center; gap: var(--uix-space-2); }
16
+ .uix-user-chip__name { font-size: var(--uix-text-body); font-weight: 500; }
17
+ .uix-user-chip__sub { font-size: var(--uix-text-meta); color: var(--uix-text-muted); }
18
+
19
+ /* editable avatar — hover/focus overlay for "change photo"; empty = upload placeholder */
20
+ .uix-avatar--editable { cursor: pointer; }
21
+ .uix-avatar__edit { position: absolute; inset: 0; display: grid; place-items: center; background: var(--uix-scrim); color: var(--uix-text-reverse); opacity: 0; transition: opacity var(--uix-dur-fast) var(--uix-ease-out); }
22
+ .uix-avatar__edit svg { width: 45%; height: 45%; }
23
+ .uix-avatar--editable:hover .uix-avatar__edit, .uix-avatar--editable:focus-visible .uix-avatar__edit { opacity: 1; }
24
+ .uix-avatar--empty { background: var(--uix-bg-subtle); border: 1.5px dashed var(--uix-border-strong); color: var(--uix-text-muted); }
25
+ }
@@ -0,0 +1,10 @@
1
+ /* uix breadcrumbs — depends only on --uix-* tokens. */
2
+ @layer uix.components {
3
+ .uix-breadcrumbs { display: flex; align-items: center; gap: var(--uix-space-2); flex-wrap: wrap; font-size: var(--uix-text-meta); color: var(--uix-text-muted); }
4
+ .uix-breadcrumbs a { color: var(--uix-text-muted); text-decoration: none; }
5
+ /* already a quiet link by its own design — hover/focus parity with the quiet-link
6
+ contract in link.css, so the keyboard state matches the pointer state. */
7
+ .uix-breadcrumbs a:is(:hover, :focus-visible) { color: var(--uix-text); text-decoration: underline; }
8
+ .uix-breadcrumbs__sep { opacity: .55; }
9
+ .uix-breadcrumbs [aria-current="page"] { color: var(--uix-text); font-weight: 500; }
10
+ }
@@ -0,0 +1,49 @@
1
+ /* uix button — depends only on --uix-* tokens. */
2
+ @layer uix.components {
3
+ .uix-btn {
4
+ display: inline-flex; align-items: center; justify-content: center; gap: .5em;
5
+ height: var(--uix-control-h); padding: 0 var(--uix-space-4); border: 1px solid transparent;
6
+ border-radius: var(--uix-radius-md); font: inherit; font-size: var(--uix-text-body); font-weight: 500;
7
+ line-height: 1; cursor: pointer; user-select: none; white-space: nowrap;
8
+ transition: background-color var(--uix-dur-fast) var(--uix-ease-out),
9
+ border-color var(--uix-dur-fast) var(--uix-ease-out),
10
+ color var(--uix-dur-fast) var(--uix-ease-out),
11
+ transform var(--uix-dur-fast) var(--uix-ease-out);
12
+ }
13
+ .uix-btn:active { transform: scale(.97); }
14
+ .uix-btn:disabled, .uix-btn[aria-disabled="true"] { opacity: .5; pointer-events: none; }
15
+ .uix-btn:focus-visible { outline: 2px solid var(--uix-ring); outline-offset: 2px; }
16
+ .uix-btn svg { width: var(--uix-icon-md); height: var(--uix-icon-md); }
17
+
18
+ .uix-btn--primary { background: var(--uix-accent); color: var(--uix-accent-fg); }
19
+ .uix-btn--primary:hover { background: var(--uix-accent-hover); }
20
+ .uix-btn--secondary { background: var(--uix-bg-subtle); color: var(--uix-text); border-color: var(--uix-border); }
21
+ .uix-btn--secondary:hover { background: var(--uix-bg-hover); }
22
+ .uix-btn--outline { background: transparent; color: var(--uix-text); border-color: var(--uix-border-strong); }
23
+ .uix-btn--outline:hover { background: var(--uix-bg-hover); }
24
+ .uix-btn--ghost { background: transparent; color: var(--uix-text); }
25
+ .uix-btn--ghost:hover { background: var(--uix-bg-hover); }
26
+ .uix-btn--danger { background: var(--uix-danger); color: var(--uix-danger-fg); }
27
+ .uix-btn--danger:hover { background: color-mix(in srgb, var(--uix-danger) 88%, black); }
28
+ .uix-btn--link { background: transparent; color: var(--uix-link); height: auto; padding: 0; }
29
+ .uix-btn--link:hover { text-decoration: underline; }
30
+
31
+ .uix-btn--sm { height: 28px; padding: 0 var(--uix-space-3); font-size: var(--uix-text-meta); }
32
+ .uix-btn--lg { height: 44px; padding: 0 var(--uix-space-5); }
33
+ .uix-btn--icon { width: var(--uix-control-h); padding: 0; }
34
+ .uix-btn--icon.uix-btn--sm { width: 28px; }
35
+ .uix-btn--icon.uix-btn--lg { width: 44px; }
36
+
37
+ .uix-btn[data-loading] { color: transparent !important; position: relative; pointer-events: none; }
38
+ .uix-btn[data-loading]::after {
39
+ content: ""; position: absolute; width: 1em; height: 1em;
40
+ border: 2px solid currentColor; border-right-color: transparent; border-radius: 50%;
41
+ color: var(--uix-accent-fg); animation: uix-spin .6s linear infinite;
42
+ }
43
+
44
+ /* attached group */
45
+ .uix-btn-group { display: inline-flex; }
46
+ .uix-btn-group .uix-btn { border-radius: 0; border-right-width: 0; }
47
+ .uix-btn-group .uix-btn:first-child { border-top-left-radius: var(--uix-radius-md); border-bottom-left-radius: var(--uix-radius-md); }
48
+ .uix-btn-group .uix-btn:last-child { border-radius: 0 var(--uix-radius-md) var(--uix-radius-md) 0; border-right-width: 1px; }
49
+ }
@@ -0,0 +1,13 @@
1
+ /* uix calendar (shared by date pickers) — depends only on --uix-* tokens. */
2
+ @layer uix.components {
3
+ .uix-calendar { width: 280px; border: 1px solid var(--uix-border); border-radius: var(--uix-radius-lg); background: var(--uix-surface); padding: var(--uix-space-3); }
4
+ .uix-calendar__head { display: flex; align-items: center; justify-content: space-between; margin-bottom: var(--uix-space-2); font-weight: 600; font-size: var(--uix-text-body); }
5
+ .uix-calendar__grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: var(--uix-space-1); }
6
+ .uix-calendar__dow { text-align: center; font-size: var(--uix-text-eyebrow); color: var(--uix-text-muted); padding: var(--uix-space-1) 0; }
7
+ .uix-calendar__day { aspect-ratio: 1; display: grid; place-items: center; border-radius: var(--uix-radius-sm); font-size: var(--uix-text-meta); color: var(--uix-text); cursor: pointer; border: 0; background: transparent; }
8
+ .uix-calendar__day:hover { background: var(--uix-bg-hover); }
9
+ .uix-calendar__day[data-muted] { color: var(--uix-text-muted); opacity: .45; }
10
+ .uix-calendar__day[data-today] { box-shadow: inset 0 0 0 1px var(--uix-border-strong); }
11
+ .uix-calendar__day[data-range] { background: var(--uix-brand-muted); border-radius: 0; }
12
+ .uix-calendar__day[aria-selected="true"] { background: var(--uix-accent); color: var(--uix-accent-fg); }
13
+ }
@@ -0,0 +1,9 @@
1
+ /* uix card — depends only on --uix-* tokens. */
2
+ @layer uix.components {
3
+ .uix-card { background: var(--uix-surface); border: 1px solid var(--uix-border); border-radius: var(--uix-radius-lg); box-shadow: var(--uix-shadow-sm); }
4
+ .uix-card__header { padding: var(--uix-space-5) var(--uix-space-6); border-bottom: 1px solid var(--uix-border); display: flex; align-items: center; gap: var(--uix-space-3); }
5
+ .uix-card__title { font-size: var(--uix-text-h3); font-weight: 600; }
6
+ .uix-card__subtitle { font-size: var(--uix-text-meta); color: var(--uix-text-muted); margin-top: var(--uix-space-1); }
7
+ .uix-card__body { padding: var(--uix-space-6); }
8
+ .uix-card__footer { padding: var(--uix-space-4) var(--uix-space-6); border-top: 1px solid var(--uix-border); display: flex; gap: var(--uix-space-2); justify-content: flex-end; }
9
+ }
@@ -0,0 +1,9 @@
1
+ /* uix chart container + legend — palette + framing only; pair sample SVGs / a chart lib using --uix-chart-*. */
2
+ @layer uix.components {
3
+ .uix-chart { background: var(--uix-surface); border: 1px solid var(--uix-border); border-radius: var(--uix-radius-lg); padding: var(--uix-space-5); }
4
+ .uix-chart__title { font-size: var(--uix-text-h3); font-weight: 600; }
5
+ .uix-chart__subtitle { font-size: var(--uix-text-meta); color: var(--uix-text-muted); margin-bottom: var(--uix-space-4); }
6
+ .uix-legend { display: flex; flex-wrap: wrap; gap: var(--uix-space-3); margin-top: var(--uix-space-3); }
7
+ .uix-legend__item { display: inline-flex; align-items: center; gap: var(--uix-space-2); font-size: var(--uix-text-meta); color: var(--uix-text-hushed); }
8
+ .uix-legend__swatch { width: 10px; height: 10px; border-radius: var(--uix-radius-xs); flex: none; }
9
+ }
@@ -0,0 +1,20 @@
1
+ /* uix checkbox — depends only on --uix-* tokens. Markup:
2
+ <label class="uix-checkbox"><input type="checkbox"><span class="uix-checkbox__box">{check svg}</span> Label</label> */
3
+ @layer uix.components {
4
+ .uix-checkbox { 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-checkbox > input { position: absolute; opacity: 0; width: 1px; height: 1px; }
6
+ .uix-checkbox__box {
7
+ width: 18px; height: 18px; flex: none; display: grid; place-items: center;
8
+ border: 1px solid var(--uix-border-strong); border-radius: var(--uix-radius-xs); background: var(--uix-surface);
9
+ transition: background-color var(--uix-dur-fast) var(--uix-ease-out), border-color var(--uix-dur-fast) var(--uix-ease-out);
10
+ }
11
+ .uix-checkbox__box svg {
12
+ width: 13px; height: 13px; color: var(--uix-accent-fg); opacity: 0; transform: scale(.5);
13
+ transition: opacity var(--uix-dur-fast) var(--uix-ease-out), transform var(--uix-dur-fast) var(--uix-ease-spring);
14
+ }
15
+ .uix-checkbox > input:checked + .uix-checkbox__box,
16
+ .uix-checkbox > input:indeterminate + .uix-checkbox__box { background: var(--uix-accent); border-color: var(--uix-accent); }
17
+ .uix-checkbox > input:checked + .uix-checkbox__box svg { opacity: 1; transform: none; }
18
+ .uix-checkbox > input:focus-visible + .uix-checkbox__box { outline: 2px solid var(--uix-ring); outline-offset: 2px; }
19
+ .uix-checkbox > input:disabled ~ * { opacity: .5; }
20
+ }
@@ -0,0 +1,16 @@
1
+ /* uix combobox / listbox surface — depends only on --uix-* tokens. */
2
+ @layer uix.components {
3
+ .uix-combobox { position: relative; }
4
+ .uix-listbox {
5
+ list-style: none; margin: 0; padding: var(--uix-space-1); min-width: 200px;
6
+ background: var(--uix-surface-2); border: 1px solid var(--uix-border); border-radius: var(--uix-radius-md);
7
+ box-shadow: var(--uix-shadow-popover);
8
+ }
9
+ .uix-listbox__option {
10
+ padding: var(--uix-space-2) var(--uix-space-3); border-radius: var(--uix-radius-sm); font-size: var(--uix-text-body); color: var(--uix-text);
11
+ cursor: pointer; display: flex; align-items: center; gap: var(--uix-space-2);
12
+ }
13
+ .uix-listbox__option:hover, .uix-listbox__option[aria-selected="true"], .uix-listbox__option[data-active] { background: var(--uix-bg-hover); }
14
+ .uix-listbox__option[aria-selected="true"] { color: var(--uix-link); }
15
+ .uix-listbox__empty { padding: var(--uix-space-3); text-align: center; color: var(--uix-text-muted); font-size: var(--uix-text-meta); }
16
+ }
@@ -0,0 +1,14 @@
1
+ /* uix command palette (⌘K) — inner surface; mounts in a dialog/popover (overlay mechanics in motion + overlays). */
2
+ @layer uix.components {
3
+ .uix-cmdk { width: min(560px, 92vw); border: 1px solid var(--uix-border); border-radius: var(--uix-radius-lg); background: var(--uix-surface-2); box-shadow: var(--uix-shadow-overlay); overflow: hidden; }
4
+ .uix-cmdk__input { width: 100%; height: 48px; border: 0; border-bottom: 1px solid var(--uix-border); background: transparent; color: var(--uix-text); font: inherit; font-size: var(--uix-text-h3); padding: 0 var(--uix-space-4); }
5
+ .uix-cmdk__input:focus { outline: none; }
6
+ .uix-cmdk__list { max-height: 320px; overflow-y: auto; padding: var(--uix-space-2); }
7
+ .uix-cmdk__group { font-size: var(--uix-text-eyebrow); letter-spacing: var(--uix-tracking-eyebrow); text-transform: uppercase; color: var(--uix-text-muted); padding: var(--uix-space-2) var(--uix-space-3) var(--uix-space-1); }
8
+ .uix-cmdk__item { display: flex; align-items: center; gap: var(--uix-space-3); padding: var(--uix-space-3) var(--uix-space-3); border-radius: var(--uix-radius-sm); color: var(--uix-text); cursor: pointer; font-size: var(--uix-text-body); }
9
+ .uix-cmdk__item svg { width: var(--uix-icon-md); height: var(--uix-icon-md); color: var(--uix-text-muted); }
10
+ .uix-cmdk__item:hover, .uix-cmdk__item[data-active] { background: var(--uix-bg-hover); }
11
+ .uix-cmdk__item .uix-kbd { margin-left: auto; }
12
+ /* ⌘K is keyboard-triggered and high-frequency → open instantly, no animation (Emil's rule) */
13
+ dialog[data-uix-cmdk-dialog], dialog[data-uix-cmdk-dialog]::backdrop { transition: none; }
14
+ }
@@ -0,0 +1,17 @@
1
+ /* uix comments thread + composer (@mention) — depends only on --uix-* tokens. */
2
+ @layer uix.components {
3
+ .uix-comments { display: flex; flex-direction: column; gap: var(--uix-space-4); }
4
+ .uix-comment { display: grid; grid-template-columns: 32px 1fr; gap: var(--uix-space-3); }
5
+ .uix-comment__body { background: var(--uix-bg-subtle); border: 1px solid var(--uix-border); border-radius: var(--uix-radius-md); padding: var(--uix-space-3) var(--uix-space-3); }
6
+ .uix-comment__meta { font-size: var(--uix-text-meta); color: var(--uix-text-muted); margin-bottom: var(--uix-space-1); }
7
+ .uix-comment__author { font-weight: 600; color: var(--uix-text); }
8
+ .uix-mention { color: var(--uix-link); background: var(--uix-brand-muted); padding: 0 var(--uix-space-1); border-radius: var(--uix-radius-xs); font-weight: 500; }
9
+ .uix-composer { border: 1px solid var(--uix-border); border-radius: var(--uix-radius-md); background: var(--uix-surface); }
10
+ .uix-composer:focus-within { border-color: var(--uix-ring); box-shadow: 0 0 0 3px var(--uix-brand-muted); }
11
+ .uix-composer textarea { width: 100%; border: 0; background: transparent; resize: vertical; padding: var(--uix-space-3) var(--uix-space-3); color: var(--uix-text); font: inherit; min-height: 60px; }
12
+ .uix-composer textarea:focus { outline: none; }
13
+ .uix-composer__bar { display: flex; justify-content: flex-end; gap: var(--uix-space-2); padding: var(--uix-space-2); border-top: 1px solid var(--uix-border); }
14
+ /* Block so the thumbnail drops onto its own line below the comment text (not inline with it). */
15
+ .uix-comment__image { display: block; margin-top: var(--uix-space-2); padding: 0; border-radius: var(--uix-radius-sm); overflow: hidden; border: 1px solid var(--uix-border); background: none; cursor: zoom-in; max-width: 200px; }
16
+ .uix-comment__image img { display: block; width: 100%; height: auto; }
17
+ }
@@ -0,0 +1,12 @@
1
+ /* uix contact / customer card (CRM) — depends only on --uix-* tokens. */
2
+ @layer uix.components {
3
+ .uix-contact { display: flex; flex-direction: column; align-items: center; text-align: center; gap: var(--uix-space-1); padding: var(--uix-space-5); }
4
+ .uix-contact__name { font-size: var(--uix-text-h3); font-weight: 600; margin-top: var(--uix-space-2); }
5
+ .uix-contact__role { font-size: var(--uix-text-meta); color: var(--uix-text-muted); }
6
+ .uix-contact__actions { display: flex; gap: var(--uix-space-2); margin-top: var(--uix-space-3); align-self: stretch; }
7
+ .uix-contact__actions > .uix-btn { flex: 1; }
8
+ .uix-contact__stats { display: flex; gap: var(--uix-space-5); margin-top: var(--uix-space-4); }
9
+ .uix-contact__stat { text-align: center; }
10
+ .uix-contact__stat b { display: block; font-size: var(--uix-text-h3); }
11
+ .uix-contact__stat span { font-size: var(--uix-text-meta); color: var(--uix-text-muted); }
12
+ }
@@ -0,0 +1,6 @@
1
+ /* uix description / key-value list — depends only on --uix-* tokens. */
2
+ @layer uix.components {
3
+ .uix-dl { display: grid; grid-template-columns: max-content 1fr; gap: var(--uix-space-3) var(--uix-space-6); }
4
+ .uix-dl dt { color: var(--uix-text-muted); font-size: var(--uix-text-meta); }
5
+ .uix-dl dd { color: var(--uix-text); font-size: var(--uix-text-body); margin: 0; }
6
+ }
@@ -0,0 +1,7 @@
1
+ /* uix detail layout — two-column record (main + side meta). Depends only on --uix-* tokens. */
2
+ @layer uix.components {
3
+ .uix-detail { display: grid; grid-template-columns: 1fr 280px; gap: var(--uix-space-5); align-items: start; }
4
+ .uix-detail__main { min-width: 0; display: flex; flex-direction: column; gap: var(--uix-space-4); }
5
+ .uix-detail__side { display: flex; flex-direction: column; gap: var(--uix-space-4); }
6
+ @media (max-width: 820px) { .uix-detail { grid-template-columns: 1fr; } }
7
+ }
@@ -0,0 +1,24 @@
1
+ /* uix drawer / side sheet — native <dialog> sliding from the right edge. */
2
+ @layer uix.components {
3
+ .uix-drawer {
4
+ margin: 0 0 0 auto; height: 100dvh; max-height: 100dvh; width: min(420px, 100vw); padding: 0; color: var(--uix-text);
5
+ border: 0; border-left: 1px solid var(--uix-border); border-radius: 0;
6
+ background: var(--uix-surface); box-shadow: var(--uix-shadow-overlay);
7
+ transform: translateX(100%);
8
+ transition: transform var(--uix-dur-slow) var(--uix-ease-out),
9
+ overlay var(--uix-dur-slow) allow-discrete, display var(--uix-dur-slow) allow-discrete;
10
+ /* Author display values for both states required for the slide-in (see peek.css). Closed = none. */
11
+ display: none;
12
+ }
13
+ .uix-drawer[open] { transform: none; display: flex; flex-direction: column; }
14
+ @starting-style { .uix-drawer[open] { transform: translateX(100%); } }
15
+ .uix-drawer::backdrop {
16
+ background: var(--uix-scrim); opacity: 0;
17
+ transition: opacity var(--uix-dur-slow) var(--uix-ease-out), overlay var(--uix-dur-slow) allow-discrete, display var(--uix-dur-slow) allow-discrete;
18
+ }
19
+ .uix-drawer[open]::backdrop { opacity: 1; }
20
+ @starting-style { .uix-drawer[open]::backdrop { opacity: 0; } }
21
+ .uix-drawer__header { display: flex; align-items: center; gap: var(--uix-space-3); padding: var(--uix-space-4) var(--uix-space-5); border-bottom: 1px solid var(--uix-border); }
22
+ .uix-drawer__body { padding: var(--uix-space-5); overflow-y: auto; flex: 1; }
23
+ .uix-drawer__footer { display: flex; gap: var(--uix-space-2); padding: var(--uix-space-4) var(--uix-space-5); border-top: 1px solid var(--uix-border); }
24
+ }
@@ -0,0 +1,185 @@
1
+ /* uix editorial-home kit — the intranet "editorial" landing patterns (INTRA-04):
2
+ * page intro + search, shortcut grid, notice queue, featured stage + rundown,
3
+ * section heads, content/rail grids, news lead, content list, resource grid,
4
+ * stat line, event + status rows. Ported 1:1 from the approved TENSOR intranet
5
+ * prototype (Docs/prototypes/intranet-reimagined/mockups.css); spacing/type
6
+ * snapped to the --uix-* scales per the contract gate, editorial display sizes
7
+ * justified in tests/raw-value-allowlist.json. Depends only on --uix-* tokens. */
8
+ @layer uix.components {
9
+ /* ── page intro — kicker/title/lede beside the search well ─────────────────── */
10
+ .uix-page-intro { margin-top: var(--uix-space-6); display: grid; grid-template-columns: minmax(300px, 0.8fr) minmax(460px, 1.2fr); align-items: end; gap: var(--uix-space-7); }
11
+ .uix-page-intro .uix-page-lede { margin-top: var(--uix-space-2); }
12
+ .uix-page-kicker { margin: 0 0 var(--uix-space-2); color: var(--uix-text-hushed); font-size: var(--uix-text-meta); }
13
+ .uix-page-title { max-width: 760px; margin: 0; font-family: var(--uix-font-heading); font-size: clamp(30px, 4vw, 48px); font-weight: 400; letter-spacing: -0.035em; line-height: 1.06; }
14
+ .uix-page-lede { max-width: 680px; margin: var(--uix-space-3) 0 0; color: var(--uix-text-hushed); font-size: var(--uix-text-h3); }
15
+ .uix-intro-search__label { margin: 0 0 var(--uix-space-2); color: var(--uix-text-hushed); font-size: var(--uix-text-meta); }
16
+
17
+ .uix-searchbar { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: var(--uix-space-2); }
18
+ .uix-searchbar .uix-input { min-height: 44px; padding-left: 42px; }
19
+ .uix-searchbar__wrap { position: relative; }
20
+ .uix-searchbar__wrap > svg { position: absolute; top: 50%; left: 14px; z-index: var(--uix-z-raised); width: 17px; height: 17px; color: var(--uix-text-hushed); transform: translateY(-50%); pointer-events: none; }
21
+
22
+ .uix-shortcut-grid { grid-column: 1 / -1; margin-top: var(--uix-space-4); display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--uix-space-2); }
23
+ .uix-shortcut-grid .uix-btn { min-height: 42px; justify-content: flex-start; }
24
+
25
+ /* ── notice queue — rotating "important updates" banner ────────────────────── */
26
+ .uix-notice { min-height: 48px; padding: var(--uix-space-2) var(--uix-space-4); display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; gap: var(--uix-space-3); border-left: 2px solid var(--uix-text); background: var(--uix-bg-subtle); }
27
+ .uix-notice__copy { margin: 0; font-size: var(--uix-text-body); }
28
+ .uix-notice__copy strong { font-weight: 600; }
29
+ .uix-notice__content { min-width: 0; }
30
+ .uix-notice__meta { margin: var(--uix-space-1) 0 0; color: var(--uix-text-hushed); font-size: var(--uix-text-eyebrow); }
31
+ .uix-notice__actions { display: flex; align-items: center; justify-content: flex-end; gap: var(--uix-space-2); }
32
+ .uix-notice__position { margin-right: var(--uix-space-1); color: var(--uix-text-hushed); font-size: var(--uix-text-eyebrow); white-space: nowrap; }
33
+ .uix-notice__arrow--previous svg { transform: rotate(180deg); }
34
+
35
+ /* ── featured briefing — ONE card: stage + rundown are zones inside it, split
36
+ by an internal hairline. The selected rundown item grows a caret that sits
37
+ on (and breaks) that hairline toward the stage, and its ordinal becomes a
38
+ filled chip echoed by .uix-featured__now in the stage eyebrow — that chip
39
+ pairing is what carries the selection link once the card stacks. ─────────── */
40
+ .uix-featured { display: grid; grid-template-columns: minmax(0, 1.7fr) minmax(300px, 0.7fr); align-items: stretch; overflow: hidden; border: 1px solid var(--uix-border); border-radius: var(--uix-radius-md); background: var(--uix-surface); }
41
+ .uix-page-intro + .uix-featured { margin-top: var(--uix-space-6); }
42
+
43
+ .uix-featured__stage { min-width: 0; min-height: 302px; display: grid; grid-template-columns: minmax(260px, 0.95fr) minmax(300px, 1.05fr); }
44
+ .uix-featured__visual {
45
+ min-height: 302px; padding: var(--uix-space-6) var(--uix-space-7); display: flex; align-items: flex-end;
46
+ position: relative; overflow: hidden;
47
+ background:
48
+ linear-gradient(135deg, transparent 20%, color-mix(in srgb, var(--uix-text) 8%, transparent)),
49
+ var(--uix-bg-subtle);
50
+ }
51
+ .uix-featured__visual::before,
52
+ .uix-featured__visual::after { content: ""; position: absolute; border: 1px solid var(--uix-border-strong); border-radius: 50%; }
53
+ .uix-featured__visual::before { width: 240px; height: 240px; top: -78px; right: -42px; }
54
+ .uix-featured__visual::after { width: 144px; height: 144px; top: 72px; right: 56px; }
55
+ .uix-featured__content { padding: var(--uix-space-7); display: flex; flex-direction: column; align-items: flex-start; justify-content: center; }
56
+ .uix-featured__eyebrow { margin: 0 0 var(--uix-space-4); color: var(--uix-text-hushed); font-size: var(--uix-text-eyebrow); letter-spacing: var(--uix-tracking-eyebrow); text-transform: uppercase; }
57
+ .uix-featured__title { margin: 0; font-family: var(--uix-font-heading); font-size: clamp(26px, 3vw, 38px); font-weight: 400; letter-spacing: -0.03em; line-height: 1.08; }
58
+ .uix-featured__description { margin: var(--uix-space-3) 0 var(--uix-space-5); color: var(--uix-text-hushed); }
59
+ .uix-featured__meta { margin: 0 0 var(--uix-space-5); color: var(--uix-text-hushed); font-size: var(--uix-text-meta); }
60
+ .uix-featured__now { min-width: 22px; height: 22px; display: inline-grid; place-items: center; margin-right: var(--uix-space-2); border-radius: var(--uix-radius-pill); background: var(--uix-text); color: var(--uix-bg-app); font-variant-numeric: tabular-nums; letter-spacing: 0; }
61
+
62
+ .uix-story-signal { position: absolute; top: 26px; left: 28px; z-index: var(--uix-z-raised); }
63
+ .uix-story-signal__value { display: block; font-family: var(--uix-font-heading); font-size: 48px; font-weight: 400; letter-spacing: -0.04em; line-height: 1; }
64
+ .uix-story-signal__label { display: block; margin-top: var(--uix-space-2); color: var(--uix-text-hushed); font-size: var(--uix-text-meta); }
65
+
66
+ .uix-story-diagram { width: min(100%, 500px); position: relative; z-index: var(--uix-z-raised); display: grid; grid-template-columns: repeat(3, 1fr); align-items: end; gap: var(--uix-space-3); }
67
+ .uix-story-diagram__bar { min-height: 52px; border: 1px solid var(--uix-border-strong); border-radius: var(--uix-radius-sm); background: color-mix(in srgb, var(--uix-surface) 84%, transparent); }
68
+ .uix-story-diagram__bar:nth-child(2) { min-height: 104px; }
69
+ .uix-story-diagram__bar:nth-child(3) { min-height: 126px; background: var(--uix-text); }
70
+
71
+ .uix-rundown { min-width: 0; padding: var(--uix-space-4); display: grid; grid-template-rows: auto minmax(0, 1fr); gap: var(--uix-space-3); border-left: 1px solid var(--uix-border); }
72
+ .uix-rundown__head { padding: var(--uix-space-1) var(--uix-space-1) var(--uix-space-3); display: flex; align-items: flex-start; justify-content: space-between; gap: var(--uix-space-3); border-bottom: 1px solid var(--uix-border); }
73
+ .uix-rundown__eyebrow { margin: 0; color: var(--uix-text-hushed); font-size: var(--uix-text-eyebrow); letter-spacing: 0.05em; text-transform: uppercase; }
74
+ .uix-rundown__title { margin: var(--uix-space-1) 0 0; font-family: var(--uix-font-heading); font-size: 18px; font-weight: 400; }
75
+ .uix-rundown__items { min-width: 0; display: grid; grid-template-rows: repeat(3, minmax(0, 1fr)); gap: var(--uix-space-2); }
76
+ .uix-rundown__item { position: relative; min-width: 0; min-height: 68px; padding: var(--uix-space-3); display: grid; grid-template-columns: auto minmax(0, 1fr); align-items: center; gap: var(--uix-space-3); border: 1px solid transparent; border-radius: var(--uix-radius-sm); background: transparent; color: var(--uix-text); cursor: pointer; font: inherit; text-align: left; }
77
+ .uix-rundown__item:hover { background: var(--uix-bg-hover); }
78
+ .uix-rundown__item[data-selected="true"] { border-color: var(--uix-border); background: var(--uix-bg-active); }
79
+ /* caret centered on the internal divider (16px zone pad + 1px hairline + half of the 12px glyph) */
80
+ .uix-rundown__item[data-selected="true"]::before { content: ""; position: absolute; top: 50%; left: -23px; width: 12px; height: 12px; transform: translateY(-50%) rotate(45deg); background: var(--uix-surface); border-left: 1px solid var(--uix-border-strong); border-bottom: 1px solid var(--uix-border-strong); }
81
+ .uix-rundown__number { color: var(--uix-text-hushed); font-size: var(--uix-text-eyebrow); font-variant-numeric: tabular-nums; }
82
+ .uix-rundown__item[data-selected="true"] .uix-rundown__number { min-width: 22px; height: 22px; display: inline-grid; place-items: center; border-radius: var(--uix-radius-pill); background: var(--uix-text); color: var(--uix-bg-app); }
83
+ .uix-rundown__topic,
84
+ .uix-rundown__item-title { display: block; }
85
+ .uix-rundown__topic { color: var(--uix-text-hushed); font-size: var(--uix-text-eyebrow); }
86
+ .uix-rundown__item-title { margin-top: var(--uix-space-1); font-weight: 600; line-height: 1.2; }
87
+
88
+ /* ── section heads ─────────────────────────────────────────────────────────── */
89
+ .uix-section-head { min-height: 36px; margin-bottom: var(--uix-space-3); display: flex; align-items: center; justify-content: space-between; gap: var(--uix-space-4); }
90
+ .uix-section-title { margin: 0; font-family: var(--uix-font-heading); font-size: var(--uix-text-h2); font-weight: 400; letter-spacing: var(--uix-tracking-tight); }
91
+ .uix-section-link { color: var(--uix-text-hushed); font-size: var(--uix-text-meta); text-decoration: none; }
92
+ /* already a quiet link by its own design — hover/focus parity with link.css */
93
+ .uix-section-link:is(:hover, :focus-visible) { color: var(--uix-text); text-decoration: underline; }
94
+
95
+ /* ── content grid + rail ───────────────────────────────────────────────────── */
96
+ .uix-content-grid { display: grid; grid-template-columns: minmax(0, 1.65fr) minmax(280px, 0.75fr); gap: var(--uix-space-7); align-items: start; }
97
+ .uix-content-grid--balanced { grid-template-columns: repeat(2, minmax(0, 1fr)); }
98
+ .uix-content-grid > * { min-width: 0; }
99
+ .uix-rail { display: grid; gap: var(--uix-space-4); }
100
+ .uix-rail-card { padding: var(--uix-space-5); }
101
+ .uix-rail-card__title { margin: 0; font-family: var(--uix-font-heading); font-size: 18px; font-weight: 400; }
102
+ .uix-rail-card__meta { margin: var(--uix-space-1) 0 0; color: var(--uix-text-hushed); font-size: var(--uix-text-meta); }
103
+
104
+ /* ── news lead + content list ──────────────────────────────────────────────── */
105
+ .uix-news-lead { padding: 0 0 var(--uix-space-5); border-bottom: 1px solid var(--uix-border); }
106
+ .uix-news-lead__meta,
107
+ .uix-list-meta { color: var(--uix-text-hushed); font-size: var(--uix-text-meta); }
108
+ .uix-news-lead__title { margin: var(--uix-space-2) 0 var(--uix-space-1); font-family: var(--uix-font-heading); font-size: var(--uix-text-h2); font-weight: 400; letter-spacing: var(--uix-tracking-tight); }
109
+ .uix-news-lead__summary { margin: 0; color: var(--uix-text-hushed); }
110
+
111
+ .uix-content-list { margin: 0; padding: 0; list-style: none; }
112
+ .uix-content-list__item { min-height: 68px; padding: var(--uix-space-3) 0; display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: var(--uix-space-4); border-bottom: 1px solid var(--uix-border); }
113
+ .uix-content-list__item:last-child { border-bottom: 0; }
114
+ .uix-content-list__title { margin: 0; font-weight: 600; }
115
+ .uix-content-list__meta { margin: var(--uix-space-1) 0 0; color: var(--uix-text-hushed); font-size: var(--uix-text-meta); }
116
+
117
+ /* ── resource grid ─────────────────────────────────────────────────────────── */
118
+ .uix-resource-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--uix-space-2); }
119
+ .uix-resource-grid .uix-btn { min-height: 44px; justify-content: flex-start; }
120
+
121
+ /* ── stat line ─────────────────────────────────────────────────────────────── */
122
+ .uix-stat-line { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); border-top: 1px solid var(--uix-border); }
123
+ .uix-stat-line__item { padding: var(--uix-space-4) var(--uix-space-2) var(--uix-space-1) 0; }
124
+ .uix-stat-line__value { display: block; font-size: 20px; font-variant-numeric: tabular-nums; }
125
+ .uix-stat-line__label { color: var(--uix-text-hushed); font-size: var(--uix-text-eyebrow); }
126
+
127
+ /* ── event + status rows ───────────────────────────────────────────────────── */
128
+ .uix-event-row { min-height: 64px; padding-block: var(--uix-space-3); display: grid; grid-template-columns: 42px minmax(0, 1fr); align-items: center; gap: var(--uix-space-3); border-bottom: 1px solid var(--uix-border); }
129
+ .uix-event-row:last-child { border-bottom: 0; }
130
+ .uix-event-date { text-align: center; }
131
+ .uix-event-date__month { display: block; color: var(--uix-text-hushed); font-size: var(--uix-text-eyebrow); text-transform: uppercase; }
132
+ .uix-event-date__day { display: block; font-size: 18px; font-variant-numeric: tabular-nums; }
133
+ .uix-event-row__title { margin: 0; font-weight: 600; }
134
+ .uix-event-row__meta { margin: var(--uix-space-1) 0 0; color: var(--uix-text-hushed); font-size: var(--uix-text-meta); }
135
+
136
+ .uix-status-row { min-height: 48px; display: flex; align-items: center; gap: var(--uix-space-3); border-bottom: 1px solid var(--uix-border); }
137
+ .uix-status-row:last-child { border-bottom: 0; }
138
+ .uix-status-row__name { flex: 1; }
139
+
140
+ /* ── responsive — ported 1:1 from the prototype's 920/620 breakpoints ──────── */
141
+ @media (max-width: 920px) {
142
+ .uix-page-intro,
143
+ .uix-content-grid,
144
+ .uix-content-grid--balanced,
145
+ .uix-featured { grid-template-columns: 1fr; }
146
+
147
+ .uix-rundown { border-left: 0; border-top: 1px solid var(--uix-border); }
148
+ .uix-rundown__items { grid-template-columns: repeat(3, minmax(0, 1fr)); grid-template-rows: 1fr; }
149
+ /* stacked zones: the caret flips to point up at the stage above */
150
+ .uix-rundown__item[data-selected="true"]::before { top: -23px; left: 22px; transform: rotate(45deg); border-bottom: 0; border-top: 1px solid var(--uix-border-strong); }
151
+
152
+ .uix-shortcut-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
153
+ }
154
+
155
+ @media (max-width: 620px) {
156
+ .uix-featured__stage { grid-template-columns: 1fr; }
157
+ .uix-featured__visual { min-height: 190px; }
158
+ .uix-featured__content { padding: var(--uix-space-6); }
159
+
160
+ .uix-rundown__items { grid-template-columns: 1fr; grid-template-rows: repeat(3, auto); }
161
+ /* vertical item stack: the directional caret stops making sense — the
162
+ ordinal chips (item number + .uix-featured__now) carry the pairing */
163
+ .uix-rundown__item[data-selected="true"]::before { display: none; }
164
+
165
+ .uix-notice { grid-template-columns: auto minmax(0, 1fr); }
166
+ .uix-notice > .uix-btn { grid-column: 2; justify-self: start; }
167
+ .uix-notice__actions { grid-column: 1 / -1; width: 100%; justify-content: flex-start; flex-wrap: wrap; }
168
+ .uix-notice__position { flex: 1; }
169
+
170
+ .uix-searchbar { grid-template-columns: 1fr; }
171
+ .uix-searchbar .uix-btn { min-height: 44px; }
172
+
173
+ .uix-page-intro { margin-top: var(--uix-space-5); gap: var(--uix-space-5); }
174
+ .uix-shortcut-grid { grid-template-columns: 1fr 1fr; }
175
+ .uix-shortcut-grid .uix-btn { min-height: 48px; }
176
+
177
+ .uix-story-signal { top: 20px; left: 20px; }
178
+ .uix-story-signal__value { font-size: var(--uix-text-display); }
179
+
180
+ .uix-resource-grid { grid-template-columns: 1fr; }
181
+
182
+ .uix-stat-line { grid-template-columns: 1fr; }
183
+ .uix-stat-line__item { display: flex; align-items: baseline; justify-content: space-between; border-bottom: 1px solid var(--uix-border); }
184
+ }
185
+ }
@@ -0,0 +1,14 @@
1
+ /* uix file upload / dropzone — depends only on --uix-* tokens. */
2
+ @layer uix.components {
3
+ .uix-dropzone {
4
+ display: flex; flex-direction: column; align-items: center; gap: var(--uix-space-2); padding: var(--uix-space-7); text-align: center;
5
+ border: 1.5px dashed var(--uix-border-strong); border-radius: var(--uix-radius-lg);
6
+ background: var(--uix-bg-subtle); color: var(--uix-text-muted); cursor: pointer;
7
+ transition: border-color var(--uix-dur-fast) var(--uix-ease-out), background-color var(--uix-dur-fast) var(--uix-ease-out), color var(--uix-dur-fast) var(--uix-ease-out);
8
+ }
9
+ .uix-dropzone:hover, .uix-dropzone[data-dragover] { border-color: var(--uix-accent); background: var(--uix-brand-muted); color: var(--uix-text); }
10
+ .uix-dropzone svg { width: var(--uix-icon-lg); height: var(--uix-icon-lg); }
11
+ .uix-filelist { display: flex; flex-direction: column; gap: var(--uix-space-2); margin-top: var(--uix-space-3); }
12
+ .uix-filelist__item { display: flex; align-items: center; gap: var(--uix-space-3); padding: var(--uix-space-2) var(--uix-space-3); border: 1px solid var(--uix-border); border-radius: var(--uix-radius-md); background: var(--uix-surface); font-size: var(--uix-text-meta); color: var(--uix-text); }
13
+ .uix-filelist__size { margin-left: auto; color: var(--uix-text-muted); }
14
+ }