diff --git a/.changeset/bright-donuts-appear.md b/.changeset/bright-donuts-appear.md new file mode 100644 index 000000000..46a84c347 --- /dev/null +++ b/.changeset/bright-donuts-appear.md @@ -0,0 +1,5 @@ +--- +'svelte-ux': patch +--- + +Fix SelectField MenuOption icons no longer being passed to MenuItems. Fix SelectField `classes: { field: ... }` not being incorporated into the inner `TextField` properly. Same with `classes: { option: ... }` not being incorporated into each inner `MenuItem` option. Update SelectField docs page with colored example that differentiates icon & input color, both in the field and the menu items. diff --git a/packages/svelte-ux/src/lib/components/SelectField.svelte b/packages/svelte-ux/src/lib/components/SelectField.svelte index 7644b21d0..a0b5f8c68 100644 --- a/packages/svelte-ux/src/lib/components/SelectField.svelte +++ b/packages/svelte-ux/src/lib/components/SelectField.svelte @@ -67,14 +67,41 @@ root?: string; field?: string | ComponentProps['classes']; options?: string; - option?: string; + option?: string | ComponentProps['classes']; selected?: string; group?: string; empty?: string; } = {}; let fieldClasses: ComponentProps['classes']; - $: fieldClasses = typeof classes.field === 'string' ? { root: classes.field } : classes.field; + $: { + let v: { root?: any } = {}; + if (typeof settingsClasses?.field === 'string') { + v = { root: settingsClasses.field }; + } else { + v = settingsClasses?.field ?? {}; + } + if (typeof classes?.field === 'string') { + fieldClasses = { ...v, root: cls(v.root, classes.field) }; + } else { + fieldClasses = { ...v, ...(classes?.field ?? {}) }; + } + } + + let optionClasses: ComponentProps['classes']; + $: { + let v: { root?: any } = {}; + if (typeof settingsClasses?.option === 'string') { + v = { root: settingsClasses.option }; + } else { + v = settingsClasses?.option ?? {}; + } + if (typeof classes?.option === 'string') { + optionClasses = { ...v, root: cls(v.root, classes.option) }; + } else { + optionClasses = { ...v, ...(classes?.option ?? {}) }; + } + } // Menu props export let placement: Placement = 'bottom-start'; @@ -425,11 +452,15 @@ on:keypress={onKeyPress} actions={fieldActions} classes={{ + ...fieldClasses, container: inlineOptions - ? 'border-none shadow-none hover:shadow-none group-focus-within:shadow-none' - : undefined, + ? cls( + 'border-none shadow-none hover:shadow-none group-focus-within:shadow-none', + fieldClasses?.container + ) + : fieldClasses?.container, }} - class={cls('h-full', settingsClasses.field, fieldClasses)} + class={cls('h-full')} role="combobox" aria-expanded={open ? 'true' : 'false'} aria-autocomplete={!inlineOptions ? 'list' : undefined} @@ -534,6 +565,7 @@ &]:bg-surface-content/5', option === selected && (classes.selected || 'font-semibold'), @@ -549,6 +581,7 @@ role="option" aria-selected={option === selected ? 'true' : 'false'} aria-disabled={option?.disabled ? 'true' : 'false'} + icon={option.icon} > {optionText(option)} @@ -594,6 +627,7 @@ &]:bg-surface-content/5', option === selected && (classes.selected || 'font-semibold'), @@ -609,6 +643,7 @@ role="option" aria-selected={option === selected ? 'true' : 'false'} aria-disabled={option?.disabled ? 'true' : 'false'} + icon={option.icon} > {optionText(option)} diff --git a/packages/svelte-ux/src/lib/components/TextField.svelte b/packages/svelte-ux/src/lib/components/TextField.svelte index 37e0da5c6..ae48a5d52 100644 --- a/packages/svelte-ux/src/lib/components/TextField.svelte +++ b/packages/svelte-ux/src/lib/components/TextField.svelte @@ -70,6 +70,7 @@ error?: string; prepend?: string; append?: string; + icon?: string; } = {}; // Input props @@ -259,7 +260,10 @@ {#if icon} - + {/if} diff --git a/packages/svelte-ux/src/lib/components/_SelectListOptions.svelte b/packages/svelte-ux/src/lib/components/_SelectListOptions.svelte index caeabf749..b0cf20297 100644 --- a/packages/svelte-ux/src/lib/components/_SelectListOptions.svelte +++ b/packages/svelte-ux/src/lib/components/_SelectListOptions.svelte @@ -24,10 +24,7 @@ export let classes: { root?: string; - option?: string; - selected?: string; group?: string; - empty?: string; } = {}; const settingsClasses = getComponentClasses('SelectField'); diff --git a/packages/svelte-ux/src/routes/docs/components/SelectField/+page.svelte b/packages/svelte-ux/src/routes/docs/components/SelectField/+page.svelte index 37554ba37..a46640361 100644 --- a/packages/svelte-ux/src/routes/docs/components/SelectField/+page.svelte +++ b/packages/svelte-ux/src/routes/docs/components/SelectField/+page.svelte @@ -15,13 +15,17 @@ import { cls } from '$lib/utils/styles'; import type { MenuOption } from '$lib/types'; - let options: MenuOption[] = [ + let graphicOptions: MenuOption[] = [ { label: 'One', value: 1, icon: mdiMagnify }, { label: 'Two', value: 2, icon: mdiPlus }, { label: 'Three', value: 3, icon: mdiPencil }, { label: 'Four', value: 4, icon: mdiAccount }, ]; + let options: MenuOption[] = graphicOptions.map((o) => { + return { ...o, icon: undefined }; + }); + const optionsWithGroup: MenuOption[] = [ { label: 'One', value: 1, group: 'First' }, { label: 'Two', value: 2, group: 'First' }, @@ -185,7 +189,7 @@

option slot with icon (field icon updates based on selected option)

- +
{option.label} @@ -371,6 +374,21 @@ +

Icon and options with icons (field icon updates based on selected option)

+ + + console.log('on:change', e.detail)} + /> + +

Rounded