@salmexio/ui 0.4.0 → 1.0.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 (110) hide show
  1. package/README.md +52 -3
  2. package/dist/dialogs/ContextMenu/ContextMenu.svelte +97 -94
  3. package/dist/dialogs/ContextMenu/ContextMenu.svelte.d.ts +3 -2
  4. package/dist/dialogs/ContextMenu/ContextMenu.svelte.d.ts.map +1 -1
  5. package/dist/dialogs/Modal/Modal.svelte +112 -116
  6. package/dist/dialogs/Modal/Modal.svelte.d.ts +1 -1
  7. package/dist/feedback/Alert/Alert.svelte +115 -221
  8. package/dist/feedback/Alert/Alert.svelte.d.ts +1 -1
  9. package/dist/feedback/ProgressBar/ProgressBar.svelte +246 -0
  10. package/dist/feedback/ProgressBar/ProgressBar.svelte.d.ts +40 -0
  11. package/dist/feedback/ProgressBar/ProgressBar.svelte.d.ts.map +1 -0
  12. package/dist/feedback/ProgressBar/index.d.ts +2 -0
  13. package/dist/feedback/ProgressBar/index.d.ts.map +1 -0
  14. package/dist/feedback/ProgressBar/index.js +1 -0
  15. package/dist/feedback/Skeleton/Skeleton.svelte +153 -0
  16. package/dist/feedback/Skeleton/Skeleton.svelte.d.ts +37 -0
  17. package/dist/feedback/Skeleton/Skeleton.svelte.d.ts.map +1 -0
  18. package/dist/feedback/Skeleton/index.d.ts +2 -0
  19. package/dist/feedback/Skeleton/index.d.ts.map +1 -0
  20. package/dist/feedback/Skeleton/index.js +1 -0
  21. package/dist/feedback/Spinner/Spinner.svelte +86 -151
  22. package/dist/feedback/Spinner/Spinner.svelte.d.ts +5 -3
  23. package/dist/feedback/Spinner/Spinner.svelte.d.ts.map +1 -1
  24. package/dist/feedback/Toast/Toaster.svelte +431 -0
  25. package/dist/feedback/Toast/Toaster.svelte.d.ts +22 -0
  26. package/dist/feedback/Toast/Toaster.svelte.d.ts.map +1 -0
  27. package/dist/feedback/Toast/index.d.ts +4 -0
  28. package/dist/feedback/Toast/index.d.ts.map +1 -0
  29. package/dist/feedback/Toast/index.js +2 -0
  30. package/dist/feedback/Toast/toastStore.d.ts +34 -0
  31. package/dist/feedback/Toast/toastStore.d.ts.map +1 -0
  32. package/dist/feedback/Toast/toastStore.js +43 -0
  33. package/dist/feedback/index.d.ts +4 -0
  34. package/dist/feedback/index.d.ts.map +1 -1
  35. package/dist/feedback/index.js +3 -0
  36. package/dist/forms/Checkbox/Checkbox.svelte +82 -104
  37. package/dist/forms/Checkbox/Checkbox.svelte.d.ts +1 -1
  38. package/dist/forms/Select/Select.svelte +137 -179
  39. package/dist/forms/Select/Select.svelte.d.ts +1 -1
  40. package/dist/forms/Slider/Slider.svelte +356 -0
  41. package/dist/forms/Slider/Slider.svelte.d.ts +50 -0
  42. package/dist/forms/Slider/Slider.svelte.d.ts.map +1 -0
  43. package/dist/forms/Slider/index.d.ts +2 -0
  44. package/dist/forms/Slider/index.d.ts.map +1 -0
  45. package/dist/forms/Slider/index.js +1 -0
  46. package/dist/forms/TextInput/TextInput.svelte +151 -167
  47. package/dist/forms/TextInput/TextInput.svelte.d.ts +1 -1
  48. package/dist/forms/Textarea/Textarea.svelte +615 -0
  49. package/dist/forms/Textarea/Textarea.svelte.d.ts +47 -0
  50. package/dist/forms/Textarea/Textarea.svelte.d.ts.map +1 -0
  51. package/dist/forms/Textarea/index.d.ts +2 -0
  52. package/dist/forms/Textarea/index.d.ts.map +1 -0
  53. package/dist/forms/Textarea/index.js +1 -0
  54. package/dist/forms/Toggle/Toggle.svelte +239 -0
  55. package/dist/forms/Toggle/Toggle.svelte.d.ts +39 -0
  56. package/dist/forms/Toggle/Toggle.svelte.d.ts.map +1 -0
  57. package/dist/forms/Toggle/index.d.ts +2 -0
  58. package/dist/forms/Toggle/index.d.ts.map +1 -0
  59. package/dist/forms/Toggle/index.js +1 -0
  60. package/dist/forms/index.d.ts +3 -0
  61. package/dist/forms/index.d.ts.map +1 -1
  62. package/dist/forms/index.js +3 -0
  63. package/dist/index.d.ts +0 -1
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +0 -1
  66. package/dist/layout/Card/Card.svelte +64 -39
  67. package/dist/layout/Card/Card.svelte.d.ts +1 -1
  68. package/dist/layout/Card/Card.svelte.d.ts.map +1 -1
  69. package/dist/layout/Container/Container.svelte +71 -71
  70. package/dist/layout/Container/Container.svelte.d.ts +2 -2
  71. package/dist/navigation/CommandPalette/CommandPalette.svelte +407 -189
  72. package/dist/navigation/CommandPalette/CommandPalette.svelte.d.ts +8 -3
  73. package/dist/navigation/CommandPalette/CommandPalette.svelte.d.ts.map +1 -1
  74. package/dist/navigation/Tabs/Tabs.svelte +95 -181
  75. package/dist/navigation/Tabs/Tabs.svelte.d.ts +2 -2
  76. package/dist/primitives/Badge/Badge.svelte +83 -220
  77. package/dist/primitives/Badge/Badge.svelte.d.ts +2 -2
  78. package/dist/primitives/Badge/Badge.svelte.d.ts.map +1 -1
  79. package/dist/primitives/Button/Button.svelte +144 -195
  80. package/dist/primitives/Button/Button.svelte.d.ts +3 -3
  81. package/dist/primitives/Button/Button.svelte.d.ts.map +1 -1
  82. package/dist/primitives/Tooltip/Tooltip.svelte +260 -0
  83. package/dist/primitives/Tooltip/Tooltip.svelte.d.ts +36 -0
  84. package/dist/primitives/Tooltip/Tooltip.svelte.d.ts.map +1 -0
  85. package/dist/primitives/Tooltip/index.d.ts +2 -0
  86. package/dist/primitives/Tooltip/index.d.ts.map +1 -0
  87. package/dist/primitives/Tooltip/index.js +1 -0
  88. package/dist/primitives/index.d.ts +1 -0
  89. package/dist/primitives/index.d.ts.map +1 -1
  90. package/dist/primitives/index.js +1 -0
  91. package/dist/styles/tokens.css +197 -265
  92. package/package.json +5 -5
  93. package/dist/windowing/Window/Window.svelte +0 -637
  94. package/dist/windowing/Window/Window.svelte.d.ts +0 -65
  95. package/dist/windowing/Window/Window.svelte.d.ts.map +0 -1
  96. package/dist/windowing/Window/index.d.ts +0 -2
  97. package/dist/windowing/Window/index.d.ts.map +0 -1
  98. package/dist/windowing/Window/index.js +0 -1
  99. package/dist/windowing/WindowManager/WindowManager.svelte +0 -425
  100. package/dist/windowing/WindowManager/WindowManager.svelte.d.ts +0 -38
  101. package/dist/windowing/WindowManager/WindowManager.svelte.d.ts.map +0 -1
  102. package/dist/windowing/WindowManager/index.d.ts +0 -2
  103. package/dist/windowing/WindowManager/index.d.ts.map +0 -1
  104. package/dist/windowing/WindowManager/index.js +0 -1
  105. package/dist/windowing/index.d.ts +0 -5
  106. package/dist/windowing/index.d.ts.map +0 -1
  107. package/dist/windowing/index.js +0 -3
  108. package/dist/windowing/windowStore.svelte.d.ts +0 -49
  109. package/dist/windowing/windowStore.svelte.d.ts.map +0 -1
  110. package/dist/windowing/windowStore.svelte.js +0 -170
@@ -1,9 +1,10 @@
1
+ import type { Snippet } from 'svelte';
1
2
  export interface CommandItem {
2
3
  id: string;
3
4
  label: string;
4
5
  shortcut?: string;
5
6
  group?: string;
6
- icon?: string;
7
+ icon?: Snippet;
7
8
  description?: string;
8
9
  disabled?: boolean;
9
10
  action: () => void;
@@ -29,8 +30,12 @@ interface Props {
29
30
  /**
30
31
  * CommandPalette
31
32
  *
32
- * Win2K × Basquiat Keyboard-first command launcher with sunken search field,
33
- * categorised result list, fuzzy matching, and shortcut display.
33
+ * Neo-Brutalist DarkPremium keyboard-first command launcher.
34
+ * Glass backdrop, entrance animations, fuzzy search with match highlighting,
35
+ * categorised results, shortcut display, live result count announcements.
36
+ *
37
+ * ARIA: dialog containing combobox with listbox. Focus stays on input;
38
+ * aria-activedescendant communicates visual focus to screen readers.
34
39
  *
35
40
  * @example
36
41
  * <CommandPalette
@@ -1 +1 @@
1
- {"version":3,"file":"CommandPalette.svelte.d.ts","sourceRoot":"","sources":["../../../src/navigation/CommandPalette/CommandPalette.svelte.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,WAAW,EAAE,CAAC;CACrB;AASD,UAAU,KAAK;IACd,6BAA6B;IAC7B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,kCAAkC;IAClC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,cAAc;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAgRD;;;;;;;;;;;;;;GAcG;AACH,QAAA,MAAM,cAAc,+CAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"CommandPalette.svelte.d.ts","sourceRoot":"","sources":["../../../src/navigation/CommandPalette/CommandPalette.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEtC,MAAM,WAAW,WAAW;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,WAAW,EAAE,CAAC;CACrB;AASD,UAAU,KAAK;IACd,6BAA6B;IAC7B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,kCAAkC;IAClC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,cAAc;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAmVD;;;;;;;;;;;;;;;;;;GAkBG;AACH,QAAA,MAAM,cAAc,+CAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
@@ -1,9 +1,9 @@
1
1
  <!--
2
2
  @component Tabs
3
-
4
- Win2K × Basquiat tabbed interface with 3D beveled tabs.
5
- Bold structure, expressive colors, world-class accessibility.
6
-
3
+
4
+ Neo-Brutalist Dark tabbed interface with underline indicator.
5
+ Clean structure, dark surfaces, world-class accessibility.
6
+
7
7
  @example
8
8
  <Tabs
9
9
  label="Content sections"
@@ -66,7 +66,7 @@ interface Props {
66
66
  }
67
67
 
68
68
  let {
69
- id = `tabs-${Math.random().toString(36).substr(2, 9)}`,
69
+ id = `tabs-${Math.random().toString(36).slice(2, 11)}`,
70
70
  label,
71
71
  tabs,
72
72
  value = '',
@@ -131,8 +131,8 @@ function handleKeydown(event: KeyboardEvent, currentIndex: number) {
131
131
  }
132
132
  </script>
133
133
 
134
- <div class={cn('salmex-tabs-root', className)} data-testid={testId} {id}>
135
- <div class={cn('salmex-tabs-list', `salmex-tabs-list-${size}`)} role="tablist" aria-label={label}>
134
+ <div class={cn('sx-tabs-root', className)} data-testid={testId} {id}>
135
+ <div class={cn('sx-tabs-list', `sx-tabs-list-${size}`)} role="tablist" aria-label={label}>
136
136
  {#each tabs as tab, index (tab.value)}
137
137
  {@const isSelected = value === tab.value}
138
138
  {@const isDisabled = tab.disabled}
@@ -146,10 +146,10 @@ function handleKeydown(event: KeyboardEvent, currentIndex: number) {
146
146
  aria-disabled={isDisabled}
147
147
  disabled={isDisabled}
148
148
  class={cn(
149
- 'salmex-tab',
150
- `salmex-tab-${size}`,
151
- isSelected && 'salmex-tab-selected',
152
- isDisabled && 'salmex-tab-disabled'
149
+ 'sx-tab',
150
+ `sx-tab-${size}`,
151
+ isSelected && 'sx-tab-selected',
152
+ isDisabled && 'sx-tab-disabled'
153
153
  )}
154
154
  onclick={() => activateTab(index)}
155
155
  onkeydown={(e) => handleKeydown(e, index)}
@@ -158,13 +158,13 @@ function handleKeydown(event: KeyboardEvent, currentIndex: number) {
158
158
  onmouseleave={() => !isDisabled && onmouseleave?.(tab.value)}
159
159
  >
160
160
  {#if tab.icon}
161
- <span class="salmex-tab-icon" aria-hidden="true">
161
+ <span class="sx-tab-icon" aria-hidden="true">
162
162
  {@render tab.icon()}
163
163
  </span>
164
164
  {/if}
165
- <span class="salmex-tab-label">{tab.label}</span>
165
+ <span class="sx-tab-label">{tab.label}</span>
166
166
  {#if tab.badge !== undefined && tab.badge !== null && tab.badge !== ''}
167
- <span class="salmex-tab-badge" aria-hidden="true">{tab.badge}</span>
167
+ <span class="sx-tab-badge" aria-hidden="true">{tab.badge}</span>
168
168
  {/if}
169
169
  </button>
170
170
  {/each}
@@ -178,7 +178,7 @@ function handleKeydown(event: KeyboardEvent, currentIndex: number) {
178
178
  aria-labelledby={getTabId(index)}
179
179
  hidden={!isSelected}
180
180
  tabindex={0}
181
- class={cn('salmex-tabs-panel', !isSelected && 'salmex-tabs-panel-hidden')}
181
+ class={cn('sx-tabs-panel', !isSelected && 'sx-tabs-panel-hidden')}
182
182
  >
183
183
  {#if isSelected && children}
184
184
  {@render children(tab.value)}
@@ -191,177 +191,109 @@ function handleKeydown(event: KeyboardEvent, currentIndex: number) {
191
191
  /* ========================================
192
192
  ROOT
193
193
  ======================================== */
194
- .salmex-tabs-root {
194
+ .sx-tabs-root {
195
195
  display: block;
196
196
  width: 100%;
197
197
  position: relative;
198
198
  }
199
199
 
200
200
  /* ========================================
201
- TABLIST - Tabs sit ON the panel edge
201
+ TABLIST Flat underline style
202
202
  ======================================== */
203
- .salmex-tabs-list {
203
+ .sx-tabs-list {
204
204
  display: flex;
205
- gap: var(--salmex-space-3);
206
- padding: var(--salmex-space-2) var(--salmex-space-2) 6px;
207
- margin-bottom: -6px;
205
+ gap: var(--sx-space-1);
206
+ padding: 0 var(--sx-space-2);
208
207
  overflow-x: auto;
209
208
  overflow-y: hidden;
210
209
  -webkit-overflow-scrolling: touch;
211
210
  scrollbar-width: thin;
212
211
  position: relative;
213
- z-index: 2;
212
+ background: var(--sx-color-surface);
213
+ border-bottom: 1px solid var(--sx-color-border);
214
214
  }
215
215
 
216
- .salmex-tabs-list-sm {
217
- min-height: 48px;
216
+ .sx-tabs-list-sm {
217
+ min-height: 40px;
218
218
  }
219
219
 
220
- .salmex-tabs-list-md {
221
- min-height: 54px;
220
+ .sx-tabs-list-md {
221
+ min-height: 44px;
222
222
  }
223
223
 
224
- .salmex-tabs-list-lg {
225
- min-height: 60px;
224
+ .sx-tabs-list-lg {
225
+ min-height: 48px;
226
226
  }
227
227
 
228
228
  /* ========================================
229
- TAB - Bold 3D Win2K button style matching Button component
229
+ TAB Clean flat style, underline indicator
230
230
  ======================================== */
231
- .salmex-tab {
231
+ .sx-tab {
232
232
  display: inline-flex;
233
233
  align-items: center;
234
- gap: var(--salmex-space-2);
235
- background: rgb(var(--salmex-button-face));
236
- padding: var(--salmex-space-2) var(--salmex-space-4);
237
- font-family: var(--salmex-font-system);
238
- font-weight: 700;
239
- text-transform: uppercase;
240
- letter-spacing: 0.3px;
234
+ gap: var(--sx-space-2);
235
+ background: transparent;
236
+ border: none;
237
+ border-bottom: 2px solid transparent;
238
+ padding: var(--sx-space-2) var(--sx-space-4);
239
+ font-family: inherit;
240
+ font-weight: 500;
241
+ letter-spacing: 0.01em;
241
242
  cursor: pointer;
242
243
  white-space: nowrap;
243
244
  user-select: none;
244
245
  -webkit-tap-highlight-color: transparent;
245
- color: rgb(var(--salmex-text-primary));
246
+ color: var(--sx-color-text-secondary);
246
247
  position: relative;
247
-
248
- /* Keep consistent height - unselected tabs float higher above */
249
- margin-bottom: 0;
250
-
251
- /* Move all unselected tabs up more */
252
- transform: translateY(-8px);
253
-
254
- /* Simplified 3D - just 1px inset, cleaner look */
255
- box-shadow:
256
- /* Top-left highlight */
257
- inset 1px 1px 0 rgb(var(--salmex-button-highlight)),
258
- /* Bottom-right shadow */
259
- inset -1px -1px 0 rgb(var(--salmex-button-shadow)),
260
- /* Flat shadow - Basquiat style */
261
- 3px 3px 1px rgb(0 0 0 / 0.2);
262
-
263
- /* Always account for focus border space (transparent when not focused) */
264
- outline: 2px dashed transparent;
265
- outline-offset: 2px;
266
-
267
- border-radius: var(--salmex-radius-sm) var(--salmex-radius-sm) 0 0;
268
- transition: all var(--salmex-transition-fast);
269
- }
270
-
271
- .salmex-tab-sm {
272
- height: auto;
273
- font-size: var(--salmex-font-size-xs);
274
- padding: 6px var(--salmex-space-3);
275
- }
276
-
277
- .salmex-tab-md {
278
- height: auto;
279
- font-size: var(--salmex-font-size-sm);
248
+ outline: none;
249
+ border-radius: 0;
250
+ transition: color var(--sx-transition-fast), background var(--sx-transition-fast), border-color var(--sx-transition-fast);
280
251
  }
281
252
 
282
- .salmex-tab-lg {
283
- height: auto;
284
- font-size: var(--salmex-font-size-base);
285
- padding: var(--salmex-space-3) var(--salmex-space-5);
253
+ .sx-tab-sm {
254
+ font-size: var(--sx-text-xs);
255
+ padding: var(--sx-space-1) var(--sx-space-3);
286
256
  }
287
257
 
288
- .salmex-tab:hover:not(.salmex-tab-disabled):not(.salmex-tab-selected) {
289
- background: rgb(var(--salmex-button-light));
290
- transform: translateY(-6px);
291
- box-shadow:
292
- inset 1px 1px 0 rgb(var(--salmex-button-highlight)),
293
- inset -1px -1px 0 rgb(var(--salmex-button-shadow)),
294
- 4px 4px 1px rgb(0 0 0 / 0.25);
258
+ .sx-tab-md {
259
+ font-size: var(--sx-text-sm);
295
260
  }
296
261
 
297
- /* Active (pressed) state - inverted shadow for tactile feedback */
298
- .salmex-tab:active:not(.salmex-tab-disabled):not(.salmex-tab-selected) {
299
- box-shadow:
300
- /* Inverted shadows for pressed effect */
301
- inset -1px -1px 0 rgb(var(--salmex-button-highlight)),
302
- inset 1px 1px 0 rgb(var(--salmex-button-shadow)),
303
- /* Reduced flat shadow */
304
- 1px 1px 0 rgb(0 0 0 / 0.3);
305
-
306
- /* Shift down for pressed effect - relative to hover position */
307
- transform: translate(1px, -5px);
262
+ .sx-tab-lg {
263
+ font-size: var(--sx-text-base);
264
+ padding: var(--sx-space-3) var(--sx-space-5);
308
265
  }
309
266
 
310
- /* Selected tab - merges with panel using transform */
311
- .salmex-tab-selected {
312
- /* Match panel background */
313
- background: rgb(var(--salmex-window-surface));
314
- color: rgb(var(--salmex-electric-blue));
315
- font-weight: 900;
316
- z-index: 3;
317
-
318
- /* Use transform to move down and merge - extends further into panel */
319
- transform: translateY(2px);
320
-
321
- /* No bottom border */
322
- border-bottom: none;
323
-
324
- /* Subtle 3D on sides only - merges at bottom */
325
- box-shadow:
326
- inset 1px 1px 0 rgb(var(--salmex-button-highlight)),
327
- inset -1px 0 0 rgb(var(--salmex-button-shadow));
267
+ .sx-tab:hover:not(.sx-tab-disabled):not(.sx-tab-selected) {
268
+ color: var(--sx-color-text);
269
+ background: var(--sx-color-cyan-subtle);
328
270
  }
329
271
 
330
- /* Dark mode selected - bright blue text with lighter grey shadow */
331
- :global([data-theme='dark']) .salmex-tab-selected {
332
- color: rgb(var(--salmex-primary-light));
333
- text-shadow:
334
- 0.5px 0.5px 0 rgb(var(--salmex-border-default)),
335
- -0.5px -0.5px 0 rgb(var(--salmex-border-default));
272
+ .sx-tab:active:not(.sx-tab-disabled):not(.sx-tab-selected) {
273
+ background: var(--sx-color-cyan-hover);
336
274
  }
337
275
 
338
- /* Focus - yellow ring, visible in light and dark */
339
- .salmex-tab:focus-visible {
340
- outline: none;
341
- box-shadow:
342
- inset 1px 1px 0 rgb(var(--salmex-button-highlight)),
343
- inset -1px -1px 0 rgb(var(--salmex-button-shadow)),
344
- 3px 3px 1px rgb(0 0 0 / 0.2),
345
- 0 0 0 2px rgb(var(--salmex-midnight-black)),
346
- 0 0 2px 4px rgb(var(--salmex-crown-yellow));
347
- z-index: 10;
276
+ /* Selected tab underline indicator */
277
+ .sx-tab-selected {
278
+ color: var(--sx-color-text);
279
+ font-weight: 600;
280
+ border-bottom-color: var(--sx-color-cyan);
348
281
  }
349
282
 
350
- :global([data-theme='dark']) .salmex-tab:focus-visible {
351
- box-shadow:
352
- inset 1px 1px 0 rgb(var(--salmex-button-highlight)),
353
- inset -1px -1px 0 rgb(var(--salmex-button-shadow)),
354
- 3px 3px 1px rgb(0 0 0 / 0.2),
355
- 0 0 2px 3px rgb(var(--salmex-crown-yellow));
283
+ /* Focus — cyan ring */
284
+ .sx-tab:focus-visible {
285
+ outline: 2px solid var(--sx-color-cyan);
286
+ outline-offset: -2px;
287
+ border-radius: var(--sx-radius-sm);
356
288
  }
357
289
 
358
- .salmex-tab-disabled {
290
+ .sx-tab-disabled {
359
291
  cursor: not-allowed;
360
292
  opacity: 0.5;
361
- color: rgb(var(--salmex-text-disabled));
293
+ color: var(--sx-color-text-disabled);
362
294
  }
363
295
 
364
- .salmex-tab-icon {
296
+ .sx-tab-icon {
365
297
  display: inline-flex;
366
298
  flex-shrink: 0;
367
299
  align-items: center;
@@ -369,92 +301,74 @@ function handleKeydown(event: KeyboardEvent, currentIndex: number) {
369
301
  line-height: 0;
370
302
  }
371
303
 
372
- .salmex-tab-label {
304
+ .sx-tab-label {
373
305
  overflow: hidden;
374
306
  text-overflow: ellipsis;
375
307
  }
376
308
 
377
- .salmex-tab-badge {
309
+ .sx-tab-badge {
378
310
  display: inline-flex;
379
311
  align-items: center;
380
312
  justify-content: center;
381
313
  min-width: 18px;
382
314
  height: 18px;
383
- padding: 0 6px;
384
- background: rgb(var(--salmex-bg-tertiary));
385
- border: 1px solid rgb(var(--salmex-border-default));
386
- font-size: 11px;
387
- font-weight: 700;
388
- color: rgb(var(--salmex-text-secondary));
389
- border-radius: var(--salmex-radius-xl);
390
- }
391
-
392
- .salmex-tab-selected .salmex-tab-badge {
393
- background: rgb(var(--salmex-crown-yellow) / 0.2);
394
- color: rgb(var(--salmex-electric-blue));
395
- border-color: rgb(var(--salmex-electric-blue));
315
+ padding: 0 var(--sx-space-1-5);
316
+ background: var(--sx-color-cyan-active);
317
+ border: none;
318
+ font-size: var(--sx-text-xs);
319
+ font-weight: 600;
320
+ color: var(--sx-color-cyan);
321
+ border-radius: var(--sx-radius-full);
396
322
  }
397
323
 
398
- :global([data-theme='dark']) .salmex-tab-selected .salmex-tab-badge {
399
- background: rgb(var(--salmex-crown-yellow) / 0.3);
400
- color: rgb(var(--salmex-crown-yellow));
401
- border-color: rgb(var(--salmex-crown-yellow));
324
+ .sx-tab-selected .sx-tab-badge {
325
+ background: rgba(0, 212, 255, 0.18);
402
326
  }
403
327
 
404
328
  /* ========================================
405
- TABPANEL - Bold panel matching Button component style
329
+ TABPANEL Transparent, no border
406
330
  ======================================== */
407
- .salmex-tabs-panel {
331
+ .sx-tabs-panel {
408
332
  min-height: 0;
409
333
  overflow: auto;
410
- padding: var(--salmex-space-6);
411
- margin-top: 0;
412
- background: rgb(var(--salmex-window-surface));
334
+ padding: var(--sx-space-6);
335
+ background: transparent;
413
336
  position: relative;
414
- z-index: 1;
415
-
416
- border-radius: 0 0 var(--salmex-radius-sm) var(--salmex-radius-sm);
417
-
418
- /* Simplified inset 3D effect */
419
- box-shadow:
420
- /* Inner shadows for depth */
421
- inset 1px 1px 0 rgb(var(--salmex-button-shadow)),
422
- inset -1px -1px 0 rgb(var(--salmex-button-highlight));
423
337
  }
424
338
 
425
- .salmex-tabs-panel-hidden {
339
+ .sx-tabs-panel-hidden {
426
340
  display: none !important;
427
341
  }
428
342
 
429
- .salmex-tabs-panel:focus {
343
+ .sx-tabs-panel:focus {
430
344
  outline: none;
431
345
  }
432
346
 
433
347
  /* ========================================
434
348
  SCROLLBAR STYLING
435
349
  ======================================== */
436
- .salmex-tabs-list::-webkit-scrollbar {
437
- height: 8px;
350
+ .sx-tabs-list::-webkit-scrollbar {
351
+ height: 4px;
438
352
  }
439
353
 
440
- .salmex-tabs-list::-webkit-scrollbar-track {
441
- background: rgb(var(--salmex-bg-tertiary));
354
+ .sx-tabs-list::-webkit-scrollbar-track {
355
+ background: transparent;
442
356
  }
443
357
 
444
- .salmex-tabs-list::-webkit-scrollbar-thumb {
445
- background: rgb(var(--salmex-button-shadow));
446
- border: 1px solid rgb(var(--salmex-border-default));
358
+ .sx-tabs-list::-webkit-scrollbar-thumb {
359
+ background: var(--sx-color-border-strong);
360
+ border-radius: 2px;
447
361
  }
448
362
 
449
- .salmex-tabs-list::-webkit-scrollbar-thumb:hover {
450
- background: rgb(var(--salmex-button-dark-edge));
363
+ .sx-tabs-list::-webkit-scrollbar-thumb:hover {
364
+ background: var(--sx-color-border-hover);
451
365
  }
452
366
 
453
367
  /* ========================================
454
368
  REDUCED MOTION
455
369
  ======================================== */
456
370
  @media (prefers-reduced-motion: reduce) {
457
- .salmex-tab {
371
+ .sx-tab {
458
372
  transition: none;
459
373
  }
460
374
  }
@@ -41,8 +41,8 @@ interface Props {
41
41
  /**
42
42
  * Tabs
43
43
  *
44
- * Win2K × Basquiat tabbed interface with 3D beveled tabs.
45
- * Bold structure, expressive colors, world-class accessibility.
44
+ * Neo-Brutalist Dark tabbed interface with underline indicator.
45
+ * Clean structure, dark surfaces, world-class accessibility.
46
46
  *
47
47
  * @example
48
48
  * <Tabs