solid-tom-ui 0.2.2 → 0.2.4

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 (38) hide show
  1. package/dist/components/carousel/carousel.d.ts.map +1 -1
  2. package/dist/components/carousel/carousel.js.map +1 -1
  3. package/dist/components/context-menu/context-menu.js.map +1 -1
  4. package/dist/components/context-menu/context-menu.store.d.ts.map +1 -1
  5. package/dist/components/context-menu/context-menu.store.js.map +1 -1
  6. package/dist/components/context-menu/context-menu.types.d.ts.map +1 -1
  7. package/dist/components/divider/divider.d.ts.map +1 -1
  8. package/dist/components/divider/divider.js.map +1 -1
  9. package/dist/components/divider/divider.types.d.ts.map +1 -1
  10. package/dist/components/divider/index.d.ts +1 -1
  11. package/dist/components/divider/index.d.ts.map +1 -1
  12. package/dist/components/drawer/drawer.types.d.ts.map +1 -1
  13. package/dist/components/dropdown/dropdown.store.js.map +1 -1
  14. package/dist/components/mansory/mansory.d.ts.map +1 -1
  15. package/dist/components/mansory/mansory.js.map +1 -1
  16. package/dist/components/mansory/mansory.types.d.ts.map +1 -1
  17. package/dist/components/modal/modal.d.ts.map +1 -1
  18. package/dist/components/modal/modal.js.map +1 -1
  19. package/dist/components/modal/modalContext.d.ts.map +1 -1
  20. package/dist/components/modal/modalContext.js.map +1 -1
  21. package/dist/components/progress-bar/progress-bar.d.ts.map +1 -1
  22. package/dist/components/progress-bar/progress-bar.js.map +1 -1
  23. package/dist/components/qr-code/qr-code.d.ts.map +1 -1
  24. package/dist/components/qr-code/qr-code.js.map +1 -1
  25. package/dist/components/select-zone/select-zone.js.map +1 -1
  26. package/dist/components/splitter/splitter.d.ts.map +1 -1
  27. package/dist/components/splitter/splitter.js.map +1 -1
  28. package/dist/components/timeline/timeline.d.ts.map +1 -1
  29. package/dist/components/timeline/timeline.js.map +1 -1
  30. package/dist/components/tooltip/tooltip.d.ts.map +1 -1
  31. package/dist/components/tooltip/tooltip.js.map +1 -1
  32. package/dist/components/upload/upload.d.ts.map +1 -1
  33. package/dist/components/upload/upload.js.map +1 -1
  34. package/dist/components/upload/upload.types.d.ts.map +1 -1
  35. package/dist/components/z-index/z-index.d.ts.map +1 -1
  36. package/dist/components/z-index/z-index.js.map +1 -1
  37. package/dist/solid-ui.css +1 -1
  38. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"modalContext.js","names":["createComponent","createRoot","createSignal","ComponentModal","ModalType","activeModalInstances","ModalInstance","destroy","createModal","options","Omit","disposeRoot","setIsOpen","v","disposed","doClose","callOnClose","onClose","index","indexOf","instance","splice","setTimeout","root","isOpen","_setIsOpen","open","preRender","push","closeAllModals","instances","forEach"],"sources":["../../../src/components/modal/modalContext.tsx"],"sourcesContent":["import { createComponent, createRoot, createSignal } from 'solid-js';\nimport { ComponentModal, ModalType } from './modal';\n\nconst activeModalInstances: ModalInstance[] = [];\n\ntype ModalInstance = {\n destroy: () => void;\n};\n\nexport function createModal(options: Omit<ModalType, 'open' | 'preRender'>): ModalInstance {\n let disposeRoot: (() => void) | null = null;\n let setIsOpen: ((v: boolean) => void) | null = null;\n let disposed = false;\n\n const doClose = (callOnClose: boolean) => {\n if (disposed) return;\n disposed = true;\n\n setIsOpen?.(false);\n if (callOnClose) options.onClose?.();\n\n const index = activeModalInstances.indexOf(instance);\n if (index > -1) {\n activeModalInstances.splice(index, 1);\n }\n\n setTimeout(() => {\n disposeRoot?.();\n }, 150);\n };\n\n createRoot(root => {\n disposeRoot = root;\n const [isOpen, _setIsOpen] = createSignal(true);\n setIsOpen = _setIsOpen;\n\n // ComponentModal renders via Portal (ZIndex → Portal) — it mounts itself\n // into document.body internally. We only need to call it inside a reactive\n // root so its signals/effects run; we don't need to insert it anywhere.\n createComponent(ComponentModal, {\n ...options,\n get open() { return isOpen(); },\n preRender: false,\n onClose: () => doClose(true),\n });\n });\n\n const instance: ModalInstance = {\n destroy: () => doClose(false),\n };\n\n activeModalInstances.push(instance);\n return instance;\n}\n\nexport function closeAllModals() {\n const instances = [...activeModalInstances];\n instances.forEach(instance => instance.destroy());\n}\n"],"mappings":"yHAGA,IAAMK,EAAwC,EAAE,CAMhD,SAAgBG,EAAYC,EAA+D,CACzF,IAAIE,EAAmC,KACnCC,EAA2C,KAC3CE,EAAW,GAETC,EAAWC,GAAyB,CACxC,GAAIF,EAAU,OACdA,EAAW,GAEXF,IAAY,GAAM,CACdI,GAAaP,EAAQQ,WAAW,CAEpC,IAAMC,EAAQb,EAAqBc,QAAQC,EAAS,CAChDF,EAAQ,IACVb,EAAqBgB,OAAOH,EAAO,EAAE,CAGvCI,eAAiB,CACfX,KAAe,EACd,IAAI,EAGTV,EAAWsB,GAAQ,CACjBZ,EAAcY,EACd,GAAM,CAACC,EAAQC,GAAcvB,EAAa,GAAK,CAC/CU,EAAYa,EAKZzB,EAAgBG,EAAgB,CAC9B,GAAGM,EACH,IAAIiB,MAAO,CAAE,OAAOF,GAAQ,EAC5BG,UAAW,GACXV,YAAeF,EAAQ,GAAI,CAC5B,CAAC,EACF,CAEF,IAAMK,EAA0B,CAC9Bb,YAAeQ,EAAQ,GAAK,CAC7B,CAGD,OADAV,EAAqBuB,KAAKR,EAAS,CAC5BA,EAGT,SAAgBS,GAAiB,CACb,CAAC,GAAGxB,EAAqB,CACjC0B,QAAQX,GAAYA,EAASb,SAAS,CAAC"}
1
+ {"version":3,"file":"modalContext.js","names":["createComponent","createRoot","createSignal","ComponentModal","ModalType","activeModalInstances","ModalInstance","destroy","createModal","options","Omit","disposeRoot","setIsOpen","v","disposed","doClose","callOnClose","onClose","index","indexOf","instance","splice","setTimeout","root","isOpen","_setIsOpen","open","preRender","push","closeAllModals","instances","forEach"],"sources":["../../../src/components/modal/modalContext.tsx"],"sourcesContent":["import { createComponent, createRoot, createSignal } from 'solid-js';\nimport { ComponentModal, ModalType } from './modal';\n\nconst activeModalInstances: ModalInstance[] = [];\n\ntype ModalInstance = {\n destroy: () => void;\n};\n\nexport function createModal(options: Omit<ModalType, 'open' | 'preRender'>): ModalInstance {\n let disposeRoot: (() => void) | null = null;\n let setIsOpen: ((v: boolean) => void) | null = null;\n let disposed = false;\n\n const doClose = (callOnClose: boolean) => {\n if (disposed) return;\n disposed = true;\n\n setIsOpen?.(false);\n if (callOnClose) options.onClose?.();\n\n const index = activeModalInstances.indexOf(instance);\n if (index > -1) {\n activeModalInstances.splice(index, 1);\n }\n\n setTimeout(() => {\n disposeRoot?.();\n }, 150);\n };\n\n createRoot(root => {\n disposeRoot = root;\n const [isOpen, _setIsOpen] = createSignal(true);\n setIsOpen = _setIsOpen;\n\n // ComponentModal renders via Portal (ZIndex → Portal) — it mounts itself\n // into document.body internally. We only need to call it inside a reactive\n // root so its signals/effects run; we don't need to insert it anywhere.\n createComponent(ComponentModal, {\n ...options,\n get open() {\n return isOpen();\n },\n preRender: false,\n onClose: () => doClose(true),\n });\n });\n\n const instance: ModalInstance = {\n destroy: () => doClose(false),\n };\n\n activeModalInstances.push(instance);\n return instance;\n}\n\nexport function closeAllModals() {\n const instances = [...activeModalInstances];\n instances.forEach(instance => instance.destroy());\n}\n"],"mappings":"yHAGA,IAAMK,EAAwC,EAAE,CAMhD,SAAgBG,EAAYC,EAA+D,CACzF,IAAIE,EAAmC,KACnCC,EAA2C,KAC3CE,EAAW,GAETC,EAAWC,GAAyB,CACxC,GAAIF,EAAU,OACdA,EAAW,GAEXF,IAAY,GAAM,CACdI,GAAaP,EAAQQ,WAAW,CAEpC,IAAMC,EAAQb,EAAqBc,QAAQC,EAAS,CAChDF,EAAQ,IACVb,EAAqBgB,OAAOH,EAAO,EAAE,CAGvCI,eAAiB,CACfX,KAAe,EACd,IAAI,EAGTV,EAAWsB,GAAQ,CACjBZ,EAAcY,EACd,GAAM,CAACC,EAAQC,GAAcvB,EAAa,GAAK,CAC/CU,EAAYa,EAKZzB,EAAgBG,EAAgB,CAC9B,GAAGM,EACH,IAAIiB,MAAO,CACT,OAAOF,GAAQ,EAEjBG,UAAW,GACXV,YAAeF,EAAQ,GAAI,CAC5B,CAAC,EACF,CAEF,IAAMK,EAA0B,CAC9Bb,YAAeQ,EAAQ,GAAK,CAC7B,CAGD,OADAV,EAAqBuB,KAAKR,EAAS,CAC5BA,EAGT,SAAgBS,GAAiB,CACb,CAAC,GAAGxB,EAAqB,CACjC0B,QAAQX,GAAYA,EAASb,SAAS,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"progress-bar.d.ts","sourceRoot":"","sources":["../../../src/components/progress-bar/progress-bar.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAgI/D,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC9C,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAaD,QAAA,MAAM,WAAW,EAAE,cA0DlB,CAAC;AAEF,OAAO,EAAE,WAAW,EAAE,CAAC"}
1
+ {"version":3,"file":"progress-bar.d.ts","sourceRoot":"","sources":["../../../src/components/progress-bar/progress-bar.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AA4H/D,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC9C,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAaD,QAAA,MAAM,WAAW,EAAE,cA0DlB,CAAC;AAEF,OAAO,EAAE,WAAW,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"progress-bar.js","names":["render","createSignal","onCleanup","cn","getColor","ProgressBarOptions","BarProps","Required","instanceId","onDone","ProgressBarInner","props","progress","setProgress","opacity","setOpacity","rafId","startTime","INITIAL_SPEED","DECAY","MAX_PROGRESS","animate","timestamp","elapsed","speed","Math","pow","delta","prev","next","requestAnimationFrame","completeAndFade","cancelAnimationFrame","setTimeout","fadeOutDuration","completionHandlers","set","cancelProgressAnimation","delete","isRtl","direction","barStyle","width","height","transition","rounded","undefined","containerStyle","zIndex","position","const","left","right","_el$","_tmpl$","_el$2","firstChild","_$insert","_c$","_$memo","shimmer","_el$3","_tmpl$2","_$effect","_$className","_p$","_v$","_v$2","color","_v$3","e","_$style","t","a","Map","activeDisposers","containerEl","HTMLDivElement","ensureContainer","document","createElement","id","body","appendChild","disposeAll","dispose","values","clear","ProgressBarAPI","start","options","dismiss","DEFAULT_OPTIONS","progressBar","random","toString","slice","mergedOptions","slot","_$createComponent","_$mergeProps","remove","size","ids","keys","handler","get"],"sources":["../../../src/components/progress-bar/progress-bar.tsx"],"sourcesContent":["import { render } from 'solid-js/web';\nimport { createSignal, onCleanup } from 'solid-js';\nimport { cn } from '@/utils/cn';\nimport { getColor } from '@/utils/helper';\nimport type { ProgressBarOptions } from './progress-bar.types';\n\n// ─── Internal Bar Component ───────────────────────────────────────────────────\n\ninterface BarProps extends Required<ProgressBarOptions> {\n instanceId: string;\n onDone: () => void;\n}\n\nconst ProgressBarInner = (props: BarProps) => {\n const [progress, setProgress] = createSignal(0);\n const [opacity, setOpacity] = createSignal(1);\n\n let rafId: number;\n let startTime: number | null = null;\n\n // Tốc độ ban đầu (% mỗi giây), giảm dần theo hàm mũ\n const INITIAL_SPEED = 28;\n const DECAY = 0.88; // mỗi giây speed *= DECAY\n const MAX_PROGRESS = 99;\n\n const animate = (timestamp: number) => {\n if (startTime === null) startTime = timestamp;\n const elapsed = (timestamp - startTime) / 1000; // giây\n\n const speed = INITIAL_SPEED * Math.pow(DECAY, elapsed * 2.5);\n const delta = speed / 60; // per frame (60fps)\n\n setProgress(prev => {\n const next = prev + delta;\n return next >= MAX_PROGRESS ? MAX_PROGRESS : next;\n });\n\n if (progress() < MAX_PROGRESS) {\n rafId = requestAnimationFrame(animate);\n }\n };\n\n rafId = requestAnimationFrame(animate);\n\n // dismiss() gọi hàm này — jump lên 100% rồi fade out\n const completeAndFade = () => {\n cancelAnimationFrame(rafId);\n setProgress(100);\n setTimeout(() => {\n setOpacity(0);\n setTimeout(() => props.onDone(), props.fadeOutDuration);\n }, 80);\n };\n\n completionHandlers.set(props.instanceId, completeAndFade);\n\n onCleanup(function cancelProgressAnimation() {\n cancelAnimationFrame(rafId);\n completionHandlers.delete(props.instanceId);\n });\n\n const isRtl = () => props.direction === 'rightToLeft';\n\n const barStyle = () => ({\n width: `${progress()}%`,\n height: `${props.height}px`,\n transition: 'width 0.06s linear',\n 'border-radius': props.rounded\n ? isRtl()\n ? '9999px 0 0 9999px'\n : '0 9999px 9999px 0'\n : '0',\n 'margin-left': isRtl() ? 'auto' : undefined,\n });\n\n const containerStyle = () => ({\n opacity: opacity(),\n transition: `opacity ${props.fadeOutDuration}ms ease`,\n 'z-index': props.zIndex,\n position: 'fixed' as const,\n [props.position === 'bottom' ? 'bottom' : 'top']: '0',\n left: '0',\n right: '0',\n 'pointer-events': 'none' as const,\n });\n\n return (\n <div style={containerStyle()}>\n <div\n class={cn('relative overflow-hidden', getColor(props.color), 'bg-(--color)')}\n style={barStyle()}\n >\n {props.shimmer && (\n <div\n class={cn(\n 'absolute inset-0',\n 'animate-[shimmer_1.2s_ease-in-out_infinite]',\n 'bg-linear-to-r from-transparent via-white/40 to-transparent',\n )}\n />\n )}\n </div>\n </div>\n );\n};\n\n// ─── Global state ─────────────────────────────────────────────────────────────\n\nconst completionHandlers = new Map<string, () => void>();\n\n// Track tất cả instances đang tồn tại (có thể nhiều hơn 1 trong khoảng thời gian ngắn)\nconst activeDisposers = new Map<string, () => void>();\n\nlet containerEl: HTMLDivElement | null = null;\n\nconst ensureContainer = () => {\n if (containerEl) return;\n containerEl = document.createElement('div');\n containerEl.id = 'sui-progress-bar-container';\n document.body.appendChild(containerEl);\n};\n\n// Xóa tất cả instances ngay lập tức (không animate)\nconst disposeAll = () => {\n for (const dispose of activeDisposers.values()) {\n dispose();\n }\n activeDisposers.clear();\n};\n\n// ─── Public API ───────────────────────────────────────────────────────────────\n\nexport interface ProgressBarAPI {\n start: (options?: ProgressBarOptions) => void;\n dismiss: () => void;\n}\n\nconst DEFAULT_OPTIONS: Required<ProgressBarOptions> = {\n color: 'primary',\n height: 3,\n shimmer: true,\n rounded: true,\n zIndex: 9999,\n fadeOutDuration: 300,\n position: 'top',\n direction: 'leftToRight',\n};\n\nconst progressBar: ProgressBarAPI = {\n start(options?: ProgressBarOptions) {\n ensureContainer();\n\n // Xóa tất cả instances cũ ngay lập tức\n disposeAll();\n\n const instanceId = Math.random().toString(36).slice(2);\n\n const mergedOptions: Required<ProgressBarOptions> = {\n ...DEFAULT_OPTIONS,\n ...options,\n };\n\n const slot = document.createElement('div');\n containerEl!.appendChild(slot);\n\n const dispose = render(\n () => (\n <ProgressBarInner\n {...mergedOptions}\n instanceId={instanceId}\n onDone={() => {\n dispose();\n slot.remove();\n activeDisposers.delete(instanceId);\n }}\n />\n ),\n slot,\n );\n\n activeDisposers.set(instanceId, () => {\n dispose();\n slot.remove();\n });\n },\n\n dismiss() {\n if (activeDisposers.size === 0) return;\n\n // Lấy tất cả instanceIds hiện tại\n const ids = [...activeDisposers.keys()];\n\n for (const id of ids) {\n const handler = completionHandlers.get(id);\n if (handler) {\n // Animate lên 100% rồi fade out\n activeDisposers.delete(id);\n handler();\n } else {\n // Fallback: xóa ngay\n const dispose = activeDisposers.get(id);\n activeDisposers.delete(id);\n dispose?.();\n }\n }\n },\n};\n\nexport { progressBar };\n"],"mappings":"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"}
1
+ {"version":3,"file":"progress-bar.js","names":["render","createSignal","onCleanup","cn","getColor","ProgressBarOptions","BarProps","Required","instanceId","onDone","ProgressBarInner","props","progress","setProgress","opacity","setOpacity","rafId","startTime","INITIAL_SPEED","DECAY","MAX_PROGRESS","animate","timestamp","elapsed","speed","Math","pow","delta","prev","next","requestAnimationFrame","completeAndFade","cancelAnimationFrame","setTimeout","fadeOutDuration","completionHandlers","set","cancelProgressAnimation","delete","isRtl","direction","barStyle","width","height","transition","rounded","undefined","containerStyle","zIndex","position","const","left","right","_el$","_tmpl$","_el$2","firstChild","_$insert","_c$","_$memo","shimmer","_el$3","_tmpl$2","_$effect","_$className","_p$","_v$","_v$2","color","_v$3","e","_$style","t","a","Map","activeDisposers","containerEl","HTMLDivElement","ensureContainer","document","createElement","id","body","appendChild","disposeAll","dispose","values","clear","ProgressBarAPI","start","options","dismiss","DEFAULT_OPTIONS","progressBar","random","toString","slice","mergedOptions","slot","_$createComponent","_$mergeProps","remove","size","ids","keys","handler","get"],"sources":["../../../src/components/progress-bar/progress-bar.tsx"],"sourcesContent":["import { render } from 'solid-js/web';\nimport { createSignal, onCleanup } from 'solid-js';\nimport { cn } from '@/utils/cn';\nimport { getColor } from '@/utils/helper';\nimport type { ProgressBarOptions } from './progress-bar.types';\n\n// ─── Internal Bar Component ───────────────────────────────────────────────────\n\ninterface BarProps extends Required<ProgressBarOptions> {\n instanceId: string;\n onDone: () => void;\n}\n\nconst ProgressBarInner = (props: BarProps) => {\n const [progress, setProgress] = createSignal(0);\n const [opacity, setOpacity] = createSignal(1);\n\n let rafId: number;\n let startTime: number | null = null;\n\n // Tốc độ ban đầu (% mỗi giây), giảm dần theo hàm mũ\n const INITIAL_SPEED = 28;\n const DECAY = 0.88; // mỗi giây speed *= DECAY\n const MAX_PROGRESS = 99;\n\n const animate = (timestamp: number) => {\n if (startTime === null) startTime = timestamp;\n const elapsed = (timestamp - startTime) / 1000; // giây\n\n const speed = INITIAL_SPEED * Math.pow(DECAY, elapsed * 2.5);\n const delta = speed / 60; // per frame (60fps)\n\n setProgress(prev => {\n const next = prev + delta;\n return next >= MAX_PROGRESS ? MAX_PROGRESS : next;\n });\n\n if (progress() < MAX_PROGRESS) {\n rafId = requestAnimationFrame(animate);\n }\n };\n\n rafId = requestAnimationFrame(animate);\n\n // dismiss() gọi hàm này — jump lên 100% rồi fade out\n const completeAndFade = () => {\n cancelAnimationFrame(rafId);\n setProgress(100);\n setTimeout(() => {\n setOpacity(0);\n setTimeout(() => props.onDone(), props.fadeOutDuration);\n }, 80);\n };\n\n completionHandlers.set(props.instanceId, completeAndFade);\n\n onCleanup(function cancelProgressAnimation() {\n cancelAnimationFrame(rafId);\n completionHandlers.delete(props.instanceId);\n });\n\n const isRtl = () => props.direction === 'rightToLeft';\n\n const barStyle = () => ({\n width: `${progress()}%`,\n height: `${props.height}px`,\n transition: 'width 0.06s linear',\n 'border-radius': props.rounded ? (isRtl() ? '9999px 0 0 9999px' : '0 9999px 9999px 0') : '0',\n 'margin-left': isRtl() ? 'auto' : undefined,\n });\n\n const containerStyle = () => ({\n opacity: opacity(),\n transition: `opacity ${props.fadeOutDuration}ms ease`,\n 'z-index': props.zIndex,\n position: 'fixed' as const,\n [props.position === 'bottom' ? 'bottom' : 'top']: '0',\n left: '0',\n right: '0',\n 'pointer-events': 'none' as const,\n });\n\n return (\n <div style={containerStyle()}>\n <div\n class={cn('relative overflow-hidden', getColor(props.color), 'bg-(--color)')}\n style={barStyle()}\n >\n {props.shimmer && (\n <div\n class={cn(\n 'absolute inset-0',\n 'animate-[shimmer_1.2s_ease-in-out_infinite]',\n 'bg-linear-to-r from-transparent via-white/40 to-transparent',\n )}\n />\n )}\n </div>\n </div>\n );\n};\n\n// ─── Global state ─────────────────────────────────────────────────────────────\n\nconst completionHandlers = new Map<string, () => void>();\n\n// Track tất cả instances đang tồn tại (có thể nhiều hơn 1 trong khoảng thời gian ngắn)\nconst activeDisposers = new Map<string, () => void>();\n\nlet containerEl: HTMLDivElement | null = null;\n\nconst ensureContainer = () => {\n if (containerEl) return;\n containerEl = document.createElement('div');\n containerEl.id = 'sui-progress-bar-container';\n document.body.appendChild(containerEl);\n};\n\n// Xóa tất cả instances ngay lập tức (không animate)\nconst disposeAll = () => {\n for (const dispose of activeDisposers.values()) {\n dispose();\n }\n activeDisposers.clear();\n};\n\n// ─── Public API ───────────────────────────────────────────────────────────────\n\nexport interface ProgressBarAPI {\n start: (options?: ProgressBarOptions) => void;\n dismiss: () => void;\n}\n\nconst DEFAULT_OPTIONS: Required<ProgressBarOptions> = {\n color: 'primary',\n height: 3,\n shimmer: true,\n rounded: true,\n zIndex: 9999,\n fadeOutDuration: 300,\n position: 'top',\n direction: 'leftToRight',\n};\n\nconst progressBar: ProgressBarAPI = {\n start(options?: ProgressBarOptions) {\n ensureContainer();\n\n // Xóa tất cả instances cũ ngay lập tức\n disposeAll();\n\n const instanceId = Math.random().toString(36).slice(2);\n\n const mergedOptions: Required<ProgressBarOptions> = {\n ...DEFAULT_OPTIONS,\n ...options,\n };\n\n const slot = document.createElement('div');\n containerEl!.appendChild(slot);\n\n const dispose = render(\n () => (\n <ProgressBarInner\n {...mergedOptions}\n instanceId={instanceId}\n onDone={() => {\n dispose();\n slot.remove();\n activeDisposers.delete(instanceId);\n }}\n />\n ),\n slot,\n );\n\n activeDisposers.set(instanceId, () => {\n dispose();\n slot.remove();\n });\n },\n\n dismiss() {\n if (activeDisposers.size === 0) return;\n\n // Lấy tất cả instanceIds hiện tại\n const ids = [...activeDisposers.keys()];\n\n for (const id of ids) {\n const handler = completionHandlers.get(id);\n if (handler) {\n // Animate lên 100% rồi fade out\n activeDisposers.delete(id);\n handler();\n } else {\n // Fallback: xóa ngay\n const dispose = activeDisposers.get(id);\n activeDisposers.delete(id);\n dispose?.();\n }\n }\n },\n};\n\nexport { progressBar };\n"],"mappings":"uUAaMU,EAAoBC,GAAoB,CAC5C,GAAM,CAACC,EAAUC,GAAeZ,EAAa,EAAE,CACzC,CAACa,EAASC,GAAcd,EAAa,EAAE,CAEzCe,EACAC,EAA2B,KAOzBI,EAAWC,GAAsB,CACjCL,IAAc,OAAMA,EAAYK,GAIpC,IAAMK,EADQT,GAAyBC,OAFtBG,EAAYL,GAAa,IAEc,KAClC,GAEtBJ,EAAYe,GAAQ,CAClB,IAAMC,EAAOD,EAAOD,EACpB,OAAOE,GAAQT,GAAeA,GAAeS,GAC7C,CAEEjB,GAAU,CAAGQ,KACfJ,EAAQc,sBAAsBT,EAAQ,GAI1CL,EAAQc,sBAAsBT,EAAQ,CAYtCc,EAAmBC,IAAIzB,EAAMH,eATC,CAC5BwB,qBAAqBhB,EAAM,CAC3BH,EAAY,IAAI,CAChBoB,eAAiB,CACflB,EAAW,EAAE,CACbkB,eAAiBtB,EAAMF,QAAQ,CAAEE,EAAMuB,gBAAgB,EACtD,GAAG,EAGiD,CAEzDhC,EAAU,UAAmC,CAC3C8B,qBAAqBhB,EAAM,CAC3BmB,EAAmBG,OAAO3B,EAAMH,WAAW,EAC3C,CAEF,IAAM+B,MAAc5B,EAAM6B,YAAc,cAElCC,OAAkB,CACtBC,MAAO,GAAG9B,GAAU,CAAA,GACpB+B,OAAQ,GAAGhC,EAAMgC,OAAM,IACvBC,WAAY,qBACZ,gBAAiBjC,EAAMkC,QAAWN,GAAO,CAAG,oBAAsB,oBAAuB,IACzF,cAAeA,GAAO,CAAG,OAASO,IAAAA,GACnC,EAEKC,OAAwB,CAC5BjC,QAASA,GAAS,CAClB8B,WAAY,WAAWjC,EAAMuB,gBAAe,SAC5C,UAAWvB,EAAMqC,OACjBC,SAAU,SACTtC,EAAMsC,WAAa,SAAW,SAAW,OAAQ,IAClDE,KAAM,IACNC,MAAO,IACP,iBAAkB,OACnB,EAED,WAAA,CAAA,IAAAC,EAAAC,GAAA,CAAAC,EAAAF,EAAAG,WAIuB,OAJvBC,EAAAF,OAAA,CAAA,IAAAG,EAAAC,MAAA,CAAA,CAMOhD,EAAMiD,QAAO,CAAA,UAAbF,GAAA,OAAA,CAAA,IAAAG,EAAAC,GAAA,CAMI,OANJC,MAAAC,EAAAH,EAEU1D,EACL,mBACA,8CACA,8DACD,CAAA,CAAA,CAAA0D,KAEJ,IAAA,CAAA,CAAAE,EAAAE,GAAA,CAAA,IAAAC,EAbOnB,GAAgB,CAAAoB,EAEjBhE,EAAG,2BAA4BC,EAASO,EAAMyD,MAAM,CAAE,eAAe,CAAAC,EACrE5B,GAAU,CAAA,MAAAwB,GAAAK,EAAAC,EAAAlB,EAAAa,EAAAD,EAAAK,EAAA,CAAAH,IAAAF,EAAAO,GAAAR,EAAAT,EAAAU,EAAAO,EAAAL,EAAA,CAAAF,EAAAQ,EAAAF,EAAAhB,EAAAc,EAAAJ,EAAAQ,EAAA,CAAAR,GAAA,CAAAK,EAAAxB,IAAAA,GAAA0B,EAAA1B,IAAAA,GAAA2B,EAAA3B,IAAAA,GAAA,CAAA,CAAAO,KAAA,EAkBnBlB,EAAqB,IAAIuC,IAGzBC,EAAkB,IAAID,IAExBE,EAAqC,KAEnCE,MAAwB,CACxBF,IACJA,EAAcG,SAASC,cAAc,MAAM,CAC3CJ,EAAYK,GAAK,6BACjBF,SAASG,KAAKC,YAAYP,EAAY,GAIlCQ,MAAmB,CACvB,IAAK,IAAMC,KAAWV,EAAgBW,QAAQ,CAC5CD,GAAS,CAEXV,EAAgBY,OAAO,EAUnBK,EAAgD,CACpDxB,MAAO,UACPzB,OAAQ,EACRiB,QAAS,GACTf,QAAS,GACTG,OAAQ,KACRd,gBAAiB,IACjBe,SAAU,MACVT,UAAW,cACZ,CAEKqD,EAA8B,CAClCJ,MAAMC,EAA8B,CAClCZ,GAAiB,CAGjBM,GAAY,CAEZ,IAAM5E,EAAaiB,KAAKqE,QAAQ,CAACC,SAAS,GAAG,CAACC,MAAM,EAAE,CAEhDC,EAA8C,CAClD,GAAGL,EACH,GAAGF,EACJ,CAEKQ,EAAOnB,SAASC,cAAc,MAAM,CAC1CJ,EAAaO,YAAYe,EAAK,CAE9B,IAAMb,EAAUrF,MACdmG,EACGzF,EAAgB0F,EACXH,EAAa,CACLzF,aACZC,WAAc,CACZ4E,GAAS,CACTa,EAAKG,QAAQ,CACb1B,EAAgBrC,OAAO9B,EAAW,EACnC,CAAA,CAEJ,CACD0F,EACD,CAEDvB,EAAgBvC,IAAI5B,MAAkB,CACpC6E,GAAS,CACTa,EAAKG,QAAQ,EACb,EAGJV,SAAU,CACR,GAAIhB,EAAgB2B,OAAS,EAAG,OAGhC,IAAMC,EAAM,CAAC,GAAG5B,EAAgB6B,MAAM,CAAC,CAEvC,IAAK,IAAMvB,KAAMsB,EAAK,CACpB,IAAME,EAAUtE,EAAmBuE,IAAIzB,EAAG,CAC1C,GAAIwB,EAEF9B,EAAgBrC,OAAO2C,EAAG,CAC1BwB,GAAS,KACJ,CAEL,IAAMpB,EAAUV,EAAgB+B,IAAIzB,EAAG,CACvCN,EAAgBrC,OAAO2C,EAAG,CAC1BI,KAAW,IAIlB"}
@@ -1 +1 @@
1
- {"version":3,"file":"qr-code.d.ts","sourceRoot":"","sources":["../../../src/components/qr-code/qr-code.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,SAAS,EAA6D,MAAM,UAAU,CAAC;AAChG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AA4EnD,eAAO,MAAM,MAAM,EAAE,SAAS,CAAC,WAAW,CA2EzC,CAAC"}
1
+ {"version":3,"file":"qr-code.d.ts","sourceRoot":"","sources":["../../../src/components/qr-code/qr-code.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,SAAS,EAA6D,MAAM,UAAU,CAAC;AAChG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AA4EnD,eAAO,MAAM,MAAM,EAAE,SAAS,CAAC,WAAW,CAqEzC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"qr-code.js","names":["cn","getColor","QRCode","RefreshCw","CheckCircle","Loader","Component","createEffect","createUniqueId","mergeProps","onCleanup","Show","QrCodeProps","DEFAULT_PROPS","size","color","bgColor","errorLevel","const","status","expiredText","accentColor","drawQr","canvas","HTMLCanvasElement","value","opts","Promise","toCanvas","width","margin","dark","light","errorCorrectionLevel","drawLogo","logo","NonNullable","ctx","getContext","img","Image","crossOrigin","onload","onLogoLoad","logoW","logoH","height","pad","padding","radius","borderRadius","bg","background","bgW","bgH","x","y","beginPath","moveTo","lineTo","quadraticCurveTo","closePath","fillStyle","fill","drawImage","src","QrCode","props","p","id","canvasRef","renderQrCode","then","onQrDrawn","_el$","_tmpl$3","_el$2","firstChild","_$setAttribute","_ref$","_$use","_$insert","_$createComponent","when","children","_el$3","_tmpl$","class","overlayIcon","_$effect","_$className","overlay","_el$4","_tmpl$2","_el$5","_el$6","nextSibling","_$addEventListener","onRefresh","_p$","_v$","_v$2","_v$3","overlayText","e","t","a","undefined","_el$7","_v$4","root","_v$5","_v$6","_v$7","_v$8","_v$9","_v$0","_$setStyleProperty","o","i","n","s","_$delegateEvents"],"sources":["../../../src/components/qr-code/qr-code.tsx"],"sourcesContent":["import { cn } from '@utils/cn';\nimport { getColor } from '@utils/helper';\nimport QRCode from 'qrcode';\nimport RefreshCw from 'lucide-solid/icons/refresh-cw';\nimport CheckCircle from 'lucide-solid/icons/check-circle';\nimport Loader from 'lucide-solid/icons/loader';\nimport { Component, createEffect, createUniqueId, mergeProps, onCleanup, Show } from 'solid-js';\nimport type { QrCodeProps } from './qr-code.types';\n\nconst DEFAULT_PROPS = {\n size: 160,\n color: '#000000',\n bgColor: '#ffffff',\n errorLevel: 'M' as const,\n status: 'active' as const,\n expiredText: 'QR code expired',\n accentColor: 'primary' as const,\n};\n\nasync function drawQr(\n canvas: HTMLCanvasElement,\n value: string,\n opts: {\n size: number;\n color: string;\n bgColor: string;\n errorLevel: 'L' | 'M' | 'Q' | 'H';\n },\n): Promise<void> {\n await QRCode.toCanvas(canvas, value || ' ', {\n width: opts.size,\n margin: 2,\n color: {\n dark: opts.color,\n light: opts.bgColor,\n },\n errorCorrectionLevel: opts.errorLevel,\n });\n}\n\nfunction drawLogo(\n canvas: HTMLCanvasElement,\n logo: NonNullable<QrCodeProps['logo']>,\n size: number,\n): void {\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const img = new Image();\n img.crossOrigin = 'anonymous';\n img.onload = function onLogoLoad() {\n const logoW = logo.width ?? size * 0.2;\n const logoH = logo.height ?? logoW;\n const pad = logo.padding ?? 4;\n const radius = logo.borderRadius ?? 4;\n const bg = logo.background ?? '#ffffff';\n\n const bgW = logoW + pad * 2;\n const bgH = logoH + pad * 2;\n const x = (size - bgW) / 2;\n const y = (size - bgH) / 2;\n\n // Draw background rect with rounded corners\n ctx.beginPath();\n ctx.moveTo(x + radius, y);\n ctx.lineTo(x + bgW - radius, y);\n ctx.quadraticCurveTo(x + bgW, y, x + bgW, y + radius);\n ctx.lineTo(x + bgW, y + bgH - radius);\n ctx.quadraticCurveTo(x + bgW, y + bgH, x + bgW - radius, y + bgH);\n ctx.lineTo(x + radius, y + bgH);\n ctx.quadraticCurveTo(x, y + bgH, x, y + bgH - radius);\n ctx.lineTo(x, y + radius);\n ctx.quadraticCurveTo(x, y, x + radius, y);\n ctx.closePath();\n ctx.fillStyle = bg;\n ctx.fill();\n\n // Draw logo image centered inside background\n ctx.drawImage(img, x + pad, y + pad, logoW, logoH);\n };\n img.src = logo.src;\n}\n\nexport const QrCode: Component<QrCodeProps> = props => {\n const p = mergeProps(DEFAULT_PROPS, props);\n const id = createUniqueId();\n let canvasRef: HTMLCanvasElement | undefined;\n\n createEffect(function renderQrCode() {\n if (!canvasRef) return;\n\n // Snapshot all reactive values synchronously — reads inside .then() would\n // occur outside the reactive computation and throw \"Effects is null\".\n const canvas = canvasRef;\n const value = p.value;\n const size = p.size;\n const color = p.color;\n const bgColor = p.bgColor;\n const errorLevel = p.errorLevel;\n const logo = p.logo;\n\n drawQr(canvas, value, { size, color, bgColor, errorLevel }).then(function onQrDrawn() {\n if (logo) {\n drawLogo(canvas, logo, size);\n }\n });\n });\n\n return (\n <div\n id={id}\n class={cn('qr01', p.class?.root)}\n style={{ width: `${p.size}px`, height: `${p.size}px` }}\n >\n {/* The QR canvas */}\n <canvas\n ref={canvasRef}\n class={cn('qr02', p.class?.canvas)}\n width={p.size}\n height={p.size}\n aria-label={`QR code for: ${p.value}`}\n />\n\n {/* Loading overlay */}\n <Show when={p.status === 'loading'}>\n <div class={cn('qr03', getColor(p.accentColor), p.class?.overlay)}>\n <Loader\n class={cn('qr04 animate-spin', p.class?.overlayIcon)}\n size={p.size * 0.22}\n />\n </div>\n </Show>\n\n {/* Expired overlay */}\n <Show when={p.status === 'expired'}>\n <div class={cn('qr03 qr05', getColor(p.accentColor), p.class?.overlay)}>\n <button\n class={cn('qr06', p.class?.overlayIcon)}\n onClick={p.onRefresh}\n aria-label=\"Refresh QR code\"\n >\n <RefreshCw size={p.size * 0.22} />\n </button>\n <span class={cn('qr07', p.class?.overlayText)}>{p.expiredText}</span>\n </div>\n </Show>\n\n {/* Scanned overlay */}\n <Show when={p.status === 'scanned'}>\n <div class={cn('qr03', getColor('success'), p.class?.overlay)}>\n <CheckCircle\n class={cn('qr04', p.class?.overlayIcon)}\n size={p.size * 0.22}\n />\n </div>\n </Show>\n </div>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"qr-code.js","names":["cn","getColor","QRCode","RefreshCw","CheckCircle","Loader","Component","createEffect","createUniqueId","mergeProps","onCleanup","Show","QrCodeProps","DEFAULT_PROPS","size","color","bgColor","errorLevel","const","status","expiredText","accentColor","drawQr","canvas","HTMLCanvasElement","value","opts","Promise","toCanvas","width","margin","dark","light","errorCorrectionLevel","drawLogo","logo","NonNullable","ctx","getContext","img","Image","crossOrigin","onload","onLogoLoad","logoW","logoH","height","pad","padding","radius","borderRadius","bg","background","bgW","bgH","x","y","beginPath","moveTo","lineTo","quadraticCurveTo","closePath","fillStyle","fill","drawImage","src","QrCode","props","p","id","canvasRef","renderQrCode","then","onQrDrawn","_el$","_tmpl$3","_el$2","firstChild","_$setAttribute","_ref$","_$use","_$insert","_$createComponent","when","children","_el$3","_tmpl$","class","overlayIcon","_$effect","_$className","overlay","_el$4","_tmpl$2","_el$5","_el$6","nextSibling","_$addEventListener","onRefresh","_p$","_v$","_v$2","_v$3","overlayText","e","t","a","undefined","_el$7","_v$4","root","_v$5","_v$6","_v$7","_v$8","_v$9","_v$0","_$setStyleProperty","o","i","n","s","_$delegateEvents"],"sources":["../../../src/components/qr-code/qr-code.tsx"],"sourcesContent":["import { cn } from '@utils/cn';\nimport { getColor } from '@utils/helper';\nimport QRCode from 'qrcode';\nimport RefreshCw from 'lucide-solid/icons/refresh-cw';\nimport CheckCircle from 'lucide-solid/icons/check-circle';\nimport Loader from 'lucide-solid/icons/loader';\nimport { Component, createEffect, createUniqueId, mergeProps, onCleanup, Show } from 'solid-js';\nimport type { QrCodeProps } from './qr-code.types';\n\nconst DEFAULT_PROPS = {\n size: 160,\n color: '#000000',\n bgColor: '#ffffff',\n errorLevel: 'M' as const,\n status: 'active' as const,\n expiredText: 'QR code expired',\n accentColor: 'primary' as const,\n};\n\nasync function drawQr(\n canvas: HTMLCanvasElement,\n value: string,\n opts: {\n size: number;\n color: string;\n bgColor: string;\n errorLevel: 'L' | 'M' | 'Q' | 'H';\n },\n): Promise<void> {\n await QRCode.toCanvas(canvas, value || ' ', {\n width: opts.size,\n margin: 2,\n color: {\n dark: opts.color,\n light: opts.bgColor,\n },\n errorCorrectionLevel: opts.errorLevel,\n });\n}\n\nfunction drawLogo(\n canvas: HTMLCanvasElement,\n logo: NonNullable<QrCodeProps['logo']>,\n size: number,\n): void {\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const img = new Image();\n img.crossOrigin = 'anonymous';\n img.onload = function onLogoLoad() {\n const logoW = logo.width ?? size * 0.2;\n const logoH = logo.height ?? logoW;\n const pad = logo.padding ?? 4;\n const radius = logo.borderRadius ?? 4;\n const bg = logo.background ?? '#ffffff';\n\n const bgW = logoW + pad * 2;\n const bgH = logoH + pad * 2;\n const x = (size - bgW) / 2;\n const y = (size - bgH) / 2;\n\n // Draw background rect with rounded corners\n ctx.beginPath();\n ctx.moveTo(x + radius, y);\n ctx.lineTo(x + bgW - radius, y);\n ctx.quadraticCurveTo(x + bgW, y, x + bgW, y + radius);\n ctx.lineTo(x + bgW, y + bgH - radius);\n ctx.quadraticCurveTo(x + bgW, y + bgH, x + bgW - radius, y + bgH);\n ctx.lineTo(x + radius, y + bgH);\n ctx.quadraticCurveTo(x, y + bgH, x, y + bgH - radius);\n ctx.lineTo(x, y + radius);\n ctx.quadraticCurveTo(x, y, x + radius, y);\n ctx.closePath();\n ctx.fillStyle = bg;\n ctx.fill();\n\n // Draw logo image centered inside background\n ctx.drawImage(img, x + pad, y + pad, logoW, logoH);\n };\n img.src = logo.src;\n}\n\nexport const QrCode: Component<QrCodeProps> = props => {\n const p = mergeProps(DEFAULT_PROPS, props);\n const id = createUniqueId();\n let canvasRef: HTMLCanvasElement | undefined;\n\n createEffect(function renderQrCode() {\n if (!canvasRef) return;\n\n // Snapshot all reactive values synchronously — reads inside .then() would\n // occur outside the reactive computation and throw \"Effects is null\".\n const canvas = canvasRef;\n const value = p.value;\n const size = p.size;\n const color = p.color;\n const bgColor = p.bgColor;\n const errorLevel = p.errorLevel;\n const logo = p.logo;\n\n drawQr(canvas, value, { size, color, bgColor, errorLevel }).then(function onQrDrawn() {\n if (logo) {\n drawLogo(canvas, logo, size);\n }\n });\n });\n\n return (\n <div\n id={id}\n class={cn('qr01', p.class?.root)}\n style={{ width: `${p.size}px`, height: `${p.size}px` }}\n >\n {/* The QR canvas */}\n <canvas\n ref={canvasRef}\n class={cn('qr02', p.class?.canvas)}\n width={p.size}\n height={p.size}\n aria-label={`QR code for: ${p.value}`}\n />\n\n {/* Loading overlay */}\n <Show when={p.status === 'loading'}>\n <div class={cn('qr03', getColor(p.accentColor), p.class?.overlay)}>\n <Loader class={cn('qr04 animate-spin', p.class?.overlayIcon)} size={p.size * 0.22} />\n </div>\n </Show>\n\n {/* Expired overlay */}\n <Show when={p.status === 'expired'}>\n <div class={cn('qr03 qr05', getColor(p.accentColor), p.class?.overlay)}>\n <button\n class={cn('qr06', p.class?.overlayIcon)}\n onClick={p.onRefresh}\n aria-label=\"Refresh QR code\"\n >\n <RefreshCw size={p.size * 0.22} />\n </button>\n <span class={cn('qr07', p.class?.overlayText)}>{p.expiredText}</span>\n </div>\n </Show>\n\n {/* Scanned overlay */}\n <Show when={p.status === 'scanned'}>\n <div class={cn('qr03', getColor('success'), p.class?.overlay)}>\n <CheckCircle class={cn('qr04', p.class?.overlayIcon)} size={p.size * 0.22} />\n </div>\n </Show>\n </div>\n );\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"select-zone.js","names":["Component","createContext","createEffect","createSignal","mergeProps","onCleanup","useContext","Portal","cn","SelectZoneItemProps","SelectZoneProps","SelectZoneContextValue","registerItem","key","el","HTMLElement","unregisterItem","isSelected","SelectZoneContext","DEFAULT_PROPS","additive","scrollThreshold","scrollSpeed","disabled","SelectZone","props","p","itemMap","Map","selectedKeys","setSelectedKeys","Set","overlayRect","setOverlayRect","x","y","w","h","rootEl","HTMLDivElement","intersects","selLeft","selTop","selRight","selBottom","r","getBoundingClientRect","docLeft","left","window","scrollX","docTop","top","scrollY","docRight","right","docBottom","bottom","computeSelection","startPageX","startPageY","currPageX","currPageY","Math","min","max","hit","forEach","checkItem","add","isDragging","isAdditive","prevKeys","rafId","lastClientX","lastClientY","scrollLoop","threshold","speed","vw","innerWidth","vh","innerHeight","cx","cy","dx","dy","scrollBy","updateOverlay","requestAnimationFrame","currClientX","currClientY","abs","next","k","has","delete","onMouseDown","e","MouseEvent","button","target","closest","clientX","clientY","shiftKey","ctrlKey","metaKey","document","addEventListener","onMouseMove","onMouseUp","removeEventListener","cancelAnimationFrame","onSelect","item","contextValue","set","syncControlledValue","v","value","undefined","mountListeners","unmountListeners","_$createComponent","Provider","children","_el$","_tmpl$","_ref$","_$use","_$insert","_c$","_$memo","mount","body","_el$2","_$effect","_p$","_v$","class","overlay","_v$2","_v$3","_v$4","_v$5","_$className","t","_$setStyleProperty","a","o","i","root","SelectZoneItem","ctx","Error","registerOnMount","itemKey","unregisterOnUnmount","_el$3","_ref$2","_v$6","_v$7","_$setAttribute"],"sources":["../../../src/components/select-zone/select-zone.tsx"],"sourcesContent":["import {\n Component,\n createContext,\n createEffect,\n createSignal,\n mergeProps,\n onCleanup,\n useContext,\n} from 'solid-js';\nimport { Portal } from 'solid-js/web';\nimport { cn } from '@utils/cn';\nimport { SelectZoneItemProps, SelectZoneProps } from './select-zone.types';\n\n// ─── Context ──────────────────────────────────────────────────────────────────\n\ninterface SelectZoneContextValue {\n registerItem: (key: string, el: HTMLElement) => void;\n unregisterItem: (key: string) => void;\n isSelected: (key: string) => boolean;\n}\n\nconst SelectZoneContext = createContext<SelectZoneContextValue>();\n\n// ─── SelectZone ───────────────────────────────────────────────────────────────\n\nconst DEFAULT_PROPS = {\n additive: true,\n scrollThreshold: 40,\n scrollSpeed: 12,\n disabled: false,\n};\n\nexport const SelectZone: Component<SelectZoneProps> = props => {\n const p = mergeProps(DEFAULT_PROPS, props);\n\n // Map từ itemKey → DOM element (đăng ký bởi SelectZoneItem)\n const itemMap = new Map<string, HTMLElement>();\n\n // Tập hợp các key đang được chọn\n const [selectedKeys, setSelectedKeys] = createSignal<Set<string>>(new Set());\n\n // Overlay rect: null = ẩn, có giá trị = đang kéo\n const [overlayRect, setOverlayRect] = createSignal<{\n x: number;\n y: number;\n w: number;\n h: number;\n } | null>(null);\n\n let rootEl!: HTMLDivElement;\n\n // ── Helpers ─────────────────────────────────────────────────────────────────\n\n /**\n * Tính giao nhau AABB.\n * selLeft/Top/Right/Bottom: document coordinates (pageX/Y).\n * el.getBoundingClientRect(): viewport coordinates → convert sang document.\n */\n function intersects(\n selLeft: number,\n selTop: number,\n selRight: number,\n selBottom: number,\n el: HTMLElement,\n ): boolean {\n const r = el.getBoundingClientRect();\n const docLeft = r.left + window.scrollX;\n const docTop = r.top + window.scrollY;\n const docRight = r.right + window.scrollX;\n const docBottom = r.bottom + window.scrollY;\n return docRight > selLeft && docLeft < selRight && docBottom > selTop && docTop < selBottom;\n }\n\n /**\n * Tính selection.\n * startPageX/Y, currPageX/Y: document coordinates.\n */\n function computeSelection(\n startPageX: number,\n startPageY: number,\n currPageX: number,\n currPageY: number,\n ): Set<string> {\n const selLeft = Math.min(startPageX, currPageX);\n const selTop = Math.min(startPageY, currPageY);\n const selRight = Math.max(startPageX, currPageX);\n const selBottom = Math.max(startPageY, currPageY);\n\n const hit = new Set<string>();\n itemMap.forEach(function checkItem(el, key) {\n if (intersects(selLeft, selTop, selRight, selBottom, el)) {\n hit.add(key);\n }\n });\n return hit;\n }\n\n // ── Drag state ───────────────────────────────────────────────────────────────\n\n // startPageX/Y: document coordinates — cố định suốt drag, không bị ảnh hưởng bởi scroll\n let startPageX = 0;\n let startPageY = 0;\n let isDragging = false;\n let isAdditive = false;\n let prevKeys: Set<string> = new Set();\n let rafId = 0;\n let lastClientX = 0;\n let lastClientY = 0;\n\n // ── Auto-scroll loop ─────────────────────────────────────────────────────────\n\n function scrollLoop() {\n if (!isDragging) return;\n\n const threshold = p.scrollThreshold;\n const speed = p.scrollSpeed;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const cx = lastClientX;\n const cy = lastClientY;\n\n let dx = 0;\n let dy = 0;\n\n if (cx < threshold) dx = -speed * (1 - cx / threshold);\n else if (cx > vw - threshold) dx = speed * (1 - (vw - cx) / threshold);\n\n if (cy < threshold) dy = -speed * (1 - cy / threshold);\n else if (cy > vh - threshold) dy = speed * (1 - (vh - cy) / threshold);\n\n if (dx !== 0 || dy !== 0) {\n window.scrollBy(dx, dy);\n // startPageX/Y KHÔNG thay đổi — nó là điểm neo trong document space\n }\n\n // Cập nhật overlay sau mỗi frame (kể cả khi chỉ scroll mà chuột đứng yên)\n updateOverlay(cx, cy);\n\n rafId = requestAnimationFrame(scrollLoop);\n }\n\n // ── Overlay update ───────────────────────────────────────────────────────────\n\n function updateOverlay(currClientX: number, currClientY: number) {\n // Convert cursor về document coordinates\n const currPageX = currClientX + window.scrollX;\n const currPageY = currClientY + window.scrollY;\n\n // Overlay rect tính trong document space\n const docLeft = Math.min(startPageX, currPageX);\n const docTop = Math.min(startPageY, currPageY);\n const w = Math.abs(currPageX - startPageX);\n const h = Math.abs(currPageY - startPageY);\n\n // Convert sang viewport để render (position: fixed dùng viewport coords)\n setOverlayRect({\n x: docLeft - window.scrollX,\n y: docTop - window.scrollY,\n w,\n h,\n });\n\n // Selection dùng document coordinates\n const hit = computeSelection(startPageX, startPageY, currPageX, currPageY);\n\n let next: Set<string>;\n if (isAdditive) {\n // Toggle per-item: item trong prevKeys bị drag đè → deselect; item mới → select\n next = new Set(prevKeys);\n hit.forEach(k => {\n if (prevKeys.has(k)) next.delete(k);\n else next.add(k);\n });\n } else {\n next = hit;\n }\n setSelectedKeys(next);\n }\n\n // ── Event handlers ───────────────────────────────────────────────────────────\n\n function onMouseDown(e: MouseEvent) {\n if (p.disabled) return;\n // Chỉ xử lý click trái, không xử lý trên scrollbar, input, button, a\n if (e.button !== 0) return;\n const target = e.target as HTMLElement;\n if (target.closest('input, button, a, textarea, select, [data-no-select]')) return;\n\n isDragging = false;\n // Lưu điểm bắt đầu trong document space — bất biến suốt drag\n startPageX = e.clientX + window.scrollX;\n startPageY = e.clientY + window.scrollY;\n lastClientX = e.clientX;\n lastClientY = e.clientY;\n isAdditive = e.shiftKey || e.ctrlKey || e.metaKey;\n prevKeys = isAdditive ? new Set(selectedKeys()) : new Set();\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n }\n\n function onMouseMove(e: MouseEvent) {\n lastClientX = e.clientX;\n lastClientY = e.clientY;\n\n // So sánh trong document space để tránh nhiễu từ scroll\n const dx = (e.clientX + window.scrollX) - startPageX;\n const dy = (e.clientY + window.scrollY) - startPageY;\n\n if (!isDragging) {\n // Chỉ bắt đầu drag khi kéo ít nhất 4px để tránh nhầm với click\n if (Math.abs(dx) < 4 && Math.abs(dy) < 4) return;\n isDragging = true;\n rafId = requestAnimationFrame(scrollLoop);\n }\n\n updateOverlay(e.clientX, e.clientY);\n }\n\n function onMouseUp(e: MouseEvent) {\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n\n cancelAnimationFrame(rafId);\n isDragging = false;\n\n if (overlayRect() !== null) {\n setOverlayRect(null);\n // Thông báo selection cuối cùng\n p.onSelect?.(new Set(selectedKeys()));\n } else {\n // Không drag → click đơn → deselect tất cả (nếu không additive)\n if (!isAdditive) {\n const target = e.target as HTMLElement;\n const item = target.closest('[data-select-key]') as HTMLElement | null;\n if (!item) {\n setSelectedKeys(new Set<string>());\n p.onSelect?.(new Set<string>());\n }\n }\n }\n }\n\n // ── Context value ────────────────────────────────────────────────────────────\n\n const contextValue: SelectZoneContextValue = {\n registerItem(key, el) {\n itemMap.set(key, el);\n },\n unregisterItem(key) {\n itemMap.delete(key);\n },\n isSelected(key) {\n return selectedKeys().has(key);\n },\n };\n\n // ── Đồng bộ controlled value ─────────────────────────────────────────────────\n\n createEffect(function syncControlledValue() {\n const v = p.value;\n if (v !== undefined) setSelectedKeys(new Set(v));\n });\n\n // ── Cleanup khi unmount ──────────────────────────────────────────────────────\n\n createEffect(function mountListeners() {\n rootEl.addEventListener('mousedown', onMouseDown);\n onCleanup(function unmountListeners() {\n rootEl.removeEventListener('mousedown', onMouseDown);\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n cancelAnimationFrame(rafId);\n });\n });\n\n // ── Render ───────────────────────────────────────────────────────────────────\n\n return (\n <SelectZoneContext.Provider value={contextValue}>\n <div ref={rootEl} class={cn('sz01', p.class?.root)}>\n {p.children}\n\n {/* Selection overlay — render qua Portal để tránh ảnh hưởng layout */}\n {overlayRect() && (\n <Portal mount={document.body}>\n <div\n class={cn('sz02', p.class?.overlay)}\n style={{\n left: `${overlayRect()!.x}px`,\n top: `${overlayRect()!.y}px`,\n width: `${overlayRect()!.w}px`,\n height: `${overlayRect()!.h}px`,\n }}\n />\n </Portal>\n )}\n </div>\n </SelectZoneContext.Provider>\n );\n};\n\n// ─── SelectZoneItem ───────────────────────────────────────────────────────────\n\nexport const SelectZoneItem: Component<SelectZoneItemProps> = props => {\n const ctx = useContext(SelectZoneContext);\n if (!ctx) throw new Error('SelectZoneItem must be used inside <SelectZone>');\n\n let el!: HTMLDivElement;\n\n createEffect(function registerOnMount() {\n ctx.registerItem(props.itemKey, el);\n onCleanup(function unregisterOnUnmount() {\n ctx.unregisterItem(props.itemKey);\n });\n });\n\n const isSelected = () => ctx.isSelected(props.itemKey);\n\n return (\n <div ref={el} data-select-key={props.itemKey} class={cn('sz03', props.class)}>\n {props.children(isSelected)}\n </div>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"select-zone.js","names":["Component","createContext","createEffect","createSignal","mergeProps","onCleanup","useContext","Portal","cn","SelectZoneItemProps","SelectZoneProps","SelectZoneContextValue","registerItem","key","el","HTMLElement","unregisterItem","isSelected","SelectZoneContext","DEFAULT_PROPS","additive","scrollThreshold","scrollSpeed","disabled","SelectZone","props","p","itemMap","Map","selectedKeys","setSelectedKeys","Set","overlayRect","setOverlayRect","x","y","w","h","rootEl","HTMLDivElement","intersects","selLeft","selTop","selRight","selBottom","r","getBoundingClientRect","docLeft","left","window","scrollX","docTop","top","scrollY","docRight","right","docBottom","bottom","computeSelection","startPageX","startPageY","currPageX","currPageY","Math","min","max","hit","forEach","checkItem","add","isDragging","isAdditive","prevKeys","rafId","lastClientX","lastClientY","scrollLoop","threshold","speed","vw","innerWidth","vh","innerHeight","cx","cy","dx","dy","scrollBy","updateOverlay","requestAnimationFrame","currClientX","currClientY","abs","next","k","has","delete","onMouseDown","e","MouseEvent","button","target","closest","clientX","clientY","shiftKey","ctrlKey","metaKey","document","addEventListener","onMouseMove","onMouseUp","removeEventListener","cancelAnimationFrame","onSelect","item","contextValue","set","syncControlledValue","v","value","undefined","mountListeners","unmountListeners","_$createComponent","Provider","children","_el$","_tmpl$","_ref$","_$use","_$insert","_c$","_$memo","mount","body","_el$2","_$effect","_p$","_v$","class","overlay","_v$2","_v$3","_v$4","_v$5","_$className","t","_$setStyleProperty","a","o","i","root","SelectZoneItem","ctx","Error","registerOnMount","itemKey","unregisterOnUnmount","_el$3","_ref$2","_v$6","_v$7","_$setAttribute"],"sources":["../../../src/components/select-zone/select-zone.tsx"],"sourcesContent":["import {\n Component,\n createContext,\n createEffect,\n createSignal,\n mergeProps,\n onCleanup,\n useContext,\n} from 'solid-js';\nimport { Portal } from 'solid-js/web';\nimport { cn } from '@utils/cn';\nimport { SelectZoneItemProps, SelectZoneProps } from './select-zone.types';\n\n// ─── Context ──────────────────────────────────────────────────────────────────\n\ninterface SelectZoneContextValue {\n registerItem: (key: string, el: HTMLElement) => void;\n unregisterItem: (key: string) => void;\n isSelected: (key: string) => boolean;\n}\n\nconst SelectZoneContext = createContext<SelectZoneContextValue>();\n\n// ─── SelectZone ───────────────────────────────────────────────────────────────\n\nconst DEFAULT_PROPS = {\n additive: true,\n scrollThreshold: 40,\n scrollSpeed: 12,\n disabled: false,\n};\n\nexport const SelectZone: Component<SelectZoneProps> = props => {\n const p = mergeProps(DEFAULT_PROPS, props);\n\n // Map từ itemKey → DOM element (đăng ký bởi SelectZoneItem)\n const itemMap = new Map<string, HTMLElement>();\n\n // Tập hợp các key đang được chọn\n const [selectedKeys, setSelectedKeys] = createSignal<Set<string>>(new Set());\n\n // Overlay rect: null = ẩn, có giá trị = đang kéo\n const [overlayRect, setOverlayRect] = createSignal<{\n x: number;\n y: number;\n w: number;\n h: number;\n } | null>(null);\n\n let rootEl!: HTMLDivElement;\n\n // ── Helpers ─────────────────────────────────────────────────────────────────\n\n /**\n * Tính giao nhau AABB.\n * selLeft/Top/Right/Bottom: document coordinates (pageX/Y).\n * el.getBoundingClientRect(): viewport coordinates → convert sang document.\n */\n function intersects(\n selLeft: number,\n selTop: number,\n selRight: number,\n selBottom: number,\n el: HTMLElement,\n ): boolean {\n const r = el.getBoundingClientRect();\n const docLeft = r.left + window.scrollX;\n const docTop = r.top + window.scrollY;\n const docRight = r.right + window.scrollX;\n const docBottom = r.bottom + window.scrollY;\n return docRight > selLeft && docLeft < selRight && docBottom > selTop && docTop < selBottom;\n }\n\n /**\n * Tính selection.\n * startPageX/Y, currPageX/Y: document coordinates.\n */\n function computeSelection(\n startPageX: number,\n startPageY: number,\n currPageX: number,\n currPageY: number,\n ): Set<string> {\n const selLeft = Math.min(startPageX, currPageX);\n const selTop = Math.min(startPageY, currPageY);\n const selRight = Math.max(startPageX, currPageX);\n const selBottom = Math.max(startPageY, currPageY);\n\n const hit = new Set<string>();\n itemMap.forEach(function checkItem(el, key) {\n if (intersects(selLeft, selTop, selRight, selBottom, el)) {\n hit.add(key);\n }\n });\n return hit;\n }\n\n // ── Drag state ───────────────────────────────────────────────────────────────\n\n // startPageX/Y: document coordinates — cố định suốt drag, không bị ảnh hưởng bởi scroll\n let startPageX = 0;\n let startPageY = 0;\n let isDragging = false;\n let isAdditive = false;\n let prevKeys: Set<string> = new Set();\n let rafId = 0;\n let lastClientX = 0;\n let lastClientY = 0;\n\n // ── Auto-scroll loop ─────────────────────────────────────────────────────────\n\n function scrollLoop() {\n if (!isDragging) return;\n\n const threshold = p.scrollThreshold;\n const speed = p.scrollSpeed;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const cx = lastClientX;\n const cy = lastClientY;\n\n let dx = 0;\n let dy = 0;\n\n if (cx < threshold) dx = -speed * (1 - cx / threshold);\n else if (cx > vw - threshold) dx = speed * (1 - (vw - cx) / threshold);\n\n if (cy < threshold) dy = -speed * (1 - cy / threshold);\n else if (cy > vh - threshold) dy = speed * (1 - (vh - cy) / threshold);\n\n if (dx !== 0 || dy !== 0) {\n window.scrollBy(dx, dy);\n // startPageX/Y KHÔNG thay đổi — nó là điểm neo trong document space\n }\n\n // Cập nhật overlay sau mỗi frame (kể cả khi chỉ scroll mà chuột đứng yên)\n updateOverlay(cx, cy);\n\n rafId = requestAnimationFrame(scrollLoop);\n }\n\n // ── Overlay update ───────────────────────────────────────────────────────────\n\n function updateOverlay(currClientX: number, currClientY: number) {\n // Convert cursor về document coordinates\n const currPageX = currClientX + window.scrollX;\n const currPageY = currClientY + window.scrollY;\n\n // Overlay rect tính trong document space\n const docLeft = Math.min(startPageX, currPageX);\n const docTop = Math.min(startPageY, currPageY);\n const w = Math.abs(currPageX - startPageX);\n const h = Math.abs(currPageY - startPageY);\n\n // Convert sang viewport để render (position: fixed dùng viewport coords)\n setOverlayRect({\n x: docLeft - window.scrollX,\n y: docTop - window.scrollY,\n w,\n h,\n });\n\n // Selection dùng document coordinates\n const hit = computeSelection(startPageX, startPageY, currPageX, currPageY);\n\n let next: Set<string>;\n if (isAdditive) {\n // Toggle per-item: item trong prevKeys bị drag đè → deselect; item mới → select\n next = new Set(prevKeys);\n hit.forEach(k => {\n if (prevKeys.has(k)) next.delete(k);\n else next.add(k);\n });\n } else {\n next = hit;\n }\n setSelectedKeys(next);\n }\n\n // ── Event handlers ───────────────────────────────────────────────────────────\n\n function onMouseDown(e: MouseEvent) {\n if (p.disabled) return;\n // Chỉ xử lý click trái, không xử lý trên scrollbar, input, button, a\n if (e.button !== 0) return;\n const target = e.target as HTMLElement;\n if (target.closest('input, button, a, textarea, select, [data-no-select]')) return;\n\n isDragging = false;\n // Lưu điểm bắt đầu trong document space — bất biến suốt drag\n startPageX = e.clientX + window.scrollX;\n startPageY = e.clientY + window.scrollY;\n lastClientX = e.clientX;\n lastClientY = e.clientY;\n isAdditive = e.shiftKey || e.ctrlKey || e.metaKey;\n prevKeys = isAdditive ? new Set(selectedKeys()) : new Set();\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n }\n\n function onMouseMove(e: MouseEvent) {\n lastClientX = e.clientX;\n lastClientY = e.clientY;\n\n // So sánh trong document space để tránh nhiễu từ scroll\n const dx = e.clientX + window.scrollX - startPageX;\n const dy = e.clientY + window.scrollY - startPageY;\n\n if (!isDragging) {\n // Chỉ bắt đầu drag khi kéo ít nhất 4px để tránh nhầm với click\n if (Math.abs(dx) < 4 && Math.abs(dy) < 4) return;\n isDragging = true;\n rafId = requestAnimationFrame(scrollLoop);\n }\n\n updateOverlay(e.clientX, e.clientY);\n }\n\n function onMouseUp(e: MouseEvent) {\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n\n cancelAnimationFrame(rafId);\n isDragging = false;\n\n if (overlayRect() !== null) {\n setOverlayRect(null);\n // Thông báo selection cuối cùng\n p.onSelect?.(new Set(selectedKeys()));\n } else {\n // Không drag → click đơn → deselect tất cả (nếu không additive)\n if (!isAdditive) {\n const target = e.target as HTMLElement;\n const item = target.closest('[data-select-key]') as HTMLElement | null;\n if (!item) {\n setSelectedKeys(new Set<string>());\n p.onSelect?.(new Set<string>());\n }\n }\n }\n }\n\n // ── Context value ────────────────────────────────────────────────────────────\n\n const contextValue: SelectZoneContextValue = {\n registerItem(key, el) {\n itemMap.set(key, el);\n },\n unregisterItem(key) {\n itemMap.delete(key);\n },\n isSelected(key) {\n return selectedKeys().has(key);\n },\n };\n\n // ── Đồng bộ controlled value ─────────────────────────────────────────────────\n\n createEffect(function syncControlledValue() {\n const v = p.value;\n if (v !== undefined) setSelectedKeys(new Set(v));\n });\n\n // ── Cleanup khi unmount ──────────────────────────────────────────────────────\n\n createEffect(function mountListeners() {\n rootEl.addEventListener('mousedown', onMouseDown);\n onCleanup(function unmountListeners() {\n rootEl.removeEventListener('mousedown', onMouseDown);\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n cancelAnimationFrame(rafId);\n });\n });\n\n // ── Render ───────────────────────────────────────────────────────────────────\n\n return (\n <SelectZoneContext.Provider value={contextValue}>\n <div ref={rootEl} class={cn('sz01', p.class?.root)}>\n {p.children}\n\n {/* Selection overlay — render qua Portal để tránh ảnh hưởng layout */}\n {overlayRect() && (\n <Portal mount={document.body}>\n <div\n class={cn('sz02', p.class?.overlay)}\n style={{\n left: `${overlayRect()!.x}px`,\n top: `${overlayRect()!.y}px`,\n width: `${overlayRect()!.w}px`,\n height: `${overlayRect()!.h}px`,\n }}\n />\n </Portal>\n )}\n </div>\n </SelectZoneContext.Provider>\n );\n};\n\n// ─── SelectZoneItem ───────────────────────────────────────────────────────────\n\nexport const SelectZoneItem: Component<SelectZoneItemProps> = props => {\n const ctx = useContext(SelectZoneContext);\n if (!ctx) throw new Error('SelectZoneItem must be used inside <SelectZone>');\n\n let el!: HTMLDivElement;\n\n createEffect(function registerOnMount() {\n ctx.registerItem(props.itemKey, el);\n onCleanup(function unregisterOnUnmount() {\n ctx.unregisterItem(props.itemKey);\n });\n });\n\n const isSelected = () => ctx.isSelected(props.itemKey);\n\n return (\n <div ref={el} data-select-key={props.itemKey} class={cn('sz03', props.class)}>\n {props.children(isSelected)}\n </div>\n );\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"splitter.d.ts","sourceRoot":"","sources":["../../../src/components/splitter/splitter.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,SAAS,EAaV,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAEV,UAAU,EAGV,aAAa,EACd,MAAM,kBAAkB,CAAC;AAiG1B,eAAO,MAAM,aAAa,EAAE,SAAS,CAAC,UAAU,CAW/C,CAAC;AAiIF,eAAO,MAAM,QAAQ,EAAE,SAAS,CAAC,aAAa,CAAC,GAAG;IAAE,KAAK,EAAE,SAAS,CAAC,UAAU,CAAC,CAAA;CA4U/E,CAAC"}
1
+ {"version":3,"file":"splitter.d.ts","sourceRoot":"","sources":["../../../src/components/splitter/splitter.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,SAAS,EAaV,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAEV,UAAU,EAGV,aAAa,EACd,MAAM,kBAAkB,CAAC;AAiG1B,eAAO,MAAM,aAAa,EAAE,SAAS,CAAC,UAAU,CAW/C,CAAC;AAiIF,eAAO,MAAM,QAAQ,EAAE,SAAS,CAAC,aAAa,CAAC,GAAG;IAAE,KAAK,EAAE,SAAS,CAAC,UAAU,CAAC,CAAA;CA2V/E,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"splitter.js","names":["cn","getColor","children","Component","createContext","createEffect","createMemo","createSignal","createUniqueId","For","JSX","mergeProps","on","onCleanup","Show","useContext","CollapsibleConfig","PanelProps","SplitterContextValue","SplitterOrientation","SplitterProps","SplitterContext","orientation","PanelRegistration","id","props","PanelRegistryContextValue","register","reg","unregister","PanelRegistryContext","renderIcon","icon","Element","CollapseLeft","_tmpl$","CollapseRight","_tmpl$2","CollapseUp","_tmpl$3","CollapseDown","_tmpl$4","clamp","v","min","max","Math","redistributeSizes","sizes","draggerIdx","delta","panelMetas","collapsed","leftIdx","rightIdx","length","next","leftMeta","rightMeta","leftMin","leftMax","rightMin","rightMax","totalAvail","newLeft","newRight","SplitterPanel","rawProps","registry","unregisterPanel","DraggerItemProps","dIdx","getPanelList","getCollapsed","getDraggingIdx","draggerIcon","showCollapsibleIcon","collapsibleIcon","collapse","expand","collapsedControlled","class","onMouseDown","idx","e","MouseEvent","onDblClick","onCollapse","panelIdx","DraggerItem","p","leftResizable","resizable","rightResizable","canResize","isDragging","leftCollapsible","collapsible","rightCollapsible","hasCollapse","isLeftCollapsed","isRightCollapsed","iconAlwaysShow","isH","showBtnNext","cfg","showBtnPrevFull","_el$5","_tmpl$6","_el$6","firstChild","$$dblclick","$$mousedown","_$insert","_c$","_$memo","_$createComponent","when","_el$7","_tmpl$5","$$click","stopPropagation","_c$2","_$effect","_p$","_v$","collapseBtn","_v$2","_$className","t","_$setAttribute","undefined","_el$8","_c$3","_v$3","_v$4","_v$5","dragger","_v$6","draggerBar","Splitter","Panel","lazy","color","const","vertical","setPanelMetas","prev","findIndex","r","filter","resolvedChildren","Provider","value","initSizes","metas","n","size","raw","map","m","defaultSize","hasAll","every","total","reduce","s","definedTotal","undefinedCount","eachUndefined","isCollapsedControlled","Array","isArray","setSizes","collapsedInternal","setCollapsedInternal","draggingIdx","setDraggingIdx","setCollapsed","lazyGhostPos","setLazyGhostPos","controlled","containerRef","HTMLDivElement","cachedContainerSize","observeContainerSize","observer","ResizeObserver","entries","entry","contentRect","width","height","observe","disconnectContainerObserver","disconnect","getContainerSize","getNormalizedSizes","col","visibleTotal","sum","i","dragStartPos","dragStartSizes","dragStartCollapsed","onDraggerMouseDown","preventDefault","clientX","clientY","onResizeStart","index","document","addEventListener","onMouseMove","onMouseUp","applyNewSizes","newSizes","changed","pos","containerSize","deltaPct","leftSumPct","slice","onResize","onResizeEnd","removeEventListener","removeDragListeners","collapsePanel","currentCollapsed","newCollapsed","ghostStyle","CSSProperties","display","left","top","_el$9","_tmpl$7","_el$0","_tmpl$9","_ref$","_$use","each","meta","isCollapsed","panelStyle","rawSizes","normalized","showDragger","hasVisibleLeft","hasVisibleRight","_el$10","_v$7","panel","_v$8","_v$9","_$style","a","onDraggerDoubleClick","_el$1","_tmpl$8","_$p","root","_$delegateEvents"],"sources":["../../../src/components/splitter/splitter.tsx"],"sourcesContent":["import { cn } from '@/utils/cn';\nimport { getColor } from '@utils/helper';\nimport {\n children,\n Component,\n createContext,\n createEffect,\n createMemo,\n createSignal,\n createUniqueId,\n For,\n JSX,\n mergeProps,\n on,\n onCleanup,\n Show,\n useContext,\n} from 'solid-js';\nimport type {\n CollapsibleConfig,\n PanelProps,\n SplitterContextValue,\n SplitterOrientation,\n SplitterProps,\n} from './splitter.types';\n\nconst SplitterContext = createContext<SplitterContextValue>({ orientation: 'horizontal' });\n\ntype PanelRegistration = {\n id: string;\n props: PanelProps;\n};\n\ntype PanelRegistryContextValue = {\n register: (reg: PanelRegistration) => void;\n unregister: (id: string) => void;\n};\n\nconst PanelRegistryContext = createContext<PanelRegistryContextValue | null>(null);\n\nfunction renderIcon(icon: JSX.Element | (() => JSX.Element) | undefined): JSX.Element {\n if (typeof icon === 'function') return (icon as () => JSX.Element)();\n return icon as JSX.Element;\n}\n\nconst CollapseLeft = () => (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"currentColor\">\n <path d=\"M6 2L3 5l3 3V2z\" />\n </svg>\n);\n\nconst CollapseRight = () => (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"currentColor\">\n <path d=\"M4 2l3 3-3 3V2z\" />\n </svg>\n);\n\nconst CollapseUp = () => (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"currentColor\">\n <path d=\"M2 6l3-3 3 3H2z\" />\n </svg>\n);\n\nconst CollapseDown = () => (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"currentColor\">\n <path d=\"M2 4l3 3 3-3H2z\" />\n </svg>\n);\n\nfunction clamp(v: number, min: number, max: number) {\n return Math.min(Math.max(v, min), max);\n}\n\nfunction redistributeSizes(\n sizes: number[],\n draggerIdx: number,\n delta: number,\n panelMetas: PanelRegistration[],\n collapsed: boolean[],\n): number[] {\n // Tìm panel visible thực sự ở hai phía của dragger.\n // Bỏ qua các panel đang collapsed vì chúng bị CSS force về 0 và không\n // đóng góp vào tổng width thực tế — redistribute vào chúng sẽ tạo gap.\n let leftIdx = draggerIdx;\n while (leftIdx >= 0 && collapsed[leftIdx]) leftIdx--;\n\n let rightIdx = draggerIdx + 1;\n while (rightIdx < sizes.length && collapsed[rightIdx]) rightIdx++;\n\n if (leftIdx < 0 || rightIdx >= sizes.length) return sizes;\n\n const next = [...sizes];\n\n const leftMeta = panelMetas[leftIdx]?.props;\n const rightMeta = panelMetas[rightIdx]?.props;\n\n const leftMin = leftMeta?.min ?? 0;\n const leftMax = leftMeta?.max ?? 100;\n const rightMin = rightMeta?.min ?? 0;\n const rightMax = rightMeta?.max ?? 100;\n\n const totalAvail = next[leftIdx] + next[rightIdx];\n\n // Clamp newLeft trong khoảng [leftMin, leftMax] và đảm bảo right có đủ chỗ tối thiểu\n let newLeft = clamp(next[leftIdx] + delta, leftMin, Math.min(leftMax, totalAvail - rightMin));\n let newRight = totalAvail - newLeft;\n\n // Nếu right vượt quá rightMax, clamp right lại và tính lại left\n if (newRight > rightMax) {\n newRight = rightMax;\n newLeft = totalAvail - newRight;\n if (newLeft < leftMin || newLeft > leftMax) return sizes;\n }\n\n if (newRight < rightMin) return sizes;\n\n next[leftIdx] = newLeft;\n next[rightIdx] = newRight;\n return next;\n}\n\nexport const SplitterPanel: Component<PanelProps> = rawProps => {\n const registry = useContext(PanelRegistryContext);\n const id = createUniqueId();\n\n if (registry) {\n registry.register({ id, props: rawProps });\n onCleanup(function unregisterPanel() {\n registry.unregister(id);\n });\n }\n return null;\n};\n\ntype DraggerItemProps = {\n dIdx: number;\n getPanelList: () => PanelRegistration[];\n getCollapsed: () => boolean[];\n getDraggingIdx: () => number | null;\n orientation: () => SplitterOrientation;\n draggerIcon?: JSX.Element | (() => JSX.Element);\n showCollapsibleIcon: () => CollapsibleConfig;\n collapsibleIcon?: {\n collapse?: JSX.Element | (() => JSX.Element);\n expand?: JSX.Element | (() => JSX.Element);\n };\n collapsedControlled: () => boolean;\n class?: SplitterProps['class'];\n onMouseDown: (idx: number, e: MouseEvent) => void;\n onDblClick: (idx: number) => void;\n onCollapse: (panelIdx: number) => void;\n};\n\nconst DraggerItem: Component<DraggerItemProps> = p => {\n const dIdx = p.dIdx;\n\n const leftResizable = createMemo(() => p.getPanelList()[dIdx]?.props.resizable !== false);\n const rightResizable = createMemo(() => p.getPanelList()[dIdx + 1]?.props.resizable !== false);\n const canResize = createMemo(() => leftResizable() && rightResizable());\n const isDragging = createMemo(() => p.getDraggingIdx() === dIdx);\n\n const leftCollapsible = createMemo(() => p.getPanelList()[dIdx]?.props.collapsible ?? false);\n const rightCollapsible = createMemo(() => p.getPanelList()[dIdx + 1]?.props.collapsible ?? false);\n const hasCollapse = createMemo(() => leftCollapsible() || rightCollapsible());\n\n const isLeftCollapsed = createMemo(() => p.getCollapsed()[dIdx] ?? false);\n const isRightCollapsed = createMemo(() => p.getCollapsed()[dIdx + 1] ?? false);\n\n const iconAlwaysShow = createMemo(() => p.showCollapsibleIcon() === true);\n const isH = createMemo(() => p.orientation() === 'horizontal');\n\n const showBtnNext = createMemo(() => {\n if (p.collapsedControlled()) return false;\n const cfg = p.showCollapsibleIcon();\n if (cfg === false) return false;\n if (!hasCollapse()) return false;\n\n return rightCollapsible() || isLeftCollapsed();\n });\n\n const showBtnPrevFull = createMemo(() => {\n if (p.collapsedControlled()) return false;\n const cfg = p.showCollapsibleIcon();\n if (cfg === false) return false;\n if (!hasCollapse()) return false;\n return leftCollapsible() || isRightCollapsed();\n });\n\n return (\n <div\n class={cn('sp06', !canResize() && 'sp07', isDragging() && 'sp08', p.class?.dragger)}\n onMouseDown={e => p.onMouseDown(dIdx, e)}\n onDblClick={() => p.onDblClick(dIdx)}\n >\n <div class={cn('sp15', p.class?.draggerBar)}>\n {p.draggerIcon ? renderIcon(p.draggerIcon) : null}\n </div>\n\n <Show when={showBtnPrevFull()}>\n <button\n class={cn(\n 'sp10',\n 'sp11',\n iconAlwaysShow() && 'sp13',\n\n (isLeftCollapsed() || isRightCollapsed()) && 'sp14',\n p.class?.collapseBtn,\n )}\n title={isLeftCollapsed() || isRightCollapsed() ? 'Expand' : 'Collapse'}\n onClick={e => {\n e.stopPropagation();\n\n if (isRightCollapsed()) p.onCollapse(dIdx + 1);\n else p.onCollapse(dIdx);\n }}\n >\n {isLeftCollapsed()\n ? renderIcon(\n p.collapsibleIcon?.expand ?? (isH() ? <CollapseRight /> : <CollapseDown />),\n )\n : isRightCollapsed()\n ? renderIcon(p.collapsibleIcon?.expand ?? (isH() ? <CollapseLeft /> : <CollapseUp />))\n : renderIcon(\n p.collapsibleIcon?.collapse ?? (isH() ? <CollapseLeft /> : <CollapseUp />),\n )}\n </button>\n </Show>\n\n <Show when={showBtnNext()}>\n <button\n class={cn(\n 'sp10',\n 'sp12',\n iconAlwaysShow() && 'sp13',\n\n (isRightCollapsed() || isLeftCollapsed()) && 'sp14',\n p.class?.collapseBtn,\n )}\n title={isRightCollapsed() ? 'Collapse' : 'Expand'}\n onClick={e => {\n e.stopPropagation();\n\n if (isLeftCollapsed()) p.onCollapse(dIdx);\n else p.onCollapse(dIdx + 1);\n }}\n >\n {isRightCollapsed()\n ? renderIcon(p.collapsibleIcon?.expand ?? (isH() ? <CollapseLeft /> : <CollapseUp />))\n : isLeftCollapsed()\n ? renderIcon(\n p.collapsibleIcon?.expand ?? (isH() ? <CollapseRight /> : <CollapseDown />),\n )\n : renderIcon(\n p.collapsibleIcon?.collapse ?? (isH() ? <CollapseRight /> : <CollapseDown />),\n )}\n </button>\n </Show>\n </div>\n );\n};\n\nexport const Splitter: Component<SplitterProps> & { Panel: Component<PanelProps> } = rawProps => {\n const p = mergeProps(\n {\n orientation: 'horizontal' as SplitterOrientation,\n lazy: false,\n color: 'primary' as const,\n },\n rawProps,\n );\n\n const orientation = createMemo<SplitterOrientation>(() =>\n p.vertical ? 'vertical' : (p.orientation ?? 'horizontal'),\n );\n\n const [panelMetas, setPanelMetas] = createSignal<PanelRegistration[]>([]);\n\n const registry: PanelRegistryContextValue = {\n register(reg) {\n setPanelMetas(prev => {\n const idx = prev.findIndex(r => r.id === reg.id);\n if (idx >= 0) {\n const next = [...prev];\n next[idx] = reg;\n return next;\n }\n return [...prev, reg];\n });\n },\n unregister(id) {\n setPanelMetas(prev => prev.filter(r => r.id !== id));\n },\n };\n\n const resolvedChildren = children(() => (\n <PanelRegistryContext.Provider value={registry}>{p.children}</PanelRegistryContext.Provider>\n ));\n\n function initSizes(metas: PanelRegistration[]): number[] {\n const n = metas.length;\n if (n === 0) return [];\n if (p.size && p.size.length === n) return [...p.size];\n\n const raw = metas.map(m => m.props.size ?? m.props.defaultSize);\n const hasAll = raw.every(v => v !== undefined);\n if (hasAll) {\n const total = raw.reduce((s, v) => s + v!, 0);\n return raw.map(v => (v! / total) * 100);\n }\n\n const definedTotal = (raw.filter(v => v !== undefined) as number[]).reduce((s, v) => s + v, 0);\n const undefinedCount = raw.filter(v => v === undefined).length;\n const eachUndefined = undefinedCount > 0 ? Math.max(0, 100 - definedTotal) / undefinedCount : 0;\n return raw.map(v => (v !== undefined ? v : eachUndefined));\n }\n\n const isCollapsedControlled = createMemo(() => Array.isArray(p.collapsed));\n\n const [sizes, setSizes] = createSignal<number[]>([]);\n const [collapsedInternal, setCollapsedInternal] = createSignal<boolean[]>([]);\n const [draggingIdx, setDraggingIdx] = createSignal<number | null>(null);\n\n const collapsed = createMemo(() =>\n isCollapsedControlled() ? (p.collapsed as boolean[]) : collapsedInternal(),\n );\n const setCollapsed = (next: boolean[]) => {\n if (!isCollapsedControlled()) setCollapsedInternal(next);\n };\n\n const [lazyGhostPos, setLazyGhostPos] = createSignal<number | null>(null);\n\n createEffect(\n on(panelMetas, metas => {\n if (metas.length === 0) return;\n setSizes(initSizes(metas));\n setCollapsedInternal(metas.map(() => false));\n }),\n );\n\n createEffect(\n on(\n () => p.size,\n controlled => {\n if (!controlled) return;\n if (controlled.length === panelMetas().length) setSizes([...controlled]);\n },\n ),\n );\n\n let containerRef: HTMLDivElement | undefined;\n let cachedContainerSize = 0;\n\n createEffect(function observeContainerSize() {\n if (!containerRef) return;\n const isH = orientation() === 'horizontal';\n const observer = new ResizeObserver(entries => {\n const entry = entries[0];\n if (!entry) return;\n cachedContainerSize = isH ? entry.contentRect.width : entry.contentRect.height;\n });\n observer.observe(containerRef);\n onCleanup(function disconnectContainerObserver() {\n observer.disconnect();\n });\n });\n\n function getContainerSize(): number {\n return cachedContainerSize;\n }\n\n // Trả về sizes đã normalize: tổng 100% chỉ tính trên panel visible\n function getNormalizedSizes(): number[] {\n const col = collapsed();\n const raw = sizes();\n const visibleTotal = raw.reduce((sum, s, i) => sum + (col[i] ? 0 : s), 0);\n if (visibleTotal === 0) return raw.map(() => 0);\n return raw.map((s, i) => (col[i] ? s : (s / visibleTotal) * 100));\n }\n\n let dragStartPos = 0;\n let dragStartSizes: number[] = [];\n let dragStartCollapsed: boolean[] = [];\n\n function onDraggerMouseDown(idx: number, e: MouseEvent) {\n const metas = panelMetas();\n if (metas[idx]?.props.resizable === false) return;\n if (metas[idx + 1]?.props.resizable === false) return;\n\n e.preventDefault();\n setDraggingIdx(idx);\n dragStartPos = orientation() === 'horizontal' ? e.clientX : e.clientY;\n dragStartSizes = getNormalizedSizes();\n dragStartCollapsed = [...collapsed()];\n p.onResizeStart?.({ sizes: dragStartSizes, index: idx });\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n }\n\n function applyNewSizes(newSizes: number[], idx: number) {\n const col = [...collapsed()];\n let changed = false;\n if (col[idx] && newSizes[idx] > 0) {\n col[idx] = false;\n changed = true;\n }\n if (col[idx + 1] && newSizes[idx + 1] > 0) {\n col[idx + 1] = false;\n changed = true;\n }\n if (changed) setCollapsed(col);\n setSizes(newSizes);\n }\n\n function onMouseMove(e: MouseEvent) {\n const idx = draggingIdx();\n if (idx === null) return;\n\n const pos = orientation() === 'horizontal' ? e.clientX : e.clientY;\n const containerSize = getContainerSize();\n if (containerSize === 0) return;\n\n const deltaPct = ((pos - dragStartPos) / containerSize) * 100;\n const newSizes = redistributeSizes(dragStartSizes, idx, deltaPct, panelMetas(), dragStartCollapsed);\n\n if (p.lazy) {\n const leftSumPct = newSizes.slice(0, idx + 1).reduce((s, v) => s + v, 0);\n setLazyGhostPos((leftSumPct / 100) * containerSize);\n } else {\n applyNewSizes(newSizes, idx);\n p.onResize?.({ sizes: newSizes, index: idx });\n }\n }\n\n function onMouseUp(e: MouseEvent) {\n const idx = draggingIdx();\n if (idx === null) return;\n\n if (p.lazy) {\n const pos = orientation() === 'horizontal' ? e.clientX : e.clientY;\n const containerSize = getContainerSize();\n if (containerSize > 0) {\n const deltaPct = ((pos - dragStartPos) / containerSize) * 100;\n const newSizes = redistributeSizes(dragStartSizes, idx, deltaPct, panelMetas(), dragStartCollapsed);\n applyNewSizes(newSizes, idx);\n p.onResize?.({ sizes: newSizes, index: idx });\n p.onResizeEnd?.({ sizes: newSizes, index: idx });\n }\n setLazyGhostPos(null);\n } else {\n p.onResizeEnd?.({ sizes: sizes(), index: idx });\n }\n\n setDraggingIdx(null);\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n }\n\n onCleanup(function removeDragListeners() {\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n });\n\n function collapsePanel(panelIdx: number) {\n const metas = panelMetas();\n if (!metas[panelIdx]?.props.collapsible) return;\n\n const currentCollapsed = collapsed();\n const newCollapsed = [...currentCollapsed];\n\n if (currentCollapsed[panelIdx]) {\n // Expand: chỉ bỏ collapsed flag — render tự normalize sizes\n newCollapsed[panelIdx] = false;\n setCollapsed(newCollapsed);\n p.onCollapse?.({ sizes: sizes(), collapsed: newCollapsed, index: panelIdx });\n } else {\n // Collapse: chỉ đánh dấu collapsed — render tự normalize sizes\n newCollapsed[panelIdx] = true;\n setCollapsed(newCollapsed);\n p.onCollapse?.({ sizes: sizes(), collapsed: newCollapsed, index: panelIdx });\n }\n }\n\n const ghostStyle = createMemo<JSX.CSSProperties>(() => {\n const pos = lazyGhostPos();\n\n if (pos === null) return { display: 'none' };\n return orientation() === 'horizontal'\n ? { display: 'block', left: `${pos}px` }\n : { display: 'block', top: `${pos}px` };\n });\n\n return (\n <SplitterContext.Provider value={{ orientation: orientation() }}>\n <div class=\"hidden\">{resolvedChildren()}</div>\n\n <div\n ref={containerRef}\n class={cn(\n 'sp01',\n orientation() === 'vertical' ? 'sp02' : 'sp03',\n getColor(p.color),\n p.class?.root,\n )}\n >\n <For each={panelMetas()}>\n {(meta, idx) => {\n const isCollapsed = createMemo(() => collapsed()[idx()] ?? false);\n\n // Tính normalized size: chia đều 100% cho các panel visible\n const panelStyle = createMemo<JSX.CSSProperties>(() => {\n if (isCollapsed()) return { display: 'none' };\n\n const col = collapsed();\n const rawSizes = sizes();\n\n // Tính tổng size của các panel visible\n const visibleTotal = rawSizes.reduce(\n (sum, s, i) => sum + (col[i] ? 0 : s),\n 0,\n );\n\n const s = rawSizes[idx()] ?? 0;\n const normalized = visibleTotal > 0 ? (s / visibleTotal) * 100 : 0;\n\n return orientation() === 'horizontal'\n ? { 'flex-basis': `${normalized}%`, 'min-width': `${meta.props.min ?? 0}%` }\n : { 'flex-basis': `${normalized}%`, 'min-height': `${meta.props.min ?? 0}%` };\n });\n\n // Dragger sau panel idx() — ẩn chỉ khi cả hai phía đều không có panel visible.\n // Trong controlled mode: ẩn dragger nếu một trong hai panel kề trực tiếp bị ẩn,\n // vì nút collapse/expand đã bị tắt và thanh chỉ còn dùng để resize (vô nghĩa khi\n // một bên không hiển thị).\n const showDragger = createMemo(() => {\n if (idx() >= panelMetas().length - 1) return false;\n const col = collapsed();\n\n if (isCollapsedControlled()) {\n return !col[idx()] && !(col[idx() + 1] ?? false);\n }\n\n // Tìm panel visible gần nhất bên trái (bao gồm idx())\n let hasVisibleLeft = false;\n for (let i = idx(); i >= 0; i--) {\n if (!col[i]) { hasVisibleLeft = true; break; }\n }\n // Tìm panel visible gần nhất bên phải (idx()+1 trở đi)\n let hasVisibleRight = false;\n for (let i = idx() + 1; i < panelMetas().length; i++) {\n if (!col[i]) { hasVisibleRight = true; break; }\n }\n return hasVisibleLeft || hasVisibleRight;\n });\n\n return (\n <>\n <div\n class={cn('sp04', isCollapsed() && 'sp05', meta.props.class, p.class?.panel)}\n style={panelStyle()}\n data-panel-id={meta.id}\n >\n {meta.props.children}\n </div>\n\n <Show when={showDragger()}>\n <DraggerItem\n dIdx={idx()}\n getPanelList={panelMetas}\n getCollapsed={collapsed}\n getDraggingIdx={draggingIdx}\n orientation={orientation}\n draggerIcon={p.draggerIcon}\n showCollapsibleIcon={() => p.showCollapsibleIcon ?? 'auto'}\n collapsibleIcon={p.collapsibleIcon}\n collapsedControlled={isCollapsedControlled}\n class={p.class}\n onMouseDown={onDraggerMouseDown}\n onDblClick={dIdx => p.onDraggerDoubleClick?.(dIdx, sizes())}\n onCollapse={collapsePanel}\n />\n </Show>\n </>\n );\n }}\n </For>\n\n <Show when={p.lazy}>\n <div class=\"sp09\" style={ghostStyle()} />\n </Show>\n </div>\n </SplitterContext.Provider>\n );\n};\n\nSplitter.Panel = SplitterPanel;\n"],"mappings":"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"}
1
+ {"version":3,"file":"splitter.js","names":["cn","getColor","children","Component","createContext","createEffect","createMemo","createSignal","createUniqueId","For","JSX","mergeProps","on","onCleanup","Show","useContext","CollapsibleConfig","PanelProps","SplitterContextValue","SplitterOrientation","SplitterProps","SplitterContext","orientation","PanelRegistration","id","props","PanelRegistryContextValue","register","reg","unregister","PanelRegistryContext","renderIcon","icon","Element","CollapseLeft","_tmpl$","CollapseRight","_tmpl$2","CollapseUp","_tmpl$3","CollapseDown","_tmpl$4","clamp","v","min","max","Math","redistributeSizes","sizes","draggerIdx","delta","panelMetas","collapsed","leftIdx","rightIdx","length","next","leftMeta","rightMeta","leftMin","leftMax","rightMin","rightMax","totalAvail","newLeft","newRight","SplitterPanel","rawProps","registry","unregisterPanel","DraggerItemProps","dIdx","getPanelList","getCollapsed","getDraggingIdx","draggerIcon","showCollapsibleIcon","collapsibleIcon","collapse","expand","collapsedControlled","class","onMouseDown","idx","e","MouseEvent","onDblClick","onCollapse","panelIdx","DraggerItem","p","leftResizable","resizable","rightResizable","canResize","isDragging","leftCollapsible","collapsible","rightCollapsible","hasCollapse","isLeftCollapsed","isRightCollapsed","iconAlwaysShow","isH","showBtnNext","cfg","showBtnPrevFull","_el$5","_tmpl$6","_el$6","firstChild","$$dblclick","$$mousedown","_$insert","_c$","_$memo","_$createComponent","when","_el$7","_tmpl$5","$$click","stopPropagation","_c$2","_$effect","_p$","_v$","collapseBtn","_v$2","_$className","t","_$setAttribute","undefined","_el$8","_c$3","_v$3","_v$4","_v$5","dragger","_v$6","draggerBar","Splitter","Panel","lazy","color","const","vertical","setPanelMetas","prev","findIndex","r","filter","resolvedChildren","Provider","value","initSizes","metas","n","size","raw","map","m","defaultSize","hasAll","every","total","reduce","s","definedTotal","undefinedCount","eachUndefined","isCollapsedControlled","Array","isArray","setSizes","collapsedInternal","setCollapsedInternal","draggingIdx","setDraggingIdx","setCollapsed","lazyGhostPos","setLazyGhostPos","controlled","containerRef","HTMLDivElement","cachedContainerSize","observeContainerSize","observer","ResizeObserver","entries","entry","contentRect","width","height","observe","disconnectContainerObserver","disconnect","getContainerSize","getNormalizedSizes","col","visibleTotal","sum","i","dragStartPos","dragStartSizes","dragStartCollapsed","onDraggerMouseDown","preventDefault","clientX","clientY","onResizeStart","index","document","addEventListener","onMouseMove","onMouseUp","applyNewSizes","newSizes","changed","pos","containerSize","deltaPct","leftSumPct","slice","onResize","onResizeEnd","removeEventListener","removeDragListeners","collapsePanel","currentCollapsed","newCollapsed","ghostStyle","CSSProperties","display","left","top","_el$9","_tmpl$7","_el$0","_tmpl$9","_ref$","_$use","each","meta","isCollapsed","panelStyle","rawSizes","normalized","showDragger","hasVisibleLeft","hasVisibleRight","_el$10","_v$7","panel","_v$8","_v$9","_$style","a","onDraggerDoubleClick","_el$1","_tmpl$8","_$p","root","_$delegateEvents"],"sources":["../../../src/components/splitter/splitter.tsx"],"sourcesContent":["import { cn } from '@/utils/cn';\nimport { getColor } from '@utils/helper';\nimport {\n children,\n Component,\n createContext,\n createEffect,\n createMemo,\n createSignal,\n createUniqueId,\n For,\n JSX,\n mergeProps,\n on,\n onCleanup,\n Show,\n useContext,\n} from 'solid-js';\nimport type {\n CollapsibleConfig,\n PanelProps,\n SplitterContextValue,\n SplitterOrientation,\n SplitterProps,\n} from './splitter.types';\n\nconst SplitterContext = createContext<SplitterContextValue>({ orientation: 'horizontal' });\n\ntype PanelRegistration = {\n id: string;\n props: PanelProps;\n};\n\ntype PanelRegistryContextValue = {\n register: (reg: PanelRegistration) => void;\n unregister: (id: string) => void;\n};\n\nconst PanelRegistryContext = createContext<PanelRegistryContextValue | null>(null);\n\nfunction renderIcon(icon: JSX.Element | (() => JSX.Element) | undefined): JSX.Element {\n if (typeof icon === 'function') return (icon as () => JSX.Element)();\n return icon as JSX.Element;\n}\n\nconst CollapseLeft = () => (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"currentColor\">\n <path d=\"M6 2L3 5l3 3V2z\" />\n </svg>\n);\n\nconst CollapseRight = () => (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"currentColor\">\n <path d=\"M4 2l3 3-3 3V2z\" />\n </svg>\n);\n\nconst CollapseUp = () => (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"currentColor\">\n <path d=\"M2 6l3-3 3 3H2z\" />\n </svg>\n);\n\nconst CollapseDown = () => (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"currentColor\">\n <path d=\"M2 4l3 3 3-3H2z\" />\n </svg>\n);\n\nfunction clamp(v: number, min: number, max: number) {\n return Math.min(Math.max(v, min), max);\n}\n\nfunction redistributeSizes(\n sizes: number[],\n draggerIdx: number,\n delta: number,\n panelMetas: PanelRegistration[],\n collapsed: boolean[],\n): number[] {\n // Tìm panel visible thực sự ở hai phía của dragger.\n // Bỏ qua các panel đang collapsed vì chúng bị CSS force về 0 và không\n // đóng góp vào tổng width thực tế — redistribute vào chúng sẽ tạo gap.\n let leftIdx = draggerIdx;\n while (leftIdx >= 0 && collapsed[leftIdx]) leftIdx--;\n\n let rightIdx = draggerIdx + 1;\n while (rightIdx < sizes.length && collapsed[rightIdx]) rightIdx++;\n\n if (leftIdx < 0 || rightIdx >= sizes.length) return sizes;\n\n const next = [...sizes];\n\n const leftMeta = panelMetas[leftIdx]?.props;\n const rightMeta = panelMetas[rightIdx]?.props;\n\n const leftMin = leftMeta?.min ?? 0;\n const leftMax = leftMeta?.max ?? 100;\n const rightMin = rightMeta?.min ?? 0;\n const rightMax = rightMeta?.max ?? 100;\n\n const totalAvail = next[leftIdx] + next[rightIdx];\n\n // Clamp newLeft trong khoảng [leftMin, leftMax] và đảm bảo right có đủ chỗ tối thiểu\n let newLeft = clamp(next[leftIdx] + delta, leftMin, Math.min(leftMax, totalAvail - rightMin));\n let newRight = totalAvail - newLeft;\n\n // Nếu right vượt quá rightMax, clamp right lại và tính lại left\n if (newRight > rightMax) {\n newRight = rightMax;\n newLeft = totalAvail - newRight;\n if (newLeft < leftMin || newLeft > leftMax) return sizes;\n }\n\n if (newRight < rightMin) return sizes;\n\n next[leftIdx] = newLeft;\n next[rightIdx] = newRight;\n return next;\n}\n\nexport const SplitterPanel: Component<PanelProps> = rawProps => {\n const registry = useContext(PanelRegistryContext);\n const id = createUniqueId();\n\n if (registry) {\n registry.register({ id, props: rawProps });\n onCleanup(function unregisterPanel() {\n registry.unregister(id);\n });\n }\n return null;\n};\n\ntype DraggerItemProps = {\n dIdx: number;\n getPanelList: () => PanelRegistration[];\n getCollapsed: () => boolean[];\n getDraggingIdx: () => number | null;\n orientation: () => SplitterOrientation;\n draggerIcon?: JSX.Element | (() => JSX.Element);\n showCollapsibleIcon: () => CollapsibleConfig;\n collapsibleIcon?: {\n collapse?: JSX.Element | (() => JSX.Element);\n expand?: JSX.Element | (() => JSX.Element);\n };\n collapsedControlled: () => boolean;\n class?: SplitterProps['class'];\n onMouseDown: (idx: number, e: MouseEvent) => void;\n onDblClick: (idx: number) => void;\n onCollapse: (panelIdx: number) => void;\n};\n\nconst DraggerItem: Component<DraggerItemProps> = p => {\n const dIdx = p.dIdx;\n\n const leftResizable = createMemo(() => p.getPanelList()[dIdx]?.props.resizable !== false);\n const rightResizable = createMemo(() => p.getPanelList()[dIdx + 1]?.props.resizable !== false);\n const canResize = createMemo(() => leftResizable() && rightResizable());\n const isDragging = createMemo(() => p.getDraggingIdx() === dIdx);\n\n const leftCollapsible = createMemo(() => p.getPanelList()[dIdx]?.props.collapsible ?? false);\n const rightCollapsible = createMemo(() => p.getPanelList()[dIdx + 1]?.props.collapsible ?? false);\n const hasCollapse = createMemo(() => leftCollapsible() || rightCollapsible());\n\n const isLeftCollapsed = createMemo(() => p.getCollapsed()[dIdx] ?? false);\n const isRightCollapsed = createMemo(() => p.getCollapsed()[dIdx + 1] ?? false);\n\n const iconAlwaysShow = createMemo(() => p.showCollapsibleIcon() === true);\n const isH = createMemo(() => p.orientation() === 'horizontal');\n\n const showBtnNext = createMemo(() => {\n if (p.collapsedControlled()) return false;\n const cfg = p.showCollapsibleIcon();\n if (cfg === false) return false;\n if (!hasCollapse()) return false;\n\n return rightCollapsible() || isLeftCollapsed();\n });\n\n const showBtnPrevFull = createMemo(() => {\n if (p.collapsedControlled()) return false;\n const cfg = p.showCollapsibleIcon();\n if (cfg === false) return false;\n if (!hasCollapse()) return false;\n return leftCollapsible() || isRightCollapsed();\n });\n\n return (\n <div\n class={cn('sp06', !canResize() && 'sp07', isDragging() && 'sp08', p.class?.dragger)}\n onMouseDown={e => p.onMouseDown(dIdx, e)}\n onDblClick={() => p.onDblClick(dIdx)}\n >\n <div class={cn('sp15', p.class?.draggerBar)}>\n {p.draggerIcon ? renderIcon(p.draggerIcon) : null}\n </div>\n\n <Show when={showBtnPrevFull()}>\n <button\n class={cn(\n 'sp10',\n 'sp11',\n iconAlwaysShow() && 'sp13',\n\n (isLeftCollapsed() || isRightCollapsed()) && 'sp14',\n p.class?.collapseBtn,\n )}\n title={isLeftCollapsed() || isRightCollapsed() ? 'Expand' : 'Collapse'}\n onClick={e => {\n e.stopPropagation();\n\n if (isRightCollapsed()) p.onCollapse(dIdx + 1);\n else p.onCollapse(dIdx);\n }}\n >\n {isLeftCollapsed()\n ? renderIcon(\n p.collapsibleIcon?.expand ?? (isH() ? <CollapseRight /> : <CollapseDown />),\n )\n : isRightCollapsed()\n ? renderIcon(p.collapsibleIcon?.expand ?? (isH() ? <CollapseLeft /> : <CollapseUp />))\n : renderIcon(\n p.collapsibleIcon?.collapse ?? (isH() ? <CollapseLeft /> : <CollapseUp />),\n )}\n </button>\n </Show>\n\n <Show when={showBtnNext()}>\n <button\n class={cn(\n 'sp10',\n 'sp12',\n iconAlwaysShow() && 'sp13',\n\n (isRightCollapsed() || isLeftCollapsed()) && 'sp14',\n p.class?.collapseBtn,\n )}\n title={isRightCollapsed() ? 'Collapse' : 'Expand'}\n onClick={e => {\n e.stopPropagation();\n\n if (isLeftCollapsed()) p.onCollapse(dIdx);\n else p.onCollapse(dIdx + 1);\n }}\n >\n {isRightCollapsed()\n ? renderIcon(p.collapsibleIcon?.expand ?? (isH() ? <CollapseLeft /> : <CollapseUp />))\n : isLeftCollapsed()\n ? renderIcon(\n p.collapsibleIcon?.expand ?? (isH() ? <CollapseRight /> : <CollapseDown />),\n )\n : renderIcon(\n p.collapsibleIcon?.collapse ?? (isH() ? <CollapseRight /> : <CollapseDown />),\n )}\n </button>\n </Show>\n </div>\n );\n};\n\nexport const Splitter: Component<SplitterProps> & { Panel: Component<PanelProps> } = rawProps => {\n const p = mergeProps(\n {\n orientation: 'horizontal' as SplitterOrientation,\n lazy: false,\n color: 'primary' as const,\n },\n rawProps,\n );\n\n const orientation = createMemo<SplitterOrientation>(() =>\n p.vertical ? 'vertical' : (p.orientation ?? 'horizontal'),\n );\n\n const [panelMetas, setPanelMetas] = createSignal<PanelRegistration[]>([]);\n\n const registry: PanelRegistryContextValue = {\n register(reg) {\n setPanelMetas(prev => {\n const idx = prev.findIndex(r => r.id === reg.id);\n if (idx >= 0) {\n const next = [...prev];\n next[idx] = reg;\n return next;\n }\n return [...prev, reg];\n });\n },\n unregister(id) {\n setPanelMetas(prev => prev.filter(r => r.id !== id));\n },\n };\n\n const resolvedChildren = children(() => (\n <PanelRegistryContext.Provider value={registry}>{p.children}</PanelRegistryContext.Provider>\n ));\n\n function initSizes(metas: PanelRegistration[]): number[] {\n const n = metas.length;\n if (n === 0) return [];\n if (p.size && p.size.length === n) return [...p.size];\n\n const raw = metas.map(m => m.props.size ?? m.props.defaultSize);\n const hasAll = raw.every(v => v !== undefined);\n if (hasAll) {\n const total = raw.reduce((s, v) => s + v!, 0);\n return raw.map(v => (v! / total) * 100);\n }\n\n const definedTotal = (raw.filter(v => v !== undefined) as number[]).reduce((s, v) => s + v, 0);\n const undefinedCount = raw.filter(v => v === undefined).length;\n const eachUndefined = undefinedCount > 0 ? Math.max(0, 100 - definedTotal) / undefinedCount : 0;\n return raw.map(v => (v !== undefined ? v : eachUndefined));\n }\n\n const isCollapsedControlled = createMemo(() => Array.isArray(p.collapsed));\n\n const [sizes, setSizes] = createSignal<number[]>([]);\n const [collapsedInternal, setCollapsedInternal] = createSignal<boolean[]>([]);\n const [draggingIdx, setDraggingIdx] = createSignal<number | null>(null);\n\n const collapsed = createMemo(() =>\n isCollapsedControlled() ? (p.collapsed as boolean[]) : collapsedInternal(),\n );\n const setCollapsed = (next: boolean[]) => {\n if (!isCollapsedControlled()) setCollapsedInternal(next);\n };\n\n const [lazyGhostPos, setLazyGhostPos] = createSignal<number | null>(null);\n\n createEffect(\n on(panelMetas, metas => {\n if (metas.length === 0) return;\n setSizes(initSizes(metas));\n setCollapsedInternal(metas.map(() => false));\n }),\n );\n\n createEffect(\n on(\n () => p.size,\n controlled => {\n if (!controlled) return;\n if (controlled.length === panelMetas().length) setSizes([...controlled]);\n },\n ),\n );\n\n let containerRef: HTMLDivElement | undefined;\n let cachedContainerSize = 0;\n\n createEffect(function observeContainerSize() {\n if (!containerRef) return;\n const isH = orientation() === 'horizontal';\n const observer = new ResizeObserver(entries => {\n const entry = entries[0];\n if (!entry) return;\n cachedContainerSize = isH ? entry.contentRect.width : entry.contentRect.height;\n });\n observer.observe(containerRef);\n onCleanup(function disconnectContainerObserver() {\n observer.disconnect();\n });\n });\n\n function getContainerSize(): number {\n return cachedContainerSize;\n }\n\n // Trả về sizes đã normalize: tổng 100% chỉ tính trên panel visible\n function getNormalizedSizes(): number[] {\n const col = collapsed();\n const raw = sizes();\n const visibleTotal = raw.reduce((sum, s, i) => sum + (col[i] ? 0 : s), 0);\n if (visibleTotal === 0) return raw.map(() => 0);\n return raw.map((s, i) => (col[i] ? s : (s / visibleTotal) * 100));\n }\n\n let dragStartPos = 0;\n let dragStartSizes: number[] = [];\n let dragStartCollapsed: boolean[] = [];\n\n function onDraggerMouseDown(idx: number, e: MouseEvent) {\n const metas = panelMetas();\n if (metas[idx]?.props.resizable === false) return;\n if (metas[idx + 1]?.props.resizable === false) return;\n\n e.preventDefault();\n setDraggingIdx(idx);\n dragStartPos = orientation() === 'horizontal' ? e.clientX : e.clientY;\n dragStartSizes = getNormalizedSizes();\n dragStartCollapsed = [...collapsed()];\n p.onResizeStart?.({ sizes: dragStartSizes, index: idx });\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n }\n\n function applyNewSizes(newSizes: number[], idx: number) {\n const col = [...collapsed()];\n let changed = false;\n if (col[idx] && newSizes[idx] > 0) {\n col[idx] = false;\n changed = true;\n }\n if (col[idx + 1] && newSizes[idx + 1] > 0) {\n col[idx + 1] = false;\n changed = true;\n }\n if (changed) setCollapsed(col);\n setSizes(newSizes);\n }\n\n function onMouseMove(e: MouseEvent) {\n const idx = draggingIdx();\n if (idx === null) return;\n\n const pos = orientation() === 'horizontal' ? e.clientX : e.clientY;\n const containerSize = getContainerSize();\n if (containerSize === 0) return;\n\n const deltaPct = ((pos - dragStartPos) / containerSize) * 100;\n const newSizes = redistributeSizes(\n dragStartSizes,\n idx,\n deltaPct,\n panelMetas(),\n dragStartCollapsed,\n );\n\n if (p.lazy) {\n const leftSumPct = newSizes.slice(0, idx + 1).reduce((s, v) => s + v, 0);\n setLazyGhostPos((leftSumPct / 100) * containerSize);\n } else {\n applyNewSizes(newSizes, idx);\n p.onResize?.({ sizes: newSizes, index: idx });\n }\n }\n\n function onMouseUp(e: MouseEvent) {\n const idx = draggingIdx();\n if (idx === null) return;\n\n if (p.lazy) {\n const pos = orientation() === 'horizontal' ? e.clientX : e.clientY;\n const containerSize = getContainerSize();\n if (containerSize > 0) {\n const deltaPct = ((pos - dragStartPos) / containerSize) * 100;\n const newSizes = redistributeSizes(\n dragStartSizes,\n idx,\n deltaPct,\n panelMetas(),\n dragStartCollapsed,\n );\n applyNewSizes(newSizes, idx);\n p.onResize?.({ sizes: newSizes, index: idx });\n p.onResizeEnd?.({ sizes: newSizes, index: idx });\n }\n setLazyGhostPos(null);\n } else {\n p.onResizeEnd?.({ sizes: sizes(), index: idx });\n }\n\n setDraggingIdx(null);\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n }\n\n onCleanup(function removeDragListeners() {\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n });\n\n function collapsePanel(panelIdx: number) {\n const metas = panelMetas();\n if (!metas[panelIdx]?.props.collapsible) return;\n\n const currentCollapsed = collapsed();\n const newCollapsed = [...currentCollapsed];\n\n if (currentCollapsed[panelIdx]) {\n // Expand: chỉ bỏ collapsed flag — render tự normalize sizes\n newCollapsed[panelIdx] = false;\n setCollapsed(newCollapsed);\n p.onCollapse?.({ sizes: sizes(), collapsed: newCollapsed, index: panelIdx });\n } else {\n // Collapse: chỉ đánh dấu collapsed — render tự normalize sizes\n newCollapsed[panelIdx] = true;\n setCollapsed(newCollapsed);\n p.onCollapse?.({ sizes: sizes(), collapsed: newCollapsed, index: panelIdx });\n }\n }\n\n const ghostStyle = createMemo<JSX.CSSProperties>(() => {\n const pos = lazyGhostPos();\n\n if (pos === null) return { display: 'none' };\n return orientation() === 'horizontal'\n ? { display: 'block', left: `${pos}px` }\n : { display: 'block', top: `${pos}px` };\n });\n\n return (\n <SplitterContext.Provider value={{ orientation: orientation() }}>\n <div class=\"hidden\">{resolvedChildren()}</div>\n\n <div\n ref={containerRef}\n class={cn(\n 'sp01',\n orientation() === 'vertical' ? 'sp02' : 'sp03',\n getColor(p.color),\n p.class?.root,\n )}\n >\n <For each={panelMetas()}>\n {(meta, idx) => {\n const isCollapsed = createMemo(() => collapsed()[idx()] ?? false);\n\n // Tính normalized size: chia đều 100% cho các panel visible\n const panelStyle = createMemo<JSX.CSSProperties>(() => {\n if (isCollapsed()) return { display: 'none' };\n\n const col = collapsed();\n const rawSizes = sizes();\n\n // Tính tổng size của các panel visible\n const visibleTotal = rawSizes.reduce((sum, s, i) => sum + (col[i] ? 0 : s), 0);\n\n const s = rawSizes[idx()] ?? 0;\n const normalized = visibleTotal > 0 ? (s / visibleTotal) * 100 : 0;\n\n return orientation() === 'horizontal'\n ? { 'flex-basis': `${normalized}%`, 'min-width': `${meta.props.min ?? 0}%` }\n : { 'flex-basis': `${normalized}%`, 'min-height': `${meta.props.min ?? 0}%` };\n });\n\n // Dragger sau panel idx() — ẩn chỉ khi cả hai phía đều không có panel visible.\n // Trong controlled mode: ẩn dragger nếu một trong hai panel kề trực tiếp bị ẩn,\n // vì nút collapse/expand đã bị tắt và thanh chỉ còn dùng để resize (vô nghĩa khi\n // một bên không hiển thị).\n const showDragger = createMemo(() => {\n if (idx() >= panelMetas().length - 1) return false;\n const col = collapsed();\n\n if (isCollapsedControlled()) {\n return !col[idx()] && !(col[idx() + 1] ?? false);\n }\n\n // Tìm panel visible gần nhất bên trái (bao gồm idx())\n let hasVisibleLeft = false;\n for (let i = idx(); i >= 0; i--) {\n if (!col[i]) {\n hasVisibleLeft = true;\n break;\n }\n }\n // Tìm panel visible gần nhất bên phải (idx()+1 trở đi)\n let hasVisibleRight = false;\n for (let i = idx() + 1; i < panelMetas().length; i++) {\n if (!col[i]) {\n hasVisibleRight = true;\n break;\n }\n }\n return hasVisibleLeft || hasVisibleRight;\n });\n\n return (\n <>\n <div\n class={cn('sp04', isCollapsed() && 'sp05', meta.props.class, p.class?.panel)}\n style={panelStyle()}\n data-panel-id={meta.id}\n >\n {meta.props.children}\n </div>\n\n <Show when={showDragger()}>\n <DraggerItem\n dIdx={idx()}\n getPanelList={panelMetas}\n getCollapsed={collapsed}\n getDraggingIdx={draggingIdx}\n orientation={orientation}\n draggerIcon={p.draggerIcon}\n showCollapsibleIcon={() => p.showCollapsibleIcon ?? 'auto'}\n collapsibleIcon={p.collapsibleIcon}\n collapsedControlled={isCollapsedControlled}\n class={p.class}\n onMouseDown={onDraggerMouseDown}\n onDblClick={dIdx => p.onDraggerDoubleClick?.(dIdx, sizes())}\n onCollapse={collapsePanel}\n />\n </Show>\n </>\n );\n }}\n </For>\n\n <Show when={p.lazy}>\n <div class=\"sp09\" style={ghostStyle()} />\n </Show>\n </div>\n </SplitterContext.Provider>\n );\n};\n\nSplitter.Panel = SplitterPanel;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../../../src/components/timeline/timeline.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,SAAS,EAAsD,MAAM,UAAU,CAAC;AACzF,OAAO,EAAoC,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAmGnF,eAAO,MAAM,QAAQ,EAAE,SAAS,CAAC,aAAa,CA8G7C,CAAC"}
1
+ {"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../../../src/components/timeline/timeline.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,SAAS,EAAsD,MAAM,UAAU,CAAC;AACzF,OAAO,EAAoC,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAgGnF,eAAO,MAAM,QAAQ,EAAE,SAAS,CAAC,aAAa,CA4G7C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"timeline.js","names":["BaseColorProps","cn","getColor","AlertCircle","Check","Clock","Component","createMemo","For","JSX","mergeProps","Show","splitProps","TimelineItem","TimelineItemStatus","TimelineProps","STATUS_COLOR","Record","pending","active","done","error","resolveItemColor","item","globalColor","color","status","DotProps","colorClass","class","TimelineDot","p","_el$","_tmpl$3","_$insert","_$createComponent","when","loading","children","_tmpl$","_$memo","icon","_el$3","_tmpl$2","size","_$effect","_$className","ContentProps","TimelineContent","_el$4","timestamp","_el$5","title","_el$6","content","_el$7","description","resolvePosition","mode","itemPosition","index","Timeline","props","merged","items","orientation","const","reverse","nativeProps","isVertical","displayItems","globalColorClass","_el$8","_$spread","_$mergeProps","root","each","i","pos","position","itemColorClass","isLast","length","_el$9","_el$0","label","_el$1","_tmpl$4","dot","_el$10","connector","_el$11","_el$12","_el$13","_tmpl$5","_el$14","firstChild","_el$15","nextSibling","_p$","_v$","_v$2","e","t","undefined","_el$16"],"sources":["../../../src/components/timeline/timeline.tsx"],"sourcesContent":["import { BaseColorProps } from '@/type';\nimport { cn } from '@/utils/cn';\nimport { getColor } from '@/utils/helper';\nimport AlertCircle from 'lucide-solid/icons/alert-circle';\nimport Check from 'lucide-solid/icons/check';\nimport Clock from 'lucide-solid/icons/clock';\nimport { Component, createMemo, For, JSX, mergeProps, Show, splitProps } from 'solid-js';\nimport { TimelineItem, TimelineItemStatus, TimelineProps } from './timeline.types';\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\n/** Map status → màu DaisyUI mặc định (dùng khi item không có `color` prop) */\nconst STATUS_COLOR: Record<TimelineItemStatus, BaseColorProps> = {\n pending: 'neutral',\n active: 'primary',\n done: 'success',\n error: 'error',\n};\n\n/** Resolve màu cuối cùng của item: ưu tiên item.color > status-mapped > global */\nconst resolveItemColor = (\n item: TimelineItem,\n globalColor: BaseColorProps,\n): BaseColorProps => {\n if (item.color) return item.color;\n if (item.status) return STATUS_COLOR[item.status];\n return globalColor;\n};\n\n// ─── TimelineDot — marker của mỗi item ───────────────────────────────────────\n\ntype DotProps = {\n item: TimelineItem;\n colorClass: string;\n class?: string;\n};\n\nconst TimelineDot: Component<DotProps> = p => {\n const status = () => p.item.status ?? 'done';\n\n return (\n <div class={cn('tl15', p.colorClass, `tl-s-${status()}`, p.class)}>\n {/* Loading spinner */}\n <Show when={p.item.loading}>\n <span class=\"loading loading-spinner tl16\" />\n </Show>\n\n {/* Custom icon */}\n <Show when={!p.item.loading && p.item.icon}>\n <span class=\"tl17\">{p.item.icon!()}</span>\n </Show>\n\n {/* Default icon theo status */}\n <Show when={!p.item.loading && !p.item.icon}>\n <Show when={status() === 'done'}>\n <Check size={12} stroke-width={3} />\n </Show>\n <Show when={status() === 'error'}>\n <AlertCircle size={12} stroke-width={2.5} />\n </Show>\n <Show when={status() === 'pending'}>\n <Clock size={11} stroke-width={2} />\n </Show>\n {/* active: chỉ hiện dot rỗng — style CSS xử lý */}\n </Show>\n </div>\n );\n};\n\n// ─── TimelineItemContent — tiêu đề + nội dung + thời gian ────────────────────\n\ntype ContentProps = {\n item: TimelineItem;\n class?: TimelineProps['class'];\n};\n\nconst TimelineContent: Component<ContentProps> = p => (\n <div class={cn('tl18', p.class?.content)}>\n <Show when={p.item.timestamp}>\n <div class={cn('tl21', p.class?.timestamp)}>{p.item.timestamp}</div>\n </Show>\n <Show when={p.item.title}>\n <div class={cn('tl19', p.class?.title)}>{p.item.title}</div>\n </Show>\n <Show when={p.item.content}>\n <div class={cn('tl20', p.class?.description)}>{p.item.content}</div>\n </Show>\n </div>\n);\n\n// ─── Tính vị trí nội dung dựa trên mode & item.position ──────────────────────\n\nconst resolvePosition = (\n mode: TimelineProps['mode'],\n itemPosition: TimelineItem['position'],\n index: number,\n): 'start' | 'end' => {\n if (itemPosition) return itemPosition;\n if (mode === 'start') return 'start';\n if (mode === 'end') return 'end';\n // alternate: chẵn = start, lẻ = end\n return index % 2 === 0 ? 'start' : 'end';\n};\n\n// ─── Main Component ───────────────────────────────────────────────────────────\n\nexport const Timeline: Component<TimelineProps> = props => {\n const merged = mergeProps(\n {\n items: [] as TimelineItem[],\n color: 'primary' as BaseColorProps,\n orientation: 'vertical' as const,\n mode: 'alternate' as const,\n reverse: false,\n },\n props,\n );\n\n const [p, nativeProps] = splitProps(merged, [\n 'items',\n 'color',\n 'orientation',\n 'mode',\n 'reverse',\n 'class',\n ]);\n\n const isVertical = () => p.orientation === 'vertical';\n\n const displayItems = createMemo(() =>\n p.reverse ? [...p.items].reverse() : p.items,\n );\n\n const globalColorClass = () => getColor(p.color, 'color-primary');\n\n return (\n <div\n {...nativeProps}\n class={cn(\n 'tl01',\n isVertical() ? 'tl02' : 'tl03',\n `tl-mode-${p.mode}`,\n globalColorClass(),\n p.class?.root,\n )}\n >\n <For each={displayItems()}>\n {(item, i) => {\n const pos = () => resolvePosition(p.mode, item.position, i());\n const itemColorClass = () => getColor(resolveItemColor(item, p.color), 'color-primary');\n const isLast = () => i() === displayItems().length - 1;\n\n return (\n <div\n class={cn(\n 'tl04',\n isVertical() ? 'tl05' : 'tl06',\n `tl-pos-${pos()}`,\n `tl-s-${item.status ?? 'done'}`,\n p.class?.item,\n )}\n >\n {/* ── Vertical layout ── */}\n <Show when={isVertical()}>\n {/* Cột bên start (trái) */}\n <div class={cn('tl07', p.class?.label)}>\n <Show when={pos() === 'start'}>\n <TimelineContent item={item} class={p.class} />\n </Show>\n </div>\n\n {/* Cột giữa: dot + connector */}\n <div class=\"tl08\">\n <TimelineDot item={item} colorClass={itemColorClass()} class={p.class?.dot} />\n <Show when={!isLast()}>\n <div class={cn('tl09', p.class?.connector)} />\n </Show>\n </div>\n\n {/* Cột bên end (phải) */}\n <div class={cn('tl10', p.class?.label)}>\n <Show when={pos() === 'end'}>\n <TimelineContent item={item} class={p.class} />\n </Show>\n </div>\n </Show>\n\n {/* ── Horizontal layout ── */}\n <Show when={!isVertical()}>\n {/* Hàng trên (start) */}\n <div class={cn('tl11', p.class?.label)}>\n <Show when={pos() === 'start'}>\n <TimelineContent item={item} class={p.class} />\n </Show>\n </div>\n\n {/* Hàng giữa: connector + dot + connector */}\n <div class=\"tl12\">\n <div class={cn('tl13', i() === 0 && 'tl-invisible', p.class?.connector)} />\n <TimelineDot item={item} colorClass={itemColorClass()} class={p.class?.dot} />\n <div class={cn('tl13', isLast() && 'tl-invisible', p.class?.connector)} />\n </div>\n\n {/* Hàng dưới (end) */}\n <div class={cn('tl14', p.class?.label)}>\n <Show when={pos() === 'end'}>\n <TimelineContent item={item} class={p.class} />\n </Show>\n </div>\n </Show>\n </div>\n );\n }}\n </For>\n </div>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"timeline.js","names":["BaseColorProps","cn","getColor","AlertCircle","Check","Clock","Component","createMemo","For","JSX","mergeProps","Show","splitProps","TimelineItem","TimelineItemStatus","TimelineProps","STATUS_COLOR","Record","pending","active","done","error","resolveItemColor","item","globalColor","color","status","DotProps","colorClass","class","TimelineDot","p","_el$","_tmpl$3","_$insert","_$createComponent","when","loading","children","_tmpl$","_$memo","icon","_el$3","_tmpl$2","size","_$effect","_$className","ContentProps","TimelineContent","_el$4","timestamp","_el$5","title","_el$6","content","_el$7","description","resolvePosition","mode","itemPosition","index","Timeline","props","merged","items","orientation","const","reverse","nativeProps","isVertical","displayItems","globalColorClass","_el$8","_$spread","_$mergeProps","root","each","i","pos","position","itemColorClass","isLast","length","_el$9","_el$0","label","_el$1","_tmpl$4","dot","_el$10","connector","_el$11","_el$12","_el$13","_tmpl$5","_el$14","firstChild","_el$15","nextSibling","_p$","_v$","_v$2","e","t","undefined","_el$16"],"sources":["../../../src/components/timeline/timeline.tsx"],"sourcesContent":["import { BaseColorProps } from '@/type';\nimport { cn } from '@/utils/cn';\nimport { getColor } from '@/utils/helper';\nimport AlertCircle from 'lucide-solid/icons/alert-circle';\nimport Check from 'lucide-solid/icons/check';\nimport Clock from 'lucide-solid/icons/clock';\nimport { Component, createMemo, For, JSX, mergeProps, Show, splitProps } from 'solid-js';\nimport { TimelineItem, TimelineItemStatus, TimelineProps } from './timeline.types';\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\n/** Map status → màu DaisyUI mặc định (dùng khi item không có `color` prop) */\nconst STATUS_COLOR: Record<TimelineItemStatus, BaseColorProps> = {\n pending: 'neutral',\n active: 'primary',\n done: 'success',\n error: 'error',\n};\n\n/** Resolve màu cuối cùng của item: ưu tiên item.color > status-mapped > global */\nconst resolveItemColor = (item: TimelineItem, globalColor: BaseColorProps): BaseColorProps => {\n if (item.color) return item.color;\n if (item.status) return STATUS_COLOR[item.status];\n return globalColor;\n};\n\n// ─── TimelineDot — marker của mỗi item ───────────────────────────────────────\n\ntype DotProps = {\n item: TimelineItem;\n colorClass: string;\n class?: string;\n};\n\nconst TimelineDot: Component<DotProps> = p => {\n const status = () => p.item.status ?? 'done';\n\n return (\n <div class={cn('tl15', p.colorClass, `tl-s-${status()}`, p.class)}>\n {/* Loading spinner */}\n <Show when={p.item.loading}>\n <span class=\"loading loading-spinner tl16\" />\n </Show>\n\n {/* Custom icon */}\n <Show when={!p.item.loading && p.item.icon}>\n <span class=\"tl17\">{p.item.icon!()}</span>\n </Show>\n\n {/* Default icon theo status */}\n <Show when={!p.item.loading && !p.item.icon}>\n <Show when={status() === 'done'}>\n <Check size={12} stroke-width={3} />\n </Show>\n <Show when={status() === 'error'}>\n <AlertCircle size={12} stroke-width={2.5} />\n </Show>\n <Show when={status() === 'pending'}>\n <Clock size={11} stroke-width={2} />\n </Show>\n {/* active: chỉ hiện dot rỗng — style CSS xử lý */}\n </Show>\n </div>\n );\n};\n\n// ─── TimelineItemContent — tiêu đề + nội dung + thời gian ────────────────────\n\ntype ContentProps = {\n item: TimelineItem;\n class?: TimelineProps['class'];\n};\n\nconst TimelineContent: Component<ContentProps> = p => (\n <div class={cn('tl18', p.class?.content)}>\n <Show when={p.item.timestamp}>\n <div class={cn('tl21', p.class?.timestamp)}>{p.item.timestamp}</div>\n </Show>\n <Show when={p.item.title}>\n <div class={cn('tl19', p.class?.title)}>{p.item.title}</div>\n </Show>\n <Show when={p.item.content}>\n <div class={cn('tl20', p.class?.description)}>{p.item.content}</div>\n </Show>\n </div>\n);\n\n// ─── Tính vị trí nội dung dựa trên mode & item.position ──────────────────────\n\nconst resolvePosition = (\n mode: TimelineProps['mode'],\n itemPosition: TimelineItem['position'],\n index: number,\n): 'start' | 'end' => {\n if (itemPosition) return itemPosition;\n if (mode === 'start') return 'start';\n if (mode === 'end') return 'end';\n // alternate: chẵn = start, lẻ = end\n return index % 2 === 0 ? 'start' : 'end';\n};\n\n// ─── Main Component ───────────────────────────────────────────────────────────\n\nexport const Timeline: Component<TimelineProps> = props => {\n const merged = mergeProps(\n {\n items: [] as TimelineItem[],\n color: 'primary' as BaseColorProps,\n orientation: 'vertical' as const,\n mode: 'alternate' as const,\n reverse: false,\n },\n props,\n );\n\n const [p, nativeProps] = splitProps(merged, [\n 'items',\n 'color',\n 'orientation',\n 'mode',\n 'reverse',\n 'class',\n ]);\n\n const isVertical = () => p.orientation === 'vertical';\n\n const displayItems = createMemo(() => (p.reverse ? [...p.items].reverse() : p.items));\n\n const globalColorClass = () => getColor(p.color, 'color-primary');\n\n return (\n <div\n {...nativeProps}\n class={cn(\n 'tl01',\n isVertical() ? 'tl02' : 'tl03',\n `tl-mode-${p.mode}`,\n globalColorClass(),\n p.class?.root,\n )}\n >\n <For each={displayItems()}>\n {(item, i) => {\n const pos = () => resolvePosition(p.mode, item.position, i());\n const itemColorClass = () => getColor(resolveItemColor(item, p.color), 'color-primary');\n const isLast = () => i() === displayItems().length - 1;\n\n return (\n <div\n class={cn(\n 'tl04',\n isVertical() ? 'tl05' : 'tl06',\n `tl-pos-${pos()}`,\n `tl-s-${item.status ?? 'done'}`,\n p.class?.item,\n )}\n >\n {/* ── Vertical layout ── */}\n <Show when={isVertical()}>\n {/* Cột bên start (trái) */}\n <div class={cn('tl07', p.class?.label)}>\n <Show when={pos() === 'start'}>\n <TimelineContent item={item} class={p.class} />\n </Show>\n </div>\n\n {/* Cột giữa: dot + connector */}\n <div class=\"tl08\">\n <TimelineDot item={item} colorClass={itemColorClass()} class={p.class?.dot} />\n <Show when={!isLast()}>\n <div class={cn('tl09', p.class?.connector)} />\n </Show>\n </div>\n\n {/* Cột bên end (phải) */}\n <div class={cn('tl10', p.class?.label)}>\n <Show when={pos() === 'end'}>\n <TimelineContent item={item} class={p.class} />\n </Show>\n </div>\n </Show>\n\n {/* ── Horizontal layout ── */}\n <Show when={!isVertical()}>\n {/* Hàng trên (start) */}\n <div class={cn('tl11', p.class?.label)}>\n <Show when={pos() === 'start'}>\n <TimelineContent item={item} class={p.class} />\n </Show>\n </div>\n\n {/* Hàng giữa: connector + dot + connector */}\n <div class=\"tl12\">\n <div class={cn('tl13', i() === 0 && 'tl-invisible', p.class?.connector)} />\n <TimelineDot item={item} colorClass={itemColorClass()} class={p.class?.dot} />\n <div class={cn('tl13', isLast() && 'tl-invisible', p.class?.connector)} />\n </div>\n\n {/* Hàng dưới (end) */}\n <div class={cn('tl14', p.class?.label)}>\n <Show when={pos() === 'end'}>\n <TimelineContent item={item} class={p.class} />\n </Show>\n </div>\n </Show>\n </div>\n );\n }}\n </For>\n </div>\n );\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"tooltip.d.ts","sourceRoot":"","sources":["../../../src/components/tooltip/tooltip.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAO,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EACL,SAAS,EAUV,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAsB,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAIxE,QAAA,MAAM,eAAe;;;8EAmBnB,CAAC;AACH,MAAM,MAAM,oBAAoB,GAAG,YAAY,CAAC,OAAO,eAAe,CAAC,CAAC;AAwLxE,eAAO,MAAM,OAAO,EAAE,SAAS,CAAC,YAAY,CAU3C,CAAC"}
1
+ {"version":3,"file":"tooltip.d.ts","sourceRoot":"","sources":["../../../src/components/tooltip/tooltip.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAO,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EACL,SAAS,EAUV,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAsB,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAIxE,QAAA,MAAM,eAAe;;;8EAmBnB,CAAC;AACH,MAAM,MAAM,oBAAoB,GAAG,YAAY,CAAC,OAAO,eAAe,CAAC,CAAC;AA8LxE,eAAO,MAAM,OAAO,EAAE,SAAS,CAAC,YAAY,CAU3C,CAAC"}