@zylem/ui 0.1.0 → 0.1.1

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 +7 -4
  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 +124 -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 +65 -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 +64 -0
  57. package/src/components/ToolbarButton/ToolbarButton.tsx +42 -0
  58. package/src/components/Tooltip/Tooltip.css.ts +32 -0
  59. package/src/components/Tooltip/Tooltip.tsx +27 -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 +72 -119
  68. package/src/global/entities.css.ts +19 -15
  69. package/src/global/hyperglass-base.css.ts +91 -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',
131
- });
132
-
133
- globalStyle('.floating-panel-button:hover', {
134
- background: 'rgba(0, 0, 0, 0.2)',
125
+ fontSize: '13px',
126
+ letterSpacing: '0.02em',
127
+ color: '#F4FAFF',
128
+ textShadow: '0 1px 1px rgba(0,0,0,0.65)',
135
129
  });
136
130
 
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,12 +147,15 @@ 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: index-card jewel tiles. */
209
159
  globalStyle('.entity-grid', {
210
160
  display: 'grid',
211
161
  gridTemplateColumns: 'repeat(auto-fill, minmax(40px, 1fr))',
@@ -217,21 +167,24 @@ globalStyle('.entity-grid-item', {
217
167
  display: 'flex',
218
168
  alignItems: 'center',
219
169
  justifyContent: 'center',
220
- background: vars.colors.consoleBackground,
221
- border: `1px solid ${vars.colors.border}`,
222
- borderRadius: `calc(${vars.borders.radius} / 2)`,
170
+ background: vars.material.glassPanelDark,
171
+ border: '1px solid rgba(97, 166, 232, 0.32)',
172
+ borderRadius: vars.radii.control,
173
+ boxShadow:
174
+ 'inset 0 1px 0 rgba(255,255,255,0.1), 0 2px 6px rgba(0,0,0,0.3)',
223
175
  cursor: 'pointer',
224
- transition: 'background 0.15s, border-color 0.15s, transform 0.1s',
176
+ 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}`,
225
177
  });
226
178
 
227
179
  globalStyle('.entity-grid-item:hover', {
228
- background: vars.colors.accent,
229
- borderColor: vars.colors.primary,
230
- transform: 'scale(1.05)',
180
+ background: vars.material.buttonGlassHover,
181
+ borderColor: 'rgba(150, 210, 255, 0.6)',
182
+ boxShadow: `inset 0 1px 0 rgba(255,255,255,0.3), ${vars.effects.glowPrimary}`,
183
+ transform: 'translateY(-1px)',
231
184
  });
232
185
 
233
186
  globalStyle('.entity-grid-item:active', {
234
- transform: 'scale(0.95)',
187
+ transform: 'translateY(1px)',
235
188
  });
236
189
 
237
190
  globalStyle('.entity-icon', {
@@ -241,5 +194,5 @@ globalStyle('.entity-icon', {
241
194
  });
242
195
 
243
196
  globalStyle('.entity-grid-item:hover .entity-icon', {
244
- color: vars.colors.background,
197
+ color: '#F4FAFF',
245
198
  });
@@ -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,91 @@
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, and shared focus rings. Component-level
7
+ * glass treatments live in each component's recipe; this file only covers
8
+ * page-level chrome.
9
+ */
10
+
11
+ // Root surface: dark navy with a soft radial glow and a faint blueprint grid.
12
+ globalStyle('.zylem-hyperglass-root', {
13
+ minHeight: '100vh',
14
+ color: vars.colors.text,
15
+ fontFamily: vars.typography.fontFamily,
16
+ backgroundColor: vars.colors.background,
17
+ backgroundImage: `
18
+ radial-gradient(circle at 30% 0%, rgba(97, 166, 232, 0.18), transparent 32%),
19
+ linear-gradient(rgba(97, 166, 232, 0.045) 1px, transparent 1px),
20
+ linear-gradient(90deg, rgba(97, 166, 232, 0.045) 1px, transparent 1px)
21
+ `,
22
+ backgroundSize: '100% 100%, 24px 24px, 24px 24px',
23
+ });
24
+
25
+ // Visible focus ring on any keyboard-focused interactive element.
26
+ globalStyle(
27
+ '.zylem-hyperglass-root :focus-visible, .zylem-focus-ring:focus-visible',
28
+ {
29
+ outline: 'none',
30
+ boxShadow: vars.effects.focusRing,
31
+ },
32
+ );
33
+
34
+ /**
35
+ * Glass scrollbars — apply `.zylem-scroll` (or rely on the root cascade for
36
+ * `.zylem-hyperglass-root`) to get the visible Aqua-style rail.
37
+ */
38
+ const scrollHosts = '.zylem-scroll, .zylem-hyperglass-root';
39
+
40
+ globalStyle(scrollHosts, {
41
+ scrollbarColor: 'rgba(97,166,232,0.55) rgba(10,20,30,0.5)',
42
+ scrollbarWidth: 'thin',
43
+ });
44
+
45
+ globalStyle(
46
+ '.zylem-scroll::-webkit-scrollbar, .zylem-hyperglass-root ::-webkit-scrollbar',
47
+ {
48
+ width: '13px',
49
+ height: '13px',
50
+ },
51
+ );
52
+
53
+ globalStyle(
54
+ '.zylem-scroll::-webkit-scrollbar-track, .zylem-hyperglass-root ::-webkit-scrollbar-track',
55
+ {
56
+ borderRadius: '999px',
57
+ background:
58
+ 'linear-gradient(90deg, rgba(0,0,0,0.32), rgba(97,166,232,0.11), rgba(255,255,255,0.045))',
59
+ border: '1px solid rgba(97,166,232,0.16)',
60
+ },
61
+ );
62
+
63
+ globalStyle(
64
+ '.zylem-scroll::-webkit-scrollbar-thumb, .zylem-hyperglass-root ::-webkit-scrollbar-thumb',
65
+ {
66
+ borderRadius: '999px',
67
+ border: '2px solid rgba(5, 16, 28, 0.82)',
68
+ background:
69
+ 'linear-gradient(90deg, rgba(220,242,255,0.48), rgba(97,166,232,0.72) 42%, rgba(19,62,102,0.92))',
70
+ boxShadow:
71
+ 'inset 1px 0 0 rgba(255,255,255,0.42), inset -1px 0 0 rgba(0,0,0,0.34)',
72
+ },
73
+ );
74
+
75
+ globalStyle(
76
+ '.zylem-scroll::-webkit-scrollbar-thumb:hover, .zylem-hyperglass-root ::-webkit-scrollbar-thumb:hover',
77
+ {
78
+ background:
79
+ 'linear-gradient(90deg, rgba(240,250,255,0.64), rgba(97,166,232,0.92) 42%, rgba(21,76,130,0.98))',
80
+ },
81
+ );
82
+
83
+ // Opaque fallback when backdrop-filter isn't available: glass panels lean on
84
+ // blur for legibility, so give them a solid surface instead.
85
+ globalStyle('.zylem-glass', {
86
+ '@supports': {
87
+ 'not (backdrop-filter: blur(1px))': {
88
+ backgroundColor: vars.colors.surface,
89
+ },
90
+ },
91
+ });
@@ -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', {
@@ -38,6 +38,11 @@ const radiusScale = {
38
38
  lg: '16px',
39
39
  xl: '20px',
40
40
  pill: '999px',
41
+ window: vars.radii.window,
42
+ panel: vars.radii.panel,
43
+ button: vars.radii.button,
44
+ control: vars.radii.control,
45
+ card: vars.radii.card,
41
46
  } as const;
42
47
 
43
48
  const responsive = defineProperties({
@@ -120,6 +125,23 @@ const color = defineProperties({
120
125
  const visual = defineProperties({
121
126
  properties: {
122
127
  borderRadius: radiusScale,
128
+ boxShadow: {
129
+ none: 'none',
130
+ panel: vars.effects.shadowPanel,
131
+ button: vars.effects.shadowButton,
132
+ inset: vars.effects.shadowInset,
133
+ glowPrimary: vars.effects.glowPrimary,
134
+ glowActive: vars.effects.glowActive,
135
+ glowDanger: vars.effects.glowDanger,
136
+ focusRing: vars.effects.focusRing,
137
+ },
138
+ transitionDuration: {
139
+ fast: vars.motion.fast,
140
+ normal: vars.motion.normal,
141
+ },
142
+ transitionTimingFunction: {
143
+ easeOut: vars.motion.easeOut,
144
+ },
123
145
  borderWidth: {
124
146
  none: '0',
125
147
  hairline: '1px',
package/src/styles.ts CHANGED
@@ -8,13 +8,41 @@
8
8
  import './fonts.css';
9
9
  import './theme.css';
10
10
  import './global/logo.css';
11
+ import './global/hyperglass-base.css';
11
12
  import './global/common.css';
12
- import './global/sidebar.css';
13
13
  import './global/editor-base.css';
14
- import './global/toolbar.css';
15
- import './global/console.css';
16
14
  import './global/accordion.css';
17
15
  import './global/menu.css';
18
16
  import './global/entities.css';
19
17
  import './global/detached-panel.css';
20
- import './global/checkbox.css';
18
+
19
+ // Component styles (HyperGlass). Each file registers the global
20
+ // `.zylem-*` classes its component renders, so the raw CSS bundle carries
21
+ // the full component look without consumers compiling vanilla-extract.
22
+ import './components/shared/field.css';
23
+ import './components/Button/Button.css';
24
+ import './components/ToolbarButton/ToolbarButton.css';
25
+ import './components/TextField/TextField.css';
26
+ import './components/NumberField/NumberField.css';
27
+ import './components/Select/Select.css';
28
+ import './components/Checkbox/Checkbox.css';
29
+ import './components/Switch/Switch.css';
30
+ import './components/Slider/Slider.css';
31
+ import './components/Tabs/Tabs.css';
32
+ import './components/Tooltip/Tooltip.css';
33
+ import './components/DropdownMenu/DropdownMenu.css';
34
+ import './components/Dialog/Dialog.css';
35
+ import './components/Progress/Progress.css';
36
+ import './components/Badge/Badge.css';
37
+ import './components/Separator/Separator.css';
38
+ import './components/WindowControls/WindowControls.css';
39
+ import './components/TitleBar/TitleBar.css';
40
+ import './components/Panel/Panel.css';
41
+ import './components/Toolbar/Toolbar.css';
42
+ import './components/Property/Property.css';
43
+ import './components/Console/Console.css';
44
+ import './components/Sidebar/Sidebar.css';
45
+ import './components/Card/Card.css';
46
+ import './components/SearchInput/SearchInput.css';
47
+ import './components/EmptyState/EmptyState.css';
48
+ import './components/Kbd/Kbd.css';