@tensor_1/tokens 2.11.0 → 2.13.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 (86) hide show
  1. package/README.md +8 -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/brand-profiles.css +12 -0
  11. package/styles/components/breadcrumbs.css +10 -0
  12. package/styles/components/builder-canvas.css +17 -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/color-picker.css +14 -0
  19. package/styles/components/combobox.css +16 -0
  20. package/styles/components/command-palette.css +14 -0
  21. package/styles/components/comments.css +17 -0
  22. package/styles/components/contact-card.css +12 -0
  23. package/styles/components/date-range-picker.css +16 -0
  24. package/styles/components/description-list.css +6 -0
  25. package/styles/components/detail-layout.css +7 -0
  26. package/styles/components/diff-viewer.css +14 -0
  27. package/styles/components/drawer.css +24 -0
  28. package/styles/components/editorial-home.css +188 -0
  29. package/styles/components/file-upload.css +14 -0
  30. package/styles/components/flow.css +196 -0
  31. package/styles/components/form.css +14 -0
  32. package/styles/components/heartbeat.css +12 -0
  33. package/styles/components/inbox.css +13 -0
  34. package/styles/components/input.css +39 -0
  35. package/styles/components/kanban.css +14 -0
  36. package/styles/components/kbd.css +8 -0
  37. package/styles/components/labels.css +13 -0
  38. package/styles/components/license-position-bar.css +8 -0
  39. package/styles/components/lightbox.css +13 -0
  40. package/styles/components/link.css +98 -0
  41. package/styles/components/list.css +10 -0
  42. package/styles/components/match-review.css +11 -0
  43. package/styles/components/media.css +9 -0
  44. package/styles/components/menu.css +15 -0
  45. package/styles/components/meter.css +9 -0
  46. package/styles/components/metric-input.css +9 -0
  47. package/styles/components/modal.css +31 -0
  48. package/styles/components/notification-center.css +14 -0
  49. package/styles/components/page-header.css +9 -0
  50. package/styles/components/pagination.css +14 -0
  51. package/styles/components/peek.css +46 -0
  52. package/styles/components/pipeline.css +9 -0
  53. package/styles/components/popover.css +11 -0
  54. package/styles/components/progress.css +12 -0
  55. package/styles/components/prose.css +27 -0
  56. package/styles/components/radio.css +20 -0
  57. package/styles/components/reactions.css +22 -0
  58. package/styles/components/relationship-graph.css +21 -0
  59. package/styles/components/rule-builder.css +17 -0
  60. package/styles/components/scheduling-calendar.css +22 -0
  61. package/styles/components/segmented.css +12 -0
  62. package/styles/components/select.css +23 -0
  63. package/styles/components/sidebar.css +102 -0
  64. package/styles/components/sla.css +8 -0
  65. package/styles/components/slider.css +16 -0
  66. package/styles/components/spinner.css +10 -0
  67. package/styles/components/stat-tile.css +11 -0
  68. package/styles/components/states.css +13 -0
  69. package/styles/components/status-pill.css +37 -0
  70. package/styles/components/stepper.css +13 -0
  71. package/styles/components/steps.css +18 -0
  72. package/styles/components/switch.css +19 -0
  73. package/styles/components/table-toolbar.css +20 -0
  74. package/styles/components/table.css +160 -0
  75. package/styles/components/tabs.css +31 -0
  76. package/styles/components/tag-input.css +16 -0
  77. package/styles/components/textarea.css +15 -0
  78. package/styles/components/timeline.css +11 -0
  79. package/styles/components/toast.css +21 -0
  80. package/styles/components/tooltip.css +35 -0
  81. package/styles/components/tree.css +17 -0
  82. package/styles/components/typography.css +45 -0
  83. package/styles/components/utility-bits.css +14 -0
  84. package/styles/components/view-menu.css +14 -0
  85. package/styles/motion.css +35 -0
  86. 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.13.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,12 @@
1
+ @layer uix.components {
2
+ .uix-brand-profiles { display:grid; grid-template-columns:minmax(16rem,.8fr) minmax(18rem,1.2fr); gap:var(--uix-space-5); color:var(--uix-text); }
3
+ .uix-brand-profiles__form { display:grid; align-content:start; gap:var(--uix-space-3); }
4
+ .uix-brand-profiles__form label { display:grid; gap:var(--uix-space-2); font-weight:600; }
5
+ .uix-brand-profiles__colors { display:grid; grid-template-columns:1fr 1fr; gap:var(--uix-space-3); }
6
+ .uix-brand-profiles__upload { padding:var(--uix-space-3); border:1px dashed var(--uix-border-strong); border-radius:var(--uix-radius-md); background:var(--uix-bg-subtle); }
7
+ .uix-brand-profiles__preview { overflow:hidden; align-self:start; border:1px solid var(--uix-border); border-radius:var(--uix-radius-lg); background:var(--uix-surface); box-shadow:var(--uix-shadow-sm); font-family:var(--uix-font-sans); }
8
+ .uix-brand-profiles__preview-header { display:flex; align-items:center; gap:var(--uix-space-3); padding:var(--uix-space-4); background:var(--uix-accent); color:var(--uix-accent-fg); }
9
+ .uix-brand-profiles__preview-header img,.uix-brand-profiles__logo-placeholder { display:grid; place-items:center; width:3rem; height:3rem; border-radius:var(--uix-radius-md); background:var(--uix-surface); color:var(--uix-text); object-fit:contain; }
10
+ .uix-brand-profiles__preview-body { display:grid; justify-items:start; gap:var(--uix-space-3); padding:var(--uix-space-6); } .uix-brand-profiles__preview-body h3 { font-family:var(--uix-font-heading); }
11
+ @media (max-width:720px) { .uix-brand-profiles { grid-template-columns:1fr; } .uix-brand-profiles__colors { grid-template-columns:1fr; } }
12
+ }
@@ -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,17 @@
1
+ @layer uix.components {
2
+ .uix-builder-canvas { display:grid; grid-template-columns:minmax(11rem,.7fr) minmax(16rem,1.5fr) minmax(12rem,1fr); min-height:24rem; border:1px solid var(--uix-border); border-radius:var(--uix-radius-lg); overflow:hidden; background:var(--uix-surface); color:var(--uix-text); }
3
+ .uix-builder-canvas>aside,.uix-builder-canvas__workspace { min-width:0; padding:var(--uix-space-4); }
4
+ .uix-builder-canvas__palette,.uix-builder-canvas__workspace { border-right:1px solid var(--uix-border); }
5
+ .uix-builder-canvas h3 { margin-bottom:var(--uix-space-3); font-size:var(--uix-text-h3); }
6
+ .uix-builder-canvas ul,.uix-builder-canvas ol { display:grid; gap:var(--uix-space-2); margin:0; padding:0; list-style:none; }
7
+ .uix-builder-canvas__palette button,.uix-builder-canvas__item-main { width:100%; display:grid; gap:var(--uix-space-1); padding:var(--uix-space-3); border:1px solid var(--uix-border); border-radius:var(--uix-radius-md); background:var(--uix-surface); color:var(--uix-text); text-align:left; }
8
+ .uix-builder-canvas__palette button:hover,.uix-builder-canvas__item-main:hover { background:var(--uix-bg-hover); }
9
+ .uix-builder-canvas__palette button span,.uix-builder-canvas__item-main span { color:var(--uix-text-muted); font-size:var(--uix-text-meta); }
10
+ .uix-builder-canvas__item { display:grid; grid-template-columns:minmax(0,1fr) auto; gap:var(--uix-space-2); padding:var(--uix-space-2); border:1px solid var(--uix-border); border-radius:var(--uix-radius-md); background:var(--uix-surface-2); }
11
+ .uix-builder-canvas__item--selected { border-color:var(--uix-accent); box-shadow:0 0 0 2px var(--uix-ring); }
12
+ .uix-builder-canvas__item-actions { display:grid; gap:var(--uix-space-1); }
13
+ .uix-builder-canvas__item-actions button { border:0; background:transparent; color:var(--uix-link); font-size:var(--uix-text-meta); }
14
+ .uix-builder-canvas__state { display:grid; justify-items:start; gap:var(--uix-space-3); padding:var(--uix-space-6); border:1px dashed var(--uix-border-strong); border-radius:var(--uix-radius-md); color:var(--uix-text-muted); }
15
+ .uix-builder-canvas__properties dl { display:grid; grid-template-columns:auto 1fr; gap:var(--uix-space-2); } .uix-builder-canvas__properties dt { color:var(--uix-text-muted); }
16
+ @media (max-width:800px) { .uix-builder-canvas { grid-template-columns:1fr; } .uix-builder-canvas__palette,.uix-builder-canvas__workspace { border-right:0; border-bottom:1px solid var(--uix-border); } }
17
+ }
@@ -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,14 @@
1
+ @layer uix.components {
2
+ .uix-color-picker { position:relative; display:inline-block; color:var(--uix-text); font-weight:400; }
3
+ .uix-color-picker__trigger { display:flex; align-items:center; gap:var(--uix-space-2); min-height:var(--uix-control-h); padding:var(--uix-space-2) var(--uix-space-3); border:1px solid var(--uix-border-strong); border-radius:var(--uix-radius-md); background:var(--uix-surface); color:var(--uix-text); font-family:var(--uix-font-mono); }
4
+ .uix-color-picker__swatch,.uix-color-picker__preset { width:1.5rem; height:1.5rem; border:1px solid var(--uix-border-strong); border-radius:var(--uix-radius-sm); }
5
+ .uix-color-picker__popover { position:absolute; z-index:var(--uix-z-dropdown); top:calc(100% + var(--uix-space-2)); left:0; display:grid; gap:var(--uix-space-3); width:min(20rem,calc(100vw - var(--uix-space-8))); padding:var(--uix-space-4); border:1px solid var(--uix-border); border-radius:var(--uix-radius-lg); background:var(--uix-surface); box-shadow:var(--uix-shadow-popover); }
6
+ .uix-color-picker__popover[hidden] { display:none; }
7
+ .uix-color-picker__preview { display:grid; place-items:center; min-height:5rem; border:1px solid var(--uix-border); border-radius:var(--uix-radius-md); font-size:var(--uix-text-h2); font-weight:700; }
8
+ .uix-color-picker__range,.uix-color-picker__hex { display:grid; grid-template-columns:1fr auto; gap:var(--uix-space-1); color:var(--uix-text-muted); font-size:var(--uix-text-meta); }
9
+ .uix-color-picker__range input { grid-column:1/-1; width:100%; accent-color:var(--uix-accent); }
10
+ .uix-color-picker__hex-row { grid-column:1/-1; display:grid; grid-template-columns:1fr auto; gap:var(--uix-space-2); }
11
+ .uix-color-picker__palettes { display:grid; gap:var(--uix-space-2); } .uix-color-picker__palettes fieldset { border:0; } .uix-color-picker__palettes legend { margin-bottom:var(--uix-space-1); color:var(--uix-text-muted); font-size:var(--uix-text-meta); } .uix-color-picker__palettes fieldset>div { display:flex; flex-wrap:wrap; gap:var(--uix-space-2); }
12
+ .uix-color-picker__preset { padding:0; } .uix-color-picker__contrast { padding:var(--uix-space-2); border-radius:var(--uix-radius-md); font-size:var(--uix-text-meta); }
13
+ .uix-color-picker__contrast--pass { background:var(--uix-success-bg); color:var(--uix-text); } .uix-color-picker__contrast--fail { background:var(--uix-danger-bg); color:var(--uix-danger-text); }
14
+ }
@@ -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,16 @@
1
+ @layer uix.components {
2
+ .uix-date-range-picker { display:grid; gap:var(--uix-space-3); max-width:46rem; padding:var(--uix-space-4); border:1px solid var(--uix-border); border-radius:var(--uix-radius-lg); background:var(--uix-surface); color:var(--uix-text); }
3
+ .uix-date-range-picker__header { display:flex; justify-content:space-between; gap:var(--uix-space-3); align-items:center; } .uix-date-range-picker__header>div { display:flex; gap:var(--uix-space-1); }
4
+ .uix-date-range-picker__months { display:grid; grid-template-columns:repeat(2,minmax(15rem,1fr)); gap:var(--uix-space-4); }
5
+ .uix-date-range-picker__month h4 { margin-bottom:var(--uix-space-2); text-align:center; }
6
+ .uix-date-range-picker__weekdays,.uix-date-range-picker__grid { display:grid; grid-template-columns:repeat(7,1fr); }
7
+ .uix-date-range-picker__weekdays span { padding:var(--uix-space-1); color:var(--uix-text-muted); text-align:center; font-size:var(--uix-text-meta); }
8
+ .uix-date-range-picker__grid button { aspect-ratio:1; min-width:2rem; border:0; border-radius:0; background:transparent; color:var(--uix-text); }
9
+ .uix-date-range-picker__grid button:hover { background:var(--uix-bg-hover); }
10
+ .uix-date-range-picker__grid button[data-in-range] { background:var(--uix-brand-muted); }
11
+ .uix-date-range-picker__grid button[data-range-edge] { border-radius:var(--uix-radius-pill); background:var(--uix-accent); color:var(--uix-accent-fg); font-weight:600; }
12
+ .uix-date-range-picker__grid button:disabled { color:var(--uix-text-hushed); text-decoration:line-through; }
13
+ .uix-date-range-picker__selection { color:var(--uix-text-muted); font-size:var(--uix-text-meta); }
14
+ .uix-date-range-picker--invalid { border-color:var(--uix-danger); }
15
+ @media (max-width:640px) { .uix-date-range-picker__months { grid-template-columns:1fr; } }
16
+ }
@@ -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,14 @@
1
+ @layer uix.components {
2
+ .uix-diff-viewer { display:grid; gap:var(--uix-space-4); color:var(--uix-text); }
3
+ .uix-diff-viewer__summary { display:flex; flex-wrap:wrap; gap:var(--uix-space-2); } .uix-diff-viewer__summary span { padding:var(--uix-space-2) var(--uix-space-3); border-radius:var(--uix-radius-pill); background:var(--uix-bg-subtle); color:var(--uix-text-muted); font-size:var(--uix-text-meta); }
4
+ .uix-diff-viewer__group { display:grid; gap:var(--uix-space-2); } .uix-diff-viewer__group>h3 { display:flex; gap:var(--uix-space-2); align-items:center; } .uix-diff-viewer__group>h3 span { color:var(--uix-text-muted); font-size:var(--uix-text-meta); }
5
+ .uix-diff-viewer__entry { border:1px solid var(--uix-border); border-left:4px solid var(--uix-info); border-radius:var(--uix-radius-md); background:var(--uix-surface); overflow:hidden; }
6
+ .uix-diff-viewer__entry[data-kind="conflicted"] { border-left-color:var(--uix-danger); } .uix-diff-viewer__entry[data-kind="added"] { border-left-color:var(--uix-success); } .uix-diff-viewer__entry[data-kind="removed"] { border-left-color:var(--uix-warning); }
7
+ .uix-diff-viewer__entry summary { display:flex; justify-content:space-between; align-items:center; gap:var(--uix-space-3); padding:var(--uix-space-3); cursor:pointer; background:var(--uix-bg-subtle); }
8
+ .uix-diff-viewer__versions { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); background:var(--uix-border); }
9
+ .uix-diff-viewer__versions>div { min-width:0; padding:var(--uix-space-3); border-right:1px solid var(--uix-border); background:var(--uix-surface); } .uix-diff-viewer__versions>div:last-child { border-right:0; } .uix-diff-viewer__versions strong { color:var(--uix-text-muted); font-size:var(--uix-text-meta); }
10
+ .uix-diff-viewer__versions pre { max-height:14rem; overflow:auto; margin-top:var(--uix-space-2); color:var(--uix-text); font-family:var(--uix-font-mono); white-space:pre-wrap; overflow-wrap:anywhere; }
11
+ .uix-diff-viewer__actions { display:flex; flex-wrap:wrap; gap:var(--uix-space-2); padding:var(--uix-space-3); border-top:1px solid var(--uix-border); }
12
+ .uix-diff-viewer--empty { padding:var(--uix-space-6); border:1px dashed var(--uix-border-strong); border-radius:var(--uix-radius-lg); color:var(--uix-text-muted); }
13
+ @media (max-width:720px) { .uix-diff-viewer__versions { grid-template-columns:1fr; } }
14
+ }
@@ -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
+ }