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()}
-
-
-
- {/snippet}
-
- {/each}
-
- {:else}
-
- {#each elements as element}
-
- {#snippet children()}
-
-
-
- {/snippet}
-
- {/each}
-
- {/if}
-
+{#if showClear}
+
+
+ {#if multiple}
+
+ {#each elements as element}
+
+ {#snippet children()}
+
+
+
+ {/snippet}
+
+ {/each}
+
+ {:else}
+
+ {#each elements as element}
+
+ {#snippet children()}
+
+
+
+ {/snippet}
+
+ {/each}
+
+ {/if}
+
+ {#if hasSelection}
+
+ {/if}
+
+{:else}
+
+ {#if multiple}
+
+ {#each elements as element}
+
+ {#snippet children()}
+
+
+
+ {/snippet}
+
+ {/each}
+
+ {:else}
+
+ {#each elements as element}
+
+ {#snippet children()}
+
+
+
+ {/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;
-}