@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
@@ -0,0 +1,81 @@
1
+ import type { Snippet } from 'svelte';
2
+ export interface NavMenuItem {
3
+ type: 'item';
4
+ /** Unique identifier for active state matching */
5
+ id: string;
6
+ /** Display label */
7
+ label: string;
8
+ /** Link target (renders <a>); omit for button behavior */
9
+ href?: string;
10
+ /** Icon snippet */
11
+ icon?: Snippet;
12
+ /** Badge text (e.g. "New", count) */
13
+ badge?: string | number;
14
+ /** Disabled state */
15
+ disabled?: boolean;
16
+ /** Nested sub-items */
17
+ children?: NavMenuItem[];
18
+ }
19
+ export interface NavMenuGroup {
20
+ type: 'group';
21
+ /** Group heading label */
22
+ label: string;
23
+ /** Whether the group starts collapsed */
24
+ defaultCollapsed?: boolean;
25
+ /** Items in this group */
26
+ items: NavMenuEntry[];
27
+ }
28
+ export interface NavMenuSeparator {
29
+ type: 'separator';
30
+ }
31
+ export type NavMenuEntry = NavMenuItem | NavMenuGroup | NavMenuSeparator;
32
+ interface Props {
33
+ /** Menu entries: items, groups, and separators */
34
+ items: NavMenuEntry[];
35
+ /** ID of the currently active item */
36
+ activeId?: string;
37
+ /** Fired when an item is activated (click or Enter) */
38
+ onselect?: (id: string, href?: string) => void;
39
+ /** Whether groups can be collapsed (default true) */
40
+ collapsible?: boolean;
41
+ /** Additional CSS class */
42
+ class?: string;
43
+ /** Accessible label for the nav element */
44
+ label?: string;
45
+ /** Test ID */
46
+ testId?: string;
47
+ }
48
+ /**
49
+ * NavMenu
50
+ *
51
+ * INFRARED — Persistent navigation menu with collapsible groups, sub-items,
52
+ * icons, badges, and keyboard navigation. Built for sidebars, settings panels,
53
+ * and any vertical nav structure.
54
+ *
55
+ * @example
56
+ * <NavMenu
57
+ * items={[
58
+ * {
59
+ * type: 'group',
60
+ * label: 'Getting Started',
61
+ * items: [
62
+ * { type: 'item', id: 'intro', label: 'Introduction', href: '/' },
63
+ * { type: 'item', id: 'install', label: 'Installation', href: '/install', badge: 'New' },
64
+ * ]
65
+ * },
66
+ * { type: 'separator' },
67
+ * {
68
+ * type: 'item',
69
+ * id: 'settings',
70
+ * label: 'Settings',
71
+ * href: '/settings',
72
+ * icon: settingsIcon,
73
+ * }
74
+ * ]}
75
+ * activeId="intro"
76
+ * />
77
+ */
78
+ declare const NavMenu: import("svelte").Component<Props, {}, "">;
79
+ type NavMenu = ReturnType<typeof NavMenu>;
80
+ export default NavMenu;
81
+ //# sourceMappingURL=NavMenu.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NavMenu.svelte.d.ts","sourceRoot":"","sources":["../../../src/navigation/NavMenu/NavMenu.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEtC,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,EAAE,EAAE,MAAM,CAAC;IACX,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,0DAA0D;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mBAAmB;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uBAAuB;IACvB,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,0BAA0B;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,0BAA0B;IAC1B,KAAK,EAAE,YAAY,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,WAAW,CAAC;CAClB;AAED,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,YAAY,GAAG,gBAAgB,CAAC;AAOzE,UAAU,KAAK;IACd,kDAAkD;IAClD,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,qDAAqD;IACrD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AA2TD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,QAAA,MAAM,OAAO,2CAAwC,CAAC;AACtD,KAAK,OAAO,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC;AAC1C,eAAe,OAAO,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { default as NavMenu } from './NavMenu.svelte';
2
+ export type { NavMenuItem, NavMenuGroup, NavMenuSeparator, NavMenuEntry } from './NavMenu.svelte';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/navigation/NavMenu/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACtD,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1 @@
1
+ export { default as NavMenu } from './NavMenu.svelte';
@@ -1,7 +1,7 @@
1
1
  <!--
2
2
  @component Tabs
3
3
 
4
- Neo-Brutalist Dark tabbed interface with underline indicator.
4
+ INFRARED tabbed interface with underline indicator.
5
5
  Clean structure, dark surfaces, world-class accessibility.
6
6
 
7
7
  @example
@@ -198,7 +198,7 @@ function handleKeydown(event: KeyboardEvent, currentIndex: number) {
198
198
  }
199
199
 
200
200
  /* ========================================
201
- TABLIST — Flat underline style
201
+ TABLIST — Recessed rail with depth
202
202
  ======================================== */
203
203
  .sx-tabs-list {
204
204
  display: flex;
@@ -211,6 +211,7 @@ function handleKeydown(event: KeyboardEvent, currentIndex: number) {
211
211
  position: relative;
212
212
  background: var(--sx-color-surface);
213
213
  border-bottom: 1px solid var(--sx-color-border);
214
+ box-shadow: inset 0 -2px 4px -2px rgba(0, 0, 0, 0.2);
214
215
  }
215
216
 
216
217
  .sx-tabs-list-sm {
@@ -266,23 +267,75 @@ function handleKeydown(event: KeyboardEvent, currentIndex: number) {
266
267
 
267
268
  .sx-tab:hover:not(.sx-tab-disabled):not(.sx-tab-selected) {
268
269
  color: var(--sx-color-text);
269
- background: var(--sx-color-cyan-subtle);
270
+ background: var(--sx-color-primary-subtle);
270
271
  }
271
272
 
272
273
  .sx-tab:active:not(.sx-tab-disabled):not(.sx-tab-selected) {
273
- background: var(--sx-color-cyan-hover);
274
+ background: var(--sx-color-primary-hover);
274
275
  }
275
276
 
276
- /* Selected tab — underline indicator */
277
+ /* Selected tab — elevated with subtle depth */
277
278
  .sx-tab-selected {
278
279
  color: var(--sx-color-text);
279
280
  font-weight: 600;
280
- border-bottom-color: var(--sx-color-cyan);
281
+ border-bottom-color: transparent;
281
282
  }
282
283
 
283
- /* Focuscyan ring */
284
+ /* Forge-gradient indicator rail multi-color strip with glow bleed */
285
+ .sx-tab::after {
286
+ content: '';
287
+ position: absolute;
288
+ bottom: -1px;
289
+ left: var(--sx-space-4);
290
+ right: var(--sx-space-4);
291
+ height: 3px;
292
+ background:
293
+ linear-gradient(
294
+ 90deg,
295
+ #FF6B35,
296
+ #C8A84E 50%,
297
+ #3D8B8B
298
+ );
299
+ background-size: 200% 100%;
300
+ border-radius: 3px 3px 0 0;
301
+ transform: scaleX(0);
302
+ transform-origin: center;
303
+ transition:
304
+ transform var(--sx-duration-base) var(--sx-ease-out),
305
+ box-shadow var(--sx-duration-base) var(--sx-ease-out);
306
+ box-shadow: none;
307
+ }
308
+
309
+ .sx-tab-sm::after {
310
+ left: var(--sx-space-3);
311
+ right: var(--sx-space-3);
312
+ height: 2px;
313
+ }
314
+
315
+ .sx-tab-lg::after {
316
+ left: var(--sx-space-5);
317
+ right: var(--sx-space-5);
318
+ height: 3px;
319
+ }
320
+
321
+ .sx-tab-selected::after {
322
+ transform: scaleX(1);
323
+ animation: sx-tab-forge 6s ease-in-out infinite;
324
+
325
+ /* Glow bleed underneath the indicator */
326
+ box-shadow:
327
+ 0 0 8px -1px rgba(255, 107, 53, 0.4),
328
+ 0 0 16px -4px rgba(200, 168, 78, 0.2);
329
+ }
330
+
331
+ @keyframes sx-tab-forge {
332
+ 0%, 100% { background-position: 0% 50%; }
333
+ 50% { background-position: 100% 50%; }
334
+ }
335
+
336
+ /* Focus — primary ring */
284
337
  .sx-tab:focus-visible {
285
- outline: 2px solid var(--sx-color-cyan);
338
+ outline: 2px solid var(--sx-color-primary);
286
339
  outline-offset: -2px;
287
340
  border-radius: var(--sx-radius-sm);
288
341
  }
@@ -313,16 +366,16 @@ function handleKeydown(event: KeyboardEvent, currentIndex: number) {
313
366
  min-width: 18px;
314
367
  height: 18px;
315
368
  padding: 0 var(--sx-space-1-5);
316
- background: var(--sx-color-cyan-active);
369
+ background: var(--sx-color-primary-active);
317
370
  border: none;
318
371
  font-size: var(--sx-text-xs);
319
372
  font-weight: 600;
320
- color: var(--sx-color-cyan);
373
+ color: var(--sx-color-primary);
321
374
  border-radius: var(--sx-radius-full);
322
375
  }
323
376
 
324
377
  .sx-tab-selected .sx-tab-badge {
325
- background: rgba(0, 212, 255, 0.18);
378
+ background: rgba(255, 107, 53, 0.18);
326
379
  }
327
380
 
328
381
  /* ========================================
@@ -371,5 +424,14 @@ function handleKeydown(event: KeyboardEvent, currentIndex: number) {
371
424
  .sx-tab {
372
425
  transition: none;
373
426
  }
427
+
428
+ .sx-tab::after {
429
+ transition: none;
430
+ }
431
+
432
+ .sx-tab-selected::after {
433
+ animation: none;
434
+ background: linear-gradient(90deg, #FF6B35, #C8A84E);
435
+ }
374
436
  }
375
437
  </style>
@@ -41,7 +41,7 @@ interface Props {
41
41
  /**
42
42
  * Tabs
43
43
  *
44
- * Neo-Brutalist Dark tabbed interface with underline indicator.
44
+ * INFRARED tabbed interface with underline indicator.
45
45
  * Clean structure, dark surfaces, world-class accessibility.
46
46
  *
47
47
  * @example
@@ -2,4 +2,6 @@ export { Tabs } from './Tabs/index.js';
2
2
  export type { TabOption } from './Tabs/index.js';
3
3
  export { CommandPalette } from './CommandPalette/index.js';
4
4
  export type { CommandItem, CommandGroup } from './CommandPalette/index.js';
5
+ export { NavMenu } from './NavMenu/index.js';
6
+ export type { NavMenuItem, NavMenuGroup, NavMenuSeparator, NavMenuEntry } from './NavMenu/index.js';
5
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/navigation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/navigation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
@@ -1,2 +1,3 @@
1
1
  export { Tabs } from './Tabs/index.js';
2
2
  export { CommandPalette } from './CommandPalette/index.js';
3
+ export { NavMenu } from './NavMenu/index.js';
@@ -1,7 +1,7 @@
1
1
  <!--
2
2
  @component Badge
3
3
 
4
- Neo-Brutalist Dark — Status badge for labels, counts, and states.
4
+ INFRARED — Status badge for labels, counts, and states.
5
5
  Pill-shaped, translucent backgrounds, role="status" for screen readers.
6
6
 
7
7
  @example
@@ -79,17 +79,21 @@ let {
79
79
  {/if}
80
80
 
81
81
  <style>
82
- /* Base */
82
+ /* Base — stamped metal tag with thin extrusion */
83
83
  .sx-badge {
84
84
  display: inline-flex;
85
85
  align-items: center;
86
86
  gap: var(--sx-space-1);
87
87
  font-family: var(--sx-font-body);
88
- font-weight: 500;
88
+ font-weight: 600;
89
+ letter-spacing: 0.02em;
89
90
  white-space: nowrap;
90
91
  transition: box-shadow var(--sx-transition-fast);
91
92
  border: 1px solid transparent;
92
- box-shadow: none;
93
+ box-shadow:
94
+ 0 1px 0 0 rgba(0, 0, 0, 0.2),
95
+ 0 2px 4px -1px rgba(0, 0, 0, 0.2);
96
+ animation: sx-badge-pop 200ms var(--sx-ease-spring) both;
93
97
  }
94
98
 
95
99
  /* Pill shape for all non-dot badges */
@@ -153,90 +157,133 @@ let {
153
157
  }
154
158
 
155
159
  /* ========================================
156
- STATUS VARIANTS - Neo-Brutalist Dark
160
+ STATUS VARIANTS - INFRARED
157
161
  ======================================== */
158
162
 
159
- /* Neutral */
163
+ /* Neutral — metal surface */
160
164
  .sx-badge-neutral {
161
165
  background: var(--sx-color-surface-2);
162
166
  color: var(--sx-color-text-secondary);
167
+ border-color: rgba(255, 255, 255, 0.04);
168
+ border-bottom-color: rgba(0, 0, 0, 0.15);
163
169
  }
164
170
 
165
171
  .sx-badge-dot.sx-badge-neutral {
166
172
  background: var(--sx-color-text-secondary);
167
173
  border: none;
174
+ box-shadow: 0 0 4px -1px rgba(160, 160, 180, 0.3);
168
175
  }
169
176
 
170
- /* Primary — cyan */
177
+ /* Primary — vermilion stamped tag */
171
178
  .sx-badge-primary {
172
- background: var(--sx-color-cyan-active);
173
- color: var(--sx-color-cyan);
179
+ background: var(--sx-color-primary-active);
180
+ color: var(--sx-color-primary);
181
+ border-color: rgba(255, 107, 53, 0.1);
182
+ border-bottom-color: rgba(160, 50, 10, 0.2);
183
+ box-shadow:
184
+ 0 1px 0 0 rgba(160, 50, 10, 0.25),
185
+ 0 2px 4px -1px rgba(0, 0, 0, 0.2),
186
+ 0 0 6px -2px rgba(255, 107, 53, 0.15);
174
187
  }
175
188
 
176
189
  .sx-badge-dot.sx-badge-primary {
177
- background: var(--sx-color-cyan);
190
+ background: var(--sx-color-primary);
178
191
  border: none;
192
+ box-shadow: 0 0 6px -1px rgba(255, 107, 53, 0.4);
179
193
  }
180
194
 
181
- /* Success — green */
195
+ /* Success — green stamped tag */
182
196
  .sx-badge-success {
183
197
  background: var(--sx-color-green-subtle);
184
198
  color: var(--sx-color-green);
199
+ border-color: rgba(34, 197, 94, 0.08);
200
+ border-bottom-color: rgba(20, 100, 50, 0.2);
201
+ box-shadow:
202
+ 0 1px 0 0 rgba(20, 100, 50, 0.25),
203
+ 0 2px 4px -1px rgba(0, 0, 0, 0.2),
204
+ 0 0 6px -2px rgba(34, 197, 94, 0.12);
185
205
  }
186
206
 
187
207
  .sx-badge-dot.sx-badge-success {
188
208
  background: var(--sx-color-green);
189
209
  border: none;
210
+ box-shadow: 0 0 6px -1px rgba(34, 197, 94, 0.4);
190
211
  }
191
212
 
192
- /* Warning — gold */
213
+ /* Warning — brass stamped tag */
193
214
  .sx-badge-warning {
194
- background: var(--sx-color-gold-subtle);
195
- color: var(--sx-color-gold);
215
+ background: var(--sx-color-brass-subtle);
216
+ color: var(--sx-color-secondary);
217
+ border-color: rgba(200, 168, 78, 0.08);
218
+ border-bottom-color: rgba(130, 108, 50, 0.2);
219
+ box-shadow:
220
+ 0 1px 0 0 rgba(130, 108, 50, 0.25),
221
+ 0 2px 4px -1px rgba(0, 0, 0, 0.2),
222
+ 0 0 6px -2px rgba(200, 168, 78, 0.12);
196
223
  }
197
224
 
198
225
  .sx-badge-dot.sx-badge-warning {
199
- background: var(--sx-color-gold);
226
+ background: var(--sx-color-secondary);
200
227
  border: none;
228
+ box-shadow: 0 0 6px -1px rgba(200, 168, 78, 0.4);
201
229
  }
202
230
 
203
- /* Error — red */
231
+ /* Error — crimson stamped tag */
204
232
  .sx-badge-error {
205
233
  background: var(--sx-color-red-hover);
206
234
  color: var(--sx-color-red);
235
+ border-color: rgba(220, 38, 38, 0.08);
236
+ border-bottom-color: rgba(140, 20, 20, 0.2);
237
+ box-shadow:
238
+ 0 1px 0 0 rgba(140, 20, 20, 0.25),
239
+ 0 2px 4px -1px rgba(0, 0, 0, 0.2),
240
+ 0 0 6px -2px rgba(220, 38, 38, 0.12);
207
241
  }
208
242
 
209
243
  .sx-badge-dot.sx-badge-error {
210
244
  background: var(--sx-color-red);
211
245
  border: none;
246
+ box-shadow: 0 0 6px -1px rgba(220, 38, 38, 0.4);
212
247
  }
213
248
 
214
- /* Info — purple */
249
+ /* Info — teal stamped tag */
215
250
  .sx-badge-info {
216
- background: var(--sx-color-purple-subtle);
217
- color: var(--sx-color-purple);
251
+ background: var(--sx-color-teal-subtle);
252
+ color: var(--sx-color-teal);
253
+ border-color: rgba(61, 139, 139, 0.08);
254
+ border-bottom-color: rgba(30, 80, 80, 0.2);
255
+ box-shadow:
256
+ 0 1px 0 0 rgba(30, 80, 80, 0.25),
257
+ 0 2px 4px -1px rgba(0, 0, 0, 0.2),
258
+ 0 0 6px -2px rgba(61, 139, 139, 0.12);
218
259
  }
219
260
 
220
261
  .sx-badge-dot.sx-badge-info {
221
- background: var(--sx-color-purple);
262
+ background: var(--sx-color-teal);
222
263
  border: none;
264
+ box-shadow: 0 0 6px -1px rgba(61, 139, 139, 0.4);
223
265
  }
224
266
 
225
- /* Outline — transparent with border */
267
+ /* Outline — recessed stamp, no fill */
226
268
  .sx-badge-outline {
227
269
  background: transparent;
228
270
  color: var(--sx-color-text-secondary);
229
271
  border: 1px solid var(--sx-color-border-strong);
272
+ box-shadow:
273
+ inset 0 1px 2px rgba(0, 0, 0, 0.15),
274
+ 0 1px 0 0 rgba(255, 255, 255, 0.03);
230
275
  }
231
276
 
232
277
  .sx-badge-dot.sx-badge-outline {
233
278
  background: var(--sx-color-border-strong);
234
279
  border: none;
280
+ box-shadow: none;
235
281
  }
236
282
 
237
283
  @media (prefers-reduced-motion: reduce) {
238
284
  .sx-badge {
239
285
  transition: none;
286
+ animation: none;
240
287
  }
241
288
  }
242
289
  </style>
@@ -20,7 +20,7 @@ interface Props {
20
20
  /**
21
21
  * Badge
22
22
  *
23
- * Neo-Brutalist Dark — Status badge for labels, counts, and states.
23
+ * INFRARED — Status badge for labels, counts, and states.
24
24
  * Pill-shaped, translucent backgrounds, role="status" for screen readers.
25
25
  *
26
26
  * @example