@smilodon/svelte 1.1.1 → 1.4.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 +43 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +58 -41
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -22,6 +22,32 @@ The complete guide includes:
|
|
|
22
22
|
|
|
23
23
|
## Features
|
|
24
24
|
|
|
25
|
+
- New: `optionRenderer` prop (Option B) lets you return an `HTMLElement` for custom DOM-driven option layouts.
|
|
26
|
+
|
|
27
|
+
### Advanced scenarios (Svelte)
|
|
28
|
+
- **A11y-first**:
|
|
29
|
+
```svelte
|
|
30
|
+
<label id="city-label" for="city-picker">City</label>
|
|
31
|
+
<Select id="city-picker" aria-labelledby="city-label" />
|
|
32
|
+
```
|
|
33
|
+
- **Server-side lookup**:
|
|
34
|
+
```svelte
|
|
35
|
+
<Select bind:this={picker} searchable on:search={(e) => load(e.detail.query)} />
|
|
36
|
+
|
|
37
|
+
async function load(q) {
|
|
38
|
+
const res = await fetch(`/api/cities?q=${encodeURIComponent(q)}`);
|
|
39
|
+
const items = await res.json();
|
|
40
|
+
picker?.setItems(items);
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
- **Heavy lists (100k+)**:
|
|
44
|
+
```svelte
|
|
45
|
+
<Select {items} virtualized estimatedItemHeight={44} />
|
|
46
|
+
<script>
|
|
47
|
+
export let items = Array.from({ length: 100_000 }, (_, i) => ({ value: i, label: `Item ${i}` }));
|
|
48
|
+
</script>
|
|
49
|
+
```
|
|
50
|
+
|
|
25
51
|
- ✨ **Single & Multi-Select** - Choose one or multiple options
|
|
26
52
|
- 🔍 **Searchable** - Filter options with built-in or custom search
|
|
27
53
|
- ♿ **Fully Accessible** - WCAG 2.1 AAA compliant
|
|
@@ -908,6 +934,23 @@ enhanced-select {
|
|
|
908
934
|
}
|
|
909
935
|
```
|
|
910
936
|
|
|
937
|
+
### Important: Passing inline functions as renderers
|
|
938
|
+
|
|
939
|
+
If you define `optionRenderer` or `customRenderer` inline (like function inside template), it may cause unnecessary re-creation.
|
|
940
|
+
|
|
941
|
+
**Highly recommended:** For best performance and to avoid potential issues, always use stable function references:
|
|
942
|
+
|
|
943
|
+
```svelte
|
|
944
|
+
<script>
|
|
945
|
+
let myRenderer = (item, index, helpers) => {
|
|
946
|
+
return document.createElement('div');
|
|
947
|
+
};
|
|
948
|
+
// or define outside reactive blocks
|
|
949
|
+
</script>
|
|
950
|
+
```
|
|
951
|
+
|
|
952
|
+
Adapters are designed to not loop even without memoization, but stability still improves performance.
|
|
953
|
+
|
|
911
954
|
## Accessibility
|
|
912
955
|
|
|
913
956
|
This component is fully accessible and compliant with WCAG 2.1 AAA standards:
|
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("svelte/internal"),t=require("svelte");function
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("svelte/internal"),t=require("svelte");function n(t){let n;return{c(){n=e.element("enhanced-select"),e.set_custom_element_data(n,"class",t[0]),e.set_custom_element_data(n,"style",t[1])},m(i,r){e.insert(i,n,r),t[28](n)},p(t,i){1&i[0]&&e.set_custom_element_data(n,"class",t[0]),2&i[0]&&e.set_custom_element_data(n,"style",t[1])},i:e.noop,o:e.noop,d(i){i&&e.detach(n),t[28](null)}}}function i(n,i,r){let s,l,{items:o=[]}=i,{groupedItems:a}=i,{value:u}=i,{defaultValue:d}=i,{multiple:c=!1}=i,{searchable:m=!1}=i,{placeholder:p=""}=i,{disabled:v=!1}=i,{required:b=!1}=i,{error:f=!1}=i,{infiniteScroll:h=!1}=i,{pageSize:g=50}=i,{virtualized:$=!0}=i,{maxSelections:A}=i,{placement:y="auto"}=i,{className:S=""}=i,{style:_=""}=i,{optionRenderer:I}=i;const x=t.createEventDispatcher();let E,L=d;const z=(e,t,n)=>I?I(e,t,n):document.createElement("div");function q(e){const t=e,{item:n,index:i}=t.detail;x("select",{item:n,index:i})}function R(e){const t=e,{selectedItems:n,selectedValues:i}=t.detail,l=i;s||r(25,L=c?l:l[0]);const o=c?l:l[0];r(3,u=o),x("change",{value:o,selectedItems:n})}function V(){x("open")}function w(){x("close")}function G(e){x("search",{query:e.detail.query})}function M(e){x("loadMore",{page:e.detail.page})}function N(e){x("create",{value:e.detail.value})}return t.onMount(()=>{if(!E)return;const e=E;if(p&&e.setAttribute("placeholder",p),v&&e.setAttribute("disabled",""),b&&e.setAttribute("required",""),f&&e.setAttribute("error",""),m&&e.setAttribute("searchable",""),c&&e.setAttribute("multiple",""),$&&e.setAttribute("virtualized",""),h&&e.setAttribute("infinite-scroll",""),g&&e.setAttribute("page-size",String(g)),A&&e.setAttribute("max-selections",String(A)),y&&e.setAttribute("placement",y),I&&(e.optionRenderer=z),(null==o?void 0:o.length)&&e.setItems(o),(null==a?void 0:a.length)&&e.setGroupedItems(a),void 0!==l){const t=Array.isArray(l)?l:[l];e.setSelectedValues(t)}e.addEventListener("select",q),e.addEventListener("change",R),e.addEventListener("open",V),e.addEventListener("close",w),e.addEventListener("search",G),e.addEventListener("loadMore",M),e.addEventListener("create",N)}),t.onDestroy(()=>{if(!E)return;const e=E;e.removeEventListener("select",q),e.removeEventListener("change",R),e.removeEventListener("open",V),e.removeEventListener("close",w),e.removeEventListener("search",G),e.removeEventListener("loadMore",M),e.removeEventListener("create",N)}),n.$$set=e=>{"items"in e&&r(4,o=e.items),"groupedItems"in e&&r(5,a=e.groupedItems),"value"in e&&r(3,u=e.value),"defaultValue"in e&&r(6,d=e.defaultValue),"multiple"in e&&r(7,c=e.multiple),"searchable"in e&&r(8,m=e.searchable),"placeholder"in e&&r(9,p=e.placeholder),"disabled"in e&&r(10,v=e.disabled),"required"in e&&r(11,b=e.required),"error"in e&&r(12,f=e.error),"infiniteScroll"in e&&r(13,h=e.infiniteScroll),"pageSize"in e&&r(14,g=e.pageSize),"virtualized"in e&&r(15,$=e.virtualized),"maxSelections"in e&&r(16,A=e.maxSelections),"placement"in e&&r(17,y=e.placement),"className"in e&&r(0,S=e.className),"style"in e&&r(1,_=e.style),"optionRenderer"in e&&r(18,I=e.optionRenderer)},n.$$.update=()=>{if(8&n.$$.dirty[0]&&r(26,s=void 0!==u),100663304&n.$$.dirty[0]&&r(27,l=s?u:L),296836&n.$$.dirty[0]&&E&&(p&&E.setAttribute("placeholder",p),v?E.setAttribute("disabled",""):E.removeAttribute("disabled"),m?E.setAttribute("searchable",""):E.removeAttribute("searchable"),c?E.setAttribute("multiple",""):E.removeAttribute("multiple"),$?E.setAttribute("virtualized",""):E.removeAttribute("virtualized"),I?E.optionRenderer!==z&&r(2,E.optionRenderer=z,E):E.optionRenderer===z&&r(2,E.optionRenderer=void 0,E)),20&n.$$.dirty[0]&&E&&o&&E.setItems(o),36&n.$$.dirty[0]&&E&&a&&E.setGroupedItems(a),134217732&n.$$.dirty[0]&&E&&void 0!==l){const e=Array.isArray(l)?l:[l];E.setSelectedValues(e)}},[S,_,E,u,o,a,d,c,m,p,v,b,f,h,g,$,A,y,I,function(){null==E||E.open()},function(){null==E||E.close()},function(){null==E||E.focus()},function(e){null==E||E.setItems(e)},function(e){null==E||E.setGroupedItems(e)},function(){null==E||E.setSelectedValues([]),s||r(25,L=c?[]:void 0);const e=c?[]:"";r(3,u=e),x("change",{value:e,selectedItems:[]})},L,s,l,function(t){e.binding_callbacks[t?"unshift":"push"](()=>{E=t,r(2,E),r(9,p),r(10,v),r(8,m),r(7,c),r(15,$),r(18,I)})}]}"undefined"!=typeof window&&(window.__svelte||(window.__svelte={v:new Set})).v.add("4");class r extends e.SvelteComponent{constructor(t){super(),e.init(this,t,i,n,e.safe_not_equal,{items:4,groupedItems:5,value:3,defaultValue:6,multiple:7,searchable:8,placeholder:9,disabled:10,required:11,error:12,infiniteScroll:13,pageSize:14,virtualized:15,maxSelections:16,placement:17,className:0,style:1,optionRenderer:18,open:19,close:20,focus:21,setItems:22,setGroupedItems:23,clear:24},null,[-1,-1])}get open(){return this.$$.ctx[19]}get close(){return this.$$.ctx[20]}get focus(){return this.$$.ctx[21]}get setItems(){return this.$$.ctx[22]}get setGroupedItems(){return this.$$.ctx[23]}get clear(){return this.$$.ctx[24]}}exports.Select=r;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/Select.svelte","../../../node_modules/svelte/src/runtime/internal/disclose-version/index.js","../../../node_modules/svelte/src/shared/version.js"],"sourcesContent":["<!--\n Smilodon Select Component for Svelte\n \n A production-ready, accessible select component with advanced features:\n - Single and multi-select modes\n - Searchable with client or server-side filtering\n - Infinite scroll and virtual scrolling for large datasets\n - Grouped options\n - Custom rendering\n - Full keyboard navigation\n - WCAG 2.1 AAA compliant\n \n @example\n <Select\n {items}\n bind:value={selectedValue}\n searchable\n placeholder=\"Select an option...\"\n />\n-->\n\n<script lang=\"ts\">\n import { onMount, onDestroy, createEventDispatcher } from 'svelte';\n import type {\n SelectEventDetail,\n OpenEventDetail,\n CloseEventDetail,\n SearchEventDetail,\n ChangeEventDetail,\n LoadMoreEventDetail,\n GroupedItem,\n } from '@smilodon/core';\n\n export interface SelectItem {\n value: string | number;\n label: string;\n disabled?: boolean;\n group?: string;\n [key: string]: any;\n }\n\n // Props\n export let items: SelectItem[] = [];\n export let groupedItems: GroupedItem[] | undefined = undefined;\n export let value: string | number | (string | number)[] | undefined = undefined;\n export let defaultValue: string | number | (string | number)[] | undefined = undefined;\n export let multiple: boolean = false;\n export let searchable: boolean = false;\n export let placeholder: string = '';\n export let disabled: boolean = false;\n export let required: boolean = false;\n export let error: boolean = false;\n export let infiniteScroll: boolean = false;\n export let pageSize: number = 50;\n export let virtualized: boolean = true;\n export let maxSelections: number | undefined = undefined;\n export let placement: 'bottom' | 'top' | 'auto' = 'auto';\n export let className: string = '';\n export let style: string = '';\n\n const dispatch = createEventDispatcher<{\n change: { value: string | number | (string | number)[]; selectedItems: SelectItem[] };\n select: { item: SelectItem; index: number };\n open: void;\n close: void;\n search: { query: string };\n loadMore: { page: number };\n create: { value: string };\n }>();\n\n let selectRef: HTMLElement;\n let internalValue: string | number | (string | number)[] | undefined = defaultValue;\n\n // Check if component is controlled\n $: isControlled = value !== undefined;\n $: currentValue = isControlled ? value : internalValue;\n\n // Event handlers\n function handleSelect(e: Event) {\n const customEvent = e as CustomEvent<SelectEventDetail>;\n const { item, index } = customEvent.detail;\n dispatch('select', { item: item as SelectItem, index });\n }\n\n function handleChange(e: Event) {\n const customEvent = e as CustomEvent<ChangeEventDetail>;\n const { selectedItems, selectedValues } = customEvent.detail;\n\n const values = selectedValues as (string | number)[];\n\n // Update internal value in uncontrolled mode\n if (!isControlled) {\n internalValue = multiple ? values : values[0];\n }\n\n // Emit change event\n const newValue = multiple ? values : values[0];\n value = newValue; // Update binding\n dispatch('change', { value: newValue, selectedItems: selectedItems as SelectItem[] });\n }\n\n function handleOpen() {\n dispatch('open');\n }\n\n function handleClose() {\n dispatch('close');\n }\n\n function handleSearch(e: Event) {\n const customEvent = e as CustomEvent<SearchEventDetail>;\n dispatch('search', { query: customEvent.detail.query });\n }\n\n function handleLoadMore(e: Event) {\n const customEvent = e as CustomEvent<LoadMoreEventDetail>;\n dispatch('loadMore', { page: customEvent.detail.page });\n }\n\n function handleCreate(e: Event) {\n const customEvent = e as CustomEvent<{ value: string }>;\n dispatch('create', { value: customEvent.detail.value });\n }\n\n onMount(() => {\n if (!selectRef) return;\n\n const element = selectRef;\n\n // Set initial attributes\n if (placeholder) element.setAttribute('placeholder', placeholder);\n if (disabled) element.setAttribute('disabled', '');\n if (required) element.setAttribute('required', '');\n if (error) element.setAttribute('error', '');\n if (searchable) element.setAttribute('searchable', '');\n if (multiple) element.setAttribute('multiple', '');\n if (virtualized) element.setAttribute('virtualized', '');\n if (infiniteScroll) element.setAttribute('infinite-scroll', '');\n if (pageSize) element.setAttribute('page-size', String(pageSize));\n if (maxSelections) element.setAttribute('max-selections', String(maxSelections));\n if (placement) element.setAttribute('placement', placement);\n\n // Set initial items\n if (items?.length) {\n (element as any).setItems(items);\n }\n if (groupedItems?.length) {\n (element as any).setGroupedItems(groupedItems);\n }\n\n // Set initial value\n if (currentValue !== undefined) {\n const values = Array.isArray(currentValue) ? currentValue : [currentValue];\n (element as any).setSelectedValues(values);\n }\n\n // Add event listeners\n element.addEventListener('select', handleSelect as EventListener);\n element.addEventListener('change', handleChange as EventListener);\n element.addEventListener('open', handleOpen as EventListener);\n element.addEventListener('close', handleClose as EventListener);\n element.addEventListener('search', handleSearch as EventListener);\n element.addEventListener('loadMore', handleLoadMore as EventListener);\n element.addEventListener('create', handleCreate as EventListener);\n });\n\n onDestroy(() => {\n if (!selectRef) return;\n\n const element = selectRef;\n\n // Remove event listeners\n element.removeEventListener('select', handleSelect as EventListener);\n element.removeEventListener('change', handleChange as EventListener);\n element.removeEventListener('open', handleOpen as EventListener);\n element.removeEventListener('close', handleClose as EventListener);\n element.removeEventListener('search', handleSearch as EventListener);\n element.removeEventListener('loadMore', handleLoadMore as EventListener);\n element.removeEventListener('create', handleCreate as EventListener);\n });\n\n // Reactive updates\n $: if (selectRef && items) {\n (selectRef as any).setItems(items);\n }\n\n $: if (selectRef && groupedItems) {\n (selectRef as any).setGroupedItems(groupedItems);\n }\n\n $: if (selectRef && currentValue !== undefined) {\n const values = Array.isArray(currentValue) ? currentValue : [currentValue];\n (selectRef as any).setSelectedValues(values);\n }\n\n $: if (selectRef) {\n if (placeholder) selectRef.setAttribute('placeholder', placeholder);\n if (disabled) {\n selectRef.setAttribute('disabled', '');\n } else {\n selectRef.removeAttribute('disabled');\n }\n if (searchable) {\n selectRef.setAttribute('searchable', '');\n } else {\n selectRef.removeAttribute('searchable');\n }\n if (multiple) {\n selectRef.setAttribute('multiple', '');\n } else {\n selectRef.removeAttribute('multiple');\n }\n if (virtualized) {\n selectRef.setAttribute('virtualized', '');\n } else {\n selectRef.removeAttribute('virtualized');\n }\n }\n\n // Public methods\n export function open() {\n (selectRef as any)?.open();\n }\n\n export function close() {\n (selectRef as any)?.close();\n }\n\n export function focus() {\n selectRef?.focus();\n }\n\n export function setItems(newItems: SelectItem[]) {\n (selectRef as any)?.setItems(newItems);\n }\n\n export function setGroupedItems(groups: GroupedItem[]) {\n (selectRef as any)?.setGroupedItems(groups);\n }\n\n export function clear() {\n (selectRef as any)?.setSelectedValues([]);\n if (!isControlled) {\n internalValue = multiple ? [] : undefined;\n }\n const newValue = multiple ? [] : '';\n value = newValue as any;\n dispatch('change', { value: newValue as any, selectedItems: [] });\n }\n</script>\n\n<enhanced-select\n bind:this={selectRef}\n class={className}\n {style}\n/>\n\n<style>\n /* Component uses web component styling from @smilodon/core */\n</style>\n","import { PUBLIC_VERSION } from '../../../shared/version.js';\n\nif (typeof window !== 'undefined')\n\t// @ts-ignore\n\t(window.__svelte || (window.__svelte = { v: new Set() })).v.add(PUBLIC_VERSION);\n","// generated during release, do not modify\n\n/**\n * The current version, as set in package.json.\n *\n * https://svelte.dev/docs/svelte-compiler#svelte-version\n * @type {string}\n */\nexport const VERSION = '4.2.20';\nexport const PUBLIC_VERSION = '4';\n"],"names":["ctx","insert","target","enhanced_select","anchor","items","$$props","groupedItems","value","defaultValue","multiple","searchable","placeholder","disabled","required","error","infiniteScroll","pageSize","virtualized","maxSelections","placement","className","style","dispatch","createEventDispatcher","selectRef","internalValue","handleSelect","e","customEvent","item","index","detail","handleChange","selectedItems","selectedValues","values","isControlled","newValue","handleOpen","handleClose","handleSearch","query","handleLoadMore","page","handleCreate","onMount","element","setAttribute","String","length","setItems","setGroupedItems","currentValue","Array","isArray","setSelectedValues","addEventListener","onDestroy","removeEventListener","$$invalidate","removeAttribute","open","close","focus","newItems","groups","$$value","window","__svelte","v","Set","add"],"mappings":"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","x_google_ignoreList":[1,2]}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/Select.svelte","../../../node_modules/svelte/src/runtime/internal/disclose-version/index.js","../../../node_modules/svelte/src/shared/version.js"],"sourcesContent":["<!--\n Smilodon Select Component for Svelte\n \n A production-ready, accessible select component with advanced features:\n - Single and multi-select modes\n - Searchable with client or server-side filtering\n - Infinite scroll and virtual scrolling for large datasets\n - Grouped options\n - Custom rendering\n - Full keyboard navigation\n - WCAG 2.1 AAA compliant\n \n @example\n <Select\n {items}\n bind:value={selectedValue}\n searchable\n placeholder=\"Select an option...\"\n />\n-->\n\n<script lang=\"ts\" context=\"module\">\n export interface SelectItem {\n value: string | number;\n label: string;\n disabled?: boolean;\n group?: string;\n [key: string]: any;\n }\n</script>\n\n<script lang=\"ts\">\n import { onMount, onDestroy, createEventDispatcher } from 'svelte';\n import type {\n SelectEventDetail,\n OpenEventDetail,\n CloseEventDetail,\n SearchEventDetail,\n ChangeEventDetail,\n LoadMoreEventDetail,\n GroupedItem,\n } from '@smilodon/core';\n\n // Props\n export let items: SelectItem[] = [];\n export let groupedItems: GroupedItem[] | undefined = undefined;\n export let value: string | number | (string | number)[] | undefined = undefined;\n export let defaultValue: string | number | (string | number)[] | undefined = undefined;\n export let multiple: boolean = false;\n export let searchable: boolean = false;\n export let placeholder: string = '';\n export let disabled: boolean = false;\n export let required: boolean = false;\n export let error: boolean = false;\n export let infiniteScroll: boolean = false;\n export let pageSize: number = 50;\n export let virtualized: boolean = true;\n export let maxSelections: number | undefined = undefined;\n export let placement: 'bottom' | 'top' | 'auto' = 'auto';\n export let className: string = '';\n export let style: string = '';\n export let optionRenderer: ((item: SelectItem, index: number, helpers: any) => HTMLElement) | undefined = undefined;\n\n const dispatch = createEventDispatcher<{\n change: { value: string | number | (string | number)[]; selectedItems: SelectItem[] };\n select: { item: SelectItem; index: number };\n open: void;\n close: void;\n search: { query: string };\n loadMore: { page: number };\n create: { value: string };\n }>();\n\n let selectRef: HTMLElement;\n let internalValue: string | number | (string | number)[] | undefined = defaultValue;\n\n // Stable wrapper to handle optionRenderer updates without triggering infinite loops\n const resolvedOptionRenderer = (item: SelectItem, index: number, helpers: any) => {\n return optionRenderer ? optionRenderer(item, index, helpers) : document.createElement('div');\n };\n\n // Check if component is controlled\n $: isControlled = value !== undefined;\n $: currentValue = isControlled ? value : internalValue;\n\n // Event handlers\n function handleSelect(e: Event) {\n const customEvent = e as CustomEvent<SelectEventDetail>;\n const { item, index } = customEvent.detail;\n dispatch('select', { item: item as SelectItem, index });\n }\n\n function handleChange(e: Event) {\n const customEvent = e as CustomEvent<ChangeEventDetail>;\n const { selectedItems, selectedValues } = customEvent.detail;\n\n const values = selectedValues as (string | number)[];\n\n // Update internal value in uncontrolled mode\n if (!isControlled) {\n internalValue = multiple ? values : values[0];\n }\n\n // Emit change event\n const newValue = multiple ? values : values[0];\n value = newValue; // Update binding\n dispatch('change', { value: newValue, selectedItems: selectedItems as SelectItem[] });\n }\n\n function handleOpen() {\n dispatch('open');\n }\n\n function handleClose() {\n dispatch('close');\n }\n\n function handleSearch(e: Event) {\n const customEvent = e as CustomEvent<SearchEventDetail>;\n dispatch('search', { query: customEvent.detail.query });\n }\n\n function handleLoadMore(e: Event) {\n const customEvent = e as CustomEvent<LoadMoreEventDetail>;\n dispatch('loadMore', { page: customEvent.detail.page });\n }\n\n function handleCreate(e: Event) {\n const customEvent = e as CustomEvent<{ value: string }>;\n dispatch('create', { value: customEvent.detail.value });\n }\n\n onMount(() => {\n if (!selectRef) return;\n\n const element = selectRef;\n\n // Set initial attributes\n if (placeholder) element.setAttribute('placeholder', placeholder);\n if (disabled) element.setAttribute('disabled', '');\n if (required) element.setAttribute('required', '');\n if (error) element.setAttribute('error', '');\n if (searchable) element.setAttribute('searchable', '');\n if (multiple) element.setAttribute('multiple', '');\n if (virtualized) element.setAttribute('virtualized', '');\n if (infiniteScroll) element.setAttribute('infinite-scroll', '');\n if (pageSize) element.setAttribute('page-size', String(pageSize));\n if (maxSelections) element.setAttribute('max-selections', String(maxSelections));\n if (placement) element.setAttribute('placement', placement);\n\n if (optionRenderer) {\n (element as any).optionRenderer = resolvedOptionRenderer;\n }\n\n // Set initial items\n if (items?.length) {\n (element as any).setItems(items);\n }\n if (groupedItems?.length) {\n (element as any).setGroupedItems(groupedItems);\n }\n\n // Set initial value\n if (currentValue !== undefined) {\n const values = Array.isArray(currentValue) ? currentValue : [currentValue];\n (element as any).setSelectedValues(values);\n }\n\n // Add event listeners\n element.addEventListener('select', handleSelect as EventListener);\n element.addEventListener('change', handleChange as EventListener);\n element.addEventListener('open', handleOpen as EventListener);\n element.addEventListener('close', handleClose as EventListener);\n element.addEventListener('search', handleSearch as EventListener);\n element.addEventListener('loadMore', handleLoadMore as EventListener);\n element.addEventListener('create', handleCreate as EventListener);\n });\n\n onDestroy(() => {\n if (!selectRef) return;\n\n const element = selectRef;\n\n // Remove event listeners\n element.removeEventListener('select', handleSelect as EventListener);\n element.removeEventListener('change', handleChange as EventListener);\n element.removeEventListener('open', handleOpen as EventListener);\n element.removeEventListener('close', handleClose as EventListener);\n element.removeEventListener('search', handleSearch as EventListener);\n element.removeEventListener('loadMore', handleLoadMore as EventListener);\n element.removeEventListener('create', handleCreate as EventListener);\n });\n\n // Reactive updates\n $: if (selectRef && items) {\n (selectRef as any).setItems(items);\n }\n\n $: if (selectRef && groupedItems) {\n (selectRef as any).setGroupedItems(groupedItems);\n }\n\n $: if (selectRef && currentValue !== undefined) {\n const values = Array.isArray(currentValue) ? currentValue : [currentValue];\n (selectRef as any).setSelectedValues(values);\n }\n\n $: if (selectRef) {\n if (placeholder) selectRef.setAttribute('placeholder', placeholder);\n if (disabled) {\n selectRef.setAttribute('disabled', '');\n } else {\n selectRef.removeAttribute('disabled');\n }\n if (searchable) {\n selectRef.setAttribute('searchable', '');\n } else {\n selectRef.removeAttribute('searchable');\n }\n if (multiple) {\n selectRef.setAttribute('multiple', '');\n } else {\n selectRef.removeAttribute('multiple');\n }\n if (virtualized) {\n selectRef.setAttribute('virtualized', '');\n } else {\n selectRef.removeAttribute('virtualized');\n }\n\n if (optionRenderer) {\n if ((selectRef as any).optionRenderer !== resolvedOptionRenderer) {\n (selectRef as any).optionRenderer = resolvedOptionRenderer;\n }\n } else if ((selectRef as any).optionRenderer === resolvedOptionRenderer) {\n (selectRef as any).optionRenderer = undefined;\n }\n }\n\n // Public methods\n export function open() {\n (selectRef as any)?.open();\n }\n\n export function close() {\n (selectRef as any)?.close();\n }\n\n export function focus() {\n selectRef?.focus();\n }\n\n export function setItems(newItems: SelectItem[]) {\n (selectRef as any)?.setItems(newItems);\n }\n\n export function setGroupedItems(groups: GroupedItem[]) {\n (selectRef as any)?.setGroupedItems(groups);\n }\n\n export function clear() {\n (selectRef as any)?.setSelectedValues([]);\n if (!isControlled) {\n internalValue = multiple ? [] : undefined;\n }\n const newValue = multiple ? [] : '';\n value = newValue as any;\n dispatch('change', { value: newValue as any, selectedItems: [] });\n }\n</script>\n\n<enhanced-select\n bind:this={selectRef}\n class={className}\n {style}\n/>\n\n<style>\n /* Component uses web component styling from @smilodon/core */\n</style>\n","import { PUBLIC_VERSION } from '../../../shared/version.js';\n\nif (typeof window !== 'undefined')\n\t// @ts-ignore\n\t(window.__svelte || (window.__svelte = { v: new Set() })).v.add(PUBLIC_VERSION);\n","// generated during release, do not modify\n\n/**\n * The current version, as set in package.json.\n *\n * https://svelte.dev/docs/svelte-compiler#svelte-version\n * @type {string}\n */\nexport const VERSION = '4.2.20';\nexport const PUBLIC_VERSION = '4';\n"],"names":["ctx","insert","target","enhanced_select","anchor","items","$$props","groupedItems","value","defaultValue","multiple","searchable","placeholder","disabled","required","error","infiniteScroll","pageSize","virtualized","maxSelections","placement","className","style","optionRenderer","dispatch","createEventDispatcher","selectRef","internalValue","resolvedOptionRenderer","item","index","helpers","document","createElement","handleSelect","e","customEvent","detail","handleChange","selectedItems","selectedValues","values","isControlled","newValue","handleOpen","handleClose","handleSearch","query","handleLoadMore","page","handleCreate","onMount","element","setAttribute","String","length","setItems","setGroupedItems","currentValue","Array","isArray","setSelectedValues","addEventListener","onDestroy","removeEventListener","$$invalidate","removeAttribute","open","close","focus","newItems","groups","$$value","window","__svelte","v","Set","add"],"mappings":"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","x_google_ignoreList":[1,2]}
|
package/dist/index.mjs
CHANGED
|
@@ -23,7 +23,7 @@ function create_fragment(ctx) {
|
|
|
23
23
|
},
|
|
24
24
|
m(target, anchor) {
|
|
25
25
|
insert(target, enhanced_select, anchor);
|
|
26
|
-
ctx[
|
|
26
|
+
ctx[28](enhanced_select);
|
|
27
27
|
},
|
|
28
28
|
p(ctx2, dirty) {
|
|
29
29
|
if (dirty[0] & /*className*/
|
|
@@ -51,7 +51,7 @@ function create_fragment(ctx) {
|
|
|
51
51
|
if (detaching) {
|
|
52
52
|
detach(enhanced_select);
|
|
53
53
|
}
|
|
54
|
-
ctx[
|
|
54
|
+
ctx[28](null);
|
|
55
55
|
}
|
|
56
56
|
};
|
|
57
57
|
}
|
|
@@ -75,9 +75,13 @@ function instance($$self, $$props, $$invalidate) {
|
|
|
75
75
|
let { placement = "auto" } = $$props;
|
|
76
76
|
let { className = "" } = $$props;
|
|
77
77
|
let { style = "" } = $$props;
|
|
78
|
+
let { optionRenderer = void 0 } = $$props;
|
|
78
79
|
const dispatch = createEventDispatcher();
|
|
79
80
|
let selectRef;
|
|
80
81
|
let internalValue = defaultValue;
|
|
82
|
+
const resolvedOptionRenderer = (item, index, helpers) => {
|
|
83
|
+
return optionRenderer ? optionRenderer(item, index, helpers) : document.createElement("div");
|
|
84
|
+
};
|
|
81
85
|
function handleSelect(e) {
|
|
82
86
|
const customEvent = e;
|
|
83
87
|
const { item, index } = customEvent.detail;
|
|
@@ -88,7 +92,7 @@ function instance($$self, $$props, $$invalidate) {
|
|
|
88
92
|
const { selectedItems, selectedValues } = customEvent.detail;
|
|
89
93
|
const values = selectedValues;
|
|
90
94
|
if (!isControlled) {
|
|
91
|
-
$$invalidate(
|
|
95
|
+
$$invalidate(25, internalValue = multiple ? values : values[0]);
|
|
92
96
|
}
|
|
93
97
|
const newValue = multiple ? values : values[0];
|
|
94
98
|
$$invalidate(3, value = newValue);
|
|
@@ -126,6 +130,9 @@ function instance($$self, $$props, $$invalidate) {
|
|
|
126
130
|
if (pageSize) element2.setAttribute("page-size", String(pageSize));
|
|
127
131
|
if (maxSelections) element2.setAttribute("max-selections", String(maxSelections));
|
|
128
132
|
if (placement) element2.setAttribute("placement", placement);
|
|
133
|
+
if (optionRenderer) {
|
|
134
|
+
element2.optionRenderer = resolvedOptionRenderer;
|
|
135
|
+
}
|
|
129
136
|
if (items == null ? void 0 : items.length) {
|
|
130
137
|
element2.setItems(items);
|
|
131
138
|
}
|
|
@@ -173,7 +180,7 @@ function instance($$self, $$props, $$invalidate) {
|
|
|
173
180
|
function clear() {
|
|
174
181
|
selectRef == null ? void 0 : selectRef.setSelectedValues([]);
|
|
175
182
|
if (!isControlled) {
|
|
176
|
-
$$invalidate(
|
|
183
|
+
$$invalidate(25, internalValue = multiple ? [] : void 0);
|
|
177
184
|
}
|
|
178
185
|
const newValue = multiple ? [] : "";
|
|
179
186
|
$$invalidate(3, value = newValue);
|
|
@@ -182,7 +189,7 @@ function instance($$self, $$props, $$invalidate) {
|
|
|
182
189
|
function enhanced_select_binding($$value) {
|
|
183
190
|
binding_callbacks[$$value ? "unshift" : "push"](() => {
|
|
184
191
|
selectRef = $$value;
|
|
185
|
-
$$invalidate(2, selectRef);
|
|
192
|
+
$$invalidate(2, selectRef), $$invalidate(9, placeholder), $$invalidate(10, disabled), $$invalidate(8, searchable), $$invalidate(7, multiple), $$invalidate(15, virtualized), $$invalidate(18, optionRenderer);
|
|
186
193
|
});
|
|
187
194
|
}
|
|
188
195
|
$$self.$$set = ($$props2) => {
|
|
@@ -203,37 +210,19 @@ function instance($$self, $$props, $$invalidate) {
|
|
|
203
210
|
if ("placement" in $$props2) $$invalidate(17, placement = $$props2.placement);
|
|
204
211
|
if ("className" in $$props2) $$invalidate(0, className = $$props2.className);
|
|
205
212
|
if ("style" in $$props2) $$invalidate(1, style = $$props2.style);
|
|
213
|
+
if ("optionRenderer" in $$props2) $$invalidate(18, optionRenderer = $$props2.optionRenderer);
|
|
206
214
|
};
|
|
207
215
|
$$self.$$.update = () => {
|
|
208
216
|
if ($$self.$$.dirty[0] & /*value*/
|
|
209
217
|
8) {
|
|
210
|
-
$$invalidate(
|
|
218
|
+
$$invalidate(26, isControlled = value !== void 0);
|
|
211
219
|
}
|
|
212
220
|
if ($$self.$$.dirty[0] & /*isControlled, value, internalValue*/
|
|
213
|
-
|
|
214
|
-
$$invalidate(
|
|
221
|
+
100663304) {
|
|
222
|
+
$$invalidate(27, currentValue = isControlled ? value : internalValue);
|
|
215
223
|
}
|
|
216
|
-
if ($$self.$$.dirty[0] & /*selectRef,
|
|
217
|
-
|
|
218
|
-
if (selectRef && items) {
|
|
219
|
-
selectRef.setItems(items);
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
if ($$self.$$.dirty[0] & /*selectRef, groupedItems*/
|
|
223
|
-
36) {
|
|
224
|
-
if (selectRef && groupedItems) {
|
|
225
|
-
selectRef.setGroupedItems(groupedItems);
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
if ($$self.$$.dirty[0] & /*selectRef, currentValue*/
|
|
229
|
-
67108868) {
|
|
230
|
-
if (selectRef && currentValue !== void 0) {
|
|
231
|
-
const values = Array.isArray(currentValue) ? currentValue : [currentValue];
|
|
232
|
-
selectRef.setSelectedValues(values);
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
if ($$self.$$.dirty[0] & /*selectRef, placeholder, disabled, searchable, multiple, virtualized*/
|
|
236
|
-
34692) {
|
|
224
|
+
if ($$self.$$.dirty[0] & /*selectRef, placeholder, disabled, searchable, multiple, virtualized, optionRenderer*/
|
|
225
|
+
296836) {
|
|
237
226
|
if (selectRef) {
|
|
238
227
|
if (placeholder) selectRef.setAttribute("placeholder", placeholder);
|
|
239
228
|
if (disabled) {
|
|
@@ -256,6 +245,32 @@ function instance($$self, $$props, $$invalidate) {
|
|
|
256
245
|
} else {
|
|
257
246
|
selectRef.removeAttribute("virtualized");
|
|
258
247
|
}
|
|
248
|
+
if (optionRenderer) {
|
|
249
|
+
if (selectRef.optionRenderer !== resolvedOptionRenderer) {
|
|
250
|
+
$$invalidate(2, selectRef.optionRenderer = resolvedOptionRenderer, selectRef);
|
|
251
|
+
}
|
|
252
|
+
} else if (selectRef.optionRenderer === resolvedOptionRenderer) {
|
|
253
|
+
$$invalidate(2, selectRef.optionRenderer = void 0, selectRef);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
if ($$self.$$.dirty[0] & /*selectRef, items*/
|
|
258
|
+
20) {
|
|
259
|
+
if (selectRef && items) {
|
|
260
|
+
selectRef.setItems(items);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
if ($$self.$$.dirty[0] & /*selectRef, groupedItems*/
|
|
264
|
+
36) {
|
|
265
|
+
if (selectRef && groupedItems) {
|
|
266
|
+
selectRef.setGroupedItems(groupedItems);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
if ($$self.$$.dirty[0] & /*selectRef, currentValue*/
|
|
270
|
+
134217732) {
|
|
271
|
+
if (selectRef && currentValue !== void 0) {
|
|
272
|
+
const values = Array.isArray(currentValue) ? currentValue : [currentValue];
|
|
273
|
+
selectRef.setSelectedValues(values);
|
|
259
274
|
}
|
|
260
275
|
}
|
|
261
276
|
};
|
|
@@ -278,6 +293,7 @@ function instance($$self, $$props, $$invalidate) {
|
|
|
278
293
|
virtualized,
|
|
279
294
|
maxSelections,
|
|
280
295
|
placement,
|
|
296
|
+
optionRenderer,
|
|
281
297
|
open,
|
|
282
298
|
close,
|
|
283
299
|
focus,
|
|
@@ -317,34 +333,35 @@ class Select extends SvelteComponent {
|
|
|
317
333
|
placement: 17,
|
|
318
334
|
className: 0,
|
|
319
335
|
style: 1,
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
336
|
+
optionRenderer: 18,
|
|
337
|
+
open: 19,
|
|
338
|
+
close: 20,
|
|
339
|
+
focus: 21,
|
|
340
|
+
setItems: 22,
|
|
341
|
+
setGroupedItems: 23,
|
|
342
|
+
clear: 24
|
|
326
343
|
},
|
|
327
344
|
null,
|
|
328
345
|
[-1, -1]
|
|
329
346
|
);
|
|
330
347
|
}
|
|
331
348
|
get open() {
|
|
332
|
-
return this.$$.ctx[
|
|
349
|
+
return this.$$.ctx[19];
|
|
333
350
|
}
|
|
334
351
|
get close() {
|
|
335
|
-
return this.$$.ctx[
|
|
352
|
+
return this.$$.ctx[20];
|
|
336
353
|
}
|
|
337
354
|
get focus() {
|
|
338
|
-
return this.$$.ctx[
|
|
355
|
+
return this.$$.ctx[21];
|
|
339
356
|
}
|
|
340
357
|
get setItems() {
|
|
341
|
-
return this.$$.ctx[
|
|
358
|
+
return this.$$.ctx[22];
|
|
342
359
|
}
|
|
343
360
|
get setGroupedItems() {
|
|
344
|
-
return this.$$.ctx[
|
|
361
|
+
return this.$$.ctx[23];
|
|
345
362
|
}
|
|
346
363
|
get clear() {
|
|
347
|
-
return this.$$.ctx[
|
|
364
|
+
return this.$$.ctx[24];
|
|
348
365
|
}
|
|
349
366
|
}
|
|
350
367
|
export {
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../node_modules/svelte/src/shared/version.js","../../../node_modules/svelte/src/runtime/internal/disclose-version/index.js","../src/Select.svelte"],"sourcesContent":["// generated during release, do not modify\n\n/**\n * The current version, as set in package.json.\n *\n * https://svelte.dev/docs/svelte-compiler#svelte-version\n * @type {string}\n */\nexport const VERSION = '4.2.20';\nexport const PUBLIC_VERSION = '4';\n","import { PUBLIC_VERSION } from '../../../shared/version.js';\n\nif (typeof window !== 'undefined')\n\t// @ts-ignore\n\t(window.__svelte || (window.__svelte = { v: new Set() })).v.add(PUBLIC_VERSION);\n","<!--\n Smilodon Select Component for Svelte\n \n A production-ready, accessible select component with advanced features:\n - Single and multi-select modes\n - Searchable with client or server-side filtering\n - Infinite scroll and virtual scrolling for large datasets\n - Grouped options\n - Custom rendering\n - Full keyboard navigation\n - WCAG 2.1 AAA compliant\n \n @example\n <Select\n {items}\n bind:value={selectedValue}\n searchable\n placeholder=\"Select an option...\"\n />\n-->\n\n<script lang=\"ts\">\n import { onMount, onDestroy, createEventDispatcher } from 'svelte';\n import type {\n SelectEventDetail,\n OpenEventDetail,\n CloseEventDetail,\n SearchEventDetail,\n ChangeEventDetail,\n LoadMoreEventDetail,\n GroupedItem,\n } from '@smilodon/core';\n\n export interface SelectItem {\n value: string | number;\n label: string;\n disabled?: boolean;\n group?: string;\n [key: string]: any;\n }\n\n // Props\n export let items: SelectItem[] = [];\n export let groupedItems: GroupedItem[] | undefined = undefined;\n export let value: string | number | (string | number)[] | undefined = undefined;\n export let defaultValue: string | number | (string | number)[] | undefined = undefined;\n export let multiple: boolean = false;\n export let searchable: boolean = false;\n export let placeholder: string = '';\n export let disabled: boolean = false;\n export let required: boolean = false;\n export let error: boolean = false;\n export let infiniteScroll: boolean = false;\n export let pageSize: number = 50;\n export let virtualized: boolean = true;\n export let maxSelections: number | undefined = undefined;\n export let placement: 'bottom' | 'top' | 'auto' = 'auto';\n export let className: string = '';\n export let style: string = '';\n\n const dispatch = createEventDispatcher<{\n change: { value: string | number | (string | number)[]; selectedItems: SelectItem[] };\n select: { item: SelectItem; index: number };\n open: void;\n close: void;\n search: { query: string };\n loadMore: { page: number };\n create: { value: string };\n }>();\n\n let selectRef: HTMLElement;\n let internalValue: string | number | (string | number)[] | undefined = defaultValue;\n\n // Check if component is controlled\n $: isControlled = value !== undefined;\n $: currentValue = isControlled ? value : internalValue;\n\n // Event handlers\n function handleSelect(e: Event) {\n const customEvent = e as CustomEvent<SelectEventDetail>;\n const { item, index } = customEvent.detail;\n dispatch('select', { item: item as SelectItem, index });\n }\n\n function handleChange(e: Event) {\n const customEvent = e as CustomEvent<ChangeEventDetail>;\n const { selectedItems, selectedValues } = customEvent.detail;\n\n const values = selectedValues as (string | number)[];\n\n // Update internal value in uncontrolled mode\n if (!isControlled) {\n internalValue = multiple ? values : values[0];\n }\n\n // Emit change event\n const newValue = multiple ? values : values[0];\n value = newValue; // Update binding\n dispatch('change', { value: newValue, selectedItems: selectedItems as SelectItem[] });\n }\n\n function handleOpen() {\n dispatch('open');\n }\n\n function handleClose() {\n dispatch('close');\n }\n\n function handleSearch(e: Event) {\n const customEvent = e as CustomEvent<SearchEventDetail>;\n dispatch('search', { query: customEvent.detail.query });\n }\n\n function handleLoadMore(e: Event) {\n const customEvent = e as CustomEvent<LoadMoreEventDetail>;\n dispatch('loadMore', { page: customEvent.detail.page });\n }\n\n function handleCreate(e: Event) {\n const customEvent = e as CustomEvent<{ value: string }>;\n dispatch('create', { value: customEvent.detail.value });\n }\n\n onMount(() => {\n if (!selectRef) return;\n\n const element = selectRef;\n\n // Set initial attributes\n if (placeholder) element.setAttribute('placeholder', placeholder);\n if (disabled) element.setAttribute('disabled', '');\n if (required) element.setAttribute('required', '');\n if (error) element.setAttribute('error', '');\n if (searchable) element.setAttribute('searchable', '');\n if (multiple) element.setAttribute('multiple', '');\n if (virtualized) element.setAttribute('virtualized', '');\n if (infiniteScroll) element.setAttribute('infinite-scroll', '');\n if (pageSize) element.setAttribute('page-size', String(pageSize));\n if (maxSelections) element.setAttribute('max-selections', String(maxSelections));\n if (placement) element.setAttribute('placement', placement);\n\n // Set initial items\n if (items?.length) {\n (element as any).setItems(items);\n }\n if (groupedItems?.length) {\n (element as any).setGroupedItems(groupedItems);\n }\n\n // Set initial value\n if (currentValue !== undefined) {\n const values = Array.isArray(currentValue) ? currentValue : [currentValue];\n (element as any).setSelectedValues(values);\n }\n\n // Add event listeners\n element.addEventListener('select', handleSelect as EventListener);\n element.addEventListener('change', handleChange as EventListener);\n element.addEventListener('open', handleOpen as EventListener);\n element.addEventListener('close', handleClose as EventListener);\n element.addEventListener('search', handleSearch as EventListener);\n element.addEventListener('loadMore', handleLoadMore as EventListener);\n element.addEventListener('create', handleCreate as EventListener);\n });\n\n onDestroy(() => {\n if (!selectRef) return;\n\n const element = selectRef;\n\n // Remove event listeners\n element.removeEventListener('select', handleSelect as EventListener);\n element.removeEventListener('change', handleChange as EventListener);\n element.removeEventListener('open', handleOpen as EventListener);\n element.removeEventListener('close', handleClose as EventListener);\n element.removeEventListener('search', handleSearch as EventListener);\n element.removeEventListener('loadMore', handleLoadMore as EventListener);\n element.removeEventListener('create', handleCreate as EventListener);\n });\n\n // Reactive updates\n $: if (selectRef && items) {\n (selectRef as any).setItems(items);\n }\n\n $: if (selectRef && groupedItems) {\n (selectRef as any).setGroupedItems(groupedItems);\n }\n\n $: if (selectRef && currentValue !== undefined) {\n const values = Array.isArray(currentValue) ? currentValue : [currentValue];\n (selectRef as any).setSelectedValues(values);\n }\n\n $: if (selectRef) {\n if (placeholder) selectRef.setAttribute('placeholder', placeholder);\n if (disabled) {\n selectRef.setAttribute('disabled', '');\n } else {\n selectRef.removeAttribute('disabled');\n }\n if (searchable) {\n selectRef.setAttribute('searchable', '');\n } else {\n selectRef.removeAttribute('searchable');\n }\n if (multiple) {\n selectRef.setAttribute('multiple', '');\n } else {\n selectRef.removeAttribute('multiple');\n }\n if (virtualized) {\n selectRef.setAttribute('virtualized', '');\n } else {\n selectRef.removeAttribute('virtualized');\n }\n }\n\n // Public methods\n export function open() {\n (selectRef as any)?.open();\n }\n\n export function close() {\n (selectRef as any)?.close();\n }\n\n export function focus() {\n selectRef?.focus();\n }\n\n export function setItems(newItems: SelectItem[]) {\n (selectRef as any)?.setItems(newItems);\n }\n\n export function setGroupedItems(groups: GroupedItem[]) {\n (selectRef as any)?.setGroupedItems(groups);\n }\n\n export function clear() {\n (selectRef as any)?.setSelectedValues([]);\n if (!isControlled) {\n internalValue = multiple ? [] : undefined;\n }\n const newValue = multiple ? [] : '';\n value = newValue as any;\n dispatch('change', { value: newValue as any, selectedItems: [] });\n }\n</script>\n\n<enhanced-select\n bind:this={selectRef}\n class={className}\n {style}\n/>\n\n<style>\n /* Component uses web component styling from @smilodon/core */\n</style>\n"],"names":["ctx","element"],"mappings":"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","x_google_ignoreList":[0,1]}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../node_modules/svelte/src/shared/version.js","../../../node_modules/svelte/src/runtime/internal/disclose-version/index.js","../src/Select.svelte"],"sourcesContent":["// generated during release, do not modify\n\n/**\n * The current version, as set in package.json.\n *\n * https://svelte.dev/docs/svelte-compiler#svelte-version\n * @type {string}\n */\nexport const VERSION = '4.2.20';\nexport const PUBLIC_VERSION = '4';\n","import { PUBLIC_VERSION } from '../../../shared/version.js';\n\nif (typeof window !== 'undefined')\n\t// @ts-ignore\n\t(window.__svelte || (window.__svelte = { v: new Set() })).v.add(PUBLIC_VERSION);\n","<!--\n Smilodon Select Component for Svelte\n \n A production-ready, accessible select component with advanced features:\n - Single and multi-select modes\n - Searchable with client or server-side filtering\n - Infinite scroll and virtual scrolling for large datasets\n - Grouped options\n - Custom rendering\n - Full keyboard navigation\n - WCAG 2.1 AAA compliant\n \n @example\n <Select\n {items}\n bind:value={selectedValue}\n searchable\n placeholder=\"Select an option...\"\n />\n-->\n\n<script lang=\"ts\" context=\"module\">\n export interface SelectItem {\n value: string | number;\n label: string;\n disabled?: boolean;\n group?: string;\n [key: string]: any;\n }\n</script>\n\n<script lang=\"ts\">\n import { onMount, onDestroy, createEventDispatcher } from 'svelte';\n import type {\n SelectEventDetail,\n OpenEventDetail,\n CloseEventDetail,\n SearchEventDetail,\n ChangeEventDetail,\n LoadMoreEventDetail,\n GroupedItem,\n } from '@smilodon/core';\n\n // Props\n export let items: SelectItem[] = [];\n export let groupedItems: GroupedItem[] | undefined = undefined;\n export let value: string | number | (string | number)[] | undefined = undefined;\n export let defaultValue: string | number | (string | number)[] | undefined = undefined;\n export let multiple: boolean = false;\n export let searchable: boolean = false;\n export let placeholder: string = '';\n export let disabled: boolean = false;\n export let required: boolean = false;\n export let error: boolean = false;\n export let infiniteScroll: boolean = false;\n export let pageSize: number = 50;\n export let virtualized: boolean = true;\n export let maxSelections: number | undefined = undefined;\n export let placement: 'bottom' | 'top' | 'auto' = 'auto';\n export let className: string = '';\n export let style: string = '';\n export let optionRenderer: ((item: SelectItem, index: number, helpers: any) => HTMLElement) | undefined = undefined;\n\n const dispatch = createEventDispatcher<{\n change: { value: string | number | (string | number)[]; selectedItems: SelectItem[] };\n select: { item: SelectItem; index: number };\n open: void;\n close: void;\n search: { query: string };\n loadMore: { page: number };\n create: { value: string };\n }>();\n\n let selectRef: HTMLElement;\n let internalValue: string | number | (string | number)[] | undefined = defaultValue;\n\n // Stable wrapper to handle optionRenderer updates without triggering infinite loops\n const resolvedOptionRenderer = (item: SelectItem, index: number, helpers: any) => {\n return optionRenderer ? optionRenderer(item, index, helpers) : document.createElement('div');\n };\n\n // Check if component is controlled\n $: isControlled = value !== undefined;\n $: currentValue = isControlled ? value : internalValue;\n\n // Event handlers\n function handleSelect(e: Event) {\n const customEvent = e as CustomEvent<SelectEventDetail>;\n const { item, index } = customEvent.detail;\n dispatch('select', { item: item as SelectItem, index });\n }\n\n function handleChange(e: Event) {\n const customEvent = e as CustomEvent<ChangeEventDetail>;\n const { selectedItems, selectedValues } = customEvent.detail;\n\n const values = selectedValues as (string | number)[];\n\n // Update internal value in uncontrolled mode\n if (!isControlled) {\n internalValue = multiple ? values : values[0];\n }\n\n // Emit change event\n const newValue = multiple ? values : values[0];\n value = newValue; // Update binding\n dispatch('change', { value: newValue, selectedItems: selectedItems as SelectItem[] });\n }\n\n function handleOpen() {\n dispatch('open');\n }\n\n function handleClose() {\n dispatch('close');\n }\n\n function handleSearch(e: Event) {\n const customEvent = e as CustomEvent<SearchEventDetail>;\n dispatch('search', { query: customEvent.detail.query });\n }\n\n function handleLoadMore(e: Event) {\n const customEvent = e as CustomEvent<LoadMoreEventDetail>;\n dispatch('loadMore', { page: customEvent.detail.page });\n }\n\n function handleCreate(e: Event) {\n const customEvent = e as CustomEvent<{ value: string }>;\n dispatch('create', { value: customEvent.detail.value });\n }\n\n onMount(() => {\n if (!selectRef) return;\n\n const element = selectRef;\n\n // Set initial attributes\n if (placeholder) element.setAttribute('placeholder', placeholder);\n if (disabled) element.setAttribute('disabled', '');\n if (required) element.setAttribute('required', '');\n if (error) element.setAttribute('error', '');\n if (searchable) element.setAttribute('searchable', '');\n if (multiple) element.setAttribute('multiple', '');\n if (virtualized) element.setAttribute('virtualized', '');\n if (infiniteScroll) element.setAttribute('infinite-scroll', '');\n if (pageSize) element.setAttribute('page-size', String(pageSize));\n if (maxSelections) element.setAttribute('max-selections', String(maxSelections));\n if (placement) element.setAttribute('placement', placement);\n\n if (optionRenderer) {\n (element as any).optionRenderer = resolvedOptionRenderer;\n }\n\n // Set initial items\n if (items?.length) {\n (element as any).setItems(items);\n }\n if (groupedItems?.length) {\n (element as any).setGroupedItems(groupedItems);\n }\n\n // Set initial value\n if (currentValue !== undefined) {\n const values = Array.isArray(currentValue) ? currentValue : [currentValue];\n (element as any).setSelectedValues(values);\n }\n\n // Add event listeners\n element.addEventListener('select', handleSelect as EventListener);\n element.addEventListener('change', handleChange as EventListener);\n element.addEventListener('open', handleOpen as EventListener);\n element.addEventListener('close', handleClose as EventListener);\n element.addEventListener('search', handleSearch as EventListener);\n element.addEventListener('loadMore', handleLoadMore as EventListener);\n element.addEventListener('create', handleCreate as EventListener);\n });\n\n onDestroy(() => {\n if (!selectRef) return;\n\n const element = selectRef;\n\n // Remove event listeners\n element.removeEventListener('select', handleSelect as EventListener);\n element.removeEventListener('change', handleChange as EventListener);\n element.removeEventListener('open', handleOpen as EventListener);\n element.removeEventListener('close', handleClose as EventListener);\n element.removeEventListener('search', handleSearch as EventListener);\n element.removeEventListener('loadMore', handleLoadMore as EventListener);\n element.removeEventListener('create', handleCreate as EventListener);\n });\n\n // Reactive updates\n $: if (selectRef && items) {\n (selectRef as any).setItems(items);\n }\n\n $: if (selectRef && groupedItems) {\n (selectRef as any).setGroupedItems(groupedItems);\n }\n\n $: if (selectRef && currentValue !== undefined) {\n const values = Array.isArray(currentValue) ? currentValue : [currentValue];\n (selectRef as any).setSelectedValues(values);\n }\n\n $: if (selectRef) {\n if (placeholder) selectRef.setAttribute('placeholder', placeholder);\n if (disabled) {\n selectRef.setAttribute('disabled', '');\n } else {\n selectRef.removeAttribute('disabled');\n }\n if (searchable) {\n selectRef.setAttribute('searchable', '');\n } else {\n selectRef.removeAttribute('searchable');\n }\n if (multiple) {\n selectRef.setAttribute('multiple', '');\n } else {\n selectRef.removeAttribute('multiple');\n }\n if (virtualized) {\n selectRef.setAttribute('virtualized', '');\n } else {\n selectRef.removeAttribute('virtualized');\n }\n\n if (optionRenderer) {\n if ((selectRef as any).optionRenderer !== resolvedOptionRenderer) {\n (selectRef as any).optionRenderer = resolvedOptionRenderer;\n }\n } else if ((selectRef as any).optionRenderer === resolvedOptionRenderer) {\n (selectRef as any).optionRenderer = undefined;\n }\n }\n\n // Public methods\n export function open() {\n (selectRef as any)?.open();\n }\n\n export function close() {\n (selectRef as any)?.close();\n }\n\n export function focus() {\n selectRef?.focus();\n }\n\n export function setItems(newItems: SelectItem[]) {\n (selectRef as any)?.setItems(newItems);\n }\n\n export function setGroupedItems(groups: GroupedItem[]) {\n (selectRef as any)?.setGroupedItems(groups);\n }\n\n export function clear() {\n (selectRef as any)?.setSelectedValues([]);\n if (!isControlled) {\n internalValue = multiple ? [] : undefined;\n }\n const newValue = multiple ? [] : '';\n value = newValue as any;\n dispatch('change', { value: newValue as any, selectedItems: [] });\n }\n</script>\n\n<enhanced-select\n bind:this={selectRef}\n class={className}\n {style}\n/>\n\n<style>\n /* Component uses web component styling from @smilodon/core */\n</style>\n"],"names":["ctx","element"],"mappings":"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","x_google_ignoreList":[0,1]}
|