solid-tom-ui 1.0.5 → 1.0.6

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.
Files changed (69) hide show
  1. package/README.md +246 -237
  2. package/dist/README.md +246 -0
  3. package/dist/components/avatar/avatar.js.map +1 -1
  4. package/dist/components/badge/badge.js.map +1 -1
  5. package/dist/components/breadcrumb/breadcrumb.js.map +1 -1
  6. package/dist/components/button/button.js.map +1 -1
  7. package/dist/components/carousel/carousel.js.map +1 -1
  8. package/dist/components/chat-bubble/chatBubble.js.map +1 -1
  9. package/dist/components/checkbox/checkbox.js.map +1 -1
  10. package/dist/components/collapse/collapse.js.map +1 -1
  11. package/dist/components/context-menu/context-menu.js.map +1 -1
  12. package/dist/components/context-menu/context-menu.store.js.map +1 -1
  13. package/dist/components/divider/divider.js.map +1 -1
  14. package/dist/components/dropdown/dropdown.js.map +1 -1
  15. package/dist/components/dropdown/dropdown.store.js.map +1 -1
  16. package/dist/components/float-button/float-button.js.map +1 -1
  17. package/dist/components/hover-3d-image/hover-3d-image.js.map +1 -1
  18. package/dist/components/image-preview/image-preview.js.map +1 -1
  19. package/dist/components/input/input.js.map +1 -1
  20. package/dist/components/input/input.utils.js.map +1 -1
  21. package/dist/components/input/variants/input-color.js.map +1 -1
  22. package/dist/components/input/variants/input-date.js.map +1 -1
  23. package/dist/components/input/variants/input-number.js.map +1 -1
  24. package/dist/components/input/variants/input-otp.js.map +1 -1
  25. package/dist/components/input/variants/input-password.js.map +1 -1
  26. package/dist/components/input/variants/input-radio.js.map +1 -1
  27. package/dist/components/input/variants/input-range.js.map +1 -1
  28. package/dist/components/input/variants/input-text.js.map +1 -1
  29. package/dist/components/input/variants/input-textarea.js.map +1 -1
  30. package/dist/components/loading/loading.js.map +1 -1
  31. package/dist/components/mansory/mansory.js.map +1 -1
  32. package/dist/components/menu/menu.js.map +1 -1
  33. package/dist/components/modal/modal.js.map +1 -1
  34. package/dist/components/modal/modalContext.js.map +1 -1
  35. package/dist/components/pagination/pagination.js.map +1 -1
  36. package/dist/components/progress-bar/progress-bar.js.map +1 -1
  37. package/dist/components/qr-code/qr-code.js.map +1 -1
  38. package/dist/components/select/select.js.map +1 -1
  39. package/dist/components/select-zone/select-zone.js.map +1 -1
  40. package/dist/components/skeleton/skeleton.js.map +1 -1
  41. package/dist/components/slider/slider.js.map +1 -1
  42. package/dist/components/splitter/splitter.js.map +1 -1
  43. package/dist/components/steps/steps.js.map +1 -1
  44. package/dist/components/swap/swap.js.map +1 -1
  45. package/dist/components/switch/switch.js.map +1 -1
  46. package/dist/components/tab/tab.js.map +1 -1
  47. package/dist/components/table/table.js.map +1 -1
  48. package/dist/components/timeline/timeline.js.map +1 -1
  49. package/dist/components/toast/icons/ErrorIcon.js.map +1 -1
  50. package/dist/components/toast/icons/IconCircle.js.map +1 -1
  51. package/dist/components/toast/icons/InfoIcon.js.map +1 -1
  52. package/dist/components/toast/icons/LoaderIcon.js.map +1 -1
  53. package/dist/components/toast/icons/SuccessIcon.js.map +1 -1
  54. package/dist/components/toast/icons/WarningIcon.js.map +1 -1
  55. package/dist/components/toast/toast.js.map +1 -1
  56. package/dist/components/toast/toast.store.js.map +1 -1
  57. package/dist/components/tooltip/tooltip.js.map +1 -1
  58. package/dist/components/tour/tour.js.map +1 -1
  59. package/dist/components/upload/upload.js.map +1 -1
  60. package/dist/components/z-index/z-index.context.js.map +1 -1
  61. package/dist/components/z-index/z-index.js.map +1 -1
  62. package/dist/components/z-index/z-index.store.js.map +1 -1
  63. package/dist/components/z-index/z-index.types.js.map +1 -1
  64. package/dist/package.json +39 -0
  65. package/dist/utils/cn.js.map +1 -1
  66. package/dist/utils/element-tracker.js.map +1 -1
  67. package/dist/utils/helper.js.map +1 -1
  68. package/dist/utils/hoc.js.map +1 -1
  69. package/package.json +38 -32
@@ -1 +1 @@
1
- {"version":3,"file":"select.js","names":["SolidComponent","cn","getColor","createVirtualizer","cva","VariantProps","Check","ChevronDown","Search","X","createEffect","createMemo","createSignal","For","mergeProps","on","Show","Component","JSXElement","Dropdown","FlattenOptionData","LabeledValue","OptGroupType","SelectBaseProps","SelectFieldNames","SelectOptionType","SelectProps","SelectValue","ShowSearchConfig","TagRenderProps","selectVariants","variants","variant","outline","filled","borderless","underlined","size","lg","md","sm","color","neutral","primary","secondary","accent","info","success","warning","error","SelectVariantsProps","SelectTagProps","tag","value","label","closable","removeIcon","tagRender","props","onRemove","e","MouseEvent","SelectTag","onClose","_el$","_tmpl$2","_el$2","firstChild","_$insert","Element","_$createComponent","when","children","_el$3","_tmpl$","$$click","_c$","_$memo","InnerTooltip","content","_el$4","_tmpl$3","_el$5","_el$6","resolveFieldNames","fn","options","groupLabel","getField","option","field","FlatOption","disabled","class","title","raw","flattenOptions","fieldNames","ReturnType","result","opt","subOptions","Array","isArray","sub","push","undefined","OptionGroup","items","regroupFlatOptions","flatOptions","groups","last","length","extractValue","v","extractValues","map","item","filter","x","single","Select","p","const","loading","placement","listHeight","virtual","defaultActiveFirstOption","notFoundContent","labelInValue","placeholder","blockScroll","isMultiple","mode","allowCustomValue","showSearchEnabled","showSearch","searchConfig","base","autoClearSearchValue","filterOption","optionFilterProp","internalValue","setInternalValue","defaultValue","isOpen","setIsOpen","defaultOpen","searchText","setSearchText","activeIndex","setActiveIndex","selectedValues","dropdownOpen","open","controlledSearchValue","cfg","searchValue","currentSearchText","inputRef","HTMLInputElement","selectRootRef","HTMLDivElement","triggerRef","listRef","setListRef","allFlatOptions","allOptionsWithCustom","flat","existingValues","Set","o","customOpts","val","has","String","optionMap","Map","set","filteredOptions","all","text","filtered","Function","filterProps","lowerText","toLowerCase","some","prop","includes","filterSort","sortFn","sort","a","b","groupedForRender","RenderItem","type","flatIdx","flatRenderList","group","ITEM_HEIGHT","GROUP_LABEL_HEIGHT","virtualizer","count","getScrollElement","estimateSize","index","overscan","selectedValuesSet","isSelected","isMaxReached","max","maxCount","suppressBlurUntil","openDropdown","performance","now","onOpenChange","closeDropdown","onSearch","toggleDropdown","buildOutputValue","values","get","buildOutputOption","handleSelect","optValue","rawOpt","current","newValues","deselectVal","onDeselect","selectVal","onSelect","onChange","handleClear","stopPropagation","preventDefault","onClear","handleRemoveTag","handleKeyDown","KeyboardEvent","onInputKeyDown","opts","key","next","onActive","scrollActiveIntoView","prev","idx","trim","focus","vals","list","renderIdx","findIndex","scrollToIndex","align","el","querySelectorAll","HTMLElement","scrollIntoView","block","scrollToFirstSelected","firstSelectedValue","querySelector","handleSearchInput","InputEvent","target","handleFocus","FocusEvent","scrollX","window","scrollY","restoreScroll","requestAnimationFrame","scrollTo","addEventListener","once","passive","setTimeout","removeEventListener","onFocus","handleBlur","related","relatedTarget","contains","closest","onBlur","selectedLabel","labelRender","TagInfo","visibleTags","visible","omitted","maxTagCount","maxTextLen","maxTagTextLength","tags","slice","showClear","allowClear","handleTriggerClick","findOptionIndex","EventTarget","dataset","optionIndex","Number","classList","parentElement","handleListClick","renderOptionItem","selected","isActive","isDisabledOpt","flattenData","optionRender","_el$7","_tmpl$5","_el$8","_$setAttribute","_el$9","_tmpl$4","_c$2","menuItemSelectedIcon","_$effect","_p$","_v$","_v$2","_$className","t","dropdownContent","renderList","_el$0","_tmpl$6","_el$1","_tmpl$7","_el$10","_$use","each","getVirtualItems","virtualRow","_el$11","_tmpl$8","_c$3","_el$12","_tmpl$9","_v$6","_v$7","start","_$setStyleProperty","_v$3","_v$4","_v$5","getTotalSize","_el$13","_tmpl$0","_el$14","_$p","renderTag","measure","queueMicrotask","preventScroll","ref","position","trigger","triggerElement","_el$18","_tmpl$17","_el$20","_el$24","nextSibling","$$keydown","prefix","_el$19","_tmpl$11","fallback","_el$27","_tmpl$19","_el$29","_tmpl$13","_el$28","_tmpl$18","_el$21","_tmpl$14","_el$22","_tmpl$12","maxTagPlaceholder","omittedValues","_el$23","_el$25","_tmpl$15","_tmpl$20","_el$26","_tmpl$16","_c$5","suffixIcon","_v$0","root","_v$1","_v$10","_el$15","_tmpl$10","$$mousedown","tagName","_el$16","_tmpl$1","_el$17","$$input","_v$8","_v$9","_c$4","popupRender","_$delegateEvents"],"sources":["../../../src/components/select/select.tsx"],"sourcesContent":["import type { SolidComponent } from '@/type';\nimport { cn } from '@/utils/cn';\nimport { getColor } from '@/utils/helper';\nimport { createVirtualizer } from '@tanstack/solid-virtual';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport Check from 'lucide-solid/icons/check';\nimport ChevronDown from 'lucide-solid/icons/chevron-down';\nimport Search from 'lucide-solid/icons/search';\nimport X from 'lucide-solid/icons/x';\nimport {\n createEffect,\n createMemo,\n createSignal,\n For,\n mergeProps,\n on,\n Show,\n type Component,\n type JSXElement,\n} from 'solid-js';\nimport { Dropdown } from '../dropdown';\nimport type {\n FlattenOptionData,\n LabeledValue,\n OptGroupType,\n SelectBaseProps,\n SelectFieldNames,\n SelectOptionType,\n SelectProps,\n SelectValue,\n ShowSearchConfig,\n TagRenderProps,\n} from './select.types';\n\nconst selectVariants = cva('sel01', {\n variants: {\n variant: {\n outline: 'sel07',\n filled: 'sel09',\n borderless: 'sel08',\n underlined: 'sel10',\n },\n size: {\n lg: 'sel06',\n md: 'sel05',\n sm: 'sel04',\n },\n color: {\n neutral: 'input-neutral',\n primary: 'input-primary',\n secondary: 'input-secondary',\n accent: 'input-accent',\n info: 'input-info',\n success: 'input-success',\n warning: 'input-warning',\n error: 'input-error',\n },\n },\n});\nexport type SelectVariantsProps = VariantProps<typeof selectVariants>;\n\ntype SelectTagProps = {\n tag: { value: string | number; label: SolidComponent; closable: boolean };\n removeIcon?: JSXElement;\n tagRender?: (props: TagRenderProps) => JSXElement;\n onRemove: (value: string | number, e: MouseEvent) => void;\n};\n\nconst SelectTag: Component<SelectTagProps> = props => {\n if (props.tagRender) {\n return props.tagRender({\n label: props.tag.label,\n value: props.tag.value,\n closable: props.tag.closable,\n onClose: () => props.onRemove(props.tag.value, new MouseEvent('click')),\n }) as JSXElement;\n }\n\n return (\n <span class=\"sel17\">\n <span class=\"sel18\">{props.tag.label as Element}</span>\n <Show when={props.tag.closable}>\n <span class=\"sel19\" onClick={e => props.onRemove(props.tag.value, e)}>\n {props.removeIcon ? (\n (props.removeIcon as Element)\n ) : (\n <X class=\"m-auto\" size={12} stroke-width={3} />\n )}\n </span>\n </Show>\n </span>\n );\n};\n\nconst InnerTooltip: Component<{ content: JSXElement; children: JSXElement }> = props => {\n return (\n <span class=\"sel42\">\n {props.children}\n <span class=\"sel43\">\n <span class=\"sel44\">{props.content}</span>\n </span>\n </span>\n );\n};\n\nfunction resolveFieldNames(fn?: SelectFieldNames) {\n return {\n label: fn?.label ?? 'label',\n value: fn?.value ?? 'value',\n options: fn?.options ?? 'options',\n groupLabel: fn?.groupLabel ?? 'label',\n };\n}\n\nfunction getField(option: any, field: string): any {\n return option?.[field];\n}\n\ninterface FlatOption {\n label: SolidComponent;\n value: string | number;\n disabled?: boolean;\n class?: string;\n title?: string;\n groupLabel?: SolidComponent;\n raw: any;\n}\n\nfunction flattenOptions(\n options: (SelectOptionType | OptGroupType)[] | undefined,\n fieldNames: ReturnType<typeof resolveFieldNames>,\n): FlatOption[] {\n if (!options) return [];\n const result: FlatOption[] = [];\n for (const opt of options) {\n const subOptions = getField(opt, fieldNames.options) as SelectOptionType[] | undefined;\n if (subOptions && Array.isArray(subOptions)) {\n const groupLabel = getField(opt, fieldNames.groupLabel) as SolidComponent;\n for (const sub of subOptions) {\n result.push({\n label: getField(sub, fieldNames.label) as SolidComponent,\n value: getField(sub, fieldNames.value) as string | number,\n disabled: sub.disabled,\n class: sub.class,\n title: sub.title,\n groupLabel,\n raw: sub,\n });\n }\n } else {\n result.push({\n label: getField(opt, fieldNames.label) as SolidComponent,\n value: getField(opt, fieldNames.value) as string | number,\n disabled: (opt as SelectOptionType).disabled,\n class: (opt as SelectOptionType).class,\n title: (opt as SelectOptionType).title,\n groupLabel: undefined,\n raw: opt,\n });\n }\n }\n return result;\n}\n\ninterface OptionGroup {\n groupLabel?: SolidComponent;\n items: FlatOption[];\n}\n\nfunction regroupFlatOptions(flatOptions: FlatOption[]): OptionGroup[] {\n const groups: OptionGroup[] = [];\n for (const opt of flatOptions) {\n const last = groups[groups.length - 1];\n if (last && last.groupLabel === opt.groupLabel) {\n last.items.push(opt);\n } else {\n groups.push({ groupLabel: opt.groupLabel, items: [opt] });\n }\n }\n return groups;\n}\n\nfunction extractValue(v: string | number | LabeledValue | undefined): string | number | undefined {\n if (v === undefined || v === null) return undefined;\n if (typeof v === 'object' && 'value' in v) return v.value;\n return v as string | number;\n}\n\nfunction extractValues(\n v: string | string[] | number | number[] | LabeledValue | LabeledValue[] | undefined,\n): (string | number)[] {\n if (v === undefined || v === null) return [];\n if (Array.isArray(v)) {\n return v.map(item => extractValue(item)!).filter(x => x !== undefined);\n }\n const single = extractValue(v as string | number | LabeledValue);\n return single !== undefined ? [single] : [];\n}\n\nexport const Select: Component<SelectProps> = p => {\n p = mergeProps(\n {\n color: 'error' as const,\n size: 'md' as const,\n variant: 'outline' as const,\n disabled: false,\n loading: false,\n placement: 'bottom' as const,\n listHeight: 256,\n virtual: false,\n defaultActiveFirstOption: false,\n notFoundContent: 'Not Found' as SolidComponent,\n labelInValue: false,\n placeholder: 'Select...',\n blockScroll: true,\n } as SelectBaseProps,\n p,\n );\n\n const fieldNames = createMemo(() => resolveFieldNames(p.fieldNames));\n\n const isMultiple = createMemo(() => p.mode === 'multiple');\n const allowCustomValue = createMemo(() => isMultiple() && !!(p as any).allowCustomValue);\n\n const showSearchEnabled = createMemo(() => {\n if (typeof p.showSearch === 'boolean') return p.showSearch;\n if (typeof p.showSearch === 'object') return true;\n\n return isMultiple();\n });\n\n const searchConfig = createMemo((): ShowSearchConfig => {\n const base: ShowSearchConfig = {\n autoClearSearchValue: true,\n filterOption: true,\n optionFilterProp: 'value',\n };\n if (typeof p.showSearch === 'object') {\n return { ...base, ...p.showSearch };\n }\n return base;\n });\n\n const [internalValue, setInternalValue] = createSignal<(string | number)[]>(\n extractValues(p.defaultValue),\n );\n const [isOpen, setIsOpen] = createSignal(p.defaultOpen ?? false);\n const [searchText, setSearchText] = createSignal('');\n const [activeIndex, setActiveIndex] = createSignal(-1);\n\n const selectedValues = createMemo(() => {\n if (p.value !== undefined) {\n return extractValues(p.value);\n }\n return internalValue();\n });\n\n const dropdownOpen = createMemo(() => {\n if (p.open !== undefined) {\n return p.open as boolean;\n }\n return isOpen();\n });\n\n const controlledSearchValue = createMemo(() => {\n const cfg = searchConfig();\n if (cfg.searchValue !== undefined) return cfg.searchValue;\n return undefined;\n });\n\n const currentSearchText = createMemo(() => {\n return controlledSearchValue() ?? searchText();\n });\n\n let inputRef: HTMLInputElement | undefined;\n let selectRootRef: HTMLDivElement | undefined;\n let triggerRef: HTMLDivElement | undefined;\n const [listRef, setListRef] = createSignal<HTMLDivElement | null>(null);\n\n const allFlatOptions = createMemo(() => flattenOptions(p.options, fieldNames()));\n\n const allOptionsWithCustom = createMemo(() => {\n const flat = allFlatOptions();\n if (!allowCustomValue()) return flat;\n const existingValues = new Set(flat.map(o => o.value));\n const customOpts: FlatOption[] = [];\n for (const val of selectedValues()) {\n if (!existingValues.has(val)) {\n customOpts.push({\n label: String(val),\n value: val,\n disabled: false,\n class: undefined,\n title: undefined,\n groupLabel: undefined,\n raw: { label: String(val), value: val },\n });\n }\n }\n return [...flat, ...customOpts];\n });\n\n const optionMap = createMemo(() => {\n const map = new Map<string | number, FlatOption>();\n for (const opt of allOptionsWithCustom()) {\n map.set(opt.value, opt);\n }\n return map;\n });\n\n const filteredOptions = createMemo(() => {\n const all = allOptionsWithCustom();\n const text = currentSearchText();\n if (!text || !showSearchEnabled()) return all;\n\n const cfg = searchConfig();\n if (cfg.filterOption === false) return all;\n\n let filtered: FlatOption[];\n if (typeof cfg.filterOption === 'function') {\n filtered = all.filter(opt =>\n (cfg.filterOption as Function)(text, opt.raw as SelectOptionType),\n );\n } else {\n const filterProps = Array.isArray(cfg.optionFilterProp)\n ? cfg.optionFilterProp\n : [cfg.optionFilterProp ?? 'value'];\n const lowerText = text.toLowerCase();\n filtered = all.filter(opt => {\n return filterProps.some(prop => {\n const val = getField(opt.raw, prop) ?? (prop === 'label' ? opt.label : opt.value);\n return String(val ?? '')\n .toLowerCase()\n .includes(lowerText);\n });\n });\n }\n\n if (cfg.filterSort) {\n const sortFn = cfg.filterSort;\n filtered.sort((a, b) =>\n sortFn(a.raw as SelectOptionType, b.raw as SelectOptionType, { searchValue: text }),\n );\n }\n\n return filtered;\n });\n\n const groupedForRender = createMemo(() => {\n const text = currentSearchText();\n if (text && showSearchEnabled()) {\n return [{ groupLabel: undefined, items: filteredOptions() }] as OptionGroup[];\n }\n return regroupFlatOptions(allOptionsWithCustom());\n });\n\n type RenderItem =\n | { type: 'group'; groupLabel: SolidComponent }\n | { type: 'option'; option: FlatOption; flatIdx: number };\n\n const flatRenderList = createMemo((): RenderItem[] => {\n const groups = groupedForRender();\n const result: RenderItem[] = [];\n let flatIdx = 0;\n for (const group of groups) {\n if (group.groupLabel !== undefined) {\n result.push({ type: 'group', groupLabel: group.groupLabel });\n }\n for (const item of group.items) {\n result.push({ type: 'option', option: item, flatIdx });\n flatIdx++;\n }\n }\n return result;\n });\n\n const ITEM_HEIGHT = 32;\n const GROUP_LABEL_HEIGHT = 28;\n\n const virtualizer = createVirtualizer({\n get count() {\n return flatRenderList().length;\n },\n getScrollElement: () => listRef(),\n estimateSize: (index: number) => {\n const item = flatRenderList()[index];\n return item?.type === 'group' ? GROUP_LABEL_HEIGHT : ITEM_HEIGHT;\n },\n overscan: 2,\n });\n\n const selectedValuesSet = createMemo(() => new Set(selectedValues()));\n\n const isSelected = (val: string | number) => {\n return selectedValuesSet().has(val);\n };\n\n const isMaxReached = createMemo(() => {\n if (!isMultiple()) return false;\n const max = p.maxCount as number | undefined;\n if (max === undefined) return false;\n return selectedValues().length >= max;\n });\n\n // Set for a brief window after openDropdown() to suppress spurious focusout events\n // that fire when SolidJS re-renders the DOM (inserting dropdown content causes\n // the focused trigger div to receive a focusout with relatedTarget=null before\n // the search input is mounted and re-focused via queueMicrotask).\n let suppressBlurUntil = 0;\n\n const openDropdown = () => {\n if (p.disabled) return;\n suppressBlurUntil = performance.now() + 150;\n if (p.open === undefined) {\n setIsOpen(true);\n }\n p.onOpenChange?.(true);\n };\n\n const closeDropdown = () => {\n if (p.open === undefined) {\n setIsOpen(false);\n }\n setListRef(null);\n p.onOpenChange?.(false);\n\n if (showSearchEnabled()) {\n setSearchText('');\n searchConfig().onSearch?.('');\n }\n };\n\n const toggleDropdown = () => {\n if (dropdownOpen()) {\n closeDropdown();\n } else {\n openDropdown();\n }\n };\n\n const buildOutputValue = (values: (string | number)[]): SelectValue => {\n const map = optionMap();\n if (isMultiple()) {\n if (p.labelInValue) {\n return values.map(v => {\n const opt = map.get(v);\n return {\n value: v,\n label: opt?.label ?? String(v),\n } as LabeledValue;\n });\n }\n return values as string[] | number[];\n }\n\n const val = values[0];\n if (val === undefined) return undefined as any;\n if (p.labelInValue) {\n const opt = map.get(val);\n return {\n value: val,\n label: opt?.label ?? String(val),\n } as LabeledValue;\n }\n return val;\n };\n\n const buildOutputOption = (\n values: (string | number)[],\n ): SelectOptionType | SelectOptionType[] => {\n const map = optionMap();\n if (isMultiple()) {\n return values.map(v => {\n const opt = map.get(v);\n return (opt?.raw as SelectOptionType) ?? { value: v, label: String(v) };\n });\n }\n const val = values[0];\n const opt = map.get(val);\n return (opt?.raw as SelectOptionType) ?? { value: val, label: String(val) };\n };\n\n const handleSelect = (optValue: string | number) => {\n const opt = optionMap().get(optValue);\n const rawOpt = (opt?.raw as SelectOptionType) ?? {\n value: optValue,\n label: String(optValue),\n };\n\n if (isMultiple()) {\n const current = selectedValues();\n let newValues: (string | number)[];\n\n if (current.includes(optValue)) {\n newValues = current.filter(v => v !== optValue);\n const deselectVal = p.labelInValue\n ? ({ value: optValue, label: opt?.label ?? String(optValue) } as LabeledValue)\n : optValue;\n p.onDeselect?.(deselectVal);\n } else {\n if (isMaxReached()) return;\n newValues = [...current, optValue];\n const selectVal = p.labelInValue\n ? ({ value: optValue, label: opt?.label ?? String(optValue) } as LabeledValue)\n : optValue;\n p.onSelect?.(selectVal, rawOpt);\n }\n\n if (p.value === undefined) {\n setInternalValue(newValues);\n }\n p.onChange?.(buildOutputValue(newValues), buildOutputOption(newValues));\n\n if (searchConfig().autoClearSearchValue !== false) {\n setSearchText('');\n searchConfig().onSearch?.('');\n }\n } else {\n const newValues = [optValue];\n const selectVal = p.labelInValue\n ? ({ value: optValue, label: opt?.label ?? String(optValue) } as LabeledValue)\n : optValue;\n p.onSelect?.(selectVal, rawOpt);\n\n if (p.value === undefined) {\n setInternalValue(newValues);\n }\n p.onChange?.(buildOutputValue(newValues), buildOutputOption(newValues));\n closeDropdown();\n setSearchText('');\n }\n };\n\n const handleClear = (e: MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n if (p.value === undefined) {\n setInternalValue([]);\n }\n p.onClear?.();\n p.onChange?.(isMultiple() ? [] : (undefined as any), isMultiple() ? [] : (undefined as any));\n setSearchText('');\n };\n\n const handleRemoveTag = (val: string | number, e?: MouseEvent) => {\n e?.stopPropagation();\n e?.preventDefault();\n const current = selectedValues();\n const newValues = current.filter(v => v !== val);\n\n const opt = optionMap().get(val);\n const deselectVal = p.labelInValue\n ? ({ value: val, label: opt?.label ?? String(val) } as LabeledValue)\n : val;\n p.onDeselect?.(deselectVal);\n\n if (p.value === undefined) {\n setInternalValue(newValues);\n }\n p.onChange?.(buildOutputValue(newValues), buildOutputOption(newValues));\n };\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (p.disabled) return;\n p.onInputKeyDown?.(e);\n\n const opts = filteredOptions();\n\n switch (e.key) {\n case 'ArrowDown': {\n e.preventDefault();\n if (!dropdownOpen()) {\n openDropdown();\n return;\n }\n let next = activeIndex() + 1;\n while (next < opts.length) {\n const opt = opts[next];\n if (!opt.disabled && (!isMaxReached() || isSelected(opt.value))) {\n break;\n }\n next++;\n }\n if (next < opts.length) {\n setActiveIndex(next);\n const val = p.labelInValue\n ? ({ value: opts[next].value, label: opts[next].label } as LabeledValue)\n : opts[next].value;\n p.onActive?.(val);\n scrollActiveIntoView(next);\n }\n break;\n }\n case 'ArrowUp': {\n e.preventDefault();\n if (!dropdownOpen()) {\n openDropdown();\n return;\n }\n let prev = activeIndex() === -1 ? opts.length - 1 : activeIndex() - 1;\n while (prev >= 0) {\n const opt = opts[prev];\n if (!opt.disabled && (!isMaxReached() || isSelected(opt.value))) {\n break;\n }\n prev--;\n }\n if (prev >= 0) {\n setActiveIndex(prev);\n const val = p.labelInValue\n ? ({ value: opts[prev].value, label: opts[prev].label } as LabeledValue)\n : opts[prev].value;\n p.onActive?.(val);\n scrollActiveIntoView(prev);\n }\n break;\n }\n case 'Enter':\n case ' ': {\n e.preventDefault();\n if (!dropdownOpen()) {\n openDropdown();\n return;\n }\n if (e.key === ' ' && showSearchEnabled()) break;\n const idx = activeIndex();\n if (idx >= 0 && idx < opts.length) {\n const opt = opts[idx];\n if (!opt.disabled) {\n handleSelect(opt.value);\n }\n } else if (allowCustomValue() && currentSearchText().trim()) {\n const tag = currentSearchText().trim();\n handleSelect(tag);\n }\n break;\n }\n case 'Escape': {\n e.preventDefault();\n closeDropdown();\n triggerRef?.focus();\n break;\n }\n case 'Backspace': {\n if (isMultiple() && currentSearchText() === '') {\n const vals = selectedValues();\n if (vals.length > 0) {\n handleRemoveTag(vals[vals.length - 1]);\n }\n }\n break;\n }\n case 'Tab': {\n closeDropdown();\n break;\n }\n }\n };\n\n const scrollActiveIntoView = (flatIdx: number) => {\n if (p.virtual) {\n const list = flatRenderList();\n const renderIdx = list.findIndex(item => item.type === 'option' && item.flatIdx === flatIdx);\n if (renderIdx >= 0) {\n virtualizer.scrollToIndex(renderIdx, { align: 'auto' });\n }\n return;\n }\n\n const el = listRef();\n if (!el) return;\n const items = el.querySelectorAll('[data-option-index]');\n const item = items[flatIdx] as HTMLElement | undefined;\n if (item) {\n item.scrollIntoView({ block: 'nearest' });\n }\n };\n\n const scrollToFirstSelected = () => {\n const vals = selectedValues();\n if (vals.length === 0) return;\n\n const firstSelectedValue = vals[0];\n const opts = filteredOptions();\n const flatIdx = opts.findIndex(o => o.value === firstSelectedValue);\n if (flatIdx < 0) return;\n\n if (p.virtual) {\n const list = flatRenderList();\n const renderIdx = list.findIndex(item => item.type === 'option' && item.flatIdx === flatIdx);\n if (renderIdx >= 0) {\n virtualizer.scrollToIndex(renderIdx, { align: 'start' });\n }\n } else {\n const el = listRef();\n if (!el) return;\n const item = el.querySelector(`[data-option-index=\"${flatIdx}\"]`) as HTMLElement | null;\n if (item) {\n item.scrollIntoView({ block: 'nearest' });\n }\n }\n };\n\n const handleSearchInput = (e: InputEvent) => {\n const target = e.target as HTMLInputElement;\n const val = target.value;\n\n if (controlledSearchValue() === undefined) {\n setSearchText(val);\n }\n searchConfig().onSearch?.(val);\n\n if (!dropdownOpen()) {\n openDropdown();\n }\n };\n\n const handleFocus = (e: FocusEvent) => {\n // Only fix scroll when the trigger div (not the search input) receives focus.\n // The trigger div has offsetTop=0 relative to .dropdown (position:relative), which\n // causes Chromium to scroll the page to 0 when focusing it (a browser quirk).\n // We listen for the next scroll event and immediately restore the position.\n if (e.target === triggerRef) {\n const scrollX = window.scrollX;\n const scrollY = window.scrollY;\n // Chromium scrolls the page when focusing triggerRef because its offsetTop=0\n // relative to the .dropdown positioned parent (a browser quirk). We restore after\n // the focus-scroll completes by waiting for the scroll event, then deferring one rAF\n // so the browser's internal focus-scroll is truly done before we override it.\n const restoreScroll = () =>\n requestAnimationFrame(() => requestAnimationFrame(() => window.scrollTo(scrollX, scrollY)));\n window.addEventListener('scroll', restoreScroll, { once: true, passive: false });\n setTimeout(() => window.removeEventListener('scroll', restoreScroll), 200);\n }\n p.onFocus?.(e);\n };\n\n const handleBlur = (e: FocusEvent) => {\n const related = e.relatedTarget as HTMLElement | null;\n if (related && selectRootRef?.contains(related)) return;\n if (related?.closest('.nd-content')) return;\n // Suppress spurious focusout that fires immediately after openDropdown() while\n // SolidJS is re-rendering the DOM (before the search input is mounted and focused).\n if (performance.now() < suppressBlurUntil) return;\n p.onBlur?.(e);\n closeDropdown();\n };\n\n const selectedLabel = createMemo((): JSXElement => {\n if (isMultiple()) return null;\n const vals = selectedValues();\n if (vals.length === 0) return null;\n const val = vals[0];\n const opt = optionMap().get(val);\n\n if (p.labelRender) {\n return p.labelRender({\n value: val,\n label: opt?.label ?? String(val),\n key: String(val),\n });\n }\n\n return (opt?.label as Element) ?? String(val);\n });\n\n interface TagInfo {\n value: string | number;\n label: SolidComponent;\n closable: boolean;\n }\n const visibleTags = createMemo((): { visible: TagInfo[]; omitted: TagInfo[] } => {\n if (!isMultiple()) return { visible: [], omitted: [] };\n const vals = selectedValues();\n const map = optionMap();\n const maxTagCount = p.maxTagCount as number | 'responsive' | undefined;\n const maxTextLen = p.maxTagTextLength as number | undefined;\n\n const tags: TagInfo[] = vals.map(val => {\n const opt = map.get(val);\n let label: SolidComponent = opt?.label ?? String(val);\n if (maxTextLen && typeof label === 'string' && label.length > maxTextLen) {\n label = label.slice(0, maxTextLen) + '...';\n }\n return { value: val, label, closable: !p.disabled };\n });\n\n if (typeof maxTagCount === 'number' && tags.length > maxTagCount) {\n return { visible: tags.slice(0, maxTagCount), omitted: tags.slice(maxTagCount) };\n }\n\n return { visible: tags, omitted: [] };\n });\n\n const showClear = createMemo(() => {\n if (!p.allowClear) return false;\n if (p.disabled) return false;\n return selectedValues().length > 0;\n });\n\n const handleTriggerClick = (e: MouseEvent) => {\n if (p.disabled || p.loading) return;\n e.preventDefault();\n toggleDropdown();\n };\n\n const findOptionIndex = (target: EventTarget | null): number | null => {\n let el = target as HTMLElement | null;\n while (el) {\n const idx = el.dataset?.optionIndex;\n if (idx !== undefined) return Number(idx);\n\n if (el.classList?.contains('sel30')) return null;\n el = el.parentElement;\n }\n return null;\n };\n\n const handleListClick = (e: MouseEvent) => {\n const flatIdx = findOptionIndex(e.target);\n if (flatIdx === null) return;\n const opts = filteredOptions();\n const opt = opts[flatIdx];\n if (!opt || opt.disabled || (isMaxReached() && !isSelected(opt.value))) return;\n // In multiple mode, selecting an option re-renders the tag list (DOM mutation)\n // which can cause a spurious focusout. Suppress blur handling briefly.\n if (isMultiple()) suppressBlurUntil = performance.now() + 150;\n handleSelect(opt.value);\n };\n\n const renderOptionItem = (opt: FlatOption, flatIdx: number) => {\n const selected = () => isSelected(opt.value);\n const isActive = () => activeIndex() === flatIdx;\n const isDisabledOpt = () => opt.disabled || (isMaxReached() && !selected());\n\n const flattenData: FlattenOptionData = {\n label: opt.label,\n value: opt.value,\n disabled: opt.disabled,\n key: opt.value,\n groupLabel: opt.groupLabel,\n };\n\n const content = p.optionRender\n ? p.optionRender(flattenData, { index: flatIdx })\n : (opt.label as Element);\n\n return (\n <div\n data-option-index={flatIdx}\n class={cn(\n 'sel31',\n selected() && 'sel33',\n isActive() && 'sel32',\n isDisabledOpt() && 'sel34',\n opt.groupLabel !== undefined && 'sel38',\n opt.class,\n )}\n title={opt.title}\n >\n <span class=\"sel35\">{content}</span>\n <Show when={selected()}>\n <span class=\"sel36\">\n {p.menuItemSelectedIcon ? (\n (p.menuItemSelectedIcon as Element)\n ) : (\n <Check size={14} color=\"var(--color)\" stroke-width={3} />\n )}\n </span>\n </Show>\n </div>\n );\n };\n\n const dropdownContent = () => {\n const renderList = flatRenderList();\n\n if (renderList.length === 0) {\n return <div class=\"sel39\">{p.notFoundContent as Element}</div>;\n }\n\n if (p.virtual) {\n return (\n <div\n ref={el => {\n requestAnimationFrame(() => setListRef(el));\n }}\n class={cn('sel30', getColor(p.color))}\n style={{ 'max-height': `${p.listHeight}px`, 'overflow-y': 'auto' }}\n onClick={handleListClick}\n >\n <div\n style={{\n height: `${virtualizer.getTotalSize()}px`,\n width: '100%',\n position: 'relative',\n }}\n >\n <For each={virtualizer.getVirtualItems()}>\n {virtualRow => {\n const item = renderList[virtualRow.index];\n return (\n <div\n data-index={virtualRow.index}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n transform: `translateY(${virtualRow.start}px)`,\n }}\n >\n {item.type === 'group' ? (\n <div class=\"sel37\">{item.groupLabel as Element}</div>\n ) : (\n renderOptionItem(item.option, item.flatIdx)\n )}\n </div>\n );\n }}\n </For>\n </div>\n </div>\n );\n }\n\n return (\n <div\n ref={el => setListRef(el)}\n class=\"sel30\"\n style={{ 'max-height': `${p.listHeight}px` }}\n onClick={handleListClick}\n >\n <For each={renderList}>\n {item =>\n item.type === 'group' ? (\n <div class=\"sel37\">{item.groupLabel as Element}</div>\n ) : (\n renderOptionItem(item.option, item.flatIdx)\n )\n }\n </For>\n </div>\n );\n };\n\n const renderTag = (tag: { value: string | number; label: SolidComponent; closable: boolean }) => (\n <SelectTag\n tag={tag}\n removeIcon={p.removeIcon as JSXElement}\n tagRender={p.tagRender as ((props: TagRenderProps) => JSXElement) | undefined}\n onRemove={handleRemoveTag}\n />\n );\n\n createEffect(\n on(dropdownOpen, open => {\n if (open && p.defaultActiveFirstOption) {\n const opts = filteredOptions();\n const idx = opts.findIndex(o => !o.disabled && (!isMaxReached() || isSelected(o.value)));\n setActiveIndex(idx >= 0 ? idx : -1);\n }\n if (!open) {\n setActiveIndex(-1);\n }\n }),\n );\n\n createEffect(\n on(\n () => currentSearchText(),\n () => {\n if (dropdownOpen() && p.defaultActiveFirstOption) {\n const opts = filteredOptions();\n const idx = opts.findIndex(o => !o.disabled && (!isMaxReached() || isSelected(o.value)));\n setActiveIndex(idx >= 0 ? idx : -1);\n }\n },\n ),\n );\n\n createEffect(\n on(listRef, el => {\n if (el && dropdownOpen()) {\n requestAnimationFrame(() => {\n if (p.virtual) virtualizer.measure();\n scrollToFirstSelected();\n });\n }\n }),\n );\n\n createEffect(\n on(\n () => dropdownOpen(),\n open => {\n if (open && showSearchEnabled()) {\n queueMicrotask(() => inputRef?.focus({ preventScroll: true }));\n }\n },\n ),\n );\n\n return (\n <Dropdown\n ref={el => (selectRootRef = el)}\n open={dropdownOpen()}\n blockScroll={p.blockScroll}\n position={p.placement === 'top' ? 'top' : 'bottom'}\n class={{\n trigger: `${p.disabled ? 'pointer-events-none' : ''} w-full`,\n content: cn(\n 'border-c3 bg-base-100 rounded-box menu p-0',\n p.placement === 'bottom' ? 'mt-1 shadow-md' : 'shadow-md-top mb-1',\n p.class?.dropdownContent,\n ),\n }}\n triggerElement={\n <div\n ref={el => (triggerRef = el)}\n class={cn(\n selectVariants({ size: p.size, variant: p.variant }),\n getColor(p.color),\n dropdownOpen() && 'sel41 sel02',\n isMultiple() && 'sel40',\n p.class?.root,\n p.disabled && 'sel03',\n )}\n tabIndex={p.disabled ? -1 : 0}\n onClick={handleTriggerClick}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n role=\"combobox\"\n aria-expanded={dropdownOpen()}\n aria-haspopup=\"listbox\"\n >\n <Show when={p.prefix}>\n <span class=\"sel11\">{p.prefix as Element}</span>\n </Show>\n\n <div class=\"sel12\">\n <Show\n when={isMultiple()}\n fallback={\n <div class=\"sel13\">\n <Show\n when={selectedValues().length > 0}\n fallback={\n <span\n class=\"sel15\"\n style={{\n visibility: currentSearchText() ? 'hidden' : undefined,\n }}\n >\n {p.placeholder}\n </span>\n }\n >\n <span\n class=\"sel14\"\n style={{\n visibility:\n currentSearchText() && showSearchEnabled() ? 'hidden' : undefined,\n }}\n >\n {selectedLabel()}\n </span>\n </Show>\n </div>\n }\n >\n <div class=\"sel16\">\n <For each={visibleTags().visible}>{tag => renderTag(tag)}</For>\n\n <Show when={visibleTags().omitted.length > 0}>\n <InnerTooltip\n content={\n <For each={visibleTags().omitted}>\n {tag => (\n <SelectTag\n tag={tag}\n removeIcon={p.removeIcon as JSXElement}\n tagRender={\n p.tagRender as ((props: TagRenderProps) => JSXElement) | undefined\n }\n onRemove={handleRemoveTag}\n />\n )}\n </For>\n }\n >\n <span class=\"sel17 sel20\">\n {(() => {\n const placeholder = p.maxTagPlaceholder;\n if (typeof placeholder === 'function') {\n const omittedValues = visibleTags().omitted.map(t => ({\n value: t.value,\n label: t.label,\n })) as LabeledValue[];\n return placeholder(omittedValues) as Element;\n }\n if (placeholder) return placeholder;\n return `+${visibleTags().omitted.length} more...`;\n })()}\n </span>\n </InnerTooltip>\n </Show>\n\n <Show when={selectedValues().length === 0}>\n <span class=\"sel15\">{p.placeholder}</span>\n </Show>\n </div>\n </Show>\n </div>\n\n <div class=\"sel22\">\n <Show when={showClear()}>\n <span class=\"sel26\" onClick={handleClear}>\n <X class=\"m-auto\" size={14} />\n </span>\n </Show>\n <Show when={!p.loading} fallback={<span class=\"sel25\"></span>}>\n <span class={cn('sel23', dropdownOpen() && 'sel24')}>\n {p.suffixIcon ? (p.suffixIcon as Element) : <ChevronDown size={16} />}\n </span>\n </Show>\n </div>\n </div>\n }\n >\n <div\n role=\"listbox\"\n class={getColor(p.color)}\n onMouseDown={e => {\n if ((e.target as HTMLElement)?.tagName !== 'INPUT') {\n e.preventDefault();\n }\n }}\n >\n <Show when={showSearchEnabled()}>\n <div class=\"flex items-center px-3 shadow-2xs\">\n <Search size={14} />\n <input\n ref={ref => (inputRef = ref)}\n class=\"sel29\"\n value={currentSearchText()}\n onInput={handleSearchInput}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n disabled={p.disabled}\n autocomplete=\"off\"\n role=\"combobox\"\n aria-expanded={dropdownOpen()}\n aria-haspopup=\"listbox\"\n aria-autocomplete=\"list\"\n placeholder=\"Search...\"\n />\n </div>\n </Show>\n {p.popupRender ? p.popupRender(dropdownContent()) : dropdownContent()}\n </div>\n </Dropdown>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"select.js","names":["SolidComponent","cn","getColor","createVirtualizer","cva","VariantProps","Check","ChevronDown","Search","X","createEffect","createMemo","createSignal","For","mergeProps","on","Show","Component","JSXElement","Dropdown","FlattenOptionData","LabeledValue","OptGroupType","SelectBaseProps","SelectFieldNames","SelectOptionType","SelectProps","SelectValue","ShowSearchConfig","TagRenderProps","selectVariants","variants","variant","outline","filled","borderless","underlined","size","lg","md","sm","color","neutral","primary","secondary","accent","info","success","warning","error","SelectVariantsProps","SelectTagProps","tag","value","label","closable","removeIcon","tagRender","props","onRemove","e","MouseEvent","SelectTag","onClose","_el$","_tmpl$2","_el$2","firstChild","_$insert","Element","_$createComponent","when","children","_el$3","_tmpl$","$$click","_c$","_$memo","InnerTooltip","content","_el$4","_tmpl$3","_el$5","_el$6","resolveFieldNames","fn","options","groupLabel","getField","option","field","FlatOption","disabled","class","title","raw","flattenOptions","fieldNames","ReturnType","result","opt","subOptions","Array","isArray","sub","push","undefined","OptionGroup","items","regroupFlatOptions","flatOptions","groups","last","length","extractValue","v","extractValues","map","item","filter","x","single","Select","p","const","loading","placement","listHeight","virtual","defaultActiveFirstOption","notFoundContent","labelInValue","placeholder","blockScroll","isMultiple","mode","allowCustomValue","showSearchEnabled","showSearch","searchConfig","base","autoClearSearchValue","filterOption","optionFilterProp","internalValue","setInternalValue","defaultValue","isOpen","setIsOpen","defaultOpen","searchText","setSearchText","activeIndex","setActiveIndex","selectedValues","dropdownOpen","open","controlledSearchValue","cfg","searchValue","currentSearchText","inputRef","HTMLInputElement","selectRootRef","HTMLDivElement","triggerRef","listRef","setListRef","allFlatOptions","allOptionsWithCustom","flat","existingValues","Set","o","customOpts","val","has","String","optionMap","Map","set","filteredOptions","all","text","filtered","Function","filterProps","lowerText","toLowerCase","some","prop","includes","filterSort","sortFn","sort","a","b","groupedForRender","RenderItem","type","flatIdx","flatRenderList","group","ITEM_HEIGHT","GROUP_LABEL_HEIGHT","virtualizer","count","getScrollElement","estimateSize","index","overscan","selectedValuesSet","isSelected","isMaxReached","max","maxCount","suppressBlurUntil","openDropdown","performance","now","onOpenChange","closeDropdown","onSearch","toggleDropdown","buildOutputValue","values","get","buildOutputOption","handleSelect","optValue","rawOpt","current","newValues","deselectVal","onDeselect","selectVal","onSelect","onChange","handleClear","stopPropagation","preventDefault","onClear","handleRemoveTag","handleKeyDown","KeyboardEvent","onInputKeyDown","opts","key","next","onActive","scrollActiveIntoView","prev","idx","trim","focus","vals","list","renderIdx","findIndex","scrollToIndex","align","el","querySelectorAll","HTMLElement","scrollIntoView","block","scrollToFirstSelected","firstSelectedValue","querySelector","handleSearchInput","InputEvent","target","handleFocus","FocusEvent","scrollX","window","scrollY","restoreScroll","requestAnimationFrame","scrollTo","addEventListener","once","passive","setTimeout","removeEventListener","onFocus","handleBlur","related","relatedTarget","contains","closest","onBlur","selectedLabel","labelRender","TagInfo","visibleTags","visible","omitted","maxTagCount","maxTextLen","maxTagTextLength","tags","slice","showClear","allowClear","handleTriggerClick","findOptionIndex","EventTarget","dataset","optionIndex","Number","classList","parentElement","handleListClick","renderOptionItem","selected","isActive","isDisabledOpt","flattenData","optionRender","_el$7","_tmpl$5","_el$8","_$setAttribute","_el$9","_tmpl$4","_c$2","menuItemSelectedIcon","_$effect","_p$","_v$","_v$2","_$className","t","dropdownContent","renderList","_el$0","_tmpl$6","_el$1","_tmpl$7","_el$10","_$use","each","getVirtualItems","virtualRow","_el$11","_tmpl$8","_c$3","_el$12","_tmpl$9","_v$6","_v$7","start","_$setStyleProperty","_v$3","_v$4","_v$5","getTotalSize","_el$13","_tmpl$0","_el$14","_$p","renderTag","measure","queueMicrotask","preventScroll","ref","position","trigger","triggerElement","_el$18","_tmpl$17","_el$20","_el$24","nextSibling","$$keydown","prefix","_el$19","_tmpl$11","fallback","_el$27","_tmpl$19","_el$29","_tmpl$13","_el$28","_tmpl$18","_el$21","_tmpl$14","_el$22","_tmpl$12","maxTagPlaceholder","omittedValues","_el$23","_el$25","_tmpl$15","_tmpl$20","_el$26","_tmpl$16","_c$5","suffixIcon","_v$0","root","_v$1","_v$10","_el$15","_tmpl$10","$$mousedown","tagName","_el$16","_tmpl$1","_el$17","$$input","_v$8","_v$9","_c$4","popupRender","_$delegateEvents"],"sources":["../../../src/components/select/select.tsx"],"sourcesContent":["import type { SolidComponent } from '@/type';\r\nimport { cn } from '@/utils/cn';\r\nimport { getColor } from '@/utils/helper';\r\nimport { createVirtualizer } from '@tanstack/solid-virtual';\r\nimport { cva, type VariantProps } from 'class-variance-authority';\r\nimport Check from 'lucide-solid/icons/check';\r\nimport ChevronDown from 'lucide-solid/icons/chevron-down';\r\nimport Search from 'lucide-solid/icons/search';\r\nimport X from 'lucide-solid/icons/x';\r\nimport {\r\n createEffect,\r\n createMemo,\r\n createSignal,\r\n For,\r\n mergeProps,\r\n on,\r\n Show,\r\n type Component,\r\n type JSXElement,\r\n} from 'solid-js';\r\nimport { Dropdown } from '../dropdown';\r\nimport type {\r\n FlattenOptionData,\r\n LabeledValue,\r\n OptGroupType,\r\n SelectBaseProps,\r\n SelectFieldNames,\r\n SelectOptionType,\r\n SelectProps,\r\n SelectValue,\r\n ShowSearchConfig,\r\n TagRenderProps,\r\n} from './select.types';\r\n\r\nconst selectVariants = cva('sel01', {\r\n variants: {\r\n variant: {\r\n outline: 'sel07',\r\n filled: 'sel09',\r\n borderless: 'sel08',\r\n underlined: 'sel10',\r\n },\r\n size: {\r\n lg: 'sel06',\r\n md: 'sel05',\r\n sm: 'sel04',\r\n },\r\n color: {\r\n neutral: 'input-neutral',\r\n primary: 'input-primary',\r\n secondary: 'input-secondary',\r\n accent: 'input-accent',\r\n info: 'input-info',\r\n success: 'input-success',\r\n warning: 'input-warning',\r\n error: 'input-error',\r\n },\r\n },\r\n});\r\nexport type SelectVariantsProps = VariantProps<typeof selectVariants>;\r\n\r\ntype SelectTagProps = {\r\n tag: { value: string | number; label: SolidComponent; closable: boolean };\r\n removeIcon?: JSXElement;\r\n tagRender?: (props: TagRenderProps) => JSXElement;\r\n onRemove: (value: string | number, e: MouseEvent) => void;\r\n};\r\n\r\nconst SelectTag: Component<SelectTagProps> = props => {\r\n if (props.tagRender) {\r\n return props.tagRender({\r\n label: props.tag.label,\r\n value: props.tag.value,\r\n closable: props.tag.closable,\r\n onClose: () => props.onRemove(props.tag.value, new MouseEvent('click')),\r\n }) as JSXElement;\r\n }\r\n\r\n return (\r\n <span class=\"sel17\">\r\n <span class=\"sel18\">{props.tag.label as Element}</span>\r\n <Show when={props.tag.closable}>\r\n <span class=\"sel19\" onClick={e => props.onRemove(props.tag.value, e)}>\r\n {props.removeIcon ? (\r\n (props.removeIcon as Element)\r\n ) : (\r\n <X class=\"m-auto\" size={12} stroke-width={3} />\r\n )}\r\n </span>\r\n </Show>\r\n </span>\r\n );\r\n};\r\n\r\nconst InnerTooltip: Component<{ content: JSXElement; children: JSXElement }> = props => {\r\n return (\r\n <span class=\"sel42\">\r\n {props.children}\r\n <span class=\"sel43\">\r\n <span class=\"sel44\">{props.content}</span>\r\n </span>\r\n </span>\r\n );\r\n};\r\n\r\nfunction resolveFieldNames(fn?: SelectFieldNames) {\r\n return {\r\n label: fn?.label ?? 'label',\r\n value: fn?.value ?? 'value',\r\n options: fn?.options ?? 'options',\r\n groupLabel: fn?.groupLabel ?? 'label',\r\n };\r\n}\r\n\r\nfunction getField(option: any, field: string): any {\r\n return option?.[field];\r\n}\r\n\r\ninterface FlatOption {\r\n label: SolidComponent;\r\n value: string | number;\r\n disabled?: boolean;\r\n class?: string;\r\n title?: string;\r\n groupLabel?: SolidComponent;\r\n raw: any;\r\n}\r\n\r\nfunction flattenOptions(\r\n options: (SelectOptionType | OptGroupType)[] | undefined,\r\n fieldNames: ReturnType<typeof resolveFieldNames>,\r\n): FlatOption[] {\r\n if (!options) return [];\r\n const result: FlatOption[] = [];\r\n for (const opt of options) {\r\n const subOptions = getField(opt, fieldNames.options) as SelectOptionType[] | undefined;\r\n if (subOptions && Array.isArray(subOptions)) {\r\n const groupLabel = getField(opt, fieldNames.groupLabel) as SolidComponent;\r\n for (const sub of subOptions) {\r\n result.push({\r\n label: getField(sub, fieldNames.label) as SolidComponent,\r\n value: getField(sub, fieldNames.value) as string | number,\r\n disabled: sub.disabled,\r\n class: sub.class,\r\n title: sub.title,\r\n groupLabel,\r\n raw: sub,\r\n });\r\n }\r\n } else {\r\n result.push({\r\n label: getField(opt, fieldNames.label) as SolidComponent,\r\n value: getField(opt, fieldNames.value) as string | number,\r\n disabled: (opt as SelectOptionType).disabled,\r\n class: (opt as SelectOptionType).class,\r\n title: (opt as SelectOptionType).title,\r\n groupLabel: undefined,\r\n raw: opt,\r\n });\r\n }\r\n }\r\n return result;\r\n}\r\n\r\ninterface OptionGroup {\r\n groupLabel?: SolidComponent;\r\n items: FlatOption[];\r\n}\r\n\r\nfunction regroupFlatOptions(flatOptions: FlatOption[]): OptionGroup[] {\r\n const groups: OptionGroup[] = [];\r\n for (const opt of flatOptions) {\r\n const last = groups[groups.length - 1];\r\n if (last && last.groupLabel === opt.groupLabel) {\r\n last.items.push(opt);\r\n } else {\r\n groups.push({ groupLabel: opt.groupLabel, items: [opt] });\r\n }\r\n }\r\n return groups;\r\n}\r\n\r\nfunction extractValue(v: string | number | LabeledValue | undefined): string | number | undefined {\r\n if (v === undefined || v === null) return undefined;\r\n if (typeof v === 'object' && 'value' in v) return v.value;\r\n return v as string | number;\r\n}\r\n\r\nfunction extractValues(\r\n v: string | string[] | number | number[] | LabeledValue | LabeledValue[] | undefined,\r\n): (string | number)[] {\r\n if (v === undefined || v === null) return [];\r\n if (Array.isArray(v)) {\r\n return v.map(item => extractValue(item)!).filter(x => x !== undefined);\r\n }\r\n const single = extractValue(v as string | number | LabeledValue);\r\n return single !== undefined ? [single] : [];\r\n}\r\n\r\nexport const Select: Component<SelectProps> = p => {\r\n p = mergeProps(\r\n {\r\n color: 'error' as const,\r\n size: 'md' as const,\r\n variant: 'outline' as const,\r\n disabled: false,\r\n loading: false,\r\n placement: 'bottom' as const,\r\n listHeight: 256,\r\n virtual: false,\r\n defaultActiveFirstOption: false,\r\n notFoundContent: 'Not Found' as SolidComponent,\r\n labelInValue: false,\r\n placeholder: 'Select...',\r\n blockScroll: true,\r\n } as SelectBaseProps,\r\n p,\r\n );\r\n\r\n const fieldNames = createMemo(() => resolveFieldNames(p.fieldNames));\r\n\r\n const isMultiple = createMemo(() => p.mode === 'multiple');\r\n const allowCustomValue = createMemo(() => isMultiple() && !!(p as any).allowCustomValue);\r\n\r\n const showSearchEnabled = createMemo(() => {\r\n if (typeof p.showSearch === 'boolean') return p.showSearch;\r\n if (typeof p.showSearch === 'object') return true;\r\n\r\n return isMultiple();\r\n });\r\n\r\n const searchConfig = createMemo((): ShowSearchConfig => {\r\n const base: ShowSearchConfig = {\r\n autoClearSearchValue: true,\r\n filterOption: true,\r\n optionFilterProp: 'value',\r\n };\r\n if (typeof p.showSearch === 'object') {\r\n return { ...base, ...p.showSearch };\r\n }\r\n return base;\r\n });\r\n\r\n const [internalValue, setInternalValue] = createSignal<(string | number)[]>(\r\n extractValues(p.defaultValue),\r\n );\r\n const [isOpen, setIsOpen] = createSignal(p.defaultOpen ?? false);\r\n const [searchText, setSearchText] = createSignal('');\r\n const [activeIndex, setActiveIndex] = createSignal(-1);\r\n\r\n const selectedValues = createMemo(() => {\r\n if (p.value !== undefined) {\r\n return extractValues(p.value);\r\n }\r\n return internalValue();\r\n });\r\n\r\n const dropdownOpen = createMemo(() => {\r\n if (p.open !== undefined) {\r\n return p.open as boolean;\r\n }\r\n return isOpen();\r\n });\r\n\r\n const controlledSearchValue = createMemo(() => {\r\n const cfg = searchConfig();\r\n if (cfg.searchValue !== undefined) return cfg.searchValue;\r\n return undefined;\r\n });\r\n\r\n const currentSearchText = createMemo(() => {\r\n return controlledSearchValue() ?? searchText();\r\n });\r\n\r\n let inputRef: HTMLInputElement | undefined;\r\n let selectRootRef: HTMLDivElement | undefined;\r\n let triggerRef: HTMLDivElement | undefined;\r\n const [listRef, setListRef] = createSignal<HTMLDivElement | null>(null);\r\n\r\n const allFlatOptions = createMemo(() => flattenOptions(p.options, fieldNames()));\r\n\r\n const allOptionsWithCustom = createMemo(() => {\r\n const flat = allFlatOptions();\r\n if (!allowCustomValue()) return flat;\r\n const existingValues = new Set(flat.map(o => o.value));\r\n const customOpts: FlatOption[] = [];\r\n for (const val of selectedValues()) {\r\n if (!existingValues.has(val)) {\r\n customOpts.push({\r\n label: String(val),\r\n value: val,\r\n disabled: false,\r\n class: undefined,\r\n title: undefined,\r\n groupLabel: undefined,\r\n raw: { label: String(val), value: val },\r\n });\r\n }\r\n }\r\n return [...flat, ...customOpts];\r\n });\r\n\r\n const optionMap = createMemo(() => {\r\n const map = new Map<string | number, FlatOption>();\r\n for (const opt of allOptionsWithCustom()) {\r\n map.set(opt.value, opt);\r\n }\r\n return map;\r\n });\r\n\r\n const filteredOptions = createMemo(() => {\r\n const all = allOptionsWithCustom();\r\n const text = currentSearchText();\r\n if (!text || !showSearchEnabled()) return all;\r\n\r\n const cfg = searchConfig();\r\n if (cfg.filterOption === false) return all;\r\n\r\n let filtered: FlatOption[];\r\n if (typeof cfg.filterOption === 'function') {\r\n filtered = all.filter(opt =>\r\n (cfg.filterOption as Function)(text, opt.raw as SelectOptionType),\r\n );\r\n } else {\r\n const filterProps = Array.isArray(cfg.optionFilterProp)\r\n ? cfg.optionFilterProp\r\n : [cfg.optionFilterProp ?? 'value'];\r\n const lowerText = text.toLowerCase();\r\n filtered = all.filter(opt => {\r\n return filterProps.some(prop => {\r\n const val = getField(opt.raw, prop) ?? (prop === 'label' ? opt.label : opt.value);\r\n return String(val ?? '')\r\n .toLowerCase()\r\n .includes(lowerText);\r\n });\r\n });\r\n }\r\n\r\n if (cfg.filterSort) {\r\n const sortFn = cfg.filterSort;\r\n filtered.sort((a, b) =>\r\n sortFn(a.raw as SelectOptionType, b.raw as SelectOptionType, { searchValue: text }),\r\n );\r\n }\r\n\r\n return filtered;\r\n });\r\n\r\n const groupedForRender = createMemo(() => {\r\n const text = currentSearchText();\r\n if (text && showSearchEnabled()) {\r\n return [{ groupLabel: undefined, items: filteredOptions() }] as OptionGroup[];\r\n }\r\n return regroupFlatOptions(allOptionsWithCustom());\r\n });\r\n\r\n type RenderItem =\r\n | { type: 'group'; groupLabel: SolidComponent }\r\n | { type: 'option'; option: FlatOption; flatIdx: number };\r\n\r\n const flatRenderList = createMemo((): RenderItem[] => {\r\n const groups = groupedForRender();\r\n const result: RenderItem[] = [];\r\n let flatIdx = 0;\r\n for (const group of groups) {\r\n if (group.groupLabel !== undefined) {\r\n result.push({ type: 'group', groupLabel: group.groupLabel });\r\n }\r\n for (const item of group.items) {\r\n result.push({ type: 'option', option: item, flatIdx });\r\n flatIdx++;\r\n }\r\n }\r\n return result;\r\n });\r\n\r\n const ITEM_HEIGHT = 32;\r\n const GROUP_LABEL_HEIGHT = 28;\r\n\r\n const virtualizer = createVirtualizer({\r\n get count() {\r\n return flatRenderList().length;\r\n },\r\n getScrollElement: () => listRef(),\r\n estimateSize: (index: number) => {\r\n const item = flatRenderList()[index];\r\n return item?.type === 'group' ? GROUP_LABEL_HEIGHT : ITEM_HEIGHT;\r\n },\r\n overscan: 2,\r\n });\r\n\r\n const selectedValuesSet = createMemo(() => new Set(selectedValues()));\r\n\r\n const isSelected = (val: string | number) => {\r\n return selectedValuesSet().has(val);\r\n };\r\n\r\n const isMaxReached = createMemo(() => {\r\n if (!isMultiple()) return false;\r\n const max = p.maxCount as number | undefined;\r\n if (max === undefined) return false;\r\n return selectedValues().length >= max;\r\n });\r\n\r\n // Set for a brief window after openDropdown() to suppress spurious focusout events\r\n // that fire when SolidJS re-renders the DOM (inserting dropdown content causes\r\n // the focused trigger div to receive a focusout with relatedTarget=null before\r\n // the search input is mounted and re-focused via queueMicrotask).\r\n let suppressBlurUntil = 0;\r\n\r\n const openDropdown = () => {\r\n if (p.disabled) return;\r\n suppressBlurUntil = performance.now() + 150;\r\n if (p.open === undefined) {\r\n setIsOpen(true);\r\n }\r\n p.onOpenChange?.(true);\r\n };\r\n\r\n const closeDropdown = () => {\r\n if (p.open === undefined) {\r\n setIsOpen(false);\r\n }\r\n setListRef(null);\r\n p.onOpenChange?.(false);\r\n\r\n if (showSearchEnabled()) {\r\n setSearchText('');\r\n searchConfig().onSearch?.('');\r\n }\r\n };\r\n\r\n const toggleDropdown = () => {\r\n if (dropdownOpen()) {\r\n closeDropdown();\r\n } else {\r\n openDropdown();\r\n }\r\n };\r\n\r\n const buildOutputValue = (values: (string | number)[]): SelectValue => {\r\n const map = optionMap();\r\n if (isMultiple()) {\r\n if (p.labelInValue) {\r\n return values.map(v => {\r\n const opt = map.get(v);\r\n return {\r\n value: v,\r\n label: opt?.label ?? String(v),\r\n } as LabeledValue;\r\n });\r\n }\r\n return values as string[] | number[];\r\n }\r\n\r\n const val = values[0];\r\n if (val === undefined) return undefined as any;\r\n if (p.labelInValue) {\r\n const opt = map.get(val);\r\n return {\r\n value: val,\r\n label: opt?.label ?? String(val),\r\n } as LabeledValue;\r\n }\r\n return val;\r\n };\r\n\r\n const buildOutputOption = (\r\n values: (string | number)[],\r\n ): SelectOptionType | SelectOptionType[] => {\r\n const map = optionMap();\r\n if (isMultiple()) {\r\n return values.map(v => {\r\n const opt = map.get(v);\r\n return (opt?.raw as SelectOptionType) ?? { value: v, label: String(v) };\r\n });\r\n }\r\n const val = values[0];\r\n const opt = map.get(val);\r\n return (opt?.raw as SelectOptionType) ?? { value: val, label: String(val) };\r\n };\r\n\r\n const handleSelect = (optValue: string | number) => {\r\n const opt = optionMap().get(optValue);\r\n const rawOpt = (opt?.raw as SelectOptionType) ?? {\r\n value: optValue,\r\n label: String(optValue),\r\n };\r\n\r\n if (isMultiple()) {\r\n const current = selectedValues();\r\n let newValues: (string | number)[];\r\n\r\n if (current.includes(optValue)) {\r\n newValues = current.filter(v => v !== optValue);\r\n const deselectVal = p.labelInValue\r\n ? ({ value: optValue, label: opt?.label ?? String(optValue) } as LabeledValue)\r\n : optValue;\r\n p.onDeselect?.(deselectVal);\r\n } else {\r\n if (isMaxReached()) return;\r\n newValues = [...current, optValue];\r\n const selectVal = p.labelInValue\r\n ? ({ value: optValue, label: opt?.label ?? String(optValue) } as LabeledValue)\r\n : optValue;\r\n p.onSelect?.(selectVal, rawOpt);\r\n }\r\n\r\n if (p.value === undefined) {\r\n setInternalValue(newValues);\r\n }\r\n p.onChange?.(buildOutputValue(newValues), buildOutputOption(newValues));\r\n\r\n if (searchConfig().autoClearSearchValue !== false) {\r\n setSearchText('');\r\n searchConfig().onSearch?.('');\r\n }\r\n } else {\r\n const newValues = [optValue];\r\n const selectVal = p.labelInValue\r\n ? ({ value: optValue, label: opt?.label ?? String(optValue) } as LabeledValue)\r\n : optValue;\r\n p.onSelect?.(selectVal, rawOpt);\r\n\r\n if (p.value === undefined) {\r\n setInternalValue(newValues);\r\n }\r\n p.onChange?.(buildOutputValue(newValues), buildOutputOption(newValues));\r\n closeDropdown();\r\n setSearchText('');\r\n }\r\n };\r\n\r\n const handleClear = (e: MouseEvent) => {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n if (p.value === undefined) {\r\n setInternalValue([]);\r\n }\r\n p.onClear?.();\r\n p.onChange?.(isMultiple() ? [] : (undefined as any), isMultiple() ? [] : (undefined as any));\r\n setSearchText('');\r\n };\r\n\r\n const handleRemoveTag = (val: string | number, e?: MouseEvent) => {\r\n e?.stopPropagation();\r\n e?.preventDefault();\r\n const current = selectedValues();\r\n const newValues = current.filter(v => v !== val);\r\n\r\n const opt = optionMap().get(val);\r\n const deselectVal = p.labelInValue\r\n ? ({ value: val, label: opt?.label ?? String(val) } as LabeledValue)\r\n : val;\r\n p.onDeselect?.(deselectVal);\r\n\r\n if (p.value === undefined) {\r\n setInternalValue(newValues);\r\n }\r\n p.onChange?.(buildOutputValue(newValues), buildOutputOption(newValues));\r\n };\r\n\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n if (p.disabled) return;\r\n p.onInputKeyDown?.(e);\r\n\r\n const opts = filteredOptions();\r\n\r\n switch (e.key) {\r\n case 'ArrowDown': {\r\n e.preventDefault();\r\n if (!dropdownOpen()) {\r\n openDropdown();\r\n return;\r\n }\r\n let next = activeIndex() + 1;\r\n while (next < opts.length) {\r\n const opt = opts[next];\r\n if (!opt.disabled && (!isMaxReached() || isSelected(opt.value))) {\r\n break;\r\n }\r\n next++;\r\n }\r\n if (next < opts.length) {\r\n setActiveIndex(next);\r\n const val = p.labelInValue\r\n ? ({ value: opts[next].value, label: opts[next].label } as LabeledValue)\r\n : opts[next].value;\r\n p.onActive?.(val);\r\n scrollActiveIntoView(next);\r\n }\r\n break;\r\n }\r\n case 'ArrowUp': {\r\n e.preventDefault();\r\n if (!dropdownOpen()) {\r\n openDropdown();\r\n return;\r\n }\r\n let prev = activeIndex() === -1 ? opts.length - 1 : activeIndex() - 1;\r\n while (prev >= 0) {\r\n const opt = opts[prev];\r\n if (!opt.disabled && (!isMaxReached() || isSelected(opt.value))) {\r\n break;\r\n }\r\n prev--;\r\n }\r\n if (prev >= 0) {\r\n setActiveIndex(prev);\r\n const val = p.labelInValue\r\n ? ({ value: opts[prev].value, label: opts[prev].label } as LabeledValue)\r\n : opts[prev].value;\r\n p.onActive?.(val);\r\n scrollActiveIntoView(prev);\r\n }\r\n break;\r\n }\r\n case 'Enter':\r\n case ' ': {\r\n e.preventDefault();\r\n if (!dropdownOpen()) {\r\n openDropdown();\r\n return;\r\n }\r\n if (e.key === ' ' && showSearchEnabled()) break;\r\n const idx = activeIndex();\r\n if (idx >= 0 && idx < opts.length) {\r\n const opt = opts[idx];\r\n if (!opt.disabled) {\r\n handleSelect(opt.value);\r\n }\r\n } else if (allowCustomValue() && currentSearchText().trim()) {\r\n const tag = currentSearchText().trim();\r\n handleSelect(tag);\r\n }\r\n break;\r\n }\r\n case 'Escape': {\r\n e.preventDefault();\r\n closeDropdown();\r\n triggerRef?.focus();\r\n break;\r\n }\r\n case 'Backspace': {\r\n if (isMultiple() && currentSearchText() === '') {\r\n const vals = selectedValues();\r\n if (vals.length > 0) {\r\n handleRemoveTag(vals[vals.length - 1]);\r\n }\r\n }\r\n break;\r\n }\r\n case 'Tab': {\r\n closeDropdown();\r\n break;\r\n }\r\n }\r\n };\r\n\r\n const scrollActiveIntoView = (flatIdx: number) => {\r\n if (p.virtual) {\r\n const list = flatRenderList();\r\n const renderIdx = list.findIndex(item => item.type === 'option' && item.flatIdx === flatIdx);\r\n if (renderIdx >= 0) {\r\n virtualizer.scrollToIndex(renderIdx, { align: 'auto' });\r\n }\r\n return;\r\n }\r\n\r\n const el = listRef();\r\n if (!el) return;\r\n const items = el.querySelectorAll('[data-option-index]');\r\n const item = items[flatIdx] as HTMLElement | undefined;\r\n if (item) {\r\n item.scrollIntoView({ block: 'nearest' });\r\n }\r\n };\r\n\r\n const scrollToFirstSelected = () => {\r\n const vals = selectedValues();\r\n if (vals.length === 0) return;\r\n\r\n const firstSelectedValue = vals[0];\r\n const opts = filteredOptions();\r\n const flatIdx = opts.findIndex(o => o.value === firstSelectedValue);\r\n if (flatIdx < 0) return;\r\n\r\n if (p.virtual) {\r\n const list = flatRenderList();\r\n const renderIdx = list.findIndex(item => item.type === 'option' && item.flatIdx === flatIdx);\r\n if (renderIdx >= 0) {\r\n virtualizer.scrollToIndex(renderIdx, { align: 'start' });\r\n }\r\n } else {\r\n const el = listRef();\r\n if (!el) return;\r\n const item = el.querySelector(`[data-option-index=\"${flatIdx}\"]`) as HTMLElement | null;\r\n if (item) {\r\n item.scrollIntoView({ block: 'nearest' });\r\n }\r\n }\r\n };\r\n\r\n const handleSearchInput = (e: InputEvent) => {\r\n const target = e.target as HTMLInputElement;\r\n const val = target.value;\r\n\r\n if (controlledSearchValue() === undefined) {\r\n setSearchText(val);\r\n }\r\n searchConfig().onSearch?.(val);\r\n\r\n if (!dropdownOpen()) {\r\n openDropdown();\r\n }\r\n };\r\n\r\n const handleFocus = (e: FocusEvent) => {\r\n // Only fix scroll when the trigger div (not the search input) receives focus.\r\n // The trigger div has offsetTop=0 relative to .dropdown (position:relative), which\r\n // causes Chromium to scroll the page to 0 when focusing it (a browser quirk).\r\n // We listen for the next scroll event and immediately restore the position.\r\n if (e.target === triggerRef) {\r\n const scrollX = window.scrollX;\r\n const scrollY = window.scrollY;\r\n // Chromium scrolls the page when focusing triggerRef because its offsetTop=0\r\n // relative to the .dropdown positioned parent (a browser quirk). We restore after\r\n // the focus-scroll completes by waiting for the scroll event, then deferring one rAF\r\n // so the browser's internal focus-scroll is truly done before we override it.\r\n const restoreScroll = () =>\r\n requestAnimationFrame(() => requestAnimationFrame(() => window.scrollTo(scrollX, scrollY)));\r\n window.addEventListener('scroll', restoreScroll, { once: true, passive: false });\r\n setTimeout(() => window.removeEventListener('scroll', restoreScroll), 200);\r\n }\r\n p.onFocus?.(e);\r\n };\r\n\r\n const handleBlur = (e: FocusEvent) => {\r\n const related = e.relatedTarget as HTMLElement | null;\r\n if (related && selectRootRef?.contains(related)) return;\r\n if (related?.closest('.nd-content')) return;\r\n // Suppress spurious focusout that fires immediately after openDropdown() while\r\n // SolidJS is re-rendering the DOM (before the search input is mounted and focused).\r\n if (performance.now() < suppressBlurUntil) return;\r\n p.onBlur?.(e);\r\n closeDropdown();\r\n };\r\n\r\n const selectedLabel = createMemo((): JSXElement => {\r\n if (isMultiple()) return null;\r\n const vals = selectedValues();\r\n if (vals.length === 0) return null;\r\n const val = vals[0];\r\n const opt = optionMap().get(val);\r\n\r\n if (p.labelRender) {\r\n return p.labelRender({\r\n value: val,\r\n label: opt?.label ?? String(val),\r\n key: String(val),\r\n });\r\n }\r\n\r\n return (opt?.label as Element) ?? String(val);\r\n });\r\n\r\n interface TagInfo {\r\n value: string | number;\r\n label: SolidComponent;\r\n closable: boolean;\r\n }\r\n const visibleTags = createMemo((): { visible: TagInfo[]; omitted: TagInfo[] } => {\r\n if (!isMultiple()) return { visible: [], omitted: [] };\r\n const vals = selectedValues();\r\n const map = optionMap();\r\n const maxTagCount = p.maxTagCount as number | 'responsive' | undefined;\r\n const maxTextLen = p.maxTagTextLength as number | undefined;\r\n\r\n const tags: TagInfo[] = vals.map(val => {\r\n const opt = map.get(val);\r\n let label: SolidComponent = opt?.label ?? String(val);\r\n if (maxTextLen && typeof label === 'string' && label.length > maxTextLen) {\r\n label = label.slice(0, maxTextLen) + '...';\r\n }\r\n return { value: val, label, closable: !p.disabled };\r\n });\r\n\r\n if (typeof maxTagCount === 'number' && tags.length > maxTagCount) {\r\n return { visible: tags.slice(0, maxTagCount), omitted: tags.slice(maxTagCount) };\r\n }\r\n\r\n return { visible: tags, omitted: [] };\r\n });\r\n\r\n const showClear = createMemo(() => {\r\n if (!p.allowClear) return false;\r\n if (p.disabled) return false;\r\n return selectedValues().length > 0;\r\n });\r\n\r\n const handleTriggerClick = (e: MouseEvent) => {\r\n if (p.disabled || p.loading) return;\r\n e.preventDefault();\r\n toggleDropdown();\r\n };\r\n\r\n const findOptionIndex = (target: EventTarget | null): number | null => {\r\n let el = target as HTMLElement | null;\r\n while (el) {\r\n const idx = el.dataset?.optionIndex;\r\n if (idx !== undefined) return Number(idx);\r\n\r\n if (el.classList?.contains('sel30')) return null;\r\n el = el.parentElement;\r\n }\r\n return null;\r\n };\r\n\r\n const handleListClick = (e: MouseEvent) => {\r\n const flatIdx = findOptionIndex(e.target);\r\n if (flatIdx === null) return;\r\n const opts = filteredOptions();\r\n const opt = opts[flatIdx];\r\n if (!opt || opt.disabled || (isMaxReached() && !isSelected(opt.value))) return;\r\n // In multiple mode, selecting an option re-renders the tag list (DOM mutation)\r\n // which can cause a spurious focusout. Suppress blur handling briefly.\r\n if (isMultiple()) suppressBlurUntil = performance.now() + 150;\r\n handleSelect(opt.value);\r\n };\r\n\r\n const renderOptionItem = (opt: FlatOption, flatIdx: number) => {\r\n const selected = () => isSelected(opt.value);\r\n const isActive = () => activeIndex() === flatIdx;\r\n const isDisabledOpt = () => opt.disabled || (isMaxReached() && !selected());\r\n\r\n const flattenData: FlattenOptionData = {\r\n label: opt.label,\r\n value: opt.value,\r\n disabled: opt.disabled,\r\n key: opt.value,\r\n groupLabel: opt.groupLabel,\r\n };\r\n\r\n const content = p.optionRender\r\n ? p.optionRender(flattenData, { index: flatIdx })\r\n : (opt.label as Element);\r\n\r\n return (\r\n <div\r\n data-option-index={flatIdx}\r\n class={cn(\r\n 'sel31',\r\n selected() && 'sel33',\r\n isActive() && 'sel32',\r\n isDisabledOpt() && 'sel34',\r\n opt.groupLabel !== undefined && 'sel38',\r\n opt.class,\r\n )}\r\n title={opt.title}\r\n >\r\n <span class=\"sel35\">{content}</span>\r\n <Show when={selected()}>\r\n <span class=\"sel36\">\r\n {p.menuItemSelectedIcon ? (\r\n (p.menuItemSelectedIcon as Element)\r\n ) : (\r\n <Check size={14} color=\"var(--color)\" stroke-width={3} />\r\n )}\r\n </span>\r\n </Show>\r\n </div>\r\n );\r\n };\r\n\r\n const dropdownContent = () => {\r\n const renderList = flatRenderList();\r\n\r\n if (renderList.length === 0) {\r\n return <div class=\"sel39\">{p.notFoundContent as Element}</div>;\r\n }\r\n\r\n if (p.virtual) {\r\n return (\r\n <div\r\n ref={el => {\r\n requestAnimationFrame(() => setListRef(el));\r\n }}\r\n class={cn('sel30', getColor(p.color))}\r\n style={{ 'max-height': `${p.listHeight}px`, 'overflow-y': 'auto' }}\r\n onClick={handleListClick}\r\n >\r\n <div\r\n style={{\r\n height: `${virtualizer.getTotalSize()}px`,\r\n width: '100%',\r\n position: 'relative',\r\n }}\r\n >\r\n <For each={virtualizer.getVirtualItems()}>\r\n {virtualRow => {\r\n const item = renderList[virtualRow.index];\r\n return (\r\n <div\r\n data-index={virtualRow.index}\r\n style={{\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n width: '100%',\r\n transform: `translateY(${virtualRow.start}px)`,\r\n }}\r\n >\r\n {item.type === 'group' ? (\r\n <div class=\"sel37\">{item.groupLabel as Element}</div>\r\n ) : (\r\n renderOptionItem(item.option, item.flatIdx)\r\n )}\r\n </div>\r\n );\r\n }}\r\n </For>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div\r\n ref={el => setListRef(el)}\r\n class=\"sel30\"\r\n style={{ 'max-height': `${p.listHeight}px` }}\r\n onClick={handleListClick}\r\n >\r\n <For each={renderList}>\r\n {item =>\r\n item.type === 'group' ? (\r\n <div class=\"sel37\">{item.groupLabel as Element}</div>\r\n ) : (\r\n renderOptionItem(item.option, item.flatIdx)\r\n )\r\n }\r\n </For>\r\n </div>\r\n );\r\n };\r\n\r\n const renderTag = (tag: { value: string | number; label: SolidComponent; closable: boolean }) => (\r\n <SelectTag\r\n tag={tag}\r\n removeIcon={p.removeIcon as JSXElement}\r\n tagRender={p.tagRender as ((props: TagRenderProps) => JSXElement) | undefined}\r\n onRemove={handleRemoveTag}\r\n />\r\n );\r\n\r\n createEffect(\r\n on(dropdownOpen, open => {\r\n if (open && p.defaultActiveFirstOption) {\r\n const opts = filteredOptions();\r\n const idx = opts.findIndex(o => !o.disabled && (!isMaxReached() || isSelected(o.value)));\r\n setActiveIndex(idx >= 0 ? idx : -1);\r\n }\r\n if (!open) {\r\n setActiveIndex(-1);\r\n }\r\n }),\r\n );\r\n\r\n createEffect(\r\n on(\r\n () => currentSearchText(),\r\n () => {\r\n if (dropdownOpen() && p.defaultActiveFirstOption) {\r\n const opts = filteredOptions();\r\n const idx = opts.findIndex(o => !o.disabled && (!isMaxReached() || isSelected(o.value)));\r\n setActiveIndex(idx >= 0 ? idx : -1);\r\n }\r\n },\r\n ),\r\n );\r\n\r\n createEffect(\r\n on(listRef, el => {\r\n if (el && dropdownOpen()) {\r\n requestAnimationFrame(() => {\r\n if (p.virtual) virtualizer.measure();\r\n scrollToFirstSelected();\r\n });\r\n }\r\n }),\r\n );\r\n\r\n createEffect(\r\n on(\r\n () => dropdownOpen(),\r\n open => {\r\n if (open && showSearchEnabled()) {\r\n queueMicrotask(() => inputRef?.focus({ preventScroll: true }));\r\n }\r\n },\r\n ),\r\n );\r\n\r\n return (\r\n <Dropdown\r\n ref={el => (selectRootRef = el)}\r\n open={dropdownOpen()}\r\n blockScroll={p.blockScroll}\r\n position={p.placement === 'top' ? 'top' : 'bottom'}\r\n class={{\r\n trigger: `${p.disabled ? 'pointer-events-none' : ''} w-full`,\r\n content: cn(\r\n 'border-c3 bg-base-100 rounded-box menu p-0',\r\n p.placement === 'bottom' ? 'mt-1 shadow-md' : 'shadow-md-top mb-1',\r\n p.class?.dropdownContent,\r\n ),\r\n }}\r\n triggerElement={\r\n <div\r\n ref={el => (triggerRef = el)}\r\n class={cn(\r\n selectVariants({ size: p.size, variant: p.variant }),\r\n getColor(p.color),\r\n dropdownOpen() && 'sel41 sel02',\r\n isMultiple() && 'sel40',\r\n p.class?.root,\r\n p.disabled && 'sel03',\r\n )}\r\n tabIndex={p.disabled ? -1 : 0}\r\n onClick={handleTriggerClick}\r\n onKeyDown={handleKeyDown}\r\n onFocus={handleFocus}\r\n onBlur={handleBlur}\r\n role=\"combobox\"\r\n aria-expanded={dropdownOpen()}\r\n aria-haspopup=\"listbox\"\r\n >\r\n <Show when={p.prefix}>\r\n <span class=\"sel11\">{p.prefix as Element}</span>\r\n </Show>\r\n\r\n <div class=\"sel12\">\r\n <Show\r\n when={isMultiple()}\r\n fallback={\r\n <div class=\"sel13\">\r\n <Show\r\n when={selectedValues().length > 0}\r\n fallback={\r\n <span\r\n class=\"sel15\"\r\n style={{\r\n visibility: currentSearchText() ? 'hidden' : undefined,\r\n }}\r\n >\r\n {p.placeholder}\r\n </span>\r\n }\r\n >\r\n <span\r\n class=\"sel14\"\r\n style={{\r\n visibility:\r\n currentSearchText() && showSearchEnabled() ? 'hidden' : undefined,\r\n }}\r\n >\r\n {selectedLabel()}\r\n </span>\r\n </Show>\r\n </div>\r\n }\r\n >\r\n <div class=\"sel16\">\r\n <For each={visibleTags().visible}>{tag => renderTag(tag)}</For>\r\n\r\n <Show when={visibleTags().omitted.length > 0}>\r\n <InnerTooltip\r\n content={\r\n <For each={visibleTags().omitted}>\r\n {tag => (\r\n <SelectTag\r\n tag={tag}\r\n removeIcon={p.removeIcon as JSXElement}\r\n tagRender={\r\n p.tagRender as ((props: TagRenderProps) => JSXElement) | undefined\r\n }\r\n onRemove={handleRemoveTag}\r\n />\r\n )}\r\n </For>\r\n }\r\n >\r\n <span class=\"sel17 sel20\">\r\n {(() => {\r\n const placeholder = p.maxTagPlaceholder;\r\n if (typeof placeholder === 'function') {\r\n const omittedValues = visibleTags().omitted.map(t => ({\r\n value: t.value,\r\n label: t.label,\r\n })) as LabeledValue[];\r\n return placeholder(omittedValues) as Element;\r\n }\r\n if (placeholder) return placeholder;\r\n return `+${visibleTags().omitted.length} more...`;\r\n })()}\r\n </span>\r\n </InnerTooltip>\r\n </Show>\r\n\r\n <Show when={selectedValues().length === 0}>\r\n <span class=\"sel15\">{p.placeholder}</span>\r\n </Show>\r\n </div>\r\n </Show>\r\n </div>\r\n\r\n <div class=\"sel22\">\r\n <Show when={showClear()}>\r\n <span class=\"sel26\" onClick={handleClear}>\r\n <X class=\"m-auto\" size={14} />\r\n </span>\r\n </Show>\r\n <Show when={!p.loading} fallback={<span class=\"sel25\"></span>}>\r\n <span class={cn('sel23', dropdownOpen() && 'sel24')}>\r\n {p.suffixIcon ? (p.suffixIcon as Element) : <ChevronDown size={16} />}\r\n </span>\r\n </Show>\r\n </div>\r\n </div>\r\n }\r\n >\r\n <div\r\n role=\"listbox\"\r\n class={getColor(p.color)}\r\n onMouseDown={e => {\r\n if ((e.target as HTMLElement)?.tagName !== 'INPUT') {\r\n e.preventDefault();\r\n }\r\n }}\r\n >\r\n <Show when={showSearchEnabled()}>\r\n <div class=\"flex items-center px-3 shadow-2xs\">\r\n <Search size={14} />\r\n <input\r\n ref={ref => (inputRef = ref)}\r\n class=\"sel29\"\r\n value={currentSearchText()}\r\n onInput={handleSearchInput}\r\n onKeyDown={handleKeyDown}\r\n onFocus={handleFocus}\r\n onBlur={handleBlur}\r\n disabled={p.disabled}\r\n autocomplete=\"off\"\r\n role=\"combobox\"\r\n aria-expanded={dropdownOpen()}\r\n aria-haspopup=\"listbox\"\r\n aria-autocomplete=\"list\"\r\n placeholder=\"Search...\"\r\n />\r\n </div>\r\n </Show>\r\n {p.popupRender ? p.popupRender(dropdownContent()) : dropdownContent()}\r\n </div>\r\n </Dropdown>\r\n );\r\n};\r\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"select-zone.js","names":["Component","createContext","createEffect","createSignal","mergeProps","onCleanup","useContext","Portal","cn","SelectZoneItemProps","SelectZoneProps","SelectZoneContextValue","registerItem","key","el","HTMLElement","unregisterItem","isSelected","SelectZoneContext","DEFAULT_PROPS","additive","scrollThreshold","scrollSpeed","disabled","SelectZone","props","p","itemMap","Map","selectedKeys","setSelectedKeys","Set","overlayRect","setOverlayRect","x","y","w","h","rootEl","HTMLDivElement","intersects","selLeft","selTop","selRight","selBottom","r","getBoundingClientRect","docLeft","left","window","scrollX","docTop","top","scrollY","docRight","right","docBottom","bottom","computeSelection","startPageX","startPageY","currPageX","currPageY","Math","min","max","hit","forEach","checkItem","add","isDragging","isAdditive","prevKeys","rafId","lastClientX","lastClientY","scrollLoop","threshold","speed","vw","innerWidth","vh","innerHeight","cx","cy","dx","dy","scrollBy","updateOverlay","requestAnimationFrame","currClientX","currClientY","abs","next","k","has","delete","onMouseDown","e","MouseEvent","button","target","closest","clientX","clientY","shiftKey","ctrlKey","metaKey","document","addEventListener","onMouseMove","onMouseUp","removeEventListener","cancelAnimationFrame","onSelect","item","contextValue","set","syncControlledValue","v","value","undefined","mountListeners","unmountListeners","_$createComponent","Provider","children","_el$","_tmpl$","_ref$","_$use","_$insert","_c$","_$memo","mount","body","_el$2","_$effect","_p$","_v$","class","overlay","_v$2","_v$3","_v$4","_v$5","_$className","t","_$setStyleProperty","a","o","i","root","SelectZoneItem","ctx","Error","registerOnMount","itemKey","unregisterOnUnmount","_el$3","_ref$2","_v$6","_v$7","_$setAttribute"],"sources":["../../../src/components/select-zone/select-zone.tsx"],"sourcesContent":["import {\n Component,\n createContext,\n createEffect,\n createSignal,\n mergeProps,\n onCleanup,\n useContext,\n} from 'solid-js';\nimport { Portal } from 'solid-js/web';\nimport { cn } from '@utils/cn';\nimport { SelectZoneItemProps, SelectZoneProps } from './select-zone.types';\n\n// ─── Context ──────────────────────────────────────────────────────────────────\n\ninterface SelectZoneContextValue {\n registerItem: (key: string, el: HTMLElement) => void;\n unregisterItem: (key: string) => void;\n isSelected: (key: string) => boolean;\n}\n\nconst SelectZoneContext = createContext<SelectZoneContextValue>();\n\n// ─── SelectZone ───────────────────────────────────────────────────────────────\n\nconst DEFAULT_PROPS = {\n additive: true,\n scrollThreshold: 40,\n scrollSpeed: 12,\n disabled: false,\n};\n\nexport const SelectZone: Component<SelectZoneProps> = props => {\n const p = mergeProps(DEFAULT_PROPS, props);\n\n // Map từ itemKey → DOM element (đăng ký bởi SelectZoneItem)\n const itemMap = new Map<string, HTMLElement>();\n\n // Tập hợp các key đang được chọn\n const [selectedKeys, setSelectedKeys] = createSignal<Set<string>>(new Set());\n\n // Overlay rect: null = ẩn, có giá trị = đang kéo\n const [overlayRect, setOverlayRect] = createSignal<{\n x: number;\n y: number;\n w: number;\n h: number;\n } | null>(null);\n\n let rootEl!: HTMLDivElement;\n\n // ── Helpers ─────────────────────────────────────────────────────────────────\n\n /**\n * Tính giao nhau AABB.\n * selLeft/Top/Right/Bottom: document coordinates (pageX/Y).\n * el.getBoundingClientRect(): viewport coordinates → convert sang document.\n */\n function intersects(\n selLeft: number,\n selTop: number,\n selRight: number,\n selBottom: number,\n el: HTMLElement,\n ): boolean {\n const r = el.getBoundingClientRect();\n const docLeft = r.left + window.scrollX;\n const docTop = r.top + window.scrollY;\n const docRight = r.right + window.scrollX;\n const docBottom = r.bottom + window.scrollY;\n return docRight > selLeft && docLeft < selRight && docBottom > selTop && docTop < selBottom;\n }\n\n /**\n * Tính selection.\n * startPageX/Y, currPageX/Y: document coordinates.\n */\n function computeSelection(\n startPageX: number,\n startPageY: number,\n currPageX: number,\n currPageY: number,\n ): Set<string> {\n const selLeft = Math.min(startPageX, currPageX);\n const selTop = Math.min(startPageY, currPageY);\n const selRight = Math.max(startPageX, currPageX);\n const selBottom = Math.max(startPageY, currPageY);\n\n const hit = new Set<string>();\n itemMap.forEach(function checkItem(el, key) {\n if (intersects(selLeft, selTop, selRight, selBottom, el)) {\n hit.add(key);\n }\n });\n return hit;\n }\n\n // ── Drag state ───────────────────────────────────────────────────────────────\n\n // startPageX/Y: document coordinates — cố định suốt drag, không bị ảnh hưởng bởi scroll\n let startPageX = 0;\n let startPageY = 0;\n let isDragging = false;\n let isAdditive = false;\n let prevKeys: Set<string> = new Set();\n let rafId = 0;\n let lastClientX = 0;\n let lastClientY = 0;\n\n // ── Auto-scroll loop ─────────────────────────────────────────────────────────\n\n function scrollLoop() {\n if (!isDragging) return;\n\n const threshold = p.scrollThreshold;\n const speed = p.scrollSpeed;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const cx = lastClientX;\n const cy = lastClientY;\n\n let dx = 0;\n let dy = 0;\n\n if (cx < threshold) dx = -speed * (1 - cx / threshold);\n else if (cx > vw - threshold) dx = speed * (1 - (vw - cx) / threshold);\n\n if (cy < threshold) dy = -speed * (1 - cy / threshold);\n else if (cy > vh - threshold) dy = speed * (1 - (vh - cy) / threshold);\n\n if (dx !== 0 || dy !== 0) {\n window.scrollBy(dx, dy);\n // startPageX/Y KHÔNG thay đổi — nó là điểm neo trong document space\n }\n\n // Cập nhật overlay sau mỗi frame (kể cả khi chỉ scroll mà chuột đứng yên)\n updateOverlay(cx, cy);\n\n rafId = requestAnimationFrame(scrollLoop);\n }\n\n // ── Overlay update ───────────────────────────────────────────────────────────\n\n function updateOverlay(currClientX: number, currClientY: number) {\n // Convert cursor về document coordinates\n const currPageX = currClientX + window.scrollX;\n const currPageY = currClientY + window.scrollY;\n\n // Overlay rect tính trong document space\n const docLeft = Math.min(startPageX, currPageX);\n const docTop = Math.min(startPageY, currPageY);\n const w = Math.abs(currPageX - startPageX);\n const h = Math.abs(currPageY - startPageY);\n\n // Convert sang viewport để render (position: fixed dùng viewport coords)\n setOverlayRect({\n x: docLeft - window.scrollX,\n y: docTop - window.scrollY,\n w,\n h,\n });\n\n // Selection dùng document coordinates\n const hit = computeSelection(startPageX, startPageY, currPageX, currPageY);\n\n let next: Set<string>;\n if (isAdditive) {\n // Toggle per-item: item trong prevKeys bị drag đè → deselect; item mới → select\n next = new Set(prevKeys);\n hit.forEach(k => {\n if (prevKeys.has(k)) next.delete(k);\n else next.add(k);\n });\n } else {\n next = hit;\n }\n setSelectedKeys(next);\n }\n\n // ── Event handlers ───────────────────────────────────────────────────────────\n\n function onMouseDown(e: MouseEvent) {\n if (p.disabled) return;\n // Chỉ xử lý click trái, không xử lý trên scrollbar, input, button, a\n if (e.button !== 0) return;\n const target = e.target as HTMLElement;\n if (target.closest('input, button, a, textarea, select, [data-no-select]')) return;\n\n isDragging = false;\n // Lưu điểm bắt đầu trong document space — bất biến suốt drag\n startPageX = e.clientX + window.scrollX;\n startPageY = e.clientY + window.scrollY;\n lastClientX = e.clientX;\n lastClientY = e.clientY;\n isAdditive = e.shiftKey || e.ctrlKey || e.metaKey;\n prevKeys = isAdditive ? new Set(selectedKeys()) : new Set();\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n }\n\n function onMouseMove(e: MouseEvent) {\n lastClientX = e.clientX;\n lastClientY = e.clientY;\n\n // So sánh trong document space để tránh nhiễu từ scroll\n const dx = e.clientX + window.scrollX - startPageX;\n const dy = e.clientY + window.scrollY - startPageY;\n\n if (!isDragging) {\n // Chỉ bắt đầu drag khi kéo ít nhất 4px để tránh nhầm với click\n if (Math.abs(dx) < 4 && Math.abs(dy) < 4) return;\n isDragging = true;\n rafId = requestAnimationFrame(scrollLoop);\n }\n\n updateOverlay(e.clientX, e.clientY);\n }\n\n function onMouseUp(e: MouseEvent) {\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n\n cancelAnimationFrame(rafId);\n isDragging = false;\n\n if (overlayRect() !== null) {\n setOverlayRect(null);\n // Thông báo selection cuối cùng\n p.onSelect?.(new Set(selectedKeys()));\n } else {\n // Không drag → click đơn → deselect tất cả (nếu không additive)\n if (!isAdditive) {\n const target = e.target as HTMLElement;\n const item = target.closest('[data-select-key]') as HTMLElement | null;\n if (!item) {\n setSelectedKeys(new Set<string>());\n p.onSelect?.(new Set<string>());\n }\n }\n }\n }\n\n // ── Context value ────────────────────────────────────────────────────────────\n\n const contextValue: SelectZoneContextValue = {\n registerItem(key, el) {\n itemMap.set(key, el);\n },\n unregisterItem(key) {\n itemMap.delete(key);\n },\n isSelected(key) {\n return selectedKeys().has(key);\n },\n };\n\n // ── Đồng bộ controlled value ─────────────────────────────────────────────────\n\n createEffect(function syncControlledValue() {\n const v = p.value;\n if (v !== undefined) setSelectedKeys(new Set(v));\n });\n\n // ── Cleanup khi unmount ──────────────────────────────────────────────────────\n\n createEffect(function mountListeners() {\n rootEl.addEventListener('mousedown', onMouseDown);\n onCleanup(function unmountListeners() {\n rootEl.removeEventListener('mousedown', onMouseDown);\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n cancelAnimationFrame(rafId);\n });\n });\n\n // ── Render ───────────────────────────────────────────────────────────────────\n\n return (\n <SelectZoneContext.Provider value={contextValue}>\n <div ref={rootEl} class={cn('sz01', p.class?.root)}>\n {p.children}\n\n {/* Selection overlay — render qua Portal để tránh ảnh hưởng layout */}\n {overlayRect() && (\n <Portal mount={document.body}>\n <div\n class={cn('sz02', p.class?.overlay)}\n style={{\n left: `${overlayRect()!.x}px`,\n top: `${overlayRect()!.y}px`,\n width: `${overlayRect()!.w}px`,\n height: `${overlayRect()!.h}px`,\n }}\n />\n </Portal>\n )}\n </div>\n </SelectZoneContext.Provider>\n );\n};\n\n// ─── SelectZoneItem ───────────────────────────────────────────────────────────\n\nexport const SelectZoneItem: Component<SelectZoneItemProps> = props => {\n const ctx = useContext(SelectZoneContext);\n if (!ctx) throw new Error('SelectZoneItem must be used inside <SelectZone>');\n\n let el!: HTMLDivElement;\n\n createEffect(function registerOnMount() {\n ctx.registerItem(props.itemKey, el);\n onCleanup(function unregisterOnUnmount() {\n ctx.unregisterItem(props.itemKey);\n });\n });\n\n const isSelected = () => ctx.isSelected(props.itemKey);\n\n return (\n <div ref={el} data-select-key={props.itemKey} class={cn('sz03', props.class)}>\n {props.children(isSelected)}\n </div>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"select-zone.js","names":["Component","createContext","createEffect","createSignal","mergeProps","onCleanup","useContext","Portal","cn","SelectZoneItemProps","SelectZoneProps","SelectZoneContextValue","registerItem","key","el","HTMLElement","unregisterItem","isSelected","SelectZoneContext","DEFAULT_PROPS","additive","scrollThreshold","scrollSpeed","disabled","SelectZone","props","p","itemMap","Map","selectedKeys","setSelectedKeys","Set","overlayRect","setOverlayRect","x","y","w","h","rootEl","HTMLDivElement","intersects","selLeft","selTop","selRight","selBottom","r","getBoundingClientRect","docLeft","left","window","scrollX","docTop","top","scrollY","docRight","right","docBottom","bottom","computeSelection","startPageX","startPageY","currPageX","currPageY","Math","min","max","hit","forEach","checkItem","add","isDragging","isAdditive","prevKeys","rafId","lastClientX","lastClientY","scrollLoop","threshold","speed","vw","innerWidth","vh","innerHeight","cx","cy","dx","dy","scrollBy","updateOverlay","requestAnimationFrame","currClientX","currClientY","abs","next","k","has","delete","onMouseDown","e","MouseEvent","button","target","closest","clientX","clientY","shiftKey","ctrlKey","metaKey","document","addEventListener","onMouseMove","onMouseUp","removeEventListener","cancelAnimationFrame","onSelect","item","contextValue","set","syncControlledValue","v","value","undefined","mountListeners","unmountListeners","_$createComponent","Provider","children","_el$","_tmpl$","_ref$","_$use","_$insert","_c$","_$memo","mount","body","_el$2","_$effect","_p$","_v$","class","overlay","_v$2","_v$3","_v$4","_v$5","_$className","t","_$setStyleProperty","a","o","i","root","SelectZoneItem","ctx","Error","registerOnMount","itemKey","unregisterOnUnmount","_el$3","_ref$2","_v$6","_v$7","_$setAttribute"],"sources":["../../../src/components/select-zone/select-zone.tsx"],"sourcesContent":["import {\r\n Component,\r\n createContext,\r\n createEffect,\r\n createSignal,\r\n mergeProps,\r\n onCleanup,\r\n useContext,\r\n} from 'solid-js';\r\nimport { Portal } from 'solid-js/web';\r\nimport { cn } from '@utils/cn';\r\nimport { SelectZoneItemProps, SelectZoneProps } from './select-zone.types';\r\n\r\n// ─── Context ──────────────────────────────────────────────────────────────────\r\n\r\ninterface SelectZoneContextValue {\r\n registerItem: (key: string, el: HTMLElement) => void;\r\n unregisterItem: (key: string) => void;\r\n isSelected: (key: string) => boolean;\r\n}\r\n\r\nconst SelectZoneContext = createContext<SelectZoneContextValue>();\r\n\r\n// ─── SelectZone ───────────────────────────────────────────────────────────────\r\n\r\nconst DEFAULT_PROPS = {\r\n additive: true,\r\n scrollThreshold: 40,\r\n scrollSpeed: 12,\r\n disabled: false,\r\n};\r\n\r\nexport const SelectZone: Component<SelectZoneProps> = props => {\r\n const p = mergeProps(DEFAULT_PROPS, props);\r\n\r\n // Map từ itemKey → DOM element (đăng ký bởi SelectZoneItem)\r\n const itemMap = new Map<string, HTMLElement>();\r\n\r\n // Tập hợp các key đang được chọn\r\n const [selectedKeys, setSelectedKeys] = createSignal<Set<string>>(new Set());\r\n\r\n // Overlay rect: null = ẩn, có giá trị = đang kéo\r\n const [overlayRect, setOverlayRect] = createSignal<{\r\n x: number;\r\n y: number;\r\n w: number;\r\n h: number;\r\n } | null>(null);\r\n\r\n let rootEl!: HTMLDivElement;\r\n\r\n // ── Helpers ─────────────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Tính giao nhau AABB.\r\n * selLeft/Top/Right/Bottom: document coordinates (pageX/Y).\r\n * el.getBoundingClientRect(): viewport coordinates → convert sang document.\r\n */\r\n function intersects(\r\n selLeft: number,\r\n selTop: number,\r\n selRight: number,\r\n selBottom: number,\r\n el: HTMLElement,\r\n ): boolean {\r\n const r = el.getBoundingClientRect();\r\n const docLeft = r.left + window.scrollX;\r\n const docTop = r.top + window.scrollY;\r\n const docRight = r.right + window.scrollX;\r\n const docBottom = r.bottom + window.scrollY;\r\n return docRight > selLeft && docLeft < selRight && docBottom > selTop && docTop < selBottom;\r\n }\r\n\r\n /**\r\n * Tính selection.\r\n * startPageX/Y, currPageX/Y: document coordinates.\r\n */\r\n function computeSelection(\r\n startPageX: number,\r\n startPageY: number,\r\n currPageX: number,\r\n currPageY: number,\r\n ): Set<string> {\r\n const selLeft = Math.min(startPageX, currPageX);\r\n const selTop = Math.min(startPageY, currPageY);\r\n const selRight = Math.max(startPageX, currPageX);\r\n const selBottom = Math.max(startPageY, currPageY);\r\n\r\n const hit = new Set<string>();\r\n itemMap.forEach(function checkItem(el, key) {\r\n if (intersects(selLeft, selTop, selRight, selBottom, el)) {\r\n hit.add(key);\r\n }\r\n });\r\n return hit;\r\n }\r\n\r\n // ── Drag state ───────────────────────────────────────────────────────────────\r\n\r\n // startPageX/Y: document coordinates — cố định suốt drag, không bị ảnh hưởng bởi scroll\r\n let startPageX = 0;\r\n let startPageY = 0;\r\n let isDragging = false;\r\n let isAdditive = false;\r\n let prevKeys: Set<string> = new Set();\r\n let rafId = 0;\r\n let lastClientX = 0;\r\n let lastClientY = 0;\r\n\r\n // ── Auto-scroll loop ─────────────────────────────────────────────────────────\r\n\r\n function scrollLoop() {\r\n if (!isDragging) return;\r\n\r\n const threshold = p.scrollThreshold;\r\n const speed = p.scrollSpeed;\r\n const vw = window.innerWidth;\r\n const vh = window.innerHeight;\r\n const cx = lastClientX;\r\n const cy = lastClientY;\r\n\r\n let dx = 0;\r\n let dy = 0;\r\n\r\n if (cx < threshold) dx = -speed * (1 - cx / threshold);\r\n else if (cx > vw - threshold) dx = speed * (1 - (vw - cx) / threshold);\r\n\r\n if (cy < threshold) dy = -speed * (1 - cy / threshold);\r\n else if (cy > vh - threshold) dy = speed * (1 - (vh - cy) / threshold);\r\n\r\n if (dx !== 0 || dy !== 0) {\r\n window.scrollBy(dx, dy);\r\n // startPageX/Y KHÔNG thay đổi — nó là điểm neo trong document space\r\n }\r\n\r\n // Cập nhật overlay sau mỗi frame (kể cả khi chỉ scroll mà chuột đứng yên)\r\n updateOverlay(cx, cy);\r\n\r\n rafId = requestAnimationFrame(scrollLoop);\r\n }\r\n\r\n // ── Overlay update ───────────────────────────────────────────────────────────\r\n\r\n function updateOverlay(currClientX: number, currClientY: number) {\r\n // Convert cursor về document coordinates\r\n const currPageX = currClientX + window.scrollX;\r\n const currPageY = currClientY + window.scrollY;\r\n\r\n // Overlay rect tính trong document space\r\n const docLeft = Math.min(startPageX, currPageX);\r\n const docTop = Math.min(startPageY, currPageY);\r\n const w = Math.abs(currPageX - startPageX);\r\n const h = Math.abs(currPageY - startPageY);\r\n\r\n // Convert sang viewport để render (position: fixed dùng viewport coords)\r\n setOverlayRect({\r\n x: docLeft - window.scrollX,\r\n y: docTop - window.scrollY,\r\n w,\r\n h,\r\n });\r\n\r\n // Selection dùng document coordinates\r\n const hit = computeSelection(startPageX, startPageY, currPageX, currPageY);\r\n\r\n let next: Set<string>;\r\n if (isAdditive) {\r\n // Toggle per-item: item trong prevKeys bị drag đè → deselect; item mới → select\r\n next = new Set(prevKeys);\r\n hit.forEach(k => {\r\n if (prevKeys.has(k)) next.delete(k);\r\n else next.add(k);\r\n });\r\n } else {\r\n next = hit;\r\n }\r\n setSelectedKeys(next);\r\n }\r\n\r\n // ── Event handlers ───────────────────────────────────────────────────────────\r\n\r\n function onMouseDown(e: MouseEvent) {\r\n if (p.disabled) return;\r\n // Chỉ xử lý click trái, không xử lý trên scrollbar, input, button, a\r\n if (e.button !== 0) return;\r\n const target = e.target as HTMLElement;\r\n if (target.closest('input, button, a, textarea, select, [data-no-select]')) return;\r\n\r\n isDragging = false;\r\n // Lưu điểm bắt đầu trong document space — bất biến suốt drag\r\n startPageX = e.clientX + window.scrollX;\r\n startPageY = e.clientY + window.scrollY;\r\n lastClientX = e.clientX;\r\n lastClientY = e.clientY;\r\n isAdditive = e.shiftKey || e.ctrlKey || e.metaKey;\r\n prevKeys = isAdditive ? new Set(selectedKeys()) : new Set();\r\n\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp);\r\n }\r\n\r\n function onMouseMove(e: MouseEvent) {\r\n lastClientX = e.clientX;\r\n lastClientY = e.clientY;\r\n\r\n // So sánh trong document space để tránh nhiễu từ scroll\r\n const dx = e.clientX + window.scrollX - startPageX;\r\n const dy = e.clientY + window.scrollY - startPageY;\r\n\r\n if (!isDragging) {\r\n // Chỉ bắt đầu drag khi kéo ít nhất 4px để tránh nhầm với click\r\n if (Math.abs(dx) < 4 && Math.abs(dy) < 4) return;\r\n isDragging = true;\r\n rafId = requestAnimationFrame(scrollLoop);\r\n }\r\n\r\n updateOverlay(e.clientX, e.clientY);\r\n }\r\n\r\n function onMouseUp(e: MouseEvent) {\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n\r\n cancelAnimationFrame(rafId);\r\n isDragging = false;\r\n\r\n if (overlayRect() !== null) {\r\n setOverlayRect(null);\r\n // Thông báo selection cuối cùng\r\n p.onSelect?.(new Set(selectedKeys()));\r\n } else {\r\n // Không drag → click đơn → deselect tất cả (nếu không additive)\r\n if (!isAdditive) {\r\n const target = e.target as HTMLElement;\r\n const item = target.closest('[data-select-key]') as HTMLElement | null;\r\n if (!item) {\r\n setSelectedKeys(new Set<string>());\r\n p.onSelect?.(new Set<string>());\r\n }\r\n }\r\n }\r\n }\r\n\r\n // ── Context value ────────────────────────────────────────────────────────────\r\n\r\n const contextValue: SelectZoneContextValue = {\r\n registerItem(key, el) {\r\n itemMap.set(key, el);\r\n },\r\n unregisterItem(key) {\r\n itemMap.delete(key);\r\n },\r\n isSelected(key) {\r\n return selectedKeys().has(key);\r\n },\r\n };\r\n\r\n // ── Đồng bộ controlled value ─────────────────────────────────────────────────\r\n\r\n createEffect(function syncControlledValue() {\r\n const v = p.value;\r\n if (v !== undefined) setSelectedKeys(new Set(v));\r\n });\r\n\r\n // ── Cleanup khi unmount ──────────────────────────────────────────────────────\r\n\r\n createEffect(function mountListeners() {\r\n rootEl.addEventListener('mousedown', onMouseDown);\r\n onCleanup(function unmountListeners() {\r\n rootEl.removeEventListener('mousedown', onMouseDown);\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n cancelAnimationFrame(rafId);\r\n });\r\n });\r\n\r\n // ── Render ───────────────────────────────────────────────────────────────────\r\n\r\n return (\r\n <SelectZoneContext.Provider value={contextValue}>\r\n <div ref={rootEl} class={cn('sz01', p.class?.root)}>\r\n {p.children}\r\n\r\n {/* Selection overlay — render qua Portal để tránh ảnh hưởng layout */}\r\n {overlayRect() && (\r\n <Portal mount={document.body}>\r\n <div\r\n class={cn('sz02', p.class?.overlay)}\r\n style={{\r\n left: `${overlayRect()!.x}px`,\r\n top: `${overlayRect()!.y}px`,\r\n width: `${overlayRect()!.w}px`,\r\n height: `${overlayRect()!.h}px`,\r\n }}\r\n />\r\n </Portal>\r\n )}\r\n </div>\r\n </SelectZoneContext.Provider>\r\n );\r\n};\r\n\r\n// ─── SelectZoneItem ───────────────────────────────────────────────────────────\r\n\r\nexport const SelectZoneItem: Component<SelectZoneItemProps> = props => {\r\n const ctx = useContext(SelectZoneContext);\r\n if (!ctx) throw new Error('SelectZoneItem must be used inside <SelectZone>');\r\n\r\n let el!: HTMLDivElement;\r\n\r\n createEffect(function registerOnMount() {\r\n ctx.registerItem(props.itemKey, el);\r\n onCleanup(function unregisterOnUnmount() {\r\n ctx.unregisterItem(props.itemKey);\r\n });\r\n });\r\n\r\n const isSelected = () => ctx.isSelected(props.itemKey);\r\n\r\n return (\r\n <div ref={el} data-select-key={props.itemKey} class={cn('sz03', props.class)}>\r\n {props.children(isSelected)}\r\n </div>\r\n );\r\n};\r\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"skeleton.js","names":["cn","Component","mergeProps","ParentComponent","Show","Switch","LayoutVariant","ShapeVariant","LayoutSkeletonProps","type","variant","enabled","ShapeSkeletonProps","CustomSkeletonProps","class","SkeletonProps","Skeleton","rawProps","p","const","_$createComponent","when","fallback","children","_$memo","_el$","_tmpl$","_$effect","_$className","SkeletonDisplay","SkeletonDisplayProps","ShapeSkeleton","LayoutSkeleton","_tmpl$2","_tmpl$3","_tmpl$4","_tmpl$5","_tmpl$6","_tmpl$7","_tmpl$8","_tmpl$9","_tmpl$0","_tmpl$1","_tmpl$10","_tmpl$11"],"sources":["../../../src/components/skeleton/skeleton.tsx"],"sourcesContent":["import { cn } from '@/utils/cn';\nimport { Component, mergeProps, ParentComponent, Show, Switch } from 'solid-js';\n// No custom CSS needed — uses DaisyUI's built-in .skeleton class\n\n// ─── Type definitions ─────────────────────────────────────────────────────────\n\n/** Layout skeleton: giao diện phức tạp gồm nhiều element */\ntype LayoutVariant =\n | 'cardImage' // Card với ảnh trên + text dưới\n | 'cardHorizontal' // Card nằm ngang: ảnh trái, nội dung phải\n | 'profile' // Avatar tròn + tên + mô tả\n | 'article' // Tiêu đề + đoạn văn nhiều dòng\n | 'feedItem' // Item list: avatar trái + text dọc\n | 'stat'; // Khối thống kê: label + số lớn + sublabel\n\n/** Shape skeleton: hình khối đơn giản với kích thước preset */\ntype ShapeVariant =\n | 'rectangle' // Hình chữ nhật (mặc định w-full)\n | 'square' // Hình vuông (w = h)\n | 'circle' // Hình tròn\n | 'textLine' // Một dòng text\n | 'textParagraph'; // Đoạn text 3–4 dòng\n\ntype LayoutSkeletonProps = {\n type: 'layout';\n variant?: LayoutVariant;\n enabled: boolean;\n};\n\ntype ShapeSkeletonProps = {\n type: 'shape';\n variant?: ShapeVariant;\n enabled: boolean;\n};\n\n/** Custom skeleton: user toàn quyền cấu hình — class áp thẳng lên element skeleton */\ntype CustomSkeletonProps = {\n type: 'custom';\n enabled: boolean;\n class: string; // bắt buộc — định nghĩa hình dạng, kích thước, bo góc\n};\n\nexport type SkeletonProps = LayoutSkeletonProps | ShapeSkeletonProps | CustomSkeletonProps;\n\n// ─── Main component ───────────────────────────────────────────────────────────\n\nexport const Skeleton: ParentComponent<SkeletonProps> = rawProps => {\n const p = mergeProps({ variant: 'card-image' } as const, rawProps);\n\n return (\n <Show when={p.enabled} fallback={p.children}>\n {p.type === 'custom' ? (\n <div class={cn('skeleton', p.class)} />\n ) : (\n <SkeletonDisplay\n type={p.type}\n variant={(p as LayoutSkeletonProps | ShapeSkeletonProps).variant as never}\n />\n )}\n </Show>\n );\n};\n\n// ─── Display switcher ─────────────────────────────────────────────────────────\n\ntype SkeletonDisplayProps = {\n type: 'layout' | 'shape';\n variant: LayoutVariant | ShapeVariant;\n class?: string;\n};\n\nconst SkeletonDisplay: Component<SkeletonDisplayProps> = p => {\n if (p.type === 'shape') {\n return <ShapeSkeleton variant={p.variant as ShapeVariant} />;\n }\n return <LayoutSkeleton variant={p.variant as LayoutVariant} />;\n};\n\n// ─── Layout Skeletons ─────────────────────────────────────────────────────────\n\nconst LayoutSkeleton: Component<{ variant?: LayoutVariant }> = p => {\n switch (p.variant) {\n case 'cardImage':\n return (\n <div class=\"flex flex-col gap-3\">\n <div class=\"skeleton h-40 w-full rounded-lg\" />\n <div class=\"skeleton h-5 w-3/4 rounded\" />\n <div class=\"skeleton h-3.5 w-full rounded\" />\n <div class=\"skeleton h-3.5 w-5/6 rounded\" />\n <div class=\"skeleton h-3.5 w-4/5 rounded\" />\n </div>\n );\n\n case 'cardHorizontal':\n return (\n <div class=\"flex flex-row items-start gap-4\">\n <div class=\"skeleton size-24 shrink-0 rounded-lg\" />\n <div class=\"flex flex-1 flex-col gap-2.5\">\n <div class=\"skeleton h-5 w-2/3 rounded\" />\n <div class=\"skeleton h-3.5 w-full rounded\" />\n <div class=\"skeleton h-3.5 w-4/5 rounded\" />\n <div class=\"skeleton h-3.5 w-3/4 rounded\" />\n </div>\n </div>\n );\n\n case 'profile':\n return (\n <div class=\"flex flex-col items-center gap-3\">\n <div class=\"skeleton size-20 shrink-0 rounded-full\" />\n <div class=\"skeleton h-5 w-36 rounded\" />\n <div class=\"skeleton h-3.5 w-48 rounded\" />\n <div class=\"skeleton h-3.5 w-40 rounded\" />\n </div>\n );\n\n case 'article':\n return (\n <div class=\"flex flex-col gap-3\">\n <div class=\"skeleton h-7 w-3/4 rounded\" />\n <div class=\"skeleton h-4 w-1/3 rounded\" />\n <div class=\"mt-1 flex flex-col gap-2\">\n <div class=\"skeleton h-3.5 w-full rounded\" />\n <div class=\"skeleton h-3.5 w-full rounded\" />\n <div class=\"skeleton h-3.5 w-11/12 rounded\" />\n <div class=\"skeleton h-3.5 w-full rounded\" />\n <div class=\"skeleton h-3.5 w-4/5 rounded\" />\n </div>\n </div>\n );\n\n case 'feedItem':\n return (\n <div class=\"flex flex-row items-start gap-3\">\n <div class=\"skeleton size-10 shrink-0 rounded-full\" />\n <div class=\"flex flex-1 flex-col gap-2\">\n <div class=\"skeleton h-4 w-1/3 rounded\" />\n <div class=\"skeleton h-3.5 w-full rounded\" />\n <div class=\"skeleton h-3.5 w-5/6 rounded\" />\n </div>\n </div>\n );\n\n case 'stat':\n return (\n <div class=\"flex flex-col gap-2\">\n <div class=\"skeleton h-3.5 w-24 rounded\" />\n <div class=\"skeleton h-9 w-32 rounded\" />\n <div class=\"skeleton h-3 w-20 rounded\" />\n </div>\n );\n\n default:\n return (\n <div class=\"flex flex-col gap-3\">\n <div class=\"skeleton h-40 w-full rounded-lg\" />\n <div class=\"skeleton h-5 w-3/4 rounded\" />\n <div class=\"skeleton h-3.5 w-full rounded\" />\n </div>\n );\n }\n};\n\n// ─── Shape Skeletons ──────────────────────────────────────────────────────────\n\nconst ShapeSkeleton: Component<{ variant?: ShapeVariant }> = p => {\n switch (p.variant) {\n case 'rectangle':\n return <div class=\"skeleton h-32 w-full rounded-lg\" />;\n\n case 'square':\n return <div class=\"skeleton size-32 rounded-lg\" />;\n\n case 'circle':\n return <div class=\"skeleton size-16 rounded-full\" />;\n\n case 'textLine':\n return <div class=\"skeleton h-4 w-full rounded\" />;\n\n case 'textParagraph':\n return (\n <div class=\"flex flex-col gap-2\">\n <div class=\"skeleton h-4 w-full rounded\" />\n <div class=\"skeleton h-4 w-11/12 rounded\" />\n <div class=\"skeleton h-4 w-4/5 rounded\" />\n <div class=\"skeleton h-4 w-5/6 rounded\" />\n </div>\n );\n\n default:\n return <div class=\"skeleton h-32 w-full rounded-lg\" />;\n }\n};\n"],"mappings":"u+EA8CagB,EAA2CC,GAAY,CAClE,IAAMC,EAAIhB,EAAW,CAAEQ,QAAS,aAAc,CAAWO,EAAS,CAElE,OAAAG,EACGhB,EAAI,CAAA,IAACiB,MAAI,CAAA,OAAEH,EAAEP,SAAO,IAAEW,UAAQ,CAAA,OAAEJ,EAAEK,UAAQ,IAAAA,UAAA,CAAA,OACxCC,MAAAN,EAAET,OAAS,SAAQ,EAAA,MAAA,CAAA,IAAAgB,EAAAC,GAAA,CACiB,OADjBC,MAAAC,EAAAH,EACNzB,EAAG,WAAYkB,EAAEJ,MAAM,CAAA,CAAA,CAAAW,KAAA,CAAAL,EAElCS,EAAe,CAAA,IACdpB,MAAI,CAAA,OAAES,EAAET,MAAI,IACZC,SAAO,CAAA,OAAGQ,EAA+CR,SAAgB,CAE5E,EAAA,CAAA,EAaDmB,EAAmDX,GACnDA,EAAET,OAAS,QACbW,EAAQW,EAAa,CAAA,IAACrB,SAAO,CAAA,OAAEQ,EAAER,SAAuB,CAAA,CAE1DU,EAAQY,EAAc,CAAA,IAACtB,SAAO,CAAA,OAAEQ,EAAER,SAAwB,CAAA,CAKtDsB,EAAyDd,GAAK,CAClE,OAAQA,EAAER,QAAV,CACE,IAAK,YACH,OAAAuB,GAAA,CAUF,IAAK,iBACH,OAAAC,GAAA,CAYF,IAAK,UACH,OAAAC,GAAA,CASF,IAAK,UACH,OAAAC,GAAA,CAcF,IAAK,WACH,OAAAC,GAAA,CAWF,IAAK,OACH,OAAAC,GAAA,CAQF,QACE,OAAAC,GAAA,GAYAR,EAAuDb,GAAK,CAChE,OAAQA,EAAER,QAAV,CACE,IAAK,YACH,OAAA8B,GAAA,CAEF,IAAK,SACH,OAAAC,GAAA,CAEF,IAAK,SACH,OAAAC,GAAA,CAEF,IAAK,WACH,OAAAC,GAAA,CAEF,IAAK,gBACH,OAAAC,GAAA,CASF,QACE,OAAAJ,GAAA"}
1
+ {"version":3,"file":"skeleton.js","names":["cn","Component","mergeProps","ParentComponent","Show","Switch","LayoutVariant","ShapeVariant","LayoutSkeletonProps","type","variant","enabled","ShapeSkeletonProps","CustomSkeletonProps","class","SkeletonProps","Skeleton","rawProps","p","const","_$createComponent","when","fallback","children","_$memo","_el$","_tmpl$","_$effect","_$className","SkeletonDisplay","SkeletonDisplayProps","ShapeSkeleton","LayoutSkeleton","_tmpl$2","_tmpl$3","_tmpl$4","_tmpl$5","_tmpl$6","_tmpl$7","_tmpl$8","_tmpl$9","_tmpl$0","_tmpl$1","_tmpl$10","_tmpl$11"],"sources":["../../../src/components/skeleton/skeleton.tsx"],"sourcesContent":["import { cn } from '@/utils/cn';\r\nimport { Component, mergeProps, ParentComponent, Show, Switch } from 'solid-js';\r\n// No custom CSS needed — uses DaisyUI's built-in .skeleton class\r\n\r\n// ─── Type definitions ─────────────────────────────────────────────────────────\r\n\r\n/** Layout skeleton: giao diện phức tạp gồm nhiều element */\r\ntype LayoutVariant =\r\n | 'cardImage' // Card với ảnh trên + text dưới\r\n | 'cardHorizontal' // Card nằm ngang: ảnh trái, nội dung phải\r\n | 'profile' // Avatar tròn + tên + mô tả\r\n | 'article' // Tiêu đề + đoạn văn nhiều dòng\r\n | 'feedItem' // Item list: avatar trái + text dọc\r\n | 'stat'; // Khối thống kê: label + số lớn + sublabel\r\n\r\n/** Shape skeleton: hình khối đơn giản với kích thước preset */\r\ntype ShapeVariant =\r\n | 'rectangle' // Hình chữ nhật (mặc định w-full)\r\n | 'square' // Hình vuông (w = h)\r\n | 'circle' // Hình tròn\r\n | 'textLine' // Một dòng text\r\n | 'textParagraph'; // Đoạn text 3–4 dòng\r\n\r\ntype LayoutSkeletonProps = {\r\n type: 'layout';\r\n variant?: LayoutVariant;\r\n enabled: boolean;\r\n};\r\n\r\ntype ShapeSkeletonProps = {\r\n type: 'shape';\r\n variant?: ShapeVariant;\r\n enabled: boolean;\r\n};\r\n\r\n/** Custom skeleton: user toàn quyền cấu hình — class áp thẳng lên element skeleton */\r\ntype CustomSkeletonProps = {\r\n type: 'custom';\r\n enabled: boolean;\r\n class: string; // bắt buộc — định nghĩa hình dạng, kích thước, bo góc\r\n};\r\n\r\nexport type SkeletonProps = LayoutSkeletonProps | ShapeSkeletonProps | CustomSkeletonProps;\r\n\r\n// ─── Main component ───────────────────────────────────────────────────────────\r\n\r\nexport const Skeleton: ParentComponent<SkeletonProps> = rawProps => {\r\n const p = mergeProps({ variant: 'card-image' } as const, rawProps);\r\n\r\n return (\r\n <Show when={p.enabled} fallback={p.children}>\r\n {p.type === 'custom' ? (\r\n <div class={cn('skeleton', p.class)} />\r\n ) : (\r\n <SkeletonDisplay\r\n type={p.type}\r\n variant={(p as LayoutSkeletonProps | ShapeSkeletonProps).variant as never}\r\n />\r\n )}\r\n </Show>\r\n );\r\n};\r\n\r\n// ─── Display switcher ─────────────────────────────────────────────────────────\r\n\r\ntype SkeletonDisplayProps = {\r\n type: 'layout' | 'shape';\r\n variant: LayoutVariant | ShapeVariant;\r\n class?: string;\r\n};\r\n\r\nconst SkeletonDisplay: Component<SkeletonDisplayProps> = p => {\r\n if (p.type === 'shape') {\r\n return <ShapeSkeleton variant={p.variant as ShapeVariant} />;\r\n }\r\n return <LayoutSkeleton variant={p.variant as LayoutVariant} />;\r\n};\r\n\r\n// ─── Layout Skeletons ─────────────────────────────────────────────────────────\r\n\r\nconst LayoutSkeleton: Component<{ variant?: LayoutVariant }> = p => {\r\n switch (p.variant) {\r\n case 'cardImage':\r\n return (\r\n <div class=\"flex flex-col gap-3\">\r\n <div class=\"skeleton h-40 w-full rounded-lg\" />\r\n <div class=\"skeleton h-5 w-3/4 rounded\" />\r\n <div class=\"skeleton h-3.5 w-full rounded\" />\r\n <div class=\"skeleton h-3.5 w-5/6 rounded\" />\r\n <div class=\"skeleton h-3.5 w-4/5 rounded\" />\r\n </div>\r\n );\r\n\r\n case 'cardHorizontal':\r\n return (\r\n <div class=\"flex flex-row items-start gap-4\">\r\n <div class=\"skeleton size-24 shrink-0 rounded-lg\" />\r\n <div class=\"flex flex-1 flex-col gap-2.5\">\r\n <div class=\"skeleton h-5 w-2/3 rounded\" />\r\n <div class=\"skeleton h-3.5 w-full rounded\" />\r\n <div class=\"skeleton h-3.5 w-4/5 rounded\" />\r\n <div class=\"skeleton h-3.5 w-3/4 rounded\" />\r\n </div>\r\n </div>\r\n );\r\n\r\n case 'profile':\r\n return (\r\n <div class=\"flex flex-col items-center gap-3\">\r\n <div class=\"skeleton size-20 shrink-0 rounded-full\" />\r\n <div class=\"skeleton h-5 w-36 rounded\" />\r\n <div class=\"skeleton h-3.5 w-48 rounded\" />\r\n <div class=\"skeleton h-3.5 w-40 rounded\" />\r\n </div>\r\n );\r\n\r\n case 'article':\r\n return (\r\n <div class=\"flex flex-col gap-3\">\r\n <div class=\"skeleton h-7 w-3/4 rounded\" />\r\n <div class=\"skeleton h-4 w-1/3 rounded\" />\r\n <div class=\"mt-1 flex flex-col gap-2\">\r\n <div class=\"skeleton h-3.5 w-full rounded\" />\r\n <div class=\"skeleton h-3.5 w-full rounded\" />\r\n <div class=\"skeleton h-3.5 w-11/12 rounded\" />\r\n <div class=\"skeleton h-3.5 w-full rounded\" />\r\n <div class=\"skeleton h-3.5 w-4/5 rounded\" />\r\n </div>\r\n </div>\r\n );\r\n\r\n case 'feedItem':\r\n return (\r\n <div class=\"flex flex-row items-start gap-3\">\r\n <div class=\"skeleton size-10 shrink-0 rounded-full\" />\r\n <div class=\"flex flex-1 flex-col gap-2\">\r\n <div class=\"skeleton h-4 w-1/3 rounded\" />\r\n <div class=\"skeleton h-3.5 w-full rounded\" />\r\n <div class=\"skeleton h-3.5 w-5/6 rounded\" />\r\n </div>\r\n </div>\r\n );\r\n\r\n case 'stat':\r\n return (\r\n <div class=\"flex flex-col gap-2\">\r\n <div class=\"skeleton h-3.5 w-24 rounded\" />\r\n <div class=\"skeleton h-9 w-32 rounded\" />\r\n <div class=\"skeleton h-3 w-20 rounded\" />\r\n </div>\r\n );\r\n\r\n default:\r\n return (\r\n <div class=\"flex flex-col gap-3\">\r\n <div class=\"skeleton h-40 w-full rounded-lg\" />\r\n <div class=\"skeleton h-5 w-3/4 rounded\" />\r\n <div class=\"skeleton h-3.5 w-full rounded\" />\r\n </div>\r\n );\r\n }\r\n};\r\n\r\n// ─── Shape Skeletons ──────────────────────────────────────────────────────────\r\n\r\nconst ShapeSkeleton: Component<{ variant?: ShapeVariant }> = p => {\r\n switch (p.variant) {\r\n case 'rectangle':\r\n return <div class=\"skeleton h-32 w-full rounded-lg\" />;\r\n\r\n case 'square':\r\n return <div class=\"skeleton size-32 rounded-lg\" />;\r\n\r\n case 'circle':\r\n return <div class=\"skeleton size-16 rounded-full\" />;\r\n\r\n case 'textLine':\r\n return <div class=\"skeleton h-4 w-full rounded\" />;\r\n\r\n case 'textParagraph':\r\n return (\r\n <div class=\"flex flex-col gap-2\">\r\n <div class=\"skeleton h-4 w-full rounded\" />\r\n <div class=\"skeleton h-4 w-11/12 rounded\" />\r\n <div class=\"skeleton h-4 w-4/5 rounded\" />\r\n <div class=\"skeleton h-4 w-5/6 rounded\" />\r\n </div>\r\n );\r\n\r\n default:\r\n return <div class=\"skeleton h-32 w-full rounded-lg\" />;\r\n }\r\n};\r\n"],"mappings":"u+EA8CagB,EAA2CC,GAAY,CAClE,IAAMC,EAAIhB,EAAW,CAAEQ,QAAS,aAAc,CAAWO,EAAS,CAElE,OAAAG,EACGhB,EAAI,CAAA,IAACiB,MAAI,CAAA,OAAEH,EAAEP,SAAO,IAAEW,UAAQ,CAAA,OAAEJ,EAAEK,UAAQ,IAAAA,UAAA,CAAA,OACxCC,MAAAN,EAAET,OAAS,SAAQ,EAAA,MAAA,CAAA,IAAAgB,EAAAC,GAAA,CACiB,OADjBC,MAAAC,EAAAH,EACNzB,EAAG,WAAYkB,EAAEJ,MAAM,CAAA,CAAA,CAAAW,KAAA,CAAAL,EAElCS,EAAe,CAAA,IACdpB,MAAI,CAAA,OAAES,EAAET,MAAI,IACZC,SAAO,CAAA,OAAGQ,EAA+CR,SAAgB,CAE5E,EAAA,CAAA,EAaDmB,EAAmDX,GACnDA,EAAET,OAAS,QACbW,EAAQW,EAAa,CAAA,IAACrB,SAAO,CAAA,OAAEQ,EAAER,SAAuB,CAAA,CAE1DU,EAAQY,EAAc,CAAA,IAACtB,SAAO,CAAA,OAAEQ,EAAER,SAAwB,CAAA,CAKtDsB,EAAyDd,GAAK,CAClE,OAAQA,EAAER,QAAV,CACE,IAAK,YACH,OAAAuB,GAAA,CAUF,IAAK,iBACH,OAAAC,GAAA,CAYF,IAAK,UACH,OAAAC,GAAA,CASF,IAAK,UACH,OAAAC,GAAA,CAcF,IAAK,WACH,OAAAC,GAAA,CAWF,IAAK,OACH,OAAAC,GAAA,CAQF,QACE,OAAAC,GAAA,GAYAR,EAAuDb,GAAK,CAChE,OAAQA,EAAER,QAAV,CACE,IAAK,YACH,OAAA8B,GAAA,CAEF,IAAK,SACH,OAAAC,GAAA,CAEF,IAAK,SACH,OAAAC,GAAA,CAEF,IAAK,WACH,OAAAC,GAAA,CAEF,IAAK,gBACH,OAAAC,GAAA,CASF,QACE,OAAAJ,GAAA"}