@vireo-ai/trellis-ui 0.1.51 → 0.1.52

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 (69) hide show
  1. package/package.json +6 -1
  2. package/packages/client/src/components/select/styles.css +19 -0
  3. package/packages/client/src/styles/theme-support.css +267 -0
  4. package/packages/client/src/styles/theme.css +1 -268
  5. package/packages/server/trellis_ui/static/trellis_ui/assets/css/trellis.css +11 -0
  6. package/packages/server/trellis_ui/static/trellis_ui/assets/css/trellis.min.css +1 -1
  7. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/build-metadata.json +252 -252
  8. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/capabilities/motion.js +1 -1
  9. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/capabilities/sortable.js +1 -1
  10. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{capability-motion-DRILCSFH.js → capability-motion-DQitxnHn.js} +2 -2
  11. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{capability-motion-DRILCSFH.js.map → capability-motion-DQitxnHn.js.map} +1 -1
  12. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{capability-sortable-CpSdQwYp.js → capability-sortable-Dzv1zWaL.js} +2 -2
  13. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{capability-sortable-CpSdQwYp.js.map → capability-sortable-Dzv1zWaL.js.map} +1 -1
  14. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{core-DnQs1xY6.js → core-DMbnlSdM.js} +2 -2
  15. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{core-DnQs1xY6.js.map → core-DMbnlSdM.js.map} +1 -1
  16. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/cursor-data-source-DvHNTjt1.js +2 -0
  17. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/cursor-data-source-DvHNTjt1.js.map +1 -0
  18. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-cnWgB3wz.js → entry.generated-CvcufWkj.js} +2 -2
  19. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-cnWgB3wz.js.map → entry.generated-CvcufWkj.js.map} +1 -1
  20. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-BiyFgA-e.js → entry.generated-D3w3QaSO.js} +2 -2
  21. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-BiyFgA-e.js.map → entry.generated-D3w3QaSO.js.map} +1 -1
  22. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-CeD3bUBI.js → entry.generated-DCLIvEtJ.js} +2 -2
  23. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-CeD3bUBI.js.map → entry.generated-DCLIvEtJ.js.map} +1 -1
  24. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-TbFjT_mY.js → entry.generated-DVQaci6w.js} +2 -2
  25. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-TbFjT_mY.js.map → entry.generated-DVQaci6w.js.map} +1 -1
  26. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-D3am_GtI.js → entry.generated-DvvVMsQo.js} +2 -2
  27. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-D3am_GtI.js.map → entry.generated-DvvVMsQo.js.map} +1 -1
  28. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-D7qa64eM.js → entry.generated-Rx9NofFi.js} +2 -2
  29. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-Rx9NofFi.js.map +1 -0
  30. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-oz1RCU1b.js +2 -0
  31. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-oz1RCU1b.js.map +1 -0
  32. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-DbC4gkeV.js → entry.generated-payXlXhL.js} +2 -2
  33. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-DbC4gkeV.js.map → entry.generated-payXlXhL.js.map} +1 -1
  34. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry2.generated-BSal0xp9.js → entry2.generated-CpoK52gE.js} +2 -2
  35. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry2.generated-BSal0xp9.js.map → entry2.generated-CpoK52gE.js.map} +1 -1
  36. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry2.generated-JcxejQr4.js → entry2.generated-D1X0sDop.js} +2 -2
  37. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry2.generated-JcxejQr4.js.map → entry2.generated-D1X0sDop.js.map} +1 -1
  38. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry2.generated-DCbmWkHV.js → entry2.generated-DXDHgDsN.js} +2 -2
  39. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry2.generated-DCbmWkHV.js.map → entry2.generated-DXDHgDsN.js.map} +1 -1
  40. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry2.generated-D26Cigu5.js → entry2.generated-_UPpJlWp.js} +2 -2
  41. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry2.generated-D26Cigu5.js.map → entry2.generated-_UPpJlWp.js.map} +1 -1
  42. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{motion-B4uuk1JX.js → motion-BDQdr83d.js} +2 -2
  43. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{motion-B4uuk1JX.js.map → motion-BDQdr83d.js.map} +1 -1
  44. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/ui-SdoiMWig.js +4 -0
  45. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{ui-FOJhyz8V.js.map → ui-SdoiMWig.js.map} +1 -1
  46. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/accordion.js +1 -1
  47. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/data-grid.js +1 -1
  48. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/date-picker.js +1 -1
  49. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/dropdown.js +1 -1
  50. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/index.js +1 -1
  51. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/modal.js +1 -1
  52. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/panels.js +1 -1
  53. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/select.js +1 -1
  54. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/sidebar.js +1 -1
  55. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/tabs.js +1 -1
  56. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/toast.js +1 -1
  57. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/tooltip.js +1 -1
  58. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/virtualizer.js +1 -1
  59. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/core.js +1 -1
  60. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/index.js +1 -1
  61. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/logical-entry-manifest.json +91 -91
  62. package/packages/server/trellis_ui/static/trellis_ui/assets/js/trellis.js +8 -8
  63. package/packages/server/trellis_ui/static/trellis_ui/assets/js/trellis.min.js +8 -8
  64. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/cursor-data-source-5pQvlhmK.js +0 -2
  65. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/cursor-data-source-5pQvlhmK.js.map +0 -1
  66. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-CPzThz_M.js +0 -2
  67. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-CPzThz_M.js.map +0 -1
  68. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-D7qa64eM.js.map +0 -1
  69. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/ui-FOJhyz8V.js +0 -4
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vireo-ai/trellis-ui",
3
- "version": "0.1.51",
3
+ "version": "0.1.52",
4
4
  "type": "module",
5
5
  "description": "Django-native UI toolkit for building realtime and interactive web apps.",
6
6
  "license": "MIT",
@@ -64,6 +64,9 @@
64
64
  "./cdn.js": "./packages/server/trellis_ui/static/trellis_ui/assets/js/trellis.js",
65
65
  "./cdn.min.js": "./packages/server/trellis_ui/static/trellis_ui/assets/js/trellis.min.js",
66
66
  "./theme.css": "./packages/client/src/styles/theme.css",
67
+ "./theme-support.css": "./packages/client/src/styles/theme-support.css",
68
+ "./components.css": "./packages/client/src/styles/components.css",
69
+ "./sources.css": "./packages/client/src/styles/generated-sources.css",
67
70
  "./styles.css": "./packages/server/trellis_ui/static/trellis_ui/assets/css/trellis.css",
68
71
  "./styles.min.css": "./packages/server/trellis_ui/static/trellis_ui/assets/css/trellis.min.css",
69
72
  "./cdn.css": "./packages/server/trellis_ui/static/trellis_ui/assets/css/trellis.css",
@@ -109,9 +112,11 @@
109
112
  "test:browser": "playwright test",
110
113
  "test": "pnpm run test:unit && pnpm run test:python && pnpm run test:browser",
111
114
  "test:watch": "pnpm run generate:component-entries && vitest",
115
+ "trellis": "node packages/theme-engine/dist/cli.js",
112
116
  "prek": "uv run prek",
113
117
  "clean:types": "node -e \"require('node:fs').rmSync('packages/client/types', { recursive: true, force: true })\"",
114
118
  "build:theme": "pnpm --filter @vireo-ai/trellis-theme-engine run build && node packages/theme-engine/scripts/generate-default-css.mjs && node packages/theme-engine/scripts/generate-theme-knobs.mjs",
119
+ "build:docs-theme": "pnpm trellis theme build docs/trellis/themes/default/theme.json",
115
120
  "build:sources": "pnpm run build:theme && pnpm run build:manifests",
116
121
  "build:manifests": "vite build --config vite.manifests.config.ts && python3 scripts/generate_ui_events.py",
117
122
  "build:runtime-docs": "pnpm run build:manifests && pnpm run build:types && pnpm run generate:runtime-docs",
@@ -4,9 +4,28 @@
4
4
  }
5
5
 
6
6
  [data-ui-select-virtualizer] > [data-ui-scroll-area] {
7
+ width: 100%;
8
+ min-width: 0;
9
+ max-width: 100%;
7
10
  max-height: var(--ui-select-listbox-max-height, var(--spacing-select-listbox));
8
11
  }
9
12
 
13
+ [data-ui-select-options],
14
+ [data-ui-select-virtualizer],
15
+ [data-ui-select-virtualizer] [data-ui-scroll-area-content],
16
+ [data-ui-select-virtualizer] [data-ui-virtualizer-spacer],
17
+ [data-ui-select-virtualizer] [data-ui-virtualizer-block] {
18
+ width: 100%;
19
+ min-width: 0;
20
+ max-width: 100%;
21
+ }
22
+
23
+ [data-ui-select-virtualizer] [data-ui-virtualizer-block] {
24
+ padding-inline-end: calc(
25
+ var(--spacing-popover-padding) + var(--ui-scrollbar-size) + var(--ui-scrollbar-inset)
26
+ );
27
+ }
28
+
10
29
  [data-ui-select-virtualizer] > [data-ui-scroll-area] > [data-ui-scroll-area-viewport] > [data-ui-scroll-area-content] {
11
30
  padding-block: var(--spacing-popover-padding);
12
31
  }
@@ -0,0 +1,267 @@
1
+ @custom-variant dark (&:where(.dark, .dark *):not(:where(.light, .light *)));
2
+ @custom-variant ui-interactive (&:is([data-ui-interactive]));
3
+ @custom-variant ui-active (&:is(:active, :focus-visible, [data-active], [data-highlighted]));
4
+ @custom-variant ui-selected (&:is([data-selected="true"], [aria-selected="true"], [data-current], [aria-current]:not([aria-current="false"]), [data-checked], [aria-checked="true"], [data-pressed], [aria-pressed="true"]));
5
+
6
+ /* Keep the core authored palette available to custom components in the precompiled package. */
7
+ @source inline("{bg,text,border,ring,fill,stroke}-{neutral,accent}-{1..12}");
8
+ @source inline("{bg,text,border,ring,fill,stroke}-{neutral,accent}-a{1..12}");
9
+ @source inline("bg-canvas {bg,border,ring,fill,stroke}-surface-{0..8}");
10
+ @source inline("text-surface-{0..8}-{ink,ink-muted} shadow-elevation-{0..8}");
11
+ @source inline("rounded-{1..6} rounded-{control,surface,overlay} rounded-{control,surface,overlay}-{xs,sm,md,lg}");
12
+ @source inline("{rounded-t,rounded-r,rounded-b,rounded-l}-{control,surface,overlay}-{xs,sm,md,lg}");
13
+ @source inline("rounded-{none,full,circle}");
14
+ @source inline("gap-control-gap px-control-padding-{xs,sm,md,lg,xlg} px-badge-padding-{xs,sm,md,lg,xlg}");
15
+ @source inline("p-popover-padding px-menu-item-padding-inline");
16
+ @source inline("text-{1..13} text-{body,heading,code,label,description,metadata,menu-item}");
17
+ @source inline("text-{control,badge}-{xs,sm,md,lg,xlg}");
18
+ @source inline("font-{body,heading,code,control,badge,label,description,metadata,menu-item}");
19
+ @source inline("min-h-control-multiline-{xs,sm,md,lg,xlg}");
20
+ @source inline("size-{brand-logo,badge-close,checkbox-indicator,radio-indicator,radio-dot,slider-thumb}-{xs,sm,md,lg,xlg}");
21
+ @source inline("h-switch-track-height-{xs,sm,md,lg,xlg} w-switch-track-width-{xs,sm,md,lg,xlg} size-switch-thumb-{xs,sm,md,lg,xlg}");
22
+ @source inline("p-switch-inset data-checked:translate-x-switch-travel-{xs,sm,md,lg,xlg}");
23
+ @source inline("{h,w}-slider-track-{xs,sm,md,lg,xlg} max-w-modal-{sm,md,lg,xl}");
24
+ @source inline("border-{0..3} border-edge-{perimeter,control,separator,divider}");
25
+ @source inline("{border-t,border-r,border-b,border-l}-edge-{perimeter,control,separator,divider}");
26
+
27
+ @media (hover: hover) {
28
+ [data-ui-elevation][data-ui-interactive="surface"]:hover {
29
+ --ui-state-shadow-layers: 0 0 0 var(--border-width-edge-perimeter) var(--ui-surface-edge-hover);
30
+ }
31
+ }
32
+
33
+ [data-ui-elevation][data-ui-interactive="surface"]:is(
34
+ [data-selected="true"],
35
+ [aria-selected="true"],
36
+ [data-current],
37
+ [aria-current]:not([aria-current="false"]),
38
+ [data-checked],
39
+ [aria-checked="true"],
40
+ [data-pressed],
41
+ [aria-pressed="true"]
42
+ ) {
43
+ --ui-state-shadow-layers: 0 0 0 var(--border-width-edge-perimeter) var(--color-intent-accent-edge);
44
+ }
45
+
46
+ [data-ui-elevation][data-ui-interactive="surface"]:is(:focus-visible, :has(:focus-visible)) {
47
+ --ui-state-shadow-layers: 0 0 0 var(--color-intent-accent-focus-width) var(--color-intent-accent-focus);
48
+ }
49
+
50
+ /*
51
+ Shared interaction treatments keep state independent from its visual channels.
52
+ Tonal layers are painted over the element's existing surface with a background
53
+ image, while edge layers join the composable state/elevation shadow stack.
54
+ */
55
+ [data-ui-selection-color],
56
+ [data-ui-interaction] {
57
+ --ui-interaction-selected-fill: var(--background-interaction-selection-neutral);
58
+ --ui-interaction-selected-fill-hover: var(--background-interaction-selection-neutral-hover);
59
+ --ui-interaction-selected-ink: var(--color-interaction-selection-neutral-ink);
60
+ --ui-interaction-selected-edge: var(--color-intent-neutral-edge);
61
+ --ui-interaction-selected-edge-hover: var(--color-intent-neutral-edge-hover);
62
+ --ui-interaction-selected-edge-strong: var(--color-intent-neutral-edge-strong);
63
+ --ui-selection-solid: var(--color-intent-neutral-solid);
64
+ --ui-selection-solid-ink: var(--color-intent-neutral-solid-ink);
65
+ }
66
+
67
+ :is([data-ui-selection-color], [data-ui-interaction])[data-color="accent"] {
68
+ --ui-interaction-selected-fill: var(--background-interaction-selection-accent);
69
+ --ui-interaction-selected-fill-hover: var(--background-interaction-selection-accent-hover);
70
+ --ui-interaction-selected-ink: var(--color-interaction-selection-accent-ink);
71
+ --ui-interaction-selected-edge: var(--color-intent-accent-edge);
72
+ --ui-interaction-selected-edge-hover: var(--color-intent-accent-edge-hover);
73
+ --ui-interaction-selected-edge-strong: var(--color-intent-accent-edge-strong);
74
+ --ui-selection-solid: var(--color-intent-accent-solid);
75
+ --ui-selection-solid-ink: var(--color-intent-accent-solid-ink);
76
+ }
77
+
78
+ [data-ui-interaction] {
79
+ --ui-interaction-fill: transparent;
80
+ --ui-interaction-edge: var(--ui-interaction-rest-edge, transparent);
81
+ }
82
+
83
+ :is([data-ui-interaction="tonal"], [data-ui-interaction="combined"]) {
84
+ background-image: linear-gradient(var(--ui-interaction-fill), var(--ui-interaction-fill));
85
+ }
86
+
87
+ :is([data-ui-interaction="edge"], [data-ui-interaction="combined"]) {
88
+ --ui-state-shadow-layers:
89
+ 0 0 0 var(--border-width-edge-perimeter) var(--ui-interaction-edge);
90
+ }
91
+
92
+ :is([data-ui-interaction="edge"], [data-ui-interaction="combined"]):not([data-ui-elevation]) {
93
+ box-shadow: var(--ui-state-shadow-layers);
94
+ }
95
+
96
+ @media (hover: hover) {
97
+ [data-ui-interaction]:hover {
98
+ --ui-interaction-fill: var(--color-interaction-hover);
99
+ --ui-interaction-edge: var(--ui-surface-edge-hover);
100
+ }
101
+ }
102
+
103
+ [data-ui-interaction]:active {
104
+ --ui-interaction-fill: var(--color-interaction-pressed);
105
+ --ui-interaction-edge: var(--ui-surface-edge-strong);
106
+ }
107
+
108
+ [data-ui-interaction]:is(
109
+ [data-selected="true"],
110
+ [aria-selected="true"],
111
+ [data-current],
112
+ [aria-current]:not([aria-current="false"]),
113
+ [data-checked],
114
+ [aria-checked="true"],
115
+ [data-pressed],
116
+ [aria-pressed="true"]
117
+ ) {
118
+ --ui-interaction-fill: var(--ui-interaction-selected-fill);
119
+ --ui-interaction-edge: var(--ui-interaction-selected-edge);
120
+ }
121
+
122
+ :is([data-ui-interaction="tonal"], [data-ui-interaction="combined"]):is(
123
+ [data-selected="true"],
124
+ [aria-selected="true"],
125
+ [data-current],
126
+ [aria-current]:not([aria-current="false"]),
127
+ [data-checked],
128
+ [aria-checked="true"],
129
+ [data-pressed],
130
+ [aria-pressed="true"]
131
+ ) {
132
+ color: var(--ui-interaction-selected-ink);
133
+ }
134
+
135
+ @media (hover: hover) {
136
+ [data-ui-interaction]:is(
137
+ [data-selected="true"],
138
+ [aria-selected="true"],
139
+ [data-current],
140
+ [aria-current]:not([aria-current="false"]),
141
+ [data-checked],
142
+ [aria-checked="true"],
143
+ [data-pressed],
144
+ [aria-pressed="true"]
145
+ ):hover {
146
+ --ui-interaction-fill: var(--ui-interaction-selected-fill-hover);
147
+ --ui-interaction-edge: var(--ui-interaction-selected-edge-hover);
148
+ }
149
+ }
150
+
151
+ [data-ui-interaction]:is(:focus-visible, :has(:focus-visible)) {
152
+ --ui-state-shadow-layers:
153
+ 0 0 0 var(--color-intent-accent-focus-width) var(--color-intent-accent-focus);
154
+ }
155
+
156
+ /*
157
+ Root theme for the Trellis UI component system.
158
+
159
+ Token layers:
160
+ 1. Generated primitives: 1–12 color families, alpha families, surfaces, and elevation.
161
+ 2. Generated relationships: intent roles, interaction states, paired inks, and scrim.
162
+ 3. Authored recipes: local component variables and state composition.
163
+
164
+ Theme config regenerates the first two layers. Component recipes consume their
165
+ relationships; custom UI may use the registered Tailwind palette directly.
166
+
167
+ CSS ownership:
168
+ - TypeScript style recipes own class composition, variants, sizes, and parts.
169
+ - This file owns imports, Tailwind source hints and variants, tokens, utilities,
170
+ global theme rules, and generic reusable behavior.
171
+ - Colocated component CSS owns selector-only styling that recipes cannot
172
+ express cleanly, such as pseudo-elements, ::part(...), :has(...), native
173
+ quirks, and child-order selectors.
174
+ */
175
+
176
+ @theme {
177
+ --radius-scrollbar-thumb: var(--ui-scrollbar-thumb-radius);
178
+ --container-reading: var(--container-prose);
179
+ --z-index-popover: 50;
180
+ --z-index-dialog: 60;
181
+ --z-index-toast: 70;
182
+ }
183
+
184
+ @theme inline {
185
+ --color-surface: var(--ui-surface-color);
186
+ --color-surface-ink: var(--ui-surface-ink);
187
+ --color-surface-ink-muted: var(--ui-surface-ink-muted);
188
+ --color-label-ink: var(--ui-label-ink);
189
+ --color-icon: var(--ui-surface-ink-muted);
190
+ --color-separator: var(--ui-surface-separator);
191
+ --color-separator-muted: var(--ui-surface-separator-muted);
192
+ --color-scrollbar-thumb: var(--ui-surface-edge);
193
+ --color-scrollbar-thumb-hover: var(--ui-surface-edge-hover);
194
+ }
195
+
196
+ :root,
197
+ .light,
198
+ .dark {
199
+ color-scheme: light;
200
+
201
+ --ui-label-ink: color-mix(
202
+ in oklab,
203
+ var(--ui-surface-ink-muted),
204
+ var(--ui-surface-ink) var(--label-ink-emphasis)
205
+ );
206
+
207
+ --ui-control-height-xs: var(--spacing-control-xs);
208
+ --ui-control-height-sm: var(--spacing-control-sm);
209
+ --ui-control-height-md: var(--spacing-control-md);
210
+ --ui-control-height-lg: var(--spacing-control-lg);
211
+ --ui-control-height-xlg: var(--spacing-control-xlg);
212
+ --ui-popover-radius: var(--radius-overlay-sm);
213
+ --ui-popover-padding: var(--spacing-popover-padding);
214
+
215
+ --ui-icon-size-xs: var(--spacing-icon-xs);
216
+ --ui-icon-size-sm: var(--spacing-icon-sm);
217
+ --ui-icon-size: var(--spacing-icon);
218
+ --ui-icon-size-lg: var(--spacing-icon-lg);
219
+ --ui-scrollbar-size: var(--spacing-scrollbar);
220
+ --ui-scrollbar-inset: var(--spacing-scrollbar-inset);
221
+ --ui-scrollbar-thumb-radius: var(--radius-full);
222
+ }
223
+
224
+ .light {
225
+ color-scheme: light;
226
+ }
227
+
228
+ @utility max-h-xs {
229
+ max-height: var(--container-xs);
230
+ }
231
+
232
+ @utility max-h-sm {
233
+ max-height: var(--container-sm);
234
+ }
235
+
236
+ @utility max-h-md {
237
+ max-height: var(--container-md);
238
+ }
239
+
240
+ @utility max-h-lg {
241
+ max-height: var(--container-lg);
242
+ }
243
+
244
+ @utility max-h-xl {
245
+ max-height: var(--container-xl);
246
+ }
247
+
248
+ @utility max-h-prose {
249
+ max-height: 65ch;
250
+ }
251
+
252
+ @utility ui-edge {
253
+ box-shadow: 0 0 0 var(--border-width-edge-control) var(--ui-surface-edge);
254
+ }
255
+
256
+ @utility ui-focus-ring {
257
+ box-shadow: 0 0 0 var(--color-intent-accent-focus-width) var(--color-intent-accent-focus);
258
+ }
259
+
260
+ @utility ui-focus-ring-inset {
261
+ box-shadow: inset 0 0 0 var(--color-intent-accent-focus-width) var(--color-intent-accent-focus);
262
+ }
263
+
264
+
265
+ .dark {
266
+ color-scheme: dark;
267
+ }
@@ -2,271 +2,4 @@
2
2
  @import "./generated/theme-runtime.css";
3
3
  @import "./components.css";
4
4
  @import "./generated-sources.css";
5
-
6
- @custom-variant dark (&:where(.dark, .dark *):not(:where(.light, .light *)));
7
- @custom-variant ui-interactive (&:is([data-ui-interactive]));
8
- @custom-variant ui-active (&:is(:active, :focus-visible, [data-active], [data-highlighted]));
9
- @custom-variant ui-selected (&:is([data-selected="true"], [aria-selected="true"], [data-current], [aria-current]:not([aria-current="false"]), [data-checked], [aria-checked="true"], [data-pressed], [aria-pressed="true"]));
10
-
11
- /* Keep the core authored palette available to custom components in the precompiled package. */
12
- @source inline("{bg,text,border,ring,fill,stroke}-{neutral,accent}-{1..12}");
13
- @source inline("{bg,text,border,ring,fill,stroke}-{neutral,accent}-a{1..12}");
14
- @source inline("bg-canvas {bg,border,ring,fill,stroke}-surface-{0..8}");
15
- @source inline("text-surface-{0..8}-{ink,ink-muted} shadow-elevation-{0..8}");
16
- @source inline("rounded-{1..6} rounded-{control,surface,overlay} rounded-{control,surface,overlay}-{xs,sm,md,lg}");
17
- @source inline("{rounded-t,rounded-r,rounded-b,rounded-l}-{control,surface,overlay}-{xs,sm,md,lg}");
18
- @source inline("rounded-{none,full,circle}");
19
- @source inline("gap-control-gap px-control-padding-{xs,sm,md,lg,xlg} px-badge-padding-{xs,sm,md,lg,xlg}");
20
- @source inline("p-popover-padding px-menu-item-padding-inline");
21
- @source inline("text-{1..13} text-{body,heading,code,label,description,metadata,menu-item}");
22
- @source inline("text-{control,badge}-{xs,sm,md,lg,xlg}");
23
- @source inline("font-{body,heading,code,control,badge,label,description,metadata,menu-item}");
24
- @source inline("min-h-control-multiline-{xs,sm,md,lg,xlg}");
25
- @source inline("size-{brand-logo,badge-close,checkbox-indicator,radio-indicator,radio-dot,slider-thumb}-{xs,sm,md,lg,xlg}");
26
- @source inline("h-switch-track-height-{xs,sm,md,lg,xlg} w-switch-track-width-{xs,sm,md,lg,xlg} size-switch-thumb-{xs,sm,md,lg,xlg}");
27
- @source inline("p-switch-inset data-checked:translate-x-switch-travel-{xs,sm,md,lg,xlg}");
28
- @source inline("{h,w}-slider-track-{xs,sm,md,lg,xlg} max-w-modal-{sm,md,lg,xl}");
29
- @source inline("border-{0..3} border-edge-{perimeter,control,separator,divider}");
30
- @source inline("{border-t,border-r,border-b,border-l}-edge-{perimeter,control,separator,divider}");
31
-
32
- @media (hover: hover) {
33
- [data-ui-elevation][data-ui-interactive="surface"]:hover {
34
- --ui-state-shadow-layers: 0 0 0 var(--border-width-edge-perimeter) var(--ui-surface-edge-hover);
35
- }
36
- }
37
-
38
- [data-ui-elevation][data-ui-interactive="surface"]:is(
39
- [data-selected="true"],
40
- [aria-selected="true"],
41
- [data-current],
42
- [aria-current]:not([aria-current="false"]),
43
- [data-checked],
44
- [aria-checked="true"],
45
- [data-pressed],
46
- [aria-pressed="true"]
47
- ) {
48
- --ui-state-shadow-layers: 0 0 0 var(--border-width-edge-perimeter) var(--color-intent-accent-edge);
49
- }
50
-
51
- [data-ui-elevation][data-ui-interactive="surface"]:is(:focus-visible, :has(:focus-visible)) {
52
- --ui-state-shadow-layers: 0 0 0 var(--color-intent-accent-focus-width) var(--color-intent-accent-focus);
53
- }
54
-
55
- /*
56
- Shared interaction treatments keep state independent from its visual channels.
57
- Tonal layers are painted over the element's existing surface with a background
58
- image, while edge layers join the composable state/elevation shadow stack.
59
- */
60
- [data-ui-selection-color],
61
- [data-ui-interaction] {
62
- --ui-interaction-selected-fill: var(--background-interaction-selection-neutral);
63
- --ui-interaction-selected-fill-hover: var(--background-interaction-selection-neutral-hover);
64
- --ui-interaction-selected-ink: var(--color-interaction-selection-neutral-ink);
65
- --ui-interaction-selected-edge: var(--color-intent-neutral-edge);
66
- --ui-interaction-selected-edge-hover: var(--color-intent-neutral-edge-hover);
67
- --ui-interaction-selected-edge-strong: var(--color-intent-neutral-edge-strong);
68
- --ui-selection-solid: var(--color-intent-neutral-solid);
69
- --ui-selection-solid-ink: var(--color-intent-neutral-solid-ink);
70
- }
71
-
72
- :is([data-ui-selection-color], [data-ui-interaction])[data-color="accent"] {
73
- --ui-interaction-selected-fill: var(--background-interaction-selection-accent);
74
- --ui-interaction-selected-fill-hover: var(--background-interaction-selection-accent-hover);
75
- --ui-interaction-selected-ink: var(--color-interaction-selection-accent-ink);
76
- --ui-interaction-selected-edge: var(--color-intent-accent-edge);
77
- --ui-interaction-selected-edge-hover: var(--color-intent-accent-edge-hover);
78
- --ui-interaction-selected-edge-strong: var(--color-intent-accent-edge-strong);
79
- --ui-selection-solid: var(--color-intent-accent-solid);
80
- --ui-selection-solid-ink: var(--color-intent-accent-solid-ink);
81
- }
82
-
83
- [data-ui-interaction] {
84
- --ui-interaction-fill: transparent;
85
- --ui-interaction-edge: var(--ui-interaction-rest-edge, transparent);
86
- }
87
-
88
- :is([data-ui-interaction="tonal"], [data-ui-interaction="combined"]) {
89
- background-image: linear-gradient(var(--ui-interaction-fill), var(--ui-interaction-fill));
90
- }
91
-
92
- :is([data-ui-interaction="edge"], [data-ui-interaction="combined"]) {
93
- --ui-state-shadow-layers:
94
- 0 0 0 var(--border-width-edge-perimeter) var(--ui-interaction-edge);
95
- }
96
-
97
- :is([data-ui-interaction="edge"], [data-ui-interaction="combined"]):not([data-ui-elevation]) {
98
- box-shadow: var(--ui-state-shadow-layers);
99
- }
100
-
101
- @media (hover: hover) {
102
- [data-ui-interaction]:hover {
103
- --ui-interaction-fill: var(--color-interaction-hover);
104
- --ui-interaction-edge: var(--ui-surface-edge-hover);
105
- }
106
- }
107
-
108
- [data-ui-interaction]:active {
109
- --ui-interaction-fill: var(--color-interaction-pressed);
110
- --ui-interaction-edge: var(--ui-surface-edge-strong);
111
- }
112
-
113
- [data-ui-interaction]:is(
114
- [data-selected="true"],
115
- [aria-selected="true"],
116
- [data-current],
117
- [aria-current]:not([aria-current="false"]),
118
- [data-checked],
119
- [aria-checked="true"],
120
- [data-pressed],
121
- [aria-pressed="true"]
122
- ) {
123
- --ui-interaction-fill: var(--ui-interaction-selected-fill);
124
- --ui-interaction-edge: var(--ui-interaction-selected-edge);
125
- }
126
-
127
- :is([data-ui-interaction="tonal"], [data-ui-interaction="combined"]):is(
128
- [data-selected="true"],
129
- [aria-selected="true"],
130
- [data-current],
131
- [aria-current]:not([aria-current="false"]),
132
- [data-checked],
133
- [aria-checked="true"],
134
- [data-pressed],
135
- [aria-pressed="true"]
136
- ) {
137
- color: var(--ui-interaction-selected-ink);
138
- }
139
-
140
- @media (hover: hover) {
141
- [data-ui-interaction]:is(
142
- [data-selected="true"],
143
- [aria-selected="true"],
144
- [data-current],
145
- [aria-current]:not([aria-current="false"]),
146
- [data-checked],
147
- [aria-checked="true"],
148
- [data-pressed],
149
- [aria-pressed="true"]
150
- ):hover {
151
- --ui-interaction-fill: var(--ui-interaction-selected-fill-hover);
152
- --ui-interaction-edge: var(--ui-interaction-selected-edge-hover);
153
- }
154
- }
155
-
156
- [data-ui-interaction]:is(:focus-visible, :has(:focus-visible)) {
157
- --ui-state-shadow-layers:
158
- 0 0 0 var(--color-intent-accent-focus-width) var(--color-intent-accent-focus);
159
- }
160
-
161
- /*
162
- Root theme for the Trellis UI component system.
163
-
164
- Token layers:
165
- 1. Generated primitives: 1–12 color families, alpha families, surfaces, and elevation.
166
- 2. Generated relationships: intent roles, interaction states, paired inks, and scrim.
167
- 3. Authored recipes: local component variables and state composition.
168
-
169
- Theme config regenerates the first two layers. Component recipes consume their
170
- relationships; custom UI may use the registered Tailwind palette directly.
171
-
172
- CSS ownership:
173
- - TypeScript style recipes own class composition, variants, sizes, and parts.
174
- - This file owns imports, Tailwind source hints and variants, tokens, utilities,
175
- global theme rules, and generic reusable behavior.
176
- - Colocated component CSS owns selector-only styling that recipes cannot
177
- express cleanly, such as pseudo-elements, ::part(...), :has(...), native
178
- quirks, and child-order selectors.
179
- */
180
-
181
- @theme {
182
- --radius-scrollbar-thumb: var(--ui-scrollbar-thumb-radius);
183
- --container-reading: var(--container-prose);
184
- --z-index-popover: 50;
185
- --z-index-dialog: 60;
186
- --z-index-toast: 70;
187
- }
188
-
189
- @theme inline {
190
- --color-surface: var(--ui-surface-color);
191
- --color-surface-ink: var(--ui-surface-ink);
192
- --color-surface-ink-muted: var(--ui-surface-ink-muted);
193
- --color-label-ink: var(--ui-label-ink);
194
- --color-icon: var(--ui-surface-ink-muted);
195
- --color-separator: var(--ui-surface-separator);
196
- --color-separator-muted: var(--ui-surface-separator-muted);
197
- --color-scrollbar-thumb: var(--ui-surface-edge);
198
- --color-scrollbar-thumb-hover: var(--ui-surface-edge-hover);
199
- }
200
-
201
- :root,
202
- .light,
203
- .dark {
204
- color-scheme: light;
205
-
206
- --ui-label-ink: color-mix(
207
- in oklab,
208
- var(--ui-surface-ink-muted),
209
- var(--ui-surface-ink) var(--label-ink-emphasis)
210
- );
211
-
212
- --ui-control-height-xs: var(--spacing-control-xs);
213
- --ui-control-height-sm: var(--spacing-control-sm);
214
- --ui-control-height-md: var(--spacing-control-md);
215
- --ui-control-height-lg: var(--spacing-control-lg);
216
- --ui-control-height-xlg: var(--spacing-control-xlg);
217
- --ui-popover-radius: var(--radius-overlay-sm);
218
- --ui-popover-padding: var(--spacing-popover-padding);
219
-
220
- --ui-icon-size-xs: var(--spacing-icon-xs);
221
- --ui-icon-size-sm: var(--spacing-icon-sm);
222
- --ui-icon-size: var(--spacing-icon);
223
- --ui-icon-size-lg: var(--spacing-icon-lg);
224
- --ui-scrollbar-size: var(--spacing-scrollbar);
225
- --ui-scrollbar-inset: var(--spacing-scrollbar-inset);
226
- --ui-scrollbar-thumb-radius: var(--radius-full);
227
- }
228
-
229
- .light {
230
- color-scheme: light;
231
- }
232
-
233
- @utility max-h-xs {
234
- max-height: var(--container-xs);
235
- }
236
-
237
- @utility max-h-sm {
238
- max-height: var(--container-sm);
239
- }
240
-
241
- @utility max-h-md {
242
- max-height: var(--container-md);
243
- }
244
-
245
- @utility max-h-lg {
246
- max-height: var(--container-lg);
247
- }
248
-
249
- @utility max-h-xl {
250
- max-height: var(--container-xl);
251
- }
252
-
253
- @utility max-h-prose {
254
- max-height: 65ch;
255
- }
256
-
257
- @utility ui-edge {
258
- box-shadow: 0 0 0 var(--border-width-edge-control) var(--ui-surface-edge);
259
- }
260
-
261
- @utility ui-focus-ring {
262
- box-shadow: 0 0 0 var(--color-intent-accent-focus-width) var(--color-intent-accent-focus);
263
- }
264
-
265
- @utility ui-focus-ring-inset {
266
- box-shadow: inset 0 0 0 var(--color-intent-accent-focus-width) var(--color-intent-accent-focus);
267
- }
268
-
269
-
270
- .dark {
271
- color-scheme: dark;
272
- }
5
+ @import "./theme-support.css";
@@ -9334,8 +9334,19 @@
9334
9334
  max-height: var(--ui-select-listbox-max-height, var(--spacing-select-listbox));
9335
9335
  }
9336
9336
  [data-ui-select-virtualizer] > [data-ui-scroll-area] {
9337
+ width: 100%;
9338
+ min-width: 0;
9339
+ max-width: 100%;
9337
9340
  max-height: var(--ui-select-listbox-max-height, var(--spacing-select-listbox));
9338
9341
  }
9342
+ [data-ui-select-options], [data-ui-select-virtualizer], [data-ui-select-virtualizer] [data-ui-scroll-area-content], [data-ui-select-virtualizer] [data-ui-virtualizer-spacer], [data-ui-select-virtualizer] [data-ui-virtualizer-block] {
9343
+ width: 100%;
9344
+ min-width: 0;
9345
+ max-width: 100%;
9346
+ }
9347
+ [data-ui-select-virtualizer] [data-ui-virtualizer-block] {
9348
+ padding-inline-end: calc( var(--spacing-popover-padding) + var(--ui-scrollbar-size) + var(--ui-scrollbar-inset) );
9349
+ }
9339
9350
  [data-ui-select-virtualizer] > [data-ui-scroll-area] > [data-ui-scroll-area-viewport] > [data-ui-scroll-area-content] {
9340
9351
  padding-block: var(--spacing-popover-padding);
9341
9352
  }