@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.
- package/README.md +52 -3
- package/dist/dialogs/ContextMenu/ContextMenu.svelte +97 -94
- package/dist/dialogs/ContextMenu/ContextMenu.svelte.d.ts +3 -2
- package/dist/dialogs/ContextMenu/ContextMenu.svelte.d.ts.map +1 -1
- package/dist/dialogs/Modal/Modal.svelte +112 -116
- package/dist/dialogs/Modal/Modal.svelte.d.ts +1 -1
- package/dist/feedback/Alert/Alert.svelte +115 -221
- package/dist/feedback/Alert/Alert.svelte.d.ts +1 -1
- package/dist/feedback/ProgressBar/ProgressBar.svelte +246 -0
- package/dist/feedback/ProgressBar/ProgressBar.svelte.d.ts +40 -0
- package/dist/feedback/ProgressBar/ProgressBar.svelte.d.ts.map +1 -0
- package/dist/feedback/ProgressBar/index.d.ts +2 -0
- package/dist/feedback/ProgressBar/index.d.ts.map +1 -0
- package/dist/feedback/ProgressBar/index.js +1 -0
- package/dist/feedback/Skeleton/Skeleton.svelte +153 -0
- package/dist/feedback/Skeleton/Skeleton.svelte.d.ts +37 -0
- package/dist/feedback/Skeleton/Skeleton.svelte.d.ts.map +1 -0
- package/dist/feedback/Skeleton/index.d.ts +2 -0
- package/dist/feedback/Skeleton/index.d.ts.map +1 -0
- package/dist/feedback/Skeleton/index.js +1 -0
- package/dist/feedback/Spinner/Spinner.svelte +86 -151
- package/dist/feedback/Spinner/Spinner.svelte.d.ts +5 -3
- package/dist/feedback/Spinner/Spinner.svelte.d.ts.map +1 -1
- package/dist/feedback/Toast/Toaster.svelte +431 -0
- package/dist/feedback/Toast/Toaster.svelte.d.ts +22 -0
- package/dist/feedback/Toast/Toaster.svelte.d.ts.map +1 -0
- package/dist/feedback/Toast/index.d.ts +4 -0
- package/dist/feedback/Toast/index.d.ts.map +1 -0
- package/dist/feedback/Toast/index.js +2 -0
- package/dist/feedback/Toast/toastStore.d.ts +34 -0
- package/dist/feedback/Toast/toastStore.d.ts.map +1 -0
- package/dist/feedback/Toast/toastStore.js +43 -0
- package/dist/feedback/index.d.ts +4 -0
- package/dist/feedback/index.d.ts.map +1 -1
- package/dist/feedback/index.js +3 -0
- package/dist/forms/Checkbox/Checkbox.svelte +82 -104
- package/dist/forms/Checkbox/Checkbox.svelte.d.ts +1 -1
- package/dist/forms/Select/Select.svelte +137 -179
- package/dist/forms/Select/Select.svelte.d.ts +1 -1
- package/dist/forms/Slider/Slider.svelte +356 -0
- package/dist/forms/Slider/Slider.svelte.d.ts +50 -0
- package/dist/forms/Slider/Slider.svelte.d.ts.map +1 -0
- package/dist/forms/Slider/index.d.ts +2 -0
- package/dist/forms/Slider/index.d.ts.map +1 -0
- package/dist/forms/Slider/index.js +1 -0
- package/dist/forms/TextInput/TextInput.svelte +151 -167
- package/dist/forms/TextInput/TextInput.svelte.d.ts +1 -1
- package/dist/forms/Textarea/Textarea.svelte +615 -0
- package/dist/forms/Textarea/Textarea.svelte.d.ts +47 -0
- package/dist/forms/Textarea/Textarea.svelte.d.ts.map +1 -0
- package/dist/forms/Textarea/index.d.ts +2 -0
- package/dist/forms/Textarea/index.d.ts.map +1 -0
- package/dist/forms/Textarea/index.js +1 -0
- package/dist/forms/Toggle/Toggle.svelte +239 -0
- package/dist/forms/Toggle/Toggle.svelte.d.ts +39 -0
- package/dist/forms/Toggle/Toggle.svelte.d.ts.map +1 -0
- package/dist/forms/Toggle/index.d.ts +2 -0
- package/dist/forms/Toggle/index.d.ts.map +1 -0
- package/dist/forms/Toggle/index.js +1 -0
- package/dist/forms/index.d.ts +3 -0
- package/dist/forms/index.d.ts.map +1 -1
- package/dist/forms/index.js +3 -0
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/layout/Card/Card.svelte +64 -39
- package/dist/layout/Card/Card.svelte.d.ts +1 -1
- package/dist/layout/Card/Card.svelte.d.ts.map +1 -1
- package/dist/layout/Container/Container.svelte +71 -71
- package/dist/layout/Container/Container.svelte.d.ts +2 -2
- package/dist/navigation/CommandPalette/CommandPalette.svelte +407 -189
- package/dist/navigation/CommandPalette/CommandPalette.svelte.d.ts +8 -3
- package/dist/navigation/CommandPalette/CommandPalette.svelte.d.ts.map +1 -1
- package/dist/navigation/Tabs/Tabs.svelte +95 -181
- package/dist/navigation/Tabs/Tabs.svelte.d.ts +2 -2
- package/dist/primitives/Badge/Badge.svelte +83 -220
- package/dist/primitives/Badge/Badge.svelte.d.ts +2 -2
- package/dist/primitives/Badge/Badge.svelte.d.ts.map +1 -1
- package/dist/primitives/Button/Button.svelte +144 -195
- package/dist/primitives/Button/Button.svelte.d.ts +3 -3
- package/dist/primitives/Button/Button.svelte.d.ts.map +1 -1
- package/dist/primitives/Tooltip/Tooltip.svelte +260 -0
- package/dist/primitives/Tooltip/Tooltip.svelte.d.ts +36 -0
- package/dist/primitives/Tooltip/Tooltip.svelte.d.ts.map +1 -0
- package/dist/primitives/Tooltip/index.d.ts +2 -0
- package/dist/primitives/Tooltip/index.d.ts.map +1 -0
- package/dist/primitives/Tooltip/index.js +1 -0
- package/dist/primitives/index.d.ts +1 -0
- package/dist/primitives/index.d.ts.map +1 -1
- package/dist/primitives/index.js +1 -0
- package/dist/styles/tokens.css +197 -265
- package/package.json +5 -5
- package/dist/windowing/Window/Window.svelte +0 -637
- package/dist/windowing/Window/Window.svelte.d.ts +0 -65
- package/dist/windowing/Window/Window.svelte.d.ts.map +0 -1
- package/dist/windowing/Window/index.d.ts +0 -2
- package/dist/windowing/Window/index.d.ts.map +0 -1
- package/dist/windowing/Window/index.js +0 -1
- package/dist/windowing/WindowManager/WindowManager.svelte +0 -425
- package/dist/windowing/WindowManager/WindowManager.svelte.d.ts +0 -38
- package/dist/windowing/WindowManager/WindowManager.svelte.d.ts.map +0 -1
- package/dist/windowing/WindowManager/index.d.ts +0 -2
- package/dist/windowing/WindowManager/index.d.ts.map +0 -1
- package/dist/windowing/WindowManager/index.js +0 -1
- package/dist/windowing/index.d.ts +0 -5
- package/dist/windowing/index.d.ts.map +0 -1
- package/dist/windowing/index.js +0 -3
- package/dist/windowing/windowStore.svelte.d.ts +0 -49
- package/dist/windowing/windowStore.svelte.d.ts.map +0 -1
- 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?:
|
|
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
|
-
*
|
|
33
|
-
*
|
|
33
|
+
* Neo-Brutalist Dark — Premium 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,
|
|
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
|
-
|
|
5
|
-
|
|
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).
|
|
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('
|
|
135
|
-
<div class={cn('
|
|
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
|
-
'
|
|
150
|
-
`
|
|
151
|
-
isSelected && '
|
|
152
|
-
isDisabled && '
|
|
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="
|
|
161
|
+
<span class="sx-tab-icon" aria-hidden="true">
|
|
162
162
|
{@render tab.icon()}
|
|
163
163
|
</span>
|
|
164
164
|
{/if}
|
|
165
|
-
<span class="
|
|
165
|
+
<span class="sx-tab-label">{tab.label}</span>
|
|
166
166
|
{#if tab.badge !== undefined && tab.badge !== null && tab.badge !== ''}
|
|
167
|
-
<span class="
|
|
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('
|
|
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
|
-
.
|
|
194
|
+
.sx-tabs-root {
|
|
195
195
|
display: block;
|
|
196
196
|
width: 100%;
|
|
197
197
|
position: relative;
|
|
198
198
|
}
|
|
199
199
|
|
|
200
200
|
/* ========================================
|
|
201
|
-
TABLIST
|
|
201
|
+
TABLIST — Flat underline style
|
|
202
202
|
======================================== */
|
|
203
|
-
.
|
|
203
|
+
.sx-tabs-list {
|
|
204
204
|
display: flex;
|
|
205
|
-
gap: var(--
|
|
206
|
-
padding:
|
|
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
|
-
|
|
212
|
+
background: var(--sx-color-surface);
|
|
213
|
+
border-bottom: 1px solid var(--sx-color-border);
|
|
214
214
|
}
|
|
215
215
|
|
|
216
|
-
.
|
|
217
|
-
min-height:
|
|
216
|
+
.sx-tabs-list-sm {
|
|
217
|
+
min-height: 40px;
|
|
218
218
|
}
|
|
219
219
|
|
|
220
|
-
.
|
|
221
|
-
min-height:
|
|
220
|
+
.sx-tabs-list-md {
|
|
221
|
+
min-height: 44px;
|
|
222
222
|
}
|
|
223
223
|
|
|
224
|
-
.
|
|
225
|
-
min-height:
|
|
224
|
+
.sx-tabs-list-lg {
|
|
225
|
+
min-height: 48px;
|
|
226
226
|
}
|
|
227
227
|
|
|
228
228
|
/* ========================================
|
|
229
|
-
TAB
|
|
229
|
+
TAB — Clean flat style, underline indicator
|
|
230
230
|
======================================== */
|
|
231
|
-
.
|
|
231
|
+
.sx-tab {
|
|
232
232
|
display: inline-flex;
|
|
233
233
|
align-items: center;
|
|
234
|
-
gap: var(--
|
|
235
|
-
background:
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
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:
|
|
246
|
+
color: var(--sx-color-text-secondary);
|
|
246
247
|
position: relative;
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
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
|
-
.
|
|
283
|
-
|
|
284
|
-
|
|
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
|
-
.
|
|
289
|
-
|
|
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
|
-
|
|
298
|
-
|
|
299
|
-
|
|
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
|
-
|
|
311
|
-
|
|
312
|
-
|
|
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
|
-
|
|
331
|
-
|
|
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
|
-
/*
|
|
339
|
-
.
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
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
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
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
|
-
.
|
|
290
|
+
.sx-tab-disabled {
|
|
359
291
|
cursor: not-allowed;
|
|
360
292
|
opacity: 0.5;
|
|
361
|
-
color:
|
|
293
|
+
color: var(--sx-color-text-disabled);
|
|
362
294
|
}
|
|
363
295
|
|
|
364
|
-
.
|
|
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
|
-
.
|
|
304
|
+
.sx-tab-label {
|
|
373
305
|
overflow: hidden;
|
|
374
306
|
text-overflow: ellipsis;
|
|
375
307
|
}
|
|
376
308
|
|
|
377
|
-
.
|
|
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
|
|
384
|
-
background:
|
|
385
|
-
border:
|
|
386
|
-
font-size:
|
|
387
|
-
font-weight:
|
|
388
|
-
color:
|
|
389
|
-
border-radius: var(--
|
|
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
|
-
|
|
399
|
-
background:
|
|
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
|
|
329
|
+
TABPANEL — Transparent, no border
|
|
406
330
|
======================================== */
|
|
407
|
-
.
|
|
331
|
+
.sx-tabs-panel {
|
|
408
332
|
min-height: 0;
|
|
409
333
|
overflow: auto;
|
|
410
|
-
padding: var(--
|
|
411
|
-
|
|
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
|
-
.
|
|
339
|
+
.sx-tabs-panel-hidden {
|
|
426
340
|
display: none !important;
|
|
427
341
|
}
|
|
428
342
|
|
|
429
|
-
.
|
|
343
|
+
.sx-tabs-panel:focus {
|
|
430
344
|
outline: none;
|
|
431
345
|
}
|
|
432
346
|
|
|
433
347
|
/* ========================================
|
|
434
348
|
SCROLLBAR STYLING
|
|
435
349
|
======================================== */
|
|
436
|
-
.
|
|
437
|
-
height:
|
|
350
|
+
.sx-tabs-list::-webkit-scrollbar {
|
|
351
|
+
height: 4px;
|
|
438
352
|
}
|
|
439
353
|
|
|
440
|
-
.
|
|
441
|
-
background:
|
|
354
|
+
.sx-tabs-list::-webkit-scrollbar-track {
|
|
355
|
+
background: transparent;
|
|
442
356
|
}
|
|
443
357
|
|
|
444
|
-
.
|
|
445
|
-
background:
|
|
446
|
-
border:
|
|
358
|
+
.sx-tabs-list::-webkit-scrollbar-thumb {
|
|
359
|
+
background: var(--sx-color-border-strong);
|
|
360
|
+
border-radius: 2px;
|
|
447
361
|
}
|
|
448
362
|
|
|
449
|
-
.
|
|
450
|
-
background:
|
|
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
|
-
.
|
|
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
|
-
*
|
|
45
|
-
*
|
|
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
|