@a4ui/core 0.2.0 → 0.3.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.
- package/README.md +61 -7
- package/dist/index.js +2 -1
- package/dist/layout/AppShell.d.ts +19 -1
- package/dist/layout/EffectsToggle.d.ts +14 -0
- package/dist/layout/NavGroup.d.ts +15 -0
- package/dist/layout/SpaceBackground.d.ts +13 -0
- package/dist/layout/ThemeToggle.d.ts +12 -0
- package/dist/lib/cn.d.ts +11 -1
- package/dist/lib/effects.d.ts +21 -0
- package/dist/lib/media.d.ts +12 -0
- package/dist/lib/motion.d.ts +37 -0
- package/dist/lib/theme.d.ts +52 -3
- package/dist/lib/virtual.d.ts +16 -0
- package/dist/styles.css +344 -95
- package/dist/ui/Accordion.d.ts +19 -0
- package/dist/ui/Alert.d.ts +14 -0
- package/dist/ui/AlertDialog.d.ts +15 -0
- package/dist/ui/Avatar.d.ts +11 -0
- package/dist/ui/Badge.d.ts +12 -0
- package/dist/ui/Breadcrumb.d.ts +17 -0
- package/dist/ui/Button.d.ts +11 -0
- package/dist/ui/Card.d.ts +18 -0
- package/dist/ui/Checkbox.d.ts +11 -0
- package/dist/ui/Combobox.d.ts +16 -0
- package/dist/ui/ContextMenu.d.ts +14 -0
- package/dist/ui/DateField.d.ts +14 -0
- package/dist/ui/Drawer.d.ts +16 -0
- package/dist/ui/Dropdown.d.ts +18 -1
- package/dist/ui/Dropzone.d.ts +11 -0
- package/dist/ui/HoverCard.d.ts +13 -0
- package/dist/ui/Input.d.ts +12 -0
- package/dist/ui/Meter.d.ts +12 -0
- package/dist/ui/Modal.d.ts +21 -0
- package/dist/ui/NumberInput.d.ts +12 -0
- package/dist/ui/PageHeader.d.ts +17 -0
- package/dist/ui/Pagination.d.ts +14 -0
- package/dist/ui/Popover.d.ts +13 -0
- package/dist/ui/Progress.d.ts +11 -0
- package/dist/ui/RadioGroup.d.ts +20 -0
- package/dist/ui/SegmentedControl.d.ts +19 -0
- package/dist/ui/Select.d.ts +14 -0
- package/dist/ui/Separator.d.ts +11 -0
- package/dist/ui/Skeleton.d.ts +11 -0
- package/dist/ui/Slider.d.ts +14 -0
- package/dist/ui/Spinner.d.ts +10 -0
- package/dist/ui/Stat.d.ts +12 -0
- package/dist/ui/Switch.d.ts +11 -0
- package/dist/ui/Table.d.ts +61 -0
- package/dist/ui/Tabs.d.ts +20 -0
- package/dist/ui/Textarea.d.ts +12 -0
- package/dist/ui/Toast.d.ts +12 -0
- package/dist/ui/Toggle.d.ts +12 -0
- package/dist/ui/ToggleGroup.d.ts +20 -0
- package/dist/ui/Tooltip.d.ts +13 -0
- package/dist/ui/VirtualList.d.ts +14 -0
- package/package.json +18 -5
package/dist/styles.css
CHANGED
|
@@ -18,11 +18,11 @@
|
|
|
18
18
|
--muted-foreground: 215 25% 75%;
|
|
19
19
|
--border: 217 30% 22%;
|
|
20
20
|
--input: 217 30% 22%;
|
|
21
|
-
--primary: 217 91%
|
|
21
|
+
--primary: 217 91% 52%;
|
|
22
22
|
--primary-foreground: 0 0% 100%;
|
|
23
23
|
--accent: 199 89% 55%;
|
|
24
24
|
--accent-foreground: 0 0% 100%;
|
|
25
|
-
--ring: 217 91%
|
|
25
|
+
--ring: 217 91% 52%;
|
|
26
26
|
--destructive: 0 72% 55%;
|
|
27
27
|
--destructive-foreground: 0 0% 100%;
|
|
28
28
|
|
|
@@ -54,11 +54,11 @@
|
|
|
54
54
|
--muted-foreground: 215 22% 38%;
|
|
55
55
|
--border: 214 24% 84%;
|
|
56
56
|
--input: 214 32% 91%;
|
|
57
|
-
--primary: 217 91%
|
|
57
|
+
--primary: 217 91% 52%;
|
|
58
58
|
--primary-foreground: 0 0% 100%;
|
|
59
59
|
--accent: 199 89% 48%;
|
|
60
60
|
--accent-foreground: 0 0% 100%;
|
|
61
|
-
--ring: 217 91%
|
|
61
|
+
--ring: 217 91% 52%;
|
|
62
62
|
--destructive: 0 72% 51%;
|
|
63
63
|
--destructive-foreground: 0 0% 100%;
|
|
64
64
|
}
|
|
@@ -75,57 +75,127 @@ body {
|
|
|
75
75
|
|
|
76
76
|
/* Route/page cross-fade (AppShell wraps routed content in a <Transition>). */
|
|
77
77
|
.page-enter-active,
|
|
78
|
-
.page-exit-active {
|
|
78
|
+
.page-exit-active {
|
|
79
|
+
transition: opacity 0.16s ease-out;
|
|
80
|
+
}
|
|
79
81
|
.page-enter,
|
|
80
|
-
.page-exit-to {
|
|
82
|
+
.page-exit-to {
|
|
83
|
+
opacity: 0;
|
|
84
|
+
}
|
|
81
85
|
|
|
82
86
|
/* Modal — MUST be @keyframes (Kobalte Dialog presence listens for
|
|
83
87
|
animationend, not transitionend, or the exit never resolves). */
|
|
84
|
-
@keyframes modal-overlay-in {
|
|
85
|
-
|
|
88
|
+
@keyframes modal-overlay-in {
|
|
89
|
+
from {
|
|
90
|
+
opacity: 0;
|
|
91
|
+
}
|
|
92
|
+
to {
|
|
93
|
+
opacity: 1;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
@keyframes modal-overlay-out {
|
|
97
|
+
from {
|
|
98
|
+
opacity: 1;
|
|
99
|
+
}
|
|
100
|
+
to {
|
|
101
|
+
opacity: 0;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
86
104
|
@keyframes modal-content-in {
|
|
87
|
-
from {
|
|
88
|
-
|
|
105
|
+
from {
|
|
106
|
+
opacity: 0;
|
|
107
|
+
transform: scale(0.96) translateY(4px);
|
|
108
|
+
}
|
|
109
|
+
to {
|
|
110
|
+
opacity: 1;
|
|
111
|
+
transform: scale(1) translateY(0);
|
|
112
|
+
}
|
|
89
113
|
}
|
|
90
114
|
@keyframes modal-content-out {
|
|
91
|
-
from {
|
|
92
|
-
|
|
115
|
+
from {
|
|
116
|
+
opacity: 1;
|
|
117
|
+
transform: scale(1) translateY(0);
|
|
118
|
+
}
|
|
119
|
+
to {
|
|
120
|
+
opacity: 0;
|
|
121
|
+
transform: scale(0.96) translateY(4px);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
.modal-overlay[data-expanded] {
|
|
125
|
+
animation: modal-overlay-in 0.15s ease-out;
|
|
126
|
+
}
|
|
127
|
+
.modal-overlay[data-closed] {
|
|
128
|
+
animation: modal-overlay-out 0.15s ease-in;
|
|
129
|
+
}
|
|
130
|
+
.modal-content[data-expanded] {
|
|
131
|
+
animation: modal-content-in 0.18s ease-out;
|
|
132
|
+
}
|
|
133
|
+
.modal-content[data-closed] {
|
|
134
|
+
animation: modal-content-out 0.15s ease-in;
|
|
93
135
|
}
|
|
94
|
-
.modal-overlay[data-expanded] { animation: modal-overlay-in 0.15s ease-out; }
|
|
95
|
-
.modal-overlay[data-closed] { animation: modal-overlay-out 0.15s ease-in; }
|
|
96
|
-
.modal-content[data-expanded] { animation: modal-content-in 0.18s ease-out; }
|
|
97
|
-
.modal-content[data-closed] { animation: modal-content-out 0.15s ease-in; }
|
|
98
136
|
|
|
99
137
|
/* Toast — same animationend-only presence mechanism as Dialog. */
|
|
100
138
|
@keyframes toast-in {
|
|
101
|
-
from {
|
|
102
|
-
|
|
139
|
+
from {
|
|
140
|
+
opacity: 0;
|
|
141
|
+
transform: translateX(16px);
|
|
142
|
+
}
|
|
143
|
+
to {
|
|
144
|
+
opacity: 1;
|
|
145
|
+
transform: translateX(0);
|
|
146
|
+
}
|
|
103
147
|
}
|
|
104
148
|
@keyframes toast-out {
|
|
105
|
-
from {
|
|
106
|
-
|
|
149
|
+
from {
|
|
150
|
+
opacity: 1;
|
|
151
|
+
transform: translateX(0);
|
|
152
|
+
}
|
|
153
|
+
to {
|
|
154
|
+
opacity: 0;
|
|
155
|
+
transform: translateX(16px);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
.toast-item[data-opened] {
|
|
159
|
+
animation: toast-in 0.2s ease-out;
|
|
160
|
+
}
|
|
161
|
+
.toast-item[data-closed] {
|
|
162
|
+
animation: toast-out 0.18s ease-in;
|
|
107
163
|
}
|
|
108
|
-
.toast-item[data-opened] { animation: toast-in 0.2s ease-out; }
|
|
109
|
-
.toast-item[data-closed] { animation: toast-out 0.18s ease-in; }
|
|
110
164
|
|
|
111
165
|
/* Table row enter/exit fade. */
|
|
112
166
|
.row-enter-active,
|
|
113
|
-
.row-exit-active {
|
|
167
|
+
.row-exit-active {
|
|
168
|
+
transition: opacity 0.15s ease-out;
|
|
169
|
+
}
|
|
114
170
|
.row-enter,
|
|
115
|
-
.row-exit-to {
|
|
171
|
+
.row-exit-to {
|
|
172
|
+
opacity: 0;
|
|
173
|
+
}
|
|
116
174
|
|
|
117
175
|
/* Drawer / Modal drawer-variant slide-over (Kobalte Dialog presence →
|
|
118
176
|
animationend keyframes, keyed off data-expanded/data-closed like Modal). */
|
|
119
177
|
@keyframes drawer-in {
|
|
120
|
-
from {
|
|
121
|
-
|
|
178
|
+
from {
|
|
179
|
+
transform: translateX(100%);
|
|
180
|
+
}
|
|
181
|
+
to {
|
|
182
|
+
transform: translateX(0);
|
|
183
|
+
}
|
|
122
184
|
}
|
|
123
185
|
@keyframes drawer-out {
|
|
124
|
-
from {
|
|
125
|
-
|
|
186
|
+
from {
|
|
187
|
+
transform: translateX(0);
|
|
188
|
+
}
|
|
189
|
+
to {
|
|
190
|
+
transform: translateX(100%);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
.drawer-content[data-expanded] {
|
|
194
|
+
animation: drawer-in 0.28s cubic-bezier(0.16, 1, 0.3, 1);
|
|
195
|
+
}
|
|
196
|
+
.drawer-content[data-closed] {
|
|
197
|
+
animation: drawer-out 0.2s ease-in;
|
|
126
198
|
}
|
|
127
|
-
.drawer-content[data-expanded] { animation: drawer-in 0.28s cubic-bezier(0.16, 1, 0.3, 1); }
|
|
128
|
-
.drawer-content[data-closed] { animation: drawer-out 0.2s ease-in; }
|
|
129
199
|
|
|
130
200
|
/* Reduced motion: resolve near-instantly rather than removing outright, so
|
|
131
201
|
libraries that gate DOM unmount on transitionend/animationend (Kobalte
|
|
@@ -149,56 +219,114 @@ body {
|
|
|
149
219
|
* content at z-index >= 10 (AppShell already does this). Bundled into
|
|
150
220
|
* `a4ui/styles.css` after the component surfaces. */
|
|
151
221
|
|
|
152
|
-
#space {
|
|
222
|
+
#space {
|
|
223
|
+
position: fixed;
|
|
224
|
+
inset: 0;
|
|
225
|
+
z-index: 0;
|
|
226
|
+
pointer-events: none;
|
|
227
|
+
overflow: hidden;
|
|
228
|
+
}
|
|
153
229
|
|
|
154
230
|
#space .sky {
|
|
155
|
-
position: absolute;
|
|
231
|
+
position: absolute;
|
|
232
|
+
inset: 0;
|
|
156
233
|
background:
|
|
157
|
-
radial-gradient(1200px 700px at 82% -8%, hsl(217 91% 60% / .34), transparent 60%),
|
|
158
|
-
radial-gradient(900px 600px at 8% 12%, hsl(275 80% 55% / .28), transparent 60%),
|
|
159
|
-
radial-gradient(1000px 800px at 50% 120%, hsl(199 89% 55% / .24), transparent 55%),
|
|
160
|
-
radial-gradient(700px 500px at 30% 55%, hsl(330 80% 55% / .14), transparent 60%),
|
|
161
|
-
hsl(var(--background));
|
|
234
|
+
radial-gradient(1200px 700px at 82% -8%, hsl(217 91% 60% / 0.34), transparent 60%),
|
|
235
|
+
radial-gradient(900px 600px at 8% 12%, hsl(275 80% 55% / 0.28), transparent 60%),
|
|
236
|
+
radial-gradient(1000px 800px at 50% 120%, hsl(199 89% 55% / 0.24), transparent 55%),
|
|
237
|
+
radial-gradient(700px 500px at 30% 55%, hsl(330 80% 55% / 0.14), transparent 60%), hsl(var(--background));
|
|
162
238
|
}
|
|
163
239
|
[data-theme='light'] #space .sky {
|
|
164
240
|
background:
|
|
165
|
-
radial-gradient(1100px 680px at 84% -10%, hsl(38 95% 70% / .38), transparent 60%),
|
|
166
|
-
radial-gradient(900px 600px at 6% 8%, hsl(217 91% 70% / .32), transparent 60%),
|
|
167
|
-
radial-gradient(1000px 820px at 50% 120%, hsl(275 70% 75% / .26), transparent 55%),
|
|
168
|
-
radial-gradient(700px 500px at 30% 55%, hsl(340 85% 70% / .18), transparent 60%),
|
|
169
|
-
|
|
241
|
+
radial-gradient(1100px 680px at 84% -10%, hsl(38 95% 70% / 0.38), transparent 60%),
|
|
242
|
+
radial-gradient(900px 600px at 6% 8%, hsl(217 91% 70% / 0.32), transparent 60%),
|
|
243
|
+
radial-gradient(1000px 820px at 50% 120%, hsl(275 70% 75% / 0.26), transparent 55%),
|
|
244
|
+
radial-gradient(700px 500px at 30% 55%, hsl(340 85% 70% / 0.18), transparent 60%), hsl(var(--background));
|
|
245
|
+
}
|
|
246
|
+
@keyframes nebulaShift {
|
|
247
|
+
0%,
|
|
248
|
+
100% {
|
|
249
|
+
filter: hue-rotate(0deg);
|
|
250
|
+
}
|
|
251
|
+
50% {
|
|
252
|
+
filter: hue-rotate(18deg);
|
|
253
|
+
}
|
|
170
254
|
}
|
|
171
|
-
@keyframes nebulaShift { 0%, 100% { filter: hue-rotate(0deg); } 50% { filter: hue-rotate(18deg); } }
|
|
172
255
|
|
|
173
256
|
/* Aurora — dark theme only */
|
|
174
257
|
#space .aurora {
|
|
175
|
-
position: absolute;
|
|
176
|
-
|
|
177
|
-
|
|
258
|
+
position: absolute;
|
|
259
|
+
top: -10%;
|
|
260
|
+
left: -10%;
|
|
261
|
+
right: -10%;
|
|
262
|
+
height: 46%;
|
|
263
|
+
background: linear-gradient(180deg, hsl(160 84% 45% / 0.16), hsl(199 89% 55% / 0.1) 45%, transparent 80%);
|
|
264
|
+
filter: blur(40px);
|
|
265
|
+
opacity: 0.55;
|
|
266
|
+
mix-blend-mode: screen;
|
|
267
|
+
}
|
|
268
|
+
[data-theme='light'] #space .aurora {
|
|
269
|
+
display: none;
|
|
270
|
+
}
|
|
271
|
+
@keyframes auroraSway {
|
|
272
|
+
0%,
|
|
273
|
+
100% {
|
|
274
|
+
transform: translateX(-2%) scaleY(1);
|
|
275
|
+
opacity: 0.5;
|
|
276
|
+
}
|
|
277
|
+
50% {
|
|
278
|
+
transform: translateX(3%) scaleY(1.08);
|
|
279
|
+
opacity: 0.68;
|
|
280
|
+
}
|
|
178
281
|
}
|
|
179
|
-
[data-theme='light'] #space .aurora { display: none; }
|
|
180
|
-
@keyframes auroraSway { 0%,100% { transform: translateX(-2%) scaleY(1); opacity: .5; } 50% { transform: translateX(3%) scaleY(1.08); opacity: .68; } }
|
|
181
282
|
|
|
182
283
|
/* Randomized starfield — each star is generated in SpaceBackground.tsx with a
|
|
183
284
|
random position/size/brightness/bloom, so there's no visible tiling pattern.
|
|
184
285
|
Static (no drift): moving the field behind the frosted cards re-blurs every
|
|
185
286
|
frame and felt laggy; a subset twinkles for life instead. */
|
|
186
|
-
#space #starfield {
|
|
187
|
-
|
|
287
|
+
#space #starfield {
|
|
288
|
+
position: absolute;
|
|
289
|
+
inset: 0;
|
|
290
|
+
}
|
|
291
|
+
[data-theme='light'] #space #starfield {
|
|
292
|
+
opacity: 0.85;
|
|
293
|
+
}
|
|
188
294
|
/* A few stars drift smoothly like the satellite: each is a tiny element moving
|
|
189
295
|
via its own transform (GPU-composited, cheap), NOT the whole field. Uses
|
|
190
296
|
`alternate` so it eases out and back with no loop jump. Per-star --dx/--dy. */
|
|
191
|
-
@keyframes starDrift {
|
|
297
|
+
@keyframes starDrift {
|
|
298
|
+
from {
|
|
299
|
+
transform: translate(0, 0);
|
|
300
|
+
}
|
|
301
|
+
to {
|
|
302
|
+
transform: translate(var(--dx, 0), var(--dy, 0));
|
|
303
|
+
}
|
|
304
|
+
}
|
|
192
305
|
|
|
193
306
|
/* Rocket exhaust flame (custom SVG rocket in SpaceBackground.tsx) — flickers. */
|
|
194
|
-
.rk-flame {
|
|
195
|
-
|
|
307
|
+
.rk-flame {
|
|
308
|
+
transform-box: fill-box;
|
|
309
|
+
transform-origin: 50% 0%;
|
|
310
|
+
animation: rocketFlame 0.12s ease-in-out infinite alternate;
|
|
311
|
+
}
|
|
312
|
+
@keyframes rocketFlame {
|
|
313
|
+
from {
|
|
314
|
+
transform: scaleY(0.8);
|
|
315
|
+
opacity: 0.85;
|
|
316
|
+
}
|
|
317
|
+
to {
|
|
318
|
+
transform: scaleY(1.06);
|
|
319
|
+
opacity: 1;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
196
322
|
|
|
197
323
|
/* Legacy tiled star layers (kept for parity; the current SpaceBackground scatters
|
|
198
324
|
individual stars into #starfield instead). Sized generously: small dots nearly
|
|
199
325
|
vanish under backdrop-filter blur, so keep them >= 2.5px. */
|
|
200
326
|
#space .stars {
|
|
201
|
-
position: absolute;
|
|
327
|
+
position: absolute;
|
|
328
|
+
inset: -50%;
|
|
329
|
+
background-repeat: repeat;
|
|
202
330
|
background-image:
|
|
203
331
|
radial-gradient(4px 4px at 20px 30px, hsl(var(--foreground)), transparent),
|
|
204
332
|
radial-gradient(3.6px 3.6px at 120px 90px, hsl(var(--foreground)), transparent),
|
|
@@ -207,7 +335,9 @@ body {
|
|
|
207
335
|
radial-gradient(3.4px 3.4px at 380px 220px, hsl(330 80% 84%), transparent),
|
|
208
336
|
radial-gradient(3px 3px at 90px 190px, hsl(var(--foreground)), transparent),
|
|
209
337
|
radial-gradient(2.8px 2.8px at 260px 250px, hsl(48 90% 82%), transparent);
|
|
210
|
-
background-size: 420px 300px;
|
|
338
|
+
background-size: 420px 300px;
|
|
339
|
+
opacity: 1;
|
|
340
|
+
animation: drift 140s linear infinite;
|
|
211
341
|
}
|
|
212
342
|
[data-theme='light'] #space .stars {
|
|
213
343
|
background-image:
|
|
@@ -219,9 +349,15 @@ body {
|
|
|
219
349
|
radial-gradient(3px 3px at 90px 190px, hsl(40 90% 50%), transparent),
|
|
220
350
|
radial-gradient(2.8px 2.8px at 260px 250px, hsl(48 90% 52%), transparent);
|
|
221
351
|
}
|
|
222
|
-
#space .stars.s2 {
|
|
352
|
+
#space .stars.s2 {
|
|
353
|
+
background-size: 640px 480px;
|
|
354
|
+
opacity: 0.85;
|
|
355
|
+
animation-duration: 200s;
|
|
356
|
+
}
|
|
223
357
|
#space .stars.s3 {
|
|
224
|
-
background-size: 260px 190px;
|
|
358
|
+
background-size: 260px 190px;
|
|
359
|
+
opacity: 1;
|
|
360
|
+
animation-duration: 95s;
|
|
225
361
|
background-image:
|
|
226
362
|
radial-gradient(6px 6px at 40px 50px, hsl(var(--foreground)), transparent),
|
|
227
363
|
radial-gradient(5.6px 5.6px at 160px 130px, hsl(199 89% 85%), transparent),
|
|
@@ -229,77 +365,190 @@ body {
|
|
|
229
365
|
radial-gradient(5px 5px at 90px 20px, hsl(330 85% 85%), transparent);
|
|
230
366
|
}
|
|
231
367
|
[data-theme='light'] #space .stars.s3 {
|
|
232
|
-
opacity: .8;
|
|
368
|
+
opacity: 0.8;
|
|
233
369
|
background-image:
|
|
234
370
|
radial-gradient(6px 6px at 40px 50px, hsl(38 92% 50%), transparent),
|
|
235
371
|
radial-gradient(5.6px 5.6px at 160px 130px, hsl(45 95% 54%), transparent),
|
|
236
372
|
radial-gradient(5.8px 5.8px at 250px 40px, hsl(30 88% 48%), transparent),
|
|
237
373
|
radial-gradient(5px 5px at 90px 20px, hsl(50 92% 55%), transparent);
|
|
238
374
|
}
|
|
239
|
-
@keyframes drift {
|
|
375
|
+
@keyframes drift {
|
|
376
|
+
from {
|
|
377
|
+
transform: translate3d(0, 0, 0);
|
|
378
|
+
}
|
|
379
|
+
to {
|
|
380
|
+
transform: translate3d(-420px, -300px, 0);
|
|
381
|
+
}
|
|
382
|
+
}
|
|
240
383
|
|
|
241
384
|
/* Individually-placed twinkling stars */
|
|
242
385
|
.twinkle {
|
|
243
|
-
position: absolute;
|
|
244
|
-
|
|
386
|
+
position: absolute;
|
|
387
|
+
width: 5px;
|
|
388
|
+
height: 5px;
|
|
389
|
+
border-radius: 50%;
|
|
390
|
+
background: hsl(var(--foreground));
|
|
391
|
+
box-shadow: 0 0 14px 3px hsl(var(--foreground) / 0.9);
|
|
245
392
|
animation: twinkle 3.2s ease-in-out infinite;
|
|
246
393
|
}
|
|
247
|
-
[data-theme='light'] .twinkle {
|
|
248
|
-
|
|
394
|
+
[data-theme='light'] .twinkle {
|
|
395
|
+
background: hsl(40 92% 50%);
|
|
396
|
+
box-shadow: 0 0 14px 3px hsl(40 92% 50% / 0.85);
|
|
397
|
+
}
|
|
398
|
+
@keyframes twinkle {
|
|
399
|
+
0%,
|
|
400
|
+
100% {
|
|
401
|
+
opacity: 0.25;
|
|
402
|
+
transform: scale(0.6);
|
|
403
|
+
}
|
|
404
|
+
50% {
|
|
405
|
+
opacity: 1;
|
|
406
|
+
transform: scale(1.15);
|
|
407
|
+
}
|
|
408
|
+
}
|
|
249
409
|
|
|
250
410
|
/* Constellations — thin line art connecting a handful of stars */
|
|
251
|
-
#space .constellation {
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
411
|
+
#space .constellation {
|
|
412
|
+
position: absolute;
|
|
413
|
+
opacity: 1;
|
|
414
|
+
}
|
|
415
|
+
[data-theme='light'] #space .constellation {
|
|
416
|
+
opacity: 0.6;
|
|
417
|
+
}
|
|
418
|
+
[data-theme='light'] #space .constellation .cline {
|
|
419
|
+
stroke: hsl(38 92% 50%) !important;
|
|
420
|
+
}
|
|
421
|
+
[data-theme='light'] #space .constellation .cdot {
|
|
422
|
+
fill: hsl(222 47% 20%) !important;
|
|
423
|
+
}
|
|
255
424
|
|
|
256
425
|
/* Planets / moons — decorative, corner-anchored, gentle float */
|
|
257
|
-
.planet {
|
|
426
|
+
.planet {
|
|
427
|
+
border-radius: 50%;
|
|
428
|
+
}
|
|
258
429
|
.planet::after {
|
|
259
|
-
content: '';
|
|
260
|
-
|
|
430
|
+
content: '';
|
|
431
|
+
position: absolute;
|
|
432
|
+
inset: -34% -55%;
|
|
433
|
+
border-radius: 50%;
|
|
434
|
+
border: 3px solid hsl(var(--foreground) / 0.18);
|
|
435
|
+
transform: rotate(-24deg);
|
|
436
|
+
}
|
|
437
|
+
.planet-glow {
|
|
438
|
+
border-radius: 50%;
|
|
439
|
+
filter: blur(2px);
|
|
440
|
+
}
|
|
441
|
+
@keyframes floaty {
|
|
442
|
+
0%,
|
|
443
|
+
100% {
|
|
444
|
+
transform: translateY(0) rotate(0deg);
|
|
445
|
+
}
|
|
446
|
+
50% {
|
|
447
|
+
transform: translateY(-14px) rotate(4deg);
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
.floaty {
|
|
451
|
+
animation: floaty 12s ease-in-out infinite;
|
|
452
|
+
}
|
|
453
|
+
.floaty.slow {
|
|
454
|
+
animation-duration: 18s;
|
|
261
455
|
}
|
|
262
|
-
.planet-glow { border-radius: 50%; filter: blur(2px); }
|
|
263
|
-
@keyframes floaty { 0%,100% { transform: translateY(0) rotate(0deg); } 50% { transform: translateY(-14px) rotate(4deg); } }
|
|
264
|
-
.floaty { animation: floaty 12s ease-in-out infinite; }
|
|
265
|
-
.floaty.slow { animation-duration: 18s; }
|
|
266
456
|
|
|
267
457
|
/* Asteroid belt (small drifting rocks) */
|
|
268
|
-
.asteroid {
|
|
269
|
-
|
|
458
|
+
.asteroid {
|
|
459
|
+
border-radius: 40% 55% 50% 45%;
|
|
460
|
+
background: hsl(var(--foreground) / 0.35);
|
|
461
|
+
}
|
|
462
|
+
@keyframes asteroidDrift {
|
|
463
|
+
0%,
|
|
464
|
+
100% {
|
|
465
|
+
transform: translate(0, 0) rotate(0deg);
|
|
466
|
+
}
|
|
467
|
+
50% {
|
|
468
|
+
transform: translate(-8px, 6px) rotate(25deg);
|
|
469
|
+
}
|
|
470
|
+
}
|
|
270
471
|
|
|
271
472
|
/* Shooting star — bright core + tapered glowing trail */
|
|
272
473
|
.shooter {
|
|
273
|
-
position: absolute;
|
|
274
|
-
|
|
275
|
-
|
|
474
|
+
position: absolute;
|
|
475
|
+
height: 2.5px;
|
|
476
|
+
border-radius: 999px;
|
|
477
|
+
transform-origin: left center;
|
|
478
|
+
background: linear-gradient(
|
|
479
|
+
90deg,
|
|
480
|
+
hsla(0, 0%, 100%, 0) 0%,
|
|
481
|
+
hsla(199, 90%, 85%, 0.55) 55%,
|
|
482
|
+
hsla(0, 0%, 100%, 0.98) 100%
|
|
483
|
+
);
|
|
484
|
+
filter: blur(0.2px) drop-shadow(0 0 3px hsla(199, 90%, 80%, 0.5));
|
|
276
485
|
}
|
|
277
486
|
.shooter::before {
|
|
278
|
-
content: '';
|
|
279
|
-
|
|
280
|
-
|
|
487
|
+
content: '';
|
|
488
|
+
position: absolute;
|
|
489
|
+
right: -2px;
|
|
490
|
+
top: 50%;
|
|
491
|
+
width: 6px;
|
|
492
|
+
height: 6px;
|
|
493
|
+
border-radius: 50%;
|
|
494
|
+
transform: translateY(-50%);
|
|
495
|
+
background: radial-gradient(circle, #fff 0%, hsla(199, 95%, 88%, 0.95) 50%, transparent 75%);
|
|
496
|
+
box-shadow:
|
|
497
|
+
0 0 8px 2px #fff,
|
|
498
|
+
0 0 20px 7px hsla(199, 90%, 75%, 0.85),
|
|
499
|
+
0 0 38px 14px hsla(199, 90%, 60%, 0.4);
|
|
281
500
|
}
|
|
282
501
|
.shooter::after {
|
|
283
|
-
content: '';
|
|
284
|
-
|
|
502
|
+
content: '';
|
|
503
|
+
position: absolute;
|
|
504
|
+
left: 0;
|
|
505
|
+
top: 50%;
|
|
506
|
+
width: 55%;
|
|
507
|
+
height: 1px;
|
|
508
|
+
transform: translateY(-50%);
|
|
509
|
+
background: hsla(199, 85%, 92%, 0.65);
|
|
510
|
+
filter: blur(2px);
|
|
285
511
|
}
|
|
286
512
|
|
|
287
513
|
/* Satellite (drifting glyph, e.g. a lucide "satellite" icon) */
|
|
288
|
-
@keyframes satelliteDrift {
|
|
289
|
-
|
|
514
|
+
@keyframes satelliteDrift {
|
|
515
|
+
from {
|
|
516
|
+
transform: translate(0, 0) rotate(-18deg);
|
|
517
|
+
}
|
|
518
|
+
to {
|
|
519
|
+
transform: translate(126vw, 34vh) rotate(-18deg);
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
#satellite {
|
|
523
|
+
animation: satelliteDrift 46s linear infinite;
|
|
524
|
+
}
|
|
290
525
|
|
|
291
526
|
/* Cursor-following ambient glow (nebula that trails the pointer) */
|
|
292
527
|
#cursorGlow {
|
|
293
|
-
border-radius: 50%;
|
|
294
|
-
|
|
295
|
-
|
|
528
|
+
border-radius: 50%;
|
|
529
|
+
transform: translate(-50%, -50%);
|
|
530
|
+
background: radial-gradient(circle, hsl(217 91% 60% / 0.1), transparent 70%);
|
|
531
|
+
opacity: 0;
|
|
532
|
+
transition: opacity 0.4s ease;
|
|
296
533
|
}
|
|
297
534
|
|
|
298
535
|
@media (prefers-reduced-motion: reduce) {
|
|
299
|
-
html:not(.force-motion) #space .stars,
|
|
300
|
-
html:not(.force-motion) .
|
|
301
|
-
html:not(.force-motion)
|
|
302
|
-
html:not(.force-motion)
|
|
303
|
-
html:not(.force-motion) #
|
|
304
|
-
.
|
|
536
|
+
html:not(.force-motion) #space .stars,
|
|
537
|
+
html:not(.force-motion) .twinkle,
|
|
538
|
+
html:not(.force-motion) .floaty,
|
|
539
|
+
html:not(.force-motion) .shooter,
|
|
540
|
+
html:not(.force-motion) #satellite,
|
|
541
|
+
html:not(.force-motion) .asteroid {
|
|
542
|
+
animation: none !important;
|
|
543
|
+
}
|
|
544
|
+
html:not(.force-motion) #cursorGlow {
|
|
545
|
+
display: none !important;
|
|
546
|
+
}
|
|
547
|
+
html:not(.force-motion) #space .sky,
|
|
548
|
+
html:not(.force-motion) #space .aurora {
|
|
549
|
+
animation: none !important;
|
|
550
|
+
}
|
|
551
|
+
.card.glow-edge::before {
|
|
552
|
+
display: none;
|
|
553
|
+
}
|
|
305
554
|
}
|
package/dist/ui/Accordion.d.ts
CHANGED
|
@@ -1,13 +1,32 @@
|
|
|
1
1
|
import { JSX } from 'solid-js';
|
|
2
|
+
/** A single collapsible section rendered by {@link Accordion}. */
|
|
2
3
|
export interface AccordionItem {
|
|
4
|
+
/** Unique identifier for the item; used to track expanded state. */
|
|
3
5
|
value: string;
|
|
6
|
+
/** Text shown in the trigger row. */
|
|
4
7
|
title: string;
|
|
8
|
+
/** Content revealed when the item is expanded. */
|
|
5
9
|
content: JSX.Element;
|
|
6
10
|
}
|
|
7
11
|
interface AccordionProps {
|
|
8
12
|
items: AccordionItem[];
|
|
13
|
+
/** Allow more than one item to be expanded at the same time. Defaults to `false` (single-open). */
|
|
9
14
|
multiple?: boolean;
|
|
10
15
|
class?: string;
|
|
11
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* Accessible, collapsible list of sections built on Kobalte's `Accordion` primitive.
|
|
19
|
+
* Each entry in `items` renders as a header/trigger row plus a content panel.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```tsx
|
|
23
|
+
* <Accordion
|
|
24
|
+
* items={[
|
|
25
|
+
* { value: 'a', title: 'What is A4ui?', content: <p>A SolidJS design system.</p> },
|
|
26
|
+
* { value: 'b', title: 'How do I install it?', content: <p>npm install a4ui</p> },
|
|
27
|
+
* ]}
|
|
28
|
+
* />
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
12
31
|
export declare function Accordion(props: AccordionProps): JSX.Element;
|
|
13
32
|
export {};
|
package/dist/ui/Alert.d.ts
CHANGED
|
@@ -1,9 +1,23 @@
|
|
|
1
1
|
import { JSX, ParentProps } from 'solid-js';
|
|
2
|
+
/** Semantic tone of an {@link Alert}; drives the border/background tint and icon. */
|
|
2
3
|
export type AlertTone = 'info' | 'success' | 'warning' | 'danger';
|
|
3
4
|
interface AlertProps extends ParentProps {
|
|
5
|
+
/** Visual/semantic tone. Defaults to `'info'`. */
|
|
4
6
|
tone?: AlertTone;
|
|
7
|
+
/** Optional bold heading shown above the body text. */
|
|
5
8
|
title?: string;
|
|
6
9
|
class?: string;
|
|
7
10
|
}
|
|
11
|
+
/**
|
|
12
|
+
* Inline status banner (not a toast/dialog) built on Kobalte's `Alert` primitive,
|
|
13
|
+
* for surfacing info/success/warning/danger messages inline in the page.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```tsx
|
|
17
|
+
* <Alert tone="warning" title="Heads up">
|
|
18
|
+
* Your session will expire in 5 minutes.
|
|
19
|
+
* </Alert>
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
8
22
|
export declare function Alert(props: AlertProps): JSX.Element;
|
|
9
23
|
export {};
|
package/dist/ui/AlertDialog.d.ts
CHANGED
|
@@ -1,9 +1,24 @@
|
|
|
1
1
|
import { JSX, ParentProps } from 'solid-js';
|
|
2
2
|
interface AlertDialogProps extends ParentProps {
|
|
3
|
+
/** Whether the dialog is currently visible. */
|
|
3
4
|
open: boolean;
|
|
5
|
+
/** Called when the dialog requests to open/close (overlay click, Escape, etc). */
|
|
4
6
|
onOpenChange: (open: boolean) => void;
|
|
7
|
+
/** Optional heading rendered above the description. */
|
|
5
8
|
title?: string;
|
|
6
9
|
class?: string;
|
|
7
10
|
}
|
|
11
|
+
/**
|
|
12
|
+
* Centered, focus-trapped confirmation modal built on Kobalte's `AlertDialog`
|
|
13
|
+
* primitive. Use for interruptive confirmations (e.g. "Delete this item?")
|
|
14
|
+
* rather than for general-purpose dialogs.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```tsx
|
|
18
|
+
* <AlertDialog open={confirmOpen()} onOpenChange={setConfirmOpen} title="Delete project?">
|
|
19
|
+
* This action cannot be undone.
|
|
20
|
+
* </AlertDialog>
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
8
23
|
export declare function AlertDialog(props: AlertDialogProps): JSX.Element;
|
|
9
24
|
export {};
|
package/dist/ui/Avatar.d.ts
CHANGED
|
@@ -1,9 +1,20 @@
|
|
|
1
1
|
import { JSX } from 'solid-js';
|
|
2
2
|
interface AvatarProps {
|
|
3
|
+
/** Image URL. If it fails to load (or is omitted), `fallback` is shown instead. */
|
|
3
4
|
src?: string;
|
|
4
5
|
alt?: string;
|
|
6
|
+
/** Text shown when there is no image or it fails to load (typically initials). */
|
|
5
7
|
fallback: string;
|
|
6
8
|
class?: string;
|
|
7
9
|
}
|
|
10
|
+
/**
|
|
11
|
+
* Circular user avatar built on Kobalte's `Image` primitive; automatically
|
|
12
|
+
* falls back to initials/text when the image is missing or fails to load.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```tsx
|
|
16
|
+
* <Avatar src={user.avatarUrl} alt={user.name} fallback="JD" />
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
8
19
|
export declare function Avatar(props: AvatarProps): JSX.Element;
|
|
9
20
|
export {};
|