solid-tom-ui 1.0.11 β†’ 1.0.15

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 (119) hide show
  1. package/README.md +246 -246
  2. package/dist/README.md +246 -246
  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.d.ts.map +1 -1
  24. package/dist/components/input/variants/input-number.js +1 -1
  25. package/dist/components/input/variants/input-number.js.map +1 -1
  26. package/dist/components/input/variants/input-otp.js.map +1 -1
  27. package/dist/components/input/variants/input-password.js.map +1 -1
  28. package/dist/components/input/variants/input-radio.js.map +1 -1
  29. package/dist/components/input/variants/input-range.js.map +1 -1
  30. package/dist/components/input/variants/input-text.d.ts.map +1 -1
  31. package/dist/components/input/variants/input-text.js +1 -1
  32. package/dist/components/input/variants/input-text.js.map +1 -1
  33. package/dist/components/input/variants/input-textarea.js.map +1 -1
  34. package/dist/components/loading/loading.js.map +1 -1
  35. package/dist/components/mansory/mansory.js.map +1 -1
  36. package/dist/components/menu/menu.js.map +1 -1
  37. package/dist/components/modal/modal.js.map +1 -1
  38. package/dist/components/modal/modalContext.js.map +1 -1
  39. package/dist/components/pagination/pagination.js.map +1 -1
  40. package/dist/components/progress-bar/progress-bar.js.map +1 -1
  41. package/dist/components/qr-code/qr-code.js.map +1 -1
  42. package/dist/components/select/select.js +1 -1
  43. package/dist/components/select/select.js.map +1 -1
  44. package/dist/components/select-zone/select-zone.js.map +1 -1
  45. package/dist/components/skeleton/skeleton.js.map +1 -1
  46. package/dist/components/slider/slider.js.map +1 -1
  47. package/dist/components/splitter/splitter.js.map +1 -1
  48. package/dist/components/steps/steps.js.map +1 -1
  49. package/dist/components/swap/swap.js.map +1 -1
  50. package/dist/components/switch/switch.js.map +1 -1
  51. package/dist/components/tab/tab.js.map +1 -1
  52. package/dist/components/table/table.js.map +1 -1
  53. package/dist/components/timeline/timeline.js.map +1 -1
  54. package/dist/components/toast/icons/ErrorIcon.js.map +1 -1
  55. package/dist/components/toast/icons/IconCircle.js.map +1 -1
  56. package/dist/components/toast/icons/InfoIcon.js.map +1 -1
  57. package/dist/components/toast/icons/LoaderIcon.js.map +1 -1
  58. package/dist/components/toast/icons/SuccessIcon.js.map +1 -1
  59. package/dist/components/toast/icons/WarningIcon.js.map +1 -1
  60. package/dist/components/toast/toast.js.map +1 -1
  61. package/dist/components/toast/toast.store.js.map +1 -1
  62. package/dist/components/tooltip/tooltip.js.map +1 -1
  63. package/dist/components/tour/tour.js.map +1 -1
  64. package/dist/components/upload/upload.js.map +1 -1
  65. package/dist/components/z-index/z-index.context.js.map +1 -1
  66. package/dist/components/z-index/z-index.js.map +1 -1
  67. package/dist/components/z-index/z-index.store.js.map +1 -1
  68. package/dist/components/z-index/z-index.types.js.map +1 -1
  69. package/dist/package.json +1 -1
  70. package/dist/skill/avatar.skill.md.txt +255 -255
  71. package/dist/skill/badge.skill.md.txt +223 -223
  72. package/dist/skill/breadcrumb.skill.md.txt +177 -177
  73. package/dist/skill/button.skill.md.txt +198 -198
  74. package/dist/skill/carousel.skill.md.txt +406 -406
  75. package/dist/skill/chat-bubble.skill.md.txt +342 -342
  76. package/dist/skill/checkbox.skill.md.txt +326 -326
  77. package/dist/skill/code-preview.skill.md.txt +240 -240
  78. package/dist/skill/collapse.skill.md.txt +329 -329
  79. package/dist/skill/context-menu.skill.md.txt +233 -233
  80. package/dist/skill/diff.skill.md.txt +244 -244
  81. package/dist/skill/divider.skill.md.txt +151 -151
  82. package/dist/skill/doc.skill.md.txt +191 -191
  83. package/dist/skill/drawer.skill.md.txt +157 -157
  84. package/dist/skill/dropdown.skill.md.txt +198 -198
  85. package/dist/skill/float-button.skill.md.txt +315 -315
  86. package/dist/skill/hover-3d-image.skill.md.txt +120 -120
  87. package/dist/skill/iframe.skill.md.txt +114 -114
  88. package/dist/skill/image-preview.skill.md.txt +162 -162
  89. package/dist/skill/indicator.skill.md.txt +60 -60
  90. package/dist/skill/input.skill.md.txt +489 -489
  91. package/dist/skill/loading.skill.md.txt +127 -127
  92. package/dist/skill/menu.skill.md.txt +476 -476
  93. package/dist/skill/modal.skill.md.txt +359 -359
  94. package/dist/skill/pagination.skill.md.txt +405 -405
  95. package/dist/skill/progress-bar.skill.md.txt +207 -207
  96. package/dist/skill/qr-code.skill.md.txt +136 -136
  97. package/dist/skill/rating.skill.md.txt +167 -167
  98. package/dist/skill/select-zone.skill.md.txt +93 -93
  99. package/dist/skill/select.skill.md.txt +663 -663
  100. package/dist/skill/skeleton.skill.md.txt +192 -192
  101. package/dist/skill/slider.skill.md.txt +404 -404
  102. package/dist/skill/splitter.skill.md.txt +411 -411
  103. package/dist/skill/steps.skill.md.txt +264 -264
  104. package/dist/skill/swap.skill.md.txt +139 -139
  105. package/dist/skill/switch.skill.md.txt +191 -191
  106. package/dist/skill/tab.skill.md.txt +484 -484
  107. package/dist/skill/table.example.header.md.txt +666 -666
  108. package/dist/skill/table.skill.md.txt +1407 -1407
  109. package/dist/skill/text-rotate.skill.md.txt +186 -186
  110. package/dist/skill/timeline.skill.md.txt +247 -247
  111. package/dist/skill/toast.skill.md.txt +531 -531
  112. package/dist/skill/tooltip.skill.md.txt +222 -222
  113. package/dist/skill/tour.skill.md.txt +156 -156
  114. package/dist/skill/upload.skill.md.txt +358 -358
  115. package/dist/utils/cn.js.map +1 -1
  116. package/dist/utils/element-tracker.js.map +1 -1
  117. package/dist/utils/helper.js.map +1 -1
  118. package/dist/utils/hoc.js.map +1 -1
  119. package/package.json +132 -133
@@ -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('.dp04')) 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":"+VAqBMkB,EAAoBjB,GAAuC,CAI3DkB,EAAgB,CACpBC,SAAU,GACVC,gBAAiB,GACjBC,YAAa,GACbC,SAAU,GACX,CAEYC,EAAyCC,GAAS,CAC7D,IAAMC,EAAItB,EAAWe,EAAeM,EAAM,CAGpCE,EAAU,IAAIC,IAGd,CAACC,EAAcC,GAAmB3B,EAA0B,IAAI4B,IAAM,CAGtE,CAACC,EAAaC,GAAkB9B,EAK5B,KAAK,CAEXmC,EASJ,SAASE,EACPC,EACAC,EACAC,EACAC,EACA9B,EACS,CACT,IAAM+B,EAAI/B,EAAGgC,uBAAuB,CAC9BC,EAAUF,EAAEG,KAAOC,OAAOC,QAC1BC,EAASN,EAAEO,IAAMH,OAAOI,QACxBC,EAAWT,EAAEU,MAAQN,OAAOC,QAC5BM,EAAYX,EAAEY,OAASR,OAAOI,QACpC,OAAOC,EAAWb,GAAWM,EAAUJ,GAAYa,EAAYd,GAAUS,EAASP,EAOpF,SAASc,EACPC,EACAC,EACAC,EACAC,EACa,CACb,IAAMrB,EAAUsB,KAAKC,IAAIL,EAAYE,EAAU,CACzCnB,EAASqB,KAAKC,IAAIJ,EAAYE,EAAU,CACxCnB,EAAWoB,KAAKE,IAAIN,EAAYE,EAAU,CAC1CjB,EAAYmB,KAAKE,IAAIL,EAAYE,EAAU,CAE3CI,EAAM,IAAInC,IAMhB,OALAJ,EAAQwC,QAAQ,SAAmBrD,EAAID,EAAK,CACtC2B,EAAWC,EAASC,EAAQC,EAAUC,EAAW9B,EAAG,EACtDoD,EAAIG,IAAIxD,EAAI,EAEd,CACKqD,EAMT,IAAIP,EAAa,EACbC,EAAa,EACbU,EAAa,GACbC,EAAa,GACbC,EAAwB,IAAIzC,IAC5B0C,EAAQ,EACRC,EAAc,EACdC,EAAc,EAIlB,SAASC,GAAa,CACpB,GAAI,CAACN,EAAY,OAEjB,IAAMO,EAAYnD,EAAEL,gBACdyD,EAAQpD,EAAEJ,YACVyD,EAAK9B,OAAO+B,WACZC,EAAKhC,OAAOiC,YACZC,EAAKT,EACLU,EAAKT,EAEPU,EAAK,EACLC,EAAK,EAELH,EAAKN,EAAWQ,EAAK,CAACP,GAAS,EAAIK,EAAKN,GACnCM,EAAKJ,EAAKF,IAAWQ,EAAKP,GAAS,GAAKC,EAAKI,GAAMN,IAExDO,EAAKP,EAAWS,EAAK,CAACR,GAAS,EAAIM,EAAKP,GACnCO,EAAKH,EAAKJ,IAAWS,EAAKR,GAAS,GAAKG,EAAKG,GAAMP,KAExDQ,IAAO,GAAKC,IAAO,IACrBrC,OAAOsC,SAASF,EAAIC,EAAG,CAKzBE,EAAcL,EAAIC,EAAG,CAErBX,EAAQgB,sBAAsBb,EAAW,CAK3C,SAASY,EAAcE,EAAqBC,EAAqB,CAE/D,IAAM9B,EAAY6B,EAAczC,OAAOC,QACjCY,EAAY6B,EAAc1C,OAAOI,QAGjCN,EAAUgB,KAAKC,IAAIL,EAAYE,EAAU,CACzCV,EAASY,KAAKC,IAAIJ,EAAYE,EAAU,CACxC1B,EAAI2B,KAAK6B,IAAI/B,EAAYF,EAAW,CACpCtB,EAAI0B,KAAK6B,IAAI9B,EAAYF,EAAW,CAG1C3B,EAAe,CACbC,EAAGa,EAAUE,OAAOC,QACpBf,EAAGgB,EAASF,OAAOI,QACnBjB,IACAC,IACD,CAAC,CAGF,IAAM6B,EAAMR,EAAiBC,EAAYC,EAAYC,EAAWC,EAAU,CAEtE+B,EACAtB,GAEFsB,EAAO,IAAI9D,IAAIyC,EAAS,CACxBN,EAAIC,QAAQ2B,GAAK,CACXtB,EAASuB,IAAID,EAAE,CAAED,EAAKG,OAAOF,EAAE,CAC9BD,EAAKxB,IAAIyB,EAAE,EAChB,EAEFD,EAAO3B,EAETpC,EAAgB+D,EAAK,CAKvB,SAASI,EAAYC,EAAe,CAC9BxE,EAAEH,UAEF2E,EAAEE,SAAW,IACFF,EAAEG,OACNC,QAAQ,uDAAuD,GAE1EhC,EAAa,GAEbX,EAAauC,EAAEK,QAAUtD,OAAOC,QAChCU,EAAasC,EAAEM,QAAUvD,OAAOI,QAChCqB,EAAcwB,EAAEK,QAChB5B,EAAcuB,EAAEM,QAChBjC,EAAa2B,EAAEO,UAAYP,EAAEQ,SAAWR,EAAES,QAC1CnC,EAAWD,EAAa,IAAIxC,IAAIF,GAAc,CAAC,CAAG,IAAIE,IAEtD6E,SAASC,iBAAiB,YAAaC,EAAY,CACnDF,SAASC,iBAAiB,UAAWE,EAAU,GAGjD,SAASD,EAAYZ,EAAe,CAClCxB,EAAcwB,EAAEK,QAChB5B,EAAcuB,EAAEM,QAGhB,IAAMnB,EAAKa,EAAEK,QAAUtD,OAAOC,QAAUS,EAClC2B,EAAKY,EAAEM,QAAUvD,OAAOI,QAAUO,EAExC,GAAI,CAACU,EAAY,CAEf,GAAIP,KAAK6B,IAAIP,EAAG,CAAG,GAAKtB,KAAK6B,IAAIN,EAAG,CAAG,EAAG,OAC1ChB,EAAa,GACbG,EAAQgB,sBAAsBb,EAAW,CAG3CY,EAAcU,EAAEK,QAASL,EAAEM,QAAQ,CAGrC,SAASO,EAAUb,EAAe,CAChCU,SAASI,oBAAoB,YAAaF,EAAY,CACtDF,SAASI,oBAAoB,UAAWD,EAAU,CAElDE,qBAAqBxC,EAAM,CAC3BH,EAAa,GAETtC,GAAa,GAAK,KAMfuC,GACY2B,EAAEG,OACGC,QAAQ,oBAAoB,GAE9CxE,EAAgB,IAAIC,IAAc,CAClCL,EAAEwF,WAAW,IAAInF,IAAc,GAVnCE,EAAe,KAAK,CAEpBP,EAAEwF,WAAW,IAAInF,IAAIF,GAAc,CAAC,CAAC,EAiDzC,OAnBA3B,EAAa,UAA+B,CAC1C,IAAMqH,EAAI7F,EAAE8F,MACRD,IAAME,IAAAA,IAAW3F,EAAgB,IAAIC,IAAIwF,EAAE,CAAC,EAChD,CAIFrH,EAAa,UAA0B,CACrCoC,EAAOuE,iBAAiB,YAAaZ,EAAY,CACjD5F,EAAU,UAA4B,CACpCiC,EAAO0E,oBAAoB,YAAaf,EAAY,CACpDW,SAASI,oBAAoB,YAAaF,EAAY,CACtDF,SAASI,oBAAoB,UAAWD,EAAU,CAClDE,qBAAqBxC,EAAM,EAC3B,EACF,CAIFmD,EACG1G,EAAkB2G,SAAQ,CAACL,MAlCe,CAC3C5G,aAAaC,EAAKC,EAAI,CACpBa,EAAQ0F,IAAIxG,EAAKC,EAAG,EAEtBE,eAAeH,EAAK,CAClBc,EAAQqE,OAAOnF,EAAI,EAErBI,WAAWJ,EAAK,CACd,OAAOgB,GAAc,CAACkE,IAAIlF,EAAI,EAEjC,CAwBgD,IAAAiH,UAAA,CAAA,IAAAC,EAAAC,GAAA,CAAAC,EACnC3F,EAAwC,OAAlC,OAAA2F,GAAA,WAAAC,EAAAD,EAAAF,EAAA,CAANzF,EAAMyF,EAAAI,EAAAJ,MACbrG,EAAEoG,SAAQ,KAAA,CAAAK,EAAAJ,OAAA,CAAA,IAAAK,EAAAC,MAAA,CAAA,CAGVrG,GAAa,CAAA,CAAA,UAAboG,GAAA,EAAAR,EACErH,EAAM,CAAA,IAAC+H,OAAK,CAAA,OAAE1B,SAAS2B,MAAI,IAAAT,UAAA,CAAA,IAAAU,EAAAR,GAAA,CAOS,OAPTS,EAAAC,GAAA,CAAA,IAAAC,EAEjBnI,EAAG,OAAQkB,EAAEkH,OAAOC,QAAQ,CAAAC,EAE3B,GAAG9G,GAAa,CAAEE,EAAC,IAAI6G,EACxB,GAAG/G,GAAa,CAAEG,EAAC,IAAI6G,EACrB,GAAGhH,GAAa,CAAEI,EAAC,IAAI6G,EACtB,GAAGjH,GAAa,CAAEK,EAAC,IAAI,OAAAsG,IAAAD,EAAAxC,GAAAgD,EAAAV,EAAAE,EAAAxC,EAAAyC,EAAA,CAAAG,IAAAJ,EAAAS,GAAAC,EAAAZ,EAAA,OAAAE,EAAAS,EAAAL,EAAA,CAAAC,IAAAL,EAAAW,GAAAD,EAAAZ,EAAA,MAAAE,EAAAW,EAAAN,EAAA,CAAAC,IAAAN,EAAAY,GAAAF,EAAAZ,EAAA,QAAAE,EAAAY,EAAAN,EAAA,CAAAC,IAAAP,EAAAa,GAAAH,EAAAZ,EAAA,SAAAE,EAAAa,EAAAN,EAAA,CAAAP,GAAA,CAAAxC,EAAAuB,IAAAA,GAAA0B,EAAA1B,IAAAA,GAAA4B,EAAA5B,IAAAA,GAAA6B,EAAA7B,IAAAA,GAAA8B,EAAA9B,IAAAA,GAAA,CAAA,CAAAe,GAAA,CAItC,IAAA,CAAA,KAAA,CAAAC,MAAAS,EAAAnB,EAhBsBvH,EAAG,OAAQkB,EAAEkH,OAAOY,KAAK,CAAA,CAAA,CAAAzB,GAAA,CAAA,EAwB3C0B,EAAiDhI,GAAS,CACrE,IAAMiI,EAAMpJ,EAAWY,EAAkB,CACzC,GAAI,CAACwI,EAAK,MAAUC,MAAM,kDAAkD,CAE5E,IAAI7I,EAEJZ,EAAa,UAA2B,CACtCwJ,EAAI9I,aAAaa,EAAMoI,QAAS/I,EAAG,CACnCT,EAAU,UAA+B,CACvCqJ,EAAI1I,eAAeS,EAAMoI,QAAQ,EACjC,EACF,CAEF,IAAM5I,MAAmByI,EAAIzI,WAAWQ,EAAMoI,QAAQ,CAEtD,WAAA,CAAA,IAAAE,EAAA/B,GAAA,CAAAgC,EACYlJ,EAAkE,OAAhE,OAAAkJ,GAAA,WAAA9B,EAAA8B,EAAAD,EAAA,CAAFjJ,EAAEiJ,EAAA5B,EAAA4B,MACTtI,EAAMqG,SAAS7G,EAAW,CAAA,CAAAwH,EAAAC,GAAA,CAAA,IAAAuB,EADExI,EAAMoI,QAAOK,EAAS1J,EAAG,OAAQiB,EAAMmH,MAAM,CAAA,OAAAqB,IAAAvB,EAAAxC,GAAAiE,EAAAJ,EAAA,kBAAArB,EAAAxC,EAAA+D,EAAA,CAAAC,IAAAxB,EAAAS,GAAAD,EAAAa,EAAArB,EAAAS,EAAAe,EAAA,CAAAxB,GAAA,CAAAxC,EAAAuB,IAAAA,GAAA0B,EAAA1B,IAAAA,GAAA,CAAA,CAAAsC,KAAA"}
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"}