@salmexio/ui 1.0.0 → 1.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.
- package/README.md +1 -1
- package/dist/dialogs/ContextMenu/ContextMenu.svelte +17 -7
- package/dist/dialogs/ContextMenu/ContextMenu.svelte.d.ts +1 -1
- package/dist/dialogs/Modal/Modal.svelte +37 -4
- package/dist/dialogs/Modal/Modal.svelte.d.ts +1 -1
- package/dist/feedback/Alert/Alert.svelte +67 -19
- package/dist/feedback/Alert/Alert.svelte.d.ts +1 -1
- package/dist/feedback/ProgressBar/ProgressBar.svelte +33 -11
- package/dist/feedback/ProgressBar/ProgressBar.svelte.d.ts +3 -3
- package/dist/feedback/ProgressBar/ProgressBar.svelte.d.ts.map +1 -1
- package/dist/feedback/Skeleton/Skeleton.svelte +12 -4
- package/dist/feedback/Skeleton/Skeleton.svelte.d.ts +1 -1
- package/dist/feedback/Spinner/Spinner.svelte +5 -3
- package/dist/feedback/Spinner/Spinner.svelte.d.ts +2 -2
- package/dist/feedback/Toast/Toaster.svelte +45 -13
- package/dist/feedback/Toast/Toaster.svelte.d.ts +1 -1
- package/dist/forms/Checkbox/Checkbox.svelte +37 -9
- package/dist/forms/Checkbox/Checkbox.svelte.d.ts +1 -1
- package/dist/forms/Select/Select.svelte +28 -12
- package/dist/forms/Select/Select.svelte.d.ts +1 -1
- package/dist/forms/Slider/Slider.svelte +66 -38
- package/dist/forms/Slider/Slider.svelte.d.ts +2 -2
- package/dist/forms/Slider/Slider.svelte.d.ts.map +1 -1
- package/dist/forms/TextInput/TextInput.svelte +35 -7
- package/dist/forms/TextInput/TextInput.svelte.d.ts +1 -1
- package/dist/forms/Textarea/Textarea.svelte +22 -7
- package/dist/forms/Textarea/Textarea.svelte.d.ts +1 -1
- package/dist/forms/Toggle/Toggle.svelte +71 -12
- package/dist/forms/Toggle/Toggle.svelte.d.ts +1 -1
- package/dist/layout/Card/Card.svelte +128 -5
- package/dist/layout/Card/Card.svelte.d.ts +4 -1
- package/dist/layout/Card/Card.svelte.d.ts.map +1 -1
- package/dist/layout/Container/Container.svelte +1 -1
- package/dist/layout/Container/Container.svelte.d.ts +1 -1
- package/dist/layout/ThermalBackground/ThermalBackground.svelte +275 -0
- package/dist/layout/ThermalBackground/ThermalBackground.svelte.d.ts +14 -0
- package/dist/layout/ThermalBackground/ThermalBackground.svelte.d.ts.map +1 -0
- package/dist/layout/ThermalBackground/index.d.ts +2 -0
- package/dist/layout/ThermalBackground/index.d.ts.map +1 -0
- package/dist/layout/ThermalBackground/index.js +1 -0
- package/dist/layout/index.d.ts +1 -0
- package/dist/layout/index.d.ts.map +1 -1
- package/dist/layout/index.js +1 -0
- package/dist/navigation/CommandPalette/CommandPalette.svelte +45 -11
- package/dist/navigation/CommandPalette/CommandPalette.svelte.d.ts +1 -1
- package/dist/navigation/NavMenu/NavMenu.svelte +800 -0
- package/dist/navigation/NavMenu/NavMenu.svelte.d.ts +81 -0
- package/dist/navigation/NavMenu/NavMenu.svelte.d.ts.map +1 -0
- package/dist/navigation/NavMenu/index.d.ts +3 -0
- package/dist/navigation/NavMenu/index.d.ts.map +1 -0
- package/dist/navigation/NavMenu/index.js +1 -0
- package/dist/navigation/Tabs/Tabs.svelte +73 -11
- package/dist/navigation/Tabs/Tabs.svelte.d.ts +1 -1
- package/dist/navigation/index.d.ts +2 -0
- package/dist/navigation/index.d.ts.map +1 -1
- package/dist/navigation/index.js +1 -0
- package/dist/primitives/Badge/Badge.svelte +68 -21
- package/dist/primitives/Badge/Badge.svelte.d.ts +1 -1
- package/dist/primitives/Button/Button.svelte +254 -34
- package/dist/primitives/Button/Button.svelte.d.ts +1 -1
- package/dist/primitives/Tooltip/Tooltip.svelte +10 -2
- package/dist/primitives/Tooltip/Tooltip.svelte.d.ts +1 -1
- package/dist/styles/tokens.css +202 -64
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<!--
|
|
2
2
|
@component ContextMenu
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
INFRARED — Right-click context menu with glass panel, keyboard navigation,
|
|
5
5
|
separators, section headers, submenus, and keyboard shortcut hints.
|
|
6
6
|
|
|
7
7
|
@example
|
|
@@ -386,8 +386,18 @@ onMount(() => {
|
|
|
386
386
|
max-width: 320px;
|
|
387
387
|
background: var(--sx-color-surface-2);
|
|
388
388
|
border: 1px solid var(--sx-color-border-strong);
|
|
389
|
+
border-top-color: rgba(255, 255, 255, 0.05);
|
|
389
390
|
border-radius: var(--sx-radius-md);
|
|
390
|
-
box-shadow:
|
|
391
|
+
box-shadow:
|
|
392
|
+
/* 3D extrusion */
|
|
393
|
+
0 1px 0 0 rgba(0, 0, 0, 0.2),
|
|
394
|
+
0 2px 0 0 rgba(0, 0, 0, 0.14),
|
|
395
|
+
0 3px 0 0 rgba(0, 0, 0, 0.08),
|
|
396
|
+
/* Deep ambient shadow */
|
|
397
|
+
0 6px 16px -3px rgba(0, 0, 0, 0.45),
|
|
398
|
+
0 12px 32px -6px rgba(0, 0, 0, 0.2),
|
|
399
|
+
/* Warm edge glow */
|
|
400
|
+
0 0 12px -6px rgba(255, 107, 53, 0.08);
|
|
391
401
|
backdrop-filter: var(--sx-glass-blur);
|
|
392
402
|
padding: var(--sx-space-1) 0;
|
|
393
403
|
outline: none;
|
|
@@ -421,8 +431,8 @@ onMount(() => {
|
|
|
421
431
|
}
|
|
422
432
|
|
|
423
433
|
.sx-context-item-active {
|
|
424
|
-
background: var(--sx-color-
|
|
425
|
-
color: var(--sx-color-
|
|
434
|
+
background: var(--sx-color-primary-hover);
|
|
435
|
+
color: var(--sx-color-primary);
|
|
426
436
|
}
|
|
427
437
|
|
|
428
438
|
.sx-context-item-disabled {
|
|
@@ -450,7 +460,7 @@ onMount(() => {
|
|
|
450
460
|
}
|
|
451
461
|
|
|
452
462
|
.sx-context-item-active .sx-context-icon {
|
|
453
|
-
color: var(--sx-color-
|
|
463
|
+
color: var(--sx-color-primary);
|
|
454
464
|
}
|
|
455
465
|
|
|
456
466
|
.sx-context-icon-spacer {
|
|
@@ -474,7 +484,7 @@ onMount(() => {
|
|
|
474
484
|
}
|
|
475
485
|
|
|
476
486
|
.sx-context-item-active .sx-context-shortcut {
|
|
477
|
-
color: var(--sx-color-
|
|
487
|
+
color: var(--sx-color-primary);
|
|
478
488
|
opacity: 0.7;
|
|
479
489
|
}
|
|
480
490
|
|
|
@@ -488,7 +498,7 @@ onMount(() => {
|
|
|
488
498
|
}
|
|
489
499
|
|
|
490
500
|
.sx-context-item-active .sx-context-submenu-arrow {
|
|
491
|
-
color: var(--sx-color-
|
|
501
|
+
color: var(--sx-color-primary);
|
|
492
502
|
}
|
|
493
503
|
|
|
494
504
|
/* ========================================
|
|
@@ -28,7 +28,7 @@ interface Props {
|
|
|
28
28
|
/**
|
|
29
29
|
* ContextMenu
|
|
30
30
|
*
|
|
31
|
-
*
|
|
31
|
+
* INFRARED — Right-click context menu with glass panel, keyboard navigation,
|
|
32
32
|
* separators, section headers, submenus, and keyboard shortcut hints.
|
|
33
33
|
*
|
|
34
34
|
* @example
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<!--
|
|
2
2
|
@component Modal
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
INFRARED — Dialog with glass surface, subtle border, clean header.
|
|
5
5
|
Follows WAI-ARIA Dialog (Modal) pattern: focus trap, restore focus on close,
|
|
6
6
|
aria-labelledby, aria-describedby, aria-modal. Escape and backdrop close.
|
|
7
7
|
For full inert support (background not focusable), render modal in a portal
|
|
@@ -263,11 +263,37 @@ const closeLabel = $derived(closeBtnAriaLabel ?? 'Close dialog');
|
|
|
263
263
|
background: var(--sx-color-surface);
|
|
264
264
|
border: 1px solid var(--sx-color-border-strong);
|
|
265
265
|
border-radius: var(--sx-radius-lg);
|
|
266
|
-
box-shadow:
|
|
266
|
+
box-shadow:
|
|
267
|
+
/* 3D extrusion underneath */
|
|
268
|
+
0 1px 0 0 rgba(0, 0, 0, 0.2),
|
|
269
|
+
0 2px 0 0 rgba(0, 0, 0, 0.15),
|
|
270
|
+
0 3px 0 0 rgba(0, 0, 0, 0.1),
|
|
271
|
+
0 4px 0 0 rgba(0, 0, 0, 0.06),
|
|
272
|
+
/* Deep ambient shadow */
|
|
273
|
+
0 8px 24px -4px rgba(0, 0, 0, 0.5),
|
|
274
|
+
0 16px 48px -8px rgba(0, 0, 0, 0.3),
|
|
275
|
+
/* Warm forge glow on edges */
|
|
276
|
+
0 0 32px -8px rgba(255, 107, 53, 0.08);
|
|
267
277
|
animation: sx-modal-scale-in 200ms ease-out;
|
|
268
278
|
overflow: hidden;
|
|
269
279
|
}
|
|
270
280
|
|
|
281
|
+
/* Top-lit bevel */
|
|
282
|
+
.sx-modal-container::before {
|
|
283
|
+
content: '';
|
|
284
|
+
position: absolute;
|
|
285
|
+
inset: 0;
|
|
286
|
+
border-radius: inherit;
|
|
287
|
+
background: linear-gradient(
|
|
288
|
+
180deg,
|
|
289
|
+
rgba(255, 255, 255, 0.04) 0%,
|
|
290
|
+
transparent 30%,
|
|
291
|
+
rgba(0, 0, 0, 0.04) 100%
|
|
292
|
+
);
|
|
293
|
+
pointer-events: none;
|
|
294
|
+
z-index: 5;
|
|
295
|
+
}
|
|
296
|
+
|
|
271
297
|
@keyframes sx-modal-scale-in {
|
|
272
298
|
from {
|
|
273
299
|
opacity: 0;
|
|
@@ -313,6 +339,8 @@ const closeLabel = $derived(closeBtnAriaLabel ?? 'Close dialog');
|
|
|
313
339
|
HEADER
|
|
314
340
|
======================================== */
|
|
315
341
|
.sx-modal-header {
|
|
342
|
+
position: relative;
|
|
343
|
+
z-index: 1;
|
|
316
344
|
display: flex;
|
|
317
345
|
align-items: center;
|
|
318
346
|
justify-content: space-between;
|
|
@@ -331,8 +359,9 @@ const closeLabel = $derived(closeBtnAriaLabel ?? 'Close dialog');
|
|
|
331
359
|
}
|
|
332
360
|
|
|
333
361
|
.sx-modal-title-wrap:focus-visible {
|
|
334
|
-
outline: 2px solid var(--sx-color-
|
|
362
|
+
outline: 2px solid var(--sx-color-primary);
|
|
335
363
|
outline-offset: 2px;
|
|
364
|
+
border-radius: var(--sx-radius-sm);
|
|
336
365
|
}
|
|
337
366
|
|
|
338
367
|
.sx-modal-title {
|
|
@@ -376,7 +405,7 @@ const closeLabel = $derived(closeBtnAriaLabel ?? 'Close dialog');
|
|
|
376
405
|
}
|
|
377
406
|
|
|
378
407
|
.sx-modal-close:focus-visible {
|
|
379
|
-
outline: 2px solid var(--sx-color-
|
|
408
|
+
outline: 2px solid var(--sx-color-primary);
|
|
380
409
|
outline-offset: 2px;
|
|
381
410
|
}
|
|
382
411
|
|
|
@@ -384,6 +413,8 @@ const closeLabel = $derived(closeBtnAriaLabel ?? 'Close dialog');
|
|
|
384
413
|
BODY
|
|
385
414
|
======================================== */
|
|
386
415
|
.sx-modal-body {
|
|
416
|
+
position: relative;
|
|
417
|
+
z-index: 1;
|
|
387
418
|
padding: var(--sx-space-6);
|
|
388
419
|
flex: 1;
|
|
389
420
|
min-height: 0;
|
|
@@ -394,6 +425,8 @@ const closeLabel = $derived(closeBtnAriaLabel ?? 'Close dialog');
|
|
|
394
425
|
FOOTER
|
|
395
426
|
======================================== */
|
|
396
427
|
.sx-modal-footer {
|
|
428
|
+
position: relative;
|
|
429
|
+
z-index: 1;
|
|
397
430
|
display: flex;
|
|
398
431
|
align-items: center;
|
|
399
432
|
justify-content: flex-end;
|
|
@@ -31,7 +31,7 @@ interface Props {
|
|
|
31
31
|
/**
|
|
32
32
|
* Modal
|
|
33
33
|
*
|
|
34
|
-
*
|
|
34
|
+
* INFRARED — Dialog with glass surface, subtle border, clean header.
|
|
35
35
|
* Follows WAI-ARIA Dialog (Modal) pattern: focus trap, restore focus on close,
|
|
36
36
|
* aria-labelledby, aria-describedby, aria-modal. Escape and backdrop close.
|
|
37
37
|
* For full inert support (background not focusable), render modal in a portal
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<!--
|
|
2
2
|
@component Alert
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
INFRARED — Clean message banner. Left accent border, dark surface.
|
|
5
5
|
Dismissible, expandable, optional title; role="alert" for errors.
|
|
6
6
|
-->
|
|
7
7
|
<script lang="ts">
|
|
@@ -157,17 +157,39 @@ function toggleExpanded() {
|
|
|
157
157
|
</div>
|
|
158
158
|
|
|
159
159
|
<style>
|
|
160
|
-
/*
|
|
160
|
+
/* INFRARED: 3D status plate — left accent border, extrusion, bevel */
|
|
161
161
|
.sx-alert {
|
|
162
|
+
position: relative;
|
|
162
163
|
display: flex;
|
|
163
164
|
gap: var(--sx-space-3);
|
|
164
165
|
padding: var(--sx-space-4);
|
|
165
166
|
background: var(--sx-color-surface);
|
|
166
167
|
border: 1px solid var(--sx-color-border);
|
|
167
|
-
border-left:
|
|
168
|
+
border-left: 3px solid var(--sx-color-border-strong);
|
|
168
169
|
border-radius: var(--sx-radius-md);
|
|
169
170
|
font-family: var(--sx-font-body);
|
|
171
|
+
box-shadow:
|
|
172
|
+
0 1px 0 0 rgba(0, 0, 0, 0.15),
|
|
173
|
+
0 2px 0 0 rgba(0, 0, 0, 0.1),
|
|
174
|
+
0 4px 8px -2px rgba(0, 0, 0, 0.3);
|
|
170
175
|
transition: box-shadow var(--sx-transition-fast);
|
|
176
|
+
animation: sx-alert-in var(--sx-duration-base) var(--sx-ease-out) both;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/* Top-lit bevel */
|
|
180
|
+
.sx-alert::before {
|
|
181
|
+
content: '';
|
|
182
|
+
position: absolute;
|
|
183
|
+
inset: 0;
|
|
184
|
+
border-radius: inherit;
|
|
185
|
+
background: linear-gradient(
|
|
186
|
+
180deg,
|
|
187
|
+
rgba(255, 255, 255, 0.04) 0%,
|
|
188
|
+
transparent 40%,
|
|
189
|
+
rgba(0, 0, 0, 0.03) 100%
|
|
190
|
+
);
|
|
191
|
+
pointer-events: none;
|
|
192
|
+
z-index: 0;
|
|
171
193
|
}
|
|
172
194
|
|
|
173
195
|
.sx-alert-standard {
|
|
@@ -189,6 +211,8 @@ function toggleExpanded() {
|
|
|
189
211
|
}
|
|
190
212
|
|
|
191
213
|
.sx-alert-icon {
|
|
214
|
+
position: relative;
|
|
215
|
+
z-index: 1;
|
|
192
216
|
flex-shrink: 0;
|
|
193
217
|
display: flex;
|
|
194
218
|
align-items: flex-start;
|
|
@@ -196,6 +220,8 @@ function toggleExpanded() {
|
|
|
196
220
|
}
|
|
197
221
|
|
|
198
222
|
.sx-alert-content {
|
|
223
|
+
position: relative;
|
|
224
|
+
z-index: 1;
|
|
199
225
|
flex: 1;
|
|
200
226
|
min-width: 0;
|
|
201
227
|
display: flex;
|
|
@@ -250,8 +276,8 @@ function toggleExpanded() {
|
|
|
250
276
|
}
|
|
251
277
|
|
|
252
278
|
.sx-alert-title-btn:focus-visible {
|
|
253
|
-
outline:
|
|
254
|
-
|
|
279
|
+
outline: 2px solid var(--sx-color-primary);
|
|
280
|
+
outline-offset: 2px;
|
|
255
281
|
}
|
|
256
282
|
|
|
257
283
|
.sx-alert-expand-icon {
|
|
@@ -263,6 +289,8 @@ function toggleExpanded() {
|
|
|
263
289
|
|
|
264
290
|
/* Dismiss button — transparent, minimal */
|
|
265
291
|
.sx-alert-dismiss {
|
|
292
|
+
position: relative;
|
|
293
|
+
z-index: 1;
|
|
266
294
|
flex-shrink: 0;
|
|
267
295
|
display: flex;
|
|
268
296
|
align-items: center;
|
|
@@ -287,14 +315,18 @@ function toggleExpanded() {
|
|
|
287
315
|
}
|
|
288
316
|
|
|
289
317
|
.sx-alert-dismiss:focus-visible {
|
|
290
|
-
outline:
|
|
291
|
-
|
|
318
|
+
outline: 2px solid var(--sx-color-primary);
|
|
319
|
+
outline-offset: 2px;
|
|
292
320
|
}
|
|
293
321
|
|
|
294
|
-
/* Type: success */
|
|
322
|
+
/* Type: success — green accent, green-tinted extrusion */
|
|
295
323
|
.sx-alert-success {
|
|
296
324
|
background: var(--sx-color-green-subtle);
|
|
297
325
|
border-left-color: var(--sx-color-green);
|
|
326
|
+
box-shadow:
|
|
327
|
+
0 1px 0 0 rgba(34, 120, 69, 0.25),
|
|
328
|
+
0 2px 0 0 rgba(34, 120, 69, 0.15),
|
|
329
|
+
0 4px 8px -2px rgba(0, 0, 0, 0.3);
|
|
298
330
|
}
|
|
299
331
|
|
|
300
332
|
.sx-alert-success .sx-alert-icon {
|
|
@@ -305,10 +337,14 @@ function toggleExpanded() {
|
|
|
305
337
|
color: var(--sx-color-text);
|
|
306
338
|
}
|
|
307
339
|
|
|
308
|
-
/* Type: error */
|
|
340
|
+
/* Type: error — red accent, crimson-tinted extrusion */
|
|
309
341
|
.sx-alert-error {
|
|
310
342
|
background: var(--sx-color-red-subtle);
|
|
311
343
|
border-left-color: var(--sx-color-red);
|
|
344
|
+
box-shadow:
|
|
345
|
+
0 1px 0 0 rgba(180, 30, 30, 0.25),
|
|
346
|
+
0 2px 0 0 rgba(140, 20, 20, 0.15),
|
|
347
|
+
0 4px 8px -2px rgba(0, 0, 0, 0.3);
|
|
312
348
|
}
|
|
313
349
|
|
|
314
350
|
.sx-alert-error .sx-alert-icon {
|
|
@@ -319,35 +355,43 @@ function toggleExpanded() {
|
|
|
319
355
|
color: var(--sx-color-text);
|
|
320
356
|
}
|
|
321
357
|
|
|
322
|
-
/* Type: warning */
|
|
358
|
+
/* Type: warning — brass accent, brass-tinted extrusion */
|
|
323
359
|
.sx-alert-warning {
|
|
324
|
-
background: var(--sx-color-
|
|
325
|
-
border-left-color: var(--sx-color-
|
|
360
|
+
background: var(--sx-color-brass-subtle);
|
|
361
|
+
border-left-color: var(--sx-color-secondary);
|
|
362
|
+
box-shadow:
|
|
363
|
+
0 1px 0 0 rgba(160, 134, 62, 0.25),
|
|
364
|
+
0 2px 0 0 rgba(130, 108, 50, 0.15),
|
|
365
|
+
0 4px 8px -2px rgba(0, 0, 0, 0.3);
|
|
326
366
|
}
|
|
327
367
|
|
|
328
368
|
.sx-alert-warning .sx-alert-icon {
|
|
329
|
-
color: var(--sx-color-
|
|
369
|
+
color: var(--sx-color-secondary);
|
|
330
370
|
}
|
|
331
371
|
|
|
332
372
|
.sx-alert-warning .sx-alert-title {
|
|
333
373
|
color: var(--sx-color-text);
|
|
334
374
|
}
|
|
335
375
|
|
|
336
|
-
/* Type: info */
|
|
376
|
+
/* Type: info — vermilion accent, warm-tinted extrusion */
|
|
337
377
|
.sx-alert-info {
|
|
338
|
-
background: var(--sx-color-
|
|
339
|
-
border-left-color: var(--sx-color-
|
|
378
|
+
background: var(--sx-color-primary-subtle);
|
|
379
|
+
border-left-color: var(--sx-color-primary);
|
|
380
|
+
box-shadow:
|
|
381
|
+
0 1px 0 0 rgba(200, 85, 30, 0.25),
|
|
382
|
+
0 2px 0 0 rgba(160, 65, 20, 0.15),
|
|
383
|
+
0 4px 8px -2px rgba(0, 0, 0, 0.3);
|
|
340
384
|
}
|
|
341
385
|
|
|
342
386
|
.sx-alert-info .sx-alert-icon {
|
|
343
|
-
color: var(--sx-color-
|
|
387
|
+
color: var(--sx-color-primary);
|
|
344
388
|
}
|
|
345
389
|
|
|
346
390
|
.sx-alert-info .sx-alert-title {
|
|
347
391
|
color: var(--sx-color-text);
|
|
348
392
|
}
|
|
349
393
|
|
|
350
|
-
/* Type: neutral */
|
|
394
|
+
/* Type: neutral — subtle neutral extrusion */
|
|
351
395
|
.sx-alert-neutral {
|
|
352
396
|
background: var(--sx-color-surface);
|
|
353
397
|
border-left-color: var(--sx-color-border-strong);
|
|
@@ -362,7 +406,11 @@ function toggleExpanded() {
|
|
|
362
406
|
}
|
|
363
407
|
|
|
364
408
|
@media (prefers-reduced-motion: reduce) {
|
|
365
|
-
.sx-alert
|
|
409
|
+
.sx-alert {
|
|
410
|
+
transition: none;
|
|
411
|
+
animation: none;
|
|
412
|
+
}
|
|
413
|
+
|
|
366
414
|
.sx-alert-dismiss,
|
|
367
415
|
.sx-alert-title-btn {
|
|
368
416
|
transition: none;
|
|
@@ -21,7 +21,7 @@ interface Props {
|
|
|
21
21
|
/**
|
|
22
22
|
* Alert
|
|
23
23
|
*
|
|
24
|
-
*
|
|
24
|
+
* INFRARED — Clean message banner. Left accent border, dark surface.
|
|
25
25
|
* Dismissible, expandable, optional title; role="alert" for errors.
|
|
26
26
|
*/
|
|
27
27
|
declare const Alert: import("svelte").Component<Props, {}, "">;
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
<!--
|
|
2
2
|
@component ProgressBar
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
INFRARED — Determinate & indeterminate progress indicator with
|
|
5
5
|
optional label, value display, size variants, and full ARIA compliance.
|
|
6
6
|
|
|
7
7
|
@example
|
|
8
8
|
<ProgressBar value={65} label="Upload" />
|
|
9
9
|
<ProgressBar indeterminate label="Loading..." />
|
|
10
|
-
<ProgressBar value={30} max={50} showValue color="
|
|
10
|
+
<ProgressBar value={30} max={50} showValue color="primary" />
|
|
11
11
|
-->
|
|
12
12
|
<script lang="ts">
|
|
13
13
|
import { cn } from '../../utils/cn.js';
|
|
14
14
|
|
|
15
15
|
type ProgressSize = 'sm' | 'md' | 'lg';
|
|
16
|
-
type ProgressColor = '
|
|
16
|
+
type ProgressColor = 'primary' | 'green' | 'brass' | 'red' | 'teal';
|
|
17
17
|
|
|
18
18
|
interface Props {
|
|
19
19
|
/** Current value (0–max). Ignored when indeterminate. */
|
|
@@ -48,7 +48,7 @@ let {
|
|
|
48
48
|
showValue = false,
|
|
49
49
|
formatValue,
|
|
50
50
|
size = 'md',
|
|
51
|
-
color = '
|
|
51
|
+
color = 'primary',
|
|
52
52
|
class: className = '',
|
|
53
53
|
testId
|
|
54
54
|
}: Props = $props();
|
|
@@ -159,12 +159,15 @@ const labelId = $derived(label ? `${stableId}-label` : undefined);
|
|
|
159
159
|
align-self: flex-end;
|
|
160
160
|
}
|
|
161
161
|
|
|
162
|
-
/* Track */
|
|
162
|
+
/* Track — recessed channel */
|
|
163
163
|
.sx-progress-track {
|
|
164
164
|
width: 100%;
|
|
165
165
|
background: var(--sx-color-surface-2);
|
|
166
166
|
border-radius: var(--sx-radius-full);
|
|
167
167
|
overflow: hidden;
|
|
168
|
+
box-shadow:
|
|
169
|
+
inset 0 1px 2px rgba(0, 0, 0, 0.3),
|
|
170
|
+
inset 0 0 0 1px rgba(0, 0, 0, 0.06);
|
|
168
171
|
}
|
|
169
172
|
|
|
170
173
|
.sx-progress-sm {
|
|
@@ -184,27 +187,46 @@ const labelId = $derived(label ? `${stableId}-label` : undefined);
|
|
|
184
187
|
height: 100%;
|
|
185
188
|
border-radius: var(--sx-radius-full);
|
|
186
189
|
transition: width 0.3s var(--sx-ease-out);
|
|
190
|
+
position: relative;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/* Leading-edge glow — subtle light at the tip of the bar */
|
|
194
|
+
.sx-progress-fill::after {
|
|
195
|
+
content: '';
|
|
196
|
+
position: absolute;
|
|
197
|
+
right: 0;
|
|
198
|
+
top: 0;
|
|
199
|
+
bottom: 0;
|
|
200
|
+
width: 24px;
|
|
201
|
+
border-radius: inherit;
|
|
202
|
+
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2));
|
|
203
|
+
opacity: 0.6;
|
|
187
204
|
}
|
|
188
205
|
|
|
189
206
|
/* Colors */
|
|
190
|
-
.sx-progress-color-
|
|
191
|
-
background:
|
|
207
|
+
.sx-progress-color-primary {
|
|
208
|
+
background: linear-gradient(90deg, #FF6B35, #C8A84E);
|
|
209
|
+
box-shadow: 0 0 8px rgba(255, 107, 53, 0.2);
|
|
192
210
|
}
|
|
193
211
|
|
|
194
212
|
.sx-progress-color-green {
|
|
195
213
|
background: var(--sx-color-green);
|
|
214
|
+
box-shadow: 0 0 8px rgba(74, 222, 128, 0.2);
|
|
196
215
|
}
|
|
197
216
|
|
|
198
|
-
.sx-progress-color-
|
|
199
|
-
background: var(--sx-color-
|
|
217
|
+
.sx-progress-color-brass {
|
|
218
|
+
background: var(--sx-color-secondary);
|
|
219
|
+
box-shadow: 0 0 8px rgba(200, 168, 78, 0.2);
|
|
200
220
|
}
|
|
201
221
|
|
|
202
222
|
.sx-progress-color-red {
|
|
203
223
|
background: var(--sx-color-red);
|
|
224
|
+
box-shadow: 0 0 8px rgba(220, 38, 38, 0.2);
|
|
204
225
|
}
|
|
205
226
|
|
|
206
|
-
.sx-progress-color-
|
|
207
|
-
background: var(--sx-color-
|
|
227
|
+
.sx-progress-color-teal {
|
|
228
|
+
background: var(--sx-color-teal);
|
|
229
|
+
box-shadow: 0 0 8px rgba(61, 139, 139, 0.2);
|
|
208
230
|
}
|
|
209
231
|
|
|
210
232
|
/* Indeterminate */
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
type ProgressSize = 'sm' | 'md' | 'lg';
|
|
2
|
-
type ProgressColor = '
|
|
2
|
+
type ProgressColor = 'primary' | 'green' | 'brass' | 'red' | 'teal';
|
|
3
3
|
interface Props {
|
|
4
4
|
/** Current value (0–max). Ignored when indeterminate. */
|
|
5
5
|
value?: number;
|
|
@@ -26,13 +26,13 @@ interface Props {
|
|
|
26
26
|
/**
|
|
27
27
|
* ProgressBar
|
|
28
28
|
*
|
|
29
|
-
*
|
|
29
|
+
* INFRARED — Determinate & indeterminate progress indicator with
|
|
30
30
|
* optional label, value display, size variants, and full ARIA compliance.
|
|
31
31
|
*
|
|
32
32
|
* @example
|
|
33
33
|
* <ProgressBar value={65} label="Upload" />
|
|
34
34
|
* <ProgressBar indeterminate label="Loading..." />
|
|
35
|
-
* <ProgressBar value={30} max={50} showValue color="
|
|
35
|
+
* <ProgressBar value={30} max={50} showValue color="primary" />
|
|
36
36
|
*/
|
|
37
37
|
declare const ProgressBar: import("svelte").Component<Props, {}, "">;
|
|
38
38
|
type ProgressBar = ReturnType<typeof ProgressBar>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProgressBar.svelte.d.ts","sourceRoot":"","sources":["../../../src/feedback/ProgressBar/ProgressBar.svelte.ts"],"names":[],"mappings":"AAMA,KAAK,YAAY,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AACvC,KAAK,aAAa,GAAG,
|
|
1
|
+
{"version":3,"file":"ProgressBar.svelte.d.ts","sourceRoot":"","sources":["../../../src/feedback/ProgressBar/ProgressBar.svelte.ts"],"names":[],"mappings":"AAMA,KAAK,YAAY,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AACvC,KAAK,aAAa,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;AAEpE,UAAU,KAAK;IACd,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qBAAqB;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,sEAAsE;IACtE,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IACrD,sBAAsB;IACtB,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,oBAAoB;IACpB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,4BAA4B;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAsED;;;;;;;;;;GAUG;AACH,QAAA,MAAM,WAAW,2CAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<!--
|
|
2
2
|
@component Skeleton
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
INFRARED — Content placeholder with shimmer animation.
|
|
5
5
|
Supports text lines, circles (avatars), and rectangular shapes.
|
|
6
6
|
Uses aria-busy for screen readers.
|
|
7
7
|
|
|
@@ -112,6 +112,10 @@ const lineWidths = $derived(
|
|
|
112
112
|
|
|
113
113
|
.sx-skeleton-bone {
|
|
114
114
|
background: var(--sx-color-surface-2);
|
|
115
|
+
/* Recessed carved-out placeholder */
|
|
116
|
+
box-shadow:
|
|
117
|
+
inset 0 1px 2px rgba(0, 0, 0, 0.2),
|
|
118
|
+
inset 0 0 0 1px rgba(0, 0, 0, 0.04);
|
|
115
119
|
}
|
|
116
120
|
|
|
117
121
|
.sx-skeleton-shimmer {
|
|
@@ -124,12 +128,16 @@ const lineWidths = $derived(
|
|
|
124
128
|
position: absolute;
|
|
125
129
|
inset: 0;
|
|
126
130
|
background: linear-gradient(
|
|
127
|
-
|
|
131
|
+
100deg,
|
|
128
132
|
transparent 0%,
|
|
129
|
-
|
|
133
|
+
transparent 35%,
|
|
134
|
+
rgba(255, 107, 53, 0.02) 45%,
|
|
135
|
+
rgba(200, 168, 78, 0.04) 50%,
|
|
136
|
+
rgba(255, 107, 53, 0.02) 55%,
|
|
137
|
+
transparent 65%,
|
|
130
138
|
transparent 100%
|
|
131
139
|
);
|
|
132
|
-
animation: sx-skeleton-sweep 1.8s ease-in-out infinite;
|
|
140
|
+
animation: sx-skeleton-sweep 1.8s var(--sx-ease-in-out) infinite;
|
|
133
141
|
}
|
|
134
142
|
|
|
135
143
|
@keyframes sx-skeleton-sweep {
|
|
@@ -21,7 +21,7 @@ interface Props {
|
|
|
21
21
|
/**
|
|
22
22
|
* Skeleton
|
|
23
23
|
*
|
|
24
|
-
*
|
|
24
|
+
* INFRARED — Content placeholder with shimmer animation.
|
|
25
25
|
* Supports text lines, circles (avatars), and rectangular shapes.
|
|
26
26
|
* Uses aria-busy for screen readers.
|
|
27
27
|
*
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
<!--
|
|
2
2
|
@component Spinner
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
INFRARED — Clean loading indicator.
|
|
5
|
+
Vermilion accent, dark surfaces, geometric shapes.
|
|
6
6
|
role="status", aria-label, delay, overlay. prefers-reduced-motion respected.
|
|
7
7
|
|
|
8
8
|
Three styles: ring (default), dots (inline), pulse (radar/broadcast).
|
|
@@ -191,7 +191,7 @@ const config = $derived(sizeConfig[size]);
|
|
|
191
191
|
|
|
192
192
|
/* Variants */
|
|
193
193
|
.sx-spinner-primary {
|
|
194
|
-
color: var(--sx-color-
|
|
194
|
+
color: var(--sx-color-primary);
|
|
195
195
|
}
|
|
196
196
|
|
|
197
197
|
.sx-spinner-secondary {
|
|
@@ -214,6 +214,7 @@ const config = $derived(sizeConfig[size]);
|
|
|
214
214
|
|
|
215
215
|
.sx-spinner-arc {
|
|
216
216
|
transform-origin: center;
|
|
217
|
+
filter: drop-shadow(0 0 3px currentColor);
|
|
217
218
|
}
|
|
218
219
|
|
|
219
220
|
@keyframes sx-spin {
|
|
@@ -284,6 +285,7 @@ const config = $derived(sizeConfig[size]);
|
|
|
284
285
|
height: 28%;
|
|
285
286
|
border-radius: 50%;
|
|
286
287
|
background: currentColor;
|
|
288
|
+
box-shadow: 0 0 8px currentColor;
|
|
287
289
|
animation: sx-pulse-dot 1.5s ease-out infinite;
|
|
288
290
|
}
|
|
289
291
|
|
|
@@ -15,8 +15,8 @@ interface Props {
|
|
|
15
15
|
/**
|
|
16
16
|
* Spinner
|
|
17
17
|
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
18
|
+
* INFRARED — Clean loading indicator.
|
|
19
|
+
* Vermilion accent, dark surfaces, geometric shapes.
|
|
20
20
|
* role="status", aria-label, delay, overlay. prefers-reduced-motion respected.
|
|
21
21
|
*
|
|
22
22
|
* Three styles: ring (default), dots (inline), pulse (radar/broadcast).
|