@zylem/ui 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/dist/chunk-VGOOWBSO.js +1 -0
  2. package/dist/index.css +1 -1
  3. package/dist/index.d.ts +75 -2
  4. package/dist/index.js +1 -1
  5. package/dist/styles.css +1 -1
  6. package/dist/styles.js +1 -1
  7. package/package.json +13 -11
  8. package/src/components/Accordion/Accordion.tsx +60 -0
  9. package/src/components/Badge/Badge.css.ts +52 -0
  10. package/src/components/Badge/Badge.tsx +23 -0
  11. package/src/components/Button/Button.css.ts +127 -0
  12. package/src/components/Button/Button.tsx +34 -0
  13. package/src/components/Card/Card.css.ts +62 -0
  14. package/src/components/Card/Card.tsx +54 -0
  15. package/src/{global/checkbox.css.ts → components/Checkbox/Checkbox.css.ts} +23 -23
  16. package/src/components/Checkbox/Checkbox.tsx +41 -0
  17. package/src/components/Console/Console.css.ts +67 -0
  18. package/src/components/Console/Console.tsx +51 -0
  19. package/src/components/Dialog/Dialog.css.ts +86 -0
  20. package/src/components/Dialog/Dialog.tsx +89 -0
  21. package/src/components/DropdownMenu/DropdownMenu.css.ts +76 -0
  22. package/src/components/DropdownMenu/DropdownMenu.tsx +63 -0
  23. package/src/components/EmptyState/EmptyState.css.ts +29 -0
  24. package/src/components/EmptyState/EmptyState.tsx +32 -0
  25. package/src/components/Kbd/Kbd.css.ts +27 -0
  26. package/src/components/Kbd/Kbd.tsx +17 -0
  27. package/src/components/NumberField/NumberField.css.ts +47 -0
  28. package/src/components/NumberField/NumberField.tsx +66 -0
  29. package/src/components/Panel/Panel.css.ts +88 -0
  30. package/src/components/Panel/Panel.tsx +66 -0
  31. package/src/components/Progress/Progress.css.ts +51 -0
  32. package/src/components/Progress/Progress.tsx +43 -0
  33. package/src/components/Property/Property.css.ts +70 -0
  34. package/src/components/Property/Property.tsx +118 -0
  35. package/src/components/ScrollArea/ScrollArea.tsx +41 -0
  36. package/src/components/SearchInput/SearchInput.css.ts +25 -0
  37. package/src/components/SearchInput/SearchInput.tsx +31 -0
  38. package/src/components/Select/Select.css.ts +93 -0
  39. package/src/components/Select/Select.tsx +68 -0
  40. package/src/components/Separator/Separator.css.ts +22 -0
  41. package/src/components/Separator/Separator.tsx +18 -0
  42. package/src/components/Sidebar/Sidebar.css.ts +79 -0
  43. package/src/components/Sidebar/Sidebar.tsx +69 -0
  44. package/src/components/Slider/Slider.css.ts +91 -0
  45. package/src/components/Slider/Slider.tsx +51 -0
  46. package/src/components/Switch/Switch.css.ts +72 -0
  47. package/src/components/Switch/Switch.tsx +36 -0
  48. package/src/components/Tabs/Tabs.css.ts +70 -0
  49. package/src/components/Tabs/Tabs.tsx +79 -0
  50. package/src/components/TextField/TextField.css.ts +16 -0
  51. package/src/components/TextField/TextField.tsx +76 -0
  52. package/src/components/TitleBar/TitleBar.css.ts +46 -0
  53. package/src/components/TitleBar/TitleBar.tsx +60 -0
  54. package/src/components/Toolbar/Toolbar.css.ts +29 -0
  55. package/src/components/Toolbar/Toolbar.tsx +30 -0
  56. package/src/components/ToolbarButton/ToolbarButton.css.ts +67 -0
  57. package/src/components/ToolbarButton/ToolbarButton.tsx +42 -0
  58. package/src/components/Tooltip/Tooltip.css.ts +35 -0
  59. package/src/components/Tooltip/Tooltip.tsx +33 -0
  60. package/src/components/WindowControls/WindowControls.css.ts +59 -0
  61. package/src/components/WindowControls/WindowControls.tsx +51 -0
  62. package/src/components/index.ts +67 -6
  63. package/src/components/shared/field.css.ts +60 -0
  64. package/src/global/accordion.css.ts +32 -18
  65. package/src/global/common.css.ts +14 -17
  66. package/src/global/detached-panel.css.ts +31 -8
  67. package/src/global/editor-base.css.ts +96 -121
  68. package/src/global/entities.css.ts +19 -15
  69. package/src/global/hyperglass-base.css.ts +166 -0
  70. package/src/global/menu.css.ts +8 -3
  71. package/src/sprinkles.css.ts +22 -0
  72. package/src/styles.ts +32 -4
  73. package/src/theme.css.ts +190 -99
  74. package/dist/chunk-3R5KFBTB.js +0 -1
  75. package/src/components/Button.tsx +0 -19
  76. package/src/global/console.css.ts +0 -43
  77. package/src/global/sidebar.css.ts +0 -18
  78. package/src/global/toolbar.css.ts +0 -62
@@ -2,13 +2,8 @@ import { globalStyle } from '@vanilla-extract/css';
2
2
  import { vars } from '../theme.css';
3
3
 
4
4
  globalStyle('.selected', {
5
- background: vars.colors.primaryActive,
6
- boxShadow: 'inset 0 0 6px rgba(97, 166, 232, 0.4)',
7
- });
8
-
9
- globalStyle('button', {
10
- boxShadow:
11
- 'inset 0 1px 0 rgba(255, 255, 255, 0.04), inset 0 -1px 0 rgba(0, 0, 0, 0.2)',
5
+ background: vars.material.buttonGlassActive,
6
+ boxShadow: `inset 0 0 6px rgba(20, 255, 60, 0.35), ${vars.effects.glowActive}`,
12
7
  });
13
8
 
14
9
  globalStyle('.overlay', {
@@ -18,24 +13,26 @@ globalStyle('.overlay', {
18
13
  pointerEvents: 'none',
19
14
  });
20
15
 
16
+ // Default scrollbars: slim glass rail (use `.zylem-scroll` for the full
17
+ // 13px HyperGlass treatment defined in hyperglass-base.css.ts).
21
18
  globalStyle('::-webkit-scrollbar', {
22
- width: '3px',
23
- height: '3px',
19
+ width: '8px',
20
+ height: '8px',
24
21
  });
25
22
 
26
23
  globalStyle('::-webkit-scrollbar-track', {
27
- background: 'transparent',
24
+ background: 'rgba(7, 19, 33, 0.4)',
25
+ borderRadius: '999px',
28
26
  });
29
27
 
30
28
  globalStyle('::-webkit-scrollbar-thumb', {
31
- background: vars.colors.primary,
32
- borderRadius: vars.borders.radius,
29
+ borderRadius: '999px',
30
+ border: '1px solid rgba(5, 16, 28, 0.82)',
31
+ background:
32
+ 'linear-gradient(90deg, rgba(220,242,255,0.4), rgba(97,166,232,0.65) 42%, rgba(19,62,102,0.9))',
33
33
  });
34
34
 
35
35
  globalStyle('::-webkit-scrollbar-thumb:hover', {
36
- background: vars.colors.primaryActive,
37
- });
38
-
39
- globalStyle('::-webkit-scrollbar-thumb:active', {
40
- background: vars.colors.active,
36
+ background:
37
+ 'linear-gradient(90deg, rgba(240,250,255,0.6), rgba(97,166,232,0.9) 42%, rgba(21,76,130,0.98))',
41
38
  });
@@ -12,15 +12,38 @@ globalStyle('.detached-panel', {
12
12
  position: 'fixed',
13
13
  display: 'flex',
14
14
  flexDirection: 'column',
15
+ borderRadius: vars.radii.panel,
16
+ border: '1px solid rgba(97, 166, 232, 0.38)',
17
+ background: vars.material.glassPanelDark,
18
+ boxShadow: vars.effects.shadowPanel,
19
+ backdropFilter: `blur(${vars.effects.blurSm}) saturate(1.14)`,
20
+ overflow: 'hidden',
21
+ '@supports': {
22
+ 'not (backdrop-filter: blur(1px))': {
23
+ background: vars.colors.surface,
24
+ },
25
+ },
15
26
  });
16
27
 
17
28
  globalStyle('.detached-panel-titlebar', {
18
- padding: `${vars.spacing.sm} ${vars.spacing.md}`,
29
+ boxSizing: 'border-box',
30
+ minHeight: '32px',
31
+ padding: `0 ${vars.spacing.md}`,
19
32
  cursor: 'grab',
20
33
  display: 'flex',
21
34
  alignItems: 'center',
22
35
  justifyContent: 'space-between',
36
+ gap: vars.spacing.sm,
23
37
  userSelect: 'none',
38
+ background: vars.material.glossyBar,
39
+ borderBottom: '1px solid rgba(5, 18, 32, 0.85)',
40
+ boxShadow:
41
+ 'inset 0 1px 0 rgba(255,255,255,0.62), inset 0 -1px 0 rgba(255,255,255,0.08)',
42
+ color: '#F4FAFF',
43
+ fontFamily: vars.typography.fontFamily,
44
+ fontWeight: 700,
45
+ fontSize: '12px',
46
+ textShadow: '0 1px 1px rgba(0,0,0,0.65)',
24
47
  });
25
48
 
26
49
  globalStyle('.detached-panel-titlebar:active', {
@@ -28,7 +51,7 @@ globalStyle('.detached-panel-titlebar:active', {
28
51
  });
29
52
 
30
53
  globalStyle('.detached-panel-content', {
31
- background: vars.colors.backgroundTranslucent,
54
+ background: 'transparent',
32
55
  flex: 1,
33
56
  overflow: 'auto',
34
57
  display: 'flex',
@@ -43,13 +66,13 @@ globalStyle('.accordion-drag-ghost', {
43
66
  display: 'flex',
44
67
  alignItems: 'center',
45
68
  justifyContent: 'space-between',
46
- background: vars.colors.backgroundTranslucent,
47
- border: `2px dotted ${vars.colors.accent}`,
48
- borderRadius: vars.borders.radius,
49
- color: vars.colors.primary,
69
+ background: vars.material.glassPanelDark,
70
+ border: '2px dotted rgba(230, 69, 52, 0.8)',
71
+ borderRadius: vars.radii.panel,
72
+ color: vars.colors.text,
50
73
  fontFamily: vars.typography.fontFamily,
51
- backdropFilter: `blur(${vars.spacing.sm})`,
52
- boxShadow: `0 8px 24px rgba(0, 0, 0, 0.5), 0 0 0 1px ${vars.colors.accent}`,
74
+ backdropFilter: `blur(${vars.effects.blurSm})`,
75
+ boxShadow: `0 8px 24px rgba(0, 0, 0, 0.5), ${vars.effects.glowDanger}`,
53
76
  position: 'fixed',
54
77
  zIndex: 9999,
55
78
  pointerEvents: 'none',
@@ -1,7 +1,9 @@
1
1
  import { globalStyle } from '@vanilla-extract/css';
2
2
  import { vars } from '../theme.css';
3
3
 
4
- globalStyle('button', {
4
+ // :where() keeps this shadow-DOM reset at zero specificity so consuming
5
+ // apps' own button rules (and universal box-sizing rules) still win.
6
+ globalStyle(':where(button)', {
5
7
  all: 'unset',
6
8
  });
7
9
 
@@ -25,6 +27,7 @@ globalStyle('#zylem-editor-toggle', {
25
27
  cursor: 'grab',
26
28
  zIndex: 1,
27
29
  pointerEvents: 'auto',
30
+ filter: 'drop-shadow(0 0 10px rgba(97, 166, 232, 0.35))',
28
31
  });
29
32
 
30
33
  globalStyle('.zylem-exo-2', {
@@ -42,12 +45,12 @@ globalStyle('.scrollable-y', {
42
45
 
43
46
  globalStyle('.scroll-thin', {
44
47
  scrollbarWidth: 'thin',
45
- scrollbarColor: `${vars.colors.primary} transparent`,
48
+ scrollbarColor: 'rgba(97,166,232,0.55) rgba(10,20,30,0.5)',
46
49
  });
47
50
 
48
51
  globalStyle('.scroll-thin::-webkit-scrollbar', {
49
- width: '3px',
50
- height: '3px',
52
+ width: '6px',
53
+ height: '6px',
51
54
  });
52
55
 
53
56
  globalStyle('.scroll-thin::-webkit-scrollbar-track', {
@@ -55,88 +58,78 @@ globalStyle('.scroll-thin::-webkit-scrollbar-track', {
55
58
  });
56
59
 
57
60
  globalStyle('.scroll-thin::-webkit-scrollbar-thumb', {
58
- backgroundColor: vars.colors.primary,
59
- borderRadius: `calc(${vars.borders.radius} / 4)`,
61
+ borderRadius: '999px',
62
+ background:
63
+ 'linear-gradient(90deg, rgba(220,242,255,0.4), rgba(97,166,232,0.65) 42%, rgba(19,62,102,0.9))',
60
64
  });
61
65
 
62
66
  globalStyle('.scroll-thin::-webkit-scrollbar-thumb:hover', {
63
- backgroundColor: vars.colors.primaryActive,
67
+ background:
68
+ 'linear-gradient(90deg, rgba(240,250,255,0.6), rgba(97,166,232,0.9) 42%, rgba(21,76,130,0.98))',
64
69
  });
65
70
 
66
- globalStyle('.zylem-button', {
67
- background: 'none',
68
- color: vars.colors.primary,
69
- border: `${vars.borders.width} solid ${vars.colors.primary}`,
70
- borderRadius: vars.borders.radius,
71
- fontFamily: vars.typography.fontFamily,
72
- cursor: 'pointer',
73
- padding: `${vars.spacing.sm} ${vars.spacing.md}`,
74
- fontSize: vars.typography.fontSize,
75
- transition: 'background-color 0.2s ease, color 0.2s ease',
76
- });
77
-
78
- globalStyle('.zylem-button:hover', {
79
- background: vars.colors.primary,
80
- color: vars.colors.backgroundTranslucent,
81
- });
82
-
83
- globalStyle('.zylem-button:active', {
84
- background: vars.colors.active,
85
- color: vars.colors.backgroundTranslucent,
71
+ // Icon default for toolbar/editor icons.
72
+ globalStyle('.zylem-icon', {
73
+ width: '18px',
74
+ height: '18px',
75
+ stroke: 'currentColor',
76
+ filter: 'drop-shadow(0 1px 1px rgba(0,0,0,0.55))',
86
77
  });
87
78
 
79
+ /**
80
+ * Floating panel chrome (editor main panel). Glass window with a glossy
81
+ * molded title bar.
82
+ */
88
83
  globalStyle('.floating-panel', {
89
- background: vars.colors.backgroundTranslucent,
90
- border: `${vars.borders.width} solid ${vars.colors.primary}`,
91
- borderRadius: vars.borders.radius,
92
- boxShadow: `0 ${vars.spacing.sm} 32px rgba(0, 0, 0, 0.4)`,
93
- backdropFilter: `blur(${vars.spacing.sm})`,
84
+ borderRadius: vars.radii.window,
85
+ border: '1px solid rgba(146, 205, 255, 0.54)',
86
+ background: vars.material.glassPanelDark,
87
+ boxShadow: vars.effects.shadowPanel,
88
+ backdropFilter: `blur(${vars.effects.blurMd}) saturate(1.22)`,
89
+ overflow: 'hidden',
94
90
  pointerEvents: 'auto',
91
+ '@supports': {
92
+ 'not (backdrop-filter: blur(1px))': {
93
+ background: vars.colors.surface,
94
+ },
95
+ },
95
96
  });
96
97
 
97
98
  globalStyle('.floating-panel-titlebar', {
98
- padding: `${vars.spacing.sm} ${vars.spacing.md}`,
99
- background: vars.colors.accent,
100
- border: `1px solid ${vars.colors.background}`,
101
- borderRadius: `calc(${vars.borders.radius} - 1px) calc(${vars.borders.radius} - 1px) 0 0`,
99
+ minHeight: '34px',
100
+ boxSizing: 'border-box',
101
+ display: 'flex',
102
+ alignItems: 'center',
103
+ padding: `0 ${vars.spacing.md}`,
104
+ background: vars.material.glossyBar,
105
+ borderBottom: '1px solid rgba(5, 18, 32, 0.85)',
106
+ boxShadow:
107
+ 'inset 0 1px 0 rgba(255,255,255,0.62), inset 0 -1px 0 rgba(255,255,255,0.08)',
102
108
  fontFamily: vars.typography.fontFamily,
103
- fontWeight: 600,
104
- transition: 'background-color 0.15s ease',
109
+ fontWeight: 700,
110
+ cursor: 'grab',
111
+ userSelect: 'none',
112
+ transition: `filter ${vars.motion.fast} ${vars.motion.easeOut}`,
105
113
  });
106
114
 
107
115
  globalStyle('.floating-panel-titlebar:hover', {
108
- background: vars.colors.accentHover,
116
+ filter: 'brightness(1.08)',
109
117
  });
110
118
 
111
119
  globalStyle('.floating-panel-titlebar:active', {
112
- background: vars.colors.accentActive,
120
+ filter: 'brightness(0.95)',
113
121
  cursor: 'grabbing',
114
122
  });
115
123
 
116
124
  globalStyle('.floating-panel-title', {
117
- fontSize: vars.typography.fontSize,
118
- color: vars.colors.background,
119
- textShadow: '0 1px 2px rgba(0, 0, 0, 0.3)',
120
- });
121
-
122
- globalStyle('.floating-panel-button', {
123
- all: 'unset',
124
- cursor: 'pointer',
125
- padding: '2px 6px',
126
- fontSize: '10px',
127
- lineHeight: 1,
128
- color: vars.colors.background,
129
- borderRadius: `calc(${vars.borders.radius} / 3)`,
130
- transition: 'background-color 0.15s ease',
125
+ fontSize: '13px',
126
+ letterSpacing: '0.02em',
127
+ color: '#F4FAFF',
128
+ textShadow: '0 1px 1px rgba(0,0,0,0.65)',
131
129
  });
132
130
 
133
- globalStyle('.floating-panel-button:hover', {
134
- background: 'rgba(0, 0, 0, 0.2)',
135
- });
136
-
137
- globalStyle('.floating-panel-button:active', {
138
- background: 'rgba(0, 0, 0, 0.3)',
139
- });
131
+ // `.floating-panel-button` styles live in WindowControls.css.ts, shared
132
+ // with `.zylem-window-control`.
140
133
 
141
134
  globalStyle('.floating-panel-content', {
142
135
  background: 'transparent',
@@ -145,53 +138,7 @@ globalStyle('.floating-panel-content', {
145
138
  globalStyle('.floating-panel-controls', {
146
139
  display: 'flex',
147
140
  alignItems: 'center',
148
- gap: vars.spacing.xs,
149
- });
150
-
151
- globalStyle('.zylem-property-list', {
152
- display: 'flex',
153
- flexDirection: 'column',
154
- gap: vars.spacing.xs,
155
- padding: vars.spacing.sm,
156
- background: vars.colors.consoleBackground,
157
- borderRadius: `calc(${vars.borders.radius} / 2)`,
158
- });
159
-
160
- globalStyle('.zylem-property-row', {
161
- display: 'flex',
162
- justifyContent: 'space-between',
163
- alignItems: 'center',
164
- padding: `${vars.spacing.xs} ${vars.spacing.sm}`,
165
- borderBottom: `1px solid ${vars.colors.border}`,
166
- });
167
-
168
- globalStyle('.zylem-property-row:last-child', {
169
- borderBottom: 'none',
170
- });
171
-
172
- globalStyle('.zylem-property-label', {
173
- color: vars.colors.textSecondary,
174
- fontSize: `calc(${vars.typography.fontSize} - 1px)`,
175
- fontFamily: vars.typography.fontFamily,
176
- });
177
-
178
- globalStyle('.zylem-property-value', {
179
- color: vars.colors.primary,
180
- fontSize: vars.typography.fontSize,
181
- fontFamily: vars.typography.fontFamily,
182
- fontWeight: 500,
183
- });
184
-
185
- globalStyle('.zylem-property-value--clickable', {
186
- cursor: 'pointer',
187
- textDecoration: 'underline',
188
- textDecorationStyle: 'dotted',
189
- textUnderlineOffset: '2px',
190
- });
191
-
192
- globalStyle('.zylem-property-value--clickable:hover', {
193
- textDecorationStyle: 'solid',
194
- color: vars.colors.active,
141
+ gap: '7px',
195
142
  });
196
143
 
197
144
  globalStyle('.zylem-section', {
@@ -200,46 +147,74 @@ globalStyle('.zylem-section', {
200
147
 
201
148
  globalStyle('.zylem-section-title', {
202
149
  margin: `0 0 ${vars.spacing.sm} 0`,
203
- fontSize: vars.typography.fontSize,
150
+ fontSize: '11px',
204
151
  fontFamily: vars.typography.fontFamily,
205
152
  color: vars.colors.textSecondary,
206
- fontWeight: 600,
153
+ fontWeight: 700,
154
+ letterSpacing: '0.09em',
155
+ textTransform: 'uppercase',
207
156
  });
208
157
 
158
+ /** Entity grid: glossy glass icon tiles. Type names use portaled `.zylem-tooltip`. */
209
159
  globalStyle('.entity-grid', {
210
160
  display: 'grid',
211
161
  gridTemplateColumns: 'repeat(auto-fill, minmax(40px, 1fr))',
212
162
  gap: vars.spacing.xs,
213
163
  });
214
164
 
215
- globalStyle('.entity-grid-item', {
165
+ /** Tooltip/trigger wrappers must fill the cell so the icon button keeps a square. */
166
+ globalStyle('.entity-grid > *', {
167
+ display: 'flex',
168
+ minWidth: 0,
216
169
  aspectRatio: '1',
170
+ });
171
+
172
+ globalStyle('.entity-grid-item', {
173
+ position: 'relative',
174
+ flex: 1,
175
+ width: '100%',
176
+ height: '100%',
217
177
  display: 'flex',
218
178
  alignItems: 'center',
219
179
  justifyContent: 'center',
220
- background: vars.colors.consoleBackground,
221
- border: `1px solid ${vars.colors.border}`,
222
- borderRadius: `calc(${vars.borders.radius} / 2)`,
180
+ background: vars.material.buttonGlass,
181
+ border: '1px solid rgba(150, 210, 255, 0.5)',
182
+ borderRadius: vars.radii.control,
183
+ boxShadow: vars.effects.shadowButton,
223
184
  cursor: 'pointer',
224
- transition: 'background 0.15s, border-color 0.15s, transform 0.1s',
185
+ color: vars.colors.textSecondary,
186
+ transition: `background ${vars.motion.fast} ${vars.motion.easeOut}, border-color ${vars.motion.fast} ${vars.motion.easeOut}, transform ${vars.motion.fast} ${vars.motion.easeOut}, box-shadow ${vars.motion.fast} ${vars.motion.easeOut}, filter ${vars.motion.fast} ${vars.motion.easeOut}`,
225
187
  });
226
188
 
227
189
  globalStyle('.entity-grid-item:hover', {
228
- background: vars.colors.accent,
229
- borderColor: vars.colors.primary,
230
- transform: 'scale(1.05)',
190
+ background: vars.material.buttonGlassHover,
191
+ borderColor: 'rgba(150, 210, 255, 0.75)',
192
+ boxShadow: `${vars.effects.shadowButton}, ${vars.effects.glowPrimary}`,
193
+ transform: 'translateY(-1px)',
194
+ color: '#F4FAFF',
231
195
  });
232
196
 
233
197
  globalStyle('.entity-grid-item:active', {
234
- transform: 'scale(0.95)',
198
+ transform: 'translateY(1px)',
199
+ filter: 'brightness(0.92)',
200
+ boxShadow:
201
+ 'inset 0 1px 0 rgba(255,255,255,0.22), inset 0 -1px 0 rgba(255,255,255,0.55), inset 0 2px 3px rgba(0,0,0,0.28), 0 1px 3px rgba(0,0,0,0.28)',
202
+ });
203
+
204
+ globalStyle('.entity-grid-item:focus-visible', {
205
+ outline: 'none',
206
+ boxShadow: `${vars.effects.shadowButton}, ${vars.effects.focusRing}`,
235
207
  });
236
208
 
237
209
  globalStyle('.entity-icon', {
238
210
  width: '20px',
239
211
  height: '20px',
240
- color: vars.colors.textSecondary,
212
+ color: 'currentColor',
213
+ position: 'relative',
214
+ zIndex: 1,
215
+ filter: 'drop-shadow(0 1px 1px rgba(0,0,0,0.55))',
241
216
  });
242
217
 
243
218
  globalStyle('.entity-grid-item:hover .entity-icon', {
244
- color: vars.colors.background,
219
+ color: '#F4FAFF',
245
220
  });
@@ -9,7 +9,9 @@ globalStyle('.entities-list', {
9
9
  overflowX: 'hidden',
10
10
  });
11
11
 
12
- globalStyle('ul', {
12
+ // :where() keeps this shadow-DOM reset at zero specificity so consuming
13
+ // apps' own list rules still win.
14
+ globalStyle(':where(ul)', {
13
15
  all: 'unset',
14
16
  });
15
17
 
@@ -18,29 +20,31 @@ globalStyle('.entity-item-wrapper', {
18
20
  cursor: 'pointer',
19
21
  });
20
22
 
21
- globalStyle('.entity-item-wrapper.hovered .entity-item', {
22
- backgroundColor: vars.colors.successHover,
23
- color: vars.colors.primary,
24
- });
25
-
26
- globalStyle('.entity-item-wrapper:active .entity-item', {
27
- backgroundColor: vars.colors.active,
28
- color: vars.colors.backgroundTranslucent,
29
- });
30
-
31
23
  globalStyle('.entity-item', {
32
24
  display: 'grid',
33
25
  gap: vars.spacing.sm,
34
26
  gridTemplateColumns: '1fr 1fr 1fr',
35
- border: `${vars.borders.width} outset ${vars.colors.successHover}`,
27
+ border: '1px solid rgba(97, 166, 232, 0.32)',
28
+ borderRadius: vars.radii.card,
29
+ background: vars.material.glassPanelDark,
30
+ boxShadow:
31
+ 'inset 0 1px 0 rgba(255,255,255,0.08), 0 4px 12px rgba(0,0,0,0.25)',
36
32
  padding: vars.spacing.md,
37
33
  margin: `${vars.spacing.md} 0`,
38
34
  fontWeight: 600,
39
- transition: 'background-color 200ms cubic-bezier(0.075, 0.82, 0.165, 1)',
35
+ color: vars.colors.text,
36
+ transition: `background ${vars.motion.normal} ${vars.motion.easeOut}, border-color ${vars.motion.normal} ${vars.motion.easeOut}, box-shadow ${vars.motion.normal} ${vars.motion.easeOut}`,
37
+ });
38
+
39
+ globalStyle('.entity-item-wrapper.hovered .entity-item, .entity-item.hovered', {
40
+ borderColor: 'rgba(150, 210, 255, 0.6)',
41
+ boxShadow: `inset 0 1px 0 rgba(255,255,255,0.12), ${vars.effects.glowPrimary}`,
42
+ color: '#F4FAFF',
40
43
  });
41
44
 
42
- globalStyle('.entity-item.hovered', {
43
- backgroundColor: vars.colors.activeHover,
45
+ globalStyle('.entity-item-wrapper:active .entity-item', {
46
+ borderColor: 'rgba(20, 255, 60, 0.6)',
47
+ boxShadow: `inset 0 1px 0 rgba(255,255,255,0.12), ${vars.effects.glowActive}`,
44
48
  });
45
49
 
46
50
  globalStyle('.entity-info-item', {
@@ -0,0 +1,166 @@
1
+ import { globalStyle } from '@vanilla-extract/css';
2
+ import { vars } from '../theme.css';
3
+
4
+ /**
5
+ * HyperGlass foundation styles: app root background treatment, visible
6
+ * Aqua-inspired glass scrollbars, shared focus rings, and a light CodePen-
7
+ * inspired specular sheen on glossy controls. Component-level glass
8
+ * treatments live in each component's recipe; this file covers page-level
9
+ * chrome plus shared lighting primitives.
10
+ */
11
+
12
+ // Root surface: dark navy with a soft radial glow, angled light wash, and a
13
+ // faint blueprint grid.
14
+ globalStyle('.zylem-hyperglass-root', {
15
+ minHeight: '100vh',
16
+ color: vars.colors.text,
17
+ fontFamily: vars.typography.fontFamily,
18
+ backgroundColor: vars.colors.background,
19
+ backgroundImage: `
20
+ radial-gradient(circle at 30% 0%, rgba(97, 166, 232, 0.18), transparent 32%),
21
+ linear-gradient(-75deg, rgba(255, 255, 255, 0) 0%, rgba(97, 166, 232, 0.07) 42%, rgba(255, 255, 255, 0) 68%),
22
+ linear-gradient(rgba(97, 166, 232, 0.045) 1px, transparent 1px),
23
+ linear-gradient(90deg, rgba(97, 166, 232, 0.045) 1px, transparent 1px)
24
+ `,
25
+ backgroundSize: '100% 100%, 100% 100%, 24px 24px, 24px 24px',
26
+ });
27
+
28
+ // Visible focus ring on any keyboard-focused interactive element.
29
+ globalStyle(
30
+ '.zylem-hyperglass-root :focus-visible, .zylem-focus-ring:focus-visible',
31
+ {
32
+ outline: 'none',
33
+ boxShadow: vars.effects.focusRing,
34
+ },
35
+ );
36
+
37
+ /**
38
+ * Specular sheen on glossy interactive hosts — a soft diagonal band that
39
+ * nudges on hover and shifts toward the top on press (CodePen glass lighting,
40
+ * dialed down for HyperGlass). Uses ::before so label/icon content paints above.
41
+ * Applied on the control classes themselves (not under `.zylem-hyperglass-root`)
42
+ * so portaled surfaces like Dialog keep the same look.
43
+ * Pseudo selectors are listed per-host (comma lists don't inherit a trailing ::before).
44
+ */
45
+ // Absolute-positioned hosts (e.g. `.zylem-console-clear`) already form a
46
+ // containing block for the sheen — don't override them to `relative` or they
47
+ // stretch in flex parents. `.entity-grid-item` already sets `relative` in
48
+ // editor-base.
49
+ globalStyle('.zylem-button:not(.zylem-console-clear), .zylem-toolbar-btn', {
50
+ position: 'relative',
51
+ });
52
+
53
+ globalStyle(
54
+ '.zylem-button::before, .zylem-toolbar-btn::before, .entity-grid-item::before',
55
+ {
56
+ content: '""',
57
+ position: 'absolute',
58
+ inset: 0,
59
+ borderRadius: 'inherit',
60
+ pointerEvents: 'none',
61
+ background: `linear-gradient(
62
+ -45deg,
63
+ rgba(255, 255, 255, 0) 0%,
64
+ rgba(255, 255, 255, 0.42) 40%,
65
+ rgba(255, 255, 255, 0.42) 50%,
66
+ rgba(255, 255, 255, 0) 55%
67
+ )`,
68
+ backgroundSize: '200% 200%',
69
+ backgroundPosition: '0% 50%',
70
+ backgroundRepeat: 'no-repeat',
71
+ mixBlendMode: 'screen',
72
+ opacity: 0.4,
73
+ transition: `background-position ${vars.motion.normal} ${vars.motion.easeOut}, opacity ${vars.motion.fast} ${vars.motion.easeOut}`,
74
+ '@media': {
75
+ '(prefers-reduced-motion: reduce)': {
76
+ transition: 'none',
77
+ backgroundPosition: '0% 50%',
78
+ },
79
+ },
80
+ },
81
+ );
82
+
83
+ globalStyle(
84
+ '.zylem-button:hover:not([disabled])::before, .zylem-toolbar-btn:hover:not([disabled])::before, .entity-grid-item:hover::before',
85
+ {
86
+ backgroundPosition: '25% 50%',
87
+ opacity: 0.5,
88
+ '@media': {
89
+ '(prefers-reduced-motion: reduce)': {
90
+ backgroundPosition: '0% 50%',
91
+ },
92
+ },
93
+ },
94
+ );
95
+
96
+ globalStyle(
97
+ '.zylem-button:active:not([disabled])::before, .zylem-toolbar-btn:active:not([disabled])::before, .entity-grid-item:active::before',
98
+ {
99
+ backgroundPosition: '50% 15%',
100
+ opacity: 0.58,
101
+ '@media': {
102
+ '(prefers-reduced-motion: reduce)': {
103
+ backgroundPosition: '0% 50%',
104
+ },
105
+ },
106
+ },
107
+ );
108
+
109
+ /**
110
+ * Glass scrollbars — apply `.zylem-scroll` (or rely on the root cascade for
111
+ * `.zylem-hyperglass-root`) to get the visible Aqua-style rail.
112
+ */
113
+ const scrollHosts = '.zylem-scroll, .zylem-hyperglass-root';
114
+
115
+ globalStyle(scrollHosts, {
116
+ scrollbarColor: 'rgba(97,166,232,0.55) rgba(10,20,30,0.5)',
117
+ scrollbarWidth: 'thin',
118
+ });
119
+
120
+ globalStyle(
121
+ '.zylem-scroll::-webkit-scrollbar, .zylem-hyperglass-root ::-webkit-scrollbar',
122
+ {
123
+ width: '13px',
124
+ height: '13px',
125
+ },
126
+ );
127
+
128
+ globalStyle(
129
+ '.zylem-scroll::-webkit-scrollbar-track, .zylem-hyperglass-root ::-webkit-scrollbar-track',
130
+ {
131
+ borderRadius: '999px',
132
+ background:
133
+ 'linear-gradient(90deg, rgba(0,0,0,0.32), rgba(97,166,232,0.11), rgba(255,255,255,0.045))',
134
+ border: '1px solid rgba(97,166,232,0.16)',
135
+ },
136
+ );
137
+
138
+ globalStyle(
139
+ '.zylem-scroll::-webkit-scrollbar-thumb, .zylem-hyperglass-root ::-webkit-scrollbar-thumb',
140
+ {
141
+ borderRadius: '999px',
142
+ border: '2px solid rgba(5, 16, 28, 0.82)',
143
+ background:
144
+ 'linear-gradient(90deg, rgba(220,242,255,0.48), rgba(97,166,232,0.72) 42%, rgba(19,62,102,0.92))',
145
+ boxShadow:
146
+ 'inset 1px 0 0 rgba(255,255,255,0.42), inset -1px 0 0 rgba(0,0,0,0.34)',
147
+ },
148
+ );
149
+
150
+ globalStyle(
151
+ '.zylem-scroll::-webkit-scrollbar-thumb:hover, .zylem-hyperglass-root ::-webkit-scrollbar-thumb:hover',
152
+ {
153
+ background:
154
+ 'linear-gradient(90deg, rgba(240,250,255,0.64), rgba(97,166,232,0.92) 42%, rgba(21,76,130,0.98))',
155
+ },
156
+ );
157
+
158
+ // Opaque fallback when backdrop-filter isn't available: glass panels lean on
159
+ // blur for legibility, so give them a solid surface instead.
160
+ globalStyle('.zylem-glass', {
161
+ '@supports': {
162
+ 'not (backdrop-filter: blur(1px))': {
163
+ backgroundColor: vars.colors.surface,
164
+ },
165
+ },
166
+ });
@@ -6,8 +6,8 @@ globalStyle('.zylem-menu', {
6
6
  flexDirection: 'column',
7
7
  height: '100%',
8
8
  width: '100%',
9
- background: vars.colors.backgroundTranslucent,
10
- borderRadius: vars.borders.radius,
9
+ background: 'transparent',
10
+ borderRadius: vars.radii.panel,
11
11
  boxSizing: 'border-box',
12
12
  overflowY: 'auto',
13
13
  overflowX: 'hidden',
@@ -24,7 +24,10 @@ globalStyle('.zylem-menu-header', {
24
24
  alignItems: 'center',
25
25
  justifyContent: 'space-between',
26
26
  gap: vars.spacing.sm,
27
- borderBottom: `${vars.borders.width} solid ${vars.colors.primary}`,
27
+ borderBottom: '1px solid rgba(97, 166, 232, 0.28)',
28
+ background:
29
+ 'linear-gradient(180deg, rgba(130, 180, 230, 0.14), rgba(30, 60, 95, 0.18) 50%, rgba(8, 22, 38, 0.24))',
30
+ boxShadow: 'inset 0 1px 0 rgba(255,255,255,0.15)',
28
31
  });
29
32
 
30
33
  globalStyle('.zylem-collapse-button', {
@@ -33,6 +36,8 @@ globalStyle('.zylem-collapse-button', {
33
36
  fontSize: '12px',
34
37
  lineHeight: 1,
35
38
  marginRight: vars.spacing.sm,
39
+ color: vars.colors.primary,
40
+ cursor: 'pointer',
36
41
  });
37
42
 
38
43
  globalStyle('.zylem-menu h3, .zylem-menu h4', {