solid-tom-ui 0.2.3 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +237 -237
- package/dist/components/badge/badge.d.ts +0 -1
- package/dist/components/badge/badge.d.ts.map +1 -1
- package/dist/components/carousel/carousel.d.ts.map +1 -1
- package/dist/components/context-menu/context-menu.store.d.ts.map +1 -1
- package/dist/components/context-menu/context-menu.types.d.ts.map +1 -1
- package/dist/components/divider/divider.d.ts.map +1 -1
- package/dist/components/divider/divider.types.d.ts.map +1 -1
- package/dist/components/divider/index.d.ts +1 -1
- package/dist/components/divider/index.d.ts.map +1 -1
- package/dist/components/drawer/drawer.types.d.ts.map +1 -1
- package/dist/components/mansory/mansory.d.ts.map +1 -1
- package/dist/components/mansory/mansory.types.d.ts.map +1 -1
- package/dist/components/modal/modal.d.ts.map +1 -1
- package/dist/components/modal/modalContext.d.ts.map +1 -1
- package/dist/components/progress-bar/progress-bar.d.ts.map +1 -1
- package/dist/components/qr-code/qr-code.d.ts.map +1 -1
- package/dist/components/splitter/splitter.d.ts.map +1 -1
- package/dist/components/timeline/timeline.d.ts.map +1 -1
- package/dist/components/tooltip/tooltip.d.ts.map +1 -1
- package/dist/components/upload/upload.d.ts.map +1 -1
- package/dist/components/upload/upload.types.d.ts.map +1 -1
- package/dist/components/z-index/z-index.d.ts.map +1 -1
- package/dist/solid-ui.css +1 -1
- package/dist/src/components/avatar/avatar.js.map +1 -0
- package/dist/src/components/badge/badge.js +2 -0
- package/dist/src/components/badge/badge.js.map +1 -0
- package/dist/src/components/breadcrumb/breadcrumb.js.map +1 -0
- package/dist/{components → src/components}/button/button.js +1 -1
- package/dist/src/components/button/button.js.map +1 -0
- package/dist/src/components/carousel/carousel.js +2 -0
- package/dist/src/components/carousel/carousel.js.map +1 -0
- package/dist/src/components/chat-bubble/chatBubble.js.map +1 -0
- package/dist/src/components/checkbox/checkbox.js.map +1 -0
- package/dist/src/components/code-preview/code-preview.js +2 -0
- package/dist/src/components/code-preview/code-preview.js.map +1 -0
- package/dist/src/components/collapse/collapse.js.map +1 -0
- package/dist/src/components/context-menu/context-menu.js +2 -0
- package/dist/src/components/context-menu/context-menu.js.map +1 -0
- package/dist/src/components/context-menu/context-menu.store.js.map +1 -0
- package/dist/src/components/diff/diff.js.map +1 -0
- package/dist/src/components/divider/divider.js.map +1 -0
- package/dist/src/components/drawer/drawer.js +2 -0
- package/dist/src/components/drawer/drawer.js.map +1 -0
- package/dist/src/components/dropdown/dropdown.js.map +1 -0
- package/dist/src/components/dropdown/dropdown.store.js.map +1 -0
- package/dist/src/components/float-button/float-button.js.map +1 -0
- package/dist/src/components/hover-3d-image/hover-3d-image.js.map +1 -0
- package/dist/src/components/image-preview/image-preview.js +2 -0
- package/dist/src/components/image-preview/image-preview.js.map +1 -0
- package/dist/src/components/indicator/indicator.js.map +1 -0
- package/dist/src/components/input/input.js.map +1 -0
- package/dist/src/components/input/input.utils.js.map +1 -0
- package/dist/src/components/input/variants/input-color.js.map +1 -0
- package/dist/src/components/input/variants/input-date.js.map +1 -0
- package/dist/src/components/input/variants/input-number.js +2 -0
- package/dist/src/components/input/variants/input-number.js.map +1 -0
- package/dist/src/components/input/variants/input-otp.js.map +1 -0
- package/dist/src/components/input/variants/input-password.js +2 -0
- package/dist/src/components/input/variants/input-password.js.map +1 -0
- package/dist/src/components/input/variants/input-radio.js.map +1 -0
- package/dist/src/components/input/variants/input-range.js.map +1 -0
- package/dist/src/components/input/variants/input-text.js +2 -0
- package/dist/src/components/input/variants/input-text.js.map +1 -0
- package/dist/src/components/input/variants/input-textarea.js +2 -0
- package/dist/src/components/input/variants/input-textarea.js.map +1 -0
- package/dist/src/components/loading/loading.js +2 -0
- package/dist/src/components/loading/loading.js.map +1 -0
- package/dist/src/components/mansory/mansory.js.map +1 -0
- package/dist/src/components/menu/menu.js +2 -0
- package/dist/src/components/menu/menu.js.map +1 -0
- package/dist/src/components/modal/modal.js +2 -0
- package/dist/src/components/modal/modal.js.map +1 -0
- package/dist/src/components/modal/modalContext.js.map +1 -0
- package/dist/src/components/pagination/pagination.js +2 -0
- package/dist/src/components/pagination/pagination.js.map +1 -0
- package/dist/src/components/progress-bar/progress-bar.js.map +1 -0
- package/dist/src/components/qr-code/qr-code.js +2 -0
- package/dist/src/components/qr-code/qr-code.js.map +1 -0
- package/dist/src/components/rating/rating.js.map +1 -0
- package/dist/src/components/select/select.js +2 -0
- package/dist/src/components/select/select.js.map +1 -0
- package/dist/src/components/select-zone/select-zone.js.map +1 -0
- package/dist/src/components/skeleton/skeleton.js.map +1 -0
- package/dist/src/components/slider/slider.js.map +1 -0
- package/dist/src/components/splitter/splitter.js.map +1 -0
- package/dist/src/components/steps/steps.js +2 -0
- package/dist/src/components/steps/steps.js.map +1 -0
- package/dist/src/components/swap/swap.js.map +1 -0
- package/dist/src/components/switch/switch.js.map +1 -0
- package/dist/src/components/tab/tab.js +2 -0
- package/dist/src/components/tab/tab.js.map +1 -0
- package/dist/src/components/table/table.js +2 -0
- package/dist/src/components/table/table.js.map +1 -0
- package/dist/src/components/text-rotate/text-rotate.js.map +1 -0
- package/dist/src/components/timeline/timeline.js +2 -0
- package/dist/src/components/timeline/timeline.js.map +1 -0
- package/dist/src/components/toast/icons/ErrorIcon.js.map +1 -0
- package/dist/src/components/toast/icons/IconCircle.js.map +1 -0
- package/dist/src/components/toast/icons/InfoIcon.js.map +1 -0
- package/dist/src/components/toast/icons/LoaderIcon.js.map +1 -0
- package/dist/src/components/toast/icons/SuccessIcon.js.map +1 -0
- package/dist/src/components/toast/icons/WarningIcon.js.map +1 -0
- package/dist/src/components/toast/toast.js +2 -0
- package/dist/src/components/toast/toast.js.map +1 -0
- package/dist/src/components/toast/toast.store.js.map +1 -0
- package/dist/src/components/tooltip/tooltip.js.map +1 -0
- package/dist/{components → src/components}/tour/tour.js +1 -1
- package/dist/src/components/tour/tour.js.map +1 -0
- package/dist/src/components/upload/upload.js +2 -0
- package/dist/src/components/upload/upload.js.map +1 -0
- package/dist/src/components/z-index/z-index.context.js.map +1 -0
- package/dist/src/components/z-index/z-index.js.map +1 -0
- package/dist/src/components/z-index/z-index.store.js.map +1 -0
- package/dist/src/components/z-index/z-index.types.js.map +1 -0
- package/dist/src/utils/cn.js.map +1 -0
- package/dist/src/utils/element-tracker.js.map +1 -0
- package/dist/src/utils/helper.js.map +1 -0
- package/dist/src/utils/hoc.js.map +1 -0
- package/dist/src/utils/shiki-highlight.js +2 -0
- package/dist/src/utils/shiki-highlight.js.map +1 -0
- package/package.json +120 -120
- package/dist/components/avatar/avatar.js.map +0 -1
- package/dist/components/badge/badge.js +0 -2
- package/dist/components/badge/badge.js.map +0 -1
- package/dist/components/breadcrumb/breadcrumb.js.map +0 -1
- package/dist/components/button/button.js.map +0 -1
- package/dist/components/carousel/carousel.js +0 -2
- package/dist/components/carousel/carousel.js.map +0 -1
- package/dist/components/chat-bubble/chatBubble.js.map +0 -1
- package/dist/components/checkbox/checkbox.js.map +0 -1
- package/dist/components/code-preview/code-preview.js +0 -2
- package/dist/components/code-preview/code-preview.js.map +0 -1
- package/dist/components/collapse/collapse.js.map +0 -1
- package/dist/components/context-menu/context-menu.js +0 -2
- package/dist/components/context-menu/context-menu.js.map +0 -1
- package/dist/components/context-menu/context-menu.store.js.map +0 -1
- package/dist/components/diff/diff.js.map +0 -1
- package/dist/components/divider/divider.js.map +0 -1
- package/dist/components/drawer/drawer.js +0 -2
- package/dist/components/drawer/drawer.js.map +0 -1
- package/dist/components/dropdown/dropdown.js.map +0 -1
- package/dist/components/dropdown/dropdown.store.js.map +0 -1
- package/dist/components/float-button/float-button.js.map +0 -1
- package/dist/components/hover-3d-image/hover-3d-image.js.map +0 -1
- package/dist/components/image-preview/image-preview.js +0 -2
- package/dist/components/image-preview/image-preview.js.map +0 -1
- package/dist/components/indicator/indicator.js.map +0 -1
- package/dist/components/input/input.js.map +0 -1
- package/dist/components/input/input.utils.js.map +0 -1
- package/dist/components/input/variants/input-color.js.map +0 -1
- package/dist/components/input/variants/input-date.js.map +0 -1
- package/dist/components/input/variants/input-number.js +0 -2
- package/dist/components/input/variants/input-number.js.map +0 -1
- package/dist/components/input/variants/input-otp.js.map +0 -1
- package/dist/components/input/variants/input-password.js +0 -2
- package/dist/components/input/variants/input-password.js.map +0 -1
- package/dist/components/input/variants/input-radio.js.map +0 -1
- package/dist/components/input/variants/input-range.js.map +0 -1
- package/dist/components/input/variants/input-text.js +0 -2
- package/dist/components/input/variants/input-text.js.map +0 -1
- package/dist/components/input/variants/input-textarea.js +0 -2
- package/dist/components/input/variants/input-textarea.js.map +0 -1
- package/dist/components/loading/loading.js +0 -2
- package/dist/components/loading/loading.js.map +0 -1
- package/dist/components/mansory/mansory.js.map +0 -1
- package/dist/components/menu/menu.js +0 -2
- package/dist/components/menu/menu.js.map +0 -1
- package/dist/components/modal/modal.js +0 -2
- package/dist/components/modal/modal.js.map +0 -1
- package/dist/components/modal/modalContext.js.map +0 -1
- package/dist/components/pagination/pagination.js +0 -2
- package/dist/components/pagination/pagination.js.map +0 -1
- package/dist/components/progress-bar/progress-bar.js.map +0 -1
- package/dist/components/qr-code/qr-code.js +0 -2
- package/dist/components/qr-code/qr-code.js.map +0 -1
- package/dist/components/rating/rating.js.map +0 -1
- package/dist/components/select/select.js +0 -2
- package/dist/components/select/select.js.map +0 -1
- package/dist/components/select-zone/select-zone.js.map +0 -1
- package/dist/components/skeleton/skeleton.js.map +0 -1
- package/dist/components/slider/slider.js.map +0 -1
- package/dist/components/splitter/splitter.js.map +0 -1
- package/dist/components/steps/steps.js +0 -2
- package/dist/components/steps/steps.js.map +0 -1
- package/dist/components/swap/swap.js.map +0 -1
- package/dist/components/switch/switch.js.map +0 -1
- package/dist/components/tab/tab.js +0 -2
- package/dist/components/tab/tab.js.map +0 -1
- package/dist/components/table/table.js +0 -2
- package/dist/components/table/table.js.map +0 -1
- package/dist/components/text-rotate/text-rotate.js.map +0 -1
- package/dist/components/timeline/timeline.js +0 -2
- package/dist/components/timeline/timeline.js.map +0 -1
- package/dist/components/toast/icons/ErrorIcon.js.map +0 -1
- package/dist/components/toast/icons/IconCircle.js.map +0 -1
- package/dist/components/toast/icons/InfoIcon.js.map +0 -1
- package/dist/components/toast/icons/LoaderIcon.js.map +0 -1
- package/dist/components/toast/icons/SuccessIcon.js.map +0 -1
- package/dist/components/toast/icons/WarningIcon.js.map +0 -1
- package/dist/components/toast/toast.js +0 -2
- package/dist/components/toast/toast.js.map +0 -1
- package/dist/components/toast/toast.store.js.map +0 -1
- package/dist/components/tooltip/tooltip.js.map +0 -1
- package/dist/components/tour/tour.js.map +0 -1
- package/dist/components/upload/upload.js +0 -2
- package/dist/components/upload/upload.js.map +0 -1
- package/dist/components/z-index/z-index.context.js.map +0 -1
- package/dist/components/z-index/z-index.js.map +0 -1
- package/dist/components/z-index/z-index.store.js.map +0 -1
- package/dist/components/z-index/z-index.types.js.map +0 -1
- package/dist/utils/cn.js.map +0 -1
- package/dist/utils/element-tracker.js.map +0 -1
- package/dist/utils/helper.js.map +0 -1
- package/dist/utils/hoc.js.map +0 -1
- package/dist/utils/shiki-highlight.js +0 -2
- package/dist/utils/shiki-highlight.js.map +0 -1
- /package/dist/{components → src/components}/avatar/avatar.js +0 -0
- /package/dist/{components → src/components}/breadcrumb/breadcrumb.js +0 -0
- /package/dist/{components → src/components}/chat-bubble/chatBubble.js +0 -0
- /package/dist/{components → src/components}/checkbox/checkbox.js +0 -0
- /package/dist/{components → src/components}/collapse/collapse.js +0 -0
- /package/dist/{components → src/components}/context-menu/context-menu.store.js +0 -0
- /package/dist/{components → src/components}/diff/diff.js +0 -0
- /package/dist/{components → src/components}/divider/divider.js +0 -0
- /package/dist/{components → src/components}/dropdown/dropdown.js +0 -0
- /package/dist/{components → src/components}/dropdown/dropdown.store.js +0 -0
- /package/dist/{components → src/components}/float-button/float-button.js +0 -0
- /package/dist/{components → src/components}/hover-3d-image/hover-3d-image.js +0 -0
- /package/dist/{components → src/components}/indicator/indicator.js +0 -0
- /package/dist/{components → src/components}/input/input.js +0 -0
- /package/dist/{components → src/components}/input/input.utils.js +0 -0
- /package/dist/{components → src/components}/input/variants/input-color.js +0 -0
- /package/dist/{components → src/components}/input/variants/input-date.js +0 -0
- /package/dist/{components → src/components}/input/variants/input-otp.js +0 -0
- /package/dist/{components → src/components}/input/variants/input-radio.js +0 -0
- /package/dist/{components → src/components}/input/variants/input-range.js +0 -0
- /package/dist/{components → src/components}/mansory/mansory.js +0 -0
- /package/dist/{components → src/components}/modal/modalContext.js +0 -0
- /package/dist/{components → src/components}/progress-bar/progress-bar.js +0 -0
- /package/dist/{components → src/components}/rating/rating.js +0 -0
- /package/dist/{components → src/components}/select-zone/select-zone.js +0 -0
- /package/dist/{components → src/components}/skeleton/skeleton.js +0 -0
- /package/dist/{components → src/components}/slider/slider.js +0 -0
- /package/dist/{components → src/components}/splitter/splitter.js +0 -0
- /package/dist/{components → src/components}/swap/swap.js +0 -0
- /package/dist/{components → src/components}/switch/switch.js +0 -0
- /package/dist/{components → src/components}/table/index.js +0 -0
- /package/dist/{components → src/components}/text-rotate/text-rotate.js +0 -0
- /package/dist/{components → src/components}/toast/icons/ErrorIcon.js +0 -0
- /package/dist/{components → src/components}/toast/icons/IconCircle.js +0 -0
- /package/dist/{components → src/components}/toast/icons/InfoIcon.js +0 -0
- /package/dist/{components → src/components}/toast/icons/LoaderIcon.js +0 -0
- /package/dist/{components → src/components}/toast/icons/SuccessIcon.js +0 -0
- /package/dist/{components → src/components}/toast/icons/WarningIcon.js +0 -0
- /package/dist/{components → src/components}/toast/toast.store.js +0 -0
- /package/dist/{components → src/components}/tooltip/tooltip.js +0 -0
- /package/dist/{components → src/components}/z-index/z-index.context.js +0 -0
- /package/dist/{components → src/components}/z-index/z-index.js +0 -0
- /package/dist/{components → src/components}/z-index/z-index.store.js +0 -0
- /package/dist/{components → src/components}/z-index/z-index.types.js +0 -0
- /package/dist/{lib.js → src/lib.js} +0 -0
- /package/dist/{utils → src/utils}/cn.js +0 -0
- /package/dist/{utils → src/utils}/element-tracker.js +0 -0
- /package/dist/{utils → src/utils}/helper.js +0 -0
- /package/dist/{utils → src/utils}/hoc.js +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tooltip.js","names":["cn","getColor","acquire","OFFSET","release","ZIndex","ZIndexType","cva","VariantProps","Component","createSignal","createUniqueId","JSX","Match","mergeProps","onCleanup","onMount","Show","Switch","TooltipPortalProps","TooltipProps","tooltipVariants","variants","color","neutral","primary","secondary","accent","info","success","warning","error","position","top","bottom","right","left","TooltipVariantsProps","ActiveEntry","node","HTMLDivElement","registryKey","offset","bubbleHovered","activeMap","Map","customContentRegistry","Element","refCount","observer","IntersectionObserver","calcStyle","r","DOMRect","Record","OFFSET_PX","width","transform","height","showTooltip","id","triggerEl","HTMLElement","content","customContent","colorClass","extraClass","customZIndex","has","getBoundingClientRect","style","document","createElement","className","Object","assign","pointerEvents","zIndexOffset","zIndex","undefined","acquired","TOOLTIP","String","textContent","appendChild","cloneNode","entry","set","addEventListener","onBubbleEnter","onBubbleLeave","removeTooltipIfIdle","body","sentinelActiveSet","Set","get","remove","delete","removeTooltip","getOrCreateObserver","entries","el","target","dataset","tip","pos","Number","isIntersecting","add","closest","threshold","Tooltip","p","_$createComponent","when","hidden","fallback","_$memo","children","TooltipDefaultMain","type","TooltipPortalMain","const","sentinelRef","customContentRef","class","firstElementChild","observe","cleanupTooltipRegistration","unobserve","disconnect","_el$","_tmpl$","_el$2","firstChild","_$use","tt","_ref$","_$insert","_c$","_el$3","_tmpl$2","_ref$2","_$effect","_p$","_v$","root","_v$2","e","_$className","t","_$setAttribute","portalBubbleStyle","setPortalBubbleStyle","CSSProperties","TooltipEntry","setHovered","v","updateCoords","ContainerState","count","containerMap","WeakMap","ListenerPair","over","Event","out","listenerMap","makeMouseOver","state","getAttribute","makeMouseOut","related","MouseEvent","relatedTarget","contains","attachToContainer","passive","detachFromContainer","pair","removeEventListener","calcPortalStyle","isHovered","setIsHovered","onTriggerMount","setAttribute","handle","cancelled","doCleanup","register","getElementById","containerId","s","removeAttribute","queueMicrotask","cancelAndDetachTrigger","_el$4","_tmpl$3","_$spread","_$mergeProps","open","blockScroll","customValue"],"sources":["../../../../src/components/tooltip/tooltip.tsx"],"sourcesContent":["import { cn } from '@/utils/cn';\r\nimport { getColor } from '@/utils/helper';\r\nimport { acquire, OFFSET, release, ZIndex, ZIndexType } from '@components/z-index';\r\nimport { cva, VariantProps } from 'class-variance-authority';\r\nimport {\r\n Component,\r\n createSignal,\r\n createUniqueId,\r\n JSX,\r\n Match,\r\n mergeProps,\r\n onCleanup,\r\n onMount,\r\n Show,\r\n Switch,\r\n} from 'solid-js';\r\nimport type { TooltipPortalProps, TooltipProps } from './tooltip.types';\r\n\r\n// ─── CVA variants (dùng cho TooltipPortal) ────────────────────────────────\r\n\r\nconst tooltipVariants = cva('', {\r\n variants: {\r\n color: {\r\n neutral: 'tooltip-neutral',\r\n primary: 'tooltip-primary',\r\n secondary: 'tooltip-secondary',\r\n accent: 'tooltip-accent',\r\n info: 'tooltip-info',\r\n success: 'tooltip-success',\r\n warning: 'tooltip-warning',\r\n error: 'tooltip-error',\r\n },\r\n position: {\r\n top: 'tooltip-top',\r\n bottom: 'tooltip-bottom',\r\n right: 'tooltip-right',\r\n left: 'tooltip-left',\r\n },\r\n },\r\n});\r\nexport type TooltipVariantsProps = VariantProps<typeof tooltipVariants>;\r\n\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n// TOOLTIP — IO-based (không bị clip bởi overflow)\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n\r\n// --- Global scope (IO mechanism) ---\r\ntype ActiveEntry = {\r\n node: HTMLDivElement;\r\n registryKey: string;\r\n offset: number;\r\n /** true khi chuột đang ở trên bubble — giữ tooltip không bị remove */\r\n bubbleHovered: boolean;\r\n /** position của trigger để tính bridge */\r\n position: 'top' | 'bottom' | 'left' | 'right';\r\n};\r\n\r\nconst activeMap = new Map<string, ActiveEntry>();\r\n\r\n/** Registry cho customContent: id → rendered DOM node */\r\nconst customContentRegistry = new Map<string, Element>();\r\n\r\nlet refCount = 0;\r\nlet observer: IntersectionObserver | null = null;\r\n\r\nfunction calcStyle(\r\n r: DOMRect,\r\n position: 'top' | 'bottom' | 'left' | 'right',\r\n): Record<string, string> {\r\n const OFFSET_PX = 8;\r\n if (position === 'top') {\r\n return {\r\n left: `${r.left + r.width / 2}px`,\r\n top: `${r.top - OFFSET_PX}px`,\r\n transform: 'translateX(-50%) translateY(-100%)',\r\n };\r\n } else if (position === 'bottom') {\r\n return {\r\n left: `${r.left + r.width / 2}px`,\r\n top: `${r.bottom + OFFSET_PX}px`,\r\n transform: 'translateX(-50%)',\r\n };\r\n } else if (position === 'left') {\r\n return {\r\n left: `${r.left - OFFSET_PX}px`,\r\n top: `${r.top + r.height / 2}px`,\r\n transform: 'translateX(-100%) translateY(-50%)',\r\n };\r\n } else {\r\n return {\r\n left: `${r.right + OFFSET_PX}px`,\r\n top: `${r.top + r.height / 2}px`,\r\n transform: 'translateY(-50%)',\r\n };\r\n }\r\n}\r\n\r\nfunction showTooltip(\r\n id: string,\r\n triggerEl: HTMLElement,\r\n content: string | undefined,\r\n customContent: Element | undefined,\r\n position: 'top' | 'bottom' | 'left' | 'right',\r\n colorClass: string,\r\n extraClass: string | undefined,\r\n customZIndex: number | undefined,\r\n) {\r\n if (activeMap.has(id)) return;\r\n\r\n const r = triggerEl.getBoundingClientRect();\r\n const style = calcStyle(r, position);\r\n\r\n const node = document.createElement('div');\r\n node.className = cn('too06', colorClass, extraClass);\r\n\r\n Object.assign(node.style, { position: 'fixed', pointerEvents: 'auto' }, style);\r\n\r\n let registryKey: string;\r\n let zIndexOffset: number;\r\n let zIndex: number;\r\n\r\n if (customZIndex !== undefined) {\r\n zIndex = customZIndex;\r\n registryKey = '';\r\n zIndexOffset = -1;\r\n } else {\r\n const acquired = acquire(ZIndexType.TOOLTIP, OFFSET[ZIndexType.TOOLTIP]);\r\n zIndex = acquired.zIndex;\r\n registryKey = acquired.registryKey;\r\n zIndexOffset = acquired.offset;\r\n }\r\n\r\n node.style.zIndex = String(zIndex);\r\n\r\n if (content) {\r\n node.textContent = content;\r\n } else if (customContent) {\r\n node.appendChild(customContent.cloneNode(true));\r\n }\r\n\r\n const entry: ActiveEntry = {\r\n node,\r\n registryKey,\r\n offset: zIndexOffset,\r\n bubbleHovered: false,\r\n position,\r\n };\r\n activeMap.set(id, entry);\r\n\r\n node.addEventListener('mouseenter', function onBubbleEnter() {\r\n entry.bubbleHovered = true;\r\n });\r\n node.addEventListener('mouseleave', function onBubbleLeave() {\r\n entry.bubbleHovered = false;\r\n // Nếu sentinel đã không còn visible (chuột đã rời trigger), xóa tooltip\r\n removeTooltipIfIdle(id);\r\n });\r\n\r\n document.body.appendChild(node);\r\n}\r\n\r\n/** sentinelActive = true khi IO đang thấy sentinel (chuột trên trigger/bridge) */\r\nconst sentinelActiveSet = new Set<string>();\r\n\r\nfunction removeTooltipIfIdle(id: string) {\r\n const entry = activeMap.get(id);\r\n if (!entry) return;\r\n // Chỉ remove nếu cả sentinel lẫn bubble đều không có hover\r\n if (sentinelActiveSet.has(id) || entry.bubbleHovered) return;\r\n entry.node.remove();\r\n if (entry.offset >= 0) {\r\n release(entry.registryKey, entry.offset);\r\n }\r\n activeMap.delete(id);\r\n}\r\n\r\nfunction removeTooltip(id: string) {\r\n sentinelActiveSet.delete(id);\r\n removeTooltipIfIdle(id);\r\n}\r\n\r\n/**\r\n * Trick kết hợp CSS: sentinel element 1×1px ẩn bên trong wrapper.\r\n * Khi `:hover` CSS làm sentinel hiển thị (`display: block`), IntersectionObserver\r\n * phát hiện nó intersect viewport và gọi `showTooltip()`.\r\n * Không dùng JS event listener trên trigger — zero overhead.\r\n */\r\nfunction getOrCreateObserver(): IntersectionObserver {\r\n if (!observer) {\r\n observer = new IntersectionObserver(\r\n entries => {\r\n for (const entry of entries) {\r\n const el = entry.target as HTMLElement;\r\n const id = el.dataset.id ?? '';\r\n const content = el.dataset.tip;\r\n const pos = (el.dataset.position ?? 'top') as 'top' | 'bottom' | 'left' | 'right';\r\n const colorClass = el.dataset.colorClass ?? '';\r\n const extraClass = el.dataset.extraClass;\r\n const customZIndex = el.dataset.customZIndex\r\n ? Number(el.dataset.customZIndex)\r\n : undefined;\r\n\r\n if (entry.isIntersecting) {\r\n sentinelActiveSet.add(id);\r\n const triggerEl = el.closest('[data-tt]') as HTMLElement | null;\r\n if (!triggerEl) continue;\r\n const customContent = customContentRegistry.get(id);\r\n showTooltip(\r\n id,\r\n triggerEl,\r\n content,\r\n customContent,\r\n pos,\r\n colorClass,\r\n extraClass,\r\n customZIndex,\r\n );\r\n } else {\r\n removeTooltip(id);\r\n }\r\n }\r\n },\r\n { threshold: 0 },\r\n );\r\n }\r\n return observer;\r\n}\r\n\r\n// ─── Tooltip — unified entry point ──────────────────────────────────────────\r\n\r\nexport const Tooltip: Component<TooltipProps> = p => {\r\n return (\r\n <Show when={!p.hidden} fallback={<>{p.children}</>}>\r\n <Switch fallback={<TooltipDefaultMain {...p} />}>\r\n <Match when={p.type === 'portal' || 'containerId' in p}>\r\n <TooltipPortalMain {...(p as TooltipPortalProps)} />\r\n </Match>\r\n </Switch>\r\n </Show>\r\n );\r\n};\r\n\r\n// ─── Default (IO-based) impl ─────────────────────────────────────────────────\r\n\r\nconst TooltipDefaultMain: Component<TooltipProps> = p => {\r\n p = mergeProps(\r\n {\r\n position: 'top' as const,\r\n color: 'neutral' as const,\r\n },\r\n p,\r\n );\r\n const id = createUniqueId();\r\n let sentinelRef!: HTMLDivElement;\r\n let customContentRef!: HTMLDivElement;\r\n\r\n onMount(() => {\r\n refCount++;\r\n sentinelRef.dataset.id = id;\r\n sentinelRef.dataset.tip = p.content ?? '';\r\n sentinelRef.dataset.position = p.position;\r\n sentinelRef.dataset.colorClass = getColor(p.color);\r\n if (p.class?.content) sentinelRef.dataset.extraClass = p.class.content;\r\n if (p.zIndex !== undefined) sentinelRef.dataset.customZIndex = String(p.zIndex);\r\n if (p.customContent && customContentRef?.firstElementChild) {\r\n customContentRegistry.set(id, customContentRef.firstElementChild);\r\n }\r\n getOrCreateObserver().observe(sentinelRef);\r\n });\r\n\r\n onCleanup(function cleanupTooltipRegistration() {\r\n observer?.unobserve(sentinelRef);\r\n removeTooltip(id);\r\n customContentRegistry.delete(id);\r\n refCount--;\r\n if (refCount === 0 && observer) {\r\n observer.disconnect();\r\n observer = null;\r\n }\r\n });\r\n\r\n return (\r\n <div\r\n ref={el => (el.dataset.tt = '')}\r\n class={cn('too07', p.class?.root)}\r\n data-pos={p.position ?? 'top'}\r\n >\r\n <div ref={sentinelRef} class=\"too08\" />\r\n {p.children as JSX.Element}\r\n {p.customContent && (\r\n <div ref={customContentRef} class=\"hidden\">\r\n {p.customContent}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n// TOOLTIP PORTAL — Event-delegation mode\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n\r\n/**\r\n * SINGLETON PORTAL BUBBLE — Thiết kế có chủ đích.\r\n * Signal ở module scope vì toàn bộ hệ thống tooltip portal chỉ có\r\n * DUY NHẤT 1 bubble tồn tại trong DOM tại bất kỳ thời điểm nào.\r\n */\r\nconst [portalBubbleStyle, setPortalBubbleStyle] = createSignal<\r\n import('solid-js').JSX.CSSProperties\r\n>({});\r\n\r\ntype TooltipEntry = {\r\n setHovered: (v: boolean) => void;\r\n updateCoords: () => void;\r\n};\r\n\r\ntype ContainerState = {\r\n count: number;\r\n entries: Map<string, TooltipEntry>;\r\n};\r\n\r\nconst containerMap = new WeakMap<Element, ContainerState>();\r\n\r\ntype ListenerPair = { over: (e: Event) => void; out: (e: Event) => void };\r\nconst listenerMap = new WeakMap<Element, ListenerPair>();\r\n\r\nfunction makeMouseOver(state: ContainerState) {\r\n return (e: Event) => {\r\n const el = (e.target as Element).closest('[tt]');\r\n if (!el) return;\r\n const tt = el.getAttribute('tt')!;\r\n const entry = state.entries.get(tt);\r\n if (entry) {\r\n entry.updateCoords();\r\n entry.setHovered(true);\r\n }\r\n };\r\n}\r\n\r\nfunction makeMouseOut(state: ContainerState) {\r\n return (e: Event) => {\r\n const el = (e.target as Element).closest('[tt]');\r\n if (!el) return;\r\n const tt = el.getAttribute('tt')!;\r\n const related = (e as MouseEvent).relatedTarget as Element | null;\r\n if (related && el.contains(related)) return;\r\n const entry = state.entries.get(tt);\r\n if (entry) entry.setHovered(false);\r\n };\r\n}\r\n\r\nfunction attachToContainer(root: Element, state: ContainerState) {\r\n const over = makeMouseOver(state);\r\n const out = makeMouseOut(state);\r\n listenerMap.set(root, { over, out });\r\n root.addEventListener('mouseover', over, { passive: true });\r\n root.addEventListener('mouseout', out, { passive: true });\r\n}\r\n\r\nfunction detachFromContainer(root: Element) {\r\n const pair = listenerMap.get(root);\r\n if (!pair) return;\r\n root.removeEventListener('mouseover', pair.over);\r\n root.removeEventListener('mouseout', pair.out);\r\n listenerMap.delete(root);\r\n}\r\n\r\nfunction calcPortalStyle(\r\n el: HTMLElement,\r\n position: 'top' | 'bottom' | 'left' | 'right',\r\n): import('solid-js').JSX.CSSProperties {\r\n const r = el.getBoundingClientRect();\r\n const OFFSET_PX = 8;\r\n\r\n if (position === 'top') {\r\n return {\r\n left: `${r.left + r.width / 2}px`,\r\n top: `${r.top - OFFSET_PX}px`,\r\n transform: 'translateX(-50%) translateY(-100%)',\r\n };\r\n } else if (position === 'bottom') {\r\n return {\r\n left: `${r.left + r.width / 2}px`,\r\n top: `${r.bottom + OFFSET_PX}px`,\r\n transform: 'translateX(-50%)',\r\n };\r\n } else if (position === 'left') {\r\n return {\r\n left: `${r.left - OFFSET_PX}px`,\r\n top: `${r.top + r.height / 2}px`,\r\n transform: 'translateX(-100%) translateY(-50%)',\r\n };\r\n } else {\r\n return {\r\n left: `${r.right + OFFSET_PX}px`,\r\n top: `${r.top + r.height / 2}px`,\r\n transform: 'translateY(-50%)',\r\n };\r\n }\r\n}\r\n\r\nconst TooltipPortalMain: Component<TooltipPortalProps> = p => {\r\n const id = createUniqueId();\r\n p = mergeProps(\r\n {\r\n position: 'top' as const,\r\n color: 'neutral' as const,\r\n },\r\n p,\r\n );\r\n\r\n const [isHovered, setIsHovered] = createSignal(false);\r\n\r\n const onTriggerMount = (el: HTMLDivElement) => {\r\n const position = p.position ?? 'top';\r\n const updateCoords = () => setPortalBubbleStyle(calcPortalStyle(el, position));\r\n el.setAttribute('tt', id);\r\n\r\n const handle = { cancelled: false, doCleanup: undefined as (() => void) | undefined };\r\n\r\n const register = () => {\r\n if (handle.cancelled) return;\r\n\r\n const root = document.getElementById(p.containerId);\r\n if (!root) return;\r\n\r\n let state = containerMap.get(root);\r\n if (!state) {\r\n state = { count: 0, entries: new Map() };\r\n containerMap.set(root, state);\r\n }\r\n state.entries.set(id, { setHovered: setIsHovered, updateCoords });\r\n state.count += 1;\r\n if (state.count === 1) attachToContainer(root, state);\r\n\r\n handle.doCleanup = () => {\r\n const s = containerMap.get(root);\r\n if (!s) return;\r\n s.entries.delete(id);\r\n s.count -= 1;\r\n el.removeAttribute('tt');\r\n if (s.count === 0) {\r\n detachFromContainer(root);\r\n containerMap.delete(root);\r\n }\r\n };\r\n };\r\n\r\n queueMicrotask(register);\r\n onCleanup(function cancelAndDetachTrigger() {\r\n handle.cancelled = true;\r\n handle.doCleanup?.();\r\n });\r\n };\r\n\r\n return (\r\n <div\r\n ref={onTriggerMount}\r\n class={cn(\r\n 'too01',\r\n tooltipVariants({ color: p.color, position: p.position }),\r\n getColor(p.color),\r\n 'too04',\r\n p.class?.root,\r\n )}\r\n {...(p.content && !p.customContent && { ['data-tip']: p.content })}\r\n >\r\n <Switch>\r\n <Match when={p.content}>\r\n <ZIndex\r\n type={ZIndexType.TOOLTIP}\r\n open={isHovered()}\r\n position={portalBubbleStyle()}\r\n class={cn('too05', getColor(p.color), p.class?.content)}\r\n blockScroll={false}\r\n customValue={p.zIndex}\r\n >\r\n {p.content}\r\n </ZIndex>\r\n </Match>\r\n <Match when={p.customContent}>\r\n <ZIndex\r\n type={ZIndexType.TOOLTIP}\r\n open={isHovered()}\r\n position={portalBubbleStyle()}\r\n class={cn('too05', p.class?.content)}\r\n customValue={p.zIndex}\r\n >\r\n {p.customContent}\r\n </ZIndex>\r\n </Match>\r\n </Switch>\r\n {p.children as JSX.Element}\r\n </div>\r\n );\r\n};\r\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{cn as e}from"../../utils/cn.js";import{createThrottle as t}from"../../utils/helper.js";import{ZIndexType as n}from"../z-index/z-index.types.js";import{ZIndex as r}from"../z-index/z-index.js";import{x_default as i}from"
|
|
1
|
+
import{cn as e}from"../../utils/cn.js";import{createThrottle as t}from"../../utils/helper.js";import{ZIndexType as n}from"../z-index/z-index.types.js";import{ZIndex as r}from"../z-index/z-index.js";import{x_default as i}from"../../../node_modules/.pnpm/lucide-solid@1.8.0_solid-js@1.9.11/node_modules/lucide-solid/dist/source/icons/x.js";import{addEventListener as a,className as o,createComponent as s,delegateEvents as c,effect as l,insert as u,memo as d,mergeProps as f,setAttribute as p,style as m,template as h,use as g}from"solid-js/web";import{For as _,Show as v,createEffect as y,createSignal as b,mergeProps as x,onCleanup as S,onMount as C}from"solid-js";var w=h(`<div>`),T=h(`<button class=tr04-close aria-label="Close tour">`),E=h(`<button class="btn btn-sm btn-ghost">`),D=h(`<div><div class="ml-auto flex gap-2"><button class="btn btn-sm btn-primary">`),O=h(`<div><div><span class=tr04-title>`),k=h(`<span>`);function A(e,t){let n=document.getElementById(e);if(!n)return null;let r=n.getBoundingClientRect();return{top:r.top-t,left:r.left-t,width:r.width+t*2,height:r.height+t*2}}function j(e){let{top:t,left:n,width:r,height:i}=e,a=n+r,o=t+i;return`polygon(
|
|
2
2
|
0% 0%, 100% 0%, 100% 100%, 0% 100%, 0% 0%,
|
|
3
3
|
${n}px ${t}px,
|
|
4
4
|
${n}px ${o}px,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tour.js","names":["ZIndex","ZIndexType","cn","createThrottle","X","createEffect","createSignal","For","mergeProps","onCleanup","onMount","Show","TourAPI","TourPlacement","TourProps","TourStep","SpotlightRect","top","left","width","height","getElementRect","targetId","padding","el","document","getElementById","rect","getBoundingClientRect","buildClipPath","right","bottom","PopupPosition","arrowOffset","POPUP_MARGIN","POPUP_WIDTH","computePopupPosition","spotRect","placement","popupHeight","vw","window","innerWidth","vh","innerHeight","pTop","pLeft","centerX","centerY","Math","max","min","InternalTourProps","activeStep","visible","onClose","onNext","onPrev","TourComponent","rawProps","props","showClose","showProgress","maskClosable","prevLabel","nextLabel","doneLabel","setSpotRect","popupPos","setPopupPos","setPopupHeight","popupRef","HTMLDivElement","currentStep","steps","isLastStep","length","recalculate","step","spotlightPadding","ph","offsetHeight","target","throttledRecalc","trackStepChange","_step","scrollIntoView","block","behavior","timer","ReturnType","setTimeout","undefined","cancelStepTimer","clearTimeout","registerResizeListener","addEventListener","removeResizeListener","removeEventListener","cancel","maskStyle","popupStyle","handleMaskClick","_$createComponent","type","OVERLAY","open","blockScroll","children","_el$","_tmpl$","$$click","_$effect","_$className","class","mask","_el$2","_p$","_v$","spotlight","_v$2","e","t","_$style","_el$3","_tmpl$5","_el$4","firstChild","_el$5","_ref$","_$use","_$insert","title","when","_el$6","_tmpl$2","_$addEventListener","size","content","_el$7","body","footer","fallback","_el$11","_el$8","_tmpl$4","_el$0","_el$10","_el$9","each","_","i","_el$12","_tmpl$6","progress","_el$1","_tmpl$3","_c$","_$memo","_v$3","popup","_v$4","_v$5","_v$6","header","a","_$setAttribute","o","createTour","tourProps","JSX","Element","setActiveStep","setVisible","start","stepIndex","onEnter","onStepChange","stop","onLeave","next","cur","nextStep","onFinish","prev","prevStep","goTo","api","isActive","TourRenderer","_$mergeProps","_$delegateEvents"],"sources":["../../../../src/components/tour/tour.tsx"],"sourcesContent":["import { ZIndex, ZIndexType } from '@components/z-index';\r\nimport { cn } from '@utils/cn';\r\nimport { createThrottle } from '@utils/helper';\r\nimport X from 'lucide-solid/icons/x';\r\nimport { createEffect, createSignal, For, mergeProps, onCleanup, onMount, Show } from 'solid-js';\r\nimport { TourAPI, TourPlacement, TourProps, TourStep } from './tour.types';\r\n\r\ninterface SpotlightRect {\r\n top: number;\r\n left: number;\r\n width: number;\r\n height: number;\r\n}\r\n\r\nfunction getElementRect(targetId: string, padding: number): SpotlightRect | null {\r\n const el = document.getElementById(targetId);\r\n if (!el) return null;\r\n const rect = el.getBoundingClientRect();\r\n return {\r\n top: rect.top - padding,\r\n left: rect.left - padding,\r\n width: rect.width + padding * 2,\r\n height: rect.height + padding * 2,\r\n };\r\n}\r\n\r\nfunction buildClipPath(rect: SpotlightRect): string {\r\n const { top, left, width, height } = rect;\r\n const right = left + width;\r\n const bottom = top + height;\r\n\r\n return `polygon(\r\n 0% 0%, 100% 0%, 100% 100%, 0% 100%, 0% 0%,\r\n ${left}px ${top}px,\r\n ${left}px ${bottom}px,\r\n ${right}px ${bottom}px,\r\n ${right}px ${top}px,\r\n ${left}px ${top}px\r\n )`;\r\n}\r\n\r\ninterface PopupPosition {\r\n top: number;\r\n left: number;\r\n arrowOffset: string;\r\n}\r\n\r\nconst POPUP_MARGIN = 12;\r\nconst POPUP_WIDTH = 340;\r\n\r\nfunction computePopupPosition(\r\n spotRect: SpotlightRect,\r\n placement: TourPlacement,\r\n popupHeight: number,\r\n): PopupPosition {\r\n const vw = window.innerWidth;\r\n const vh = window.innerHeight;\r\n\r\n const { top, left, width, height } = spotRect;\r\n let pTop = 0;\r\n let pLeft = 0;\r\n let arrowOffset = '50%';\r\n\r\n const centerX = left + width / 2;\r\n const centerY = top + height / 2;\r\n\r\n switch (placement) {\r\n case 'bottom':\r\n case 'bottom-start':\r\n case 'bottom-end':\r\n pTop = top + height + POPUP_MARGIN;\r\n pLeft =\r\n placement === 'bottom-start'\r\n ? left\r\n : placement === 'bottom-end'\r\n ? left + width - POPUP_WIDTH\r\n : centerX - POPUP_WIDTH / 2;\r\n arrowOffset = `${centerX - Math.max(16, Math.min(pLeft, pLeft))}px`;\r\n break;\r\n\r\n case 'top':\r\n case 'top-start':\r\n case 'top-end':\r\n pTop = top - popupHeight - POPUP_MARGIN;\r\n pLeft =\r\n placement === 'top-start'\r\n ? left\r\n : placement === 'top-end'\r\n ? left + width - POPUP_WIDTH\r\n : centerX - POPUP_WIDTH / 2;\r\n arrowOffset = `${centerX - Math.max(16, Math.min(pLeft, pLeft))}px`;\r\n break;\r\n\r\n case 'left':\r\n case 'left-start':\r\n case 'left-end':\r\n pTop =\r\n placement === 'left-start'\r\n ? top\r\n : placement === 'left-end'\r\n ? top + height - popupHeight\r\n : centerY - popupHeight / 2;\r\n pLeft = left - POPUP_WIDTH - POPUP_MARGIN;\r\n arrowOffset = `${centerY - pTop}px`;\r\n break;\r\n\r\n case 'right':\r\n case 'right-start':\r\n case 'right-end':\r\n pTop =\r\n placement === 'right-start'\r\n ? top\r\n : placement === 'right-end'\r\n ? top + height - popupHeight\r\n : centerY - popupHeight / 2;\r\n pLeft = left + width + POPUP_MARGIN;\r\n arrowOffset = `${centerY - pTop}px`;\r\n break;\r\n }\r\n\r\n pLeft = Math.max(16, Math.min(pLeft, vw - POPUP_WIDTH - 16));\r\n pTop = Math.max(16, Math.min(pTop, vh - popupHeight - 16));\r\n\r\n return { top: pTop, left: pLeft, arrowOffset };\r\n}\r\n\r\ninterface InternalTourProps extends TourProps {\r\n activeStep: () => number;\r\n visible: () => boolean;\r\n onClose: () => void;\r\n onNext: () => void;\r\n onPrev: () => void;\r\n}\r\n\r\nconst TourComponent = (rawProps: InternalTourProps) => {\r\n const props = mergeProps(\r\n {\r\n showClose: true,\r\n showProgress: true,\r\n maskClosable: false,\r\n prevLabel: 'Prev',\r\n nextLabel: 'Next',\r\n doneLabel: 'Done',\r\n },\r\n rawProps,\r\n );\r\n\r\n const [spotRect, setSpotRect] = createSignal<SpotlightRect>({\r\n top: 0,\r\n left: 0,\r\n width: 0,\r\n height: 0,\r\n });\r\n const [popupPos, setPopupPos] = createSignal<PopupPosition>({\r\n top: 0,\r\n left: 0,\r\n arrowOffset: '50%',\r\n });\r\n const [popupHeight, setPopupHeight] = createSignal(200);\r\n\r\n let popupRef: HTMLDivElement | undefined;\r\n\r\n const currentStep = (): TourStep | undefined => props.steps[props.activeStep()];\r\n const isLastStep = () => props.activeStep() === props.steps.length - 1;\r\n\r\n function recalculate() {\r\n const step = currentStep();\r\n if (!step) return;\r\n\r\n const padding = step.spotlightPadding ?? 8;\r\n const placement = step.placement ?? 'bottom';\r\n const ph = popupRef?.offsetHeight ?? popupHeight();\r\n\r\n const rect = getElementRect(step.target, padding);\r\n if (!rect) return;\r\n setSpotRect(rect);\r\n setPopupPos(computePopupPosition(rect, placement, ph));\r\n }\r\n\r\n const throttledRecalc = createThrottle(recalculate, 60);\r\n\r\n createEffect(function trackStepChange() {\r\n if (!props.visible()) return;\r\n\r\n const _step = props.activeStep();\r\n void _step;\r\n\r\n const step = currentStep();\r\n if (step?.target) {\r\n const el = document.getElementById(step.target);\r\n el?.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\r\n }\r\n\r\n let timer: ReturnType<typeof setTimeout> | undefined = setTimeout(() => {\r\n timer = undefined;\r\n if (popupRef) setPopupHeight(popupRef.offsetHeight);\r\n recalculate();\r\n }, 80);\r\n onCleanup(function cancelStepTimer() {\r\n if (timer !== undefined) {\r\n clearTimeout(timer);\r\n timer = undefined;\r\n }\r\n });\r\n });\r\n\r\n onMount(function registerResizeListener() {\r\n window.addEventListener('resize', throttledRecalc);\r\n window.addEventListener('scroll', throttledRecalc, true);\r\n onCleanup(function removeResizeListener() {\r\n window.removeEventListener('resize', throttledRecalc);\r\n window.removeEventListener('scroll', throttledRecalc, true);\r\n throttledRecalc.cancel();\r\n });\r\n });\r\n\r\n const maskStyle = () => ({ 'clip-path': buildClipPath(spotRect()) });\r\n\r\n const popupStyle = () => {\r\n const { top, left, arrowOffset } = popupPos();\r\n return {\r\n top: `${top}px`,\r\n left: `${left}px`,\r\n width: `${POPUP_WIDTH}px`,\r\n '--arrow-offset': arrowOffset,\r\n };\r\n };\r\n\r\n const handleMaskClick = () => {\r\n if (props.maskClosable) props.onClose();\r\n };\r\n\r\n return (\r\n <ZIndex type={ZIndexType.OVERLAY} open={props.visible()} blockScroll>\r\n <div class={cn('tr01', props.class?.mask)} onClick={handleMaskClick} />\r\n\r\n <div class={cn('tr02', props.class?.spotlight)} style={maskStyle()} />\r\n\r\n <div\r\n ref={popupRef}\r\n class={cn('tr03', props.class?.popup)}\r\n style={popupStyle()}\r\n data-placement={currentStep()?.placement ?? 'bottom'}\r\n >\r\n <div class={cn('tr04', props.class?.header)}>\r\n <span class=\"tr04-title\">{currentStep()?.title}</span>\r\n <Show when={props.showClose}>\r\n <button class=\"tr04-close\" onClick={props.onClose} aria-label=\"Close tour\">\r\n <X size={14} />\r\n </button>\r\n </Show>\r\n </div>\r\n\r\n <Show when={currentStep()?.content}>\r\n <div class={cn('tr05', props.class?.body)}>{currentStep()?.content}</div>\r\n </Show>\r\n\r\n <Show\r\n when={!currentStep()?.footer}\r\n fallback={<div class={cn('tr06', props.class?.footer)}>{currentStep()?.footer}</div>}\r\n >\r\n <div class={cn('tr06', props.class?.footer)}>\r\n <Show when={props.showProgress}>\r\n <div class={cn('tr07', props.class?.progress)}>\r\n <For each={props.steps}>\r\n {(_, i) => (\r\n <span class={cn('tr07-dot', i() === props.activeStep() && 'active')} />\r\n )}\r\n </For>\r\n </div>\r\n </Show>\r\n\r\n <div class=\"ml-auto flex gap-2\">\r\n <Show when={props.activeStep() > 0}>\r\n <button class=\"btn btn-sm btn-ghost\" onClick={props.onPrev}>\r\n {props.prevLabel}\r\n </button>\r\n </Show>\r\n <button\r\n class=\"btn btn-sm btn-primary\"\r\n onClick={isLastStep() ? props.onClose : props.onNext}\r\n >\r\n {isLastStep() ? props.doneLabel : props.nextLabel}\r\n </button>\r\n </div>\r\n </div>\r\n </Show>\r\n </div>\r\n </ZIndex>\r\n );\r\n};\r\n\r\nexport function createTour(tourProps: TourProps): [TourAPI, () => import('solid-js').JSX.Element] {\r\n const [activeStep, setActiveStep] = createSignal(0);\r\n const [visible, setVisible] = createSignal(false);\r\n\r\n function start(stepIndex = 0) {\r\n setActiveStep(stepIndex);\r\n setVisible(true);\r\n tourProps.steps[stepIndex]?.onEnter?.(stepIndex);\r\n tourProps.onStepChange?.(stepIndex);\r\n }\r\n\r\n function stop() {\r\n const step = activeStep();\r\n tourProps.steps[step]?.onLeave?.(step);\r\n setVisible(false);\r\n tourProps.onClose?.(step);\r\n }\r\n\r\n function next() {\r\n const cur = activeStep();\r\n tourProps.steps[cur]?.onLeave?.(cur);\r\n const nextStep = cur + 1;\r\n if (nextStep >= tourProps.steps.length) {\r\n setVisible(false);\r\n tourProps.onFinish?.();\r\n return;\r\n }\r\n setActiveStep(nextStep);\r\n tourProps.steps[nextStep]?.onEnter?.(nextStep);\r\n tourProps.onStepChange?.(nextStep);\r\n }\r\n\r\n function prev() {\r\n const cur = activeStep();\r\n if (cur <= 0) return;\r\n tourProps.steps[cur]?.onLeave?.(cur);\r\n const prevStep = cur - 1;\r\n setActiveStep(prevStep);\r\n tourProps.steps[prevStep]?.onEnter?.(prevStep);\r\n tourProps.onStepChange?.(prevStep);\r\n }\r\n\r\n function goTo(stepIndex: number) {\r\n if (stepIndex < 0 || stepIndex >= tourProps.steps.length) return;\r\n const cur = activeStep();\r\n tourProps.steps[cur]?.onLeave?.(cur);\r\n setActiveStep(stepIndex);\r\n tourProps.steps[stepIndex]?.onEnter?.(stepIndex);\r\n tourProps.onStepChange?.(stepIndex);\r\n }\r\n\r\n const api: TourAPI = {\r\n start,\r\n stop,\r\n next,\r\n prev,\r\n goTo,\r\n isActive: visible,\r\n currentStep: activeStep,\r\n };\r\n\r\n const TourRenderer = () => (\r\n <TourComponent\r\n {...tourProps}\r\n activeStep={activeStep}\r\n visible={visible}\r\n onClose={stop}\r\n onNext={next}\r\n onPrev={prev}\r\n />\r\n );\r\n\r\n return [api, TourRenderer];\r\n}\r\n"],"mappings":"25BAcA,SAASqB,EAAeC,EAAkBC,EAAuC,CAC/E,IAAMC,EAAKC,SAASC,eAAeJ,EAAS,CAC5C,GAAI,CAACE,EAAI,OAAO,KAChB,IAAMG,EAAOH,EAAGI,uBAAuB,CACvC,MAAO,CACLX,IAAKU,EAAKV,IAAMM,EAChBL,KAAMS,EAAKT,KAAOK,EAClBJ,MAAOQ,EAAKR,MAAQI,EAAU,EAC9BH,OAAQO,EAAKP,OAASG,EAAU,EACjC,CAGH,SAASM,EAAcF,EAA6B,CAClD,GAAM,CAAEV,MAAKC,OAAMC,QAAOC,UAAWO,EAC/BG,EAAQZ,EAAOC,EACfY,EAASd,EAAMG,EAErB,MAAO;;MAEHF,EAAI,KAAMD,EAAG;MACbC,EAAI,KAAMa,EAAM;MAChBD,EAAK,KAAMC,EAAM;MACjBD,EAAK,KAAMb,EAAG;MACdC,EAAI,KAAMD,EAAG;KAUnB,IAAMiB,EAAe,GACfC,EAAc,IAEpB,SAASC,EACPC,EACAC,EACAC,EACe,CACf,IAAMC,EAAKC,OAAOC,WACZC,EAAKF,OAAOG,YAEZ,CAAE3B,MAAKC,OAAMC,QAAOC,UAAWiB,EACjCQ,EAAO,EACPC,EAAQ,EACRb,EAAc,MAEZc,EAAU7B,EAAOC,EAAQ,EACzB6B,EAAU/B,EAAMG,EAAS,EAE/B,OAAQkB,EAAR,CACE,IAAK,SACL,IAAK,eACL,IAAK,aACHO,EAAO5B,EAAMG,EAASc,EACtBY,EACER,IAAc,eACVpB,EACAoB,IAAc,aACZpB,EAAOC,EAAQgB,EACfY,EAAUZ,EAAc,EAChCF,EAAc,GAAGc,EAAUE,KAAKC,IAAI,GAAID,KAAKE,IAAIL,EAAOA,EAAM,CAAC,CAAA,IAC/D,MAEF,IAAK,MACL,IAAK,YACL,IAAK,UACHD,EAAO5B,EAAMsB,EAAcL,EAC3BY,EACER,IAAc,YACVpB,EACAoB,IAAc,UACZpB,EAAOC,EAAQgB,EACfY,EAAUZ,EAAc,EAChCF,EAAc,GAAGc,EAAUE,KAAKC,IAAI,GAAID,KAAKE,IAAIL,EAAOA,EAAM,CAAC,CAAA,IAC/D,MAEF,IAAK,OACL,IAAK,aACL,IAAK,WACHD,EACEP,IAAc,aACVrB,EACAqB,IAAc,WACZrB,EAAMG,EAASmB,EACfS,EAAUT,EAAc,EAChCO,EAAQ5B,EAAOiB,EAAcD,EAC7BD,EAAc,GAAGe,EAAUH,EAAI,IAC/B,MAEF,IAAK,QACL,IAAK,cACL,IAAK,YACHA,EACEP,IAAc,cACVrB,EACAqB,IAAc,YACZrB,EAAMG,EAASmB,EACfS,EAAUT,EAAc,EAChCO,EAAQ5B,EAAOC,EAAQe,EACvBD,EAAc,GAAGe,EAAUH,EAAI,IAC/B,MAMJ,MAHAC,GAAQG,KAAKC,IAAI,GAAID,KAAKE,IAAIL,EAAON,EAAKL,EAAc,GAAG,CAAC,CAC5DU,EAAOI,KAAKC,IAAI,GAAID,KAAKE,IAAIN,EAAMF,EAAKJ,EAAc,GAAG,CAAC,CAEnD,CAAEtB,IAAK4B,EAAM3B,KAAM4B,EAAOb,cAAa,CAWhD,IAAMyB,EAAiBC,GAAgC,CACrD,IAAMC,EAAQpD,EACZ,CACEqD,UAAW,GACXC,aAAc,GACdC,aAAc,GACdC,UAAW,OACXC,UAAW,OACXC,UAAW,OACZ,CACDP,EACD,CAEK,CAACtB,EAAU8B,GAAe7D,EAA4B,CAC1DW,IAAK,EACLC,KAAM,EACNC,MAAO,EACPC,OAAQ,EACT,CAAC,CACI,CAACgD,EAAUC,GAAe/D,EAA4B,CAC1DW,IAAK,EACLC,KAAM,EACNe,YAAa,MACd,CAAC,CACI,CAACM,EAAa+B,GAAkBhE,EAAa,IAAI,CAEnDiE,EAEEE,MAA0Cb,EAAMc,MAAMd,EAAMP,YAAY,EACxEsB,MAAmBf,EAAMP,YAAY,GAAKO,EAAMc,MAAME,OAAS,EAErE,SAASC,GAAc,CACrB,IAAMC,EAAOL,GAAa,CAC1B,GAAI,CAACK,EAAM,OAEX,IAAMvD,EAAUuD,EAAKC,kBAAoB,EACnCzC,EAAYwC,EAAKxC,WAAa,SAC9B0C,EAAKT,GAAUU,cAAgB1C,GAAa,CAE5CZ,EAAON,EAAeyD,EAAKI,OAAQ3D,EAAQ,CAC5CI,IACLwC,EAAYxC,EAAK,CACjB0C,EAAYjC,EAAqBT,EAAMW,EAAW0C,EAAG,CAAC,EAGxD,IAAMG,EAAkBhF,EAAe0E,EAAa,GAAG,CAEvDxE,EAAa,UAA2B,CACtC,GAAI,CAACuD,EAAMN,SAAS,CAAE,OAERM,EAAMP,YAAY,CAGhC,IAAMyB,EAAOL,GAAa,CACtBK,GAAMI,QACGzD,SAASC,eAAeoD,EAAKI,OAAO,EAC3CI,eAAe,CAAEC,MAAO,UAAWC,SAAU,SAAU,CAAC,CAG9D,IAAIC,EAAmDE,eAAiB,CACtEF,EAAQG,IAAAA,GACJrB,GAAUD,EAAeC,EAASU,aAAa,CACnDJ,GAAa,EACZ,GAAG,CACNpE,EAAU,UAA2B,CAC/BgF,IAAUG,IAAAA,KACZE,aAAaL,EAAM,CACnBA,EAAQG,IAAAA,KAEV,EACF,CAEFlF,EAAQ,UAAkC,CACxC+B,OAAOuD,iBAAiB,SAAUb,EAAgB,CAClD1C,OAAOuD,iBAAiB,SAAUb,EAAiB,GAAK,CACxD1E,EAAU,UAAgC,CACxCgC,OAAOyD,oBAAoB,SAAUf,EAAgB,CACrD1C,OAAOyD,oBAAoB,SAAUf,EAAiB,GAAK,CAC3DA,EAAgBgB,QAAQ,EACxB,EACF,CAEF,IAAMC,OAAmB,CAAE,YAAavE,EAAcQ,GAAU,CAAA,CAAG,EAE7DgE,MAAmB,CACvB,GAAM,CAAEpF,MAAKC,OAAMe,eAAgBmC,GAAU,CAC7C,MAAO,CACLnD,IAAK,GAAGA,EAAG,IACXC,KAAM,GAAGA,EAAI,IACbC,MAAO,GAAGgB,EAAW,IACrB,iBAAkBF,EACnB,EAGGqE,MAAwB,CACxB1C,EAAMG,cAAcH,EAAML,SAAS,EAGzC,OAAAgD,EACGvG,EAAM,CAAA,IAACwG,MAAI,CAAA,OAAEvG,EAAWwG,SAAO,IAAEC,MAAI,CAAA,OAAE9C,EAAMN,SAAS,EAAEqD,YAAW,GAAA,IAAAC,UAAA,CAAA,MAAA,MAAA,CAAA,IAAAC,EAAAC,GAAA,CACzB,MADyBD,GAAAE,QACdT,EAAeU,MAAAC,EAAAJ,EAAvD3G,EAAG,OAAQ0D,EAAMsD,OAAOC,KAAK,CAAA,CAAA,CAAAN,KAAA,MAAA,CAAA,IAAAO,EAAAN,GAAA,CAEyB,OAFzBE,EAAAK,GAAA,CAAA,IAAAC,EAE7BpH,EAAG,OAAQ0D,EAAMsD,OAAOK,UAAU,CAAAC,EAASpB,GAAW,CAAA,OAAAkB,IAAAD,EAAAI,GAAAR,EAAAG,EAAAC,EAAAI,EAAAH,EAAA,CAAAD,EAAAK,EAAAC,EAAAP,EAAAI,EAAAH,EAAAK,EAAA,CAAAL,GAAA,CAAAI,EAAA7B,IAAAA,GAAA8B,EAAA9B,IAAAA,GAAA,CAAA,CAAAwB,KAAA,MAAA,CAAA,IAAAQ,EAAAC,GAAA,CAAAC,EAAAF,EAAAG,WAAAC,EAAAF,EAAAC,WAAAE,EAG3D1D,EAKsC,OAL9B,OAAA0D,GAAA,WAAAC,EAAAD,EAAAL,EAAA,CAARrD,EAAQqD,EAAAO,EAAAH,MAMevD,GAAa,EAAE2D,MAAK,CAAAD,EAAAL,EAAAvB,EAC7C5F,EAAI,CAAA,IAAC0H,MAAI,CAAA,OAAEzE,EAAMC,WAAS,IAAA+C,UAAA,CAAA,IAAA0B,EAAAC,GAAA,CAEZ,OAFYC,EAAAF,EAAA,QACW1E,EAAML,QAAO,GAAA,CAAA4E,EAAAG,EAAA/B,EAC9CnG,EAAC,CAACqI,KAAM,GAAE,CAAA,CAAA,CAAAH,GAAA,CAAA,CAAA,KAAA,CAAAH,EAAAP,EAAArB,EAKhB5F,EAAI,CAAA,IAAC0H,MAAI,CAAA,OAAE5D,GAAa,EAAEiE,SAAO,IAAA9B,UAAA,CAAA,IAAA+B,EAAA7B,GAAA,CACS,OADTqB,EAAAQ,MACYlE,GAAa,EAAEiE,QAAO,CAAA1B,MAAAC,EAAA0B,EAAtDzI,EAAG,OAAQ0D,EAAMsD,OAAO0B,KAAK,CAAA,CAAA,CAAAD,GAAA,CAAA,CAAA,KAAA,CAAAR,EAAAP,EAAArB,EAG1C5F,EAAI,CAAA,IACH0H,MAAI,CAAA,MAAE,CAAC5D,GAAa,EAAEoE,QAAM,IAC5BC,UAAQ,CAAA,WAAA,CAAA,IAAAC,EAAAjC,GAAA,CAA6C,OAA7CqB,EAAAY,MAAgDtE,GAAa,EAAEoE,OAAM,CAAA7B,MAAAC,EAAA8B,EAAvD7I,EAAG,OAAQ0D,EAAMsD,OAAO2B,OAAO,CAAA,CAAA,CAAAE,KAAA,EAAA,IAAAnC,UAAA,CAAA,IAAAoC,EAAAC,GAAA,CAAAC,EAAAF,EAAAjB,WAAAoB,EAAAD,EAAAnB,WAEV,OAFUI,EAAAa,EAAAzC,EAGlD5F,EAAI,CAAA,IAAC0H,MAAI,CAAA,OAAEzE,EAAME,cAAY,IAAA8C,UAAA,CAAA,IAAAwC,EAAAtC,GAAA,CACiB,OADjBqB,EAAAiB,EAAA7C,EAEzBhG,EAAG,CAAA,IAAC8I,MAAI,CAAA,OAAEzF,EAAMc,OAAKkC,UAClB0C,EAAGC,SAAC,CAAA,IAAAC,EAAAC,GAAA,CAC+D,OAD/DzC,MAAAC,EAAAuC,EACStJ,EAAG,WAAYqJ,GAAG,GAAK3F,EAAMP,YAAY,EAAI,SAAS,CAAA,CAAA,CAAAmG,KAAA,CACpE,CAAA,CAAA,CAAAxC,MAAAC,EAAAmC,EAJOlJ,EAAG,OAAQ0D,EAAMsD,OAAOwC,SAAS,CAAA,CAAA,CAAAN,GAAA,CAAA,CAAAF,EAAA,CAAAf,EAAAe,EAAA3C,EAU5C5F,EAAI,CAAA,IAAC0H,MAAI,CAAA,OAAEzE,EAAMP,YAAY,CAAG,GAAC,IAAAuD,UAAA,CAAA,IAAA+C,EAAAC,GAAA,CAEd,OAFcpB,EAAAmB,EAAA,QACc/F,EAAMH,OAAM,GAAA,CAAA0E,EAAAwB,MACvD/F,EAAMI,UAAS,CAAA2F,GAAA,CAAA,CAAAR,EAAA,CAAAX,EAAAW,EAAA,QAKTxE,GAAY,CAAGf,EAAML,QAAUK,EAAMJ,OAAM,GAAA,CAAA2E,EAAAgB,OAAA,CAAA,IAAAU,EAAAC,MAAA,CAAA,CAEnDnF,GAAY,CAAA,CAAA,UAAZkF,GAAA,CAAejG,EAAMM,UAAYN,EAAMK,aAAS,CAAA,CAAA+C,MAAAC,EAAA+B,EArB3C9I,EAAG,OAAQ0D,EAAMsD,OAAO2B,OAAO,CAAA,CAAA,CAAAG,GAAA,CAAA,CAAA,KAAA,CAAAhC,EAAAK,GAAA,CAAA,IAAA0C,EArBtC7J,EAAG,OAAQ0D,EAAMsD,OAAO8C,MAAM,CAAAC,EAC9B5D,GAAY,CAAA6D,EACHzF,GAAa,EAAEnC,WAAa,SAAQ6H,EAExCjK,EAAG,OAAQ0D,EAAMsD,OAAOkD,OAAO,CAAA,OAAAL,IAAA1C,EAAAI,GAAAR,EAAAW,EAAAP,EAAAI,EAAAsC,EAAA,CAAA1C,EAAAK,EAAAC,EAAAC,EAAAqC,EAAA5C,EAAAK,EAAA,CAAAwC,IAAA7C,EAAAgD,GAAAC,EAAA1C,EAAA,iBAAAP,EAAAgD,EAAAH,EAAA,CAAAC,IAAA9C,EAAAkD,GAAAtD,EAAAa,EAAAT,EAAAkD,EAAAJ,EAAA,CAAA9C,GAAA,CAAAI,EAAA7B,IAAAA,GAAA8B,EAAA9B,IAAAA,GAAAyE,EAAAzE,IAAAA,GAAA2E,EAAA3E,IAAAA,GAAA,CAAA,CAAAgC,KAAA,CAAA,EAAA,CAAA,EAgDnD,SAAgB4C,EAAWC,EAAuE,CAChG,GAAM,CAACpH,EAAYuH,GAAiBtK,EAAa,EAAE,CAC7C,CAACgD,EAASuH,GAAcvK,EAAa,GAAM,CAEjD,SAASwK,EAAMC,EAAY,EAAG,CAC5BH,EAAcG,EAAU,CACxBF,EAAW,GAAK,CAChBJ,EAAU/F,MAAMqG,IAAYC,UAAUD,EAAU,CAChDN,EAAUQ,eAAeF,EAAU,CAGrC,SAASG,GAAO,CACd,IAAMpG,EAAOzB,GAAY,CACzBoH,EAAU/F,MAAMI,IAAOqG,UAAUrG,EAAK,CACtC+F,EAAW,GAAM,CACjBJ,EAAUlH,UAAUuB,EAAK,CAG3B,SAASsG,GAAO,CACd,IAAMC,EAAMhI,GAAY,CACxBoH,EAAU/F,MAAM2G,IAAMF,UAAUE,EAAI,CACpC,IAAMC,EAAWD,EAAM,EACvB,GAAIC,GAAYb,EAAU/F,MAAME,OAAQ,CACtCiG,EAAW,GAAM,CACjBJ,EAAUc,YAAY,CACtB,OAEFX,EAAcU,EAAS,CACvBb,EAAU/F,MAAM4G,IAAWN,UAAUM,EAAS,CAC9Cb,EAAUQ,eAAeK,EAAS,CAGpC,SAASE,GAAO,CACd,IAAMH,EAAMhI,GAAY,CACxB,GAAIgI,GAAO,EAAG,OACdZ,EAAU/F,MAAM2G,IAAMF,UAAUE,EAAI,CACpC,IAAMI,EAAWJ,EAAM,EACvBT,EAAca,EAAS,CACvBhB,EAAU/F,MAAM+G,IAAWT,UAAUS,EAAS,CAC9ChB,EAAUQ,eAAeQ,EAAS,CAGpC,SAASC,EAAKX,EAAmB,CAC/B,GAAIA,EAAY,GAAKA,GAAaN,EAAU/F,MAAME,OAAQ,OAC1D,IAAMyG,EAAMhI,GAAY,CACxBoH,EAAU/F,MAAM2G,IAAMF,UAAUE,EAAI,CACpCT,EAAcG,EAAU,CACxBN,EAAU/F,MAAMqG,IAAYC,UAAUD,EAAU,CAChDN,EAAUQ,eAAeF,EAAU,CAwBrC,MAAO,CArBc,CACnBD,QACAI,OACAE,OACAI,OACAE,OACAE,SAAUtI,EACVmB,YAAapB,EACd,KAEoBkD,EAClB7C,EAAaoI,EACRrB,EAAS,CACDpH,aACHC,UACTC,QAAS2H,EACT1H,OAAQ4H,EACR3H,OAAQ+H,EAAI,CAAA,CAEf,CAEyB,CAC3BO,EAAA,CAAA,QAAA,CAAA"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{cn as e}from"../../utils/cn.js";import{x_default as t}from"../../../node_modules/.pnpm/lucide-solid@1.8.0_solid-js@1.9.11/node_modules/lucide-solid/dist/source/icons/x.js";import{zoom_in_default as n}from"../../../node_modules/.pnpm/lucide-solid@1.8.0_solid-js@1.9.11/node_modules/lucide-solid/dist/source/icons/zoom-in.js";import{ImagePreview as r}from"../image-preview/image-preview.js";import{Spinner as i}from"../loading/loading.js";import{Tooltip as a}from"../tooltip/tooltip.js";import{circle_check_default as o}from"../../../node_modules/.pnpm/lucide-solid@1.8.0_solid-js@1.9.11/node_modules/lucide-solid/dist/source/icons/circle-check.js";import{circle_x_default as s}from"../../../node_modules/.pnpm/lucide-solid@1.8.0_solid-js@1.9.11/node_modules/lucide-solid/dist/source/icons/circle-x.js";import{cloud_upload_default as c}from"../../../node_modules/.pnpm/lucide-solid@1.8.0_solid-js@1.9.11/node_modules/lucide-solid/dist/source/icons/cloud-upload.js";import{eye_default as l}from"../../../node_modules/.pnpm/lucide-solid@1.8.0_solid-js@1.9.11/node_modules/lucide-solid/dist/source/icons/eye.js";import{file_default as u}from"../../../node_modules/.pnpm/lucide-solid@1.8.0_solid-js@1.9.11/node_modules/lucide-solid/dist/source/icons/file.js";import{file_image_default as d}from"../../../node_modules/.pnpm/lucide-solid@1.8.0_solid-js@1.9.11/node_modules/lucide-solid/dist/source/icons/file-image.js";import{file_text_default as f}from"../../../node_modules/.pnpm/lucide-solid@1.8.0_solid-js@1.9.11/node_modules/lucide-solid/dist/source/icons/file-text.js";import{film_default as p}from"../../../node_modules/.pnpm/lucide-solid@1.8.0_solid-js@1.9.11/node_modules/lucide-solid/dist/source/icons/film.js";import{music_default as m}from"../../../node_modules/.pnpm/lucide-solid@1.8.0_solid-js@1.9.11/node_modules/lucide-solid/dist/source/icons/music.js";import{trash_2_default as h}from"../../../node_modules/.pnpm/lucide-solid@1.8.0_solid-js@1.9.11/node_modules/lucide-solid/dist/source/icons/trash-2.js";import{addEventListener as g,className as _,createComponent as v,delegateEvents as y,effect as b,insert as x,memo as S,mergeProps as C,setAttribute as w,setStyleProperty as ee,spread as T,template as E,use as D}from"solid-js/web";import{For as O,Match as k,Show as A,Switch as j,createSignal as M,createUniqueId as N,mergeProps as P}from"solid-js";var F=E(`<div><div>`),te=E(`<div class=up62><div class=up63><span class="loading loading-spinner loading-sm text-white"></span><span class=up64>%`),ne=E(`<div class=up51><span class="loading loading-spinner loading-xs text-white">`),I=E(`<div><span> files</span><button title="Remove all">Clear all`),re=E(`<div><ul class="flex flex-col gap-2">`),ie=E(`<li>`),ae=E(`<span>`),oe=E(`<div><div class="flex min-w-0 flex-1 items-center gap-2"><div></div><div></div><button title=Remove>`),se=E(`<div><ul class=up48>`),L=E(`<img>`),ce=E(`<button class=up52 title=Preview>`),le=E(`<span class=up37> × <!> px`),ue=E(`<span class=up24>Uploaded`),de=E(`<span class=up23>Upload failed`),R=E(`<button title=Preview>`),z=E(`<li><div></div><div><div class=up36><span class=up21></span><span class=up39></span></div></div><div><button title=Remove>`),B=E(`<div><span>`),V=E(`<button title="Upload file"><span class=up69>Upload`),H=E(`<div>`),fe=E(`<div class=up65><button title=Remove>`),pe=E(`<div class="w-fit cursor-pointer">`),U=E(`<div><input type=file class=hidden>`),me=E(`<p>Click or drag file to this area to upload`),he=E(`<p>`);function W(t,n,r){return!t||typeof t==`string`?r??``:e(t[n],r)}function G(t,n){return t?typeof t==`string`?e(n,t):e(n,t.wrapper):n}function ge(e){return e.startsWith(`image/`)?`text-violet-500`:e.startsWith(`video/`)?`text-rose-500`:e.startsWith(`audio/`)?`text-amber-500`:e===`application/pdf`?`text-red-500`:e.includes(`text`)||e.includes(`document`)?`text-blue-500`:e.includes(`spreadsheet`)||e.includes(`excel`)?`text-emerald-500`:`text-base-content/40`}function _e(e){return e.startsWith(`image/`)?`bg-violet-500/10`:e.startsWith(`video/`)?`bg-rose-500/10`:e.startsWith(`audio/`)?`bg-amber-500/10`:e===`application/pdf`?`bg-red-500/10`:e.includes(`text`)||e.includes(`document`)?`bg-blue-500/10`:e.includes(`spreadsheet`)||e.includes(`excel`)?`bg-emerald-500/10`:`bg-base-content/5`}function K(e,t=16){return e.startsWith(`image/`)?v(d,{size:t}):e.startsWith(`video/`)?v(p,{size:t}):e.startsWith(`audio/`)?v(m,{size:t}):e===`application/pdf`||e.includes(`text`)?v(f,{size:t}):v(u,{size:t})}function ve(e,t){return e===`application/pdf`?{label:`PDF`,colorClass:`bg-red-500`}:e.startsWith(`image/`)?{label:t.split(`.`).pop()?.toUpperCase().slice(0,3)??`IMG`,colorClass:`bg-violet-500`}:e.startsWith(`video/`)?{label:`VID`,colorClass:`bg-rose-500`}:e.startsWith(`audio/`)?{label:`AUD`,colorClass:`bg-amber-500`}:e.includes(`spreadsheet`)||e.includes(`excel`)?{label:`XLS`,colorClass:`bg-emerald-500`}:e.includes(`document`)||e.includes(`word`)?{label:`DOC`,colorClass:`bg-blue-500`}:e.includes(`text`)?{label:`TXT`,colorClass:`bg-blue-500`}:{label:t.split(`.`).pop()?.toUpperCase().slice(0,4)??`FILE`,colorClass:`bg-slate-400`}}function q(e){return e===0?`0 B`:e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(1)} MB`}function ye(e){return e.startsWith(`image/`)}function be(e){let t=!1,n=0,r=()=>{if(t)return;let i=Math.random()*10+8;n=Math.min(n+i,95),e.onProgress(Math.round(n)),n<95?setTimeout(r,100+Math.random()*80):setTimeout(()=>{t||(e.onProgress(100),e.onSuccess())},400+Math.random()*300)};return setTimeout(r,50),()=>{t=!0}}function J(e){let[t,n]=M([]),r=new Map,i=new Map,a=new Map,o=e=>r.get(e)?.[0]??(()=>0),s=(e,t)=>{i.get(e)?.(),i.delete(e),r.delete(e);let n=a.get(e);n&&(n.onload=null,n.src=``,a.delete(e)),t&&URL.revokeObjectURL(t)};return{fileList:t,processFiles:o=>{let s=Array.from(o),c=e.maxCount,l=e.maxFileSize,u=e.maxTotalSize,d=t();for(let t of s)if(l&&t.size>l){e.onError?.({type:`maxFileSize`,file:t,message:`"${t.name}" vượt quá dung lượng cho phép (${q(l)})`});return}if(c&&d.length+s.length>c){e.onError?.({type:`maxCount`,file:s[0],message:`Đã đạt số lượng file tối đa (${c})`});return}if(u&&d.reduce((e,t)=>e+t.size,0)+s.reduce((e,t)=>e+t.size,0)>u){e.onError?.({type:`maxTotalSize`,file:s[0],message:`Tổng dung lượng vượt quá giới hạn (${q(u)})`});return}s.forEach(o=>{let s=N(),c=ye(o.type)?URL.createObjectURL(o):void 0,[l,u]=M(0);r.set(s,[l,u]);let d={uid:s,name:o.name,size:o.size,type:o.type,status:`uploading`,originFile:o,thumbUrl:c};if(c){let e=new Image;a.set(s,e),e.onload=()=>{a.delete(s),n(t=>t.map(t=>t.uid===s?{...t,dimensions:{width:e.naturalWidth,height:e.naturalHeight}}:t))},e.src=c}n(t=>{let n=e.multiple===!1?[d]:[...t,d];return e.onChange?.({file:d,fileList:n}),n});let f=(e.customRequest??be)({file:o,onSuccess:()=>{u(100),n(t=>{let n=t.map(e=>e.uid===s?{...e,status:`done`}:e),r=n.find(e=>e.uid===s);return r&&e.onChange?.({file:r,fileList:n}),n}),i.delete(s),r.delete(s)},onError:t=>{n(n=>{let r=n.map(e=>e.uid===s?{...e,status:`error`}:e),i=r.find(e=>e.uid===s);return i&&e.onChange?.({file:{...i,error:t},fileList:r}),r}),i.delete(s),r.delete(s)},onProgress:n=>{u(n);let r=t(),i=r.findIndex(e=>e.uid===s);i!==-1&&e.onChange?.({file:{...r[i],percent:n},fileList:r})}});typeof f==`function`&&i.set(s,f)})},removeFile:t=>{n(n=>{let r=n.find(e=>e.uid===t);s(t,r?.thumbUrl);let i=n.filter(e=>e.uid!==t);return r&&e.onChange?.({file:{...r,status:`removed`},fileList:i}),i})},clearAll:()=>{n(e=>(e.forEach(e=>s(e.uid,e.thumbUrl)),[]))},getProgress:o}}function xe(t){return(()=>{var n=F(),r=n.firstChild;return b(i=>{var a=e(`up26`,t.trackClass),o=e(`up27`,t.fillClass),s=`${t.percent()}%`;return a!==i.e&&_(n,i.e=a),o!==i.t&&_(r,i.t=o),s!==i.a&&ee(r,`width`,i.a=s),i},{e:void 0,t:void 0,a:void 0}),n})()}function Se(e){return(()=>{var t=te(),n=t.firstChild.firstChild.nextSibling,r=n.firstChild;return x(n,()=>e.percent(),r),t})()}function Ce(){return ne()}function Y(t){let n=N();return(()=>{var r=re(),i=r.firstChild;return w(r,`id`,n),x(r,v(A,{get when(){return S(()=>!!t.showClearAll)()&&t.files.length>1},get children(){var n=I(),r=n.firstChild,i=r.firstChild,a=r.nextSibling,o=a.firstChild;return x(r,()=>t.files.length,i),g(a,`click`,t.onClearAll,!0),x(a,v(h,{size:12}),o),b(i=>{var o=e(`up44`,W(t.classConfig,`listHeader`)),s=e(`up45`,W(t.classConfig,`listCount`)),c=e(`up46`,W(t.classConfig,`clearBtn`));return o!==i.e&&_(n,i.e=o),s!==i.t&&_(r,i.t=s),c!==i.a&&_(a,i.a=c),i},{e:void 0,t:void 0,a:void 0}),n}}),i),x(i,v(O,{get each(){return t.files},children:e=>{let n=ve(e.type,e.name);return(()=>{var r=ie();return x(r,v(X,{file:e,badge:n,get onRemove(){return t.onRemove},get classConfig(){return t.classConfig},get showTooltip(){return t.showTooltip}})),r})()}})),b(()=>_(r,e(`up06`,W(t.classConfig,`textList`)))),r})()}function X(n){let r=()=>n.file.status===`uploading`;return(()=>{var c=oe(),l=c.firstChild,u=l.firstChild,d=u.nextSibling,f=d.nextSibling;return x(u,()=>n.badge.label),x(l,v(a,{get content(){return n.file.name},get hidden(){return!n.showTooltip},class:{root:`up09`},type:`default`,get children(){var t=ae();return x(t,()=>n.file.name),b(()=>_(t,e(`up09`,W(n.classConfig,`textName`)))),t}}),d),x(d,()=>q(n.file.size)),x(l,v(j,{get children(){return[v(k,{get when(){return r()},get children(){return v(i,{class:`size-5`})}}),v(k,{get when(){return n.file.status===`done`},get children(){return v(o,{size:16,class:`text-success`})}}),v(k,{get when(){return n.file.status===`error`},get children(){return v(s,{size:16,class:`text-error`})}})]}}),f),f.$$click=()=>n.onRemove(n.file.uid),x(f,v(t,{size:16})),b(t=>{var r=e(`up07`,W(n.classConfig,`textItem`)),i=e(`up08`,n.badge.colorClass,W(n.classConfig,`textBadge`)),a=e(`up10`,W(n.classConfig,`textSize`)),o=e(`up57`,W(n.classConfig,`removeBtn`));return r!==t.e&&_(c,t.e=r),i!==t.t&&_(u,t.t=i),a!==t.a&&_(d,t.a=a),o!==t.o&&_(f,t.o=o),t},{e:void 0,t:void 0,a:void 0,o:void 0}),c})()}function Z(i){let[a,s]=M(null);return[(()=>{var r=se(),a=r.firstChild;return x(r,v(A,{get when(){return S(()=>!!i.showClearAll)()&&i.files.length>1},get children(){var t=I(),n=t.firstChild,r=n.firstChild,a=n.nextSibling,o=a.firstChild;return x(n,()=>i.files.length,r),g(a,`click`,i.onClearAll,!0),x(a,v(h,{size:12}),o),b(r=>{var o=e(`up44`,W(i.classConfig,`listHeader`)),s=e(`up45`,W(i.classConfig,`listCount`)),c=e(`up46`,W(i.classConfig,`clearBtn`));return o!==r.e&&_(t,r.e=o),s!==r.t&&_(n,r.t=s),c!==r.a&&_(a,r.a=c),r},{e:void 0,t:void 0,a:void 0}),t}}),a),x(a,v(O,{get each(){return i.files},children:r=>(()=>{var a=z(),c=a.firstChild,u=c.nextSibling,d=u.firstChild,f=d.firstChild,p=f.nextSibling,m=u.nextSibling,h=m.firstChild;return x(c,v(A,{get when(){return r.thumbUrl},get fallback(){return(()=>{var t=B(),n=t.firstChild;return x(n,()=>K(r.type,20)),b(a=>{var o=e(`up53`,_e(r.type),W(i.classConfig,`pictureIcon`)),s=ge(r.type);return o!==a.e&&_(t,a.e=o),s!==a.t&&_(n,a.t=s),a},{e:void 0,t:void 0}),t})()},get children(){return[(()=>{var e=L();return b(t=>{var n=r.thumbUrl,i=r.name;return n!==t.e&&w(e,`src`,t.e=n),i!==t.t&&w(e,`alt`,t.t=i),t},{e:void 0,t:void 0}),e})(),v(A,{get when(){return r.status===`uploading`},get children(){return v(Ce,{})}}),v(A,{get when(){return r.status===`done`},get children(){var e=ce();return e.$$click=()=>s(r),x(e,v(n,{size:14})),e}})]}})),x(f,()=>r.name),x(d,v(A,{get when(){return r.dimensions},get children(){var e=le(),t=e.firstChild,n=t.nextSibling;return n.nextSibling,x(e,()=>r.dimensions.width,t),x(e,()=>r.dimensions.height,n),e}}),p),x(p,()=>q(r.size)),x(u,v(A,{get when(){return r.status===`uploading`},get children(){return v(xe,{get percent(){return i.getProgress(r.uid)},get trackClass(){return W(i.classConfig,`progressTrack`)},get fillClass(){return W(i.classConfig,`progressFill`)}})}}),null),x(u,v(A,{get when(){return r.status===`done`},get children(){var e=ue(),t=e.firstChild;return x(e,v(o,{size:11}),t),e}}),null),x(u,v(A,{get when(){return r.status===`error`},get children(){return de()}}),null),x(m,v(A,{get when(){return S(()=>r.status===`done`)()&&r.thumbUrl},get children(){var t=R();return t.$$click=()=>s(r),x(t,v(l,{size:14})),b(()=>_(t,e(`up56`,W(i.classConfig,`actionBtn`)))),t}}),h),h.$$click=()=>i.onRemove(r.uid),x(h,v(t,{size:14,class:`shrink-0`})),b(t=>{var n=e(`up49`,r.status===`uploading`&&`up49a`,r.status===`error`&&`up49b`,W(i.classConfig,`pictureItem`)),o=e(`up50`,W(i.classConfig,`pictureThumb`)),s=e(`up54`,W(i.classConfig,`pictureInfo`)),l=r.name,d=e(`up55`,W(i.classConfig,`pictureActions`)),p=e(`up57`,W(i.classConfig,`removeBtn`));return n!==t.e&&_(a,t.e=n),o!==t.t&&_(c,t.t=o),s!==t.a&&_(u,t.a=s),l!==t.o&&w(f,`title`,t.o=l),d!==t.i&&_(m,t.i=d),p!==t.n&&_(h,t.n=p),t},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0}),a})()})),b(()=>_(r,e(`up47`,W(i.classConfig,`pictureList`)))),r})(),v(A,{get when(){return a()},get children(){return v(r,{get src(){return a().thumbUrl},get imageName(){return a().name},get size(){return q(a().size)},onClose:()=>s(null)})}})]}function Q(t){let[n,i]=M(null);return[v(A,{get when(){return S(()=>!!t.showClearAll)()&&t.files.length>1},get children(){var n=I(),r=n.firstChild,i=r.firstChild,a=r.nextSibling,o=a.firstChild;return x(r,()=>t.files.length,i),g(a,`click`,t.onClearAll,!0),x(a,v(h,{size:12}),o),b(i=>{var o=e(`up44`,W(t.classConfig,`listHeader`)),s=e(`up45`,W(t.classConfig,`listCount`)),c=e(`up46`,W(t.classConfig,`clearBtn`));return o!==i.e&&_(n,i.e=o),s!==i.t&&_(r,i.t=s),c!==i.a&&_(a,i.a=c),i},{e:void 0,t:void 0,a:void 0}),n}}),(()=>{var n=H();return x(n,v(O,{get each(){return t.files},children:n=>(()=>{var r=H();return x(r,v(A,{get when(){return n.thumbUrl},get fallback(){return(()=>{var r=H();return x(r,()=>K(n.type,24)),b(()=>_(r,e(`up61`,W(t.classConfig,`cardIcon`)))),r})()},get children(){var r=L();return b(i=>{var a=n.thumbUrl,o=n.name,s=e(`up60`,W(t.classConfig,`cardImg`));return a!==i.e&&w(r,`src`,i.e=a),o!==i.t&&w(r,`alt`,i.t=o),s!==i.a&&_(r,i.a=s),i},{e:void 0,t:void 0,a:void 0}),r}}),null),x(r,v(A,{get when(){return n.status===`uploading`},get children(){return v(Se,{get percent(){return t.getProgress(n.uid)}})}}),null),x(r,v(A,{get when(){return n.status!==`uploading`},get children(){var r=fe(),a=r.firstChild;return x(r,v(A,{get when(){return n.thumbUrl},get children(){var r=R();return r.$$click=()=>i(n),x(r,v(l,{size:13})),b(()=>_(r,e(`up66`,W(t.classConfig,`actionBtn`)))),r}}),a),a.$$click=()=>t.onRemove(n.uid),x(a,v(h,{size:13})),b(()=>_(a,e(`up67`,W(t.classConfig,`removeBtn`)))),r}}),null),b(()=>_(r,e(`up59`,n.status===`error`&&`up59a`,W(t.classConfig,`card`)))),r})()}),null),x(n,v(A,{get when(){return t.showAddButton},get children(){var n=V(),r=n.firstChild;return g(n,`click`,t.onAdd,!0),x(n,v(c,{size:20,class:`opacity-40`}),r),b(()=>_(n,e(`up68`,W(t.classConfig,`cardAdd`)))),n}}),null),b(()=>_(n,e(`up58`,W(t.classConfig,`cardGrid`)))),n})(),v(A,{get when(){return n()},get children(){return v(r,{get src(){return n().thumbUrl},get imageName(){return n().name},get size(){return q(n().size)},onClose:()=>i(null)})}})]}function we(t){t=P({multiple:!0,listType:`text`,showUploadList:!0,showTooltip:!1},t);let n,{fileList:r,processFiles:i,removeFile:a,clearAll:o,getProgress:s}=J(t),c=()=>n.click(),l=e=>{let t=e.currentTarget;t.files?.length&&i(t.files),t.value=``},u=()=>!(!t.multiple&&r().length>=1||t.maxCount&&r().length>=t.maxCount),d=()=>t.showClearAll??t.multiple!==!1;return(()=>{var i=U(),f=i.firstChild,p=n;return typeof p==`function`?D(p,f):n=f,T(f,C({get multiple(){return t.multiple},get accept(){return t.accept}},()=>t.directory?{webkitdirectory:``}:{},{onChange:l}),!1,!1),x(i,v(j,{get children(){return[v(k,{get when(){return t.listType===`picture-card`},get children(){return[v(A,{get when(){return t.showUploadList},get children(){return v(Q,{get files(){return r()},onRemove:a,onAdd:c,onClearAll:o,get showAddButton(){return u()},get showClearAll(){return d()},getProgress:s,get classConfig(){return t.class}})}}),v(A,{get when(){return!t.showUploadList},get children(){var e=pe();return e.$$click=c,x(e,()=>t.children),e}})]}}),v(k,{get when(){return t.listType!==`picture-card`},get children(){return[(()=>{var e=H();return g(e,`click`,u()?c:void 0,!0),x(e,()=>t.children),b(()=>_(e,u()?`w-fit cursor-pointer`:``)),e})(),v(A,{get when(){return S(()=>!!t.showUploadList)()&&r().length>0},get children(){return v(j,{get children(){return[v(k,{get when(){return t.listType===`picture`},get children(){return v(Z,{get files(){return r()},onRemove:a,onClearAll:o,get showClearAll(){return d()},getProgress:s,get classConfig(){return t.class}})}}),v(k,{get when(){return t.listType===`text`},get children(){return v(Y,{get files(){return r()},onRemove:a,onClearAll:o,get showClearAll(){return d()},get classConfig(){return t.class},get showTooltip(){return t.showTooltip}})}})]}})}})]}})]}}),null),x(i,v(A,{get when(){return t.errorMessage},get children(){var n=H();return x(n,()=>t.errorMessage),b(()=>_(n,e(`up76`,W(t.class,`errorMessage`)))),n}}),null),b(()=>_(i,G(t.class,`up01`))),i})()}function Te(t){t=P({multiple:!0,listType:`text`,showUploadList:!0,hint:`Support for a single or bulk upload`,showTooltip:!1},t);let n,[r,i]=M(!1),{fileList:a,processFiles:o,removeFile:s,clearAll:l,getProgress:u}=J(t),d=()=>t.showClearAll??t.multiple!==!1,f=()=>n.click(),p=e=>{let t=e.currentTarget;t.files?.length&&o(t.files),t.value=``},m=e=>{e.preventDefault(),i(!0)},h=e=>{e.preventDefault(),i(!1)},g=e=>{e.preventDefault(),i(!1);let t=e.dataTransfer?.files;t?.length&&o(t)},y=()=>!(!t.multiple&&a().length>=1||t.maxCount&&a().length>=t.maxCount);return(()=>{var i=U(),o=i.firstChild,w=n;return typeof w==`function`?D(w,o):n=o,T(o,C({get multiple(){return t.multiple},get accept(){return t.accept}},()=>t.directory?{webkitdirectory:``}:{},{onChange:p}),!1,!1),x(i,v(A,{get when(){return t.listType===`picture-card`},get children(){return v(A,{get when(){return t.showUploadList},get children(){return v(Q,{get files(){return a()},onRemove:s,onAdd:f,onClearAll:l,get showAddButton(){return y()},get showClearAll(){return d()},getProgress:u,get classConfig(){return t.class}})}})}}),null),x(i,v(A,{get when(){return t.listType!==`picture-card`},get children(){return[v(A,{get when(){return y()},get children(){var n=F(),i=n.firstChild;return n.addEventListener(`drop`,g),n.addEventListener(`dragleave`,h),n.addEventListener(`dragover`,m),n.$$click=f,x(i,v(A,{get when(){return t.icon},get fallback(){return v(c,{size:48,strokeWidth:1.5})},get children(){return t.icon}})),x(n,v(A,{get when(){return t.children},get fallback(){return[(()=>{var n=me();return b(()=>_(n,e(`up04`,W(t.class,`draggerTitle`)))),n})(),(()=>{var n=he();return x(n,()=>t.hint),b(()=>_(n,e(`up05`,W(t.class,`draggerHint`)))),n})()]},get children(){return t.children}}),null),b(a=>{var o=e(`up02`,r()&&`up02a`,W(t.class,`dragger`)),s=e(`up03`,W(t.class,`draggerIcon`));return o!==a.e&&_(n,a.e=o),s!==a.t&&_(i,a.t=s),a},{e:void 0,t:void 0}),n}}),v(A,{get when(){return S(()=>!!t.showUploadList)()&&a().length>0},get children(){return v(j,{get children(){return[v(k,{get when(){return t.listType===`picture`},get children(){return v(Z,{get files(){return a()},onRemove:s,onClearAll:l,get showClearAll(){return d()},getProgress:u,get classConfig(){return t.class}})}}),v(k,{get when(){return t.listType===`text`},get children(){return v(Y,{get files(){return a()},onRemove:s,onClearAll:l,get showClearAll(){return d()},get classConfig(){return t.class},get showTooltip(){return t.showTooltip}})}})]}})}})]}}),null),x(i,v(A,{get when(){return t.errorMessage},get children(){var n=H();return x(n,()=>t.errorMessage),b(()=>_(n,e(`up76`,W(t.class,`errorMessage`)))),n}}),null),b(()=>_(i,G(t.class,`up01`))),i})()}var $=we;$.Dragger=Te,y([`click`]);export{$ as Upload};
|
|
2
|
+
//# sourceMappingURL=upload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload.js","names":["cn","ImagePreview","Spinner","CircleCheck","CircleX","CloudUpload","Eye","File","FileImage","FileText","Film","Music","Trash2","X","ZoomIn","Accessor","createSignal","createUniqueId","For","Match","mergeProps","Show","Switch","Tooltip","UploadBaseProps","UploadClassConfig","UploadComponent","UploadDraggerProps","UploadFile","UploadProps","UploadRequestOption","cls","config","key","extra","wrapperCls","base","wrapper","getFileIconColor","type","startsWith","includes","getFileIconBg","getFileIconNode","size","_$createComponent","getFileBadge","name","label","colorClass","ext","split","pop","toUpperCase","slice","formatFileSize","bytes","toFixed","isImageFile","defaultRequest","options","cancelled","current","tick","increment","Math","random","min","onProgress","round","setTimeout","onSuccess","ProgressEntry","v","useUpload","props","fileList","setFileList","progressMap","Map","cancelMap","imgMap","HTMLImageElement","getProgress","uid","get","cancelAndClean","thumbUrl","delete","img","onload","src","URL","revokeObjectURL","processFiles","rawFiles","FileList","files","Array","from","maxCount","maxFileSize","maxTotalSize","currentList","file","onError","message","newTotal","length","currentTotal","reduce","sum","f","batchTotal","forEach","createObjectURL","undefined","percent","setPercent","set","newFile","status","originFile","Image","list","map","dimensions","width","naturalWidth","height","naturalHeight","prev","nextList","multiple","onChange","requestFn","customRequest","cancel","next","const","done","find","error","Error","failed","value","snapshot","idx","findIndex","removeFile","removed","filter","clearAll","ProgressBar","trackClass","fillClass","_el$","_tmpl$","_el$2","firstChild","_$effect","_p$","_v$","_v$2","_v$3","e","_$className","t","a","_$setStyleProperty","CardProgressOverlay","_el$3","_tmpl$2","_el$4","_el$5","_el$6","nextSibling","_el$7","_$insert","PictureThumbLoading","_tmpl$3","TextFileList","onRemove","onClearAll","showClearAll","classConfig","showTooltip","listId","_el$9","_tmpl$5","_el$13","_$setAttribute","when","_$memo","children","_el$0","_tmpl$4","_el$1","_el$10","_el$11","_el$12","_$addEventListener","_v$4","_v$5","_v$6","each","badge","_el$14","_tmpl$6","FileUploadItem","isUploading","_el$15","_tmpl$8","_el$16","_el$17","_el$19","_el$20","content","hidden","root","_el$18","_tmpl$7","$$click","_v$7","_v$8","_v$9","_v$0","o","PictureFileList","preview","setPreview","_el$21","_tmpl$9","_el$27","_el$22","_el$23","_el$24","_el$25","_el$26","_v$1","_v$10","_v$11","_el$28","_tmpl$14","_el$29","_el$32","_el$33","_el$34","_el$39","_el$43","_el$45","fallback","_el$46","_tmpl$15","_el$47","_v$20","_v$21","_el$30","_tmpl$0","_v$12","_v$13","_el$31","_tmpl$1","_el$35","_tmpl$10","_el$36","_el$38","_el$37","_el$40","_tmpl$11","_el$41","_tmpl$12","_el$44","_tmpl$13","_v$14","_v$15","_v$16","_v$17","_v$18","_v$19","i","n","imageName","onClose","PictureCardFileList","onAdd","showAddButton","_el$48","_el$49","_el$50","_el$51","_el$52","_v$22","_v$23","_v$24","_el$53","_tmpl$17","_el$56","_el$61","_el$57","_v$25","_v$26","_v$27","_el$58","_tmpl$18","_el$60","_el$59","_el$54","_tmpl$16","_el$55","UploadBase","p","listType","showUploadList","inputRef","HTMLInputElement","triggerInput","click","handleInputChange","Event","input","currentTarget","effectiveShowClearAll","_el$62","_tmpl$20","_el$63","_ref$","_$use","_$spread","_$mergeProps","accept","directory","webkitdirectory","class","_el$64","_tmpl$19","_el$65","errorMessage","_el$66","UploadDragger","hint","isDragging","setIsDragging","handleDragOver","DragEvent","preventDefault","handleDragLeave","handleDrop","dataTransfer","_el$67","_el$68","_ref$2","_el$69","_el$70","addEventListener","icon","strokeWidth","_el$72","_tmpl$21","_el$73","_tmpl$22","_v$28","_v$29","_el$71","Upload","Dragger","_$delegateEvents"],"sources":["../../../../src/components/upload/upload.tsx"],"sourcesContent":["import { cn } from '@/utils/cn';\r\nimport { ImagePreview } from '@components/image-preview';\r\nimport { Spinner } from '@components/loading/loading';\r\nimport CircleCheck from 'lucide-solid/icons/circle-check';\r\nimport CircleX from 'lucide-solid/icons/circle-x';\r\nimport CloudUpload from 'lucide-solid/icons/cloud-upload';\r\nimport Eye from 'lucide-solid/icons/eye';\r\nimport File from 'lucide-solid/icons/file';\r\nimport FileImage from 'lucide-solid/icons/file-image';\r\nimport FileText from 'lucide-solid/icons/file-text';\r\nimport Film from 'lucide-solid/icons/film';\r\nimport Music from 'lucide-solid/icons/music';\r\nimport Trash2 from 'lucide-solid/icons/trash-2';\r\nimport X from 'lucide-solid/icons/x';\r\nimport ZoomIn from 'lucide-solid/icons/zoom-in';\r\nimport {\r\n Accessor,\r\n createSignal,\r\n createUniqueId,\r\n For,\r\n Match,\r\n mergeProps,\r\n Show,\r\n Switch,\r\n} from 'solid-js';\r\nimport { Tooltip } from '../tooltip';\r\nimport {\r\n UploadBaseProps,\r\n UploadClassConfig,\r\n UploadComponent,\r\n UploadDraggerProps,\r\n UploadFile,\r\n UploadProps,\r\n UploadRequestOption,\r\n} from './upload.types';\r\n\r\nfunction cls(\r\n config: string | UploadClassConfig | undefined,\r\n key: keyof UploadClassConfig,\r\n extra?: string,\r\n): string {\r\n if (!config) return extra ?? '';\r\n if (typeof config === 'string') return extra ?? '';\r\n return cn(config[key], extra);\r\n}\r\n\r\nfunction wrapperCls(config: string | UploadClassConfig | undefined, base: string): string {\r\n if (!config) return base;\r\n if (typeof config === 'string') return cn(base, config);\r\n return cn(base, config.wrapper);\r\n}\r\n\r\nfunction getFileIconColor(type: string): string {\r\n if (type.startsWith('image/')) return 'text-violet-500';\r\n if (type.startsWith('video/')) return 'text-rose-500';\r\n if (type.startsWith('audio/')) return 'text-amber-500';\r\n if (type === 'application/pdf') return 'text-red-500';\r\n if (type.includes('text') || type.includes('document')) return 'text-blue-500';\r\n if (type.includes('spreadsheet') || type.includes('excel')) return 'text-emerald-500';\r\n return 'text-base-content/40';\r\n}\r\n\r\nfunction getFileIconBg(type: string): string {\r\n if (type.startsWith('image/')) return 'bg-violet-500/10';\r\n if (type.startsWith('video/')) return 'bg-rose-500/10';\r\n if (type.startsWith('audio/')) return 'bg-amber-500/10';\r\n if (type === 'application/pdf') return 'bg-red-500/10';\r\n if (type.includes('text') || type.includes('document')) return 'bg-blue-500/10';\r\n if (type.includes('spreadsheet') || type.includes('excel')) return 'bg-emerald-500/10';\r\n return 'bg-base-content/5';\r\n}\r\n\r\nfunction getFileIconNode(type: string, size = 16) {\r\n if (type.startsWith('image/')) return <FileImage size={size} />;\r\n if (type.startsWith('video/')) return <Film size={size} />;\r\n if (type.startsWith('audio/')) return <Music size={size} />;\r\n if (type === 'application/pdf' || type.includes('text')) return <FileText size={size} />;\r\n return <File size={size} />;\r\n}\r\n\r\nfunction getFileBadge(type: string, name: string): { label: string; colorClass: string } {\r\n if (type === 'application/pdf') return { label: 'PDF', colorClass: 'bg-red-500' };\r\n if (type.startsWith('image/')) {\r\n const ext = name.split('.').pop()?.toUpperCase().slice(0, 3) ?? 'IMG';\r\n return { label: ext, colorClass: 'bg-violet-500' };\r\n }\r\n if (type.startsWith('video/')) return { label: 'VID', colorClass: 'bg-rose-500' };\r\n if (type.startsWith('audio/')) return { label: 'AUD', colorClass: 'bg-amber-500' };\r\n if (type.includes('spreadsheet') || type.includes('excel'))\r\n return { label: 'XLS', colorClass: 'bg-emerald-500' };\r\n if (type.includes('document') || type.includes('word'))\r\n return { label: 'DOC', colorClass: 'bg-blue-500' };\r\n if (type.includes('text')) return { label: 'TXT', colorClass: 'bg-blue-500' };\r\n\r\n const ext = name.split('.').pop()?.toUpperCase().slice(0, 4) ?? 'FILE';\r\n return { label: ext, colorClass: 'bg-slate-400' };\r\n}\r\n\r\nfunction formatFileSize(bytes: number): string {\r\n if (bytes === 0) return '0 B';\r\n if (bytes < 1024) return `${bytes} B`;\r\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\r\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\r\n}\r\n\r\nfunction isImageFile(type: string): boolean {\r\n return type.startsWith('image/');\r\n}\r\n\r\nfunction defaultRequest(options: UploadRequestOption): () => void {\r\n let cancelled = false;\r\n let current = 0;\r\n\r\n const tick = () => {\r\n if (cancelled) return;\r\n\r\n const increment = Math.random() * 10 + 8;\r\n current = Math.min(current + increment, 95);\r\n options.onProgress(Math.round(current));\r\n\r\n if (current < 95) {\r\n setTimeout(tick, 100 + Math.random() * 80);\r\n } else {\r\n setTimeout(\r\n () => {\r\n if (cancelled) return;\r\n options.onProgress(100);\r\n options.onSuccess();\r\n },\r\n 400 + Math.random() * 300,\r\n );\r\n }\r\n };\r\n\r\n setTimeout(tick, 50);\r\n\r\n return () => {\r\n cancelled = true;\r\n };\r\n}\r\n\r\ntype ProgressEntry = [Accessor<number>, (v: number) => void];\r\n\r\nfunction useUpload(props: UploadBaseProps) {\r\n const [fileList, setFileList] = createSignal<UploadFile[]>([]);\r\n const progressMap = new Map<string, ProgressEntry>();\r\n\r\n const cancelMap = new Map<string, () => void>();\r\n\r\n const imgMap = new Map<string, HTMLImageElement>();\r\n\r\n const getProgress = (uid: string): Accessor<number> => {\r\n return progressMap.get(uid)?.[0] ?? (() => 0);\r\n };\r\n\r\n const cancelAndClean = (uid: string, thumbUrl?: string) => {\r\n cancelMap.get(uid)?.();\r\n cancelMap.delete(uid);\r\n progressMap.delete(uid);\r\n\r\n const img = imgMap.get(uid);\r\n if (img) {\r\n img.onload = null;\r\n img.src = '';\r\n imgMap.delete(uid);\r\n }\r\n if (thumbUrl) URL.revokeObjectURL(thumbUrl);\r\n };\r\n\r\n const processFiles = (rawFiles: FileList | File[]) => {\r\n const files = Array.from(rawFiles);\r\n const maxCount = props.maxCount;\r\n const maxFileSize = props.maxFileSize;\r\n const maxTotalSize = props.maxTotalSize;\r\n\r\n const currentList = fileList();\r\n\r\n for (const file of files) {\r\n if (maxFileSize && file.size > maxFileSize) {\r\n props.onError?.({\r\n type: 'maxFileSize',\r\n file,\r\n message: `\"${file.name}\" vượt quá dung lượng cho phép (${formatFileSize(maxFileSize)})`,\r\n });\r\n return;\r\n }\r\n }\r\n\r\n if (maxCount) {\r\n const newTotal = currentList.length + files.length;\r\n if (newTotal > maxCount) {\r\n props.onError?.({\r\n type: 'maxCount',\r\n file: files[0],\r\n message: `Đã đạt số lượng file tối đa (${maxCount})`,\r\n });\r\n return;\r\n }\r\n }\r\n\r\n if (maxTotalSize) {\r\n const currentTotal = currentList.reduce((sum, f) => sum + f.size, 0);\r\n const batchTotal = files.reduce((sum, f) => sum + f.size, 0);\r\n if (currentTotal + batchTotal > maxTotalSize) {\r\n props.onError?.({\r\n type: 'maxTotalSize',\r\n file: files[0],\r\n message: `Tổng dung lượng vượt quá giới hạn (${formatFileSize(maxTotalSize)})`,\r\n });\r\n return;\r\n }\r\n }\r\n\r\n files.forEach(file => {\r\n const uid = createUniqueId();\r\n const thumbUrl = isImageFile(file.type) ? URL.createObjectURL(file) : undefined;\r\n\r\n const [percent, setPercent] = createSignal(0);\r\n progressMap.set(uid, [percent, setPercent]);\r\n\r\n const newFile: UploadFile = {\r\n uid,\r\n name: file.name,\r\n size: file.size,\r\n type: file.type,\r\n status: 'uploading',\r\n originFile: file,\r\n thumbUrl,\r\n };\r\n\r\n if (thumbUrl) {\r\n const img = new Image();\r\n imgMap.set(uid, img);\r\n img.onload = () => {\r\n imgMap.delete(uid);\r\n setFileList(list =>\r\n list.map(f =>\r\n f.uid === uid\r\n ? { ...f, dimensions: { width: img.naturalWidth, height: img.naturalHeight } }\r\n : f,\r\n ),\r\n );\r\n };\r\n img.src = thumbUrl;\r\n }\r\n\r\n setFileList(prev => {\r\n const nextList = props.multiple === false ? [newFile] : [...prev, newFile];\r\n props.onChange?.({ file: newFile, fileList: nextList });\r\n return nextList;\r\n });\r\n\r\n const requestFn = props.customRequest ?? defaultRequest;\r\n const cancel = requestFn({\r\n file,\r\n onSuccess: () => {\r\n setPercent(100);\r\n setFileList(list => {\r\n const next = list.map(f => (f.uid === uid ? { ...f, status: 'done' as const } : f));\r\n const done = next.find(f => f.uid === uid);\r\n if (done) props.onChange?.({ file: done, fileList: next });\r\n return next;\r\n });\r\n cancelMap.delete(uid);\r\n progressMap.delete(uid);\r\n },\r\n onError: (error: Error) => {\r\n setFileList(list => {\r\n const next = list.map(f => (f.uid === uid ? { ...f, status: 'error' as const } : f));\r\n const failed = next.find(f => f.uid === uid);\r\n if (failed) props.onChange?.({ file: { ...failed, error }, fileList: next });\r\n return next;\r\n });\r\n cancelMap.delete(uid);\r\n progressMap.delete(uid);\r\n },\r\n onProgress: value => {\r\n setPercent(value);\r\n\r\n const snapshot = fileList();\r\n const idx = snapshot.findIndex(f => f.uid === uid);\r\n if (idx !== -1)\r\n props.onChange?.({\r\n file: { ...snapshot[idx], percent: value },\r\n fileList: snapshot,\r\n });\r\n },\r\n });\r\n\r\n if (typeof cancel === 'function') cancelMap.set(uid, cancel);\r\n });\r\n };\r\n\r\n const removeFile = (uid: string) => {\r\n setFileList(prev => {\r\n const removed = prev.find(f => f.uid === uid);\r\n\r\n cancelAndClean(uid, removed?.thumbUrl);\r\n const next = prev.filter(f => f.uid !== uid);\r\n if (removed) props.onChange?.({ file: { ...removed, status: 'removed' }, fileList: next });\r\n return next;\r\n });\r\n };\r\n\r\n const clearAll = () => {\r\n setFileList(prev => {\r\n prev.forEach(f => cancelAndClean(f.uid, f.thumbUrl));\r\n return [];\r\n });\r\n };\r\n\r\n return { fileList, processFiles, removeFile, clearAll, getProgress };\r\n}\r\n\r\nfunction ProgressBar(props: {\r\n percent: Accessor<number>;\r\n trackClass?: string;\r\n fillClass?: string;\r\n}) {\r\n return (\r\n <div class={cn('up26', props.trackClass)}>\r\n <div class={cn('up27', props.fillClass)} style={{ width: `${props.percent()}%` }} />\r\n </div>\r\n );\r\n}\r\n\r\nfunction CardProgressOverlay(props: { percent: Accessor<number> }) {\r\n return (\r\n <div class=\"up62\">\r\n <div class=\"up63\">\r\n <span class=\"loading loading-spinner loading-sm text-white\" />\r\n <span class=\"up64\">{props.percent()}%</span>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction PictureThumbLoading() {\r\n return (\r\n <div class=\"up51\">\r\n <span class=\"loading loading-spinner loading-xs text-white\" />\r\n </div>\r\n );\r\n}\r\n\r\nfunction TextFileList(props: {\r\n files: UploadFile[];\r\n onRemove: (uid: string) => void;\r\n onClearAll: () => void;\r\n showClearAll: boolean;\r\n classConfig?: string | UploadClassConfig;\r\n showTooltip?: boolean;\r\n}) {\r\n const listId = createUniqueId();\r\n return (\r\n <div id={listId} class={cn('up06', cls(props.classConfig, 'textList'))}>\r\n <Show when={props.showClearAll && props.files.length > 1}>\r\n <div class={cn('up44', cls(props.classConfig, 'listHeader'))}>\r\n <span class={cn('up45', cls(props.classConfig, 'listCount'))}>\r\n {props.files.length} files\r\n </span>\r\n <button\r\n class={cn('up46', cls(props.classConfig, 'clearBtn'))}\r\n onClick={props.onClearAll}\r\n title=\"Remove all\"\r\n >\r\n <Trash2 size={12} />\r\n Clear all\r\n </button>\r\n </div>\r\n </Show>\r\n <ul class=\"flex flex-col gap-2\">\r\n <For each={props.files}>\r\n {file => {\r\n const badge = getFileBadge(file.type, file.name);\r\n return (\r\n <li>\r\n <FileUploadItem\r\n file={file}\r\n badge={badge}\r\n onRemove={props.onRemove}\r\n classConfig={props.classConfig}\r\n showTooltip={props.showTooltip}\r\n />\r\n </li>\r\n );\r\n }}\r\n </For>\r\n </ul>\r\n </div>\r\n );\r\n}\r\n\r\nfunction FileUploadItem(props: {\r\n file: UploadFile;\r\n badge: { label: string; colorClass: string };\r\n onRemove: (uid: string) => void;\r\n classConfig?: string | UploadClassConfig;\r\n showTooltip?: boolean;\r\n}) {\r\n const isUploading = () => props.file.status === 'uploading';\r\n\r\n return (\r\n <div class={cn('up07', cls(props.classConfig, 'textItem'))}>\r\n <div class=\"flex min-w-0 flex-1 items-center gap-2\">\r\n <div class={cn('up08', props.badge.colorClass, cls(props.classConfig, 'textBadge'))}>\r\n {props.badge.label}\r\n </div>\r\n <Tooltip\r\n content={props.file.name}\r\n hidden={!props.showTooltip}\r\n class={{ root: 'up09' }}\r\n type=\"default\"\r\n >\r\n <span class={cn('up09', cls(props.classConfig, 'textName'))}>{props.file.name}</span>\r\n </Tooltip>\r\n <div class={cn('up10', cls(props.classConfig, 'textSize'))}>\r\n {formatFileSize(props.file.size)}\r\n </div>\r\n\r\n <Switch>\r\n <Match when={isUploading()}>\r\n <Spinner class=\"size-5\" />\r\n </Match>\r\n <Match when={props.file.status === 'done'}>\r\n <CircleCheck size={16} class=\"text-success\" />\r\n </Match>\r\n <Match when={props.file.status === 'error'}>\r\n <CircleX size={16} class=\"text-error\" />\r\n </Match>\r\n </Switch>\r\n\r\n <button\r\n class={cn('up57', cls(props.classConfig, 'removeBtn'))}\r\n onClick={() => props.onRemove(props.file.uid)}\r\n title=\"Remove\"\r\n >\r\n <X size={16} />\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction PictureFileList(props: {\r\n files: UploadFile[];\r\n onRemove: (uid: string) => void;\r\n onClearAll: () => void;\r\n showClearAll: boolean;\r\n getProgress: (uid: string) => Accessor<number>;\r\n classConfig?: string | UploadClassConfig;\r\n}) {\r\n const [preview, setPreview] = createSignal<UploadFile | null>(null);\r\n\r\n return (\r\n <>\r\n <div class={cn('up47', cls(props.classConfig, 'pictureList'))}>\r\n <Show when={props.showClearAll && props.files.length > 1}>\r\n <div class={cn('up44', cls(props.classConfig, 'listHeader'))}>\r\n <span class={cn('up45', cls(props.classConfig, 'listCount'))}>\r\n {props.files.length} files\r\n </span>\r\n <button\r\n class={cn('up46', cls(props.classConfig, 'clearBtn'))}\r\n onClick={props.onClearAll}\r\n title=\"Remove all\"\r\n >\r\n <Trash2 size={12} />\r\n Clear all\r\n </button>\r\n </div>\r\n </Show>\r\n <ul class=\"up48\">\r\n <For each={props.files}>\r\n {file => (\r\n <li\r\n class={cn(\r\n 'up49',\r\n file.status === 'uploading' && 'up49a',\r\n file.status === 'error' && 'up49b',\r\n cls(props.classConfig, 'pictureItem'),\r\n )}\r\n >\r\n <div class={cn('up50', cls(props.classConfig, 'pictureThumb'))}>\r\n <Show\r\n when={file.thumbUrl}\r\n fallback={\r\n <div\r\n class={cn(\r\n 'up53',\r\n getFileIconBg(file.type),\r\n cls(props.classConfig, 'pictureIcon'),\r\n )}\r\n >\r\n <span class={getFileIconColor(file.type)}>\r\n {getFileIconNode(file.type, 20)}\r\n </span>\r\n </div>\r\n }\r\n >\r\n <img src={file.thumbUrl} alt={file.name} />\r\n\r\n <Show when={file.status === 'uploading'}>\r\n <PictureThumbLoading />\r\n </Show>\r\n\r\n <Show when={file.status === 'done'}>\r\n <button class=\"up52\" onClick={() => setPreview(file)} title=\"Preview\">\r\n <ZoomIn size={14} />\r\n </button>\r\n </Show>\r\n </Show>\r\n </div>\r\n\r\n <div class={cn('up54', cls(props.classConfig, 'pictureInfo'))}>\r\n <div class=\"up36\">\r\n <span class=\"up21\" title={file.name}>\r\n {file.name}\r\n </span>\r\n <Show when={file.dimensions}>\r\n <span class=\"up37\">\r\n {file.dimensions!.width} × {file.dimensions!.height} px\r\n </span>\r\n </Show>\r\n <span class=\"up39\">{formatFileSize(file.size)}</span>\r\n </div>\r\n\r\n <Show when={file.status === 'uploading'}>\r\n <ProgressBar\r\n percent={props.getProgress(file.uid)}\r\n trackClass={cls(props.classConfig, 'progressTrack')}\r\n fillClass={cls(props.classConfig, 'progressFill')}\r\n />\r\n </Show>\r\n\r\n <Show when={file.status === 'done'}>\r\n <span class=\"up24\">\r\n <CircleCheck size={11} />\r\n Uploaded\r\n </span>\r\n </Show>\r\n\r\n <Show when={file.status === 'error'}>\r\n <span class=\"up23\">Upload failed</span>\r\n </Show>\r\n </div>\r\n\r\n <div class={cn('up55', cls(props.classConfig, 'pictureActions'))}>\r\n <Show when={file.status === 'done' && file.thumbUrl}>\r\n <button\r\n class={cn('up56', cls(props.classConfig, 'actionBtn'))}\r\n onClick={() => setPreview(file)}\r\n title=\"Preview\"\r\n >\r\n <Eye size={14} />\r\n </button>\r\n </Show>\r\n <button\r\n class={cn('up57', cls(props.classConfig, 'removeBtn'))}\r\n onClick={() => props.onRemove(file.uid)}\r\n title=\"Remove\"\r\n >\r\n <X size={14} class=\"shrink-0\" />\r\n </button>\r\n </div>\r\n </li>\r\n )}\r\n </For>\r\n </ul>\r\n </div>\r\n\r\n <Show when={preview()}>\r\n <ImagePreview\r\n src={preview()!.thumbUrl!}\r\n imageName={preview()!.name}\r\n size={formatFileSize(preview()!.size)}\r\n onClose={() => setPreview(null)}\r\n />\r\n </Show>\r\n </>\r\n );\r\n}\r\n\r\nfunction PictureCardFileList(props: {\r\n files: UploadFile[];\r\n onRemove: (uid: string) => void;\r\n onAdd: () => void;\r\n onClearAll: () => void;\r\n showAddButton: boolean;\r\n showClearAll: boolean;\r\n getProgress: (uid: string) => Accessor<number>;\r\n classConfig?: string | UploadClassConfig;\r\n}) {\r\n const [preview, setPreview] = createSignal<UploadFile | null>(null);\r\n\r\n return (\r\n <>\r\n <Show when={props.showClearAll && props.files.length > 1}>\r\n <div class={cn('up44', cls(props.classConfig, 'listHeader'))}>\r\n <span class={cn('up45', cls(props.classConfig, 'listCount'))}>\r\n {props.files.length} files\r\n </span>\r\n <button\r\n class={cn('up46', cls(props.classConfig, 'clearBtn'))}\r\n onClick={props.onClearAll}\r\n title=\"Remove all\"\r\n >\r\n <Trash2 size={12} />\r\n Clear all\r\n </button>\r\n </div>\r\n </Show>\r\n <div class={cn('up58', cls(props.classConfig, 'cardGrid'))}>\r\n <For each={props.files}>\r\n {file => (\r\n <div\r\n class={cn('up59', file.status === 'error' && 'up59a', cls(props.classConfig, 'card'))}\r\n >\r\n <Show\r\n when={file.thumbUrl}\r\n fallback={\r\n <div class={cn('up61', cls(props.classConfig, 'cardIcon'))}>\r\n {getFileIconNode(file.type, 24)}\r\n </div>\r\n }\r\n >\r\n <img\r\n src={file.thumbUrl}\r\n alt={file.name}\r\n class={cn('up60', cls(props.classConfig, 'cardImg'))}\r\n />\r\n </Show>\r\n\r\n <Show when={file.status === 'uploading'}>\r\n <CardProgressOverlay percent={props.getProgress(file.uid)} />\r\n </Show>\r\n\r\n <Show when={file.status !== 'uploading'}>\r\n <div class=\"up65\">\r\n <Show when={file.thumbUrl}>\r\n <button\r\n class={cn('up66', cls(props.classConfig, 'actionBtn'))}\r\n onClick={() => setPreview(file)}\r\n title=\"Preview\"\r\n >\r\n <Eye size={13} />\r\n </button>\r\n </Show>\r\n <button\r\n class={cn('up67', cls(props.classConfig, 'removeBtn'))}\r\n onClick={() => props.onRemove(file.uid)}\r\n title=\"Remove\"\r\n >\r\n <Trash2 size={13} />\r\n </button>\r\n </div>\r\n </Show>\r\n </div>\r\n )}\r\n </For>\r\n <Show when={props.showAddButton}>\r\n <button\r\n class={cn('up68', cls(props.classConfig, 'cardAdd'))}\r\n onClick={props.onAdd}\r\n title=\"Upload file\"\r\n >\r\n <CloudUpload size={20} class=\"opacity-40\" />\r\n <span class=\"up69\">Upload</span>\r\n </button>\r\n </Show>\r\n </div>\r\n\r\n <Show when={preview()}>\r\n <ImagePreview\r\n src={preview()!.thumbUrl!}\r\n imageName={preview()!.name}\r\n size={formatFileSize(preview()!.size)}\r\n onClose={() => setPreview(null)}\r\n />\r\n </Show>\r\n </>\r\n );\r\n}\r\n\r\nfunction UploadBase(p: UploadProps) {\r\n p = mergeProps(\r\n {\r\n multiple: true,\r\n listType: 'text' as const,\r\n showUploadList: true,\r\n showTooltip: false,\r\n },\r\n p,\r\n );\r\n\r\n let inputRef!: HTMLInputElement;\r\n const { fileList, processFiles, removeFile, clearAll, getProgress } = useUpload(p);\r\n\r\n const triggerInput = () => inputRef.click();\r\n\r\n const handleInputChange = (e: Event) => {\r\n const input = e.currentTarget as HTMLInputElement;\r\n if (input.files?.length) processFiles(input.files);\r\n input.value = '';\r\n };\r\n\r\n const showAddButton = () => {\r\n if (!p.multiple && fileList().length >= 1) return false;\r\n if (p.maxCount && fileList().length >= p.maxCount) return false;\r\n return true;\r\n };\r\n\r\n const effectiveShowClearAll = () => p.showClearAll ?? p.multiple !== false;\r\n\r\n return (\r\n <div class={wrapperCls(p.class, 'up01')}>\r\n <input\r\n ref={inputRef}\r\n type=\"file\"\r\n class=\"hidden\"\r\n multiple={p.multiple}\r\n accept={p.accept}\r\n {...(p.directory ? { webkitdirectory: '' } : {})}\r\n onChange={handleInputChange}\r\n />\r\n\r\n <Switch>\r\n <Match when={p.listType === 'picture-card'}>\r\n <Show when={p.showUploadList}>\r\n <PictureCardFileList\r\n files={fileList()}\r\n onRemove={removeFile}\r\n onAdd={triggerInput}\r\n onClearAll={clearAll}\r\n showAddButton={showAddButton()}\r\n showClearAll={effectiveShowClearAll()}\r\n getProgress={getProgress}\r\n classConfig={p.class}\r\n />\r\n </Show>\r\n <Show when={!p.showUploadList}>\r\n <div onClick={triggerInput} class=\"w-fit cursor-pointer\">\r\n {p.children}\r\n </div>\r\n </Show>\r\n </Match>\r\n <Match when={p.listType !== 'picture-card'}>\r\n <div\r\n onClick={showAddButton() ? triggerInput : undefined}\r\n class={showAddButton() ? 'w-fit cursor-pointer' : ''}\r\n >\r\n {p.children}\r\n </div>\r\n <Show when={p.showUploadList && fileList().length > 0}>\r\n <Switch>\r\n <Match when={p.listType === 'picture'}>\r\n <PictureFileList\r\n files={fileList()}\r\n onRemove={removeFile}\r\n onClearAll={clearAll}\r\n showClearAll={effectiveShowClearAll()}\r\n getProgress={getProgress}\r\n classConfig={p.class}\r\n />\r\n </Match>\r\n <Match when={p.listType === 'text'}>\r\n <TextFileList\r\n files={fileList()}\r\n onRemove={removeFile}\r\n onClearAll={clearAll}\r\n showClearAll={effectiveShowClearAll()}\r\n classConfig={p.class}\r\n showTooltip={p.showTooltip}\r\n />\r\n </Match>\r\n </Switch>\r\n </Show>\r\n </Match>\r\n </Switch>\r\n\r\n <Show when={p.errorMessage}>\r\n <div class={cn('up76', cls(p.class, 'errorMessage'))}>{p.errorMessage}</div>\r\n </Show>\r\n </div>\r\n );\r\n}\r\n\r\nfunction UploadDragger(p: UploadDraggerProps) {\r\n p = mergeProps(\r\n {\r\n multiple: true,\r\n listType: 'text' as const,\r\n showUploadList: true,\r\n hint: 'Support for a single or bulk upload',\r\n showTooltip: false,\r\n },\r\n p,\r\n );\r\n\r\n let inputRef!: HTMLInputElement;\r\n const [isDragging, setIsDragging] = createSignal(false);\r\n const { fileList, processFiles, removeFile, clearAll, getProgress } = useUpload(p);\r\n const effectiveShowClearAll = () => p.showClearAll ?? p.multiple !== false;\r\n\r\n const triggerInput = () => inputRef.click();\r\n\r\n const handleInputChange = (e: Event) => {\r\n const input = e.currentTarget as HTMLInputElement;\r\n if (input.files?.length) processFiles(input.files);\r\n input.value = '';\r\n };\r\n\r\n const handleDragOver = (e: DragEvent) => {\r\n e.preventDefault();\r\n setIsDragging(true);\r\n };\r\n\r\n const handleDragLeave = (e: DragEvent) => {\r\n e.preventDefault();\r\n setIsDragging(false);\r\n };\r\n\r\n const handleDrop = (e: DragEvent) => {\r\n e.preventDefault();\r\n setIsDragging(false);\r\n const files = e.dataTransfer?.files;\r\n if (files?.length) processFiles(files);\r\n };\r\n\r\n const showAddButton = () => {\r\n if (!p.multiple && fileList().length >= 1) return false;\r\n if (p.maxCount && fileList().length >= p.maxCount) return false;\r\n return true;\r\n };\r\n\r\n return (\r\n <div class={wrapperCls(p.class, 'up01')}>\r\n <input\r\n ref={inputRef}\r\n type=\"file\"\r\n class=\"hidden\"\r\n multiple={p.multiple}\r\n accept={p.accept}\r\n {...(p.directory ? { webkitdirectory: '' } : {})}\r\n onChange={handleInputChange}\r\n />\r\n\r\n <Show when={p.listType === 'picture-card'}>\r\n <Show when={p.showUploadList}>\r\n <PictureCardFileList\r\n files={fileList()}\r\n onRemove={removeFile}\r\n onAdd={triggerInput}\r\n onClearAll={clearAll}\r\n showAddButton={showAddButton()}\r\n showClearAll={effectiveShowClearAll()}\r\n getProgress={getProgress}\r\n classConfig={p.class}\r\n />\r\n </Show>\r\n </Show>\r\n\r\n <Show when={p.listType !== 'picture-card'}>\r\n <Show when={showAddButton()}>\r\n <div\r\n class={cn('up02', isDragging() && 'up02a', cls(p.class, 'dragger'))}\r\n onClick={triggerInput}\r\n onDragOver={handleDragOver}\r\n onDragLeave={handleDragLeave}\r\n onDrop={handleDrop}\r\n >\r\n <div class={cn('up03', cls(p.class, 'draggerIcon'))}>\r\n <Show when={p.icon} fallback={<CloudUpload size={48} strokeWidth={1.5} />}>\r\n {p.icon}\r\n </Show>\r\n </div>\r\n <Show\r\n when={p.children}\r\n fallback={\r\n <>\r\n <p class={cn('up04', cls(p.class, 'draggerTitle'))}>\r\n Click or drag file to this area to upload\r\n </p>\r\n <p class={cn('up05', cls(p.class, 'draggerHint'))}>{p.hint}</p>\r\n </>\r\n }\r\n >\r\n {p.children}\r\n </Show>\r\n </div>\r\n </Show>\r\n\r\n <Show when={p.showUploadList && fileList().length > 0}>\r\n <Switch>\r\n <Match when={p.listType === 'picture'}>\r\n <PictureFileList\r\n files={fileList()}\r\n onRemove={removeFile}\r\n onClearAll={clearAll}\r\n showClearAll={effectiveShowClearAll()}\r\n getProgress={getProgress}\r\n classConfig={p.class}\r\n />\r\n </Match>\r\n <Match when={p.listType === 'text'}>\r\n <TextFileList\r\n files={fileList()}\r\n onRemove={removeFile}\r\n onClearAll={clearAll}\r\n showClearAll={effectiveShowClearAll()}\r\n classConfig={p.class}\r\n showTooltip={p.showTooltip}\r\n />\r\n </Match>\r\n </Switch>\r\n </Show>\r\n </Show>\r\n\r\n <Show when={p.errorMessage}>\r\n <div class={cn('up76', cls(p.class, 'errorMessage'))}>{p.errorMessage}</div>\r\n </Show>\r\n </div>\r\n );\r\n}\r\n\r\nexport const Upload = UploadBase as UploadComponent;\r\nUpload.Dragger = UploadDragger;\r\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"z-index.context.js","names":[],"sources":["../../../../src/components/z-index/z-index.context.ts"],"sourcesContent":["import { createContext, useContext } from 'solid-js';\r\n\r\n/**\r\n * Holds the z-index of the nearest ZIndex ancestor that is a container type\r\n * (MODAL, OVERLAY). Child ZIndex components use this to compute their own\r\n * z-index relative to the parent container, ensuring correct stacking in\r\n * nested scenarios (e.g., dropdown inside modal).\r\n *\r\n * undefined = no ZIndex container ancestor (top-level context).\r\n */\r\nexport const ZIndexContext = createContext<number | undefined>(undefined);\r\n\r\n/** Returns the z-index of the nearest ZIndex container ancestor, if any. */\r\nexport function useParentZIndex(): number | undefined {\r\n return useContext(ZIndexContext);\r\n}\r\n\r\n/**\r\n * Returns the z-index of the nearest ZIndex container ancestor.\r\n * Useful for reading the current overlay z-index level in child components.\r\n */\r\nexport function useZIndex(): number | undefined {\r\n return useContext(ZIndexContext);\r\n}\r\n"],"mappings":"yDAUA,IAAa,EAAgB,EAAkC,IAAA,GAAU,CAGzE,SAAgB,GAAsC,CACpD,OAAO,EAAW,EAAc"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"z-index.js","names":["createEffect","mergeProps","on","onCleanup","ParentComponent","Show","Portal","cn","acquire","acquireScrollLock","release","releaseScrollLock","useParentZIndex","ZIndexContext","ZIndexType","ZIndexProps","OFFSET","Record","DROPDOWN","POPOVER","OVERLAY","MODAL","TOOLTIP","TOAST","RELATIVE_OFFSET","Partial","CONTAINER_TYPES","Set","computeEffectiveBase","type","globalBase","parentZIndex","undefined","relativeOffset","ZIndex","props","p","positioning","const","baseIndex","startIndex","Inner","innerProps","zIndex","customValue","onZIndex","blockScroll","releaseScrollLockOnUnmount","effectiveBase","acquired","releaseZIndexAndScrollLock","registryKey","offset","isContainer","has","_$createComponent","children","_el$","_tmpl$","_$insert","Provider","value","_$effect","_p$","_v$","class","_v$2","position","e","_$className","t","_$style","PreRenderInner","releaseZIndex","scrollLockHeld","open","defer","releaseScrollLockIfHeld","_el$2","_v$3","_v$4","display","preRender","when"],"sources":["../../../../src/components/z-index/z-index.tsx"],"sourcesContent":["import { createEffect, mergeProps, on, onCleanup, ParentComponent, Show } from 'solid-js';\r\nimport { Portal } from 'solid-js/web';\r\nimport { cn } from '@/utils/cn';\r\nimport { acquire, acquireScrollLock, release, releaseScrollLock } from './z-index.store';\r\nimport { useParentZIndex, ZIndexContext } from './z-index.context';\r\nimport { ZIndexType, type ZIndexProps } from './z-index.types';\r\n\r\nexport { ZIndexType } from './z-index.types';\r\nexport type { ZIndexProps } from './z-index.types';\r\nexport { acquire, release } from './z-index.store';\r\n\r\n/** Base z-index for each type group when no parent context exists. */\r\nexport const OFFSET: Record<ZIndexType, number> = {\r\n [ZIndexType.DROPDOWN]: 200,\r\n [ZIndexType.POPOVER]: 200,\r\n [ZIndexType.OVERLAY]: 500,\r\n [ZIndexType.MODAL]: 1000,\r\n [ZIndexType.TOOLTIP]: 1500,\r\n [ZIndexType.TOAST]: 3000,\r\n};\r\n\r\n/**\r\n * Relative offset added to the parent container's z-index when a child popup\r\n * renders inside a container (MODAL or OVERLAY). This ensures correct stacking:\r\n * e.g., a dropdown inside a modal gets parentZIndex + 50, always above the modal.\r\n */\r\nconst RELATIVE_OFFSET: Partial<Record<ZIndexType, number>> = {\r\n [ZIndexType.DROPDOWN]: 10,\r\n [ZIndexType.POPOVER]: 20,\r\n [ZIndexType.TOOLTIP]: 30,\r\n};\r\n\r\n/**\r\n * Container types that publish their z-index via ZIndexContext so that\r\n * child popup components can calculate their z-index relative to this parent.\r\n */\r\nconst CONTAINER_TYPES = new Set<ZIndexType>([ZIndexType.MODAL, ZIndexType.OVERLAY]);\r\n\r\n/**\r\n * Compute the effective base index for slot allocation.\r\n *\r\n * - If a parent container z-index exists AND this type has a relative offset:\r\n * use `parentZIndex + relativeOffset` (context-aware mode).\r\n * - Otherwise: use the global `baseIndex` from OFFSET (top-level mode).\r\n */\r\nfunction computeEffectiveBase(\r\n type: string,\r\n globalBase: number,\r\n parentZIndex: number | undefined,\r\n): number {\r\n if (parentZIndex === undefined) return globalBase;\r\n const relativeOffset = RELATIVE_OFFSET[type as ZIndexType];\r\n if (relativeOffset === undefined) return globalBase;\r\n return parentZIndex + relativeOffset;\r\n}\r\n\r\n/**\r\n * ZIndex — wrapper component that renders children via Portal with an\r\n * auto-managed z-index from a centralized global registry.\r\n *\r\n * When `open` becomes true, it acquires the next available z-index slot\r\n * for the given type group. When `open` becomes false (or the component\r\n * unmounts), the slot is released back to the pool.\r\n *\r\n * Container types (MODAL, OVERLAY) additionally publish their z-index via\r\n * ZIndexContext, allowing nested popup children to auto-offset correctly.\r\n */\r\nexport const ZIndex: ParentComponent<ZIndexProps> = props => {\r\n const p = mergeProps({ positioning: 'fixed' as const }, props);\r\n\r\n const baseIndex = (): number => {\r\n if (p.startIndex !== undefined) return p.startIndex;\r\n return OFFSET[p.type as ZIndexType] ?? 0;\r\n };\r\n\r\n /**\r\n * Inner component — only rendered when `open` is true (or always when preRender).\r\n * This ties acquire/release to the actual Portal mount/unmount lifecycle.\r\n */\r\n const Inner: ParentComponent = innerProps => {\r\n let zIndex: number;\r\n\r\n if (p.customValue !== undefined) {\r\n zIndex = p.customValue;\r\n p.onZIndex?.(zIndex);\r\n if (p.blockScroll) acquireScrollLock();\r\n onCleanup(function releaseScrollLockOnUnmount() {\r\n if (p.blockScroll) releaseScrollLock();\r\n });\r\n } else {\r\n const parentZIndex = useParentZIndex();\r\n const effectiveBase = computeEffectiveBase(p.type, baseIndex(), parentZIndex);\r\n const acquired = acquire(p.type, effectiveBase);\r\n zIndex = acquired.zIndex;\r\n p.onZIndex?.(zIndex);\r\n if (p.blockScroll) acquireScrollLock();\r\n onCleanup(function releaseZIndexAndScrollLock() {\r\n release(acquired.registryKey, acquired.offset);\r\n if (p.blockScroll) releaseScrollLock();\r\n });\r\n }\r\n\r\n const isContainer = CONTAINER_TYPES.has(p.type as ZIndexType);\r\n\r\n // Container types (MODAL, OVERLAY) publish their z-index via ZIndexContext\r\n // so that nested popups (Dropdown, Tooltip…) can auto-offset correctly.\r\n // The Provider MUST live INSIDE the Portal so SolidJS's reactive ownership\r\n // tree propagates the context into the Portal's scope. Wrapping the Portal\r\n // element from the outside does NOT work because Portal creates its own\r\n // reactive scope when mounting into document.body.\r\n return (\r\n <Portal>\r\n <div\r\n class={cn(p.positioning === 'fixed' ? 'fixed' : 'absolute', p.class)}\r\n style={{ 'z-index': zIndex, ...p.position }}\r\n >\r\n {isContainer ? (\r\n <ZIndexContext.Provider value={zIndex}>{innerProps.children}</ZIndexContext.Provider>\r\n ) : (\r\n innerProps.children\r\n )}\r\n </div>\r\n </Portal>\r\n );\r\n };\r\n\r\n /**\r\n * PreRenderInner — always mounted in the DOM, but manages z-index/scroll\r\n * reactively based on `open`. Portal is always rendered; visibility is\r\n * controlled via CSS display:none when closed.\r\n */\r\n const PreRenderInner: ParentComponent = innerProps => {\r\n let zIndex: number;\r\n const parentZIndex = useParentZIndex();\r\n\r\n if (p.customValue !== undefined) {\r\n zIndex = p.customValue;\r\n } else {\r\n const effectiveBase = computeEffectiveBase(p.type, baseIndex(), parentZIndex);\r\n const acquired = acquire(p.type, effectiveBase);\r\n zIndex = acquired.zIndex;\r\n onCleanup(function releaseZIndex() {\r\n release(acquired.registryKey, acquired.offset);\r\n });\r\n }\r\n\r\n // Reactively manage scroll lock based on open state.\r\n // Track whether we've acquired the lock to avoid double-release.\r\n let scrollLockHeld = false;\r\n createEffect(\r\n on(\r\n () => p.open,\r\n open => {\r\n if (open) {\r\n if (p.blockScroll && !scrollLockHeld) {\r\n acquireScrollLock();\r\n scrollLockHeld = true;\r\n }\r\n p.onZIndex?.(zIndex);\r\n } else {\r\n if (p.blockScroll && scrollLockHeld) {\r\n releaseScrollLock();\r\n scrollLockHeld = false;\r\n }\r\n }\r\n },\r\n { defer: false },\r\n ),\r\n );\r\n onCleanup(function releaseScrollLockIfHeld() {\r\n if (p.blockScroll && scrollLockHeld) {\r\n releaseScrollLock();\r\n scrollLockHeld = false;\r\n }\r\n });\r\n\r\n const isContainer = CONTAINER_TYPES.has(p.type as ZIndexType);\r\n\r\n return (\r\n <Portal>\r\n <div\r\n class={cn(p.positioning === 'fixed' ? 'fixed' : 'absolute', p.class)}\r\n style={{ 'z-index': zIndex, display: p.open ? undefined : 'none', ...p.position }}\r\n >\r\n {isContainer ? (\r\n <ZIndexContext.Provider value={zIndex}>{innerProps.children}</ZIndexContext.Provider>\r\n ) : (\r\n innerProps.children\r\n )}\r\n </div>\r\n </Portal>\r\n );\r\n };\r\n\r\n return p.preRender ? (\r\n <PreRenderInner>{p.children}</PreRenderInner>\r\n ) : (\r\n <Show when={p.open}>\r\n <Inner>{p.children}</Inner>\r\n </Show>\r\n );\r\n};\r\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"z-index.store.js","names":[],"sources":["../../../../src/components/z-index/z-index.store.ts"],"sourcesContent":["/**\r\n * Global z-index registry.\r\n *\r\n * Tracks occupied z-index slots using a composite key `type@baseIndex`.\r\n * This allows the same ZIndexType to have multiple independent slot pools\r\n * when different base indexes are used (e.g., DROPDOWN inside modal A vs modal B).\r\n * When a slot is released (component unmounts), it becomes available for reuse,\r\n * keeping z-index values compact instead of endlessly incrementing.\r\n */\r\nconst registry = new Map<string, Set<number>>();\r\n\r\nexport type AcquireResult = { zIndex: number; registryKey: string; offset: number };\r\n\r\n/** Acquire the lowest available z-index slot for the given type + base combination. */\r\nexport function acquire(type: string, baseIndex: number): AcquireResult {\r\n const registryKey = `${type}@${baseIndex}`;\r\n let slots = registry.get(registryKey);\r\n if (!slots) {\r\n slots = new Set();\r\n registry.set(registryKey, slots);\r\n }\r\n let offset = 0;\r\n while (slots.has(offset)) offset++;\r\n slots.add(offset);\r\n return { zIndex: baseIndex + offset, registryKey, offset };\r\n}\r\n\r\n/** Release a previously acquired slot back to the pool. */\r\nexport function release(registryKey: string, offset: number): void {\r\n const slots = registry.get(registryKey);\r\n if (!slots) return;\r\n slots.delete(offset);\r\n if (slots.size === 0) registry.delete(registryKey);\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Scroll lock\r\n// ---------------------------------------------------------------------------\r\n\r\nlet scrollLockCount = 0;\r\nlet savedOverflow = '';\r\n\r\n/** Increment scroll lock counter. Locks body scroll on first call. */\r\nexport function acquireScrollLock(): void {\r\n if (scrollLockCount === 0) {\r\n savedOverflow = document.body.style.overflow;\r\n document.body.style.overflow = 'hidden';\r\n }\r\n scrollLockCount++;\r\n}\r\n\r\n/** Decrement scroll lock counter. Restores body scroll when counter reaches 0. */\r\nexport function releaseScrollLock(): void {\r\n if (scrollLockCount <= 0) return;\r\n scrollLockCount--;\r\n if (scrollLockCount === 0) {\r\n document.body.style.overflow = savedOverflow;\r\n savedOverflow = '';\r\n }\r\n}\r\n"],"mappings":"AASA,IAAM,EAAW,IAAI,IAKrB,SAAgB,EAAQ,EAAc,EAAkC,CACtE,IAAM,EAAc,GAAG,EAAK,GAAG,IAC3B,EAAQ,EAAS,IAAI,EAAY,CAChC,IACH,EAAQ,IAAI,IACZ,EAAS,IAAI,EAAa,EAAM,EAElC,IAAI,EAAS,EACb,KAAO,EAAM,IAAI,EAAO,EAAE,IAE1B,OADA,EAAM,IAAI,EAAO,CACV,CAAE,OAAQ,EAAY,EAAQ,cAAa,SAAQ,CAI5D,SAAgB,EAAQ,EAAqB,EAAsB,CACjE,IAAM,EAAQ,EAAS,IAAI,EAAY,CAClC,IACL,EAAM,OAAO,EAAO,CAChB,EAAM,OAAS,GAAG,EAAS,OAAO,EAAY,EAOpD,IAAI,EAAkB,EAClB,EAAgB,GAGpB,SAAgB,GAA0B,CACpC,IAAoB,IACtB,EAAgB,SAAS,KAAK,MAAM,SACpC,SAAS,KAAK,MAAM,SAAW,UAEjC,IAIF,SAAgB,GAA0B,CACpC,GAAmB,IACvB,IACI,IAAoB,IACtB,SAAS,KAAK,MAAM,SAAW,EAC/B,EAAgB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"z-index.types.js","names":[],"sources":["../../../../src/components/z-index/z-index.types.ts"],"sourcesContent":["import { JSX } from 'solid-js';\r\n\r\nexport enum ZIndexType {\r\n DROPDOWN = 'dropdown',\r\n MODAL = 'modal',\r\n TOOLTIP = 'tooltip',\r\n TOAST = 'toast',\r\n POPOVER = 'popover',\r\n OVERLAY = 'overlay',\r\n}\r\n\r\ntype TypeDefault = {\r\n type: ZIndexType;\r\n startIndex?: never;\r\n};\r\n\r\ntype CustomType = {\r\n type: string;\r\n startIndex: number;\r\n};\r\n\r\nexport type ZIndexProps = {\r\n /** Controls Portal mounting. When false, no DOM is rendered and no z-index slot is occupied. */\r\n open: boolean;\r\n /** CSS position type for the wrapper div. Defaults to 'fixed'. */\r\n positioning?: 'fixed' | 'absolute';\r\n /** Inline position styles (top, left, right, bottom, width, height, etc.). */\r\n position?: JSX.CSSProperties;\r\n /** Additional class for the wrapper div. */\r\n class?: string;\r\n /** Callback that receives the computed z-index when the Portal mounts. */\r\n onZIndex?: (zIndex: number) => void;\r\n /**\r\n * When true, blocks scroll on document.body while this layer is open.\r\n * Scroll inside children remains functional.\r\n * Multiple concurrent layers with blockScroll share a reference counter,\r\n * so body scroll is only restored when all of them are closed.\r\n * Defaults to false.\r\n */\r\n blockScroll?: boolean;\r\n /**\r\n * When provided, this value is used directly as the z-index without going\r\n * through the auto-allocation registry. No slot is acquired or released.\r\n * Takes precedence over the type-based computation and startIndex.\r\n */\r\n customValue?: number;\r\n /**\r\n * When true, the Portal is always mounted in the DOM regardless of `open`.\r\n * Visibility is controlled via CSS (display:none when closed).\r\n * Z-index slot and scroll lock are still only active when `open` is true.\r\n */\r\n preRender?: boolean;\r\n} & (TypeDefault | CustomType);\r\n"],"mappings":"AAEA,IAAY,EAAL,SAAA,EAAA,OACL,GAAA,SAAA,WACA,EAAA,MAAA,QACA,EAAA,QAAA,UACA,EAAA,MAAA,QACA,EAAA,QAAA,UACA,EAAA,QAAA,gBACD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cn.js","names":[],"sources":["../../../src/utils/cn.ts"],"sourcesContent":["import { ClassValue, clsx } from 'clsx';\r\nimport { twMerge } from 'tailwind-merge';\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n"],"mappings":"qEAGA,SAAgB,EAAG,GAAG,EAAsB,CAC1C,OAAO,EAAQ,EAAK,EAAO,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"element-tracker.js","names":[],"sources":["../../../src/utils/element-tracker.ts"],"sourcesContent":["/**\r\n * element-tracker.ts\r\n *\r\n * Singleton global tracker để theo dõi vị trí và kích thước của một element.\r\n * Dùng chung cho các component như NewDropdown (blockScroll=false), Tooltip, Popover...\r\n *\r\n * Cơ chế:\r\n * - ResizeObserver: phát hiện element thay đổi kích thước.\r\n * - scroll event (capture, passive): phát hiện scroll ở bất kỳ container nào.\r\n * Chỉ đăng ký 1 listener duy nhất trên window; tự tháo khi không còn element nào.\r\n * - IntersectionObserver: phát hiện trigger đi vào/ra viewport để cập nhật rect.\r\n *\r\n * Mỗi element chỉ được track bởi 1 callback tại một thời điểm.\r\n * Gọi `untrackElement(el)` để dừng theo dõi và giải phóng bộ nhớ.\r\n */\r\n\r\nexport type TrackedRect = {\r\n top: number;\r\n left: number;\r\n width: number;\r\n height: number;\r\n};\r\n\r\ntype TrackCallback = (rect: TrackedRect) => void;\r\n\r\n// ── Singleton state ──────────────────────────────────────────────────────────\r\n\r\nconst callbacks = new Map<Element, TrackCallback>();\r\n\r\n// ResizeObserver: fires khi target thay đổi kích thước\r\nconst resizeObserver = new ResizeObserver(entries => {\r\n for (const entry of entries) {\r\n const cb = callbacks.get(entry.target);\r\n if (cb) cb(getRect(entry.target));\r\n }\r\n});\r\n\r\n// IntersectionObserver: bắt khi trigger đi vào/ra viewport (bị scroll ra khỏi tầm nhìn)\r\nconst intersectionObserver = new IntersectionObserver(\r\n entries => {\r\n for (const entry of entries) {\r\n const cb = callbacks.get(entry.target);\r\n if (cb) cb(getRect(entry.target));\r\n }\r\n },\r\n { threshold: [0, 1] },\r\n);\r\n\r\n// scroll listener dùng chung — capture phase để bắt scroll ở mọi container\r\n// rAF dedup: gộp tất cả scroll events trong cùng 1 frame thành 1 lần getBoundingClientRect\r\nlet rafId = 0;\r\n\r\nconst onScroll = () => {\r\n if (rafId) return; // frame đã pending → bỏ qua, tránh gọi getBoundingClientRect nhiều lần/frame\r\n rafId = requestAnimationFrame(() => {\r\n rafId = 0;\r\n callbacks.forEach((cb, el) => cb(getRect(el)));\r\n });\r\n};\r\nlet scrollListenerAttached = false;\r\n\r\nfunction attachScrollListener() {\r\n if (!scrollListenerAttached) {\r\n window.addEventListener('scroll', onScroll, { passive: true, capture: true });\r\n scrollListenerAttached = true;\r\n }\r\n}\r\n\r\nfunction detachScrollListener() {\r\n if (scrollListenerAttached && callbacks.size === 0) {\r\n window.removeEventListener('scroll', onScroll, { capture: true });\r\n scrollListenerAttached = false;\r\n if (rafId) {\r\n cancelAnimationFrame(rafId);\r\n rafId = 0;\r\n }\r\n }\r\n}\r\n\r\nfunction getRect(el: Element): TrackedRect {\r\n const r = el.getBoundingClientRect();\r\n return { top: r.top, left: r.left, width: r.width, height: r.height };\r\n}\r\n\r\n// ── Public API ───────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Bắt đầu theo dõi vị trí của `el`.\r\n * `callback` sẽ được gọi ngay lập tức với rect hiện tại,\r\n * và mỗi khi el thay đổi kích thước hoặc scroll.\r\n */\r\nexport function trackElement(el: Element, callback: TrackCallback): void {\r\n callbacks.set(el, callback);\r\n resizeObserver.observe(el);\r\n intersectionObserver.observe(el);\r\n attachScrollListener();\r\n // Gọi ngay để caller có rect ban đầu\r\n callback(getRect(el));\r\n}\r\n\r\n/**\r\n * Dừng theo dõi `el` và giải phóng bộ nhớ.\r\n */\r\nexport function untrackElement(el: Element): void {\r\n callbacks.delete(el);\r\n resizeObserver.unobserve(el);\r\n intersectionObserver.unobserve(el);\r\n detachScrollListener();\r\n}\r\n"],"mappings":"AA2BA,IAAM,EAAY,IAAI,IAGhB,EAAiB,IAAI,eAAe,GAAW,CACnD,IAAK,IAAM,KAAS,EAAS,CAC3B,IAAM,EAAK,EAAU,IAAI,EAAM,OAAO,CAClC,GAAI,EAAG,EAAQ,EAAM,OAAO,CAAC,GAEnC,CAGI,EAAuB,IAAI,qBAC/B,GAAW,CACT,IAAK,IAAM,KAAS,EAAS,CAC3B,IAAM,EAAK,EAAU,IAAI,EAAM,OAAO,CAClC,GAAI,EAAG,EAAQ,EAAM,OAAO,CAAC,GAGrC,CAAE,UAAW,CAAC,EAAG,EAAE,CAAE,CACtB,CAIG,EAAQ,EAEN,MAAiB,CACjB,AACJ,IAAQ,0BAA4B,CAClC,EAAQ,EACR,EAAU,SAAS,EAAI,IAAO,EAAG,EAAQ,EAAG,CAAC,CAAC,EAC9C,EAEA,EAAyB,GAE7B,SAAS,GAAuB,CAC9B,AAEE,KADA,OAAO,iBAAiB,SAAU,EAAU,CAAE,QAAS,GAAM,QAAS,GAAM,CAAC,CACpD,IAI7B,SAAS,GAAuB,CAC1B,GAA0B,EAAU,OAAS,IAC/C,OAAO,oBAAoB,SAAU,EAAU,CAAE,QAAS,GAAM,CAAC,CACjE,EAAyB,GACzB,AAEE,KADA,qBAAqB,EAAM,CACnB,IAKd,SAAS,EAAQ,EAA0B,CACzC,IAAM,EAAI,EAAG,uBAAuB,CACpC,MAAO,CAAE,IAAK,EAAE,IAAK,KAAM,EAAE,KAAM,MAAO,EAAE,MAAO,OAAQ,EAAE,OAAQ,CAUvE,SAAgB,EAAa,EAAa,EAA+B,CACvE,EAAU,IAAI,EAAI,EAAS,CAC3B,EAAe,QAAQ,EAAG,CAC1B,EAAqB,QAAQ,EAAG,CAChC,GAAsB,CAEtB,EAAS,EAAQ,EAAG,CAAC,CAMvB,SAAgB,EAAe,EAAmB,CAChD,EAAU,OAAO,EAAG,CACpB,EAAe,UAAU,EAAG,CAC5B,EAAqB,UAAU,EAAG,CAClC,GAAsB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helper.js","names":[],"sources":["../../../src/utils/helper.ts"],"sourcesContent":["import { BaseColorProps } from '@/type';\r\nimport { JSX } from 'solid-js';\r\n\r\ntype TimingFunction =\r\n | 'ease'\r\n | 'ease-in'\r\n | 'ease-out'\r\n | 'ease-in-out'\r\n | 'linear'\r\n | 'step-start'\r\n | 'step-end'\r\n | `steps(${number}, ${'start' | 'end'})`\r\n | `cubic-bezier(${number}, ${number}, ${number}, ${number})`;\r\n\r\ntype AnimationDirection = 'normal' | 'reverse' | 'alternate' | 'alternate-reverse';\r\ntype FillMode = 'none' | 'forwards' | 'backwards' | 'both';\r\ntype PlayState = 'running' | 'paused';\r\ntype TimeUnit = `${number}s` | `${number}ms`;\r\ntype IterationCount = number | 'infinite';\r\n\r\nexport interface AnimationConfig {\r\n name: string;\r\n duration?: TimeUnit;\r\n timingFunction?: TimingFunction;\r\n delay?: TimeUnit;\r\n iterationCount?: IterationCount;\r\n direction?: AnimationDirection;\r\n fillMode?: FillMode;\r\n playState?: PlayState;\r\n}\r\nconst DEFAULT_VALUES = {\r\n duration: '1s',\r\n timingFunction: 'ease',\r\n delay: '0s',\r\n iterationCount: 1,\r\n direction: 'normal',\r\n fillMode: 'none',\r\n playState: 'running',\r\n} as const;\r\nexport function renderCSSAnimation(config: AnimationConfig): string {\r\n const {\r\n name,\r\n duration = DEFAULT_VALUES.duration,\r\n timingFunction = DEFAULT_VALUES.timingFunction,\r\n delay = DEFAULT_VALUES.delay,\r\n iterationCount = DEFAULT_VALUES.iterationCount,\r\n direction = DEFAULT_VALUES.direction,\r\n fillMode = DEFAULT_VALUES.fillMode,\r\n playState = DEFAULT_VALUES.playState,\r\n } = config;\r\n\r\n return `${name} ${duration} ${timingFunction} ${delay} ${iterationCount} ${direction} ${fillMode} ${playState}`;\r\n}\r\nexport function createThrottle<T extends (...args: any[]) => void>(\r\n fn: T,\r\n delay: number,\r\n): T & { cancel: () => void } {\r\n let lastCall = 0;\r\n let timer: ReturnType<typeof setTimeout> | null = null;\r\n const throttled = (...args: Parameters<T>) => {\r\n const now = Date.now();\r\n const remaining = delay - (now - lastCall);\r\n if (timer) {\r\n clearTimeout(timer);\r\n timer = null;\r\n }\r\n if (remaining <= 0) {\r\n lastCall = now;\r\n fn(...args);\r\n } else {\r\n timer = setTimeout(() => {\r\n lastCall = Date.now();\r\n timer = null;\r\n fn(...args);\r\n }, remaining);\r\n }\r\n };\r\n throttled.cancel = () => {\r\n if (timer) {\r\n clearTimeout(timer);\r\n timer = null;\r\n }\r\n };\r\n return throttled as T & { cancel: () => void };\r\n}\r\nconst generateRandomHexColor = (): string => {\r\n const randomColor = Math.floor(Math.random() * 16777215).toString(16);\r\n return `#${randomColor.padStart(6, '0')}`;\r\n};\r\n\r\nexport function normalizeHexColor(value: string | undefined): string {\r\n if (!value) return generateRandomHexColor();\r\n let hex = value.trim().replace(/^#/, '');\r\n if (hex.length === 3) {\r\n hex = hex\r\n .split('')\r\n .map(char => char + char)\r\n .join('');\r\n }\r\n\r\n return `#${hex.toLowerCase()}`;\r\n}\r\nexport function getColor(color?: BaseColorProps | string, defaultColor?: string) {\r\n switch (color) {\r\n case 'primary':\r\n return 'color-primary';\r\n case 'neutral':\r\n return 'color-neutral';\r\n case 'secondary':\r\n return 'color-secondary';\r\n case 'accent':\r\n return 'color-accent';\r\n case 'info':\r\n return 'color-info';\r\n case 'success':\r\n return 'color-success';\r\n case 'warning':\r\n return 'color-warning';\r\n case 'error':\r\n return 'color-error';\r\n default:\r\n return defaultColor ?? '';\r\n }\r\n}\r\n\r\nconst lastValuesByKey = new Map<string, any>();\r\n\r\nexport function getRandomElement<T>(arr: T[], uniqueId: string): T {\r\n if (arr.length === 1) return arr[0];\r\n const lastValue = lastValuesByKey.get(uniqueId);\r\n let newValue: T;\r\n do {\r\n newValue = arr[Math.floor(Math.random() * arr.length)];\r\n } while (newValue === lastValue && arr.length > 1);\r\n\r\n lastValuesByKey.set(uniqueId, newValue);\r\n return newValue;\r\n}\r\nexport const genSVGCubicBezier: (\r\n keySplines: string,\r\n) => Pick<\r\n JSX.AnimateSVGAttributes<SVGAnimateElement>,\r\n 'calcMode' | 'keyTimes' | 'keySplines'\r\n> = keySplines => ({\r\n calcMode: 'spline',\r\n keyTimes: '0; 1',\r\n keySplines: keySplines,\r\n});\r\n\r\nexport type Image = Omit<JSX.ImgHTMLAttributes<HTMLImageElement>, 'src'> & { src: string };\r\n\r\nexport function toMarkdownCode(code: string, lang = 'tsx'): string {\r\n return `\\`\\`\\`${lang}\\n${code}\\n\\`\\`\\``;\r\n}\r\n"],"mappings":"AA8BA,IAAM,EAAiB,CACrB,SAAU,KACV,eAAgB,OAChB,MAAO,KACP,eAAgB,EAChB,UAAW,SACX,SAAU,OACV,UAAW,UACZ,CACD,SAAgB,EAAmB,EAAiC,CAClE,GAAM,CACJ,OACA,WAAW,EAAe,SAC1B,iBAAiB,EAAe,eAChC,QAAQ,EAAe,MACvB,iBAAiB,EAAe,eAChC,YAAY,EAAe,UAC3B,WAAW,EAAe,SAC1B,YAAY,EAAe,WACzB,EAEJ,MAAO,GAAG,EAAK,GAAG,EAAS,GAAG,EAAe,GAAG,EAAM,GAAG,EAAe,GAAG,EAAU,GAAG,EAAS,GAAG,IAEtG,SAAgB,EACd,EACA,EAC4B,CAC5B,IAAI,EAAW,EACX,EAA8C,KAC5C,GAAa,GAAG,IAAwB,CAC5C,IAAM,EAAM,KAAK,KAAK,CAChB,EAAY,GAAS,EAAM,GACjC,AAEE,KADA,aAAa,EAAM,CACX,MAEN,GAAa,GACf,EAAW,EACX,EAAG,GAAG,EAAK,EAEX,EAAQ,eAAiB,CACvB,EAAW,KAAK,KAAK,CACrB,EAAQ,KACR,EAAG,GAAG,EAAK,EACV,EAAU,EASjB,MANA,GAAU,WAAe,CACvB,AAEE,KADA,aAAa,EAAM,CACX,OAGL,EAET,IAAM,MAEG,IADa,KAAK,MAAM,KAAK,QAAQ,CAAG,SAAS,CAAC,SAAS,GAAG,CAC9C,SAAS,EAAG,IAAI,GAGzC,SAAgB,EAAkB,EAAmC,CACnE,GAAI,CAAC,EAAO,OAAO,GAAwB,CAC3C,IAAI,EAAM,EAAM,MAAM,CAAC,QAAQ,KAAM,GAAG,CAQxC,OAPI,EAAI,SAAW,IACjB,EAAM,EACH,MAAM,GAAG,CACT,IAAI,GAAQ,EAAO,EAAK,CACxB,KAAK,GAAG,EAGN,IAAI,EAAI,aAAa,GAE9B,SAAgB,EAAS,EAAiC,EAAuB,CAC/E,OAAQ,EAAR,CACE,IAAK,UACH,MAAO,gBACT,IAAK,UACH,MAAO,gBACT,IAAK,YACH,MAAO,kBACT,IAAK,SACH,MAAO,eACT,IAAK,OACH,MAAO,aACT,IAAK,UACH,MAAO,gBACT,IAAK,UACH,MAAO,gBACT,IAAK,QACH,MAAO,cACT,QACE,OAAO,GAAgB,IAiB7B,IAAa,EAKT,IAAe,CACjB,SAAU,SACV,SAAU,OACE,aACb"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hoc.js","names":["Component","Show","ConditionalRenderConfig","preRender","P","when","conditionalRender","Record","Comp","configKey","p","whenValue","_$createComponent","keyed","children"],"sources":["../../../src/utils/hoc.tsx"],"sourcesContent":["import { Component, Show } from 'solid-js';\r\n\r\ntype ConditionalRenderConfig<P> = {\r\n preRender: keyof P;\r\n when?: keyof P;\r\n};\r\n/*\r\npreRender sẽ tạo ra DOM ngay lập tức bất kể when có true hay false\r\n Mặc định false\r\n*/\r\nexport function conditionalRender<P extends Record<string, any>>(\r\n Comp: Component<P>,\r\n configKey: ConditionalRenderConfig<P>,\r\n) {\r\n return (p: P) => {\r\n const preRender = () => p[configKey.preRender] ?? false;\r\n const whenValue = () => (configKey?.when ? (p[configKey.when] ?? true) : true);\r\n\r\n return preRender() ? (\r\n <Comp {...p} />\r\n ) : (\r\n <Show when={whenValue()} keyed>\r\n <Comp {...p} />\r\n </Show>\r\n );\r\n };\r\n}\r\n"],"mappings":"+EAUA,SAAgBM,EACdE,EACAC,EACA,CACA,MAAQC,IAAS,CACf,IAAMP,MAAkBO,EAAED,EAAUN,YAAc,GAC5CQ,MAAmBF,GAAWJ,KAAQK,EAAED,EAAUJ,OAAS,GAAQ,GAEzE,OAAOF,GAAW,CAAAS,EACfJ,EAASE,EAAC,CAAAE,EAEVX,EAAI,CAAA,IAACI,MAAI,CAAA,OAAEM,GAAW,EAAEE,MAAK,GAAA,IAAAC,UAAA,CAAA,OAAAF,EAC3BJ,EAASE,EAAC,EAAA,CAEd"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var e=null,t=new Set;async function n(){return e||(e=import(`../../node_modules/.pnpm/shiki@4.0.2/node_modules/shiki/dist/index.js`).then(({createHighlighter:e})=>e({themes:[`dracula`],langs:[`tsx`,`typescript`,`jsx`,`javascript`,`bash`,`json`,`css`,`html`,`markdown`]})),t.add(`dracula`)),e}async function r(e){let r=await n();return t.has(e)||(await r.loadTheme(e),t.add(e)),r}async function i(e){try{let[t,n,r]=await Promise.all([import(`../../node_modules/.pnpm/prettier@3.8.1/node_modules/prettier/standalone.js`),import(`../../node_modules/.pnpm/prettier@3.8.1/node_modules/prettier/plugins/babel.js`),import(`../../node_modules/.pnpm/prettier@3.8.1/node_modules/prettier/plugins/estree.js`)]);return await t.format(e,{parser:`babel`,plugins:[n.default??n,r.default??r],printWidth:80,tabWidth:2,semi:!0,singleQuote:!0,jsxSingleQuote:!1,trailingComma:`all`})}catch{return e}}async function a(e,t,n,a=!0){let o=[`tsx`,`jsx`,`typescript`,`javascript`,`ts`,`js`].includes(t),[s,c]=await Promise.all([a&&o?i(e):Promise.resolve(e),r(n)]);return c.codeToHtml(s.trim(),{lang:t||`text`,theme:n})}export{r as ensureThemeLoaded,a as processCode};
|
|
2
|
+
//# sourceMappingURL=shiki-highlight.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shiki-highlight.js","names":[],"sources":["../../../src/utils/shiki-highlight.ts"],"sourcesContent":["/**\r\n * shiki-highlight.ts — Pure TypeScript Shiki helper, không phụ thuộc SolidJS.\r\n * Được dùng chung bởi:\r\n * - src/components/doc/CodePreview.tsx (SolidJS runtime)\r\n * - .storybook/usage-addon.ts (React / Storybook Manager)\r\n */\r\n\r\n// Singleton highlighter — lazy-load themes khi cần\r\nlet highlighterPromise: Promise<any> | null = null;\r\nconst loadedThemes = new Set<string>();\r\n\r\nasync function getHighlighter() {\r\n if (!highlighterPromise) {\r\n highlighterPromise = import('shiki').then(({ createHighlighter }) =>\r\n createHighlighter({\r\n themes: ['dracula'],\r\n langs: [\r\n 'tsx',\r\n 'typescript',\r\n 'jsx',\r\n 'javascript',\r\n 'bash',\r\n 'json',\r\n 'css',\r\n 'html',\r\n 'markdown',\r\n ],\r\n }),\r\n );\r\n loadedThemes.add('dracula');\r\n }\r\n return highlighterPromise;\r\n}\r\n\r\nexport async function ensureThemeLoaded(theme: string) {\r\n const highlighter = await getHighlighter();\r\n if (!loadedThemes.has(theme)) {\r\n await highlighter.loadTheme(theme);\r\n loadedThemes.add(theme);\r\n }\r\n return highlighter;\r\n}\r\n\r\n// Format code bằng Prettier standalone (babel parser — hỗ trợ JSX tốt nhất)\r\nasync function formatWithPrettier(code: string): Promise<string> {\r\n try {\r\n const [prettier, babelPlugin, estreePlugin] = await Promise.all([\r\n import('prettier/standalone'),\r\n import('prettier/plugins/babel'),\r\n import('prettier/plugins/estree'),\r\n ]);\r\n return await prettier.format(code, {\r\n parser: 'babel',\r\n plugins: [babelPlugin.default ?? babelPlugin, estreePlugin.default ?? estreePlugin],\r\n printWidth: 80,\r\n tabWidth: 2,\r\n semi: true,\r\n singleQuote: true,\r\n jsxSingleQuote: false,\r\n trailingComma: 'all',\r\n });\r\n } catch {\r\n return code;\r\n }\r\n}\r\n\r\n/**\r\n * Async pipeline: format → highlight, trả về HTML string.\r\n * @param format true = dùng Prettier (cho TSX/JSX); false = chỉ highlight.\r\n */\r\nexport async function processCode(\r\n code: string,\r\n language: string,\r\n theme: string,\r\n format = true,\r\n): Promise<string> {\r\n const jsLike = ['tsx', 'jsx', 'typescript', 'javascript', 'ts', 'js'].includes(language);\r\n const [formatted, highlighter] = await Promise.all([\r\n format && jsLike ? formatWithPrettier(code) : Promise.resolve(code),\r\n ensureThemeLoaded(theme),\r\n ]);\r\n\r\n return highlighter.codeToHtml(formatted.trim(), { lang: language || 'text', theme });\r\n}\r\n"],"mappings":"AAQA,IAAI,EAA0C,KACxC,EAAe,IAAI,IAEzB,eAAe,GAAiB,CAoB9B,OAnBK,IACH,EAAqB,OAAO,yEAAS,MAAM,CAAE,uBAC3C,EAAkB,CAChB,OAAQ,CAAC,UAAU,CACnB,MAAO,CACL,MACA,aACA,MACA,aACA,OACA,OACA,MACA,OACA,WACD,CACF,CAAC,CACH,CACD,EAAa,IAAI,UAAU,EAEtB,EAGT,eAAsB,EAAkB,EAAe,CACrD,IAAM,EAAc,MAAM,GAAgB,CAK1C,OAJK,EAAa,IAAI,EAAM,GAC1B,MAAM,EAAY,UAAU,EAAM,CAClC,EAAa,IAAI,EAAM,EAElB,EAIT,eAAe,EAAmB,EAA+B,CAC/D,GAAI,CACF,GAAM,CAAC,EAAU,EAAa,GAAgB,MAAM,QAAQ,IAAI,CAC9D,OAAO,+EACP,OAAO,kFACP,OAAO,mFACR,CAAC,CACF,OAAO,MAAM,EAAS,OAAO,EAAM,CACjC,OAAQ,QACR,QAAS,CAAC,EAAY,SAAW,EAAa,EAAa,SAAW,EAAa,CACnF,WAAY,GACZ,SAAU,EACV,KAAM,GACN,YAAa,GACb,eAAgB,GAChB,cAAe,MAChB,CAAC,MACI,CACN,OAAO,GAQX,eAAsB,EACpB,EACA,EACA,EACA,EAAS,GACQ,CACjB,IAAM,EAAS,CAAC,MAAO,MAAO,aAAc,aAAc,KAAM,KAAK,CAAC,SAAS,EAAS,CAClF,CAAC,EAAW,GAAe,MAAM,QAAQ,IAAI,CACjD,GAAU,EAAS,EAAmB,EAAK,CAAG,QAAQ,QAAQ,EAAK,CACnE,EAAkB,EAAM,CACzB,CAAC,CAEF,OAAO,EAAY,WAAW,EAAU,MAAM,CAAE,CAAE,KAAM,GAAY,OAAQ,QAAO,CAAC"}
|