@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.
Files changed (64) hide show
  1. package/README.md +1 -1
  2. package/dist/dialogs/ContextMenu/ContextMenu.svelte +17 -7
  3. package/dist/dialogs/ContextMenu/ContextMenu.svelte.d.ts +1 -1
  4. package/dist/dialogs/Modal/Modal.svelte +37 -4
  5. package/dist/dialogs/Modal/Modal.svelte.d.ts +1 -1
  6. package/dist/feedback/Alert/Alert.svelte +67 -19
  7. package/dist/feedback/Alert/Alert.svelte.d.ts +1 -1
  8. package/dist/feedback/ProgressBar/ProgressBar.svelte +33 -11
  9. package/dist/feedback/ProgressBar/ProgressBar.svelte.d.ts +3 -3
  10. package/dist/feedback/ProgressBar/ProgressBar.svelte.d.ts.map +1 -1
  11. package/dist/feedback/Skeleton/Skeleton.svelte +12 -4
  12. package/dist/feedback/Skeleton/Skeleton.svelte.d.ts +1 -1
  13. package/dist/feedback/Spinner/Spinner.svelte +5 -3
  14. package/dist/feedback/Spinner/Spinner.svelte.d.ts +2 -2
  15. package/dist/feedback/Toast/Toaster.svelte +45 -13
  16. package/dist/feedback/Toast/Toaster.svelte.d.ts +1 -1
  17. package/dist/forms/Checkbox/Checkbox.svelte +37 -9
  18. package/dist/forms/Checkbox/Checkbox.svelte.d.ts +1 -1
  19. package/dist/forms/Select/Select.svelte +28 -12
  20. package/dist/forms/Select/Select.svelte.d.ts +1 -1
  21. package/dist/forms/Slider/Slider.svelte +66 -38
  22. package/dist/forms/Slider/Slider.svelte.d.ts +2 -2
  23. package/dist/forms/Slider/Slider.svelte.d.ts.map +1 -1
  24. package/dist/forms/TextInput/TextInput.svelte +35 -7
  25. package/dist/forms/TextInput/TextInput.svelte.d.ts +1 -1
  26. package/dist/forms/Textarea/Textarea.svelte +22 -7
  27. package/dist/forms/Textarea/Textarea.svelte.d.ts +1 -1
  28. package/dist/forms/Toggle/Toggle.svelte +71 -12
  29. package/dist/forms/Toggle/Toggle.svelte.d.ts +1 -1
  30. package/dist/layout/Card/Card.svelte +128 -5
  31. package/dist/layout/Card/Card.svelte.d.ts +4 -1
  32. package/dist/layout/Card/Card.svelte.d.ts.map +1 -1
  33. package/dist/layout/Container/Container.svelte +1 -1
  34. package/dist/layout/Container/Container.svelte.d.ts +1 -1
  35. package/dist/layout/ThermalBackground/ThermalBackground.svelte +275 -0
  36. package/dist/layout/ThermalBackground/ThermalBackground.svelte.d.ts +14 -0
  37. package/dist/layout/ThermalBackground/ThermalBackground.svelte.d.ts.map +1 -0
  38. package/dist/layout/ThermalBackground/index.d.ts +2 -0
  39. package/dist/layout/ThermalBackground/index.d.ts.map +1 -0
  40. package/dist/layout/ThermalBackground/index.js +1 -0
  41. package/dist/layout/index.d.ts +1 -0
  42. package/dist/layout/index.d.ts.map +1 -1
  43. package/dist/layout/index.js +1 -0
  44. package/dist/navigation/CommandPalette/CommandPalette.svelte +45 -11
  45. package/dist/navigation/CommandPalette/CommandPalette.svelte.d.ts +1 -1
  46. package/dist/navigation/NavMenu/NavMenu.svelte +800 -0
  47. package/dist/navigation/NavMenu/NavMenu.svelte.d.ts +81 -0
  48. package/dist/navigation/NavMenu/NavMenu.svelte.d.ts.map +1 -0
  49. package/dist/navigation/NavMenu/index.d.ts +3 -0
  50. package/dist/navigation/NavMenu/index.d.ts.map +1 -0
  51. package/dist/navigation/NavMenu/index.js +1 -0
  52. package/dist/navigation/Tabs/Tabs.svelte +73 -11
  53. package/dist/navigation/Tabs/Tabs.svelte.d.ts +1 -1
  54. package/dist/navigation/index.d.ts +2 -0
  55. package/dist/navigation/index.d.ts.map +1 -1
  56. package/dist/navigation/index.js +1 -0
  57. package/dist/primitives/Badge/Badge.svelte +68 -21
  58. package/dist/primitives/Badge/Badge.svelte.d.ts +1 -1
  59. package/dist/primitives/Button/Button.svelte +254 -34
  60. package/dist/primitives/Button/Button.svelte.d.ts +1 -1
  61. package/dist/primitives/Tooltip/Tooltip.svelte +10 -2
  62. package/dist/primitives/Tooltip/Tooltip.svelte.d.ts +1 -1
  63. package/dist/styles/tokens.css +202 -64
  64. package/package.json +3 -3
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @salmexio/ui
2
2
 
3
- Neo-Brutalist Dark component library for Salmex I/O products. Built with Svelte 5 and TypeScript.
3
+ INFRARED component library for Salmex I/O products. Built with Svelte 5 and TypeScript.
4
4
 
5
5
  ## Install
6
6
 
@@ -1,7 +1,7 @@
1
1
  <!--
2
2
  @component ContextMenu
3
3
 
4
- Neo-Brutalist Dark — Right-click context menu with glass panel, keyboard navigation,
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: var(--sx-shadow-lg);
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-cyan-hover);
425
- color: var(--sx-color-cyan);
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-cyan);
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-cyan);
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-cyan);
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
- * Neo-Brutalist Dark — Right-click context menu with glass panel, keyboard navigation,
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
- Neo-Brutalist Dark — Dialog with glass surface, subtle border, clean header.
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: var(--sx-shadow-xl);
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-cyan);
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-cyan);
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
- * Neo-Brutalist Dark — Dialog with glass surface, subtle border, clean header.
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
- Neo-Brutalist Dark — Clean message banner. Left accent border, dark surface.
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
- /* Neo-Brutalist Dark: surface card, left accent border, subtle type tint */
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: 2px solid var(--sx-color-border-strong);
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: none;
254
- box-shadow: 0 0 0 2px var(--sx-color-cyan);
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: none;
291
- box-shadow: 0 0 0 2px var(--sx-color-cyan);
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-gold-subtle);
325
- border-left-color: var(--sx-color-gold);
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-gold);
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-cyan-subtle);
339
- border-left-color: var(--sx-color-cyan);
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-cyan);
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
- * Neo-Brutalist Dark — Clean message banner. Left accent border, dark surface.
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
- Neo-Brutalist Dark — Determinate & indeterminate progress indicator with
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="cyan" />
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 = 'cyan' | 'green' | 'gold' | 'red' | 'purple';
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 = 'cyan',
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-cyan {
191
- background: var(--sx-color-cyan);
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-gold {
199
- background: var(--sx-color-gold);
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-purple {
207
- background: var(--sx-color-purple);
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 = 'cyan' | 'green' | 'gold' | 'red' | 'purple';
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
- * Neo-Brutalist Dark — Determinate & indeterminate progress indicator with
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="cyan" />
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,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;AAElE,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
+ {"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
- Neo-Brutalist Dark — Content placeholder with shimmer animation.
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
- 90deg,
131
+ 100deg,
128
132
  transparent 0%,
129
- var(--sx-color-surface-3) 50%,
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
- * Neo-Brutalist Dark — Content placeholder with shimmer animation.
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
- Neo-Brutalist Dark — Clean loading indicator.
5
- Cyan accent, dark surfaces, geometric shapes.
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-cyan);
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
- * Neo-Brutalist Dark — Clean loading indicator.
19
- * Cyan accent, dark surfaces, geometric shapes.
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).