diff --git a/src/lib/components/ui/element-picker/ElementPickerSegmented.svelte b/src/lib/components/ui/element-picker/ElementPickerSegmented.svelte index e3e2a22e..32979d42 100644 --- a/src/lib/components/ui/element-picker/ElementPickerSegmented.svelte +++ b/src/lib/components/ui/element-picker/ElementPickerSegmented.svelte @@ -4,7 +4,6 @@ import { ToggleGroup } from 'bits-ui' import Tooltip from '../Tooltip.svelte' import { ELEMENT_LABELS, getElementImage } from '$lib/utils/element' - import styles from './element-picker.module.scss' // Element display order: Fire(2) → Water(3) → Earth(4) → Wind(1) → Light(6) → Dark(5) const ELEMENT_DISPLAY_ORDER = [2, 3, 4, 1, 6, 5] @@ -16,6 +15,8 @@ includeAny?: boolean contained?: boolean disabled?: boolean + size?: 'small' | 'regular' + showClear?: boolean class?: string } @@ -26,9 +27,31 @@ includeAny = false, contained = false, disabled = false, + size = 'small', + showClear = false, class: className = '' }: Props = $props() + + // Check if any elements are selected + const hasSelection = $derived.by(() => { + if (multiple) { + const arr = Array.isArray(value) ? value : value !== undefined ? [value] : [] + return arr.length > 0 + } + return value !== undefined + }) + + function handleClear() { + if (multiple) { + value = [] + onValueChange?.([]) + } else { + value = undefined + onValueChange?.(undefined as any) + } + } + // Build element list based on includeAny prop const elements = $derived(includeAny ? [0, ...ELEMENT_DISPLAY_ORDER] : ELEMENT_DISPLAY_ORDER) @@ -64,54 +87,264 @@ } const containerClasses = $derived( - [styles.container, contained && styles.contained, className].filter(Boolean).join(' ') + ['container', contained && 'contained', size === 'regular' ? 'regular' : 'small', className] + .filter(Boolean) + .join(' ') ) -
- {#if multiple} - - {#each elements as element} - - {#snippet children()} - - {getLabel(element)} - - {/snippet} - - {/each} - - {:else} - - {#each elements as element} - - {#snippet children()} - - {getLabel(element)} - - {/snippet} - - {/each} - - {/if} -
+{#if showClear} +
+
+ {#if multiple} + + {#each elements as element} + + {#snippet children()} + + {getLabel(element)} + + {/snippet} + + {/each} + + {:else} + + {#each elements as element} + + {#snippet children()} + + {getLabel(element)} + + {/snippet} + + {/each} + + {/if} +
+ {#if hasSelection} + + {/if} +
+{:else} +
+ {#if multiple} + + {#each elements as element} + + {#snippet children()} + + {getLabel(element)} + + {/snippet} + + {/each} + + {:else} + + {#each elements as element} + + {#snippet children()} + + {getLabel(element)} + + {/snippet} + + {/each} + + {/if} +
+{/if} + + diff --git a/src/lib/components/ui/element-picker/element-picker.module.scss b/src/lib/components/ui/element-picker/element-picker.module.scss deleted file mode 100644 index 69500fdc..00000000 --- a/src/lib/components/ui/element-picker/element-picker.module.scss +++ /dev/null @@ -1,51 +0,0 @@ -@use '$src/themes/spacing' as *; -@use '$src/themes/layout' as *; -@use '$src/themes/effects' as *; -@use '$src/themes/colors' as *; - -.container { - display: inline-flex; - border-radius: $full-corner; - padding: $unit-half; - - &.contained { - background-color: var(--segmented-control-background-bg); - } -} - -.group { - display: flex; - gap: $unit-half; - align-items: center; -} - -.item { - all: unset; - cursor: pointer; - border-radius: $full-corner; - padding: $unit-half; - @include smooth-transition($duration-quick, background-color, opacity); - - &:hover:not(:disabled) { - background-color: var(--option-bg-hover); - } - - &:focus-visible { - @include focus-ring($blue); - } - - &[data-state='on'] { - background-color: var(--accent-subtle-bg); - } - - &:disabled { - opacity: 0.5; - cursor: not-allowed; - } -} - -.image { - width: $unit-3x; - height: $unit-3x; - display: block; -}