@salmexio/ui 1.0.0 → 1.1.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 (52) hide show
  1. package/README.md +1 -1
  2. package/dist/dialogs/ContextMenu/ContextMenu.svelte +6 -6
  3. package/dist/dialogs/ContextMenu/ContextMenu.svelte.d.ts +1 -1
  4. package/dist/dialogs/Modal/Modal.svelte +3 -3
  5. package/dist/dialogs/Modal/Modal.svelte.d.ts +1 -1
  6. package/dist/feedback/Alert/Alert.svelte +16 -11
  7. package/dist/feedback/Alert/Alert.svelte.d.ts +1 -1
  8. package/dist/feedback/ProgressBar/ProgressBar.svelte +23 -4
  9. package/dist/feedback/ProgressBar/ProgressBar.svelte.d.ts +1 -1
  10. package/dist/feedback/Skeleton/Skeleton.svelte +7 -3
  11. package/dist/feedback/Skeleton/Skeleton.svelte.d.ts +1 -1
  12. package/dist/feedback/Spinner/Spinner.svelte +3 -3
  13. package/dist/feedback/Spinner/Spinner.svelte.d.ts +2 -2
  14. package/dist/feedback/Toast/Toaster.svelte +10 -10
  15. package/dist/feedback/Toast/Toaster.svelte.d.ts +1 -1
  16. package/dist/forms/Checkbox/Checkbox.svelte +13 -8
  17. package/dist/forms/Checkbox/Checkbox.svelte.d.ts +1 -1
  18. package/dist/forms/Select/Select.svelte +11 -11
  19. package/dist/forms/Select/Select.svelte.d.ts +1 -1
  20. package/dist/forms/Slider/Slider.svelte +27 -27
  21. package/dist/forms/Slider/Slider.svelte.d.ts +1 -1
  22. package/dist/forms/TextInput/TextInput.svelte +16 -6
  23. package/dist/forms/TextInput/TextInput.svelte.d.ts +1 -1
  24. package/dist/forms/Textarea/Textarea.svelte +5 -5
  25. package/dist/forms/Textarea/Textarea.svelte.d.ts +1 -1
  26. package/dist/forms/Toggle/Toggle.svelte +8 -8
  27. package/dist/forms/Toggle/Toggle.svelte.d.ts +1 -1
  28. package/dist/layout/Card/Card.svelte +6 -4
  29. package/dist/layout/Card/Card.svelte.d.ts +1 -1
  30. package/dist/layout/Container/Container.svelte +1 -1
  31. package/dist/layout/Container/Container.svelte.d.ts +1 -1
  32. package/dist/layout/ThermalBackground/ThermalBackground.svelte +313 -0
  33. package/dist/layout/ThermalBackground/ThermalBackground.svelte.d.ts +16 -0
  34. package/dist/layout/ThermalBackground/ThermalBackground.svelte.d.ts.map +1 -0
  35. package/dist/layout/ThermalBackground/index.d.ts +2 -0
  36. package/dist/layout/ThermalBackground/index.d.ts.map +1 -0
  37. package/dist/layout/ThermalBackground/index.js +1 -0
  38. package/dist/layout/index.d.ts +1 -0
  39. package/dist/layout/index.d.ts.map +1 -1
  40. package/dist/layout/index.js +1 -0
  41. package/dist/navigation/CommandPalette/CommandPalette.svelte +8 -8
  42. package/dist/navigation/CommandPalette/CommandPalette.svelte.d.ts +1 -1
  43. package/dist/navigation/Tabs/Tabs.svelte +43 -10
  44. package/dist/navigation/Tabs/Tabs.svelte.d.ts +1 -1
  45. package/dist/primitives/Badge/Badge.svelte +16 -14
  46. package/dist/primitives/Badge/Badge.svelte.d.ts +1 -1
  47. package/dist/primitives/Button/Button.svelte +87 -16
  48. package/dist/primitives/Button/Button.svelte.d.ts +1 -1
  49. package/dist/primitives/Tooltip/Tooltip.svelte +1 -1
  50. package/dist/primitives/Tooltip/Tooltip.svelte.d.ts +1 -1
  51. package/dist/styles/tokens.css +201 -64
  52. 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
@@ -421,8 +421,8 @@ onMount(() => {
421
421
  }
422
422
 
423
423
  .sx-context-item-active {
424
- background: var(--sx-color-cyan-hover);
425
- color: var(--sx-color-cyan);
424
+ background: var(--sx-color-primary-hover);
425
+ color: var(--sx-color-primary);
426
426
  }
427
427
 
428
428
  .sx-context-item-disabled {
@@ -450,7 +450,7 @@ onMount(() => {
450
450
  }
451
451
 
452
452
  .sx-context-item-active .sx-context-icon {
453
- color: var(--sx-color-cyan);
453
+ color: var(--sx-color-primary);
454
454
  }
455
455
 
456
456
  .sx-context-icon-spacer {
@@ -474,7 +474,7 @@ onMount(() => {
474
474
  }
475
475
 
476
476
  .sx-context-item-active .sx-context-shortcut {
477
- color: var(--sx-color-cyan);
477
+ color: var(--sx-color-primary);
478
478
  opacity: 0.7;
479
479
  }
480
480
 
@@ -488,7 +488,7 @@ onMount(() => {
488
488
  }
489
489
 
490
490
  .sx-context-item-active .sx-context-submenu-arrow {
491
- color: var(--sx-color-cyan);
491
+ color: var(--sx-color-primary);
492
492
  }
493
493
 
494
494
  /* ========================================
@@ -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
@@ -331,7 +331,7 @@ const closeLabel = $derived(closeBtnAriaLabel ?? 'Close dialog');
331
331
  }
332
332
 
333
333
  .sx-modal-title-wrap:focus-visible {
334
- outline: 2px solid var(--sx-color-cyan);
334
+ outline: 2px solid var(--sx-color-primary);
335
335
  outline-offset: 2px;
336
336
  }
337
337
 
@@ -376,7 +376,7 @@ const closeLabel = $derived(closeBtnAriaLabel ?? 'Close dialog');
376
376
  }
377
377
 
378
378
  .sx-modal-close:focus-visible {
379
- outline: 2px solid var(--sx-color-cyan);
379
+ outline: 2px solid var(--sx-color-primary);
380
380
  outline-offset: 2px;
381
381
  }
382
382
 
@@ -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,7 +157,7 @@ function toggleExpanded() {
157
157
  </div>
158
158
 
159
159
  <style>
160
- /* Neo-Brutalist Dark: surface card, left accent border, subtle type tint */
160
+ /* INFRARED: surface card, left accent border, subtle type tint */
161
161
  .sx-alert {
162
162
  display: flex;
163
163
  gap: var(--sx-space-3);
@@ -168,6 +168,7 @@ function toggleExpanded() {
168
168
  border-radius: var(--sx-radius-md);
169
169
  font-family: var(--sx-font-body);
170
170
  transition: box-shadow var(--sx-transition-fast);
171
+ animation: sx-alert-in var(--sx-duration-base) var(--sx-ease-out) both;
171
172
  }
172
173
 
173
174
  .sx-alert-standard {
@@ -251,7 +252,7 @@ function toggleExpanded() {
251
252
 
252
253
  .sx-alert-title-btn:focus-visible {
253
254
  outline: none;
254
- box-shadow: 0 0 0 2px var(--sx-color-cyan);
255
+ box-shadow: 0 0 0 2px var(--sx-color-primary);
255
256
  }
256
257
 
257
258
  .sx-alert-expand-icon {
@@ -288,7 +289,7 @@ function toggleExpanded() {
288
289
 
289
290
  .sx-alert-dismiss:focus-visible {
290
291
  outline: none;
291
- box-shadow: 0 0 0 2px var(--sx-color-cyan);
292
+ box-shadow: 0 0 0 2px var(--sx-color-primary);
292
293
  }
293
294
 
294
295
  /* Type: success */
@@ -321,12 +322,12 @@ function toggleExpanded() {
321
322
 
322
323
  /* Type: warning */
323
324
  .sx-alert-warning {
324
- background: var(--sx-color-gold-subtle);
325
- border-left-color: var(--sx-color-gold);
325
+ background: var(--sx-color-brass-subtle);
326
+ border-left-color: var(--sx-color-secondary);
326
327
  }
327
328
 
328
329
  .sx-alert-warning .sx-alert-icon {
329
- color: var(--sx-color-gold);
330
+ color: var(--sx-color-secondary);
330
331
  }
331
332
 
332
333
  .sx-alert-warning .sx-alert-title {
@@ -335,12 +336,12 @@ function toggleExpanded() {
335
336
 
336
337
  /* Type: info */
337
338
  .sx-alert-info {
338
- background: var(--sx-color-cyan-subtle);
339
- border-left-color: var(--sx-color-cyan);
339
+ background: var(--sx-color-primary-subtle);
340
+ border-left-color: var(--sx-color-primary);
340
341
  }
341
342
 
342
343
  .sx-alert-info .sx-alert-icon {
343
- color: var(--sx-color-cyan);
344
+ color: var(--sx-color-primary);
344
345
  }
345
346
 
346
347
  .sx-alert-info .sx-alert-title {
@@ -362,7 +363,11 @@ function toggleExpanded() {
362
363
  }
363
364
 
364
365
  @media (prefers-reduced-motion: reduce) {
365
- .sx-alert,
366
+ .sx-alert {
367
+ transition: none;
368
+ animation: none;
369
+ }
370
+
366
371
  .sx-alert-dismiss,
367
372
  .sx-alert-title-btn {
368
373
  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,7 +1,7 @@
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
@@ -184,27 +184,46 @@ const labelId = $derived(label ? `${stableId}-label` : undefined);
184
184
  height: 100%;
185
185
  border-radius: var(--sx-radius-full);
186
186
  transition: width 0.3s var(--sx-ease-out);
187
+ position: relative;
188
+ }
189
+
190
+ /* Leading-edge glow — subtle light at the tip of the bar */
191
+ .sx-progress-fill::after {
192
+ content: '';
193
+ position: absolute;
194
+ right: 0;
195
+ top: 0;
196
+ bottom: 0;
197
+ width: 24px;
198
+ border-radius: inherit;
199
+ background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2));
200
+ opacity: 0.6;
187
201
  }
188
202
 
189
203
  /* Colors */
190
204
  .sx-progress-color-cyan {
191
- background: var(--sx-color-cyan);
205
+ background: var(--sx-color-primary);
206
+ box-shadow: 0 0 8px rgba(255, 107, 53, 0.2);
192
207
  }
193
208
 
194
209
  .sx-progress-color-green {
195
210
  background: var(--sx-color-green);
211
+ box-shadow: 0 0 8px rgba(74, 222, 128, 0.2);
196
212
  }
197
213
 
198
214
  .sx-progress-color-gold {
199
- background: var(--sx-color-gold);
215
+ background: var(--sx-color-secondary);
216
+ box-shadow: 0 0 8px rgba(200, 168, 78, 0.2);
200
217
  }
201
218
 
202
219
  .sx-progress-color-red {
203
220
  background: var(--sx-color-red);
221
+ box-shadow: 0 0 8px rgba(220, 38, 38, 0.2);
204
222
  }
205
223
 
206
224
  .sx-progress-color-purple {
207
- background: var(--sx-color-purple);
225
+ background: var(--sx-color-teal);
226
+ box-shadow: 0 0 8px rgba(61, 139, 139, 0.2);
208
227
  }
209
228
 
210
229
  /* Indeterminate */
@@ -26,7 +26,7 @@ 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
@@ -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
 
@@ -124,12 +124,16 @@ const lineWidths = $derived(
124
124
  position: absolute;
125
125
  inset: 0;
126
126
  background: linear-gradient(
127
- 90deg,
127
+ 100deg,
128
128
  transparent 0%,
129
+ transparent 35%,
130
+ rgba(255, 255, 255, 0.04) 45%,
129
131
  var(--sx-color-surface-3) 50%,
132
+ rgba(255, 255, 255, 0.04) 55%,
133
+ transparent 65%,
130
134
  transparent 100%
131
135
  );
132
- animation: sx-skeleton-sweep 1.8s ease-in-out infinite;
136
+ animation: sx-skeleton-sweep 1.8s var(--sx-ease-in-out) infinite;
133
137
  }
134
138
 
135
139
  @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 {
@@ -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).
@@ -1,7 +1,7 @@
1
1
  <!--
2
2
  @component Toaster
3
3
 
4
- Neo-Brutalist Dark — Toast notification container.
4
+ INFRARED — Toast notification container.
5
5
  Renders stacked toast notifications with slide-in/out animations,
6
6
  auto-dismiss with pause-on-hover, keyboard dismiss, and ARIA live region.
7
7
 
@@ -231,7 +231,7 @@ onMount(() => {
231
231
  }
232
232
 
233
233
  .sx-toast:focus-visible {
234
- outline: 2px solid var(--sx-color-cyan);
234
+ outline: 2px solid var(--sx-color-primary);
235
235
  outline-offset: 2px;
236
236
  }
237
237
 
@@ -249,11 +249,11 @@ onMount(() => {
249
249
  }
250
250
 
251
251
  .sx-toast-warning {
252
- border-left-color: var(--sx-color-gold);
252
+ border-left-color: var(--sx-color-secondary);
253
253
  }
254
254
 
255
255
  .sx-toast-info {
256
- border-left-color: var(--sx-color-cyan);
256
+ border-left-color: var(--sx-color-primary);
257
257
  }
258
258
 
259
259
  /* Icon */
@@ -273,11 +273,11 @@ onMount(() => {
273
273
  }
274
274
 
275
275
  .sx-toast-warning .sx-toast-icon {
276
- color: var(--sx-color-gold);
276
+ color: var(--sx-color-secondary);
277
277
  }
278
278
 
279
279
  .sx-toast-info .sx-toast-icon {
280
- color: var(--sx-color-cyan);
280
+ color: var(--sx-color-primary);
281
281
  }
282
282
 
283
283
  /* Content */
@@ -317,7 +317,7 @@ onMount(() => {
317
317
  font-family: var(--sx-font-body);
318
318
  font-size: var(--sx-text-xs);
319
319
  font-weight: 600;
320
- color: var(--sx-color-cyan);
320
+ color: var(--sx-color-primary);
321
321
  cursor: pointer;
322
322
  padding: var(--sx-space-1) var(--sx-space-2);
323
323
  border-radius: var(--sx-radius-sm);
@@ -325,11 +325,11 @@ onMount(() => {
325
325
  }
326
326
 
327
327
  .sx-toast-action-btn:hover {
328
- background: var(--sx-color-cyan-subtle);
328
+ background: var(--sx-color-primary-subtle);
329
329
  }
330
330
 
331
331
  .sx-toast-action-btn:focus-visible {
332
- outline: 2px solid var(--sx-color-cyan);
332
+ outline: 2px solid var(--sx-color-primary);
333
333
  outline-offset: 1px;
334
334
  }
335
335
 
@@ -353,7 +353,7 @@ onMount(() => {
353
353
  }
354
354
 
355
355
  .sx-toast-close:focus-visible {
356
- outline: 2px solid var(--sx-color-cyan);
356
+ outline: 2px solid var(--sx-color-primary);
357
357
  outline-offset: 1px;
358
358
  }
359
359
 
@@ -8,7 +8,7 @@ interface Props {
8
8
  /**
9
9
  * Toaster
10
10
  *
11
- * Neo-Brutalist Dark — Toast notification container.
11
+ * INFRARED — Toast notification container.
12
12
  * Renders stacked toast notifications with slide-in/out animations,
13
13
  * auto-dismiss with pause-on-hover, keyboard dismiss, and ARIA live region.
14
14
  *
@@ -1,7 +1,7 @@
1
1
  <!--
2
2
  @component Checkbox
3
3
 
4
- Neo-Brutalist Dark — Clean checkbox with cyan accent fill and white checkmark.
4
+ INFRARED — Clean checkbox with vermilion accent fill and white checkmark.
5
5
  Uses native <input type="checkbox"> per WAI-ARIA APG (best practice: native over custom role="checkbox").
6
6
  Label, description, error, indeterminate. Full a11y; focus and semantics follow the native input.
7
7
  -->
@@ -209,22 +209,23 @@ function handleChange(e: Event) {
209
209
  width: 100%;
210
210
  height: 100%;
211
211
  padding: 2px;
212
+ animation: sx-check-in var(--sx-duration-fast) var(--sx-ease-out) both;
212
213
  }
213
214
 
214
215
  .sx-checkbox-icon-minus {
215
216
  padding: 3px 4px;
216
217
  }
217
218
 
218
- /* Checked -- cyan fill, white checkmark */
219
+ /* Checked -- vermilion fill, white checkmark */
219
220
  .sx-checkbox-box-checked {
220
- background: var(--sx-color-cyan);
221
- border-color: var(--sx-color-cyan);
221
+ background: var(--sx-color-primary);
222
+ border-color: var(--sx-color-primary);
222
223
  }
223
224
 
224
225
  /* Indeterminate -- same as checked */
225
226
  .sx-checkbox-box-indeterminate {
226
- background: var(--sx-color-cyan);
227
- border-color: var(--sx-color-cyan);
227
+ background: var(--sx-color-primary);
228
+ border-color: var(--sx-color-primary);
228
229
  }
229
230
 
230
231
  /* Hover -- border brightens on unchecked box */
@@ -232,9 +233,9 @@ function handleChange(e: Event) {
232
233
  border-color: var(--sx-color-border-hover);
233
234
  }
234
235
 
235
- /* Focus -- cyan outline */
236
+ /* Focus -- primary outline */
236
237
  .sx-checkbox-input:focus-visible + .sx-checkbox-box {
237
- outline: 2px solid var(--sx-color-cyan);
238
+ outline: 2px solid var(--sx-color-primary);
238
239
  outline-offset: 2px;
239
240
  }
240
241
 
@@ -303,5 +304,9 @@ function handleChange(e: Event) {
303
304
  .sx-checkbox-box {
304
305
  transition: none;
305
306
  }
307
+
308
+ .sx-checkbox-icon {
309
+ animation: none;
310
+ }
306
311
  }
307
312
  </style>
@@ -20,7 +20,7 @@ interface Props {
20
20
  /**
21
21
  * Checkbox
22
22
  *
23
- * Neo-Brutalist Dark — Clean checkbox with cyan accent fill and white checkmark.
23
+ * INFRARED — Clean checkbox with vermilion accent fill and white checkmark.
24
24
  * Uses native <input type="checkbox"> per WAI-ARIA APG (best practice: native over custom role="checkbox").
25
25
  * Label, description, error, indeterminate. Full a11y; focus and semantics follow the native input.
26
26
  */
@@ -1,7 +1,7 @@
1
1
  <!--
2
2
  @component Select
3
3
 
4
- Neo-Brutalist Dark — Dropdown select with clean trigger field, glass-blur panel,
4
+ INFRARED — Dropdown select with clean trigger field, glass-blur panel,
5
5
  keyboard-first navigation, type-ahead search, option groups, and multi-select.
6
6
 
7
7
  Follows WAI-ARIA APG Select-Only Combobox pattern: DOM focus stays on
@@ -646,13 +646,13 @@ onMount(() => {
646
646
 
647
647
  .sx-select-trigger:focus-visible {
648
648
  outline: none;
649
- border-color: var(--sx-color-cyan);
650
- box-shadow: 0 0 0 3px var(--sx-color-cyan-ring);
649
+ border-color: var(--sx-color-primary);
650
+ box-shadow: 0 0 0 3px var(--sx-color-primary-ring);
651
651
  }
652
652
 
653
653
  .sx-select-trigger-open {
654
- border-color: var(--sx-color-cyan);
655
- box-shadow: 0 0 0 3px var(--sx-color-cyan-ring);
654
+ border-color: var(--sx-color-primary);
655
+ box-shadow: 0 0 0 3px var(--sx-color-primary-ring);
656
656
  }
657
657
 
658
658
  .sx-select-trigger-error {
@@ -747,12 +747,12 @@ onMount(() => {
747
747
  }
748
748
 
749
749
  .sx-select-option-active {
750
- background: var(--sx-color-cyan-hover);
751
- color: var(--sx-color-cyan);
750
+ background: var(--sx-color-primary-hover);
751
+ color: var(--sx-color-primary);
752
752
  }
753
753
 
754
754
  .sx-select-option-selected:not(.sx-select-option-active) {
755
- background: var(--sx-color-cyan-subtle);
755
+ background: var(--sx-color-primary-subtle);
756
756
  }
757
757
 
758
758
  .sx-select-option-disabled {
@@ -772,11 +772,11 @@ onMount(() => {
772
772
  flex-shrink: 0;
773
773
  display: flex;
774
774
  align-items: center;
775
- color: var(--sx-color-cyan);
775
+ color: var(--sx-color-primary);
776
776
  }
777
777
 
778
778
  .sx-select-option-active .sx-select-checkmark {
779
- color: var(--sx-color-cyan);
779
+ color: var(--sx-color-primary);
780
780
  }
781
781
 
782
782
  /* Checkbox square for multi select */
@@ -793,7 +793,7 @@ onMount(() => {
793
793
  }
794
794
 
795
795
  .sx-select-option-active .sx-select-check {
796
- border-color: var(--sx-color-cyan);
796
+ border-color: var(--sx-color-primary);
797
797
  }
798
798
 
799
799
  /* ========================================
@@ -47,7 +47,7 @@ interface Props {
47
47
  /**
48
48
  * Select
49
49
  *
50
- * Neo-Brutalist Dark — Dropdown select with clean trigger field, glass-blur panel,
50
+ * INFRARED — Dropdown select with clean trigger field, glass-blur panel,
51
51
  * keyboard-first navigation, type-ahead search, option groups, and multi-select.
52
52
  *
53
53
  * Follows WAI-ARIA APG Select-Only Combobox pattern: DOM focus stays on