@salmexio/ui 0.3.1 → 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 +96 -93
- 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 -102
- 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 +88 -154
- 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 -103
- package/dist/forms/Checkbox/Checkbox.svelte.d.ts +1 -1
- package/dist/forms/Select/Select.svelte +136 -177
- 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 +148 -164
- 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 -40
- 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 +410 -181
- 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 +94 -178
- package/dist/navigation/Tabs/Tabs.svelte.d.ts +2 -2
- package/dist/primitives/Badge/Badge.svelte +85 -223
- 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 +138 -208
- 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 +200 -259
- package/package.json +5 -5
- package/dist/windowing/Window/Window.svelte +0 -602
- 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 -410
- 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,7 +1,7 @@
|
|
|
1
1
|
<!--
|
|
2
2
|
@component Select
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
Neo-Brutalist Dark — 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
|
|
@@ -219,7 +219,7 @@ function scrollActiveIntoView() {
|
|
|
219
219
|
if (!listboxEl || activeIndex < 0) return;
|
|
220
220
|
const active = listboxEl.querySelector(`[data-option-index="${activeIndex}"]`) as HTMLElement;
|
|
221
221
|
if (!active) return;
|
|
222
|
-
// Manual scroll math
|
|
222
|
+
// Manual scroll math -- only scrolls the listbox, never the page
|
|
223
223
|
const listTop = listboxEl.scrollTop;
|
|
224
224
|
const listHeight = listboxEl.clientHeight;
|
|
225
225
|
const elTop = active.offsetTop;
|
|
@@ -430,29 +430,29 @@ onMount(() => {
|
|
|
430
430
|
</script>
|
|
431
431
|
|
|
432
432
|
<div
|
|
433
|
-
class={cn('
|
|
433
|
+
class={cn('sx-select-wrapper', `sx-select-${size}`, className)}
|
|
434
434
|
data-testid={testId}
|
|
435
435
|
>
|
|
436
436
|
<!-- Label -->
|
|
437
437
|
<label
|
|
438
438
|
id={labelId}
|
|
439
439
|
for={id}
|
|
440
|
-
class={cn('
|
|
440
|
+
class={cn('sx-select-label', hideLabel && 'sx-sr-only')}
|
|
441
441
|
>
|
|
442
442
|
{label}
|
|
443
|
-
{#if required}<span class="
|
|
443
|
+
{#if required}<span class="sx-select-required" aria-hidden="true">*</span>{/if}
|
|
444
444
|
</label>
|
|
445
445
|
|
|
446
|
-
<!-- Trigger button
|
|
446
|
+
<!-- Trigger button -- DOM focus always stays here -->
|
|
447
447
|
<button
|
|
448
448
|
bind:this={triggerEl}
|
|
449
449
|
{id}
|
|
450
450
|
type="button"
|
|
451
451
|
class={cn(
|
|
452
|
-
'
|
|
453
|
-
isOpen && '
|
|
454
|
-
showError && '
|
|
455
|
-
disabled && '
|
|
452
|
+
'sx-select-trigger',
|
|
453
|
+
isOpen && 'sx-select-trigger-open',
|
|
454
|
+
showError && 'sx-select-trigger-error',
|
|
455
|
+
disabled && 'sx-select-trigger-disabled'
|
|
456
456
|
)}
|
|
457
457
|
role="combobox"
|
|
458
458
|
aria-expanded={isOpen}
|
|
@@ -467,10 +467,10 @@ onMount(() => {
|
|
|
467
467
|
onclick={toggle}
|
|
468
468
|
onkeydown={handleKeydown}
|
|
469
469
|
>
|
|
470
|
-
<span class="
|
|
470
|
+
<span class="sx-select-value" class:sx-select-placeholder={!selectedOption && selectedLabels.length === 0}>
|
|
471
471
|
{displayText}
|
|
472
472
|
</span>
|
|
473
|
-
<span class="
|
|
473
|
+
<span class="sx-select-chevron" aria-hidden="true">
|
|
474
474
|
<svg width="12" height="12" viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round">
|
|
475
475
|
<path d="M3 4.5L6 7.5L9 4.5" />
|
|
476
476
|
</svg>
|
|
@@ -478,22 +478,22 @@ onMount(() => {
|
|
|
478
478
|
</button>
|
|
479
479
|
|
|
480
480
|
<!-- Footer: error / hint -->
|
|
481
|
-
<div class="
|
|
481
|
+
<div class="sx-select-footer">
|
|
482
482
|
{#if showError}
|
|
483
|
-
<p id={errorId} class="
|
|
483
|
+
<p id={errorId} class="sx-select-error" role="alert" aria-live="assertive">{error}</p>
|
|
484
484
|
{:else if hint}
|
|
485
|
-
<p id={hintId} class="
|
|
485
|
+
<p id={hintId} class="sx-select-hint">{hint}</p>
|
|
486
486
|
{/if}
|
|
487
487
|
</div>
|
|
488
488
|
</div>
|
|
489
489
|
|
|
490
|
-
<!-- Dropdown panel
|
|
490
|
+
<!-- Dropdown panel -- fixed positioning to escape overflow/stacking contexts -->
|
|
491
491
|
{#if isOpen}
|
|
492
492
|
<!-- svelte-ignore a11y_no_noninteractive_element_interactions -->
|
|
493
493
|
<div
|
|
494
494
|
bind:this={listboxEl}
|
|
495
495
|
id={listboxId}
|
|
496
|
-
class="
|
|
496
|
+
class="sx-select-panel"
|
|
497
497
|
style="position:fixed;left:{panelLeft}px;{placeAbove ? `bottom:${window.innerHeight - panelTop}px` : `top:${panelTop}px`};width:{panelWidth}px;max-height:{panelMaxHeight}px;"
|
|
498
498
|
role="listbox"
|
|
499
499
|
aria-labelledby={labelId}
|
|
@@ -504,7 +504,7 @@ onMount(() => {
|
|
|
504
504
|
{#if groups.length > 0}
|
|
505
505
|
{#each groups as group, gi}
|
|
506
506
|
<div role="group" aria-label={group.label}>
|
|
507
|
-
<div class="
|
|
507
|
+
<div class="sx-select-group-label">{group.label}</div>
|
|
508
508
|
{#each group.options as opt, oi}
|
|
509
509
|
{@const globalIdx = getGlobalIndex(gi, oi)}
|
|
510
510
|
{@const isActive = globalIdx === activeIndex}
|
|
@@ -513,10 +513,10 @@ onMount(() => {
|
|
|
513
513
|
<div
|
|
514
514
|
id={getOptionId(globalIdx)}
|
|
515
515
|
class={cn(
|
|
516
|
-
'
|
|
517
|
-
isActive && '
|
|
518
|
-
isSelected && '
|
|
519
|
-
opt.disabled && '
|
|
516
|
+
'sx-select-option',
|
|
517
|
+
isActive && 'sx-select-option-active',
|
|
518
|
+
isSelected && 'sx-select-option-selected',
|
|
519
|
+
opt.disabled && 'sx-select-option-disabled'
|
|
520
520
|
)}
|
|
521
521
|
role="option"
|
|
522
522
|
tabindex="-1"
|
|
@@ -527,15 +527,15 @@ onMount(() => {
|
|
|
527
527
|
onmousedown={(e) => handleOptionMouseDown(e, opt)}
|
|
528
528
|
>
|
|
529
529
|
{#if multiple}
|
|
530
|
-
<span class="
|
|
530
|
+
<span class="sx-select-check" aria-hidden="true">
|
|
531
531
|
{#if isSelected}
|
|
532
532
|
<svg width="12" height="12" viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="2.5"><path d="M2.5 6L5 8.5L9.5 3.5" /></svg>
|
|
533
533
|
{/if}
|
|
534
534
|
</span>
|
|
535
535
|
{/if}
|
|
536
|
-
<span class="
|
|
536
|
+
<span class="sx-select-option-label">{opt.label}</span>
|
|
537
537
|
{#if !multiple && isSelected}
|
|
538
|
-
<span class="
|
|
538
|
+
<span class="sx-select-checkmark" aria-hidden="true">
|
|
539
539
|
<svg width="12" height="12" viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="2.5"><path d="M2.5 6L5 8.5L9.5 3.5" /></svg>
|
|
540
540
|
</span>
|
|
541
541
|
{/if}
|
|
@@ -551,10 +551,10 @@ onMount(() => {
|
|
|
551
551
|
<div
|
|
552
552
|
id={getOptionId(i)}
|
|
553
553
|
class={cn(
|
|
554
|
-
'
|
|
555
|
-
isActive && '
|
|
556
|
-
isSelected && '
|
|
557
|
-
opt.disabled && '
|
|
554
|
+
'sx-select-option',
|
|
555
|
+
isActive && 'sx-select-option-active',
|
|
556
|
+
isSelected && 'sx-select-option-selected',
|
|
557
|
+
opt.disabled && 'sx-select-option-disabled'
|
|
558
558
|
)}
|
|
559
559
|
role="option"
|
|
560
560
|
tabindex="-1"
|
|
@@ -565,15 +565,15 @@ onMount(() => {
|
|
|
565
565
|
onmousedown={(e) => handleOptionMouseDown(e, opt)}
|
|
566
566
|
>
|
|
567
567
|
{#if multiple}
|
|
568
|
-
<span class="
|
|
568
|
+
<span class="sx-select-check" aria-hidden="true">
|
|
569
569
|
{#if isSelected}
|
|
570
570
|
<svg width="12" height="12" viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="2.5"><path d="M2.5 6L5 8.5L9.5 3.5" /></svg>
|
|
571
571
|
{/if}
|
|
572
572
|
</span>
|
|
573
573
|
{/if}
|
|
574
|
-
<span class="
|
|
574
|
+
<span class="sx-select-option-label">{opt.label}</span>
|
|
575
575
|
{#if !multiple && isSelected}
|
|
576
|
-
<span class="
|
|
576
|
+
<span class="sx-select-checkmark" aria-hidden="true">
|
|
577
577
|
<svg width="12" height="12" viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="2.5"><path d="M2.5 6L5 8.5L9.5 3.5" /></svg>
|
|
578
578
|
</span>
|
|
579
579
|
{/if}
|
|
@@ -587,30 +587,28 @@ onMount(() => {
|
|
|
587
587
|
/* ========================================
|
|
588
588
|
WRAPPER
|
|
589
589
|
======================================== */
|
|
590
|
-
.
|
|
590
|
+
.sx-select-wrapper {
|
|
591
591
|
display: flex;
|
|
592
592
|
flex-direction: column;
|
|
593
|
-
gap: var(--
|
|
594
|
-
font-family: var(--
|
|
593
|
+
gap: var(--sx-space-1);
|
|
594
|
+
font-family: var(--sx-font-body);
|
|
595
595
|
}
|
|
596
596
|
|
|
597
597
|
/* ========================================
|
|
598
598
|
LABEL
|
|
599
599
|
======================================== */
|
|
600
|
-
.
|
|
601
|
-
font-size: var(--
|
|
602
|
-
font-weight:
|
|
603
|
-
text-
|
|
604
|
-
letter-spacing: 0.3px;
|
|
605
|
-
color: rgb(var(--salmex-text-primary));
|
|
600
|
+
.sx-select-label {
|
|
601
|
+
font-size: var(--sx-text-sm);
|
|
602
|
+
font-weight: 500;
|
|
603
|
+
color: var(--sx-color-text-secondary);
|
|
606
604
|
}
|
|
607
605
|
|
|
608
|
-
.
|
|
609
|
-
color:
|
|
606
|
+
.sx-select-required {
|
|
607
|
+
color: var(--sx-color-red);
|
|
610
608
|
margin-left: 2px;
|
|
611
609
|
}
|
|
612
610
|
|
|
613
|
-
.
|
|
611
|
+
.sx-sr-only {
|
|
614
612
|
position: absolute;
|
|
615
613
|
width: 1px;
|
|
616
614
|
height: 1px;
|
|
@@ -623,175 +621,146 @@ onMount(() => {
|
|
|
623
621
|
}
|
|
624
622
|
|
|
625
623
|
/* ========================================
|
|
626
|
-
TRIGGER
|
|
624
|
+
TRIGGER -- Same style as TextInput
|
|
627
625
|
======================================== */
|
|
628
|
-
.
|
|
626
|
+
.sx-select-trigger {
|
|
629
627
|
display: flex;
|
|
630
628
|
align-items: center;
|
|
631
629
|
justify-content: space-between;
|
|
632
|
-
gap: var(--
|
|
630
|
+
gap: var(--sx-space-2);
|
|
633
631
|
width: 100%;
|
|
634
|
-
border:
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
font-
|
|
632
|
+
border: 1px solid var(--sx-color-border-strong);
|
|
633
|
+
border-radius: var(--sx-radius-md);
|
|
634
|
+
background: var(--sx-color-surface);
|
|
635
|
+
color: var(--sx-color-text);
|
|
636
|
+
font-family: var(--sx-font-body);
|
|
637
|
+
font-weight: 500;
|
|
639
638
|
cursor: pointer;
|
|
640
639
|
text-align: left;
|
|
641
|
-
transition:
|
|
642
|
-
/* Sunken inset — same as TextInput */
|
|
643
|
-
box-shadow:
|
|
644
|
-
inset 2px 2px 0 rgb(var(--salmex-button-shadow)),
|
|
645
|
-
inset -1px -1px 0 rgb(var(--salmex-button-highlight));
|
|
640
|
+
transition: border-color var(--sx-transition-fast), box-shadow var(--sx-transition-fast);
|
|
646
641
|
}
|
|
647
642
|
|
|
648
|
-
.
|
|
649
|
-
border-color:
|
|
643
|
+
.sx-select-trigger:hover:not(:disabled) {
|
|
644
|
+
border-color: var(--sx-color-border-hover);
|
|
650
645
|
}
|
|
651
646
|
|
|
652
|
-
.
|
|
647
|
+
.sx-select-trigger:focus-visible {
|
|
653
648
|
outline: none;
|
|
654
|
-
border-color:
|
|
655
|
-
box-shadow:
|
|
656
|
-
inset 2px 2px 0 rgb(var(--salmex-button-shadow)),
|
|
657
|
-
inset -1px -1px 0 rgb(var(--salmex-button-highlight)),
|
|
658
|
-
0 0 0 2px rgb(var(--salmex-midnight-black)),
|
|
659
|
-
0 0 0 5px rgb(var(--salmex-crown-yellow));
|
|
649
|
+
border-color: var(--sx-color-cyan);
|
|
650
|
+
box-shadow: 0 0 0 3px var(--sx-color-cyan-ring);
|
|
660
651
|
}
|
|
661
652
|
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
inset -1px -1px 0 rgb(var(--salmex-button-highlight)),
|
|
666
|
-
0 0 0 3px rgb(var(--salmex-crown-yellow));
|
|
653
|
+
.sx-select-trigger-open {
|
|
654
|
+
border-color: var(--sx-color-cyan);
|
|
655
|
+
box-shadow: 0 0 0 3px var(--sx-color-cyan-ring);
|
|
667
656
|
}
|
|
668
657
|
|
|
669
|
-
.
|
|
670
|
-
border-color:
|
|
658
|
+
.sx-select-trigger-error {
|
|
659
|
+
border-color: var(--sx-color-red);
|
|
660
|
+
box-shadow: 0 0 0 3px var(--sx-color-red-ring);
|
|
671
661
|
}
|
|
672
662
|
|
|
673
|
-
.
|
|
674
|
-
border-color: rgb(var(--salmex-street-red));
|
|
675
|
-
}
|
|
676
|
-
|
|
677
|
-
.salmex-select-trigger-disabled {
|
|
663
|
+
.sx-select-trigger-disabled {
|
|
678
664
|
opacity: 0.5;
|
|
679
665
|
cursor: not-allowed;
|
|
680
|
-
filter: grayscale(0.5);
|
|
681
666
|
}
|
|
682
667
|
|
|
683
668
|
/* ========================================
|
|
684
669
|
SIZES
|
|
685
670
|
======================================== */
|
|
686
|
-
.
|
|
687
|
-
min-height:
|
|
688
|
-
padding: 0 var(--
|
|
689
|
-
font-size: var(--
|
|
671
|
+
.sx-select-sm .sx-select-trigger {
|
|
672
|
+
min-height: 32px;
|
|
673
|
+
padding: 0 var(--sx-space-3);
|
|
674
|
+
font-size: var(--sx-text-xs);
|
|
690
675
|
}
|
|
691
676
|
|
|
692
|
-
.
|
|
693
|
-
min-height:
|
|
694
|
-
padding: 0 var(--
|
|
695
|
-
font-size: var(--
|
|
677
|
+
.sx-select-md .sx-select-trigger {
|
|
678
|
+
min-height: 40px;
|
|
679
|
+
padding: 0 var(--sx-space-4);
|
|
680
|
+
font-size: var(--sx-text-sm);
|
|
696
681
|
}
|
|
697
682
|
|
|
698
|
-
.
|
|
699
|
-
min-height:
|
|
700
|
-
padding: 0 var(--
|
|
701
|
-
font-size: var(--
|
|
683
|
+
.sx-select-lg .sx-select-trigger {
|
|
684
|
+
min-height: 48px;
|
|
685
|
+
padding: 0 var(--sx-space-5);
|
|
686
|
+
font-size: var(--sx-text-base);
|
|
702
687
|
}
|
|
703
688
|
|
|
704
689
|
/* ========================================
|
|
705
690
|
VALUE DISPLAY
|
|
706
691
|
======================================== */
|
|
707
|
-
.
|
|
692
|
+
.sx-select-value {
|
|
708
693
|
flex: 1;
|
|
709
694
|
overflow: hidden;
|
|
710
695
|
text-overflow: ellipsis;
|
|
711
696
|
white-space: nowrap;
|
|
712
697
|
}
|
|
713
698
|
|
|
714
|
-
.
|
|
715
|
-
color:
|
|
699
|
+
.sx-select-placeholder {
|
|
700
|
+
color: var(--sx-color-text-disabled);
|
|
716
701
|
}
|
|
717
702
|
|
|
718
|
-
.
|
|
703
|
+
.sx-select-chevron {
|
|
719
704
|
flex-shrink: 0;
|
|
720
705
|
display: flex;
|
|
721
706
|
align-items: center;
|
|
722
|
-
transition: transform var(--
|
|
723
|
-
color:
|
|
707
|
+
transition: transform var(--sx-transition-fast);
|
|
708
|
+
color: var(--sx-color-text-secondary);
|
|
724
709
|
}
|
|
725
710
|
|
|
726
|
-
.
|
|
711
|
+
.sx-select-trigger-open .sx-select-chevron {
|
|
727
712
|
transform: rotate(180deg);
|
|
728
713
|
}
|
|
729
714
|
|
|
730
715
|
/* ========================================
|
|
731
|
-
DROPDOWN PANEL
|
|
716
|
+
DROPDOWN PANEL -- Glass surface, shadow, blur
|
|
732
717
|
======================================== */
|
|
733
|
-
.
|
|
734
|
-
z-index: var(--
|
|
718
|
+
.sx-select-panel {
|
|
719
|
+
z-index: var(--sx-z-dropdown);
|
|
735
720
|
overflow-y: auto;
|
|
736
721
|
overflow-x: hidden;
|
|
737
|
-
background:
|
|
738
|
-
border:
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
722
|
+
background: var(--sx-color-surface-2);
|
|
723
|
+
border: 1px solid var(--sx-color-border-strong);
|
|
724
|
+
border-radius: var(--sx-radius-md);
|
|
725
|
+
box-shadow: var(--sx-shadow-lg);
|
|
726
|
+
backdrop-filter: var(--sx-glass-blur);
|
|
727
|
+
-webkit-backdrop-filter: var(--sx-glass-blur);
|
|
743
728
|
outline: none;
|
|
744
|
-
padding: var(--
|
|
745
|
-
font-family: var(--
|
|
746
|
-
}
|
|
747
|
-
|
|
748
|
-
:global([data-theme='dark']) .salmex-select-panel {
|
|
749
|
-
box-shadow:
|
|
750
|
-
inset 1px 1px 0 rgb(var(--salmex-button-highlight)),
|
|
751
|
-
inset -1px -1px 0 rgb(var(--salmex-button-shadow)),
|
|
752
|
-
5px 5px 0 rgb(0 0 0 / 0.7);
|
|
729
|
+
padding: var(--sx-space-1) 0;
|
|
730
|
+
font-family: var(--sx-font-body);
|
|
753
731
|
}
|
|
754
732
|
|
|
755
733
|
/* ========================================
|
|
756
734
|
OPTION
|
|
757
735
|
======================================== */
|
|
758
|
-
.
|
|
736
|
+
.sx-select-option {
|
|
759
737
|
display: flex;
|
|
760
738
|
align-items: center;
|
|
761
|
-
gap: var(--
|
|
762
|
-
padding: var(--
|
|
763
|
-
font-size: var(--
|
|
764
|
-
font-weight:
|
|
765
|
-
color:
|
|
739
|
+
gap: var(--sx-space-2);
|
|
740
|
+
padding: var(--sx-space-2) var(--sx-space-4);
|
|
741
|
+
font-size: var(--sx-text-sm);
|
|
742
|
+
font-weight: 500;
|
|
743
|
+
color: var(--sx-color-text);
|
|
766
744
|
cursor: pointer;
|
|
767
745
|
user-select: none;
|
|
768
|
-
transition: background var(--
|
|
769
|
-
}
|
|
770
|
-
|
|
771
|
-
.salmex-select-option-active {
|
|
772
|
-
background: rgb(var(--salmex-electric-blue));
|
|
773
|
-
color: rgb(var(--salmex-chalk-white));
|
|
746
|
+
transition: background var(--sx-transition-fast), color var(--sx-transition-fast);
|
|
774
747
|
}
|
|
775
748
|
|
|
776
|
-
|
|
777
|
-
background:
|
|
778
|
-
color:
|
|
749
|
+
.sx-select-option-active {
|
|
750
|
+
background: var(--sx-color-cyan-hover);
|
|
751
|
+
color: var(--sx-color-cyan);
|
|
779
752
|
}
|
|
780
753
|
|
|
781
|
-
.
|
|
782
|
-
background:
|
|
754
|
+
.sx-select-option-selected:not(.sx-select-option-active) {
|
|
755
|
+
background: var(--sx-color-cyan-subtle);
|
|
783
756
|
}
|
|
784
757
|
|
|
785
|
-
|
|
786
|
-
background: rgb(var(--salmex-primary-light) / 0.15);
|
|
787
|
-
}
|
|
788
|
-
|
|
789
|
-
.salmex-select-option-disabled {
|
|
758
|
+
.sx-select-option-disabled {
|
|
790
759
|
opacity: 0.4;
|
|
791
760
|
cursor: not-allowed;
|
|
792
761
|
}
|
|
793
762
|
|
|
794
|
-
.
|
|
763
|
+
.sx-select-option-label {
|
|
795
764
|
flex: 1;
|
|
796
765
|
overflow: hidden;
|
|
797
766
|
text-overflow: ellipsis;
|
|
@@ -799,74 +768,64 @@ onMount(() => {
|
|
|
799
768
|
}
|
|
800
769
|
|
|
801
770
|
/* Checkmark for single select */
|
|
802
|
-
.
|
|
771
|
+
.sx-select-checkmark {
|
|
803
772
|
flex-shrink: 0;
|
|
804
773
|
display: flex;
|
|
805
774
|
align-items: center;
|
|
806
|
-
color:
|
|
807
|
-
}
|
|
808
|
-
|
|
809
|
-
.salmex-select-option-active .salmex-select-checkmark {
|
|
810
|
-
color: rgb(var(--salmex-chalk-white));
|
|
775
|
+
color: var(--sx-color-cyan);
|
|
811
776
|
}
|
|
812
777
|
|
|
813
|
-
|
|
814
|
-
color:
|
|
778
|
+
.sx-select-option-active .sx-select-checkmark {
|
|
779
|
+
color: var(--sx-color-cyan);
|
|
815
780
|
}
|
|
816
781
|
|
|
817
782
|
/* Checkbox square for multi select */
|
|
818
|
-
.
|
|
783
|
+
.sx-select-check {
|
|
819
784
|
flex-shrink: 0;
|
|
820
785
|
display: flex;
|
|
821
786
|
align-items: center;
|
|
822
787
|
justify-content: center;
|
|
823
788
|
width: 16px;
|
|
824
789
|
height: 16px;
|
|
825
|
-
border:
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
inset 1px 1px 0 rgb(var(--salmex-button-shadow)),
|
|
829
|
-
inset -1px -1px 0 rgb(var(--salmex-button-highlight));
|
|
790
|
+
border: 1px solid var(--sx-color-border-strong);
|
|
791
|
+
border-radius: var(--sx-radius-sm);
|
|
792
|
+
background: var(--sx-color-surface);
|
|
830
793
|
}
|
|
831
794
|
|
|
832
|
-
.
|
|
833
|
-
border-color:
|
|
834
|
-
}
|
|
835
|
-
|
|
836
|
-
:global([data-theme='dark']) .salmex-select-option-active .salmex-select-check {
|
|
837
|
-
border-color: rgb(var(--salmex-midnight-black));
|
|
795
|
+
.sx-select-option-active .sx-select-check {
|
|
796
|
+
border-color: var(--sx-color-cyan);
|
|
838
797
|
}
|
|
839
798
|
|
|
840
799
|
/* ========================================
|
|
841
800
|
GROUP LABELS
|
|
842
801
|
======================================== */
|
|
843
|
-
.
|
|
844
|
-
padding: var(--
|
|
845
|
-
font-size: var(--
|
|
846
|
-
font-weight:
|
|
802
|
+
.sx-select-group-label {
|
|
803
|
+
padding: var(--sx-space-2) var(--sx-space-4) var(--sx-space-1);
|
|
804
|
+
font-size: var(--sx-text-xs);
|
|
805
|
+
font-weight: 600;
|
|
806
|
+
letter-spacing: 0.05em;
|
|
847
807
|
text-transform: uppercase;
|
|
848
|
-
|
|
849
|
-
color: rgb(var(--salmex-text-secondary));
|
|
808
|
+
color: var(--sx-color-text-disabled);
|
|
850
809
|
user-select: none;
|
|
851
810
|
}
|
|
852
811
|
|
|
853
812
|
/* ========================================
|
|
854
|
-
FOOTER
|
|
813
|
+
FOOTER -- Error / Hint
|
|
855
814
|
======================================== */
|
|
856
|
-
.
|
|
815
|
+
.sx-select-footer {
|
|
857
816
|
min-height: 18px;
|
|
858
817
|
}
|
|
859
818
|
|
|
860
|
-
.
|
|
861
|
-
font-size: var(--
|
|
862
|
-
font-weight:
|
|
863
|
-
color:
|
|
819
|
+
.sx-select-error {
|
|
820
|
+
font-size: var(--sx-text-xs);
|
|
821
|
+
font-weight: 500;
|
|
822
|
+
color: var(--sx-color-red);
|
|
864
823
|
margin: 0;
|
|
865
824
|
}
|
|
866
825
|
|
|
867
|
-
.
|
|
868
|
-
font-size: var(--
|
|
869
|
-
color:
|
|
826
|
+
.sx-select-hint {
|
|
827
|
+
font-size: var(--sx-text-xs);
|
|
828
|
+
color: var(--sx-color-text-secondary);
|
|
870
829
|
margin: 0;
|
|
871
830
|
}
|
|
872
831
|
|
|
@@ -874,9 +833,9 @@ onMount(() => {
|
|
|
874
833
|
REDUCED MOTION
|
|
875
834
|
======================================== */
|
|
876
835
|
@media (prefers-reduced-motion: reduce) {
|
|
877
|
-
.
|
|
878
|
-
.
|
|
879
|
-
.
|
|
836
|
+
.sx-select-trigger,
|
|
837
|
+
.sx-select-option,
|
|
838
|
+
.sx-select-chevron {
|
|
880
839
|
transition: none;
|
|
881
840
|
}
|
|
882
841
|
}
|
|
@@ -47,7 +47,7 @@ interface Props {
|
|
|
47
47
|
/**
|
|
48
48
|
* Select
|
|
49
49
|
*
|
|
50
|
-
*
|
|
50
|
+
* Neo-Brutalist Dark — 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
|