solid-tom-ui 1.0.5 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/README.md +246 -237
  2. package/dist/README.md +246 -0
  3. package/dist/components/avatar/avatar.js.map +1 -1
  4. package/dist/components/badge/badge.js.map +1 -1
  5. package/dist/components/breadcrumb/breadcrumb.js.map +1 -1
  6. package/dist/components/button/button.js.map +1 -1
  7. package/dist/components/carousel/carousel.js.map +1 -1
  8. package/dist/components/chat-bubble/chatBubble.js.map +1 -1
  9. package/dist/components/checkbox/checkbox.js.map +1 -1
  10. package/dist/components/collapse/collapse.js.map +1 -1
  11. package/dist/components/context-menu/context-menu.js.map +1 -1
  12. package/dist/components/context-menu/context-menu.store.js.map +1 -1
  13. package/dist/components/divider/divider.js.map +1 -1
  14. package/dist/components/dropdown/dropdown.js.map +1 -1
  15. package/dist/components/dropdown/dropdown.store.js.map +1 -1
  16. package/dist/components/float-button/float-button.js.map +1 -1
  17. package/dist/components/hover-3d-image/hover-3d-image.js.map +1 -1
  18. package/dist/components/image-preview/image-preview.js.map +1 -1
  19. package/dist/components/input/input.js.map +1 -1
  20. package/dist/components/input/input.utils.js.map +1 -1
  21. package/dist/components/input/variants/input-color.js.map +1 -1
  22. package/dist/components/input/variants/input-date.js.map +1 -1
  23. package/dist/components/input/variants/input-number.js.map +1 -1
  24. package/dist/components/input/variants/input-otp.js.map +1 -1
  25. package/dist/components/input/variants/input-password.js.map +1 -1
  26. package/dist/components/input/variants/input-radio.js.map +1 -1
  27. package/dist/components/input/variants/input-range.js.map +1 -1
  28. package/dist/components/input/variants/input-text.js.map +1 -1
  29. package/dist/components/input/variants/input-textarea.js.map +1 -1
  30. package/dist/components/loading/loading.js.map +1 -1
  31. package/dist/components/mansory/mansory.js.map +1 -1
  32. package/dist/components/menu/menu.js.map +1 -1
  33. package/dist/components/modal/modal.js.map +1 -1
  34. package/dist/components/modal/modalContext.js.map +1 -1
  35. package/dist/components/pagination/pagination.js.map +1 -1
  36. package/dist/components/progress-bar/progress-bar.js.map +1 -1
  37. package/dist/components/qr-code/qr-code.js.map +1 -1
  38. package/dist/components/select/select.js.map +1 -1
  39. package/dist/components/select-zone/select-zone.js.map +1 -1
  40. package/dist/components/skeleton/skeleton.js.map +1 -1
  41. package/dist/components/slider/slider.js.map +1 -1
  42. package/dist/components/splitter/splitter.js.map +1 -1
  43. package/dist/components/steps/steps.js.map +1 -1
  44. package/dist/components/swap/swap.js.map +1 -1
  45. package/dist/components/switch/switch.js.map +1 -1
  46. package/dist/components/tab/tab.js.map +1 -1
  47. package/dist/components/table/table.js.map +1 -1
  48. package/dist/components/timeline/timeline.js.map +1 -1
  49. package/dist/components/toast/icons/ErrorIcon.js.map +1 -1
  50. package/dist/components/toast/icons/IconCircle.js.map +1 -1
  51. package/dist/components/toast/icons/InfoIcon.js.map +1 -1
  52. package/dist/components/toast/icons/LoaderIcon.js.map +1 -1
  53. package/dist/components/toast/icons/SuccessIcon.js.map +1 -1
  54. package/dist/components/toast/icons/WarningIcon.js.map +1 -1
  55. package/dist/components/toast/toast.js.map +1 -1
  56. package/dist/components/toast/toast.store.js.map +1 -1
  57. package/dist/components/tooltip/tooltip.js.map +1 -1
  58. package/dist/components/tour/tour.js.map +1 -1
  59. package/dist/components/upload/upload.js.map +1 -1
  60. package/dist/components/z-index/z-index.context.js.map +1 -1
  61. package/dist/components/z-index/z-index.js.map +1 -1
  62. package/dist/components/z-index/z-index.store.js.map +1 -1
  63. package/dist/components/z-index/z-index.types.js.map +1 -1
  64. package/dist/package.json +39 -0
  65. package/dist/utils/cn.js.map +1 -1
  66. package/dist/utils/element-tracker.js.map +1 -1
  67. package/dist/utils/helper.js.map +1 -1
  68. package/dist/utils/hoc.js.map +1 -1
  69. package/package.json +38 -32
@@ -1 +1 @@
1
- {"version":3,"file":"modal.js","names":["SolidComponent","cn","AnimationConfig","renderCSSAnimation","conditionalRender","X","Component","createEffect","createSignal","createUniqueId","mergeProps","on","onCleanup","Show","ZIndex","ZIndexType","ModalType","onClose","width","closeOnOutsideClick","closeOnEsc","closable","header","body","footer","open","mask","enabled","blur","class","Partial","Record","preRender","animate","Omit","name","AnimateType","TRANSFORM_ANIMATIONS","Set","modalIds","setModalIds","popModalId","newArr","slice","pop","modalCloseCallbacks","Map","globalKeyDownHandler","e","KeyboardEvent","key","topId","at","get","registerModalCallback","id","cb","size","document","addEventListener","set","unregisterModalCallback","delete","removeEventListener","ComponentModal","p","duration","modalId","unregisterModal","renderMaskEnabled","renderMaskClass","animName","isTransformAnim","has","renderModalBoxAnim","animation","renderOverlayAnim","renderBoxStyle","style","overlayDone","setOverlayDone","handleOverlayAnimEnd","boxVisible","handleBackdropClick","_$createComponent","type","MODAL","blockScroll","position","inset","wrapper","children","when","_el$","_tmpl$","$$click","_$effect","_$className","_$memo","_el$2","_tmpl$2","_el$3","_tmpl$4","_el$5","firstChild","_el$6","_el$7","nextSibling","stopPropagation","_$insert","_el$4","_tmpl$3","_p$","_v$","modal","_v$2","t","_$style","undefined","_c$","_el$9","_tmpl$5","_$addEventListener","closeButton","fallback","_el$0","_tmpl$6","_el$1","Element","_el$8","_v$3","_v$4","visibility","_v$5","_v$6","a","o","Modal","_$delegateEvents"],"sources":["../../../src/components/modal/modal.tsx"],"sourcesContent":["import { SolidComponent } from '@/type';\nimport { cn } from '@/utils/cn';\nimport { AnimationConfig, renderCSSAnimation } from '@/utils/helper';\nimport { conditionalRender } from '@/utils/hoc';\nimport X from 'lucide-solid/icons/x';\n\nimport {\n Component,\n createEffect,\n createSignal,\n createUniqueId,\n mergeProps,\n on,\n onCleanup,\n Show,\n} from 'solid-js';\nimport { ZIndex, ZIndexType } from '../z-index';\n\nexport type ModalType = {\n onClose: () => void;\n width?: string;\n closeOnOutsideClick?: boolean;\n closeOnEsc?: boolean;\n closable?: boolean;\n header?: SolidComponent;\n body?: SolidComponent;\n footer?: SolidComponent;\n open?: boolean;\n mask?: boolean | { enabled: boolean; blur: boolean };\n class?: Partial<\n Record<'wrapper' | 'modal' | 'header' | 'body' | 'footer' | 'closeButton', string>\n >;\n preRender?: boolean;\n animate?: Omit<AnimationConfig, 'name'> & {\n name: AnimateType;\n };\n};\n\n// Only opacity-based animations are safe to use on the modal box directly\n// because transform-based animations create a new containing block for\n// position:fixed descendants, which breaks fixed positioning inside body slots.\n// Transform animations are applied on a sibling overlay div instead.\ntype AnimateType =\n | 'none'\n | 'lightSpeedInRight'\n | 'lightSpeedInLeft'\n | 'fadeIn'\n | 'fadeInLeft'\n | 'fadeInRight'\n | 'fadeInDown'\n | 'fadeInUp'\n | 'bounceIn'\n | 'scaleInCenter'\n | 'slideInFwdCenter'\n | 'slideInBck'\n | 'tiltIn'\n | 'swingInRightBck'\n | 'puffInCenter'\n | 'scaleInBl';\n\n// Animations that use transform in their keyframes — these create a containing\n// block for position:fixed elements during the animation. They must NOT be\n// placed on any ancestor of body content.\nconst TRANSFORM_ANIMATIONS = new Set<AnimateType>([\n 'lightSpeedInRight',\n 'lightSpeedInLeft',\n 'fadeInLeft',\n 'fadeInRight',\n 'fadeInDown',\n 'fadeInUp',\n 'bounceIn',\n 'scaleInCenter',\n 'slideInFwdCenter',\n 'slideInBck',\n 'tiltIn',\n 'swingInRightBck',\n 'puffInCenter',\n 'scaleInBl',\n]);\n\n// Track active modals for overlay logic (only topmost modal shows mask)\nconst [modalIds, setModalIds] = createSignal<string[]>([]);\nfunction popModalId() {\n const newArr = modalIds().slice();\n newArr.pop();\n setModalIds(newArr);\n}\n\n// Global ESC key handler — single listener shared across all modal instances\nconst modalCloseCallbacks = new Map<string, () => void>();\n\nfunction globalKeyDownHandler(e: KeyboardEvent) {\n if (e.key !== 'Escape') return;\n const topId = modalIds().at(-1);\n if (topId) modalCloseCallbacks.get(topId)?.();\n}\n\nfunction registerModalCallback(id: string, cb: () => void) {\n if (modalCloseCallbacks.size === 0) {\n document.addEventListener('keydown', globalKeyDownHandler);\n }\n modalCloseCallbacks.set(id, cb);\n}\n\nfunction unregisterModalCallback(id: string) {\n modalCloseCallbacks.delete(id);\n if (modalCloseCallbacks.size === 0) {\n document.removeEventListener('keydown', globalKeyDownHandler);\n }\n}\n\nconst ComponentModal: Component<ModalType> = p => {\n p = mergeProps(\n {\n closeOnOutsideClick: true,\n closeOnEsc: true,\n open: true,\n onClose: () => {},\n closable: true,\n preRender: false,\n animate: {\n name: 'puffInCenter',\n duration: '300ms',\n },\n mask: true,\n } as ModalType,\n p,\n );\n\n const modalId = createUniqueId();\n\n onCleanup(function unregisterModal() {\n unregisterModalCallback(modalId);\n if (modalId === modalIds().at(-1)) {\n popModalId();\n }\n });\n\n // Manage modalIds stack for overlay logic\n createEffect(\n on(\n () => p.open,\n open => {\n if (open) {\n if (modalId !== modalIds().at(-1)) {\n setModalIds([...modalIds(), modalId]);\n }\n registerModalCallback(modalId, () => {\n if (p.closeOnEsc) p.onClose();\n });\n } else {\n unregisterModalCallback(modalId);\n if (modalId === modalIds().at(-1)) {\n popModalId();\n }\n }\n },\n ),\n );\n\n const renderMaskEnabled = (): boolean => {\n if (!p.open) return false;\n if (modalId !== modalIds().at(-1)) return false;\n if (p.mask === false) return false;\n if (typeof p.mask === 'object' && p.mask?.enabled === false) return false;\n return true;\n };\n\n const renderMaskClass = (): string => {\n if (typeof p.mask === 'object' && p.mask?.blur === false) {\n return 'bg-modal-overlay';\n }\n return 'bg-modal-overlay backdrop-blur-[5px]';\n };\n\n const animName = (): AnimateType => p.animate?.name ?? 'none';\n const isTransformAnim = () => TRANSFORM_ANIMATIONS.has(animName());\n\n // For transform-based animations: rendered on a sibling absolutely-positioned\n // overlay div that visually matches the modal box but is NOT an ancestor of\n // body content. This completely avoids the containing-block issue.\n // For opacity-only animations (fadeIn): applied directly on the modal box.\n const renderModalBoxAnim = () => {\n if (!isTransformAnim() && animName() !== 'none') {\n return { animation: renderCSSAnimation(p.animate!) };\n }\n return {};\n };\n\n const renderOverlayAnim = () => {\n if (isTransformAnim()) {\n return { animation: renderCSSAnimation(p.animate!) };\n }\n return {};\n };\n\n const renderBoxStyle = () => {\n const style: Record<string, any> = {};\n if (p.width) {\n style['width'] = p.width;\n style['min-width'] = p.width;\n }\n return style;\n };\n\n // Overlay: a visually identical copy of the modal box that carries the\n // transform animation. It sits on top of the real modal box via absolute\n // positioning. Once animation ends it is hidden and the real box is shown.\n const [overlayDone, setOverlayDone] = createSignal(false);\n const handleOverlayAnimEnd = () => setOverlayDone(true);\n\n // Reset overlayDone each time modal re-opens so transform animation replays.\n createEffect(\n on(\n () => p.open,\n open => {\n if (open) setOverlayDone(false);\n },\n ),\n );\n\n // Real modal box becomes visible only after transform animation finishes\n // (to avoid showing both simultaneously).\n const boxVisible = () => !isTransformAnim() || overlayDone();\n\n const handleBackdropClick = () => {\n if (p.closeOnOutsideClick) {\n p.onClose();\n }\n };\n\n return (\n <ZIndex\n type={ZIndexType.MODAL}\n open={p.open ?? false}\n blockScroll\n preRender={p.preRender}\n position={{ inset: '0' }}\n class={cn('mo01', p.class?.wrapper)}\n >\n {/* Backdrop overlay — only for topmost modal */}\n <Show when={renderMaskEnabled()}>\n <div class={cn('mo02', renderMaskClass())} onClick={handleBackdropClick} />\n </Show>\n\n {/* Invisible hit area for outside-click when mask is disabled */}\n <Show when={!renderMaskEnabled() && p.closeOnOutsideClick}>\n <div class=\"mo02\" onClick={handleBackdropClick} />\n </Show>\n\n {/* Wrapper: flex item căn giữa bởi parent. Kích thước khớp real box.\n Overlay absolute bên trong → luôn cùng vị trí & kích thước với real box. */}\n <div class=\"mo03\" onClick={e => e.stopPropagation()}>\n {/* === Transform animation approach ===\n Overlay là visual clone với animation transform, positioned absolute\n bên trong wrapper → khớp 100% kích thước/vị trí với real box.\n Giữ body content thoát khỏi transform ancestor. */}\n <Show when={isTransformAnim() && !overlayDone()}>\n <div\n class={cn('mo04', p.class?.modal)}\n style={{ ...renderBoxStyle(), ...renderOverlayAnim() }}\n onAnimationEnd={handleOverlayAnimEnd}\n aria-hidden=\"true\"\n />\n </Show>\n\n {/* === Real modal box ===\n Dùng opacity animation (an toàn) hoặc không animation.\n Body content luôn thoát khỏi transform ancestor. */}\n <div\n class={cn('mo05', p.class?.modal)}\n style={{\n ...renderModalBoxAnim(),\n ...renderBoxStyle(),\n visibility: boxVisible() ? 'visible' : 'hidden',\n }}\n >\n {p.closable && (\n <button class={cn('mo06', p.class?.closeButton)} onClick={p.onClose} aria-label=\"Close\">\n <X size={16} />\n </button>\n )}\n\n <div class={cn('mo-header', p.class?.header)}>\n <Show when={p.header} fallback={<div class=\"mo07\">Modal ID: {modalId}</div>}>\n {p.header as Element}\n </Show>\n </div>\n\n <div class={cn('mo08', p.class?.body)}>\n <Show when={p.body}>{p.body as Element}</Show>\n </div>\n\n <Show when={p.footer}>\n <div class={cn('mo-footer', p.class?.footer)}>{p.footer as Element}</div>\n </Show>\n </div>\n </div>\n </ZIndex>\n );\n};\n\nexport const Modal = conditionalRender(ComponentModal, { preRender: 'preRender', when: 'open' });\n\nexport { ComponentModal };\n"],"mappings":"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"}
1
+ {"version":3,"file":"modal.js","names":["SolidComponent","cn","AnimationConfig","renderCSSAnimation","conditionalRender","X","Component","createEffect","createSignal","createUniqueId","mergeProps","on","onCleanup","Show","ZIndex","ZIndexType","ModalType","onClose","width","closeOnOutsideClick","closeOnEsc","closable","header","body","footer","open","mask","enabled","blur","class","Partial","Record","preRender","animate","Omit","name","AnimateType","TRANSFORM_ANIMATIONS","Set","modalIds","setModalIds","popModalId","newArr","slice","pop","modalCloseCallbacks","Map","globalKeyDownHandler","e","KeyboardEvent","key","topId","at","get","registerModalCallback","id","cb","size","document","addEventListener","set","unregisterModalCallback","delete","removeEventListener","ComponentModal","p","duration","modalId","unregisterModal","renderMaskEnabled","renderMaskClass","animName","isTransformAnim","has","renderModalBoxAnim","animation","renderOverlayAnim","renderBoxStyle","style","overlayDone","setOverlayDone","handleOverlayAnimEnd","boxVisible","handleBackdropClick","_$createComponent","type","MODAL","blockScroll","position","inset","wrapper","children","when","_el$","_tmpl$","$$click","_$effect","_$className","_$memo","_el$2","_tmpl$2","_el$3","_tmpl$4","_el$5","firstChild","_el$6","_el$7","nextSibling","stopPropagation","_$insert","_el$4","_tmpl$3","_p$","_v$","modal","_v$2","t","_$style","undefined","_c$","_el$9","_tmpl$5","_$addEventListener","closeButton","fallback","_el$0","_tmpl$6","_el$1","Element","_el$8","_v$3","_v$4","visibility","_v$5","_v$6","a","o","Modal","_$delegateEvents"],"sources":["../../../src/components/modal/modal.tsx"],"sourcesContent":["import { SolidComponent } from '@/type';\r\nimport { cn } from '@/utils/cn';\r\nimport { AnimationConfig, renderCSSAnimation } from '@/utils/helper';\r\nimport { conditionalRender } from '@/utils/hoc';\r\nimport X from 'lucide-solid/icons/x';\r\n\r\nimport {\r\n Component,\r\n createEffect,\r\n createSignal,\r\n createUniqueId,\r\n mergeProps,\r\n on,\r\n onCleanup,\r\n Show,\r\n} from 'solid-js';\r\nimport { ZIndex, ZIndexType } from '../z-index';\r\n\r\nexport type ModalType = {\r\n onClose: () => void;\r\n width?: string;\r\n closeOnOutsideClick?: boolean;\r\n closeOnEsc?: boolean;\r\n closable?: boolean;\r\n header?: SolidComponent;\r\n body?: SolidComponent;\r\n footer?: SolidComponent;\r\n open?: boolean;\r\n mask?: boolean | { enabled: boolean; blur: boolean };\r\n class?: Partial<\r\n Record<'wrapper' | 'modal' | 'header' | 'body' | 'footer' | 'closeButton', string>\r\n >;\r\n preRender?: boolean;\r\n animate?: Omit<AnimationConfig, 'name'> & {\r\n name: AnimateType;\r\n };\r\n};\r\n\r\n// Only opacity-based animations are safe to use on the modal box directly\r\n// because transform-based animations create a new containing block for\r\n// position:fixed descendants, which breaks fixed positioning inside body slots.\r\n// Transform animations are applied on a sibling overlay div instead.\r\ntype AnimateType =\r\n | 'none'\r\n | 'lightSpeedInRight'\r\n | 'lightSpeedInLeft'\r\n | 'fadeIn'\r\n | 'fadeInLeft'\r\n | 'fadeInRight'\r\n | 'fadeInDown'\r\n | 'fadeInUp'\r\n | 'bounceIn'\r\n | 'scaleInCenter'\r\n | 'slideInFwdCenter'\r\n | 'slideInBck'\r\n | 'tiltIn'\r\n | 'swingInRightBck'\r\n | 'puffInCenter'\r\n | 'scaleInBl';\r\n\r\n// Animations that use transform in their keyframes — these create a containing\r\n// block for position:fixed elements during the animation. They must NOT be\r\n// placed on any ancestor of body content.\r\nconst TRANSFORM_ANIMATIONS = new Set<AnimateType>([\r\n 'lightSpeedInRight',\r\n 'lightSpeedInLeft',\r\n 'fadeInLeft',\r\n 'fadeInRight',\r\n 'fadeInDown',\r\n 'fadeInUp',\r\n 'bounceIn',\r\n 'scaleInCenter',\r\n 'slideInFwdCenter',\r\n 'slideInBck',\r\n 'tiltIn',\r\n 'swingInRightBck',\r\n 'puffInCenter',\r\n 'scaleInBl',\r\n]);\r\n\r\n// Track active modals for overlay logic (only topmost modal shows mask)\r\nconst [modalIds, setModalIds] = createSignal<string[]>([]);\r\nfunction popModalId() {\r\n const newArr = modalIds().slice();\r\n newArr.pop();\r\n setModalIds(newArr);\r\n}\r\n\r\n// Global ESC key handler — single listener shared across all modal instances\r\nconst modalCloseCallbacks = new Map<string, () => void>();\r\n\r\nfunction globalKeyDownHandler(e: KeyboardEvent) {\r\n if (e.key !== 'Escape') return;\r\n const topId = modalIds().at(-1);\r\n if (topId) modalCloseCallbacks.get(topId)?.();\r\n}\r\n\r\nfunction registerModalCallback(id: string, cb: () => void) {\r\n if (modalCloseCallbacks.size === 0) {\r\n document.addEventListener('keydown', globalKeyDownHandler);\r\n }\r\n modalCloseCallbacks.set(id, cb);\r\n}\r\n\r\nfunction unregisterModalCallback(id: string) {\r\n modalCloseCallbacks.delete(id);\r\n if (modalCloseCallbacks.size === 0) {\r\n document.removeEventListener('keydown', globalKeyDownHandler);\r\n }\r\n}\r\n\r\nconst ComponentModal: Component<ModalType> = p => {\r\n p = mergeProps(\r\n {\r\n closeOnOutsideClick: true,\r\n closeOnEsc: true,\r\n open: true,\r\n onClose: () => {},\r\n closable: true,\r\n preRender: false,\r\n animate: {\r\n name: 'puffInCenter',\r\n duration: '300ms',\r\n },\r\n mask: true,\r\n } as ModalType,\r\n p,\r\n );\r\n\r\n const modalId = createUniqueId();\r\n\r\n onCleanup(function unregisterModal() {\r\n unregisterModalCallback(modalId);\r\n if (modalId === modalIds().at(-1)) {\r\n popModalId();\r\n }\r\n });\r\n\r\n // Manage modalIds stack for overlay logic\r\n createEffect(\r\n on(\r\n () => p.open,\r\n open => {\r\n if (open) {\r\n if (modalId !== modalIds().at(-1)) {\r\n setModalIds([...modalIds(), modalId]);\r\n }\r\n registerModalCallback(modalId, () => {\r\n if (p.closeOnEsc) p.onClose();\r\n });\r\n } else {\r\n unregisterModalCallback(modalId);\r\n if (modalId === modalIds().at(-1)) {\r\n popModalId();\r\n }\r\n }\r\n },\r\n ),\r\n );\r\n\r\n const renderMaskEnabled = (): boolean => {\r\n if (!p.open) return false;\r\n if (modalId !== modalIds().at(-1)) return false;\r\n if (p.mask === false) return false;\r\n if (typeof p.mask === 'object' && p.mask?.enabled === false) return false;\r\n return true;\r\n };\r\n\r\n const renderMaskClass = (): string => {\r\n if (typeof p.mask === 'object' && p.mask?.blur === false) {\r\n return 'bg-modal-overlay';\r\n }\r\n return 'bg-modal-overlay backdrop-blur-[5px]';\r\n };\r\n\r\n const animName = (): AnimateType => p.animate?.name ?? 'none';\r\n const isTransformAnim = () => TRANSFORM_ANIMATIONS.has(animName());\r\n\r\n // For transform-based animations: rendered on a sibling absolutely-positioned\r\n // overlay div that visually matches the modal box but is NOT an ancestor of\r\n // body content. This completely avoids the containing-block issue.\r\n // For opacity-only animations (fadeIn): applied directly on the modal box.\r\n const renderModalBoxAnim = () => {\r\n if (!isTransformAnim() && animName() !== 'none') {\r\n return { animation: renderCSSAnimation(p.animate!) };\r\n }\r\n return {};\r\n };\r\n\r\n const renderOverlayAnim = () => {\r\n if (isTransformAnim()) {\r\n return { animation: renderCSSAnimation(p.animate!) };\r\n }\r\n return {};\r\n };\r\n\r\n const renderBoxStyle = () => {\r\n const style: Record<string, any> = {};\r\n if (p.width) {\r\n style['width'] = p.width;\r\n style['min-width'] = p.width;\r\n }\r\n return style;\r\n };\r\n\r\n // Overlay: a visually identical copy of the modal box that carries the\r\n // transform animation. It sits on top of the real modal box via absolute\r\n // positioning. Once animation ends it is hidden and the real box is shown.\r\n const [overlayDone, setOverlayDone] = createSignal(false);\r\n const handleOverlayAnimEnd = () => setOverlayDone(true);\r\n\r\n // Reset overlayDone each time modal re-opens so transform animation replays.\r\n createEffect(\r\n on(\r\n () => p.open,\r\n open => {\r\n if (open) setOverlayDone(false);\r\n },\r\n ),\r\n );\r\n\r\n // Real modal box becomes visible only after transform animation finishes\r\n // (to avoid showing both simultaneously).\r\n const boxVisible = () => !isTransformAnim() || overlayDone();\r\n\r\n const handleBackdropClick = () => {\r\n if (p.closeOnOutsideClick) {\r\n p.onClose();\r\n }\r\n };\r\n\r\n return (\r\n <ZIndex\r\n type={ZIndexType.MODAL}\r\n open={p.open ?? false}\r\n blockScroll\r\n preRender={p.preRender}\r\n position={{ inset: '0' }}\r\n class={cn('mo01', p.class?.wrapper)}\r\n >\r\n {/* Backdrop overlay — only for topmost modal */}\r\n <Show when={renderMaskEnabled()}>\r\n <div class={cn('mo02', renderMaskClass())} onClick={handleBackdropClick} />\r\n </Show>\r\n\r\n {/* Invisible hit area for outside-click when mask is disabled */}\r\n <Show when={!renderMaskEnabled() && p.closeOnOutsideClick}>\r\n <div class=\"mo02\" onClick={handleBackdropClick} />\r\n </Show>\r\n\r\n {/* Wrapper: flex item căn giữa bởi parent. Kích thước khớp real box.\r\n Overlay absolute bên trong → luôn cùng vị trí & kích thước với real box. */}\r\n <div class=\"mo03\" onClick={e => e.stopPropagation()}>\r\n {/* === Transform animation approach ===\r\n Overlay là visual clone với animation transform, positioned absolute\r\n bên trong wrapper → khớp 100% kích thước/vị trí với real box.\r\n Giữ body content thoát khỏi transform ancestor. */}\r\n <Show when={isTransformAnim() && !overlayDone()}>\r\n <div\r\n class={cn('mo04', p.class?.modal)}\r\n style={{ ...renderBoxStyle(), ...renderOverlayAnim() }}\r\n onAnimationEnd={handleOverlayAnimEnd}\r\n aria-hidden=\"true\"\r\n />\r\n </Show>\r\n\r\n {/* === Real modal box ===\r\n Dùng opacity animation (an toàn) hoặc không animation.\r\n Body content luôn thoát khỏi transform ancestor. */}\r\n <div\r\n class={cn('mo05', p.class?.modal)}\r\n style={{\r\n ...renderModalBoxAnim(),\r\n ...renderBoxStyle(),\r\n visibility: boxVisible() ? 'visible' : 'hidden',\r\n }}\r\n >\r\n {p.closable && (\r\n <button class={cn('mo06', p.class?.closeButton)} onClick={p.onClose} aria-label=\"Close\">\r\n <X size={16} />\r\n </button>\r\n )}\r\n\r\n <div class={cn('mo-header', p.class?.header)}>\r\n <Show when={p.header} fallback={<div class=\"mo07\">Modal ID: {modalId}</div>}>\r\n {p.header as Element}\r\n </Show>\r\n </div>\r\n\r\n <div class={cn('mo08', p.class?.body)}>\r\n <Show when={p.body}>{p.body as Element}</Show>\r\n </div>\r\n\r\n <Show when={p.footer}>\r\n <div class={cn('mo-footer', p.class?.footer)}>{p.footer as Element}</div>\r\n </Show>\r\n </div>\r\n </div>\r\n </ZIndex>\r\n );\r\n};\r\n\r\nexport const Modal = conditionalRender(ComponentModal, { preRender: 'preRender', when: 'open' });\r\n\r\nexport { ComponentModal };\r\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"modalContext.js","names":["createComponent","createRoot","createSignal","ComponentModal","ModalType","activeModalInstances","ModalInstance","destroy","createModal","options","Omit","disposeRoot","setIsOpen","v","disposed","doClose","callOnClose","onClose","index","indexOf","instance","splice","setTimeout","root","isOpen","_setIsOpen","open","preRender","push","closeAllModals","instances","forEach"],"sources":["../../../src/components/modal/modalContext.tsx"],"sourcesContent":["import { createComponent, createRoot, createSignal } from 'solid-js';\nimport { ComponentModal, ModalType } from './modal';\n\nconst activeModalInstances: ModalInstance[] = [];\n\ntype ModalInstance = {\n destroy: () => void;\n};\n\nexport function createModal(options: Omit<ModalType, 'open' | 'preRender'>): ModalInstance {\n let disposeRoot: (() => void) | null = null;\n let setIsOpen: ((v: boolean) => void) | null = null;\n let disposed = false;\n\n const doClose = (callOnClose: boolean) => {\n if (disposed) return;\n disposed = true;\n\n setIsOpen?.(false);\n if (callOnClose) options.onClose?.();\n\n const index = activeModalInstances.indexOf(instance);\n if (index > -1) {\n activeModalInstances.splice(index, 1);\n }\n\n setTimeout(() => {\n disposeRoot?.();\n }, 150);\n };\n\n createRoot(root => {\n disposeRoot = root;\n const [isOpen, _setIsOpen] = createSignal(true);\n setIsOpen = _setIsOpen;\n\n // ComponentModal renders via Portal (ZIndex → Portal) — it mounts itself\n // into document.body internally. We only need to call it inside a reactive\n // root so its signals/effects run; we don't need to insert it anywhere.\n createComponent(ComponentModal, {\n ...options,\n get open() {\n return isOpen();\n },\n preRender: false,\n onClose: () => doClose(true),\n });\n });\n\n const instance: ModalInstance = {\n destroy: () => doClose(false),\n };\n\n activeModalInstances.push(instance);\n return instance;\n}\n\nexport function closeAllModals() {\n const instances = [...activeModalInstances];\n instances.forEach(instance => instance.destroy());\n}\n"],"mappings":"yHAGA,IAAMK,EAAwC,EAAE,CAMhD,SAAgBG,EAAYC,EAA+D,CACzF,IAAIE,EAAmC,KACnCC,EAA2C,KAC3CE,EAAW,GAETC,EAAWC,GAAyB,CACxC,GAAIF,EAAU,OACdA,EAAW,GAEXF,IAAY,GAAM,CACdI,GAAaP,EAAQQ,WAAW,CAEpC,IAAMC,EAAQb,EAAqBc,QAAQC,EAAS,CAChDF,EAAQ,IACVb,EAAqBgB,OAAOH,EAAO,EAAE,CAGvCI,eAAiB,CACfX,KAAe,EACd,IAAI,EAGTV,EAAWsB,GAAQ,CACjBZ,EAAcY,EACd,GAAM,CAACC,EAAQC,GAAcvB,EAAa,GAAK,CAC/CU,EAAYa,EAKZzB,EAAgBG,EAAgB,CAC9B,GAAGM,EACH,IAAIiB,MAAO,CACT,OAAOF,GAAQ,EAEjBG,UAAW,GACXV,YAAeF,EAAQ,GAAI,CAC5B,CAAC,EACF,CAEF,IAAMK,EAA0B,CAC9Bb,YAAeQ,EAAQ,GAAK,CAC7B,CAGD,OADAV,EAAqBuB,KAAKR,EAAS,CAC5BA,EAGT,SAAgBS,GAAiB,CACb,CAAC,GAAGxB,EAAqB,CACjC0B,QAAQX,GAAYA,EAASb,SAAS,CAAC"}
1
+ {"version":3,"file":"modalContext.js","names":["createComponent","createRoot","createSignal","ComponentModal","ModalType","activeModalInstances","ModalInstance","destroy","createModal","options","Omit","disposeRoot","setIsOpen","v","disposed","doClose","callOnClose","onClose","index","indexOf","instance","splice","setTimeout","root","isOpen","_setIsOpen","open","preRender","push","closeAllModals","instances","forEach"],"sources":["../../../src/components/modal/modalContext.tsx"],"sourcesContent":["import { createComponent, createRoot, createSignal } from 'solid-js';\r\nimport { ComponentModal, ModalType } from './modal';\r\n\r\nconst activeModalInstances: ModalInstance[] = [];\r\n\r\ntype ModalInstance = {\r\n destroy: () => void;\r\n};\r\n\r\nexport function createModal(options: Omit<ModalType, 'open' | 'preRender'>): ModalInstance {\r\n let disposeRoot: (() => void) | null = null;\r\n let setIsOpen: ((v: boolean) => void) | null = null;\r\n let disposed = false;\r\n\r\n const doClose = (callOnClose: boolean) => {\r\n if (disposed) return;\r\n disposed = true;\r\n\r\n setIsOpen?.(false);\r\n if (callOnClose) options.onClose?.();\r\n\r\n const index = activeModalInstances.indexOf(instance);\r\n if (index > -1) {\r\n activeModalInstances.splice(index, 1);\r\n }\r\n\r\n setTimeout(() => {\r\n disposeRoot?.();\r\n }, 150);\r\n };\r\n\r\n createRoot(root => {\r\n disposeRoot = root;\r\n const [isOpen, _setIsOpen] = createSignal(true);\r\n setIsOpen = _setIsOpen;\r\n\r\n // ComponentModal renders via Portal (ZIndex → Portal) — it mounts itself\r\n // into document.body internally. We only need to call it inside a reactive\r\n // root so its signals/effects run; we don't need to insert it anywhere.\r\n createComponent(ComponentModal, {\r\n ...options,\r\n get open() {\r\n return isOpen();\r\n },\r\n preRender: false,\r\n onClose: () => doClose(true),\r\n });\r\n });\r\n\r\n const instance: ModalInstance = {\r\n destroy: () => doClose(false),\r\n };\r\n\r\n activeModalInstances.push(instance);\r\n return instance;\r\n}\r\n\r\nexport function closeAllModals() {\r\n const instances = [...activeModalInstances];\r\n instances.forEach(instance => instance.destroy());\r\n}\r\n"],"mappings":"yHAGA,IAAMK,EAAwC,EAAE,CAMhD,SAAgBG,EAAYC,EAA+D,CACzF,IAAIE,EAAmC,KACnCC,EAA2C,KAC3CE,EAAW,GAETC,EAAWC,GAAyB,CACxC,GAAIF,EAAU,OACdA,EAAW,GAEXF,IAAY,GAAM,CACdI,GAAaP,EAAQQ,WAAW,CAEpC,IAAMC,EAAQb,EAAqBc,QAAQC,EAAS,CAChDF,EAAQ,IACVb,EAAqBgB,OAAOH,EAAO,EAAE,CAGvCI,eAAiB,CACfX,KAAe,EACd,IAAI,EAGTV,EAAWsB,GAAQ,CACjBZ,EAAcY,EACd,GAAM,CAACC,EAAQC,GAAcvB,EAAa,GAAK,CAC/CU,EAAYa,EAKZzB,EAAgBG,EAAgB,CAC9B,GAAGM,EACH,IAAIiB,MAAO,CACT,OAAOF,GAAQ,EAEjBG,UAAW,GACXV,YAAeF,EAAQ,GAAI,CAC5B,CAAC,EACF,CAEF,IAAMK,EAA0B,CAC9Bb,YAAeQ,EAAQ,GAAK,CAC7B,CAGD,OADAV,EAAqBuB,KAAKR,EAAS,CAC5BA,EAGT,SAAgBS,GAAiB,CACb,CAAC,GAAGxB,EAAqB,CACjC0B,QAAQX,GAAYA,EAASb,SAAS,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"pagination.js","names":["Select","cn","getColor","ChevronLeft","ChevronRight","Component","createEffect","createMemo","createSignal","For","Match","mergeProps","Show","Switch","PaginationDefaultProps","PaginationFullyProps","PaginationProps","PaginationSimpleProps","DEFAULT_PROPS","defaultCurrent","defaultPageSize","total","align","const","size","color","hideOnSinglePage","showLessItems","showQuickJumper","showTitle","disabled","pageSizeOptions","totalBoundaryShowSizeChanger","buildSizeClass","buildAlignClass","mapSizeToSelect","buildPageItems","totalPages","current","sibling","Array","from","length","_","i","items","push","leftBound","Math","max","rightBound","min","PaginationDefault","props","p","internalCurrent","setInternalCurrent","internalPageSize","setInternalPageSize","jumpValue","setJumpValue","pageSize","ceil","showSizeChanger","shouldHide","changePage","page","clamped","onChange","changePageSize","newTotal","newCurrent","onShowSizeChange","pageItems","handleJump","val","parseInt","isNaN","range","start","end","pageSizeSelectOpts","map","opt","label","value","_$createComponent","when","children","_el$","_tmpl$5","_$insert","showTotal","_el$2","_tmpl$","_$effect","_$className","class","btn","_el$8","_tmpl$6","$$click","_p$","_v$6","prev","btnDisabled","_v$7","e","t","undefined","itemRender","each","item","_el$9","_tmpl$7","jump","_$setAttribute","_v$8","ellipsis","_v$9","pageBtn","_el$0","_tmpl$8","_v$0","itemActive","_v$1","_v$10","a","_el$1","_tmpl$9","_v$11","next","_v$12","_el$3","_tmpl$2","options","placement","root","sizeChanger","_el$4","_tmpl$4","_el$5","firstChild","_el$6","nextSibling","$$keydown","key","currentTarget","blur","$$input","_$memo","goButton","fallback","_el$7","_tmpl$3","_v$","jumper","_v$2","jumperLabel","_v$3","jumperInput","_v$4","_v$5","o","PaginationSimple","_el$10","_tmpl$0","_el$11","_el$12","_el$13","_el$14","_el$15","_el$16","addEventListener","v","target","HTMLInputElement","select","_v$13","_v$14","_v$15","_v$16","simplePager","_v$17","simpleInput","_v$18","_v$19","_v$20","slash","_v$21","_v$22","n","s","h","r","d","PaginationFully","modernPageInput","setModernPageInput","String","syncPageInput","commitPageInput","num","_el$17","_tmpl$1","_el$18","_el$19","_el$20","_el$21","_el$22","_el$23","_el$26","_el$24","_el$27","_el$25","_el$28","_el$29","_el$30","_el$31","_el$33","_el$32","_el$34","_el$35","Number","_el$36","_tmpl$10","_v$23","_v$24","fullyLeft","_v$25","fullyLabel","_v$26","_v$27","_v$28","fullyRange","_v$29","fullyRight","_v$30","fullyPageInput","_v$31","_v$32","_v$33","_v$34","fullyPages","_v$35","_v$36","_v$37","_v$38","l","_$setStyleProperty","u","c","w","m","f","Pagination","mode","_$delegateEvents"],"sources":["../../../src/components/pagination/pagination.tsx"],"sourcesContent":["import { Select } from '@/components/select';\nimport { cn } from '@/utils/cn';\nimport { getColor } from '@/utils/helper';\nimport ChevronLeft from 'lucide-solid/icons/chevron-left';\nimport ChevronRight from 'lucide-solid/icons/chevron-right';\nimport {\n Component,\n createEffect,\n createMemo,\n createSignal,\n For,\n Match,\n mergeProps,\n Show,\n Switch,\n} from 'solid-js';\nimport type {\n PaginationDefaultProps,\n PaginationFullyProps,\n PaginationProps,\n PaginationSimpleProps,\n} from './pagination.types';\n\nconst DEFAULT_PROPS = {\n defaultCurrent: 1,\n defaultPageSize: 10,\n total: 0,\n align: 'start' as const,\n size: 'md' as const,\n color: 'neutral' as const,\n hideOnSinglePage: false,\n showLessItems: false,\n showQuickJumper: false,\n showTitle: true,\n disabled: false,\n pageSizeOptions: [10, 20, 50, 100],\n totalBoundaryShowSizeChanger: 50,\n};\n\n// ─── Shared helpers ─────────────────────────────────────────────────────────\n\nfunction buildSizeClass(size: string) {\n switch (size) {\n case 'xs':\n return 'pag26';\n case 'sm':\n return 'pag27';\n case 'lg':\n return 'pag29';\n case 'xl':\n return 'pag30';\n default:\n return 'pag28';\n }\n}\n\nfunction buildAlignClass(align: string) {\n switch (align) {\n case 'center':\n return 'justify-center';\n case 'end':\n return 'justify-end';\n default:\n return 'justify-start';\n }\n}\n\nfunction mapSizeToSelect(size: string): 'sm' | 'md' | 'lg' {\n if (size === 'lg' || size === 'xl') return 'lg';\n if (size === 'md') return 'md';\n return 'sm';\n}\n\n// Build page list with ellipsis algorithm\nfunction buildPageItems(totalPages: number, current: number, showLessItems: boolean) {\n const sibling = showLessItems ? 1 : 2;\n\n if (totalPages <= (showLessItems ? 7 : 9)) {\n return Array.from({ length: totalPages }, (_, i) => i + 1);\n }\n\n const items: (number | 'prev-ellipsis' | 'next-ellipsis')[] = [];\n\n items.push(1);\n\n const leftBound = Math.max(2, current - sibling);\n const rightBound = Math.min(totalPages - 1, current + sibling);\n\n if (leftBound > 2) items.push('prev-ellipsis');\n for (let i = leftBound; i <= rightBound; i++) items.push(i);\n if (rightBound < totalPages - 1) items.push('next-ellipsis');\n\n items.push(totalPages);\n\n return items;\n}\n\n// ─── Mode: default ──────────────────────────────────────────────────────────\n\nconst PaginationDefault: Component<PaginationDefaultProps> = props => {\n const p = mergeProps(DEFAULT_PROPS, props);\n\n const [internalCurrent, setInternalCurrent] = createSignal(p.defaultCurrent);\n const [internalPageSize, setInternalPageSize] = createSignal(p.defaultPageSize);\n const [jumpValue, setJumpValue] = createSignal('');\n\n const current = createMemo(() => p.current ?? internalCurrent());\n const pageSize = createMemo(() => p.pageSize ?? internalPageSize());\n const totalPages = createMemo(() => Math.max(1, Math.ceil((p.total ?? 0) / pageSize())));\n\n const showSizeChanger = createMemo(() => {\n if (typeof p.showSizeChanger === 'boolean') return p.showSizeChanger;\n if (typeof p.showSizeChanger === 'object') return true;\n return (p.total ?? 0) > (p.totalBoundaryShowSizeChanger ?? 50);\n });\n\n const shouldHide = createMemo(() => p.hideOnSinglePage && totalPages() <= 1);\n\n const changePage = (page: number) => {\n const clamped = Math.min(Math.max(1, page), totalPages());\n if (clamped === current()) return;\n setInternalCurrent(clamped);\n p.onChange?.(clamped, pageSize());\n };\n\n const changePageSize = (size: number) => {\n const newTotal = Math.max(1, Math.ceil((p.total ?? 0) / size));\n const newCurrent = Math.min(current(), newTotal);\n setInternalPageSize(size);\n setInternalCurrent(newCurrent);\n p.onShowSizeChange?.(newCurrent, size);\n p.onChange?.(newCurrent, size);\n };\n\n const pageItems = createMemo(() => buildPageItems(totalPages(), current(), p.showLessItems));\n\n const handleJump = () => {\n const val = parseInt(jumpValue(), 10);\n if (!isNaN(val)) {\n changePage(val);\n setJumpValue('');\n }\n };\n\n const range = createMemo<[number, number]>(() => {\n const start = (current() - 1) * pageSize() + 1;\n const end = Math.min(current() * pageSize(), p.total ?? 0);\n return [start, end];\n });\n\n const pageSizeSelectOpts = createMemo(() =>\n p.pageSizeOptions.map(opt => ({ label: `${opt} / page`, value: opt as number })),\n );\n\n return (\n <Show when={!shouldHide()}>\n <div\n class={cn(\n 'pag01 pag02',\n buildSizeClass(p.size),\n buildAlignClass(p.align),\n getColor(p.color),\n p.disabled && 'pag05',\n p.class?.root,\n )}\n >\n {/* Show total */}\n <Show when={p.showTotal}>\n <span class={cn('pag13', p.class?.total)}>{p.showTotal!(p.total ?? 0, range())}</span>\n </Show>\n\n {/* Prev button */}\n {(() => {\n const btn = (\n <button\n class={cn(\n 'pag06 pag08',\n p.class?.btn,\n p.class?.prev,\n current() <= 1 && 'pag07',\n current() <= 1 && p.class?.btnDisabled,\n )}\n disabled={p.disabled || current() <= 1}\n onClick={() => changePage(current() - 1)}\n title=\"Previous Page\"\n >\n <ChevronLeft size={16} />\n </button>\n );\n return p.itemRender ? p.itemRender(current() - 1, 'prev', btn) : btn;\n })()}\n\n {/* Page items */}\n <For each={pageItems()}>\n {item => {\n if (item === 'prev-ellipsis' || item === 'next-ellipsis') {\n return (\n <button\n class={cn('pag06 pag10', p.class?.btn, p.class?.ellipsis)}\n disabled={p.disabled}\n onClick={() => {\n const jump =\n item === 'prev-ellipsis'\n ? Math.max(1, current() - (p.showLessItems ? 3 : 5))\n : Math.min(totalPages(), current() + (p.showLessItems ? 3 : 5));\n changePage(jump);\n }}\n title={item === 'prev-ellipsis' ? 'Previous 5 pages' : 'Next 5 pages'}\n >\n •••\n </button>\n );\n }\n const pageBtn = (\n <button\n class={cn(\n 'pag06',\n item === current() && 'pag11',\n item === current() && p.class?.itemActive,\n p.class?.btn,\n )}\n disabled={p.disabled}\n onClick={() => changePage(item)}\n title={p.showTitle ? `Page ${item}` : undefined}\n >\n {item}\n </button>\n );\n return p.itemRender ? p.itemRender(item, 'page', pageBtn) : pageBtn;\n }}\n </For>\n\n {/* Next button */}\n {(() => {\n const btn = (\n <button\n class={cn(\n 'pag06 pag09',\n current() >= totalPages() && 'pag07',\n current() >= totalPages() && p.class?.btnDisabled,\n p.class?.btn,\n p.class?.next,\n )}\n disabled={p.disabled || current() >= totalPages()}\n onClick={() => changePage(current() + 1)}\n title=\"Next Page\"\n >\n <ChevronRight size={16} />\n </button>\n );\n return p.itemRender ? p.itemRender(current() + 1, 'next', btn) : btn;\n })()}\n\n {/* Size changer */}\n <Show when={showSizeChanger()}>\n <div class=\"w-fit\">\n <Select\n options={pageSizeSelectOpts()}\n value={pageSize()}\n onChange={val => changePageSize(val as number)}\n disabled={p.disabled}\n size={mapSizeToSelect(p.size)}\n color={p.color}\n placement=\"top\"\n class={{ root: p.class?.sizeChanger }}\n />\n </div>\n </Show>\n\n {/* Quick jumper */}\n <Show when={p.showQuickJumper}>\n <span\n class={cn(\n 'pag14',\n p.align === 'end' && 'order-first mr-auto',\n p.align === 'start' && 'ml-auto',\n p.class?.jumper,\n )}\n >\n <span class={cn('pag15', p.class?.jumperLabel)}>Go to</span>\n <input\n class={cn('pag16', p.class?.jumperInput)}\n type=\"number\"\n min={1}\n max={totalPages()}\n value={jumpValue()}\n disabled={p.disabled}\n onInput={e => setJumpValue(e.currentTarget.value)}\n onKeyDown={e => {\n if (e.key === 'Enter') {\n handleJump();\n e.currentTarget.blur();\n }\n }}\n />\n <Show\n when={typeof p.showQuickJumper === 'object' && p.showQuickJumper.goButton}\n fallback={null}\n >\n <span onClick={() => handleJump()} class=\"cursor-pointer\">\n {(p.showQuickJumper as { goButton: any }).goButton}\n </span>\n </Show>\n </span>\n </Show>\n </div>\n </Show>\n );\n};\n\n// ─── Mode: simple ────────────────────────────────────────────────────────────\n\nconst PaginationSimple: Component<PaginationSimpleProps> = props => {\n const p = mergeProps(DEFAULT_PROPS, props);\n\n const [internalCurrent, setInternalCurrent] = createSignal(p.defaultCurrent);\n const [internalPageSize, setInternalPageSize] = createSignal(p.defaultPageSize);\n\n const current = createMemo(() => p.current ?? internalCurrent());\n const pageSize = createMemo(() => p.pageSize ?? internalPageSize());\n const totalPages = createMemo(() => Math.max(1, Math.ceil((p.total ?? 0) / pageSize())));\n const shouldHide = createMemo(() => p.hideOnSinglePage && totalPages() <= 1);\n\n const changePage = (page: number) => {\n const clamped = Math.min(Math.max(1, page), totalPages());\n if (clamped === current()) return;\n setInternalCurrent(clamped);\n p.onChange?.(clamped, pageSize());\n };\n\n return (\n <Show when={!shouldHide()}>\n <div\n class={cn(\n 'pag01 pag03',\n buildSizeClass(p.size),\n buildAlignClass(p.align),\n getColor(p.color),\n p.disabled && 'pag05',\n p.class?.root,\n )}\n >\n <button\n class={cn(\n 'pag06 pag08',\n p.class?.btn,\n p.class?.prev,\n current() <= 1 && 'pag07',\n current() <= 1 && p.class?.btnDisabled,\n )}\n disabled={p.disabled || current() <= 1}\n onClick={() => changePage(current() - 1)}\n title=\"Previous\"\n >\n <ChevronLeft size={16} />\n </button>\n <span class={cn('pag17', p.class?.simplePager)}>\n <input\n class={cn('pag18', p.class?.simpleInput)}\n type=\"number\"\n min={1}\n max={totalPages()}\n value={current()}\n disabled={p.disabled}\n onFocus={e => e.currentTarget.select()}\n onKeyDown={e => {\n if (e.key === 'Enter') {\n const v = parseInt((e.target as HTMLInputElement).value, 10);\n if (!isNaN(v)) changePage(v);\n }\n }}\n onBlur={e => {\n const v = parseInt(e.currentTarget.value, 10);\n if (!isNaN(v)) changePage(v);\n }}\n />\n <span class={cn('pag19', p.class?.slash)}>/</span>\n <span>{totalPages()}</span>\n </span>\n <button\n class={cn(\n 'pag06 pag09',\n p.class?.btn,\n p.class?.next,\n current() >= totalPages() && 'pag07',\n current() >= totalPages() && p.class?.btnDisabled,\n )}\n disabled={p.disabled || current() >= totalPages()}\n onClick={() => changePage(current() + 1)}\n title=\"Next\"\n >\n <ChevronRight size={16} />\n </button>\n </div>\n </Show>\n );\n};\n\n// ─── Mode: fully ─────────────────────────────────────────────────────────────\n\nconst PaginationFully: Component<PaginationFullyProps> = props => {\n const p = mergeProps(DEFAULT_PROPS, props);\n\n const [internalCurrent, setInternalCurrent] = createSignal(p.defaultCurrent);\n const [internalPageSize, setInternalPageSize] = createSignal(p.defaultPageSize);\n const [modernPageInput, setModernPageInput] = createSignal(String(p.defaultCurrent ?? 1));\n\n const current = createMemo(() => p.current ?? internalCurrent());\n const pageSize = createMemo(() => p.pageSize ?? internalPageSize());\n const totalPages = createMemo(() => Math.max(1, Math.ceil((p.total ?? 0) / pageSize())));\n const shouldHide = createMemo(() => p.hideOnSinglePage && totalPages() <= 1);\n\n createEffect(function syncPageInput() {\n setModernPageInput(String(current()));\n });\n\n const changePage = (page: number) => {\n const clamped = Math.min(Math.max(1, page), totalPages());\n if (clamped === current()) return;\n setInternalCurrent(clamped);\n p.onChange?.(clamped, pageSize());\n };\n\n const changePageSize = (size: number) => {\n const newTotal = Math.max(1, Math.ceil((p.total ?? 0) / size));\n const newCurrent = Math.min(current(), newTotal);\n setInternalPageSize(size);\n setInternalCurrent(newCurrent);\n p.onShowSizeChange?.(newCurrent, size);\n p.onChange?.(newCurrent, size);\n };\n\n const range = createMemo<[number, number]>(() => {\n const start = (current() - 1) * pageSize() + 1;\n const end = Math.min(current() * pageSize(), p.total ?? 0);\n return [start, end];\n });\n\n const commitPageInput = (value: string) => {\n const num = parseInt(value, 10);\n const clamped = !isNaN(num) ? Math.min(Math.max(1, num), totalPages()) : current();\n changePage(clamped);\n setModernPageInput(String(clamped));\n };\n\n return (\n <Show when={!shouldHide()}>\n <div\n class={cn(\n 'pag01 pag04',\n buildSizeClass(p.size),\n getColor(p.color),\n p.disabled && 'pag05',\n p.class?.root,\n )}\n >\n {/* Left: items-per-page dropdown + range */}\n <div class={cn('pag20', p.class?.fullyLeft)}>\n <span class={cn('pag22', p.class?.fullyLabel)}>Items per page:</span>\n <select\n class={cn('pag12', p.class?.sizeChanger)}\n disabled={p.disabled}\n value={pageSize()}\n onChange={e => changePageSize(Number(e.currentTarget.value))}\n >\n <For each={p.pageSizeOptions}>{opt => <option value={opt}>{opt}</option>}</For>\n </select>\n <div class=\"bg-c3/50 w-px self-stretch\"></div>\n <span class={cn('pag23', p.class?.fullyRange)}>\n {range()[0]}–{range()[1]} of {p.total ?? 0} items\n </span>\n </div>\n\n {/* Right: page input + prev/next buttons */}\n <div class={cn('pag21', p.class?.fullyRight)}>\n <input\n class={cn('pag25', p.class?.fullyPageInput)}\n type=\"number\"\n min={1}\n max={totalPages()}\n value={modernPageInput()}\n disabled={p.disabled}\n style={{ width: `${Math.max(2, modernPageInput().length) + 0.5}ch` }}\n onFocus={e => e.currentTarget.select()}\n onInput={e => setModernPageInput(e.currentTarget.value)}\n onBlur={e => commitPageInput(e.currentTarget.value)}\n onKeyDown={e => {\n if (e.key === 'Enter') {\n commitPageInput((e.currentTarget as HTMLInputElement).value);\n e.currentTarget.blur();\n }\n }}\n />\n <span class={cn('pag24', p.class?.fullyPages)}>of {totalPages()} pages</span>\n <button\n class={cn(\n 'pag06',\n p.class?.btn,\n p.class?.prev,\n current() <= 1 && 'pag07',\n current() <= 1 && p.class?.btnDisabled,\n )}\n disabled={p.disabled || current() <= 1}\n onClick={() => changePage(current() - 1)}\n title=\"Previous Page\"\n >\n <ChevronLeft size={16} />\n </button>\n <button\n class={cn(\n 'pag06',\n p.class?.btn,\n p.class?.next,\n current() >= totalPages() && 'pag07',\n current() >= totalPages() && p.class?.btnDisabled,\n )}\n disabled={p.disabled || current() >= totalPages()}\n onClick={() => changePage(current() + 1)}\n title=\"Next Page\"\n >\n <ChevronRight size={16} />\n </button>\n </div>\n </div>\n </Show>\n );\n};\n\n// ─── Public component ────────────────────────────────────────────────────────\n\nexport const Pagination: Component<PaginationProps> = p => {\n return (\n <Switch fallback={<PaginationDefault {...(p as PaginationDefaultProps)} />}>\n <Match when={p.mode === 'simple'}>\n <PaginationSimple {...(p as PaginationSimpleProps)} />\n </Match>\n <Match when={p.mode === 'fully'}>\n <PaginationFully {...(p as PaginationFullyProps)} />\n </Match>\n </Switch>\n );\n};\n"],"mappings":"2qCAuBMkB,EAAgB,CACpBC,eAAgB,EAChBC,gBAAiB,GACjBC,MAAO,EACPC,MAAO,QACPE,KAAM,KACNC,MAAO,UACPC,iBAAkB,GAClBC,cAAe,GACfC,gBAAiB,GACjBC,UAAW,GACXC,SAAU,GACVC,gBAAiB,CAAC,GAAI,GAAI,GAAI,IAAI,CAClCC,6BAA8B,GAC/B,CAID,SAASC,EAAeT,EAAc,CACpC,OAAQA,EAAR,CACE,IAAK,KACH,MAAO,QACT,IAAK,KACH,MAAO,QACT,IAAK,KACH,MAAO,QACT,IAAK,KACH,MAAO,QACT,QACE,MAAO,SAIb,SAASU,EAAgBZ,EAAe,CACtC,OAAQA,EAAR,CACE,IAAK,SACH,MAAO,iBACT,IAAK,MACH,MAAO,cACT,QACE,MAAO,iBAIb,SAASa,EAAgBX,EAAkC,CAGzD,OAFIA,IAAS,MAAQA,IAAS,KAAa,KACvCA,IAAS,KAAa,KACnB,KAIT,SAASY,EAAeC,EAAoBC,EAAiBX,EAAwB,CACnF,IAAMY,EAAUZ,EAAgB,EAAI,EAEpC,GAAIU,IAAeV,EAAgB,EAAI,GACrC,OAAOa,MAAMC,KAAK,CAAEC,OAAQL,EAAY,EAAGM,EAAGC,IAAMA,EAAI,EAAE,CAG5D,IAAMC,EAAwD,EAAE,CAEhEA,EAAMC,KAAK,EAAE,CAEb,IAAMC,EAAYC,KAAKC,IAAI,EAAGX,EAAUC,EAAQ,CAC1CW,EAAaF,KAAKG,IAAId,EAAa,EAAGC,EAAUC,EAAQ,CAE1DQ,EAAY,GAAGF,EAAMC,KAAK,gBAAgB,CAC9C,IAAK,IAAIF,EAAIG,EAAWH,GAAKM,EAAYN,IAAKC,EAAMC,KAAKF,EAAE,CAK3D,OAJIM,EAAab,EAAa,GAAGQ,EAAMC,KAAK,gBAAgB,CAE5DD,EAAMC,KAAKT,EAAW,CAEfQ,EAKT,IAAMO,EAAuDC,GAAS,CACpE,IAAMC,EAAI3C,EAAWO,EAAemC,EAAM,CAEpC,CAACE,EAAiBC,GAAsBhD,EAAa8C,EAAEnC,eAAe,CACtE,CAACsC,EAAkBC,GAAuBlD,EAAa8C,EAAElC,gBAAgB,CACzE,CAACuC,EAAWC,GAAgBpD,EAAa,GAAG,CAE5C8B,EAAU/B,MAAiB+C,EAAEhB,SAAWiB,GAAiB,CAAC,CAC1DM,EAAWtD,MAAiB+C,EAAEO,UAAYJ,GAAkB,CAAC,CAC7DpB,EAAa9B,MAAiByC,KAAKC,IAAI,EAAGD,KAAKc,MAAMR,EAAEjC,OAAS,GAAKwC,GAAU,CAAC,CAAC,CAAC,CAElFE,EAAkBxD,MAClB,OAAO+C,EAAES,iBAAoB,UAAkBT,EAAES,gBACjD,OAAOT,EAAES,iBAAoB,SAAiB,IAC1CT,EAAEjC,OAAS,IAAMiC,EAAEtB,8BAAgC,IAC3D,CAEIgC,EAAazD,MAAiB+C,EAAE5B,kBAAoBW,GAAY,EAAI,EAAE,CAEtE4B,EAAcC,GAAiB,CACnC,IAAMC,EAAUnB,KAAKG,IAAIH,KAAKC,IAAI,EAAGiB,EAAK,CAAE7B,GAAY,CAAC,CACrD8B,IAAY7B,GAAS,GACzBkB,EAAmBW,EAAQ,CAC3Bb,EAAEc,WAAWD,EAASN,GAAU,CAAC,GAG7BQ,EAAkB7C,GAAiB,CACvC,IAAM8C,EAAWtB,KAAKC,IAAI,EAAGD,KAAKc,MAAMR,EAAEjC,OAAS,GAAKG,EAAK,CAAC,CACxD+C,EAAavB,KAAKG,IAAIb,GAAS,CAAEgC,EAAS,CAChDZ,EAAoBlC,EAAK,CACzBgC,EAAmBe,EAAW,CAC9BjB,EAAEkB,mBAAmBD,EAAY/C,EAAK,CACtC8B,EAAEc,WAAWG,EAAY/C,EAAK,EAG1BiD,EAAYlE,MAAiB6B,EAAeC,GAAY,CAAEC,GAAS,CAAEgB,EAAE3B,cAAc,CAAC,CAEtF+C,MAAmB,CACvB,IAAMC,EAAMC,SAASjB,GAAW,CAAE,GAAG,CAChCkB,MAAMF,EAAI,GACbV,EAAWU,EAAI,CACff,EAAa,GAAG,GAIdkB,EAAQvE,MAGL,EAFQ+B,GAAS,CAAG,GAAKuB,GAAU,CAAG,EACjCb,KAAKG,IAAIb,GAAS,CAAGuB,GAAU,CAAEP,EAAEjC,OAAS,EAAE,CACvC,CACnB,CAEI4D,EAAqB1E,MACzB+C,EAAEvB,gBAAgBmD,IAAIC,IAAQ,CAAEC,MAAO,GAAGD,EAAG,SAAWE,MAAOF,EAAe,EAChF,CAAC,CAED,OAAAG,EACG1E,EAAI,CAAA,IAAC2E,MAAI,CAAA,MAAE,CAACvB,GAAY,EAAA,IAAAwB,UAAA,CAAA,IAAAC,EAAAC,GAAA,CASpB,OAToBC,EAAAF,EAAAH,EAYpB1E,EAAI,CAAA,IAAC2E,MAAI,CAAA,OAAEjC,EAAEsC,WAAS,IAAAJ,UAAA,CAAA,IAAAK,EAAAC,GAAA,CACmB,OADnBH,EAAAE,MACsBvC,EAAEsC,UAAWtC,EAAEjC,OAAS,EAAGyD,GAAO,CAAC,CAAA,CAAAiB,MAAAC,EAAAH,EAAjE5F,EAAG,QAASqD,EAAE2C,OAAO5E,MAAM,CAAA,CAAA,CAAAwE,GAAA,CAAA,CAAA,KAAA,CAAAF,EAAAF,MAIlC,CACN,IAAMS,OAAG,CAAA,IAAAC,EAAAC,GAAA,CASiC,MATjCD,GAAAE,YAUUpC,EAAW3B,GAAS,CAAG,EAAE,CAAAqD,EAAAQ,EAAAb,EAGvCnF,EAAW,CAACqB,KAAM,GAAE,CAAA,CAAA,CAAAuE,EAAAO,GAAA,CAAA,IAAAC,EAXdtG,EACL,cACAqD,EAAE2C,OAAOC,IACT5C,EAAE2C,OAAOO,KACTlE,GAAS,EAAI,GAAK,QAClBA,GAAS,EAAI,GAAKgB,EAAE2C,OAAOQ,YAC5B,CAAAC,EACSpD,EAAExB,UAAYQ,GAAS,EAAI,EAAC,OAAAiE,IAAAD,EAAAK,GAAAX,EAAAG,EAAAG,EAAAK,EAAAJ,EAAA,CAAAG,IAAAJ,EAAAM,IAAAT,EAAArE,SAAAwE,EAAAM,EAAAF,GAAAJ,GAAA,CAAAK,EAAAE,IAAAA,GAAAD,EAAAC,IAAAA,GAAA,CAAA,CAAAV,KAMzC,CACD,OAAO7C,EAAEwD,WAAaxD,EAAEwD,WAAWxE,GAAS,CAAG,EAAG,OAAQ4D,EAAI,CAAGA,GAClE,KAAA,CAAAP,EAAAF,EAAAH,EAGA7E,EAAG,CAAA,IAACsG,MAAI,CAAA,OAAEtC,GAAW,EAAAe,SACnBwB,GAAQ,CACP,GAAIA,IAAS,iBAAmBA,IAAS,gBACvC,WAAA,CAAA,IAAAC,EAAAC,GAAA,CAGwB,MAHxBD,GAAAZ,YAImB,CAKbpC,EAHE+C,IAAS,gBACLhE,KAAKC,IAAI,EAAGX,GAAS,EAAIgB,EAAE3B,cAAgB,EAAI,GAAG,CAClDqB,KAAKG,IAAId,GAAY,CAAEC,GAAS,EAAIgB,EAAE3B,cAAgB,EAAI,GAAG,CACnD,EACjByF,EAAAH,EAAA,QACMD,IAAS,gBAAkB,mBAAqB,eAAc,CAAAjB,EAAAO,GAAA,CAAA,IAAAe,EAT9DpH,EAAG,cAAeqD,EAAE2C,OAAOC,IAAK5C,EAAE2C,OAAOqB,SAAS,CAAAC,EAC/CjE,EAAExB,SAAQ,OAAAuF,IAAAf,EAAAK,GAAAX,EAAAiB,EAAAX,EAAAK,EAAAU,EAAA,CAAAE,IAAAjB,EAAAM,IAAAK,EAAAnF,SAAAwE,EAAAM,EAAAW,GAAAjB,GAAA,CAAAK,EAAAE,IAAAA,GAAAD,EAAAC,IAAAA,GAAA,CAAA,CAAAI,KAAA,CAc1B,IAAMO,OAAO,CAAA,IAAAC,EAAAC,GAAA,CAUsC,MAVtCD,GAAApB,YASMpC,EAAW+C,EAAK,CAAArB,EAAA8B,EAG9BT,EAAI,CAAAjB,EAAAO,GAAA,CAAA,IAAAqB,EAVE1H,EACL,QACA+G,IAAS1E,GAAS,EAAI,QACtB0E,IAAS1E,GAAS,EAAIgB,EAAE2C,OAAO2B,WAC/BtE,EAAE2C,OAAOC,IACV,CAAA2B,EACSvE,EAAExB,SAAQgG,EAEbxE,EAAEzB,UAAY,QAAQmF,IAASH,IAAAA,GAAS,OAAAc,IAAArB,EAAAK,GAAAX,EAAAyB,EAAAnB,EAAAK,EAAAgB,EAAA,CAAAE,IAAAvB,EAAAM,IAAAa,EAAA3F,SAAAwE,EAAAM,EAAAiB,GAAAC,IAAAxB,EAAAyB,GAAAX,EAAAK,EAAA,QAAAnB,EAAAyB,EAAAD,EAAA,CAAAxB,GAAA,CAAAK,EAAAE,IAAAA,GAAAD,EAAAC,IAAAA,GAAAkB,EAAAlB,IAAAA,GAAA,CAAA,CAAAY,KAIlD,CACD,OAAOnE,EAAEwD,WAAaxD,EAAEwD,WAAWE,EAAM,OAAQQ,EAAQ,CAAGA,GAC7D,CAAA,CAAA,KAAA,CAAA7B,EAAAF,MAIK,CACN,IAAMS,OAAG,CAAA,IAAA8B,EAAAC,GAAA,CAS4C,MAT5CD,GAAA3B,YAUUpC,EAAW3B,GAAS,CAAG,EAAE,CAAAqD,EAAAqC,EAAA1C,EAGvClF,EAAY,CAACoB,KAAM,GAAE,CAAA,CAAA,CAAAuE,EAAAO,GAAA,CAAA,IAAA4B,EAXfjI,EACL,cACAqC,GAAS,EAAID,GAAY,EAAI,QAC7BC,GAAS,EAAID,GAAY,EAAIiB,EAAE2C,OAAOQ,YACtCnD,EAAE2C,OAAOC,IACT5C,EAAE2C,OAAOkC,KACV,CAAAC,EACS9E,EAAExB,UAAYQ,GAAS,EAAID,GAAY,CAAA,OAAA6F,IAAA5B,EAAAK,GAAAX,EAAAgC,EAAA1B,EAAAK,EAAAuB,EAAA,CAAAE,IAAA9B,EAAAM,IAAAoB,EAAAlG,SAAAwE,EAAAM,EAAAwB,GAAA9B,GAAA,CAAAK,EAAAE,IAAAA,GAAAD,EAAAC,IAAAA,GAAA,CAAA,CAAAmB,KAMpD,CACD,OAAO1E,EAAEwD,WAAaxD,EAAEwD,WAAWxE,GAAS,CAAG,EAAG,OAAQ4D,EAAI,CAAGA,GAClE,KAAA,CAAAP,EAAAF,EAAAH,EAGA1E,EAAI,CAAA,IAAC2E,MAAI,CAAA,OAAExB,GAAiB,EAAA,IAAAyB,UAAA,CAAA,IAAA6C,EAAAC,GAAA,CAUc,OAVd3C,EAAA0C,EAAA/C,EAExBtF,EAAM,CAAA,IACLuI,SAAO,CAAA,OAAEtD,GAAoB,EAAA,IAC7BI,OAAK,CAAA,OAAExB,GAAU,EACjBO,SAAUO,GAAON,EAAeM,EAAc,CAAA,IAC9C7C,UAAQ,CAAA,OAAEwB,EAAExB,UAAQ,IACpBN,MAAI,CAAA,OAAEW,EAAgBmB,EAAE9B,KAAK,EAAA,IAC7BC,OAAK,CAAA,OAAE6B,EAAE7B,OACT+G,UAAS,MAAA,IAAA,OAAA,CAAA,MACF,CAAEC,KAAMnF,EAAE2C,OAAOyC,YAAa,EAAA,CAAA,CAAA,CAAAL,GAAA,CAAA,CAAA,KAAA,CAAA1C,EAAAF,EAAAH,EAM1C1E,EAAI,CAAA,IAAC2E,MAAI,CAAA,OAAEjC,EAAE1B,iBAAe,IAAA4D,UAAA,CAAA,IAAAmD,EAAAC,GAAA,CAAAC,EAAAF,EAAAG,WAAAC,EAAAF,EAAAG,YAeL,MAfKD,GAAAE,UAkBZtC,GAAK,CACVA,EAAEuC,MAAQ,UACZxE,GAAY,CACZiC,EAAEwC,cAAcC,MAAM,GAEzBL,EAAAM,QANQ1C,GAAK/C,EAAa+C,EAAEwC,cAAc9D,MAAM,CAAAM,EAAAgD,EAAArD,EAQlD1E,EAAI,CAAA,IACH2E,MAAI,CAAA,OAAE+D,MAAA,OAAOhG,EAAE1B,iBAAoB,SAAQ,EAAA,EAAI0B,EAAE1B,gBAAgB2H,UACjEC,SAAU,KAAI,IAAAhE,UAAA,CAAA,IAAAiE,EAAAC,GAAA,CAGsC,MAHtCD,GAAApD,YAEO3B,GAAY,CAAAiB,EAAA8D,MAC7BnG,EAAE1B,gBAAsC2H,SAAQ,CAAAE,GAAA,CAAA,CAAA,KAAA,CAAA1D,EAAAO,GAAA,CAAA,IAAAqD,EA5B/C1J,EACL,QACAqD,EAAEhC,QAAU,OAAS,sBACrBgC,EAAEhC,QAAU,SAAW,UACvBgC,EAAE2C,OAAO2D,OACV,CAAAC,EAEY5J,EAAG,QAASqD,EAAE2C,OAAO6D,YAAY,CAAAC,EAErC9J,EAAG,QAASqD,EAAE2C,OAAO+D,YAAY,CAAAC,EAGnC5H,GAAY,CAAA6H,EAEP5G,EAAExB,SAAQ,OAAA6H,IAAArD,EAAAK,GAAAX,EAAA2C,EAAArC,EAAAK,EAAAgD,EAAA,CAAAE,IAAAvD,EAAAM,GAAAZ,EAAA6C,EAAAvC,EAAAM,EAAAiD,EAAA,CAAAE,IAAAzD,EAAAyB,GAAA/B,EAAA+C,EAAAzC,EAAAyB,EAAAgC,EAAA,CAAAE,IAAA3D,EAAA6D,GAAA/C,EAAA2B,EAAA,MAAAzC,EAAA6D,EAAAF,EAAA,CAAAC,IAAA5D,EAAA1D,IAAAmG,EAAAjH,SAAAwE,EAAA1D,EAAAsH,GAAA5D,GAAA,CAAAK,EAAAE,IAAAA,GAAAD,EAAAC,IAAAA,GAAAkB,EAAAlB,IAAAA,GAAAsD,EAAAtD,IAAAA,GAAAjE,EAAAiE,IAAAA,GAAA,CAAA,CAAAd,MAAAgD,EAAA1D,MADb1B,GAAW,CAAA,CAAAgF,GAAA,CAAA,CAAA,KAAA,CAAA5C,MAAAC,EAAAP,EAhIjBxF,EACL,cACAgC,EAAeqB,EAAE9B,KAAK,CACtBU,EAAgBoB,EAAEhC,MAAM,CACxBpB,EAASoD,EAAE7B,MAAM,CACjB6B,EAAExB,UAAY,QACdwB,EAAE2C,OAAOwC,KACV,CAAA,CAAA,CAAAhD,GAAA,CAAA,EAoJH2E,EAAqD/G,GAAS,CAClE,IAAMC,EAAI3C,EAAWO,EAAemC,EAAM,CAEpC,CAACE,EAAiBC,GAAsBhD,EAAa8C,EAAEnC,eAAe,CACtE,CAACsC,EAAkBC,GAAuBlD,EAAa8C,EAAElC,gBAAgB,CAEzEkB,EAAU/B,MAAiB+C,EAAEhB,SAAWiB,GAAiB,CAAC,CAC1DM,EAAWtD,MAAiB+C,EAAEO,UAAYJ,GAAkB,CAAC,CAC7DpB,EAAa9B,MAAiByC,KAAKC,IAAI,EAAGD,KAAKc,MAAMR,EAAEjC,OAAS,GAAKwC,GAAU,CAAC,CAAC,CAAC,CAClFG,EAAazD,MAAiB+C,EAAE5B,kBAAoBW,GAAY,EAAI,EAAE,CAEtE4B,EAAcC,GAAiB,CACnC,IAAMC,EAAUnB,KAAKG,IAAIH,KAAKC,IAAI,EAAGiB,EAAK,CAAE7B,GAAY,CAAC,CACrD8B,IAAY7B,GAAS,GACzBkB,EAAmBW,EAAQ,CAC3Bb,EAAEc,WAAWD,EAASN,GAAU,CAAC,GAGnC,OAAAyB,EACG1E,EAAI,CAAA,IAAC2E,MAAI,CAAA,MAAE,CAACvB,GAAY,EAAA,IAAAwB,UAAA,CAAA,IAAA6E,EAAAC,GAAA,CAAAC,EAAAF,EAAAvB,WAAA0B,EAAAD,EAAAvB,YAAAyB,EAAAD,EAAA1B,WAAA4B,EAAAD,EAAAzB,YAAA2B,EAAAD,EAAA1B,YAAA4B,EAAAJ,EAAAxB,YA+BD,MA/BCuB,GAAAlE,YAoBJpC,EAAW3B,GAAS,CAAG,EAAE,CAAAqD,EAAA4E,EAAAjF,EAGvCnF,EAAW,CAACqB,KAAM,GAAE,CAAA,CAAA,CAAAiJ,EAAAI,iBAAA,OAiBXlE,GAAK,CACX,IAAMmE,EAAIlG,SAAS+B,EAAEwC,cAAc9D,MAAO,GAAG,CACxCR,MAAMiG,EAAE,EAAE7G,EAAW6G,EAAE,EAC7B,CAAAL,EAAAxB,UATUtC,GAAK,CACd,GAAIA,EAAEuC,MAAQ,QAAS,CACrB,IAAM4B,EAAIlG,SAAU+B,EAAEoE,OAA4B1F,MAAO,GAAG,CACvDR,MAAMiG,EAAE,EAAE7G,EAAW6G,EAAE,GAE/BL,EAAAI,iBAAA,QANQlE,GAAKA,EAAEwC,cAAc8B,QAAQ,CAAA,CAAAtF,EAAAgF,EAajCtI,EAAU,CAAAuI,EAAAvE,YAWFpC,EAAW3B,GAAS,CAAG,EAAE,CAAAqD,EAAAiF,EAAAtF,EAGvClF,EAAY,CAACoB,KAAM,GAAE,CAAA,CAAA,CAAAuE,EAAAO,GAAA,CAAA,IAAA4E,EA1DjBjL,EACL,cACAgC,EAAeqB,EAAE9B,KAAK,CACtBU,EAAgBoB,EAAEhC,MAAM,CACxBpB,EAASoD,EAAE7B,MAAM,CACjB6B,EAAExB,UAAY,QACdwB,EAAE2C,OAAOwC,KACV,CAAA0C,EAGQlL,EACL,cACAqD,EAAE2C,OAAOC,IACT5C,EAAE2C,OAAOO,KACTlE,GAAS,EAAI,GAAK,QAClBA,GAAS,EAAI,GAAKgB,EAAE2C,OAAOQ,YAC5B,CAAA2E,EACS9H,EAAExB,UAAYQ,GAAS,EAAI,EAAC+I,EAM3BpL,EAAG,QAASqD,EAAE2C,OAAOqF,YAAY,CAAAC,EAEnCtL,EAAG,QAASqD,EAAE2C,OAAOuF,YAAY,CAAAC,EAGnCpJ,GAAY,CAAAqJ,EAEPpI,EAAExB,SAAQ6J,EAaT1L,EAAG,QAASqD,EAAE2C,OAAO2F,MAAM,CAAAC,EAIjC5L,EACL,cACAqD,EAAE2C,OAAOC,IACT5C,EAAE2C,OAAOkC,KACT7F,GAAS,EAAID,GAAY,EAAI,QAC7BC,GAAS,EAAID,GAAY,EAAIiB,EAAE2C,OAAOQ,YACvC,CAAAqF,EACSxI,EAAExB,UAAYQ,GAAS,EAAID,GAAY,CAAA,OAAA6I,IAAA5E,EAAAK,GAAAX,EAAAqE,EAAA/D,EAAAK,EAAAuE,EAAA,CAAAC,IAAA7E,EAAAM,GAAAZ,EAAAuE,EAAAjE,EAAAM,EAAAuE,EAAA,CAAAC,IAAA9E,EAAAyB,IAAAwC,EAAAzI,SAAAwE,EAAAyB,EAAAqD,GAAAC,IAAA/E,EAAA6D,GAAAnE,EAAAwE,EAAAlE,EAAA6D,EAAAkB,EAAA,CAAAE,IAAAjF,EAAA1D,GAAAoD,EAAAyE,EAAAnE,EAAA1D,EAAA2I,EAAA,CAAAE,IAAAnF,EAAAyF,GAAA3E,EAAAqD,EAAA,MAAAnE,EAAAyF,EAAAN,EAAA,CAAAC,IAAApF,EAAA0F,IAAAvB,EAAA3I,SAAAwE,EAAA0F,EAAAN,GAAAC,IAAArF,EAAA2F,GAAAjG,EAAA0E,EAAApE,EAAA2F,EAAAN,EAAA,CAAAE,IAAAvF,EAAA4F,GAAAlG,EAAA4E,EAAAtE,EAAA4F,EAAAL,EAAA,CAAAC,IAAAxF,EAAA6F,IAAAvB,EAAA9I,SAAAwE,EAAA6F,EAAAL,GAAAxF,GAAA,CAAAK,EAAAE,IAAAA,GAAAD,EAAAC,IAAAA,GAAAkB,EAAAlB,IAAAA,GAAAsD,EAAAtD,IAAAA,GAAAjE,EAAAiE,IAAAA,GAAAkF,EAAAlF,IAAAA,GAAAmF,EAAAnF,IAAAA,GAAAoF,EAAApF,IAAAA,GAAAqF,EAAArF,IAAAA,GAAAsF,EAAAtF,IAAAA,GAAA,CAAA,CAAAd,MAAA0E,EAAApF,MAzBxC/C,GAAS,CAAA,CAAA+H,GAAA,CAAA,EAsCtB+B,EAAmD/I,GAAS,CAChE,IAAMC,EAAI3C,EAAWO,EAAemC,EAAM,CAEpC,CAACE,EAAiBC,GAAsBhD,EAAa8C,EAAEnC,eAAe,CACtE,CAACsC,EAAkBC,GAAuBlD,EAAa8C,EAAElC,gBAAgB,CACzE,CAACiL,EAAiBC,GAAsB9L,EAAa+L,OAAOjJ,EAAEnC,gBAAkB,EAAE,CAAC,CAEnFmB,EAAU/B,MAAiB+C,EAAEhB,SAAWiB,GAAiB,CAAC,CAC1DM,EAAWtD,MAAiB+C,EAAEO,UAAYJ,GAAkB,CAAC,CAC7DpB,EAAa9B,MAAiByC,KAAKC,IAAI,EAAGD,KAAKc,MAAMR,EAAEjC,OAAS,GAAKwC,GAAU,CAAC,CAAC,CAAC,CAClFG,EAAazD,MAAiB+C,EAAE5B,kBAAoBW,GAAY,EAAI,EAAE,CAE5E/B,EAAa,UAAyB,CACpCgM,EAAmBC,OAAOjK,GAAS,CAAC,CAAC,EACrC,CAEF,IAAM2B,EAAcC,GAAiB,CACnC,IAAMC,EAAUnB,KAAKG,IAAIH,KAAKC,IAAI,EAAGiB,EAAK,CAAE7B,GAAY,CAAC,CACrD8B,IAAY7B,GAAS,GACzBkB,EAAmBW,EAAQ,CAC3Bb,EAAEc,WAAWD,EAASN,GAAU,CAAC,GAG7BQ,EAAkB7C,GAAiB,CACvC,IAAM8C,EAAWtB,KAAKC,IAAI,EAAGD,KAAKc,MAAMR,EAAEjC,OAAS,GAAKG,EAAK,CAAC,CACxD+C,EAAavB,KAAKG,IAAIb,GAAS,CAAEgC,EAAS,CAChDZ,EAAoBlC,EAAK,CACzBgC,EAAmBe,EAAW,CAC9BjB,EAAEkB,mBAAmBD,EAAY/C,EAAK,CACtC8B,EAAEc,WAAWG,EAAY/C,EAAK,EAG1BsD,EAAQvE,MAGL,EAFQ+B,GAAS,CAAG,GAAKuB,GAAU,CAAG,EACjCb,KAAKG,IAAIb,GAAS,CAAGuB,GAAU,CAAEP,EAAEjC,OAAS,EAAE,CACvC,CACnB,CAEIoL,EAAmBpH,GAAkB,CACzC,IAAMqH,EAAM9H,SAASS,EAAO,GAAG,CACzBlB,EAAWU,MAAM6H,EAAI,CAA8CpK,GAAS,CAApDU,KAAKG,IAAIH,KAAKC,IAAI,EAAGyJ,EAAI,CAAErK,GAAY,CAAC,CACtE4B,EAAWE,EAAQ,CACnBmI,EAAmBC,OAAOpI,EAAQ,CAAC,EAGrC,OAAAmB,EACG1E,EAAI,CAAA,IAAC2E,MAAI,CAAA,MAAE,CAACvB,GAAY,EAAA,IAAAwB,UAAA,CAAA,IAAAmH,EAAAC,GAAA,CAAAC,EAAAF,EAAA7D,WAAAgE,EAAAD,EAAA/D,WAAAiE,EAAAD,EAAA9D,YAAAiE,EAAAF,EAAA/D,YAAAA,YAAAkE,EAAAD,EAAAnE,WAAAqE,EAAAD,EAAAlE,YAAAqE,EAAAF,EAAAnE,YAAAA,YAAAqE,EAAArE,YAAA,IAAAuE,EAAAV,EAAA7D,YAAAwE,EAAAD,EAAAzE,WAAA2E,EAAAD,EAAAxE,YAAA2E,EAAAF,EAAA3E,WAAAE,YAAA2E,EAAA3E,YAAA,IAAA6E,EAAAJ,EAAAzE,YAAA8E,EAAAD,EAAA7E,YAkCO,OAlCP+D,EAAAlC,iBAAA,SAiBPlE,GAAKtC,EAAe0J,OAAOpH,EAAEwC,cAAc9D,MAAM,CAAC,CAAA,CAAAM,EAAAoH,EAAAzH,EAE3D7E,EAAG,CAAA,IAACsG,MAAI,CAAA,OAAEzD,EAAEvB,iBAAeyD,SAAGL,QAAG,CAAA,IAAA6I,EAAAC,GAAA,CAA4B,MAA5BD,GAAA3I,MAAmBF,EAAGQ,EAAAqI,EAAG7I,EAAG,CAAA6I,KAAA,CAAU,CAAA,CAAA,CAAArI,EAAAsH,MAIvEnI,GAAO,CAAC,GAAEoI,EAAA,CAAAvH,EAAAsH,MAAGnI,GAAO,CAAC,GAAEqI,EAAA,CAAAxH,EAAAsH,MAAM3J,EAAEjC,OAAS,EAACgM,EAAA,CAAAG,EAAAvE,UAiB/BtC,GAAK,CACVA,EAAEuC,MAAQ,UACZuD,EAAiB9F,EAAEwC,cAAmC9D,MAAM,CAC5DsB,EAAEwC,cAAcC,MAAM,GAEzBoE,EAAA3C,iBAAA,OANOlE,GAAK8F,EAAgB9F,EAAEwC,cAAc9D,MAAM,CAAA,CAAAmI,EAAAnE,QAD1C1C,GAAK2F,EAAmB3F,EAAEwC,cAAc9D,MAAM,CAAAmI,EAAA3C,iBAAA,QAD9ClE,GAAKA,EAAEwC,cAAc8B,QAAQ,CAAA,CAAAtF,EAAA8H,EAUWpL,EAAUsL,EAAA,CAAAE,EAAAxH,YAU5CpC,EAAW3B,GAAS,CAAG,EAAE,CAAAqD,EAAAkI,EAAAvI,EAGvCnF,EAAW,CAACqB,KAAM,GAAE,CAAA,CAAA,CAAAsM,EAAAzH,YAWNpC,EAAW3B,GAAS,CAAG,EAAE,CAAAqD,EAAAmI,EAAAxI,EAGvClF,EAAY,CAACoB,KAAM,GAAE,CAAA,CAAA,CAAAuE,EAAAO,GAAA,CAAA,IAAA4H,EAxEnBjO,EACL,cACAgC,EAAeqB,EAAE9B,KAAK,CACtBtB,EAASoD,EAAE7B,MAAM,CACjB6B,EAAExB,UAAY,QACdwB,EAAE2C,OAAOwC,KACV,CAAA0F,EAGWlO,EAAG,QAASqD,EAAE2C,OAAOmI,UAAU,CAAAC,EAC5BpO,EAAG,QAASqD,EAAE2C,OAAOqI,WAAW,CAAAC,EAEpCtO,EAAG,QAASqD,EAAE2C,OAAOyC,YAAY,CAAA8F,EAC9BlL,EAAExB,SAAQ2M,EAOTxO,EAAG,QAASqD,EAAE2C,OAAOyI,WAAW,CAAAC,EAMnC1O,EAAG,QAASqD,EAAE2C,OAAO2I,WAAW,CAAAC,EAEjC5O,EAAG,QAASqD,EAAE2C,OAAO6I,eAAe,CAAAC,EAGtC1M,GAAY,CAAA2M,EAEP1L,EAAExB,SAAQmN,EACJ,GAAGjM,KAAKC,IAAI,EAAGoJ,GAAiB,CAAC3J,OAAO,CAAG,GAAG,IAAIwM,EAWvDjP,EAAG,QAASqD,EAAE2C,OAAOkJ,WAAW,CAAAC,EAEpCnP,EACL,QACAqD,EAAE2C,OAAOC,IACT5C,EAAE2C,OAAOO,KACTlE,GAAS,EAAI,GAAK,QAClBA,GAAS,EAAI,GAAKgB,EAAE2C,OAAOQ,YAC5B,CAAA4I,EACS/L,EAAExB,UAAYQ,GAAS,EAAI,EAACgN,EAO/BrP,EACL,QACAqD,EAAE2C,OAAOC,IACT5C,EAAE2C,OAAOkC,KACT7F,GAAS,EAAID,GAAY,EAAI,QAC7BC,GAAS,EAAID,GAAY,EAAIiB,EAAE2C,OAAOQ,YACvC,CAAA8I,EACSjM,EAAExB,UAAYQ,GAAS,EAAID,GAAY,CAAA,OAAA6L,IAAA5H,EAAAK,GAAAX,EAAA2G,EAAArG,EAAAK,EAAAuH,EAAA,CAAAC,IAAA7H,EAAAM,GAAAZ,EAAA6G,EAAAvG,EAAAM,EAAAuH,EAAA,CAAAE,IAAA/H,EAAAyB,GAAA/B,EAAA8G,EAAAxG,EAAAyB,EAAAsG,EAAA,CAAAE,IAAAjI,EAAA6D,GAAAnE,EAAA+G,EAAAzG,EAAA6D,EAAAoE,EAAA,CAAAC,IAAAlI,EAAA1D,IAAAmK,EAAAjL,SAAAwE,EAAA1D,EAAA4L,GAAAC,IAAAnI,EAAAyF,GAAA/F,EAAAiH,EAAA3G,EAAAyF,EAAA0C,EAAA,CAAAE,IAAArI,EAAA0F,GAAAhG,EAAAuH,EAAAjH,EAAA0F,EAAA2C,EAAA,CAAAE,IAAAvI,EAAA2F,GAAAjG,EAAAwH,EAAAlH,EAAA2F,EAAA4C,EAAA,CAAAE,IAAAzI,EAAA4F,GAAA9E,EAAAoG,EAAA,MAAAlH,EAAA4F,EAAA6C,EAAA,CAAAC,IAAA1I,EAAA6F,IAAAqB,EAAA1L,SAAAwE,EAAA6F,EAAA6C,GAAAC,IAAA3I,EAAAkJ,GAAAC,EAAAjC,EAAA,QAAAlH,EAAAkJ,EAAAP,EAAA,CAAAC,IAAA5I,EAAAoJ,GAAA1J,EAAAyH,EAAAnH,EAAAoJ,EAAAR,EAAA,CAAAE,IAAA9I,EAAAqJ,GAAA3J,EAAA6H,EAAAvH,EAAAqJ,EAAAP,EAAA,CAAAC,IAAA/I,EAAAsJ,IAAA/B,EAAA/L,SAAAwE,EAAAsJ,EAAAP,GAAAC,IAAAhJ,EAAAuJ,GAAA7J,EAAA8H,EAAAxH,EAAAuJ,EAAAP,EAAA,CAAAC,IAAAjJ,EAAAwJ,IAAAhC,EAAAhM,SAAAwE,EAAAwJ,EAAAP,GAAAjJ,GAAA,CAAAK,EAAAE,IAAAA,GAAAD,EAAAC,IAAAA,GAAAkB,EAAAlB,IAAAA,GAAAsD,EAAAtD,IAAAA,GAAAjE,EAAAiE,IAAAA,GAAAkF,EAAAlF,IAAAA,GAAAmF,EAAAnF,IAAAA,GAAAoF,EAAApF,IAAAA,GAAAqF,EAAArF,IAAAA,GAAAsF,EAAAtF,IAAAA,GAAA2I,EAAA3I,IAAAA,GAAA6I,EAAA7I,IAAAA,GAAA8I,EAAA9I,IAAAA,GAAA+I,EAAA/I,IAAAA,GAAAgJ,EAAAhJ,IAAAA,GAAAiJ,EAAAjJ,IAAAA,GAAA,CAAA,CAAAd,MAAAgH,EAAA1H,MAtD1CxB,GAAU,CAAA,CAAAkC,MAAAyH,EAAAnI,MAkBVgH,GAAiB,CAAA,CAAAM,GAAA,CAAA,EAkDvBoD,EAAyCzM,GACpDgC,EACGzE,EAAM,CAAA,IAAC2I,UAAQ,CAAA,OAAAlE,EAAGlC,EAAuBE,EAA2B,EAAA,IAAAkC,UAAA,CAAA,MAAA,CAAAF,EAClE5E,EAAK,CAAA,IAAC6E,MAAI,CAAA,OAAEjC,EAAE0M,OAAS,UAAQ,IAAAxK,UAAA,CAAA,OAAAF,EAC7B8E,EAAsB9G,EAA0B,EAAA,CAAA,CAAAgC,EAElD5E,EAAK,CAAA,IAAC6E,MAAI,CAAA,OAAEjC,EAAE0M,OAAS,SAAO,IAAAxK,UAAA,CAAA,OAAAF,EAC5B8G,EAAqB9I,EAAyB,EAAA,CAAA,CAAA,EAAA,CAAA,CAIrD2M,EAAA,CAAA,QAAA,UAAA,QAAA,CAAA"}
1
+ {"version":3,"file":"pagination.js","names":["Select","cn","getColor","ChevronLeft","ChevronRight","Component","createEffect","createMemo","createSignal","For","Match","mergeProps","Show","Switch","PaginationDefaultProps","PaginationFullyProps","PaginationProps","PaginationSimpleProps","DEFAULT_PROPS","defaultCurrent","defaultPageSize","total","align","const","size","color","hideOnSinglePage","showLessItems","showQuickJumper","showTitle","disabled","pageSizeOptions","totalBoundaryShowSizeChanger","buildSizeClass","buildAlignClass","mapSizeToSelect","buildPageItems","totalPages","current","sibling","Array","from","length","_","i","items","push","leftBound","Math","max","rightBound","min","PaginationDefault","props","p","internalCurrent","setInternalCurrent","internalPageSize","setInternalPageSize","jumpValue","setJumpValue","pageSize","ceil","showSizeChanger","shouldHide","changePage","page","clamped","onChange","changePageSize","newTotal","newCurrent","onShowSizeChange","pageItems","handleJump","val","parseInt","isNaN","range","start","end","pageSizeSelectOpts","map","opt","label","value","_$createComponent","when","children","_el$","_tmpl$5","_$insert","showTotal","_el$2","_tmpl$","_$effect","_$className","class","btn","_el$8","_tmpl$6","$$click","_p$","_v$6","prev","btnDisabled","_v$7","e","t","undefined","itemRender","each","item","_el$9","_tmpl$7","jump","_$setAttribute","_v$8","ellipsis","_v$9","pageBtn","_el$0","_tmpl$8","_v$0","itemActive","_v$1","_v$10","a","_el$1","_tmpl$9","_v$11","next","_v$12","_el$3","_tmpl$2","options","placement","root","sizeChanger","_el$4","_tmpl$4","_el$5","firstChild","_el$6","nextSibling","$$keydown","key","currentTarget","blur","$$input","_$memo","goButton","fallback","_el$7","_tmpl$3","_v$","jumper","_v$2","jumperLabel","_v$3","jumperInput","_v$4","_v$5","o","PaginationSimple","_el$10","_tmpl$0","_el$11","_el$12","_el$13","_el$14","_el$15","_el$16","addEventListener","v","target","HTMLInputElement","select","_v$13","_v$14","_v$15","_v$16","simplePager","_v$17","simpleInput","_v$18","_v$19","_v$20","slash","_v$21","_v$22","n","s","h","r","d","PaginationFully","modernPageInput","setModernPageInput","String","syncPageInput","commitPageInput","num","_el$17","_tmpl$1","_el$18","_el$19","_el$20","_el$21","_el$22","_el$23","_el$26","_el$24","_el$27","_el$25","_el$28","_el$29","_el$30","_el$31","_el$33","_el$32","_el$34","_el$35","Number","_el$36","_tmpl$10","_v$23","_v$24","fullyLeft","_v$25","fullyLabel","_v$26","_v$27","_v$28","fullyRange","_v$29","fullyRight","_v$30","fullyPageInput","_v$31","_v$32","_v$33","_v$34","fullyPages","_v$35","_v$36","_v$37","_v$38","l","_$setStyleProperty","u","c","w","m","f","Pagination","mode","_$delegateEvents"],"sources":["../../../src/components/pagination/pagination.tsx"],"sourcesContent":["import { Select } from '@/components/select';\r\nimport { cn } from '@/utils/cn';\r\nimport { getColor } from '@/utils/helper';\r\nimport ChevronLeft from 'lucide-solid/icons/chevron-left';\r\nimport ChevronRight from 'lucide-solid/icons/chevron-right';\r\nimport {\r\n Component,\r\n createEffect,\r\n createMemo,\r\n createSignal,\r\n For,\r\n Match,\r\n mergeProps,\r\n Show,\r\n Switch,\r\n} from 'solid-js';\r\nimport type {\r\n PaginationDefaultProps,\r\n PaginationFullyProps,\r\n PaginationProps,\r\n PaginationSimpleProps,\r\n} from './pagination.types';\r\n\r\nconst DEFAULT_PROPS = {\r\n defaultCurrent: 1,\r\n defaultPageSize: 10,\r\n total: 0,\r\n align: 'start' as const,\r\n size: 'md' as const,\r\n color: 'neutral' as const,\r\n hideOnSinglePage: false,\r\n showLessItems: false,\r\n showQuickJumper: false,\r\n showTitle: true,\r\n disabled: false,\r\n pageSizeOptions: [10, 20, 50, 100],\r\n totalBoundaryShowSizeChanger: 50,\r\n};\r\n\r\n// ─── Shared helpers ─────────────────────────────────────────────────────────\r\n\r\nfunction buildSizeClass(size: string) {\r\n switch (size) {\r\n case 'xs':\r\n return 'pag26';\r\n case 'sm':\r\n return 'pag27';\r\n case 'lg':\r\n return 'pag29';\r\n case 'xl':\r\n return 'pag30';\r\n default:\r\n return 'pag28';\r\n }\r\n}\r\n\r\nfunction buildAlignClass(align: string) {\r\n switch (align) {\r\n case 'center':\r\n return 'justify-center';\r\n case 'end':\r\n return 'justify-end';\r\n default:\r\n return 'justify-start';\r\n }\r\n}\r\n\r\nfunction mapSizeToSelect(size: string): 'sm' | 'md' | 'lg' {\r\n if (size === 'lg' || size === 'xl') return 'lg';\r\n if (size === 'md') return 'md';\r\n return 'sm';\r\n}\r\n\r\n// Build page list with ellipsis algorithm\r\nfunction buildPageItems(totalPages: number, current: number, showLessItems: boolean) {\r\n const sibling = showLessItems ? 1 : 2;\r\n\r\n if (totalPages <= (showLessItems ? 7 : 9)) {\r\n return Array.from({ length: totalPages }, (_, i) => i + 1);\r\n }\r\n\r\n const items: (number | 'prev-ellipsis' | 'next-ellipsis')[] = [];\r\n\r\n items.push(1);\r\n\r\n const leftBound = Math.max(2, current - sibling);\r\n const rightBound = Math.min(totalPages - 1, current + sibling);\r\n\r\n if (leftBound > 2) items.push('prev-ellipsis');\r\n for (let i = leftBound; i <= rightBound; i++) items.push(i);\r\n if (rightBound < totalPages - 1) items.push('next-ellipsis');\r\n\r\n items.push(totalPages);\r\n\r\n return items;\r\n}\r\n\r\n// ─── Mode: default ──────────────────────────────────────────────────────────\r\n\r\nconst PaginationDefault: Component<PaginationDefaultProps> = props => {\r\n const p = mergeProps(DEFAULT_PROPS, props);\r\n\r\n const [internalCurrent, setInternalCurrent] = createSignal(p.defaultCurrent);\r\n const [internalPageSize, setInternalPageSize] = createSignal(p.defaultPageSize);\r\n const [jumpValue, setJumpValue] = createSignal('');\r\n\r\n const current = createMemo(() => p.current ?? internalCurrent());\r\n const pageSize = createMemo(() => p.pageSize ?? internalPageSize());\r\n const totalPages = createMemo(() => Math.max(1, Math.ceil((p.total ?? 0) / pageSize())));\r\n\r\n const showSizeChanger = createMemo(() => {\r\n if (typeof p.showSizeChanger === 'boolean') return p.showSizeChanger;\r\n if (typeof p.showSizeChanger === 'object') return true;\r\n return (p.total ?? 0) > (p.totalBoundaryShowSizeChanger ?? 50);\r\n });\r\n\r\n const shouldHide = createMemo(() => p.hideOnSinglePage && totalPages() <= 1);\r\n\r\n const changePage = (page: number) => {\r\n const clamped = Math.min(Math.max(1, page), totalPages());\r\n if (clamped === current()) return;\r\n setInternalCurrent(clamped);\r\n p.onChange?.(clamped, pageSize());\r\n };\r\n\r\n const changePageSize = (size: number) => {\r\n const newTotal = Math.max(1, Math.ceil((p.total ?? 0) / size));\r\n const newCurrent = Math.min(current(), newTotal);\r\n setInternalPageSize(size);\r\n setInternalCurrent(newCurrent);\r\n p.onShowSizeChange?.(newCurrent, size);\r\n p.onChange?.(newCurrent, size);\r\n };\r\n\r\n const pageItems = createMemo(() => buildPageItems(totalPages(), current(), p.showLessItems));\r\n\r\n const handleJump = () => {\r\n const val = parseInt(jumpValue(), 10);\r\n if (!isNaN(val)) {\r\n changePage(val);\r\n setJumpValue('');\r\n }\r\n };\r\n\r\n const range = createMemo<[number, number]>(() => {\r\n const start = (current() - 1) * pageSize() + 1;\r\n const end = Math.min(current() * pageSize(), p.total ?? 0);\r\n return [start, end];\r\n });\r\n\r\n const pageSizeSelectOpts = createMemo(() =>\r\n p.pageSizeOptions.map(opt => ({ label: `${opt} / page`, value: opt as number })),\r\n );\r\n\r\n return (\r\n <Show when={!shouldHide()}>\r\n <div\r\n class={cn(\r\n 'pag01 pag02',\r\n buildSizeClass(p.size),\r\n buildAlignClass(p.align),\r\n getColor(p.color),\r\n p.disabled && 'pag05',\r\n p.class?.root,\r\n )}\r\n >\r\n {/* Show total */}\r\n <Show when={p.showTotal}>\r\n <span class={cn('pag13', p.class?.total)}>{p.showTotal!(p.total ?? 0, range())}</span>\r\n </Show>\r\n\r\n {/* Prev button */}\r\n {(() => {\r\n const btn = (\r\n <button\r\n class={cn(\r\n 'pag06 pag08',\r\n p.class?.btn,\r\n p.class?.prev,\r\n current() <= 1 && 'pag07',\r\n current() <= 1 && p.class?.btnDisabled,\r\n )}\r\n disabled={p.disabled || current() <= 1}\r\n onClick={() => changePage(current() - 1)}\r\n title=\"Previous Page\"\r\n >\r\n <ChevronLeft size={16} />\r\n </button>\r\n );\r\n return p.itemRender ? p.itemRender(current() - 1, 'prev', btn) : btn;\r\n })()}\r\n\r\n {/* Page items */}\r\n <For each={pageItems()}>\r\n {item => {\r\n if (item === 'prev-ellipsis' || item === 'next-ellipsis') {\r\n return (\r\n <button\r\n class={cn('pag06 pag10', p.class?.btn, p.class?.ellipsis)}\r\n disabled={p.disabled}\r\n onClick={() => {\r\n const jump =\r\n item === 'prev-ellipsis'\r\n ? Math.max(1, current() - (p.showLessItems ? 3 : 5))\r\n : Math.min(totalPages(), current() + (p.showLessItems ? 3 : 5));\r\n changePage(jump);\r\n }}\r\n title={item === 'prev-ellipsis' ? 'Previous 5 pages' : 'Next 5 pages'}\r\n >\r\n •••\r\n </button>\r\n );\r\n }\r\n const pageBtn = (\r\n <button\r\n class={cn(\r\n 'pag06',\r\n item === current() && 'pag11',\r\n item === current() && p.class?.itemActive,\r\n p.class?.btn,\r\n )}\r\n disabled={p.disabled}\r\n onClick={() => changePage(item)}\r\n title={p.showTitle ? `Page ${item}` : undefined}\r\n >\r\n {item}\r\n </button>\r\n );\r\n return p.itemRender ? p.itemRender(item, 'page', pageBtn) : pageBtn;\r\n }}\r\n </For>\r\n\r\n {/* Next button */}\r\n {(() => {\r\n const btn = (\r\n <button\r\n class={cn(\r\n 'pag06 pag09',\r\n current() >= totalPages() && 'pag07',\r\n current() >= totalPages() && p.class?.btnDisabled,\r\n p.class?.btn,\r\n p.class?.next,\r\n )}\r\n disabled={p.disabled || current() >= totalPages()}\r\n onClick={() => changePage(current() + 1)}\r\n title=\"Next Page\"\r\n >\r\n <ChevronRight size={16} />\r\n </button>\r\n );\r\n return p.itemRender ? p.itemRender(current() + 1, 'next', btn) : btn;\r\n })()}\r\n\r\n {/* Size changer */}\r\n <Show when={showSizeChanger()}>\r\n <div class=\"w-fit\">\r\n <Select\r\n options={pageSizeSelectOpts()}\r\n value={pageSize()}\r\n onChange={val => changePageSize(val as number)}\r\n disabled={p.disabled}\r\n size={mapSizeToSelect(p.size)}\r\n color={p.color}\r\n placement=\"top\"\r\n class={{ root: p.class?.sizeChanger }}\r\n />\r\n </div>\r\n </Show>\r\n\r\n {/* Quick jumper */}\r\n <Show when={p.showQuickJumper}>\r\n <span\r\n class={cn(\r\n 'pag14',\r\n p.align === 'end' && 'order-first mr-auto',\r\n p.align === 'start' && 'ml-auto',\r\n p.class?.jumper,\r\n )}\r\n >\r\n <span class={cn('pag15', p.class?.jumperLabel)}>Go to</span>\r\n <input\r\n class={cn('pag16', p.class?.jumperInput)}\r\n type=\"number\"\r\n min={1}\r\n max={totalPages()}\r\n value={jumpValue()}\r\n disabled={p.disabled}\r\n onInput={e => setJumpValue(e.currentTarget.value)}\r\n onKeyDown={e => {\r\n if (e.key === 'Enter') {\r\n handleJump();\r\n e.currentTarget.blur();\r\n }\r\n }}\r\n />\r\n <Show\r\n when={typeof p.showQuickJumper === 'object' && p.showQuickJumper.goButton}\r\n fallback={null}\r\n >\r\n <span onClick={() => handleJump()} class=\"cursor-pointer\">\r\n {(p.showQuickJumper as { goButton: any }).goButton}\r\n </span>\r\n </Show>\r\n </span>\r\n </Show>\r\n </div>\r\n </Show>\r\n );\r\n};\r\n\r\n// ─── Mode: simple ────────────────────────────────────────────────────────────\r\n\r\nconst PaginationSimple: Component<PaginationSimpleProps> = props => {\r\n const p = mergeProps(DEFAULT_PROPS, props);\r\n\r\n const [internalCurrent, setInternalCurrent] = createSignal(p.defaultCurrent);\r\n const [internalPageSize, setInternalPageSize] = createSignal(p.defaultPageSize);\r\n\r\n const current = createMemo(() => p.current ?? internalCurrent());\r\n const pageSize = createMemo(() => p.pageSize ?? internalPageSize());\r\n const totalPages = createMemo(() => Math.max(1, Math.ceil((p.total ?? 0) / pageSize())));\r\n const shouldHide = createMemo(() => p.hideOnSinglePage && totalPages() <= 1);\r\n\r\n const changePage = (page: number) => {\r\n const clamped = Math.min(Math.max(1, page), totalPages());\r\n if (clamped === current()) return;\r\n setInternalCurrent(clamped);\r\n p.onChange?.(clamped, pageSize());\r\n };\r\n\r\n return (\r\n <Show when={!shouldHide()}>\r\n <div\r\n class={cn(\r\n 'pag01 pag03',\r\n buildSizeClass(p.size),\r\n buildAlignClass(p.align),\r\n getColor(p.color),\r\n p.disabled && 'pag05',\r\n p.class?.root,\r\n )}\r\n >\r\n <button\r\n class={cn(\r\n 'pag06 pag08',\r\n p.class?.btn,\r\n p.class?.prev,\r\n current() <= 1 && 'pag07',\r\n current() <= 1 && p.class?.btnDisabled,\r\n )}\r\n disabled={p.disabled || current() <= 1}\r\n onClick={() => changePage(current() - 1)}\r\n title=\"Previous\"\r\n >\r\n <ChevronLeft size={16} />\r\n </button>\r\n <span class={cn('pag17', p.class?.simplePager)}>\r\n <input\r\n class={cn('pag18', p.class?.simpleInput)}\r\n type=\"number\"\r\n min={1}\r\n max={totalPages()}\r\n value={current()}\r\n disabled={p.disabled}\r\n onFocus={e => e.currentTarget.select()}\r\n onKeyDown={e => {\r\n if (e.key === 'Enter') {\r\n const v = parseInt((e.target as HTMLInputElement).value, 10);\r\n if (!isNaN(v)) changePage(v);\r\n }\r\n }}\r\n onBlur={e => {\r\n const v = parseInt(e.currentTarget.value, 10);\r\n if (!isNaN(v)) changePage(v);\r\n }}\r\n />\r\n <span class={cn('pag19', p.class?.slash)}>/</span>\r\n <span>{totalPages()}</span>\r\n </span>\r\n <button\r\n class={cn(\r\n 'pag06 pag09',\r\n p.class?.btn,\r\n p.class?.next,\r\n current() >= totalPages() && 'pag07',\r\n current() >= totalPages() && p.class?.btnDisabled,\r\n )}\r\n disabled={p.disabled || current() >= totalPages()}\r\n onClick={() => changePage(current() + 1)}\r\n title=\"Next\"\r\n >\r\n <ChevronRight size={16} />\r\n </button>\r\n </div>\r\n </Show>\r\n );\r\n};\r\n\r\n// ─── Mode: fully ─────────────────────────────────────────────────────────────\r\n\r\nconst PaginationFully: Component<PaginationFullyProps> = props => {\r\n const p = mergeProps(DEFAULT_PROPS, props);\r\n\r\n const [internalCurrent, setInternalCurrent] = createSignal(p.defaultCurrent);\r\n const [internalPageSize, setInternalPageSize] = createSignal(p.defaultPageSize);\r\n const [modernPageInput, setModernPageInput] = createSignal(String(p.defaultCurrent ?? 1));\r\n\r\n const current = createMemo(() => p.current ?? internalCurrent());\r\n const pageSize = createMemo(() => p.pageSize ?? internalPageSize());\r\n const totalPages = createMemo(() => Math.max(1, Math.ceil((p.total ?? 0) / pageSize())));\r\n const shouldHide = createMemo(() => p.hideOnSinglePage && totalPages() <= 1);\r\n\r\n createEffect(function syncPageInput() {\r\n setModernPageInput(String(current()));\r\n });\r\n\r\n const changePage = (page: number) => {\r\n const clamped = Math.min(Math.max(1, page), totalPages());\r\n if (clamped === current()) return;\r\n setInternalCurrent(clamped);\r\n p.onChange?.(clamped, pageSize());\r\n };\r\n\r\n const changePageSize = (size: number) => {\r\n const newTotal = Math.max(1, Math.ceil((p.total ?? 0) / size));\r\n const newCurrent = Math.min(current(), newTotal);\r\n setInternalPageSize(size);\r\n setInternalCurrent(newCurrent);\r\n p.onShowSizeChange?.(newCurrent, size);\r\n p.onChange?.(newCurrent, size);\r\n };\r\n\r\n const range = createMemo<[number, number]>(() => {\r\n const start = (current() - 1) * pageSize() + 1;\r\n const end = Math.min(current() * pageSize(), p.total ?? 0);\r\n return [start, end];\r\n });\r\n\r\n const commitPageInput = (value: string) => {\r\n const num = parseInt(value, 10);\r\n const clamped = !isNaN(num) ? Math.min(Math.max(1, num), totalPages()) : current();\r\n changePage(clamped);\r\n setModernPageInput(String(clamped));\r\n };\r\n\r\n return (\r\n <Show when={!shouldHide()}>\r\n <div\r\n class={cn(\r\n 'pag01 pag04',\r\n buildSizeClass(p.size),\r\n getColor(p.color),\r\n p.disabled && 'pag05',\r\n p.class?.root,\r\n )}\r\n >\r\n {/* Left: items-per-page dropdown + range */}\r\n <div class={cn('pag20', p.class?.fullyLeft)}>\r\n <span class={cn('pag22', p.class?.fullyLabel)}>Items per page:</span>\r\n <select\r\n class={cn('pag12', p.class?.sizeChanger)}\r\n disabled={p.disabled}\r\n value={pageSize()}\r\n onChange={e => changePageSize(Number(e.currentTarget.value))}\r\n >\r\n <For each={p.pageSizeOptions}>{opt => <option value={opt}>{opt}</option>}</For>\r\n </select>\r\n <div class=\"bg-c3/50 w-px self-stretch\"></div>\r\n <span class={cn('pag23', p.class?.fullyRange)}>\r\n {range()[0]}–{range()[1]} of {p.total ?? 0} items\r\n </span>\r\n </div>\r\n\r\n {/* Right: page input + prev/next buttons */}\r\n <div class={cn('pag21', p.class?.fullyRight)}>\r\n <input\r\n class={cn('pag25', p.class?.fullyPageInput)}\r\n type=\"number\"\r\n min={1}\r\n max={totalPages()}\r\n value={modernPageInput()}\r\n disabled={p.disabled}\r\n style={{ width: `${Math.max(2, modernPageInput().length) + 0.5}ch` }}\r\n onFocus={e => e.currentTarget.select()}\r\n onInput={e => setModernPageInput(e.currentTarget.value)}\r\n onBlur={e => commitPageInput(e.currentTarget.value)}\r\n onKeyDown={e => {\r\n if (e.key === 'Enter') {\r\n commitPageInput((e.currentTarget as HTMLInputElement).value);\r\n e.currentTarget.blur();\r\n }\r\n }}\r\n />\r\n <span class={cn('pag24', p.class?.fullyPages)}>of {totalPages()} pages</span>\r\n <button\r\n class={cn(\r\n 'pag06',\r\n p.class?.btn,\r\n p.class?.prev,\r\n current() <= 1 && 'pag07',\r\n current() <= 1 && p.class?.btnDisabled,\r\n )}\r\n disabled={p.disabled || current() <= 1}\r\n onClick={() => changePage(current() - 1)}\r\n title=\"Previous Page\"\r\n >\r\n <ChevronLeft size={16} />\r\n </button>\r\n <button\r\n class={cn(\r\n 'pag06',\r\n p.class?.btn,\r\n p.class?.next,\r\n current() >= totalPages() && 'pag07',\r\n current() >= totalPages() && p.class?.btnDisabled,\r\n )}\r\n disabled={p.disabled || current() >= totalPages()}\r\n onClick={() => changePage(current() + 1)}\r\n title=\"Next Page\"\r\n >\r\n <ChevronRight size={16} />\r\n </button>\r\n </div>\r\n </div>\r\n </Show>\r\n );\r\n};\r\n\r\n// ─── Public component ────────────────────────────────────────────────────────\r\n\r\nexport const Pagination: Component<PaginationProps> = p => {\r\n return (\r\n <Switch fallback={<PaginationDefault {...(p as PaginationDefaultProps)} />}>\r\n <Match when={p.mode === 'simple'}>\r\n <PaginationSimple {...(p as PaginationSimpleProps)} />\r\n </Match>\r\n <Match when={p.mode === 'fully'}>\r\n <PaginationFully {...(p as PaginationFullyProps)} />\r\n </Match>\r\n </Switch>\r\n );\r\n};\r\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"progress-bar.js","names":["render","createSignal","onCleanup","cn","getColor","ProgressBarOptions","BarProps","Required","instanceId","onDone","ProgressBarInner","props","progress","setProgress","opacity","setOpacity","rafId","startTime","INITIAL_SPEED","DECAY","MAX_PROGRESS","animate","timestamp","elapsed","speed","Math","pow","delta","prev","next","requestAnimationFrame","completeAndFade","cancelAnimationFrame","setTimeout","fadeOutDuration","completionHandlers","set","cancelProgressAnimation","delete","isRtl","direction","barStyle","width","height","transition","rounded","undefined","containerStyle","zIndex","position","const","left","right","_el$","_tmpl$","_el$2","firstChild","_$insert","_c$","_$memo","shimmer","_el$3","_tmpl$2","_$effect","_$className","_p$","_v$","_v$2","color","_v$3","e","_$style","t","a","Map","activeDisposers","containerEl","HTMLDivElement","ensureContainer","document","createElement","id","body","appendChild","disposeAll","dispose","values","clear","ProgressBarAPI","start","options","dismiss","DEFAULT_OPTIONS","progressBar","random","toString","slice","mergedOptions","slot","_$createComponent","_$mergeProps","remove","size","ids","keys","handler","get"],"sources":["../../../src/components/progress-bar/progress-bar.tsx"],"sourcesContent":["import { render } from 'solid-js/web';\nimport { createSignal, onCleanup } from 'solid-js';\nimport { cn } from '@/utils/cn';\nimport { getColor } from '@/utils/helper';\nimport type { ProgressBarOptions } from './progress-bar.types';\n\n// ─── Internal Bar Component ───────────────────────────────────────────────────\n\ninterface BarProps extends Required<ProgressBarOptions> {\n instanceId: string;\n onDone: () => void;\n}\n\nconst ProgressBarInner = (props: BarProps) => {\n const [progress, setProgress] = createSignal(0);\n const [opacity, setOpacity] = createSignal(1);\n\n let rafId: number;\n let startTime: number | null = null;\n\n // Tốc độ ban đầu (% mỗi giây), giảm dần theo hàm mũ\n const INITIAL_SPEED = 28;\n const DECAY = 0.88; // mỗi giây speed *= DECAY\n const MAX_PROGRESS = 99;\n\n const animate = (timestamp: number) => {\n if (startTime === null) startTime = timestamp;\n const elapsed = (timestamp - startTime) / 1000; // giây\n\n const speed = INITIAL_SPEED * Math.pow(DECAY, elapsed * 2.5);\n const delta = speed / 60; // per frame (60fps)\n\n setProgress(prev => {\n const next = prev + delta;\n return next >= MAX_PROGRESS ? MAX_PROGRESS : next;\n });\n\n if (progress() < MAX_PROGRESS) {\n rafId = requestAnimationFrame(animate);\n }\n };\n\n rafId = requestAnimationFrame(animate);\n\n // dismiss() gọi hàm này — jump lên 100% rồi fade out\n const completeAndFade = () => {\n cancelAnimationFrame(rafId);\n setProgress(100);\n setTimeout(() => {\n setOpacity(0);\n setTimeout(() => props.onDone(), props.fadeOutDuration);\n }, 80);\n };\n\n completionHandlers.set(props.instanceId, completeAndFade);\n\n onCleanup(function cancelProgressAnimation() {\n cancelAnimationFrame(rafId);\n completionHandlers.delete(props.instanceId);\n });\n\n const isRtl = () => props.direction === 'rightToLeft';\n\n const barStyle = () => ({\n width: `${progress()}%`,\n height: `${props.height}px`,\n transition: 'width 0.06s linear',\n 'border-radius': props.rounded ? (isRtl() ? '9999px 0 0 9999px' : '0 9999px 9999px 0') : '0',\n 'margin-left': isRtl() ? 'auto' : undefined,\n });\n\n const containerStyle = () => ({\n opacity: opacity(),\n transition: `opacity ${props.fadeOutDuration}ms ease`,\n 'z-index': props.zIndex,\n position: 'fixed' as const,\n [props.position === 'bottom' ? 'bottom' : 'top']: '0',\n left: '0',\n right: '0',\n 'pointer-events': 'none' as const,\n });\n\n return (\n <div style={containerStyle()}>\n <div\n class={cn('relative overflow-hidden', getColor(props.color), 'bg-(--color)')}\n style={barStyle()}\n >\n {props.shimmer && (\n <div\n class={cn(\n 'absolute inset-0',\n 'animate-[shimmer_1.2s_ease-in-out_infinite]',\n 'bg-linear-to-r from-transparent via-white/40 to-transparent',\n )}\n />\n )}\n </div>\n </div>\n );\n};\n\n// ─── Global state ─────────────────────────────────────────────────────────────\n\nconst completionHandlers = new Map<string, () => void>();\n\n// Track tất cả instances đang tồn tại (có thể nhiều hơn 1 trong khoảng thời gian ngắn)\nconst activeDisposers = new Map<string, () => void>();\n\nlet containerEl: HTMLDivElement | null = null;\n\nconst ensureContainer = () => {\n if (containerEl) return;\n containerEl = document.createElement('div');\n containerEl.id = 'sui-progress-bar-container';\n document.body.appendChild(containerEl);\n};\n\n// Xóa tất cả instances ngay lập tức (không animate)\nconst disposeAll = () => {\n for (const dispose of activeDisposers.values()) {\n dispose();\n }\n activeDisposers.clear();\n};\n\n// ─── Public API ───────────────────────────────────────────────────────────────\n\nexport interface ProgressBarAPI {\n start: (options?: ProgressBarOptions) => void;\n dismiss: () => void;\n}\n\nconst DEFAULT_OPTIONS: Required<ProgressBarOptions> = {\n color: 'primary',\n height: 3,\n shimmer: true,\n rounded: true,\n zIndex: 9999,\n fadeOutDuration: 300,\n position: 'top',\n direction: 'leftToRight',\n};\n\nconst progressBar: ProgressBarAPI = {\n start(options?: ProgressBarOptions) {\n ensureContainer();\n\n // Xóa tất cả instances cũ ngay lập tức\n disposeAll();\n\n const instanceId = Math.random().toString(36).slice(2);\n\n const mergedOptions: Required<ProgressBarOptions> = {\n ...DEFAULT_OPTIONS,\n ...options,\n };\n\n const slot = document.createElement('div');\n containerEl!.appendChild(slot);\n\n const dispose = render(\n () => (\n <ProgressBarInner\n {...mergedOptions}\n instanceId={instanceId}\n onDone={() => {\n dispose();\n slot.remove();\n activeDisposers.delete(instanceId);\n }}\n />\n ),\n slot,\n );\n\n activeDisposers.set(instanceId, () => {\n dispose();\n slot.remove();\n });\n },\n\n dismiss() {\n if (activeDisposers.size === 0) return;\n\n // Lấy tất cả instanceIds hiện tại\n const ids = [...activeDisposers.keys()];\n\n for (const id of ids) {\n const handler = completionHandlers.get(id);\n if (handler) {\n // Animate lên 100% rồi fade out\n activeDisposers.delete(id);\n handler();\n } else {\n // Fallback: xóa ngay\n const dispose = activeDisposers.get(id);\n activeDisposers.delete(id);\n dispose?.();\n }\n }\n },\n};\n\nexport { progressBar };\n"],"mappings":"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"}
1
+ {"version":3,"file":"progress-bar.js","names":["render","createSignal","onCleanup","cn","getColor","ProgressBarOptions","BarProps","Required","instanceId","onDone","ProgressBarInner","props","progress","setProgress","opacity","setOpacity","rafId","startTime","INITIAL_SPEED","DECAY","MAX_PROGRESS","animate","timestamp","elapsed","speed","Math","pow","delta","prev","next","requestAnimationFrame","completeAndFade","cancelAnimationFrame","setTimeout","fadeOutDuration","completionHandlers","set","cancelProgressAnimation","delete","isRtl","direction","barStyle","width","height","transition","rounded","undefined","containerStyle","zIndex","position","const","left","right","_el$","_tmpl$","_el$2","firstChild","_$insert","_c$","_$memo","shimmer","_el$3","_tmpl$2","_$effect","_$className","_p$","_v$","_v$2","color","_v$3","e","_$style","t","a","Map","activeDisposers","containerEl","HTMLDivElement","ensureContainer","document","createElement","id","body","appendChild","disposeAll","dispose","values","clear","ProgressBarAPI","start","options","dismiss","DEFAULT_OPTIONS","progressBar","random","toString","slice","mergedOptions","slot","_$createComponent","_$mergeProps","remove","size","ids","keys","handler","get"],"sources":["../../../src/components/progress-bar/progress-bar.tsx"],"sourcesContent":["import { render } from 'solid-js/web';\r\nimport { createSignal, onCleanup } from 'solid-js';\r\nimport { cn } from '@/utils/cn';\r\nimport { getColor } from '@/utils/helper';\r\nimport type { ProgressBarOptions } from './progress-bar.types';\r\n\r\n// ─── Internal Bar Component ───────────────────────────────────────────────────\r\n\r\ninterface BarProps extends Required<ProgressBarOptions> {\r\n instanceId: string;\r\n onDone: () => void;\r\n}\r\n\r\nconst ProgressBarInner = (props: BarProps) => {\r\n const [progress, setProgress] = createSignal(0);\r\n const [opacity, setOpacity] = createSignal(1);\r\n\r\n let rafId: number;\r\n let startTime: number | null = null;\r\n\r\n // Tốc độ ban đầu (% mỗi giây), giảm dần theo hàm mũ\r\n const INITIAL_SPEED = 28;\r\n const DECAY = 0.88; // mỗi giây speed *= DECAY\r\n const MAX_PROGRESS = 99;\r\n\r\n const animate = (timestamp: number) => {\r\n if (startTime === null) startTime = timestamp;\r\n const elapsed = (timestamp - startTime) / 1000; // giây\r\n\r\n const speed = INITIAL_SPEED * Math.pow(DECAY, elapsed * 2.5);\r\n const delta = speed / 60; // per frame (60fps)\r\n\r\n setProgress(prev => {\r\n const next = prev + delta;\r\n return next >= MAX_PROGRESS ? MAX_PROGRESS : next;\r\n });\r\n\r\n if (progress() < MAX_PROGRESS) {\r\n rafId = requestAnimationFrame(animate);\r\n }\r\n };\r\n\r\n rafId = requestAnimationFrame(animate);\r\n\r\n // dismiss() gọi hàm này — jump lên 100% rồi fade out\r\n const completeAndFade = () => {\r\n cancelAnimationFrame(rafId);\r\n setProgress(100);\r\n setTimeout(() => {\r\n setOpacity(0);\r\n setTimeout(() => props.onDone(), props.fadeOutDuration);\r\n }, 80);\r\n };\r\n\r\n completionHandlers.set(props.instanceId, completeAndFade);\r\n\r\n onCleanup(function cancelProgressAnimation() {\r\n cancelAnimationFrame(rafId);\r\n completionHandlers.delete(props.instanceId);\r\n });\r\n\r\n const isRtl = () => props.direction === 'rightToLeft';\r\n\r\n const barStyle = () => ({\r\n width: `${progress()}%`,\r\n height: `${props.height}px`,\r\n transition: 'width 0.06s linear',\r\n 'border-radius': props.rounded ? (isRtl() ? '9999px 0 0 9999px' : '0 9999px 9999px 0') : '0',\r\n 'margin-left': isRtl() ? 'auto' : undefined,\r\n });\r\n\r\n const containerStyle = () => ({\r\n opacity: opacity(),\r\n transition: `opacity ${props.fadeOutDuration}ms ease`,\r\n 'z-index': props.zIndex,\r\n position: 'fixed' as const,\r\n [props.position === 'bottom' ? 'bottom' : 'top']: '0',\r\n left: '0',\r\n right: '0',\r\n 'pointer-events': 'none' as const,\r\n });\r\n\r\n return (\r\n <div style={containerStyle()}>\r\n <div\r\n class={cn('relative overflow-hidden', getColor(props.color), 'bg-(--color)')}\r\n style={barStyle()}\r\n >\r\n {props.shimmer && (\r\n <div\r\n class={cn(\r\n 'absolute inset-0',\r\n 'animate-[shimmer_1.2s_ease-in-out_infinite]',\r\n 'bg-linear-to-r from-transparent via-white/40 to-transparent',\r\n )}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\n// ─── Global state ─────────────────────────────────────────────────────────────\r\n\r\nconst completionHandlers = new Map<string, () => void>();\r\n\r\n// Track tất cả instances đang tồn tại (có thể nhiều hơn 1 trong khoảng thời gian ngắn)\r\nconst activeDisposers = new Map<string, () => void>();\r\n\r\nlet containerEl: HTMLDivElement | null = null;\r\n\r\nconst ensureContainer = () => {\r\n if (containerEl) return;\r\n containerEl = document.createElement('div');\r\n containerEl.id = 'sui-progress-bar-container';\r\n document.body.appendChild(containerEl);\r\n};\r\n\r\n// Xóa tất cả instances ngay lập tức (không animate)\r\nconst disposeAll = () => {\r\n for (const dispose of activeDisposers.values()) {\r\n dispose();\r\n }\r\n activeDisposers.clear();\r\n};\r\n\r\n// ─── Public API ───────────────────────────────────────────────────────────────\r\n\r\nexport interface ProgressBarAPI {\r\n start: (options?: ProgressBarOptions) => void;\r\n dismiss: () => void;\r\n}\r\n\r\nconst DEFAULT_OPTIONS: Required<ProgressBarOptions> = {\r\n color: 'primary',\r\n height: 3,\r\n shimmer: true,\r\n rounded: true,\r\n zIndex: 9999,\r\n fadeOutDuration: 300,\r\n position: 'top',\r\n direction: 'leftToRight',\r\n};\r\n\r\nconst progressBar: ProgressBarAPI = {\r\n start(options?: ProgressBarOptions) {\r\n ensureContainer();\r\n\r\n // Xóa tất cả instances cũ ngay lập tức\r\n disposeAll();\r\n\r\n const instanceId = Math.random().toString(36).slice(2);\r\n\r\n const mergedOptions: Required<ProgressBarOptions> = {\r\n ...DEFAULT_OPTIONS,\r\n ...options,\r\n };\r\n\r\n const slot = document.createElement('div');\r\n containerEl!.appendChild(slot);\r\n\r\n const dispose = render(\r\n () => (\r\n <ProgressBarInner\r\n {...mergedOptions}\r\n instanceId={instanceId}\r\n onDone={() => {\r\n dispose();\r\n slot.remove();\r\n activeDisposers.delete(instanceId);\r\n }}\r\n />\r\n ),\r\n slot,\r\n );\r\n\r\n activeDisposers.set(instanceId, () => {\r\n dispose();\r\n slot.remove();\r\n });\r\n },\r\n\r\n dismiss() {\r\n if (activeDisposers.size === 0) return;\r\n\r\n // Lấy tất cả instanceIds hiện tại\r\n const ids = [...activeDisposers.keys()];\r\n\r\n for (const id of ids) {\r\n const handler = completionHandlers.get(id);\r\n if (handler) {\r\n // Animate lên 100% rồi fade out\r\n activeDisposers.delete(id);\r\n handler();\r\n } else {\r\n // Fallback: xóa ngay\r\n const dispose = activeDisposers.get(id);\r\n activeDisposers.delete(id);\r\n dispose?.();\r\n }\r\n }\r\n },\r\n};\r\n\r\nexport { progressBar };\r\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"qr-code.js","names":["cn","getColor","QRCode","RefreshCw","CheckCircle","Loader","Component","createEffect","createUniqueId","mergeProps","onCleanup","Show","QrCodeProps","DEFAULT_PROPS","size","color","bgColor","errorLevel","const","status","expiredText","accentColor","drawQr","canvas","HTMLCanvasElement","value","opts","Promise","toCanvas","width","margin","dark","light","errorCorrectionLevel","drawLogo","logo","NonNullable","ctx","getContext","img","Image","crossOrigin","onload","onLogoLoad","logoW","logoH","height","pad","padding","radius","borderRadius","bg","background","bgW","bgH","x","y","beginPath","moveTo","lineTo","quadraticCurveTo","closePath","fillStyle","fill","drawImage","src","QrCode","props","p","id","canvasRef","renderQrCode","then","onQrDrawn","_el$","_tmpl$3","_el$2","firstChild","_$setAttribute","_ref$","_$use","_$insert","_$createComponent","when","children","_el$3","_tmpl$","class","overlayIcon","_$effect","_$className","overlay","_el$4","_tmpl$2","_el$5","_el$6","nextSibling","_$addEventListener","onRefresh","_p$","_v$","_v$2","_v$3","overlayText","e","t","a","undefined","_el$7","_v$4","root","_v$5","_v$6","_v$7","_v$8","_v$9","_v$0","_$setStyleProperty","o","i","n","s","_$delegateEvents"],"sources":["../../../src/components/qr-code/qr-code.tsx"],"sourcesContent":["import { cn } from '@utils/cn';\nimport { getColor } from '@utils/helper';\nimport QRCode from 'qrcode';\nimport RefreshCw from 'lucide-solid/icons/refresh-cw';\nimport CheckCircle from 'lucide-solid/icons/check-circle';\nimport Loader from 'lucide-solid/icons/loader';\nimport { Component, createEffect, createUniqueId, mergeProps, onCleanup, Show } from 'solid-js';\nimport type { QrCodeProps } from './qr-code.types';\n\nconst DEFAULT_PROPS = {\n size: 160,\n color: '#000000',\n bgColor: '#ffffff',\n errorLevel: 'M' as const,\n status: 'active' as const,\n expiredText: 'QR code expired',\n accentColor: 'primary' as const,\n};\n\nasync function drawQr(\n canvas: HTMLCanvasElement,\n value: string,\n opts: {\n size: number;\n color: string;\n bgColor: string;\n errorLevel: 'L' | 'M' | 'Q' | 'H';\n },\n): Promise<void> {\n await QRCode.toCanvas(canvas, value || ' ', {\n width: opts.size,\n margin: 2,\n color: {\n dark: opts.color,\n light: opts.bgColor,\n },\n errorCorrectionLevel: opts.errorLevel,\n });\n}\n\nfunction drawLogo(\n canvas: HTMLCanvasElement,\n logo: NonNullable<QrCodeProps['logo']>,\n size: number,\n): void {\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const img = new Image();\n img.crossOrigin = 'anonymous';\n img.onload = function onLogoLoad() {\n const logoW = logo.width ?? size * 0.2;\n const logoH = logo.height ?? logoW;\n const pad = logo.padding ?? 4;\n const radius = logo.borderRadius ?? 4;\n const bg = logo.background ?? '#ffffff';\n\n const bgW = logoW + pad * 2;\n const bgH = logoH + pad * 2;\n const x = (size - bgW) / 2;\n const y = (size - bgH) / 2;\n\n // Draw background rect with rounded corners\n ctx.beginPath();\n ctx.moveTo(x + radius, y);\n ctx.lineTo(x + bgW - radius, y);\n ctx.quadraticCurveTo(x + bgW, y, x + bgW, y + radius);\n ctx.lineTo(x + bgW, y + bgH - radius);\n ctx.quadraticCurveTo(x + bgW, y + bgH, x + bgW - radius, y + bgH);\n ctx.lineTo(x + radius, y + bgH);\n ctx.quadraticCurveTo(x, y + bgH, x, y + bgH - radius);\n ctx.lineTo(x, y + radius);\n ctx.quadraticCurveTo(x, y, x + radius, y);\n ctx.closePath();\n ctx.fillStyle = bg;\n ctx.fill();\n\n // Draw logo image centered inside background\n ctx.drawImage(img, x + pad, y + pad, logoW, logoH);\n };\n img.src = logo.src;\n}\n\nexport const QrCode: Component<QrCodeProps> = props => {\n const p = mergeProps(DEFAULT_PROPS, props);\n const id = createUniqueId();\n let canvasRef: HTMLCanvasElement | undefined;\n\n createEffect(function renderQrCode() {\n if (!canvasRef) return;\n\n // Snapshot all reactive values synchronously — reads inside .then() would\n // occur outside the reactive computation and throw \"Effects is null\".\n const canvas = canvasRef;\n const value = p.value;\n const size = p.size;\n const color = p.color;\n const bgColor = p.bgColor;\n const errorLevel = p.errorLevel;\n const logo = p.logo;\n\n drawQr(canvas, value, { size, color, bgColor, errorLevel }).then(function onQrDrawn() {\n if (logo) {\n drawLogo(canvas, logo, size);\n }\n });\n });\n\n return (\n <div\n id={id}\n class={cn('qr01', p.class?.root)}\n style={{ width: `${p.size}px`, height: `${p.size}px` }}\n >\n {/* The QR canvas */}\n <canvas\n ref={canvasRef}\n class={cn('qr02', p.class?.canvas)}\n width={p.size}\n height={p.size}\n aria-label={`QR code for: ${p.value}`}\n />\n\n {/* Loading overlay */}\n <Show when={p.status === 'loading'}>\n <div class={cn('qr03', getColor(p.accentColor), p.class?.overlay)}>\n <Loader class={cn('qr04 animate-spin', p.class?.overlayIcon)} size={p.size * 0.22} />\n </div>\n </Show>\n\n {/* Expired overlay */}\n <Show when={p.status === 'expired'}>\n <div class={cn('qr03 qr05', getColor(p.accentColor), p.class?.overlay)}>\n <button\n class={cn('qr06', p.class?.overlayIcon)}\n onClick={p.onRefresh}\n aria-label=\"Refresh QR code\"\n >\n <RefreshCw size={p.size * 0.22} />\n </button>\n <span class={cn('qr07', p.class?.overlayText)}>{p.expiredText}</span>\n </div>\n </Show>\n\n {/* Scanned overlay */}\n <Show when={p.status === 'scanned'}>\n <div class={cn('qr03', getColor('success'), p.class?.overlay)}>\n <CheckCircle class={cn('qr04', p.class?.overlayIcon)} size={p.size * 0.22} />\n </div>\n </Show>\n </div>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"qr-code.js","names":["cn","getColor","QRCode","RefreshCw","CheckCircle","Loader","Component","createEffect","createUniqueId","mergeProps","onCleanup","Show","QrCodeProps","DEFAULT_PROPS","size","color","bgColor","errorLevel","const","status","expiredText","accentColor","drawQr","canvas","HTMLCanvasElement","value","opts","Promise","toCanvas","width","margin","dark","light","errorCorrectionLevel","drawLogo","logo","NonNullable","ctx","getContext","img","Image","crossOrigin","onload","onLogoLoad","logoW","logoH","height","pad","padding","radius","borderRadius","bg","background","bgW","bgH","x","y","beginPath","moveTo","lineTo","quadraticCurveTo","closePath","fillStyle","fill","drawImage","src","QrCode","props","p","id","canvasRef","renderQrCode","then","onQrDrawn","_el$","_tmpl$3","_el$2","firstChild","_$setAttribute","_ref$","_$use","_$insert","_$createComponent","when","children","_el$3","_tmpl$","class","overlayIcon","_$effect","_$className","overlay","_el$4","_tmpl$2","_el$5","_el$6","nextSibling","_$addEventListener","onRefresh","_p$","_v$","_v$2","_v$3","overlayText","e","t","a","undefined","_el$7","_v$4","root","_v$5","_v$6","_v$7","_v$8","_v$9","_v$0","_$setStyleProperty","o","i","n","s","_$delegateEvents"],"sources":["../../../src/components/qr-code/qr-code.tsx"],"sourcesContent":["import { cn } from '@utils/cn';\r\nimport { getColor } from '@utils/helper';\r\nimport QRCode from 'qrcode';\r\nimport RefreshCw from 'lucide-solid/icons/refresh-cw';\r\nimport CheckCircle from 'lucide-solid/icons/check-circle';\r\nimport Loader from 'lucide-solid/icons/loader';\r\nimport { Component, createEffect, createUniqueId, mergeProps, onCleanup, Show } from 'solid-js';\r\nimport type { QrCodeProps } from './qr-code.types';\r\n\r\nconst DEFAULT_PROPS = {\r\n size: 160,\r\n color: '#000000',\r\n bgColor: '#ffffff',\r\n errorLevel: 'M' as const,\r\n status: 'active' as const,\r\n expiredText: 'QR code expired',\r\n accentColor: 'primary' as const,\r\n};\r\n\r\nasync function drawQr(\r\n canvas: HTMLCanvasElement,\r\n value: string,\r\n opts: {\r\n size: number;\r\n color: string;\r\n bgColor: string;\r\n errorLevel: 'L' | 'M' | 'Q' | 'H';\r\n },\r\n): Promise<void> {\r\n await QRCode.toCanvas(canvas, value || ' ', {\r\n width: opts.size,\r\n margin: 2,\r\n color: {\r\n dark: opts.color,\r\n light: opts.bgColor,\r\n },\r\n errorCorrectionLevel: opts.errorLevel,\r\n });\r\n}\r\n\r\nfunction drawLogo(\r\n canvas: HTMLCanvasElement,\r\n logo: NonNullable<QrCodeProps['logo']>,\r\n size: number,\r\n): void {\r\n const ctx = canvas.getContext('2d');\r\n if (!ctx) return;\r\n\r\n const img = new Image();\r\n img.crossOrigin = 'anonymous';\r\n img.onload = function onLogoLoad() {\r\n const logoW = logo.width ?? size * 0.2;\r\n const logoH = logo.height ?? logoW;\r\n const pad = logo.padding ?? 4;\r\n const radius = logo.borderRadius ?? 4;\r\n const bg = logo.background ?? '#ffffff';\r\n\r\n const bgW = logoW + pad * 2;\r\n const bgH = logoH + pad * 2;\r\n const x = (size - bgW) / 2;\r\n const y = (size - bgH) / 2;\r\n\r\n // Draw background rect with rounded corners\r\n ctx.beginPath();\r\n ctx.moveTo(x + radius, y);\r\n ctx.lineTo(x + bgW - radius, y);\r\n ctx.quadraticCurveTo(x + bgW, y, x + bgW, y + radius);\r\n ctx.lineTo(x + bgW, y + bgH - radius);\r\n ctx.quadraticCurveTo(x + bgW, y + bgH, x + bgW - radius, y + bgH);\r\n ctx.lineTo(x + radius, y + bgH);\r\n ctx.quadraticCurveTo(x, y + bgH, x, y + bgH - radius);\r\n ctx.lineTo(x, y + radius);\r\n ctx.quadraticCurveTo(x, y, x + radius, y);\r\n ctx.closePath();\r\n ctx.fillStyle = bg;\r\n ctx.fill();\r\n\r\n // Draw logo image centered inside background\r\n ctx.drawImage(img, x + pad, y + pad, logoW, logoH);\r\n };\r\n img.src = logo.src;\r\n}\r\n\r\nexport const QrCode: Component<QrCodeProps> = props => {\r\n const p = mergeProps(DEFAULT_PROPS, props);\r\n const id = createUniqueId();\r\n let canvasRef: HTMLCanvasElement | undefined;\r\n\r\n createEffect(function renderQrCode() {\r\n if (!canvasRef) return;\r\n\r\n // Snapshot all reactive values synchronously — reads inside .then() would\r\n // occur outside the reactive computation and throw \"Effects is null\".\r\n const canvas = canvasRef;\r\n const value = p.value;\r\n const size = p.size;\r\n const color = p.color;\r\n const bgColor = p.bgColor;\r\n const errorLevel = p.errorLevel;\r\n const logo = p.logo;\r\n\r\n drawQr(canvas, value, { size, color, bgColor, errorLevel }).then(function onQrDrawn() {\r\n if (logo) {\r\n drawLogo(canvas, logo, size);\r\n }\r\n });\r\n });\r\n\r\n return (\r\n <div\r\n id={id}\r\n class={cn('qr01', p.class?.root)}\r\n style={{ width: `${p.size}px`, height: `${p.size}px` }}\r\n >\r\n {/* The QR canvas */}\r\n <canvas\r\n ref={canvasRef}\r\n class={cn('qr02', p.class?.canvas)}\r\n width={p.size}\r\n height={p.size}\r\n aria-label={`QR code for: ${p.value}`}\r\n />\r\n\r\n {/* Loading overlay */}\r\n <Show when={p.status === 'loading'}>\r\n <div class={cn('qr03', getColor(p.accentColor), p.class?.overlay)}>\r\n <Loader class={cn('qr04 animate-spin', p.class?.overlayIcon)} size={p.size * 0.22} />\r\n </div>\r\n </Show>\r\n\r\n {/* Expired overlay */}\r\n <Show when={p.status === 'expired'}>\r\n <div class={cn('qr03 qr05', getColor(p.accentColor), p.class?.overlay)}>\r\n <button\r\n class={cn('qr06', p.class?.overlayIcon)}\r\n onClick={p.onRefresh}\r\n aria-label=\"Refresh QR code\"\r\n >\r\n <RefreshCw size={p.size * 0.22} />\r\n </button>\r\n <span class={cn('qr07', p.class?.overlayText)}>{p.expiredText}</span>\r\n </div>\r\n </Show>\r\n\r\n {/* Scanned overlay */}\r\n <Show when={p.status === 'scanned'}>\r\n <div class={cn('qr03', getColor('success'), p.class?.overlay)}>\r\n <CheckCircle class={cn('qr04', p.class?.overlayIcon)} size={p.size * 0.22} />\r\n </div>\r\n </Show>\r\n </div>\r\n );\r\n};\r\n"],"mappings":"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"}