solid-tom-ui 0.2.3 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/carousel/carousel.d.ts.map +1 -1
- package/dist/components/carousel/carousel.js.map +1 -1
- package/dist/components/context-menu/context-menu.js.map +1 -1
- package/dist/components/context-menu/context-menu.store.d.ts.map +1 -1
- package/dist/components/context-menu/context-menu.store.js.map +1 -1
- package/dist/components/context-menu/context-menu.types.d.ts.map +1 -1
- package/dist/components/divider/divider.d.ts.map +1 -1
- package/dist/components/divider/divider.js.map +1 -1
- package/dist/components/divider/divider.types.d.ts.map +1 -1
- package/dist/components/divider/index.d.ts +1 -1
- package/dist/components/divider/index.d.ts.map +1 -1
- package/dist/components/drawer/drawer.types.d.ts.map +1 -1
- package/dist/components/dropdown/dropdown.store.js.map +1 -1
- package/dist/components/mansory/mansory.d.ts.map +1 -1
- package/dist/components/mansory/mansory.js.map +1 -1
- package/dist/components/mansory/mansory.types.d.ts.map +1 -1
- package/dist/components/modal/modal.d.ts.map +1 -1
- package/dist/components/modal/modal.js.map +1 -1
- package/dist/components/modal/modalContext.d.ts.map +1 -1
- package/dist/components/modal/modalContext.js.map +1 -1
- package/dist/components/progress-bar/progress-bar.d.ts.map +1 -1
- package/dist/components/progress-bar/progress-bar.js.map +1 -1
- package/dist/components/qr-code/qr-code.d.ts.map +1 -1
- package/dist/components/qr-code/qr-code.js.map +1 -1
- package/dist/components/select-zone/select-zone.js.map +1 -1
- package/dist/components/splitter/splitter.d.ts.map +1 -1
- package/dist/components/splitter/splitter.js.map +1 -1
- package/dist/components/timeline/timeline.d.ts.map +1 -1
- package/dist/components/timeline/timeline.js.map +1 -1
- package/dist/components/tooltip/tooltip.d.ts.map +1 -1
- package/dist/components/tooltip/tooltip.js.map +1 -1
- package/dist/components/upload/upload.d.ts.map +1 -1
- package/dist/components/upload/upload.js.map +1 -1
- package/dist/components/upload/upload.types.d.ts.map +1 -1
- package/dist/components/z-index/z-index.d.ts.map +1 -1
- package/dist/components/z-index/z-index.js.map +1 -1
- package/dist/solid-ui.css +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"carousel.d.ts","sourceRoot":"","sources":["../../../src/components/carousel/carousel.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAY1C,OAAO,KAAK,EAAoB,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAMxE,eAAO,MAAM,QAAQ,EAAE,SAAS,CAAC,aAAa,
|
|
1
|
+
{"version":3,"file":"carousel.d.ts","sourceRoot":"","sources":["../../../src/components/carousel/carousel.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAY1C,OAAO,KAAK,EAAoB,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAMxE,eAAO,MAAM,QAAQ,EAAE,SAAS,CAAC,aAAa,CAiV7C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"carousel.js","names":["cn","ChevronLeft","ChevronRight","Component","createEffect","createMemo","createSignal","For","mergeProps","on","onCleanup","onMount","Show","CarouselFunction","CarouselProps","VARIANTS","horizontal","vertical","Carousel","_p","p","arrows","autoplay","autoplaySpeed","dots","infinite","effect","const","currentIndex","setCurrentIndex","isPlaying","setIsPlaying","isAnimating","setIsAnimating","containerRef","HTMLDivElement","slidesRef","autoplayTimer","ReturnType","setInterval","totalSlides","images","length","transitionDuration","clearAutoplay","clearInterval","undefined","animateTransition","from","to","slides","querySelectorAll","fromSlide","HTMLElement","toSlide","direction","translateProp","style","zIndex","transition","opacity","offsetHeight","transitionValue","setTimeout","forEach","slide","index","el","size","offsetWidth","isWrapping","actualDirection","transform","goToSlide","skipAnimation","current","targetIndex","beforeChange","afterChange","startAutoplay","next","prev","moveTo","pause","play","exportCarouselFunction","carouselFunction","setCarouselFunction","stopAutoplay","handleSlideClick","onClickSlide","showPrevArrow","showNextArrow","isVertical","dotPlacementClass","dotPlacement","hasDotDuration","dotDuration","_el$","_tmpl$4","_el$2","firstChild","_ref$","_$use","_ref$2","_$insert","_$createComponent","each","children","image","_el$6","_tmpl$5","_el$7","$$click","_$spread","_$mergeProps","class","_$effect","_$className","item","when","_el$3","_tmpl$","_el$4","_tmpl$2","_$memo","_el$5","_tmpl$3","_","_el$8","_tmpl$7","_tmpl$6","_p$","_v$3","_v$4","e","t","_$setAttribute","_v$","root","_v$2","_$setStyleProperty","_$delegateEvents"],"sources":["../../../src/components/carousel/carousel.tsx"],"sourcesContent":["import { cn } from '@/utils/cn';\nimport ChevronLeft from 'lucide-solid/icons/chevron-left';\nimport ChevronRight from 'lucide-solid/icons/chevron-right';\nimport type { Component } from 'solid-js';\nimport {\n createEffect,\n createMemo,\n createSignal,\n For,\n mergeProps,\n on,\n onCleanup,\n onMount,\n Show,\n} from 'solid-js';\nimport type { CarouselFunction, CarouselProps } from './carousel.types';\nconst VARIANTS = {\n horizontal: 'car17',\n vertical: 'car18',\n};\n\nexport const Carousel: Component<CarouselProps> = _p => {\n const p = mergeProps(\n {\n arrows: true,\n autoplay: true,\n autoplaySpeed: 3000,\n dots: true,\n infinite: true,\n effect: 'scrollx' as const,\n },\n _p,\n );\n\n const [currentIndex, setCurrentIndex] = createSignal(0);\n const [isPlaying, setIsPlaying] = createSignal(!!p.autoplay);\n const [isAnimating, setIsAnimating] = createSignal(false);\n\n let containerRef: HTMLDivElement | undefined;\n let slidesRef: HTMLDivElement | undefined;\n let autoplayTimer: ReturnType<typeof setInterval> | undefined;\n\n const totalSlides = () => p.images.length;\n\n // Animation duration for slide transitions\n const transitionDuration = 400;\n\n // Clear autoplay timer\n const clearAutoplay = () => {\n if (autoplayTimer) {\n clearInterval(autoplayTimer);\n autoplayTimer = undefined;\n }\n };\n\n // Animate slide transition using CSS transitions\n const animateTransition = (from: number, to: number) => {\n if (!slidesRef || isAnimating()) return;\n\n setIsAnimating(true);\n\n const slides = slidesRef.querySelectorAll('.car03');\n const fromSlide = slides[from] as HTMLElement;\n const toSlide = slides[to] as HTMLElement;\n\n if (!fromSlide || !toSlide) {\n setIsAnimating(false);\n return;\n }\n\n const vertical = p.direction === 'vertical';\n const translateProp = vertical ? 'translateY' : 'translateX';\n\n if (p.effect === 'fade') {\n // Fade effect\n fromSlide.style.zIndex = '1';\n toSlide.style.zIndex = '2';\n toSlide.style.transition = 'none';\n fromSlide.style.transition = 'none';\n toSlide.style.opacity = '0';\n\n // Force reflow to apply initial state\n void toSlide.offsetHeight;\n\n // Apply CSS transition and target values\n const transitionValue = 'opacity var(--carousel-transition-duration) ease-in-out';\n fromSlide.style.transition = transitionValue;\n toSlide.style.transition = transitionValue;\n\n fromSlide.style.opacity = '0';\n toSlide.style.opacity = '1';\n\n setTimeout(() => {\n slides.forEach((slide, index) => {\n const el = slide as HTMLElement;\n el.style.transition = 'none';\n el.style.opacity = index === to ? '1' : '0';\n el.style.zIndex = index === to ? '1' : '0';\n });\n setIsAnimating(false);\n }, transitionDuration);\n } else {\n // Scrollx effect (default)\n // Use pixel-based transforms with 1px overlap to eliminate sub-pixel gap\n const size = vertical ? slidesRef.offsetHeight : slidesRef.offsetWidth;\n const direction = to > from ? -1 : 1;\n const isWrapping =\n (from === 0 && to === totalSlides() - 1) || (from === totalSlides() - 1 && to === 0);\n\n let actualDirection = direction;\n if (isWrapping) {\n actualDirection = from === 0 ? 1 : -1;\n }\n\n // Position the target slide without transition (1px overlap to prevent gap)\n toSlide.style.transition = 'none';\n fromSlide.style.transition = 'none';\n toSlide.style.transform = `${translateProp}(${-actualDirection * (size - 1)}px)`;\n toSlide.style.opacity = '1';\n\n // Force reflow to apply initial position\n void toSlide.offsetHeight;\n\n // Apply CSS transition and target values\n const transitionValue = 'transform var(--carousel-transition-duration) ease-in-out';\n fromSlide.style.transition = transitionValue;\n toSlide.style.transition = transitionValue;\n\n fromSlide.style.transform = `${translateProp}(${actualDirection * size}px)`;\n toSlide.style.transform = `${translateProp}(0px)`;\n\n setTimeout(() => {\n slides.forEach((slide, index) => {\n const el = slide as HTMLElement;\n el.style.transition = 'none';\n if (index === to) {\n el.style.transform = `${translateProp}(0px)`;\n el.style.opacity = '1';\n } else {\n el.style.transform = `${translateProp}(${size}px)`;\n el.style.opacity = '0';\n }\n });\n setIsAnimating(false);\n }, transitionDuration);\n }\n };\n\n // Go to specific slide\n const goToSlide = (index: number, skipAnimation = false) => {\n if (isAnimating() && !skipAnimation) return;\n\n const current = currentIndex();\n let targetIndex = index;\n\n // Handle boundaries\n if (p.infinite) {\n if (targetIndex < 0) targetIndex = totalSlides() - 1;\n if (targetIndex >= totalSlides()) targetIndex = 0;\n } else {\n if (targetIndex < 0) targetIndex = 0;\n if (targetIndex >= totalSlides()) targetIndex = totalSlides() - 1;\n }\n\n if (targetIndex === current && !skipAnimation) return;\n\n p.beforeChange?.(current, targetIndex);\n\n if (skipAnimation) {\n setCurrentIndex(targetIndex);\n p.afterChange?.(targetIndex);\n } else {\n animateTransition(current, targetIndex);\n setCurrentIndex(targetIndex);\n p.afterChange?.(targetIndex);\n }\n\n // Reset autoplay timer and progress animation when slide changes\n if (isPlaying() && p.autoplay) {\n clearAutoplay();\n startAutoplay();\n }\n };\n\n // Navigation functions\n const next = () => goToSlide(currentIndex() + 1);\n const prev = () => goToSlide(currentIndex() - 1);\n const moveTo = (index: number) => goToSlide(index);\n\n const pause = () => {\n setIsPlaying(false);\n clearAutoplay();\n return {};\n };\n\n const play = () => {\n if (!p.autoplay) return {};\n setIsPlaying(true);\n startAutoplay();\n return {};\n };\n\n // Start autoplay\n const startAutoplay = () => {\n if (!p.autoplay || !isPlaying()) return;\n\n clearAutoplay();\n\n autoplayTimer = setInterval(() => {\n if (!isAnimating()) {\n next();\n }\n }, p.autoplaySpeed);\n };\n\n // Export carousel functions\n createEffect(function exportCarouselFunction() {\n const carouselFunction: CarouselFunction = {\n next,\n prev,\n moveTo,\n pause,\n play,\n };\n p.setCarouselFunction?.(carouselFunction);\n });\n\n // Handle autoplay\n createEffect(\n on(\n () => [p.autoplay, isPlaying()],\n () => {\n if (p.autoplay && isPlaying()) {\n startAutoplay();\n } else {\n clearAutoplay();\n }\n },\n ),\n );\n\n // Initialize slides\n onMount(() => {\n if (slidesRef) {\n const slides = slidesRef.querySelectorAll('.car03');\n const vertical = p.direction === 'vertical';\n const translateProp = vertical ? 'translateY' : 'translateX';\n\n slides.forEach((slide, index) => {\n const el = slide as HTMLElement;\n if (p.effect === 'fade') {\n el.style.opacity = index === 0 ? '1' : '0';\n el.style.zIndex = index === 0 ? '1' : '0';\n } else {\n el.style.transform = index === 0 ? `${translateProp}(0%)` : `${translateProp}(100%)`;\n el.style.opacity = index === 0 ? '1' : '0';\n }\n });\n }\n\n if (p.autoplay) {\n startAutoplay();\n }\n });\n\n // Cleanup\n onCleanup(function stopAutoplay() {\n clearAutoplay();\n });\n\n // Handle click on slide\n const handleSlideClick = (index: number) => {\n if (index === currentIndex()) {\n p.onClickSlide?.(index);\n }\n };\n\n const showPrevArrow = () => p.infinite || currentIndex() > 0;\n const showNextArrow = () => p.infinite || currentIndex() < totalSlides() - 1;\n\n const isVertical = () => p.direction === 'vertical';\n\n // Constrain dotPlacement based on direction\n const dotPlacementClass = () => {\n if (isVertical()) {\n // Vertical: only 'start' or 'end' allowed\n if (p.dotPlacement === 'start') return 'car15';\n return 'car16'; // default for vertical\n } else {\n // Horizontal: only 'top' or 'bottom' allowed\n if (p.dotPlacement === 'top') return 'car14';\n return 'car13'; // default for horizontal\n }\n };\n\n const hasDotDuration = createMemo(\n () => isPlaying() && p.autoplay && typeof p.autoplay === 'object' && p.autoplay.dotDuration,\n );\n\n return (\n <div\n ref={containerRef}\n class={cn(\n 'car01',\n p.direction && VARIANTS[p.direction],\n dotPlacementClass(),\n p.class?.root,\n )}\n style={{\n '--carousel-transition-duration': `${transitionDuration}ms`,\n '--carousel-autoplay-speed': `${p.autoplaySpeed}ms`,\n }}\n >\n {/* Slides container */}\n <div ref={slidesRef} class=\"car02\">\n <For each={p.images}>\n {(image, index) => (\n <div\n class={cn('car03', p.class?.item)}\n onClick={() => handleSlideClick(index())}\n >\n <img {...image} class={cn('car04', image.class)} draggable={false} />\n </div>\n )}\n </For>\n </div>\n\n {/* Arrows */}\n <Show when={p.arrows}>\n <Show when={showPrevArrow()}>\n <button\n type=\"button\"\n class=\"car05 car06\"\n onClick={prev}\n aria-label=\"Previous slide\"\n >\n <ChevronLeft class=\"size-6\" />\n </button>\n </Show>\n <Show when={showNextArrow()}>\n <button\n type=\"button\"\n class=\"car05 car07\"\n onClick={next}\n aria-label=\"Next slide\"\n >\n <ChevronRight class=\"size-6\" />\n </button>\n </Show>\n </Show>\n\n {/* Dots */}\n <Show when={p.dots && totalSlides() > 1}>\n <div class=\"car08\">\n <For each={p.images}>\n {(_, index) => (\n <button\n type=\"button\"\n class={cn(\n 'car09',\n currentIndex() === index() && 'car10',\n hasDotDuration() && 'car11',\n )}\n onClick={() => goToSlide(index())}\n aria-label={`Go to slide ${index() + 1}`}\n >\n <Show when={hasDotDuration()}>\n <div class=\"car12\" />\n </Show>\n </button>\n )}\n </For>\n </div>\n </Show>\n </div>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"carousel.js","names":["cn","ChevronLeft","ChevronRight","Component","createEffect","createMemo","createSignal","For","mergeProps","on","onCleanup","onMount","Show","CarouselFunction","CarouselProps","VARIANTS","horizontal","vertical","Carousel","_p","p","arrows","autoplay","autoplaySpeed","dots","infinite","effect","const","currentIndex","setCurrentIndex","isPlaying","setIsPlaying","isAnimating","setIsAnimating","containerRef","HTMLDivElement","slidesRef","autoplayTimer","ReturnType","setInterval","totalSlides","images","length","transitionDuration","clearAutoplay","clearInterval","undefined","animateTransition","from","to","slides","querySelectorAll","fromSlide","HTMLElement","toSlide","direction","translateProp","style","zIndex","transition","opacity","offsetHeight","transitionValue","setTimeout","forEach","slide","index","el","size","offsetWidth","isWrapping","actualDirection","transform","goToSlide","skipAnimation","current","targetIndex","beforeChange","afterChange","startAutoplay","next","prev","moveTo","pause","play","exportCarouselFunction","carouselFunction","setCarouselFunction","stopAutoplay","handleSlideClick","onClickSlide","showPrevArrow","showNextArrow","isVertical","dotPlacementClass","dotPlacement","hasDotDuration","dotDuration","_el$","_tmpl$4","_el$2","firstChild","_ref$","_$use","_ref$2","_$insert","_$createComponent","each","children","image","_el$6","_tmpl$5","_el$7","$$click","_$spread","_$mergeProps","class","_$effect","_$className","item","when","_el$3","_tmpl$","_el$4","_tmpl$2","_$memo","_el$5","_tmpl$3","_","_el$8","_tmpl$7","_tmpl$6","_p$","_v$3","_v$4","e","t","_$setAttribute","_v$","root","_v$2","_$setStyleProperty","_$delegateEvents"],"sources":["../../../src/components/carousel/carousel.tsx"],"sourcesContent":["import { cn } from '@/utils/cn';\nimport ChevronLeft from 'lucide-solid/icons/chevron-left';\nimport ChevronRight from 'lucide-solid/icons/chevron-right';\nimport type { Component } from 'solid-js';\nimport {\n createEffect,\n createMemo,\n createSignal,\n For,\n mergeProps,\n on,\n onCleanup,\n onMount,\n Show,\n} from 'solid-js';\nimport type { CarouselFunction, CarouselProps } from './carousel.types';\nconst VARIANTS = {\n horizontal: 'car17',\n vertical: 'car18',\n};\n\nexport const Carousel: Component<CarouselProps> = _p => {\n const p = mergeProps(\n {\n arrows: true,\n autoplay: true,\n autoplaySpeed: 3000,\n dots: true,\n infinite: true,\n effect: 'scrollx' as const,\n },\n _p,\n );\n\n const [currentIndex, setCurrentIndex] = createSignal(0);\n const [isPlaying, setIsPlaying] = createSignal(!!p.autoplay);\n const [isAnimating, setIsAnimating] = createSignal(false);\n\n let containerRef: HTMLDivElement | undefined;\n let slidesRef: HTMLDivElement | undefined;\n let autoplayTimer: ReturnType<typeof setInterval> | undefined;\n\n const totalSlides = () => p.images.length;\n\n // Animation duration for slide transitions\n const transitionDuration = 400;\n\n // Clear autoplay timer\n const clearAutoplay = () => {\n if (autoplayTimer) {\n clearInterval(autoplayTimer);\n autoplayTimer = undefined;\n }\n };\n\n // Animate slide transition using CSS transitions\n const animateTransition = (from: number, to: number) => {\n if (!slidesRef || isAnimating()) return;\n\n setIsAnimating(true);\n\n const slides = slidesRef.querySelectorAll('.car03');\n const fromSlide = slides[from] as HTMLElement;\n const toSlide = slides[to] as HTMLElement;\n\n if (!fromSlide || !toSlide) {\n setIsAnimating(false);\n return;\n }\n\n const vertical = p.direction === 'vertical';\n const translateProp = vertical ? 'translateY' : 'translateX';\n\n if (p.effect === 'fade') {\n // Fade effect\n fromSlide.style.zIndex = '1';\n toSlide.style.zIndex = '2';\n toSlide.style.transition = 'none';\n fromSlide.style.transition = 'none';\n toSlide.style.opacity = '0';\n\n // Force reflow to apply initial state\n void toSlide.offsetHeight;\n\n // Apply CSS transition and target values\n const transitionValue = 'opacity var(--carousel-transition-duration) ease-in-out';\n fromSlide.style.transition = transitionValue;\n toSlide.style.transition = transitionValue;\n\n fromSlide.style.opacity = '0';\n toSlide.style.opacity = '1';\n\n setTimeout(() => {\n slides.forEach((slide, index) => {\n const el = slide as HTMLElement;\n el.style.transition = 'none';\n el.style.opacity = index === to ? '1' : '0';\n el.style.zIndex = index === to ? '1' : '0';\n });\n setIsAnimating(false);\n }, transitionDuration);\n } else {\n // Scrollx effect (default)\n // Use pixel-based transforms with 1px overlap to eliminate sub-pixel gap\n const size = vertical ? slidesRef.offsetHeight : slidesRef.offsetWidth;\n const direction = to > from ? -1 : 1;\n const isWrapping =\n (from === 0 && to === totalSlides() - 1) || (from === totalSlides() - 1 && to === 0);\n\n let actualDirection = direction;\n if (isWrapping) {\n actualDirection = from === 0 ? 1 : -1;\n }\n\n // Position the target slide without transition (1px overlap to prevent gap)\n toSlide.style.transition = 'none';\n fromSlide.style.transition = 'none';\n toSlide.style.transform = `${translateProp}(${-actualDirection * (size - 1)}px)`;\n toSlide.style.opacity = '1';\n\n // Force reflow to apply initial position\n void toSlide.offsetHeight;\n\n // Apply CSS transition and target values\n const transitionValue = 'transform var(--carousel-transition-duration) ease-in-out';\n fromSlide.style.transition = transitionValue;\n toSlide.style.transition = transitionValue;\n\n fromSlide.style.transform = `${translateProp}(${actualDirection * size}px)`;\n toSlide.style.transform = `${translateProp}(0px)`;\n\n setTimeout(() => {\n slides.forEach((slide, index) => {\n const el = slide as HTMLElement;\n el.style.transition = 'none';\n if (index === to) {\n el.style.transform = `${translateProp}(0px)`;\n el.style.opacity = '1';\n } else {\n el.style.transform = `${translateProp}(${size}px)`;\n el.style.opacity = '0';\n }\n });\n setIsAnimating(false);\n }, transitionDuration);\n }\n };\n\n // Go to specific slide\n const goToSlide = (index: number, skipAnimation = false) => {\n if (isAnimating() && !skipAnimation) return;\n\n const current = currentIndex();\n let targetIndex = index;\n\n // Handle boundaries\n if (p.infinite) {\n if (targetIndex < 0) targetIndex = totalSlides() - 1;\n if (targetIndex >= totalSlides()) targetIndex = 0;\n } else {\n if (targetIndex < 0) targetIndex = 0;\n if (targetIndex >= totalSlides()) targetIndex = totalSlides() - 1;\n }\n\n if (targetIndex === current && !skipAnimation) return;\n\n p.beforeChange?.(current, targetIndex);\n\n if (skipAnimation) {\n setCurrentIndex(targetIndex);\n p.afterChange?.(targetIndex);\n } else {\n animateTransition(current, targetIndex);\n setCurrentIndex(targetIndex);\n p.afterChange?.(targetIndex);\n }\n\n // Reset autoplay timer and progress animation when slide changes\n if (isPlaying() && p.autoplay) {\n clearAutoplay();\n startAutoplay();\n }\n };\n\n // Navigation functions\n const next = () => goToSlide(currentIndex() + 1);\n const prev = () => goToSlide(currentIndex() - 1);\n const moveTo = (index: number) => goToSlide(index);\n\n const pause = () => {\n setIsPlaying(false);\n clearAutoplay();\n return {};\n };\n\n const play = () => {\n if (!p.autoplay) return {};\n setIsPlaying(true);\n startAutoplay();\n return {};\n };\n\n // Start autoplay\n const startAutoplay = () => {\n if (!p.autoplay || !isPlaying()) return;\n\n clearAutoplay();\n\n autoplayTimer = setInterval(() => {\n if (!isAnimating()) {\n next();\n }\n }, p.autoplaySpeed);\n };\n\n // Export carousel functions\n createEffect(function exportCarouselFunction() {\n const carouselFunction: CarouselFunction = {\n next,\n prev,\n moveTo,\n pause,\n play,\n };\n p.setCarouselFunction?.(carouselFunction);\n });\n\n // Handle autoplay\n createEffect(\n on(\n () => [p.autoplay, isPlaying()],\n () => {\n if (p.autoplay && isPlaying()) {\n startAutoplay();\n } else {\n clearAutoplay();\n }\n },\n ),\n );\n\n // Initialize slides\n onMount(() => {\n if (slidesRef) {\n const slides = slidesRef.querySelectorAll('.car03');\n const vertical = p.direction === 'vertical';\n const translateProp = vertical ? 'translateY' : 'translateX';\n\n slides.forEach((slide, index) => {\n const el = slide as HTMLElement;\n if (p.effect === 'fade') {\n el.style.opacity = index === 0 ? '1' : '0';\n el.style.zIndex = index === 0 ? '1' : '0';\n } else {\n el.style.transform = index === 0 ? `${translateProp}(0%)` : `${translateProp}(100%)`;\n el.style.opacity = index === 0 ? '1' : '0';\n }\n });\n }\n\n if (p.autoplay) {\n startAutoplay();\n }\n });\n\n // Cleanup\n onCleanup(function stopAutoplay() {\n clearAutoplay();\n });\n\n // Handle click on slide\n const handleSlideClick = (index: number) => {\n if (index === currentIndex()) {\n p.onClickSlide?.(index);\n }\n };\n\n const showPrevArrow = () => p.infinite || currentIndex() > 0;\n const showNextArrow = () => p.infinite || currentIndex() < totalSlides() - 1;\n\n const isVertical = () => p.direction === 'vertical';\n\n // Constrain dotPlacement based on direction\n const dotPlacementClass = () => {\n if (isVertical()) {\n // Vertical: only 'start' or 'end' allowed\n if (p.dotPlacement === 'start') return 'car15';\n return 'car16'; // default for vertical\n } else {\n // Horizontal: only 'top' or 'bottom' allowed\n if (p.dotPlacement === 'top') return 'car14';\n return 'car13'; // default for horizontal\n }\n };\n\n const hasDotDuration = createMemo(\n () => isPlaying() && p.autoplay && typeof p.autoplay === 'object' && p.autoplay.dotDuration,\n );\n\n return (\n <div\n ref={containerRef}\n class={cn('car01', p.direction && VARIANTS[p.direction], dotPlacementClass(), p.class?.root)}\n style={{\n '--carousel-transition-duration': `${transitionDuration}ms`,\n '--carousel-autoplay-speed': `${p.autoplaySpeed}ms`,\n }}\n >\n {/* Slides container */}\n <div ref={slidesRef} class=\"car02\">\n <For each={p.images}>\n {(image, index) => (\n <div class={cn('car03', p.class?.item)} onClick={() => handleSlideClick(index())}>\n <img {...image} class={cn('car04', image.class)} draggable={false} />\n </div>\n )}\n </For>\n </div>\n\n {/* Arrows */}\n <Show when={p.arrows}>\n <Show when={showPrevArrow()}>\n <button type=\"button\" class=\"car05 car06\" onClick={prev} aria-label=\"Previous slide\">\n <ChevronLeft class=\"size-6\" />\n </button>\n </Show>\n <Show when={showNextArrow()}>\n <button type=\"button\" class=\"car05 car07\" onClick={next} aria-label=\"Next slide\">\n <ChevronRight class=\"size-6\" />\n </button>\n </Show>\n </Show>\n\n {/* Dots */}\n <Show when={p.dots && totalSlides() > 1}>\n <div class=\"car08\">\n <For each={p.images}>\n {(_, index) => (\n <button\n type=\"button\"\n class={cn(\n 'car09',\n currentIndex() === index() && 'car10',\n hasDotDuration() && 'car11',\n )}\n onClick={() => goToSlide(index())}\n aria-label={`Go to slide ${index() + 1}`}\n >\n <Show when={hasDotDuration()}>\n <div class=\"car12\" />\n </Show>\n </button>\n )}\n </For>\n </div>\n </Show>\n </div>\n );\n};\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-menu.js","names":["Component","createEffect","createSignal","For","onCleanup","Show","cn","ZIndex","ZIndexType","contextMenuStore","ContextMenuProps","RenderedItem","ChevronRight","MenuItemProps","item","close","customClass","Partial","Record","MenuItem","props","type","_el$","_tmpl$","_$effect","_$className","separator","submenuRef","HTMLDivElement","flip","setFlip","detectSubmenuEdge","rafId","requestAnimationFrame","checkEdge","rect","getBoundingClientRect","right","window","innerWidth","cancelAnimationFrame","_el$2","_tmpl$3","_el$3","firstChild","_el$5","_el$6","nextSibling","_el$7","_$insert","_$createComponent","when","prefixIcon","children","_el$4","_tmpl$2","label","size","_$use","el","each","items","sub","_p$","_v$","disabled","submenu","_v$2","_v$3","e","t","_$setAttribute","a","undefined","_el$8","_tmpl$5","_el$0","$$click","onClick","_el$9","shortcut","_el$1","_tmpl$4","_v$4","_v$5","MenuContentProps","x","y","MenuContent","panelRef","style","setStyle","left","top","adjustPosition","computePosition","vw","vh","innerHeight","Math","max","width","bottom","height","_el$10","$$contextmenu","preventDefault","_v$6","content","_v$7","_$style","ContextMenu","state","menuState","registerGlobalListeners","onMouseDown","MouseEvent","target","Element","closest","onKeyDown","KeyboardEvent","key","document","addEventListener","removeGlobalListeners","removeEventListener","open","DROPDOWN","s","class","_$delegateEvents"],"sources":["../../../src/components/context-menu/context-menu.tsx"],"sourcesContent":["import { Component, createEffect, createSignal, For, onCleanup, Show } from 'solid-js';\nimport { cn } from '@utils/cn';\nimport { ZIndex, ZIndexType } from '@components/z-index';\nimport { contextMenuStore } from './context-menu.store';\nimport type { ContextMenuProps, RenderedItem } from './context-menu.types';\nimport ChevronRight from 'lucide-solid/icons/chevron-right';\n\ntype MenuItemProps = {\n item: RenderedItem;\n close: () => void;\n customClass?: Partial<Record<'item' | 'separator' | 'submenu', string>>;\n};\n\nconst MenuItem: Component<MenuItemProps> = props => {\n if (props.item.type === 'separator') {\n return <div class={cn('cm03', props.customClass?.separator)} />;\n }\n\n if (props.item.type === 'submenu') {\n const item = props.item;\n let submenuRef!: HTMLDivElement;\n const [flip, setFlip] = createSignal(false);\n\n createEffect(function detectSubmenuEdge() {\n const rafId = requestAnimationFrame(function checkEdge() {\n if (!submenuRef) return;\n const rect = submenuRef.getBoundingClientRect();\n if (rect.right > window.innerWidth) setFlip(true);\n else setFlip(false);\n });\n onCleanup(() => cancelAnimationFrame(rafId));\n });\n\n return (\n <div\n class={cn('cm04', item.disabled && 'cm04--disabled', props.customClass?.submenu)}\n aria-disabled={item.disabled}\n >\n <div class=\"cm05\">\n <Show when={item.prefixIcon}>\n <span class=\"cm06\">{item.prefixIcon}</span>\n </Show>\n <span class=\"cm07\">{item.label}</span>\n <span class=\"cm08\">\n <ChevronRight size={14} />\n </span>\n </div>\n <div ref={el => (submenuRef = el)} class={cn('cm09', flip() && 'cm09--flip')}>\n <For each={item.items}>\n {sub => <MenuItem item={sub} close={props.close} customClass={props.customClass} />}\n </For>\n </div>\n </div>\n );\n }\n\n const item = props.item;\n return (\n <button\n type=\"button\"\n class={cn('cm02', item.disabled && 'cm02--disabled', props.customClass?.item)}\n disabled={item.disabled}\n onClick={() => {\n if (item.disabled) return;\n item.onClick();\n props.close();\n }}\n >\n <Show when={item.prefixIcon}>\n <span class=\"cm06\">{item.prefixIcon}</span>\n </Show>\n <span class=\"cm07\">{item.label}</span>\n <Show when={item.shortcut}>\n <span class=\"cm10\">{item.shortcut}</span>\n </Show>\n </button>\n );\n};\n\ntype MenuContentProps = {\n x: number;\n y: number;\n items: RenderedItem[];\n close: () => void;\n customClass?: Partial<Record<'content' | 'item' | 'separator' | 'submenu', string>>;\n};\n\nconst MenuContent: Component<MenuContentProps> = props => {\n let panelRef!: HTMLDivElement;\n const [style, setStyle] = createSignal({ left: `${props.x}px`, top: `${props.y}px` });\n\n createEffect(function adjustPosition() {\n const rafId = requestAnimationFrame(function computePosition() {\n if (!panelRef) return;\n const rect = panelRef.getBoundingClientRect();\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n\n const left = rect.right > vw ? Math.max(0, props.x - rect.width) : props.x;\n const top = rect.bottom > vh ? Math.max(0, props.y - rect.height) : props.y;\n\n setStyle({ left: `${left}px`, top: `${top}px` });\n });\n onCleanup(() => cancelAnimationFrame(rafId));\n });\n\n return (\n <div\n ref={el => (panelRef = el)}\n class={cn('cm01', props.customClass?.content)}\n style={style()}\n onContextMenu={e => e.preventDefault()}\n >\n <For each={props.items}>\n {item => <MenuItem item={item} close={props.close} customClass={props.customClass} />}\n </For>\n </div>\n );\n};\n\nexport const ContextMenu: Component<ContextMenuProps> = props => {\n const state = () => contextMenuStore.menuState();\n const close = () => contextMenuStore.close();\n\n createEffect(function registerGlobalListeners() {\n if (!state()) return;\n\n function onMouseDown(e: MouseEvent) {\n const target = e.target as Element;\n if (!target.closest('.cm01')) close();\n }\n\n function onKeyDown(e: KeyboardEvent) {\n if (e.key === 'Escape') close();\n }\n\n document.addEventListener('mousedown', onMouseDown);\n document.addEventListener('keydown', onKeyDown);\n\n onCleanup(function removeGlobalListeners() {\n document.removeEventListener('mousedown', onMouseDown);\n document.removeEventListener('keydown', onKeyDown);\n });\n });\n\n return (\n <ZIndex open={!!state()} type={ZIndexType.DROPDOWN} class=\"inset-0\">\n <Show when={state()}>\n {s => (\n <MenuContent\n x={s().x}\n y={s().y}\n items={s().items}\n close={close}\n customClass={props.class}\n />\n )}\n </Show>\n </ZIndex>\n );\n};"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"context-menu.js","names":["Component","createEffect","createSignal","For","onCleanup","Show","cn","ZIndex","ZIndexType","contextMenuStore","ContextMenuProps","RenderedItem","ChevronRight","MenuItemProps","item","close","customClass","Partial","Record","MenuItem","props","type","_el$","_tmpl$","_$effect","_$className","separator","submenuRef","HTMLDivElement","flip","setFlip","detectSubmenuEdge","rafId","requestAnimationFrame","checkEdge","rect","getBoundingClientRect","right","window","innerWidth","cancelAnimationFrame","_el$2","_tmpl$3","_el$3","firstChild","_el$5","_el$6","nextSibling","_el$7","_$insert","_$createComponent","when","prefixIcon","children","_el$4","_tmpl$2","label","size","_$use","el","each","items","sub","_p$","_v$","disabled","submenu","_v$2","_v$3","e","t","_$setAttribute","a","undefined","_el$8","_tmpl$5","_el$0","$$click","onClick","_el$9","shortcut","_el$1","_tmpl$4","_v$4","_v$5","MenuContentProps","x","y","MenuContent","panelRef","style","setStyle","left","top","adjustPosition","computePosition","vw","vh","innerHeight","Math","max","width","bottom","height","_el$10","$$contextmenu","preventDefault","_v$6","content","_v$7","_$style","ContextMenu","state","menuState","registerGlobalListeners","onMouseDown","MouseEvent","target","Element","closest","onKeyDown","KeyboardEvent","key","document","addEventListener","removeGlobalListeners","removeEventListener","open","DROPDOWN","s","class","_$delegateEvents"],"sources":["../../../src/components/context-menu/context-menu.tsx"],"sourcesContent":["import { Component, createEffect, createSignal, For, onCleanup, Show } from 'solid-js';\nimport { cn } from '@utils/cn';\nimport { ZIndex, ZIndexType } from '@components/z-index';\nimport { contextMenuStore } from './context-menu.store';\nimport type { ContextMenuProps, RenderedItem } from './context-menu.types';\nimport ChevronRight from 'lucide-solid/icons/chevron-right';\n\ntype MenuItemProps = {\n item: RenderedItem;\n close: () => void;\n customClass?: Partial<Record<'item' | 'separator' | 'submenu', string>>;\n};\n\nconst MenuItem: Component<MenuItemProps> = props => {\n if (props.item.type === 'separator') {\n return <div class={cn('cm03', props.customClass?.separator)} />;\n }\n\n if (props.item.type === 'submenu') {\n const item = props.item;\n let submenuRef!: HTMLDivElement;\n const [flip, setFlip] = createSignal(false);\n\n createEffect(function detectSubmenuEdge() {\n const rafId = requestAnimationFrame(function checkEdge() {\n if (!submenuRef) return;\n const rect = submenuRef.getBoundingClientRect();\n if (rect.right > window.innerWidth) setFlip(true);\n else setFlip(false);\n });\n onCleanup(() => cancelAnimationFrame(rafId));\n });\n\n return (\n <div\n class={cn('cm04', item.disabled && 'cm04--disabled', props.customClass?.submenu)}\n aria-disabled={item.disabled}\n >\n <div class=\"cm05\">\n <Show when={item.prefixIcon}>\n <span class=\"cm06\">{item.prefixIcon}</span>\n </Show>\n <span class=\"cm07\">{item.label}</span>\n <span class=\"cm08\">\n <ChevronRight size={14} />\n </span>\n </div>\n <div ref={el => (submenuRef = el)} class={cn('cm09', flip() && 'cm09--flip')}>\n <For each={item.items}>\n {sub => <MenuItem item={sub} close={props.close} customClass={props.customClass} />}\n </For>\n </div>\n </div>\n );\n }\n\n const item = props.item;\n return (\n <button\n type=\"button\"\n class={cn('cm02', item.disabled && 'cm02--disabled', props.customClass?.item)}\n disabled={item.disabled}\n onClick={() => {\n if (item.disabled) return;\n item.onClick();\n props.close();\n }}\n >\n <Show when={item.prefixIcon}>\n <span class=\"cm06\">{item.prefixIcon}</span>\n </Show>\n <span class=\"cm07\">{item.label}</span>\n <Show when={item.shortcut}>\n <span class=\"cm10\">{item.shortcut}</span>\n </Show>\n </button>\n );\n};\n\ntype MenuContentProps = {\n x: number;\n y: number;\n items: RenderedItem[];\n close: () => void;\n customClass?: Partial<Record<'content' | 'item' | 'separator' | 'submenu', string>>;\n};\n\nconst MenuContent: Component<MenuContentProps> = props => {\n let panelRef!: HTMLDivElement;\n const [style, setStyle] = createSignal({ left: `${props.x}px`, top: `${props.y}px` });\n\n createEffect(function adjustPosition() {\n const rafId = requestAnimationFrame(function computePosition() {\n if (!panelRef) return;\n const rect = panelRef.getBoundingClientRect();\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n\n const left = rect.right > vw ? Math.max(0, props.x - rect.width) : props.x;\n const top = rect.bottom > vh ? Math.max(0, props.y - rect.height) : props.y;\n\n setStyle({ left: `${left}px`, top: `${top}px` });\n });\n onCleanup(() => cancelAnimationFrame(rafId));\n });\n\n return (\n <div\n ref={el => (panelRef = el)}\n class={cn('cm01', props.customClass?.content)}\n style={style()}\n onContextMenu={e => e.preventDefault()}\n >\n <For each={props.items}>\n {item => <MenuItem item={item} close={props.close} customClass={props.customClass} />}\n </For>\n </div>\n );\n};\n\nexport const ContextMenu: Component<ContextMenuProps> = props => {\n const state = () => contextMenuStore.menuState();\n const close = () => contextMenuStore.close();\n\n createEffect(function registerGlobalListeners() {\n if (!state()) return;\n\n function onMouseDown(e: MouseEvent) {\n const target = e.target as Element;\n if (!target.closest('.cm01')) close();\n }\n\n function onKeyDown(e: KeyboardEvent) {\n if (e.key === 'Escape') close();\n }\n\n document.addEventListener('mousedown', onMouseDown);\n document.addEventListener('keydown', onKeyDown);\n\n onCleanup(function removeGlobalListeners() {\n document.removeEventListener('mousedown', onMouseDown);\n document.removeEventListener('keydown', onKeyDown);\n });\n });\n\n return (\n <ZIndex open={!!state()} type={ZIndexType.DROPDOWN} class=\"inset-0\">\n <Show when={state()}>\n {s => (\n <MenuContent\n x={s().x}\n y={s().y}\n items={s().items}\n close={close}\n customClass={props.class}\n />\n )}\n </Show>\n </ZIndex>\n );\n};\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-menu.store.d.ts","sourceRoot":"","sources":["../../../src/components/context-menu/context-menu.store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EAEb,YAAY,EACZ,iBAAiB,EAClB,MAAM,sBAAsB,CAAC;AAE9B,KAAK,SAAS,GAAG;IACf,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB,GAAG,IAAI,CAAC;AAIT,eAAO,MAAM,gBAAgB;;;;CAI5B,CAAC;AAEF,wBAAgB,uBAAuB,
|
|
1
|
+
{"version":3,"file":"context-menu.store.d.ts","sourceRoot":"","sources":["../../../src/components/context-menu/context-menu.store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EAEb,YAAY,EACZ,iBAAiB,EAClB,MAAM,sBAAsB,CAAC;AAE9B,KAAK,SAAS,GAAG;IACf,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB,GAAG,IAAI,CAAC;AAIT,eAAO,MAAM,gBAAgB;;;;CAI5B,CAAC;AAEF,wBAAgB,uBAAuB,CACrC,QAAQ,SAAS,aAAa,KAC3B,iBAAiB,CAAC,QAAQ,CAAC,CAsF/B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-menu.store.js","names":[],"sources":["../../../src/components/context-menu/context-menu.store.ts"],"sourcesContent":["import { createSignal } from 'solid-js';\nimport type {\n ContextRecord,\n RegistryItem,\n RenderedItem,\n ContextMenuHandle,\n} from './context-menu.types';\n\ntype MenuState = {\n x: number;\n y: number;\n items: RenderedItem[];\n} | null;\n\nconst [menuState, setMenuState] = createSignal<MenuState>(null);\n\nexport const contextMenuStore = {\n menuState,\n close: () => setMenuState(null),\n isOpen: () => menuState() !== null,\n};\n\nexport function createContextMenuHandle
|
|
1
|
+
{"version":3,"file":"context-menu.store.js","names":[],"sources":["../../../src/components/context-menu/context-menu.store.ts"],"sourcesContent":["import { createSignal } from 'solid-js';\nimport type {\n ContextRecord,\n RegistryItem,\n RenderedItem,\n ContextMenuHandle,\n} from './context-menu.types';\n\ntype MenuState = {\n x: number;\n y: number;\n items: RenderedItem[];\n} | null;\n\nconst [menuState, setMenuState] = createSignal<MenuState>(null);\n\nexport const contextMenuStore = {\n menuState,\n close: () => setMenuState(null),\n isOpen: () => menuState() !== null,\n};\n\nexport function createContextMenuHandle<\n TContext extends ContextRecord,\n>(): ContextMenuHandle<TContext> {\n const registry = new Map<string, RegistryItem<TContext>>();\n\n function register(item: RegistryItem<TContext>): void {\n registry.set(item.key, item);\n }\n\n function unregister(key: string): void {\n registry.delete(key);\n }\n\n function buildRenderedItems(ctx: TContext): RenderedItem[] {\n const visible = [...registry.values()]\n .filter(item => !item.when || item.when(ctx))\n .sort((a, b) => (a.order ?? 100) - (b.order ?? 100));\n\n if (visible.length === 0) return [];\n\n const groups: RegistryItem<TContext>[][] = [];\n const groupMap = new Map<string, RegistryItem<TContext>[]>();\n\n for (const item of visible) {\n const g = item.group ?? '__default__';\n if (!groupMap.has(g)) {\n const arr: RegistryItem<TContext>[] = [];\n groupMap.set(g, arr);\n groups.push(arr);\n }\n groupMap.get(g)!.push(item);\n }\n\n const result: RenderedItem[] = [];\n for (let i = 0; i < groups.length; i++) {\n if (i > 0) result.push({ type: 'separator' });\n for (const item of groups[i]) {\n if (item.type === 'item') {\n result.push({\n type: 'item',\n key: item.key,\n label: item.label,\n disabled: item.disabled?.(ctx),\n shortcut: item.shortcut,\n prefixIcon: item.prefixIcon,\n onClick: () => item.onClick(ctx),\n });\n } else {\n result.push({\n type: 'submenu',\n key: item.key,\n label: item.label,\n disabled: item.disabled?.(ctx),\n shortcut: item.shortcut,\n prefixIcon: item.prefixIcon,\n\n items: item.items\n .filter(sub => !sub.when || sub.when(ctx))\n .map(sub => {\n if (sub.type === 'item') {\n return {\n type: 'item' as const,\n key: sub.key,\n label: sub.label,\n disabled: sub.disabled?.(ctx),\n shortcut: sub.shortcut,\n prefixIcon: sub.prefixIcon,\n onClick: () => sub.onClick(ctx),\n };\n }\n return { type: 'separator' as const };\n }),\n });\n }\n }\n }\n return result;\n }\n\n function trigger(e: MouseEvent, ctx: TContext): void {\n e.preventDefault();\n e.stopPropagation();\n const items = buildRenderedItems(ctx);\n if (items.length === 0) return;\n setMenuState({ x: e.clientX, y: e.clientY, items });\n }\n\n return { register, unregister, trigger };\n}\n"],"mappings":"wCAcA,GAAM,CAAC,EAAW,GAAgB,EAAwB,KAAK,CAElD,EAAmB,CAC9B,YACA,UAAa,EAAa,KAAK,CAC/B,WAAc,GAAW,GAAK,KAC/B,CAED,SAAgB,GAEiB,CAC/B,IAAM,EAAW,IAAI,IAErB,SAAS,EAAS,EAAoC,CACpD,EAAS,IAAI,EAAK,IAAK,EAAK,CAG9B,SAAS,EAAW,EAAmB,CACrC,EAAS,OAAO,EAAI,CAGtB,SAAS,EAAmB,EAA+B,CACzD,IAAM,EAAU,CAAC,GAAG,EAAS,QAAQ,CAAC,CACnC,OAAO,GAAQ,CAAC,EAAK,MAAQ,EAAK,KAAK,EAAI,CAAC,CAC5C,MAAM,EAAG,KAAO,EAAE,OAAS,MAAQ,EAAE,OAAS,KAAK,CAEtD,GAAI,EAAQ,SAAW,EAAG,MAAO,EAAE,CAEnC,IAAM,EAAqC,EAAE,CACvC,EAAW,IAAI,IAErB,IAAK,IAAM,KAAQ,EAAS,CAC1B,IAAM,EAAI,EAAK,OAAS,cACxB,GAAI,CAAC,EAAS,IAAI,EAAE,CAAE,CACpB,IAAM,EAAgC,EAAE,CACxC,EAAS,IAAI,EAAG,EAAI,CACpB,EAAO,KAAK,EAAI,CAElB,EAAS,IAAI,EAAE,CAAE,KAAK,EAAK,CAG7B,IAAM,EAAyB,EAAE,CACjC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAO,OAAQ,IAAK,CAClC,EAAI,GAAG,EAAO,KAAK,CAAE,KAAM,YAAa,CAAC,CAC7C,IAAK,IAAM,KAAQ,EAAO,GACpB,EAAK,OAAS,OAChB,EAAO,KAAK,CACV,KAAM,OACN,IAAK,EAAK,IACV,MAAO,EAAK,MACZ,SAAU,EAAK,WAAW,EAAI,CAC9B,SAAU,EAAK,SACf,WAAY,EAAK,WACjB,YAAe,EAAK,QAAQ,EAAI,CACjC,CAAC,CAEF,EAAO,KAAK,CACV,KAAM,UACN,IAAK,EAAK,IACV,MAAO,EAAK,MACZ,SAAU,EAAK,WAAW,EAAI,CAC9B,SAAU,EAAK,SACf,WAAY,EAAK,WAEjB,MAAO,EAAK,MACT,OAAO,GAAO,CAAC,EAAI,MAAQ,EAAI,KAAK,EAAI,CAAC,CACzC,IAAI,GACC,EAAI,OAAS,OACR,CACL,KAAM,OACN,IAAK,EAAI,IACT,MAAO,EAAI,MACX,SAAU,EAAI,WAAW,EAAI,CAC7B,SAAU,EAAI,SACd,WAAY,EAAI,WAChB,YAAe,EAAI,QAAQ,EAAI,CAChC,CAEI,CAAE,KAAM,YAAsB,CACrC,CACL,CAAC,CAIR,OAAO,EAGT,SAAS,EAAQ,EAAe,EAAqB,CACnD,EAAE,gBAAgB,CAClB,EAAE,iBAAiB,CACnB,IAAM,EAAQ,EAAmB,EAAI,CACjC,EAAM,SAAW,GACrB,EAAa,CAAE,EAAG,EAAE,QAAS,EAAG,EAAE,QAAS,QAAO,CAAC,CAGrD,MAAO,CAAE,WAAU,aAAY,UAAS"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-menu.types.d.ts","sourceRoot":"","sources":["../../../src/components/context-menu/context-menu.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEpD,KAAK,gBAAgB,CAAC,QAAQ,SAAS,aAAa,IAAI;
|
|
1
|
+
{"version":3,"file":"context-menu.types.d.ts","sourceRoot":"","sources":["../../../src/components/context-menu/context-menu.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEpD,KAAK,gBAAgB,CAAC,QAAQ,SAAS,aAAa,IAAI;IACtD,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IAEd,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,KAAK,OAAO,CAAC;IAClC,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,KAAK,OAAO,CAAC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,UAAU,CAAC;IAExB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,kBAAkB,CAAC,QAAQ,SAAS,aAAa,IAAI,gBAAgB,CAAC,QAAQ,CAAC,GAAG;IAC5F,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,CAAC,GAAG,EAAE,QAAQ,KAAK,IAAI,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,mBAAmB,CAAC,QAAQ,SAAS,aAAa,IAAI,gBAAgB,CAAC,QAAQ,CAAC,GAAG;IAC7F,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,YAAY,CAAC,QAAQ,SAAS,aAAa,IACnD,kBAAkB,CAAC,QAAQ,CAAC,GAC5B,mBAAmB,CAAC,QAAQ,CAAC,CAAC;AAElC,KAAK,gBAAgB,GAAG;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,gBAAgB,GAAG;IAClD,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,gBAAgB,GAAG;IACnD,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,CAAC;AAEtD,MAAM,MAAM,YAAY,GAAG,kBAAkB,GAAG,mBAAmB,GAAG,iBAAiB,CAAC;AAExF,MAAM,MAAM,iBAAiB,CAAC,QAAQ,SAAS,aAAa,IAAI;IAC9D,QAAQ,EAAE,CAAC,IAAI,EAAE,YAAY,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;IAEjD,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAElC,OAAO,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,QAAQ,KAAK,IAAI,CAAC;CACjD,CAAC;AAEF,MAAM,MAAM,gBAAgB,CAAC,QAAQ,SAAS,aAAa,GAAG,GAAG,IAAI;IACnE,MAAM,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACpC,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,GAAG,MAAM,GAAG,WAAW,GAAG,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;CAC/E,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"divider.d.ts","sourceRoot":"","sources":["../../../src/components/divider/divider.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAc,eAAe,EAAQ,MAAM,UAAU,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAS/C,QAAA,MAAM,OAAO,EAAE,eAAe,CAAC,YAAY,
|
|
1
|
+
{"version":3,"file":"divider.d.ts","sourceRoot":"","sources":["../../../src/components/divider/divider.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAc,eAAe,EAAQ,MAAM,UAAU,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAS/C,QAAA,MAAM,OAAO,EAAE,eAAe,CAAC,YAAY,CA2E1C,CAAC;AAEF,OAAO,EAAE,OAAO,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"divider.js","names":["cn","getColor","mergeProps","ParentComponent","Show","DividerProps","thicknessClass","Record","NonNullable","Divider","p","orientation","const","variant","align","thickness","color","isVertical","lineClass","class","line","_$createComponent","when","children","fallback","_el$5","_tmpl$2","_$effect","_p$","_v$6","_v$7","root","e","_$setAttribute","t","_$className","undefined","_el$","_tmpl$","_el$2","firstChild","_el$3","nextSibling","_el$4","_$insert","_v$","_v$2","_v$3","_v$4","content","_v$5","a","o","i"],"sources":["../../../src/components/divider/divider.tsx"],"sourcesContent":["import { cn } from '@/utils/cn';\nimport { getColor } from '@utils/helper';\nimport { mergeProps, ParentComponent, Show } from 'solid-js';\nimport { DividerProps } from './divider.types';\n\nconst thicknessClass: Record<NonNullable<DividerProps['thickness']>, string> = {\n 1: 'border-px',\n 2: 'border-[2px]',\n 3: 'border-[3px]',\n 4: 'border-[4px]',\n};\n\nconst Divider: ParentComponent<DividerProps> = p => {\n p = mergeProps(\n {\n orientation: 'horizontal' as const,\n variant: 'solid' as const,\n align: 'center' as const,\n thickness: 1 as const,\n color: 'secondary' as const,\n },\n p,\n );\n\n const isVertical = () => p.orientation === 'vertical';\n\n const lineClass = () =>\n cn(\n p.color ? 'divi3' : 'divi4',\n isVertical() ? 'border-l' : 'border-t',\n thicknessClass[p.thickness!],\n p.variant === 'dashed' && 'border-dashed',\n p.variant === 'dotted' && 'border-dotted',\n p.class?.line,\n );\n\n return (\n <Show\n when={!!p.children}\n fallback={\n
|
|
1
|
+
{"version":3,"file":"divider.js","names":["cn","getColor","mergeProps","ParentComponent","Show","DividerProps","thicknessClass","Record","NonNullable","Divider","p","orientation","const","variant","align","thickness","color","isVertical","lineClass","class","line","_$createComponent","when","children","fallback","_el$5","_tmpl$2","_$effect","_p$","_v$6","_v$7","root","e","_$setAttribute","t","_$className","undefined","_el$","_tmpl$","_el$2","firstChild","_el$3","nextSibling","_el$4","_$insert","_v$","_v$2","_v$3","_v$4","content","_v$5","a","o","i"],"sources":["../../../src/components/divider/divider.tsx"],"sourcesContent":["import { cn } from '@/utils/cn';\nimport { getColor } from '@utils/helper';\nimport { mergeProps, ParentComponent, Show } from 'solid-js';\nimport { DividerProps } from './divider.types';\n\nconst thicknessClass: Record<NonNullable<DividerProps['thickness']>, string> = {\n 1: 'border-px',\n 2: 'border-[2px]',\n 3: 'border-[3px]',\n 4: 'border-[4px]',\n};\n\nconst Divider: ParentComponent<DividerProps> = p => {\n p = mergeProps(\n {\n orientation: 'horizontal' as const,\n variant: 'solid' as const,\n align: 'center' as const,\n thickness: 1 as const,\n color: 'secondary' as const,\n },\n p,\n );\n\n const isVertical = () => p.orientation === 'vertical';\n\n const lineClass = () =>\n cn(\n p.color ? 'divi3' : 'divi4',\n isVertical() ? 'border-l' : 'border-t',\n thicknessClass[p.thickness!],\n p.variant === 'dashed' && 'border-dashed',\n p.variant === 'dotted' && 'border-dotted',\n p.class?.line,\n );\n\n return (\n <Show\n when={!!p.children}\n fallback={\n <hr\n role=\"separator\"\n aria-orientation={p.orientation}\n class={cn(\n 'divi1',\n p.color ? 'divi3' : 'divi4',\n isVertical() ? 'h-auto self-stretch border-l' : 'w-full border-t',\n thicknessClass[p.thickness!],\n p.variant === 'dashed' && 'border-dashed',\n p.variant === 'dotted' && 'border-dotted',\n getColor(p.color),\n p.class?.root,\n )}\n />\n }\n >\n <div\n role=\"separator\"\n aria-orientation={p.orientation}\n class={cn(\n 'divi2',\n isVertical() ? 'flex-col self-stretch' : 'w-full flex-row',\n getColor(p.color),\n p.class?.root,\n )}\n >\n <div\n class={cn(lineClass(), p.align === 'center' || p.align === 'end' ? 'flex-1' : 'w-4')}\n />\n\n <span\n class={cn(\n 'divi5',\n p.color ? 'divi6' : 'divi7',\n isVertical() ? 'py-3' : 'px-3',\n p.class?.content,\n )}\n >\n {p.children}\n </span>\n\n <div\n class={cn(lineClass(), p.align === 'center' || p.align === 'start' ? 'flex-1' : 'w-4')}\n />\n </div>\n </Show>\n );\n};\n\nexport { Divider };\n"],"mappings":"sVAKMM,EAAyE,CAC7E,EAAG,YACH,EAAG,eACH,EAAG,eACH,EAAG,eACJ,CAEKG,EAAyCC,GAAK,CAClDA,EAAIR,EACF,CACES,YAAa,aACbE,QAAS,QACTC,MAAO,SACPC,UAAW,EACXC,MAAO,YACR,CACDN,EACD,CAED,IAAMO,MAAmBP,EAAEC,cAAgB,WAErCO,MACJlB,EACEU,EAAEM,MAAQ,QAAU,QACpBC,GAAY,CAAG,WAAa,WAC5BX,EAAeI,EAAEK,WACjBL,EAAEG,UAAY,UAAY,gBAC1BH,EAAEG,UAAY,UAAY,gBAC1BH,EAAES,OAAOC,KACV,CAEH,OAAAC,EACGjB,EAAI,CAAA,IACHkB,MAAI,CAAA,MAAE,CAAC,CAACZ,EAAEa,UAAQ,IAClBC,UAAQ,CAAA,WAAA,CAAA,IAAAC,EAAAC,GAAA,CAaH,OAbGC,EAAAC,GAAA,CAAA,IAAAC,EAGcnB,EAAEC,YAAWmB,EACxB9B,EACL,QACAU,EAAEM,MAAQ,QAAU,QACpBC,GAAY,CAAG,+BAAiC,kBAChDX,EAAeI,EAAEK,WACjBL,EAAEG,UAAY,UAAY,gBAC1BH,EAAEG,UAAY,UAAY,gBAC1BZ,EAASS,EAAEM,MAAM,CACjBN,EAAES,OAAOY,KACV,CAAA,OAAAF,IAAAD,EAAAI,GAAAC,EAAAR,EAAA,mBAAAG,EAAAI,EAAAH,EAAA,CAAAC,IAAAF,EAAAM,GAAAC,EAAAV,EAAAG,EAAAM,EAAAJ,EAAA,CAAAF,GAAA,CAAAI,EAAAI,IAAAA,GAAAF,EAAAE,IAAAA,GAAA,CAAA,CAAAX,KAAA,EAAA,IAAAF,UAAA,CAAA,IAAAc,EAAAC,GAAA,CAAAC,EAAAF,EAAAG,WAAAC,EAAAF,EAAAG,YAAAC,EAAAF,EAAAC,YA8BqF,OA9BrFE,EAAAH,MA0BA/B,EAAEa,SAAQ,CAAAI,EAAAC,GAAA,CAAA,IAAAiB,EApBKnC,EAAEC,YAAWmC,EACxB9C,EACL,QACAiB,GAAY,CAAG,wBAA0B,kBACzChB,EAASS,EAAEM,MAAM,CACjBN,EAAES,OAAOY,KACV,CAAAgB,EAGQ/C,EAAGkB,GAAW,CAAER,EAAEI,QAAU,UAAYJ,EAAEI,QAAU,MAAQ,SAAW,MAAM,CAAAkC,EAI7EhD,EACL,QACAU,EAAEM,MAAQ,QAAU,QACpBC,GAAY,CAAG,OAAS,OACxBP,EAAES,OAAO8B,QACV,CAAAC,EAMMlD,EAAGkB,GAAW,CAAER,EAAEI,QAAU,UAAYJ,EAAEI,QAAU,QAAU,SAAW,MAAM,CAAA,OAAA+B,IAAAjB,EAAAI,GAAAC,EAAAI,EAAA,mBAAAT,EAAAI,EAAAa,EAAA,CAAAC,IAAAlB,EAAAM,GAAAC,EAAAE,EAAAT,EAAAM,EAAAY,EAAA,CAAAC,IAAAnB,EAAAuB,GAAAhB,EAAAI,EAAAX,EAAAuB,EAAAJ,EAAA,CAAAC,IAAApB,EAAAwB,GAAAjB,EAAAM,EAAAb,EAAAwB,EAAAJ,EAAA,CAAAE,IAAAtB,EAAAyB,GAAAlB,EAAAQ,EAAAf,EAAAyB,EAAAH,EAAA,CAAAtB,GAAA,CAAAI,EAAAI,IAAAA,GAAAF,EAAAE,IAAAA,GAAAe,EAAAf,IAAAA,GAAAgB,EAAAhB,IAAAA,GAAAiB,EAAAjB,IAAAA,GAAA,CAAA,CAAAC,GAAA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"divider.types.d.ts","sourceRoot":"","sources":["../../../src/components/divider/divider.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAExC,MAAM,MAAM,kBAAkB,GAAG,YAAY,GAAG,UAAU,CAAC;AAC3D,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAC3D,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;AAEtD,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAEtD,MAAM,MAAM,YAAY,GAAG;
|
|
1
|
+
{"version":3,"file":"divider.types.d.ts","sourceRoot":"","sources":["../../../src/components/divider/divider.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAExC,MAAM,MAAM,kBAAkB,GAAG,YAAY,GAAG,UAAU,CAAC;AAC3D,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAC3D,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;AAEtD,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAEtD,MAAM,MAAM,YAAY,GAAG;IACzB,WAAW,CAAC,EAAE,kBAAkB,CAAC;IAEjC,OAAO,CAAC,EAAE,cAAc,CAAC;IAEzB,KAAK,CAAC,EAAE,YAAY,CAAC;IAErB,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAE1B,KAAK,CAAC,EAAE,cAAc,CAAC;IAEvB,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;IAE7C,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC;CACxB,CAAC"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export { Divider } from './divider';
|
|
2
|
-
export type { DividerProps, DividerOrientation, DividerVariant, DividerAlign } from './divider.types';
|
|
2
|
+
export type { DividerProps, DividerOrientation, DividerVariant, DividerAlign, } from './divider.types';
|
|
3
3
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/divider/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/divider/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EACV,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,YAAY,GACb,MAAM,iBAAiB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drawer.types.d.ts","sourceRoot":"","sources":["../../../src/components/drawer/drawer.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAExC,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC;AAElE,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"drawer.types.d.ts","sourceRoot":"","sources":["../../../src/components/drawer/drawer.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAExC,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC;AAElE,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CACb,MAAM,CAAC,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,aAAa,EAAE,MAAM,CAAC,CACnF,CAAC;CACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dropdown.store.js","names":[],"sources":["../../../src/components/dropdown/dropdown.store.ts"],"sourcesContent":["import { createSignal } from 'solid-js';\n\nconst [openIds, setOpenIds] = createSignal<ReadonlySet<string>>(new Set(), { equals: false });\n\nexport const dropdownStore = {\n openIds,\n open: (id: string) =>\n setOpenIds(prev => {\n if (prev.has(id)) return prev;\n const next = new Set(prev);\n next.add(id);\n return next;\n }),\n close: (id: string) =>\n setOpenIds(prev => {\n if (!prev.has(id)) return prev;\n const next = new Set(prev);\n next.delete(id);\n return next;\n }),\n closeAll: () => setOpenIds(new Set<string>()),\n isOpen: (id: string) => openIds().has(id),\n}
|
|
1
|
+
{"version":3,"file":"dropdown.store.js","names":[],"sources":["../../../src/components/dropdown/dropdown.store.ts"],"sourcesContent":["import { createSignal } from 'solid-js';\n\nconst [openIds, setOpenIds] = createSignal<ReadonlySet<string>>(new Set(), { equals: false });\n\nexport const dropdownStore = {\n openIds,\n open: (id: string) =>\n setOpenIds(prev => {\n if (prev.has(id)) return prev;\n const next = new Set(prev);\n next.add(id);\n return next;\n }),\n close: (id: string) =>\n setOpenIds(prev => {\n if (!prev.has(id)) return prev;\n const next = new Set(prev);\n next.delete(id);\n return next;\n }),\n closeAll: () => setOpenIds(new Set<string>()),\n isOpen: (id: string) => openIds().has(id),\n};\n"],"mappings":"wCAEA,GAAM,CAAC,EAAS,GAAc,EAAkC,IAAI,IAAO,CAAE,OAAQ,GAAO,CAAC,CAEhF,EAAgB,CAC3B,UACA,KAAO,GACL,EAAW,GAAQ,CACjB,GAAI,EAAK,IAAI,EAAG,CAAE,OAAO,EACzB,IAAM,EAAO,IAAI,IAAI,EAAK,CAE1B,OADA,EAAK,IAAI,EAAG,CACL,GACP,CACJ,MAAQ,GACN,EAAW,GAAQ,CACjB,GAAI,CAAC,EAAK,IAAI,EAAG,CAAE,OAAO,EAC1B,IAAM,EAAO,IAAI,IAAI,EAAK,CAE1B,OADA,EAAK,OAAO,EAAG,CACR,GACP,CACJ,aAAgB,EAAW,IAAI,IAAc,CAC7C,OAAS,GAAe,GAAS,CAAC,IAAI,EAAG,CAC1C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mansory.d.ts","sourceRoot":"","sources":["../../../src/components/mansory/mansory.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,SAAS,EAYV,MAAM,UAAU,CAAC;AAGlB,OAAO,KAAK,EAGV,YAAY,EAGb,MAAM,iBAAiB,CAAC;AAkKzB,eAAO,MAAM,OAAO,EAAE,SAAS,CAAC,YAAY,
|
|
1
|
+
{"version":3,"file":"mansory.d.ts","sourceRoot":"","sources":["../../../src/components/mansory/mansory.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,SAAS,EAYV,MAAM,UAAU,CAAC;AAGlB,OAAO,KAAK,EAGV,YAAY,EAGb,MAAM,iBAAiB,CAAC;AAkKzB,eAAO,MAAM,OAAO,EAAE,SAAS,CAAC,YAAY,CA+V3C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mansory.js","names":["Accessor","Component","createEffect","createMemo","createRoot","createSignal","For","mergeProps","on","onCleanup","onMount","Show","untrack","cn","createThrottle","MansoryBreakpoint","MansoryItemLayout","MansoryProps","MansoryResponsive","MansoryVirtualOptions","BREAKPOINTS","Record","Exclude","sm","md","lg","xl","BP_KEYS","const","DEFAULT_COLUMNS","default","DEFAULT_GAP","GAP_CACHE_MAX","gapCache","Map","resolveResponsive","config","T","containerWidth","Array","isArray","map","i","length","key","undefined","measureGapPx","gapClass","container","HTMLElement","probe","document","createElement","className","style","display","gridTemplateColumns","appendChild","computed","getComputedStyle","gap","parseFloat","columnGap","removeChild","measureGapPxCached","has","get","value","size","firstKey","keys","next","delete","set","computeLayout","itemHeights","columns","gapPx","layouts","totalHeight","sortedByTop","cols","Math","max","totalGap","colWidth","colHeights","fill","minCol","c","left","top","height","item","index","width","push","j","splice","maxH","findFirstVisible","sorted","visTop","lo","hi","mid","MansoryItemProps","getLayoutAccessor","items","itemClass","children","onRegister","el","HTMLDivElement","onUnregister","MansoryItem","props","itemLayout","styles","l","wrapper","child","widthPx","transform","_el$","_tmpl$","_$use","unregisterItem","_$insert","_$effect","_p$","_v$","_v$2","_v$3","e","_$setAttribute","t","_$className","a","_$style","Mansory","rawProps","virtual","estimateItemHeight","loadMoreThreshold","containerEl","innerEl","setContainerWidth","setItemHeights","currentColumns","resolved","currentGapClass","setGapPx","trackGapClass","_","layout","layoutAccessors","layoutSetters","v","layoutDisposers","getOrCreateLayoutAccessor","layoutSignalRoot","dispose","initialValue","equals","b","disposeLayoutSignal","disposeAllLayoutSignals","values","clear","keyEntryCache","syncLayoutSetters","newLayouts","setter","virtualOpts","overscan","isVirtual","scrollTop","setScrollTop","rafId","pendingScrollTop","loadMoreCooldown","loadMoreTimer","ReturnType","setTimeout","pendingItemChanges","flushItemHeights","applyItemHeightChanges","snapshot","prev","hasChange","idx","h","cancelFlushItemHeights","cancel","itemRO","ResizeObserver","entries","entry","target","parseInt","dataset","mansoryIdx","contentBoxSize","blockSize","contentRect","disconnectItemResizeObserver","disconnect","applyContainerWidth","applyContainerWidthChange","containerRO","inlineSize","observe","disconnectContainerResizeObserver","itemElMap","registerItem","unobserve","len","prevLen","slice","checkLoadMore","currentScrollTop","onLoadMore","scrollHeight","clientHeight","clearTimeout","clearLoadMoreTimer","cancelPendingRaf","cancelAnimationFrame","handleScroll","requestAnimationFrame","allIndices","renderedIndices","viewportHeight","overscanPx","visBottom","start","indices","renderedKeys","getItemKey","activeKeys","Set","add","k","_el$2","_tmpl$3","_el$3","firstChild","_$addEventListener","_ref$","_ref$2","_$createComponent","each","when","_tmpl$2","_v$4","class","_v$5","_$setStyleProperty"],"sources":["../../../src/components/mansory/mansory.tsx"],"sourcesContent":["import {\n Accessor,\n Component,\n createEffect,\n createMemo,\n createRoot,\n createSignal,\n For,\n mergeProps,\n on,\n onCleanup,\n onMount,\n Show,\n untrack,\n} from 'solid-js';\nimport { cn } from '@utils/cn';\nimport { createThrottle } from '@utils/helper';\nimport type {\n MansoryBreakpoint,\n MansoryItemLayout,\n MansoryProps,\n MansoryResponsive,\n MansoryVirtualOptions,\n} from './mansory.types';\n\nconst BREAKPOINTS: Record<Exclude<MansoryBreakpoint, 'default'>, number> = {\n sm: 640,\n md: 768,\n lg: 1024,\n xl: 1280,\n '2xl': 1536,\n};\n\nconst BP_KEYS = ['sm', 'md', 'lg', 'xl', '2xl'] as const;\n\nconst DEFAULT_COLUMNS: MansoryResponsive<number> = {\n default: 1,\n sm: 2,\n md: 3,\n lg: 4,\n};\n\nconst DEFAULT_GAP = 'gap-4';\n\nconst GAP_CACHE_MAX = 50;\nconst gapCache = new Map<string, number>();\n\nfunction resolveResponsive<T>(config: T | MansoryResponsive<T>, containerWidth: number): T {\n if (typeof config !== 'object' || config === null || Array.isArray(config)) {\n return config as T;\n }\n\n const map = config as MansoryResponsive<T>;\n\n for (let i = BP_KEYS.length - 1; i >= 0; i--) {\n const key = BP_KEYS[i];\n if (containerWidth >= BREAKPOINTS[key] && map[key] !== undefined) {\n return map[key] as T;\n }\n }\n\n return (map.default ?? (typeof config === 'object' ? undefined : config)) as T;\n}\n\nfunction measureGapPx(gapClass: string, container: HTMLElement): number {\n const probe = document.createElement('div');\n probe.className = `ma06 ${gapClass}`;\n probe.style.display = 'grid';\n probe.style.gridTemplateColumns = '1fr 1fr';\n\n probe.appendChild(document.createElement('div'));\n probe.appendChild(document.createElement('div'));\n container.appendChild(probe);\n const computed = getComputedStyle(probe);\n const gap = parseFloat(computed.columnGap || computed.gap || '0');\n container.removeChild(probe);\n return gap;\n}\n\nfunction measureGapPxCached(gapClass: string, container: HTMLElement): number {\n if (gapCache.has(gapClass)) return gapCache.get(gapClass)!;\n const value = measureGapPx(gapClass, container);\n\n if (gapCache.size >= GAP_CACHE_MAX) {\n const firstKey = gapCache.keys().next().value;\n if (firstKey !== undefined) gapCache.delete(firstKey);\n }\n gapCache.set(gapClass, value);\n return value;\n}\n\nfunction computeLayout(\n itemHeights: number[],\n columns: number,\n containerWidth: number,\n gapPx: number,\n): { layouts: MansoryItemLayout[]; totalHeight: number; sortedByTop: MansoryItemLayout[] } {\n const cols = Math.max(1, columns);\n const totalGap = gapPx * (cols - 1);\n const colWidth = (containerWidth - totalGap) / cols;\n\n const colHeights = new Array<number>(cols).fill(0);\n const layouts: MansoryItemLayout[] = [];\n\n const sortedByTop: MansoryItemLayout[] = [];\n\n for (let i = 0; i < itemHeights.length; i++) {\n let minCol = 0;\n for (let c = 1; c < cols; c++) {\n if (colHeights[c] < colHeights[minCol]) minCol = c;\n }\n\n const left = minCol * (colWidth + gapPx);\n const top = colHeights[minCol];\n const height = itemHeights[i] ?? 0;\n\n const item: MansoryItemLayout = { index: i, top, left, width: colWidth, height };\n layouts.push(item);\n\n let j = sortedByTop.length - 1;\n while (j >= 0 && sortedByTop[j].top > top) j--;\n sortedByTop.splice(j + 1, 0, item);\n\n colHeights[minCol] = top + height + gapPx;\n }\n\n let maxH = 0;\n for (let i = 0; i < colHeights.length; i++) {\n if (colHeights[i] > maxH) maxH = colHeights[i];\n }\n\n return { layouts, totalHeight: maxH > 0 ? maxH - gapPx : 0, sortedByTop };\n}\n\nfunction findFirstVisible(sorted: MansoryItemLayout[], visTop: number): number {\n let lo = 0,\n hi = sorted.length;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (sorted[mid].top + sorted[mid].height < visTop) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n}\n\ninterface MansoryItemProps {\n index: number;\n getLayoutAccessor: (index: number) => Accessor<MansoryItemLayout | undefined>;\n items: unknown[];\n itemClass?: string;\n children: MansoryProps['children'];\n onRegister: (index: number, el: HTMLDivElement) => void;\n onUnregister: (index: number) => void;\n}\n\nconst MansoryItem: Component<MansoryItemProps> = props => {\n const itemLayout = props.getLayoutAccessor(props.index);\n\n const styles = createMemo(() => {\n const l = itemLayout();\n if (!l) return { wrapper: {} as Record<string, string>, child: {} as Record<string, string> };\n const widthPx = `${l.width}px`;\n return {\n wrapper: { width: widthPx, transform: `translate3d(${l.left}px, ${l.top}px, 0)` },\n child: { width: widthPx },\n };\n });\n\n return (\n <div\n ref={el => {\n props.onRegister(props.index, el);\n onCleanup(function unregisterItem() {\n props.onUnregister(props.index);\n });\n }}\n data-mansory-idx={props.index}\n class={cn('ma03 ma04', props.itemClass)}\n style={styles().wrapper}\n >\n {props.children(props.items[props.index], () => props.index, styles().child)}\n </div>\n );\n};\n\nexport const Mansory: Component<MansoryProps> = rawProps => {\n const props = mergeProps(\n {\n columns: DEFAULT_COLUMNS,\n gap: DEFAULT_GAP,\n virtual: false as boolean | MansoryVirtualOptions,\n estimateItemHeight: 200,\n loadMoreThreshold: 200,\n },\n rawProps,\n );\n\n let containerEl!: HTMLDivElement;\n let innerEl!: HTMLDivElement;\n\n const [containerWidth, setContainerWidth] = createSignal(0);\n const [itemHeights, setItemHeights] = createSignal<number[]>([]);\n\n const currentColumns = createMemo(() => {\n const resolved = resolveResponsive<number>(props.columns as number, containerWidth());\n return Math.max(1, resolved ?? 1);\n });\n\n const currentGapClass = createMemo(() => {\n const resolved = resolveResponsive<string>(props.gap as string, containerWidth());\n return resolved ?? 'gap-4';\n });\n\n const [gapPx, setGapPx] = createSignal(16);\n\n createEffect(function trackGapClass() {\n const _ = currentGapClass();\n if (containerEl) {\n setGapPx(measureGapPxCached(currentGapClass(), containerEl));\n }\n });\n\n const layout = createMemo(() =>\n computeLayout(itemHeights(), currentColumns(), containerWidth(), gapPx()),\n );\n\n const totalHeight = createMemo(() => layout().totalHeight);\n\n const layoutAccessors = new Map<number, Accessor<MansoryItemLayout | undefined>>();\n const layoutSetters = new Map<number, (v: MansoryItemLayout | undefined) => void>();\n const layoutDisposers = new Map<number, () => void>();\n\n function getOrCreateLayoutAccessor(index: number): Accessor<MansoryItemLayout | undefined> {\n if (!layoutAccessors.has(index)) {\n\n createRoot(function layoutSignalRoot(dispose) {\n layoutDisposers.set(index, dispose);\n const initialValue = untrack(() => layout().layouts[index]);\n const [get, set] = createSignal<MansoryItemLayout | undefined>(initialValue, {\n equals: (a, b) => {\n if (a === b) return true;\n if (!a || !b) return false;\n return (\n a.top === b.top && a.left === b.left && a.width === b.width && a.height === b.height\n );\n },\n });\n layoutAccessors.set(index, get);\n layoutSetters.set(index, set);\n });\n }\n return layoutAccessors.get(index)!;\n }\n\n function disposeLayoutSignal(index: number) {\n layoutDisposers.get(index)?.();\n layoutDisposers.delete(index);\n layoutAccessors.delete(index);\n layoutSetters.delete(index);\n }\n\n onCleanup(function disposeAllLayoutSignals() {\n for (const dispose of layoutDisposers.values()) dispose();\n layoutDisposers.clear();\n layoutAccessors.clear();\n layoutSetters.clear();\n keyEntryCache.clear();\n });\n\n createEffect(function syncLayoutSetters() {\n const newLayouts = layout().layouts;\n\n for (const [index, setter] of layoutSetters) {\n setter(newLayouts[index]);\n }\n });\n\n const virtualOpts = createMemo<MansoryVirtualOptions | null>(() => {\n const v = props.virtual;\n if (!v) return null;\n if (v === true) return { overscan: 5 };\n return { overscan: v.overscan ?? 5 };\n });\n\n const isVirtual = createMemo(() => virtualOpts() !== null);\n\n const [scrollTop, setScrollTop] = createSignal(0);\n\n let rafId: number | null = null;\n let pendingScrollTop = 0;\n\n let loadMoreCooldown = false;\n let loadMoreTimer: ReturnType<typeof setTimeout> | null = null;\n\n const pendingItemChanges = new Map<number, number>();\n\n const flushItemHeights = createThrottle(function applyItemHeightChanges() {\n if (pendingItemChanges.size === 0) return;\n const snapshot = new Map(pendingItemChanges);\n pendingItemChanges.clear();\n\n setItemHeights(prev => {\n let hasChange = false;\n for (const [idx, h] of snapshot) {\n if (prev[idx] !== h) {\n hasChange = true;\n break;\n }\n }\n if (!hasChange) return prev;\n\n const next = [...prev];\n for (const [idx, h] of snapshot) next[idx] = h;\n return next;\n });\n }, 100);\n\n onCleanup(function cancelFlushItemHeights() {\n flushItemHeights.cancel();\n });\n\n const itemRO = new ResizeObserver(entries => {\n for (const entry of entries) {\n const el = entry.target as HTMLDivElement;\n const idx = parseInt(el.dataset.mansoryIdx ?? '-1', 10);\n if (idx < 0) continue;\n\n const h = entry.contentBoxSize?.[0]?.blockSize ?? entry.contentRect.height;\n pendingItemChanges.set(idx, h);\n }\n\n flushItemHeights();\n });\n\n onCleanup(function disconnectItemResizeObserver() {\n itemRO.disconnect();\n });\n\n onMount(() => {\n const applyContainerWidth = createThrottle(function applyContainerWidthChange(width: number) {\n setContainerWidth(width);\n }, 100);\n\n const containerRO = new ResizeObserver(entries => {\n for (const entry of entries) {\n const width = entry.contentBoxSize?.[0]?.inlineSize ?? entry.contentRect.width;\n applyContainerWidth(width);\n }\n });\n containerRO.observe(containerEl);\n onCleanup(function disconnectContainerResizeObserver() {\n applyContainerWidth.cancel();\n containerRO.disconnect();\n });\n });\n\n const itemElMap = new Map<number, HTMLDivElement>();\n\n function registerItem(index: number, el: HTMLDivElement) {\n itemElMap.set(index, el);\n itemRO.observe(el);\n }\n\n function unregisterItem(index: number) {\n const el = itemElMap.get(index);\n if (el) {\n itemRO.unobserve(el);\n itemElMap.delete(index);\n }\n }\n\n createEffect(\n on(\n () => props.items.length,\n len => {\n setItemHeights(prev => {\n const prevLen = prev.length;\n if (prevLen === len) return prev;\n\n if (len > prevLen) {\n const next = [...prev];\n for (let i = prevLen; i < len; i++) next.push(props.estimateItemHeight);\n return next;\n }\n\n for (let i = len; i < prevLen; i++) {\n disposeLayoutSignal(i);\n }\n return prev.slice(0, len);\n });\n },\n ),\n );\n\n function checkLoadMore(currentScrollTop: number) {\n if (!props.onLoadMore || loadMoreCooldown) return;\n const { scrollHeight, clientHeight } = containerEl;\n if (currentScrollTop + clientHeight >= scrollHeight - props.loadMoreThreshold) {\n loadMoreCooldown = true;\n\n if (loadMoreTimer) clearTimeout(loadMoreTimer);\n loadMoreTimer = setTimeout(() => {\n loadMoreCooldown = false;\n loadMoreTimer = null;\n }, 10_000);\n props.onLoadMore();\n }\n }\n\n createEffect(\n on(\n () => props.items.length,\n () => {\n if (loadMoreTimer) {\n clearTimeout(loadMoreTimer);\n loadMoreTimer = null;\n }\n loadMoreCooldown = false;\n },\n ),\n );\n\n onCleanup(function clearLoadMoreTimer() {\n if (loadMoreTimer) clearTimeout(loadMoreTimer);\n });\n\n onCleanup(function cancelPendingRaf() {\n if (rafId !== null) cancelAnimationFrame(rafId);\n });\n\n function handleScroll() {\n pendingScrollTop = containerEl.scrollTop;\n\n if (rafId === null) {\n rafId = requestAnimationFrame(() => {\n rafId = null;\n setScrollTop(pendingScrollTop);\n checkLoadMore(pendingScrollTop);\n });\n }\n }\n\n const allIndices = createMemo<number[]>((prev = []) => {\n const len = props.items.length;\n if (len === prev.length) return prev;\n if (len > prev.length) {\n const next = [...prev];\n for (let i = prev.length; i < len; i++) next.push(i);\n return next;\n }\n return prev.slice(0, len);\n });\n\n const renderedIndices = createMemo(() => {\n if (!isVirtual()) {\n return allIndices();\n }\n\n if (containerWidth() === 0) return [];\n\n const currentScrollTop = scrollTop();\n const viewportHeight = containerEl.clientHeight;\n const overscan = virtualOpts()?.overscan ?? 5;\n const overscanPx = overscan * props.estimateItemHeight;\n const visTop = currentScrollTop - overscanPx;\n const visBottom = currentScrollTop + viewportHeight + overscanPx;\n\n const sorted = layout().sortedByTop;\n const start = findFirstVisible(sorted, visTop);\n const indices: number[] = [];\n for (let i = start; i < sorted.length; i++) {\n if (sorted[i].top > visBottom) break;\n indices.push(sorted[i].index);\n }\n return indices;\n });\n\n const keyEntryCache = new Map<string | number, { key: string | number; index: number }>();\n\n const renderedKeys = createMemo(() => {\n const indices = renderedIndices();\n if (!props.getItemKey) return indices;\n\n const activeKeys = new Set<string | number>();\n\n const entries = indices.map(i => {\n const key = props.getItemKey!(props.items[i], i);\n activeKeys.add(key);\n\n let entry = keyEntryCache.get(key);\n if (!entry) {\n entry = { key, index: i };\n keyEntryCache.set(key, entry);\n } else {\n\n entry.index = i;\n }\n return entry;\n });\n\n for (const k of keyEntryCache.keys()) {\n if (!activeKeys.has(k)) keyEntryCache.delete(k);\n }\n\n return entries;\n });\n\n return (\n <div\n ref={containerEl}\n class={cn('ma01', isVirtual() && 'ma05', props.class)}\n onScroll={isVirtual() || props.onLoadMore ? handleScroll : undefined}\n >\n <div ref={innerEl} class=\"ma02\" style={{ height: `${totalHeight()}px` }}>\n <For each={renderedKeys()}>\n {entry => {\n const index = typeof entry === 'number' ? entry : entry.index;\n return (\n <MansoryItem\n index={index}\n getLayoutAccessor={getOrCreateLayoutAccessor}\n items={props.items}\n itemClass={props.itemClass}\n onRegister={registerItem}\n onUnregister={unregisterItem}\n >\n {props.children}\n </MansoryItem>\n );\n }}\n </For>\n </div>\n\n <Show when={props.items.length === 0}>\n <div class=\"ma08\">No items</div>\n </Show>\n </div>\n );\n};"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mansory.js","names":["Accessor","Component","createEffect","createMemo","createRoot","createSignal","For","mergeProps","on","onCleanup","onMount","Show","untrack","cn","createThrottle","MansoryBreakpoint","MansoryItemLayout","MansoryProps","MansoryResponsive","MansoryVirtualOptions","BREAKPOINTS","Record","Exclude","sm","md","lg","xl","BP_KEYS","const","DEFAULT_COLUMNS","default","DEFAULT_GAP","GAP_CACHE_MAX","gapCache","Map","resolveResponsive","config","T","containerWidth","Array","isArray","map","i","length","key","undefined","measureGapPx","gapClass","container","HTMLElement","probe","document","createElement","className","style","display","gridTemplateColumns","appendChild","computed","getComputedStyle","gap","parseFloat","columnGap","removeChild","measureGapPxCached","has","get","value","size","firstKey","keys","next","delete","set","computeLayout","itemHeights","columns","gapPx","layouts","totalHeight","sortedByTop","cols","Math","max","totalGap","colWidth","colHeights","fill","minCol","c","left","top","height","item","index","width","push","j","splice","maxH","findFirstVisible","sorted","visTop","lo","hi","mid","MansoryItemProps","getLayoutAccessor","items","itemClass","children","onRegister","el","HTMLDivElement","onUnregister","MansoryItem","props","itemLayout","styles","l","wrapper","child","widthPx","transform","_el$","_tmpl$","_$use","unregisterItem","_$insert","_$effect","_p$","_v$","_v$2","_v$3","e","_$setAttribute","t","_$className","a","_$style","Mansory","rawProps","virtual","estimateItemHeight","loadMoreThreshold","containerEl","innerEl","setContainerWidth","setItemHeights","currentColumns","resolved","currentGapClass","setGapPx","trackGapClass","_","layout","layoutAccessors","layoutSetters","v","layoutDisposers","getOrCreateLayoutAccessor","layoutSignalRoot","dispose","initialValue","equals","b","disposeLayoutSignal","disposeAllLayoutSignals","values","clear","keyEntryCache","syncLayoutSetters","newLayouts","setter","virtualOpts","overscan","isVirtual","scrollTop","setScrollTop","rafId","pendingScrollTop","loadMoreCooldown","loadMoreTimer","ReturnType","setTimeout","pendingItemChanges","flushItemHeights","applyItemHeightChanges","snapshot","prev","hasChange","idx","h","cancelFlushItemHeights","cancel","itemRO","ResizeObserver","entries","entry","target","parseInt","dataset","mansoryIdx","contentBoxSize","blockSize","contentRect","disconnectItemResizeObserver","disconnect","applyContainerWidth","applyContainerWidthChange","containerRO","inlineSize","observe","disconnectContainerResizeObserver","itemElMap","registerItem","unobserve","len","prevLen","slice","checkLoadMore","currentScrollTop","onLoadMore","scrollHeight","clientHeight","clearTimeout","clearLoadMoreTimer","cancelPendingRaf","cancelAnimationFrame","handleScroll","requestAnimationFrame","allIndices","renderedIndices","viewportHeight","overscanPx","visBottom","start","indices","renderedKeys","getItemKey","activeKeys","Set","add","k","_el$2","_tmpl$3","_el$3","firstChild","_$addEventListener","_ref$","_ref$2","_$createComponent","each","when","_tmpl$2","_v$4","class","_v$5","_$setStyleProperty"],"sources":["../../../src/components/mansory/mansory.tsx"],"sourcesContent":["import {\n Accessor,\n Component,\n createEffect,\n createMemo,\n createRoot,\n createSignal,\n For,\n mergeProps,\n on,\n onCleanup,\n onMount,\n Show,\n untrack,\n} from 'solid-js';\nimport { cn } from '@utils/cn';\nimport { createThrottle } from '@utils/helper';\nimport type {\n MansoryBreakpoint,\n MansoryItemLayout,\n MansoryProps,\n MansoryResponsive,\n MansoryVirtualOptions,\n} from './mansory.types';\n\nconst BREAKPOINTS: Record<Exclude<MansoryBreakpoint, 'default'>, number> = {\n sm: 640,\n md: 768,\n lg: 1024,\n xl: 1280,\n '2xl': 1536,\n};\n\nconst BP_KEYS = ['sm', 'md', 'lg', 'xl', '2xl'] as const;\n\nconst DEFAULT_COLUMNS: MansoryResponsive<number> = {\n default: 1,\n sm: 2,\n md: 3,\n lg: 4,\n};\n\nconst DEFAULT_GAP = 'gap-4';\n\nconst GAP_CACHE_MAX = 50;\nconst gapCache = new Map<string, number>();\n\nfunction resolveResponsive<T>(config: T | MansoryResponsive<T>, containerWidth: number): T {\n if (typeof config !== 'object' || config === null || Array.isArray(config)) {\n return config as T;\n }\n\n const map = config as MansoryResponsive<T>;\n\n for (let i = BP_KEYS.length - 1; i >= 0; i--) {\n const key = BP_KEYS[i];\n if (containerWidth >= BREAKPOINTS[key] && map[key] !== undefined) {\n return map[key] as T;\n }\n }\n\n return (map.default ?? (typeof config === 'object' ? undefined : config)) as T;\n}\n\nfunction measureGapPx(gapClass: string, container: HTMLElement): number {\n const probe = document.createElement('div');\n probe.className = `ma06 ${gapClass}`;\n probe.style.display = 'grid';\n probe.style.gridTemplateColumns = '1fr 1fr';\n\n probe.appendChild(document.createElement('div'));\n probe.appendChild(document.createElement('div'));\n container.appendChild(probe);\n const computed = getComputedStyle(probe);\n const gap = parseFloat(computed.columnGap || computed.gap || '0');\n container.removeChild(probe);\n return gap;\n}\n\nfunction measureGapPxCached(gapClass: string, container: HTMLElement): number {\n if (gapCache.has(gapClass)) return gapCache.get(gapClass)!;\n const value = measureGapPx(gapClass, container);\n\n if (gapCache.size >= GAP_CACHE_MAX) {\n const firstKey = gapCache.keys().next().value;\n if (firstKey !== undefined) gapCache.delete(firstKey);\n }\n gapCache.set(gapClass, value);\n return value;\n}\n\nfunction computeLayout(\n itemHeights: number[],\n columns: number,\n containerWidth: number,\n gapPx: number,\n): { layouts: MansoryItemLayout[]; totalHeight: number; sortedByTop: MansoryItemLayout[] } {\n const cols = Math.max(1, columns);\n const totalGap = gapPx * (cols - 1);\n const colWidth = (containerWidth - totalGap) / cols;\n\n const colHeights = new Array<number>(cols).fill(0);\n const layouts: MansoryItemLayout[] = [];\n\n const sortedByTop: MansoryItemLayout[] = [];\n\n for (let i = 0; i < itemHeights.length; i++) {\n let minCol = 0;\n for (let c = 1; c < cols; c++) {\n if (colHeights[c] < colHeights[minCol]) minCol = c;\n }\n\n const left = minCol * (colWidth + gapPx);\n const top = colHeights[minCol];\n const height = itemHeights[i] ?? 0;\n\n const item: MansoryItemLayout = { index: i, top, left, width: colWidth, height };\n layouts.push(item);\n\n let j = sortedByTop.length - 1;\n while (j >= 0 && sortedByTop[j].top > top) j--;\n sortedByTop.splice(j + 1, 0, item);\n\n colHeights[minCol] = top + height + gapPx;\n }\n\n let maxH = 0;\n for (let i = 0; i < colHeights.length; i++) {\n if (colHeights[i] > maxH) maxH = colHeights[i];\n }\n\n return { layouts, totalHeight: maxH > 0 ? maxH - gapPx : 0, sortedByTop };\n}\n\nfunction findFirstVisible(sorted: MansoryItemLayout[], visTop: number): number {\n let lo = 0,\n hi = sorted.length;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (sorted[mid].top + sorted[mid].height < visTop) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n}\n\ninterface MansoryItemProps {\n index: number;\n getLayoutAccessor: (index: number) => Accessor<MansoryItemLayout | undefined>;\n items: unknown[];\n itemClass?: string;\n children: MansoryProps['children'];\n onRegister: (index: number, el: HTMLDivElement) => void;\n onUnregister: (index: number) => void;\n}\n\nconst MansoryItem: Component<MansoryItemProps> = props => {\n const itemLayout = props.getLayoutAccessor(props.index);\n\n const styles = createMemo(() => {\n const l = itemLayout();\n if (!l) return { wrapper: {} as Record<string, string>, child: {} as Record<string, string> };\n const widthPx = `${l.width}px`;\n return {\n wrapper: { width: widthPx, transform: `translate3d(${l.left}px, ${l.top}px, 0)` },\n child: { width: widthPx },\n };\n });\n\n return (\n <div\n ref={el => {\n props.onRegister(props.index, el);\n onCleanup(function unregisterItem() {\n props.onUnregister(props.index);\n });\n }}\n data-mansory-idx={props.index}\n class={cn('ma03 ma04', props.itemClass)}\n style={styles().wrapper}\n >\n {props.children(props.items[props.index], () => props.index, styles().child)}\n </div>\n );\n};\n\nexport const Mansory: Component<MansoryProps> = rawProps => {\n const props = mergeProps(\n {\n columns: DEFAULT_COLUMNS,\n gap: DEFAULT_GAP,\n virtual: false as boolean | MansoryVirtualOptions,\n estimateItemHeight: 200,\n loadMoreThreshold: 200,\n },\n rawProps,\n );\n\n let containerEl!: HTMLDivElement;\n let innerEl!: HTMLDivElement;\n\n const [containerWidth, setContainerWidth] = createSignal(0);\n const [itemHeights, setItemHeights] = createSignal<number[]>([]);\n\n const currentColumns = createMemo(() => {\n const resolved = resolveResponsive<number>(props.columns as number, containerWidth());\n return Math.max(1, resolved ?? 1);\n });\n\n const currentGapClass = createMemo(() => {\n const resolved = resolveResponsive<string>(props.gap as string, containerWidth());\n return resolved ?? 'gap-4';\n });\n\n const [gapPx, setGapPx] = createSignal(16);\n\n createEffect(function trackGapClass() {\n const _ = currentGapClass();\n if (containerEl) {\n setGapPx(measureGapPxCached(currentGapClass(), containerEl));\n }\n });\n\n const layout = createMemo(() =>\n computeLayout(itemHeights(), currentColumns(), containerWidth(), gapPx()),\n );\n\n const totalHeight = createMemo(() => layout().totalHeight);\n\n const layoutAccessors = new Map<number, Accessor<MansoryItemLayout | undefined>>();\n const layoutSetters = new Map<number, (v: MansoryItemLayout | undefined) => void>();\n const layoutDisposers = new Map<number, () => void>();\n\n function getOrCreateLayoutAccessor(index: number): Accessor<MansoryItemLayout | undefined> {\n if (!layoutAccessors.has(index)) {\n createRoot(function layoutSignalRoot(dispose) {\n layoutDisposers.set(index, dispose);\n const initialValue = untrack(() => layout().layouts[index]);\n const [get, set] = createSignal<MansoryItemLayout | undefined>(initialValue, {\n equals: (a, b) => {\n if (a === b) return true;\n if (!a || !b) return false;\n return (\n a.top === b.top && a.left === b.left && a.width === b.width && a.height === b.height\n );\n },\n });\n layoutAccessors.set(index, get);\n layoutSetters.set(index, set);\n });\n }\n return layoutAccessors.get(index)!;\n }\n\n function disposeLayoutSignal(index: number) {\n layoutDisposers.get(index)?.();\n layoutDisposers.delete(index);\n layoutAccessors.delete(index);\n layoutSetters.delete(index);\n }\n\n onCleanup(function disposeAllLayoutSignals() {\n for (const dispose of layoutDisposers.values()) dispose();\n layoutDisposers.clear();\n layoutAccessors.clear();\n layoutSetters.clear();\n keyEntryCache.clear();\n });\n\n createEffect(function syncLayoutSetters() {\n const newLayouts = layout().layouts;\n\n for (const [index, setter] of layoutSetters) {\n setter(newLayouts[index]);\n }\n });\n\n const virtualOpts = createMemo<MansoryVirtualOptions | null>(() => {\n const v = props.virtual;\n if (!v) return null;\n if (v === true) return { overscan: 5 };\n return { overscan: v.overscan ?? 5 };\n });\n\n const isVirtual = createMemo(() => virtualOpts() !== null);\n\n const [scrollTop, setScrollTop] = createSignal(0);\n\n let rafId: number | null = null;\n let pendingScrollTop = 0;\n\n let loadMoreCooldown = false;\n let loadMoreTimer: ReturnType<typeof setTimeout> | null = null;\n\n const pendingItemChanges = new Map<number, number>();\n\n const flushItemHeights = createThrottle(function applyItemHeightChanges() {\n if (pendingItemChanges.size === 0) return;\n const snapshot = new Map(pendingItemChanges);\n pendingItemChanges.clear();\n\n setItemHeights(prev => {\n let hasChange = false;\n for (const [idx, h] of snapshot) {\n if (prev[idx] !== h) {\n hasChange = true;\n break;\n }\n }\n if (!hasChange) return prev;\n\n const next = [...prev];\n for (const [idx, h] of snapshot) next[idx] = h;\n return next;\n });\n }, 100);\n\n onCleanup(function cancelFlushItemHeights() {\n flushItemHeights.cancel();\n });\n\n const itemRO = new ResizeObserver(entries => {\n for (const entry of entries) {\n const el = entry.target as HTMLDivElement;\n const idx = parseInt(el.dataset.mansoryIdx ?? '-1', 10);\n if (idx < 0) continue;\n\n const h = entry.contentBoxSize?.[0]?.blockSize ?? entry.contentRect.height;\n pendingItemChanges.set(idx, h);\n }\n\n flushItemHeights();\n });\n\n onCleanup(function disconnectItemResizeObserver() {\n itemRO.disconnect();\n });\n\n onMount(() => {\n const applyContainerWidth = createThrottle(function applyContainerWidthChange(width: number) {\n setContainerWidth(width);\n }, 100);\n\n const containerRO = new ResizeObserver(entries => {\n for (const entry of entries) {\n const width = entry.contentBoxSize?.[0]?.inlineSize ?? entry.contentRect.width;\n applyContainerWidth(width);\n }\n });\n containerRO.observe(containerEl);\n onCleanup(function disconnectContainerResizeObserver() {\n applyContainerWidth.cancel();\n containerRO.disconnect();\n });\n });\n\n const itemElMap = new Map<number, HTMLDivElement>();\n\n function registerItem(index: number, el: HTMLDivElement) {\n itemElMap.set(index, el);\n itemRO.observe(el);\n }\n\n function unregisterItem(index: number) {\n const el = itemElMap.get(index);\n if (el) {\n itemRO.unobserve(el);\n itemElMap.delete(index);\n }\n }\n\n createEffect(\n on(\n () => props.items.length,\n len => {\n setItemHeights(prev => {\n const prevLen = prev.length;\n if (prevLen === len) return prev;\n\n if (len > prevLen) {\n const next = [...prev];\n for (let i = prevLen; i < len; i++) next.push(props.estimateItemHeight);\n return next;\n }\n\n for (let i = len; i < prevLen; i++) {\n disposeLayoutSignal(i);\n }\n return prev.slice(0, len);\n });\n },\n ),\n );\n\n function checkLoadMore(currentScrollTop: number) {\n if (!props.onLoadMore || loadMoreCooldown) return;\n const { scrollHeight, clientHeight } = containerEl;\n if (currentScrollTop + clientHeight >= scrollHeight - props.loadMoreThreshold) {\n loadMoreCooldown = true;\n\n if (loadMoreTimer) clearTimeout(loadMoreTimer);\n loadMoreTimer = setTimeout(() => {\n loadMoreCooldown = false;\n loadMoreTimer = null;\n }, 10_000);\n props.onLoadMore();\n }\n }\n\n createEffect(\n on(\n () => props.items.length,\n () => {\n if (loadMoreTimer) {\n clearTimeout(loadMoreTimer);\n loadMoreTimer = null;\n }\n loadMoreCooldown = false;\n },\n ),\n );\n\n onCleanup(function clearLoadMoreTimer() {\n if (loadMoreTimer) clearTimeout(loadMoreTimer);\n });\n\n onCleanup(function cancelPendingRaf() {\n if (rafId !== null) cancelAnimationFrame(rafId);\n });\n\n function handleScroll() {\n pendingScrollTop = containerEl.scrollTop;\n\n if (rafId === null) {\n rafId = requestAnimationFrame(() => {\n rafId = null;\n setScrollTop(pendingScrollTop);\n checkLoadMore(pendingScrollTop);\n });\n }\n }\n\n const allIndices = createMemo<number[]>((prev = []) => {\n const len = props.items.length;\n if (len === prev.length) return prev;\n if (len > prev.length) {\n const next = [...prev];\n for (let i = prev.length; i < len; i++) next.push(i);\n return next;\n }\n return prev.slice(0, len);\n });\n\n const renderedIndices = createMemo(() => {\n if (!isVirtual()) {\n return allIndices();\n }\n\n if (containerWidth() === 0) return [];\n\n const currentScrollTop = scrollTop();\n const viewportHeight = containerEl.clientHeight;\n const overscan = virtualOpts()?.overscan ?? 5;\n const overscanPx = overscan * props.estimateItemHeight;\n const visTop = currentScrollTop - overscanPx;\n const visBottom = currentScrollTop + viewportHeight + overscanPx;\n\n const sorted = layout().sortedByTop;\n const start = findFirstVisible(sorted, visTop);\n const indices: number[] = [];\n for (let i = start; i < sorted.length; i++) {\n if (sorted[i].top > visBottom) break;\n indices.push(sorted[i].index);\n }\n return indices;\n });\n\n const keyEntryCache = new Map<string | number, { key: string | number; index: number }>();\n\n const renderedKeys = createMemo(() => {\n const indices = renderedIndices();\n if (!props.getItemKey) return indices;\n\n const activeKeys = new Set<string | number>();\n\n const entries = indices.map(i => {\n const key = props.getItemKey!(props.items[i], i);\n activeKeys.add(key);\n\n let entry = keyEntryCache.get(key);\n if (!entry) {\n entry = { key, index: i };\n keyEntryCache.set(key, entry);\n } else {\n entry.index = i;\n }\n return entry;\n });\n\n for (const k of keyEntryCache.keys()) {\n if (!activeKeys.has(k)) keyEntryCache.delete(k);\n }\n\n return entries;\n });\n\n return (\n <div\n ref={containerEl}\n class={cn('ma01', isVirtual() && 'ma05', props.class)}\n onScroll={isVirtual() || props.onLoadMore ? handleScroll : undefined}\n >\n <div ref={innerEl} class=\"ma02\" style={{ height: `${totalHeight()}px` }}>\n <For each={renderedKeys()}>\n {entry => {\n const index = typeof entry === 'number' ? entry : entry.index;\n return (\n <MansoryItem\n index={index}\n getLayoutAccessor={getOrCreateLayoutAccessor}\n items={props.items}\n itemClass={props.itemClass}\n onRegister={registerItem}\n onUnregister={unregisterItem}\n >\n {props.children}\n </MansoryItem>\n );\n }}\n </For>\n </div>\n\n <Show when={props.items.length === 0}>\n <div class=\"ma08\">No items</div>\n </Show>\n </div>\n );\n};\n"],"mappings":"khBAyBMoB,EAAqE,CACzEG,GAAI,IACJC,GAAI,IACJC,GAAI,KACJC,GAAI,KACJ,MAAO,KACR,CAEKC,EAAU,CAAC,KAAM,KAAM,KAAM,KAAM,MAAM,CAEzCE,EAA6C,CACjDC,QAAS,EACTP,GAAI,EACJC,GAAI,EACJC,GAAI,EACL,CAEKM,EAAc,QAEdC,EAAgB,GAChBC,EAAW,IAAIC,IAErB,SAASC,EAAqBC,EAAkCE,EAA2B,CACzF,GAAI,OAAOF,GAAW,WAAYA,GAAmBG,MAAMC,QAAQJ,EAAO,CACxE,OAAOA,EAGT,IAAMK,EAAML,EAEZ,IAAK,IAAIM,EAAIf,EAAQgB,OAAS,EAAGD,GAAK,EAAGA,IAAK,CAC5C,IAAME,EAAMjB,EAAQe,GACpB,GAAIJ,GAAkBlB,EAAYwB,IAAQH,EAAIG,KAASC,IAAAA,GACrD,OAAOJ,EAAIG,GAIf,OAAQH,EAAIX,UAAY,OAAOM,GAAW,SAAWS,IAAAA,GAAYT,GAGnE,SAASU,EAAaC,EAAkBC,EAAgC,CACtE,IAAME,EAAQC,SAASC,cAAc,MAAM,CAC3CF,EAAMG,UAAY,QAAQN,IAC1BG,EAAMI,MAAMC,QAAU,OACtBL,EAAMI,MAAME,oBAAsB,UAElCN,EAAMO,YAAYN,SAASC,cAAc,MAAM,CAAC,CAChDF,EAAMO,YAAYN,SAASC,cAAc,MAAM,CAAC,CAChDJ,EAAUS,YAAYP,EAAM,CAC5B,IAAMQ,EAAWC,iBAAiBT,EAAM,CAClCU,EAAMC,WAAWH,EAASI,WAAaJ,EAASE,KAAO,IAAI,CAEjE,OADAZ,EAAUe,YAAYb,EAAM,CACrBU,EAGT,SAASI,EAAmBjB,EAAkBC,EAAgC,CAC5E,GAAIf,EAASgC,IAAIlB,EAAS,CAAE,OAAOd,EAASiC,IAAInB,EAAS,CACzD,IAAMoB,EAAQrB,EAAaC,EAAUC,EAAU,CAE/C,GAAIf,EAASmC,MAAQpC,EAAe,CAClC,IAAMqC,EAAWpC,EAASqC,MAAM,CAACC,MAAM,CAACJ,MACpCE,IAAaxB,IAAAA,IAAWZ,EAASuC,OAAOH,EAAS,CAGvD,OADApC,EAASwC,IAAI1B,EAAUoB,EAAM,CACtBA,EAGT,SAASO,GACPC,EACAC,EACAtC,EACAuC,EACyF,CACzF,IAAMI,EAAOC,KAAKC,IAAI,EAAGP,EAAQ,CAE3BS,GAAY/C,EADDuC,GAASI,EAAO,IACcA,EAEzCK,EAAiB/C,MAAc0C,EAAK,CAACM,KAAK,EAAE,CAC5CT,EAA+B,EAAE,CAEjCE,EAAmC,EAAE,CAE3C,IAAK,IAAItC,EAAI,EAAGA,EAAIiC,EAAYhC,OAAQD,IAAK,CAC3C,IAAI8C,EAAS,EACb,IAAK,IAAIC,EAAI,EAAGA,EAAIR,EAAMQ,IACpBH,EAAWG,GAAKH,EAAWE,KAASA,EAASC,GAGnD,IAAMC,EAAOF,GAAUH,EAAWR,GAC5Bc,EAAML,EAAWE,GACjBI,EAASjB,EAAYjC,IAAM,EAE3BmD,EAA0B,CAAEC,MAAOpD,EAAGiD,MAAKD,OAAMK,MAAOV,EAAUO,SAAQ,CAChFd,EAAQkB,KAAKH,EAAK,CAElB,IAAII,EAAIjB,EAAYrC,OAAS,EAC7B,KAAOsD,GAAK,GAAKjB,EAAYiB,GAAGN,IAAMA,GAAKM,IAC3CjB,EAAYkB,OAAOD,EAAI,EAAG,EAAGJ,EAAK,CAElCP,EAAWE,GAAUG,EAAMC,EAASf,EAGtC,IAAIsB,EAAO,EACX,IAAK,IAAIzD,EAAI,EAAGA,EAAI4C,EAAW3C,OAAQD,IACjC4C,EAAW5C,GAAKyD,IAAMA,EAAOb,EAAW5C,IAG9C,MAAO,CAAEoC,UAASC,YAAaoB,EAAO,EAAIA,EAAOtB,EAAQ,EAAGG,cAAa,CAG3E,SAASoB,GAAiBC,EAA6BC,EAAwB,CAC7E,IAAIC,EAAK,EACPC,EAAKH,EAAO1D,OACd,KAAO4D,EAAKC,GAAI,CACd,IAAMC,EAAOF,EAAKC,GAAO,EACrBH,EAAOI,GAAKd,IAAMU,EAAOI,GAAKb,OAASU,EAAQC,EAAKE,EAAM,EACzDD,EAAKC,EAEZ,OAAOF,EAaT,IAAMY,GAA2CC,GAAS,CACxD,IAAMC,EAAaD,EAAMT,kBAAkBS,EAAMtB,MAAM,CAEjDwB,EAASnH,MAAiB,CAC9B,IAAMoH,EAAIF,GAAY,CACtB,GAAI,CAACE,EAAG,MAAO,CAAEC,QAAS,EAAE,CAA4BC,MAAO,EAAE,CAA4B,CAC7F,IAAMC,EAAU,GAAGH,EAAExB,MAAK,IAC1B,MAAO,CACLyB,QAAS,CAAEzB,MAAO2B,EAASC,UAAW,eAAeJ,EAAE7B,KAAI,MAAO6B,EAAE5B,IAAG,QAAU,CACjF8B,MAAO,CAAE1B,MAAO2B,EAAQ,CACzB,EACD,CAEF,WAAA,CAAA,IAAAE,EAAAC,GAAA,CAU2B,OAV3BC,EAESd,GAAM,CACTI,EAAML,WAAWK,EAAMtB,MAAOkB,EAAG,CACjCvG,EAAU,UAA0B,CAClC2G,EAAMF,aAAaE,EAAMtB,MAAM,EAC/B,EACH8B,EAAA,CAAAI,EAAAJ,MAKAR,EAAMN,SAASM,EAAMR,MAAMQ,EAAMtB,WAAcsB,EAAMtB,MAAOwB,GAAQ,CAACG,MAAM,CAAA,CAAAQ,EAAAC,GAAA,CAAA,IAAAC,EAJ1Df,EAAMtB,MAAKsC,EACtBvH,EAAG,YAAauG,EAAMP,UAAU,CAAAwB,EAChCf,GAAQ,CAACE,QAAO,OAAAW,IAAAD,EAAAI,GAAAC,EAAAX,EAAA,mBAAAM,EAAAI,EAAAH,EAAA,CAAAC,IAAAF,EAAAM,GAAAC,EAAAb,EAAAM,EAAAM,EAAAJ,EAAA,CAAAF,EAAAQ,EAAAC,EAAAf,EAAAS,EAAAH,EAAAQ,EAAA,CAAAR,GAAA,CAAAI,EAAAzF,IAAAA,GAAA2F,EAAA3F,IAAAA,GAAA6F,EAAA7F,IAAAA,GAAA,CAAA,CAAA+E,KAAA,EAOhBgB,EAAmCC,GAAY,CAC1D,IAAMzB,EAAQ7G,GACZ,CACEqE,QAAS/C,EACT+B,IAAK7B,EACL+G,QAAS,GACTC,mBAAoB,IACpBC,kBAAmB,IACpB,CACDH,EACD,CAEGI,EACAC,EAEE,CAAC5G,EAAgB6G,GAAqB9I,EAAa,EAAE,CACrD,CAACsE,EAAayE,GAAkB/I,EAAuB,EAAE,CAAC,CAE1DgJ,EAAiBlJ,MAAiB,CACtC,IAAMmJ,EAAWnH,EAA0BiF,EAAMxC,QAAmBtC,GAAgB,CAAC,CACrF,OAAO4C,KAAKC,IAAI,EAAGmE,GAAY,EAAE,EACjC,CAEIC,EAAkBpJ,MACLgC,EAA0BiF,EAAMxD,IAAetB,GAAgB,CAAC,EAC9D,QACnB,CAEI,CAACuC,GAAO2E,IAAYnJ,EAAa,GAAG,CAE1CH,EAAa,UAAyB,CAC1BqJ,GAAiB,CACvBN,GACFO,GAASxF,EAAmBuF,GAAiB,CAAEN,EAAY,CAAC,EAE9D,CAEF,IAAMU,EAASxJ,MACbuE,GAAcC,GAAa,CAAE0E,GAAgB,CAAE/G,GAAgB,CAAEuC,IAAO,CAC1E,CAAC,CAEKE,GAAc5E,MAAiBwJ,GAAQ,CAAC5E,YAAY,CAEpD6E,EAAkB,IAAI1H,IACtB2H,EAAgB,IAAI3H,IACpB6H,EAAkB,IAAI7H,IAE5B,SAAS8H,EAA0BlE,EAAwD,CAkBzF,OAjBK8D,EAAgB3F,IAAI6B,EAAM,EAC7B1F,EAAW,SAA0B8J,EAAS,CAC5CH,EAAgBtF,IAAIqB,EAAOoE,EAAQ,CAEnC,GAAM,CAAChG,EAAKO,GAAOpE,EADEO,MAAc+I,GAAQ,CAAC7E,QAAQgB,GAAO,CACkB,CAC3EsE,QAAS1B,EAAG2B,IACN3B,IAAM2B,EAAU,GAChB,CAAC3B,GAAK,CAAC2B,EAAU,GAEnB3B,EAAE/C,MAAQ0E,EAAE1E,KAAO+C,EAAEhD,OAAS2E,EAAE3E,MAAQgD,EAAE3C,QAAUsE,EAAEtE,OAAS2C,EAAE9C,SAAWyE,EAAEzE,OAGnF,CAAC,CACFgE,EAAgBnF,IAAIqB,EAAO5B,EAAI,CAC/B2F,EAAcpF,IAAIqB,EAAOrB,EAAI,EAC7B,CAEGmF,EAAgB1F,IAAI4B,EAAM,CAGnC,SAASwE,EAAoBxE,EAAe,CAC1CiE,EAAgB7F,IAAI4B,EAAM,IAAI,CAC9BiE,EAAgBvF,OAAOsB,EAAM,CAC7B8D,EAAgBpF,OAAOsB,EAAM,CAC7B+D,EAAcrF,OAAOsB,EAAM,CAG7BrF,EAAU,UAAmC,CAC3C,IAAK,IAAMyJ,KAAWH,EAAgBS,QAAQ,CAAEN,GAAS,CACzDH,EAAgBU,OAAO,CACvBb,EAAgBa,OAAO,CACvBZ,EAAcY,OAAO,CACrBC,EAAcD,OAAO,EACrB,CAEFvK,EAAa,UAA6B,CACxC,IAAM0K,EAAajB,GAAQ,CAAC7E,QAE5B,IAAK,GAAM,CAACgB,EAAO+E,KAAWhB,EAC5BgB,EAAOD,EAAW9E,GAAO,EAE3B,CAEF,IAAMgF,EAAc3K,MAA+C,CACjE,IAAM2J,EAAI1C,EAAM0B,QAGhB,OAFKgB,EACDA,IAAM,GAAa,CAAEiB,SAAU,EAAG,CAC/B,CAAEA,SAAUjB,EAAEiB,UAAY,EAAG,CAFrB,MAGf,CAEIC,EAAY7K,MAAiB2K,GAAa,GAAK,KAAK,CAEpD,CAACG,EAAWC,GAAgB7K,EAAa,EAAE,CAE7C8K,EAAuB,KACvBC,EAAmB,EAEnBC,EAAmB,GACnBC,EAAsD,KAEpDG,EAAqB,IAAIvJ,IAEzBwJ,EAAmB5K,EAAe,UAAkC,CACxE,GAAI2K,EAAmBrH,OAAS,EAAG,OACnC,IAAMwH,EAAW,IAAI1J,IAAIuJ,EAAmB,CAC5CA,EAAmBhB,OAAO,CAE1BrB,EAAeyC,GAAQ,CACrB,IAAIC,EAAY,GAChB,IAAK,GAAM,CAACC,EAAKC,KAAMJ,EACrB,GAAIC,EAAKE,KAASC,EAAG,CACnBF,EAAY,GACZ,MAGJ,GAAI,CAACA,EAAW,OAAOD,EAEvB,IAAMtH,EAAO,CAAC,GAAGsH,EAAK,CACtB,IAAK,GAAM,CAACE,EAAKC,KAAMJ,EAAUrH,EAAKwH,GAAOC,EAC7C,OAAOzH,GACP,EACD,IAAI,CAEP9D,EAAU,UAAkC,CAC1CiL,EAAiBQ,QAAQ,EACzB,CAEF,IAAMC,EAAS,IAAIC,eAAeC,GAAW,CAC3C,IAAK,IAAMC,KAASD,EAAS,CAC3B,IAAMrF,EAAKsF,EAAMC,OACXR,EAAMS,SAASxF,EAAGyF,QAAQC,YAAc,KAAM,GAAG,CACvD,GAAIX,EAAM,EAAG,SAEb,IAAMC,EAAIM,EAAMK,iBAAiB,IAAIC,WAAaN,EAAMO,YAAYjH,OACpE6F,EAAmBhH,IAAIsH,EAAKC,EAAE,CAGhCN,GAAkB,EAClB,CAEFjL,EAAU,UAAwC,CAChD0L,EAAOY,YAAY,EACnB,CAEFrM,OAAc,CACZ,IAAMsM,EAAsBlM,EAAe,SAAmCiF,EAAe,CAC3FoD,EAAkBpD,EAAM,EACvB,IAAI,CAEDmH,EAAc,IAAId,eAAeC,GAAW,CAChD,IAAK,IAAMC,KAASD,EAElBW,EADcV,EAAMK,iBAAiB,IAAIQ,YAAcb,EAAMO,YAAY9G,MAC/C,EAE5B,CACFmH,EAAYE,QAAQnE,EAAY,CAChCxI,EAAU,UAA6C,CACrDuM,EAAoBd,QAAQ,CAC5BgB,EAAYH,YAAY,EACxB,EACF,CAEF,IAAMO,EAAY,IAAIpL,IAEtB,SAASqL,GAAazH,EAAekB,EAAoB,CACvDsG,EAAU7I,IAAIqB,EAAOkB,EAAG,CACxBmF,EAAOiB,QAAQpG,EAAG,CAGpB,SAASe,GAAejC,EAAe,CACrC,IAAMkB,EAAKsG,EAAUpJ,IAAI4B,EAAM,CAC3BkB,IACFmF,EAAOqB,UAAUxG,EAAG,CACpBsG,EAAU9I,OAAOsB,EAAM,EAI3B5F,EACEM,MACQ4G,EAAMR,MAAMjE,OAClB8K,GAAO,CACLrE,EAAeyC,GAAQ,CACrB,IAAM6B,EAAU7B,EAAKlJ,OACrB,GAAI+K,IAAYD,EAAK,OAAO5B,EAE5B,GAAI4B,EAAMC,EAAS,CACjB,IAAMnJ,EAAO,CAAC,GAAGsH,EAAK,CACtB,IAAK,IAAInJ,EAAIgL,EAAShL,EAAI+K,EAAK/K,IAAK6B,EAAKyB,KAAKoB,EAAM2B,mBAAmB,CACvE,OAAOxE,EAGT,IAAK,IAAI7B,EAAI+K,EAAK/K,EAAIgL,EAAShL,IAC7B4H,EAAoB5H,EAAE,CAExB,OAAOmJ,EAAK8B,MAAM,EAAGF,EAAI,EACzB,EAGR,CAAC,CAED,SAASG,GAAcC,EAA0B,CAC/C,GAAI,CAACzG,EAAM0G,YAAczC,EAAkB,OAC3C,GAAM,CAAE0C,eAAcC,gBAAiB/E,EACnC4E,EAAmBG,GAAgBD,EAAe3G,EAAM4B,oBAC1DqC,EAAmB,GAEfC,GAAe2C,aAAa3C,EAAc,CAC9CA,EAAgBE,eAAiB,CAC/BH,EAAmB,GACnBC,EAAgB,MACf,IAAO,CACVlE,EAAM0G,YAAY,EAItB5N,EACEM,MACQ4G,EAAMR,MAAMjE,WACZ,CACJ,AAEE2I,KADA2C,aAAa3C,EAAc,CACX,MAElBD,EAAmB,IAGzB,CAAC,CAED5K,EAAU,UAA8B,CAClC6K,GAAe2C,aAAa3C,EAAc,EAC9C,CAEF7K,EAAU,UAA4B,CAChC0K,IAAU,MAAMiD,qBAAqBjD,EAAM,EAC/C,CAEF,SAASkD,GAAe,CACtBjD,EAAmBnC,EAAYgC,UAE3BE,IAAU,OACZA,EAAQmD,0BAA4B,CAClCnD,EAAQ,KACRD,EAAaE,EAAiB,CAC9BwC,GAAcxC,EAAiB,EAC/B,EAIN,IAAMmD,GAAapO,GAAsB0L,EAAO,EAAE,GAAK,CACrD,IAAM4B,EAAMrG,EAAMR,MAAMjE,OACxB,GAAI8K,IAAQ5B,EAAKlJ,OAAQ,OAAOkJ,EAChC,GAAI4B,EAAM5B,EAAKlJ,OAAQ,CACrB,IAAM4B,EAAO,CAAC,GAAGsH,EAAK,CACtB,IAAK,IAAInJ,EAAImJ,EAAKlJ,OAAQD,EAAI+K,EAAK/K,IAAK6B,EAAKyB,KAAKtD,EAAE,CACpD,OAAO6B,EAET,OAAOsH,EAAK8B,MAAM,EAAGF,EAAI,EACzB,CAEIe,GAAkBrO,MAAiB,CACvC,GAAI,CAAC6K,GAAW,CACd,OAAOuD,IAAY,CAGrB,GAAIjM,GAAgB,GAAK,EAAG,MAAO,EAAE,CAErC,IAAMuL,EAAmB5C,GAAW,CAC9BwD,EAAiBxF,EAAY+E,aAE7BU,GADW5D,GAAa,EAAEC,UAAY,GACd3D,EAAM2B,mBAC9BzC,EAASuH,EAAmBa,EAC5BC,EAAYd,EAAmBY,EAAiBC,EAEhDrI,EAASsD,GAAQ,CAAC3E,YAClB4J,EAAQxI,GAAiBC,EAAQC,EAAO,CACxCuI,EAAoB,EAAE,CAC5B,IAAK,IAAInM,EAAIkM,EAAOlM,EAAI2D,EAAO1D,QACzB0D,IAAO3D,GAAGiD,IAAMgJ,GADiBjM,IAErCmM,EAAQ7I,KAAKK,EAAO3D,GAAGoD,MAAM,CAE/B,OAAO+I,GACP,CAEInE,EAAgB,IAAIxI,IAEpB4M,GAAe3O,MAAiB,CACpC,IAAM0O,EAAUL,IAAiB,CACjC,GAAI,CAACpH,EAAM2H,WAAY,OAAOF,EAE9B,IAAMG,EAAa,IAAIC,IAEjB5C,EAAUwC,EAAQpM,IAAIC,GAAK,CAC/B,IAAME,EAAMwE,EAAM2H,WAAY3H,EAAMR,MAAMlE,GAAIA,EAAE,CAChDsM,EAAWE,IAAItM,EAAI,CAEnB,IAAI0J,EAAQ5B,EAAcxG,IAAItB,EAAI,CAOlC,OANK0J,EAIHA,EAAMxG,MAAQpD,GAHd4J,EAAQ,CAAE1J,MAAKkD,MAAOpD,EAAG,CACzBgI,EAAcjG,IAAI7B,EAAK0J,EAAM,EAIxBA,GACP,CAEF,IAAK,IAAM6C,KAAKzE,EAAcpG,MAAM,CAC7B0K,EAAW/K,IAAIkL,EAAE,EAAEzE,EAAclG,OAAO2K,EAAE,CAGjD,OAAO9C,GACP,CAEF,WAAA,CAAA,IAAA+C,EAAAC,GAAA,CAAAC,EAAAF,EAAAG,WAAAC,EAAAJ,EAAA,SAIcpE,GAAW,EAAI5D,EAAM0G,WAAaO,EAAexL,IAAAA,GAAS,CAAA,IAAA4M,EAF/DxG,EAAW,OAAAwG,GAAA,WAAA3H,EAAA2H,EAAAL,EAAA,CAAXnG,EAAWmG,EAAA,IAAAM,EAINxG,EAA2D,OAApD,OAAAwG,GAAA,WAAA5H,EAAA4H,EAAAJ,EAAA,CAAPpG,EAAOoG,EAAAtH,EAAAsH,EAAAK,EACdrP,EAAG,CAAA,IAACsP,MAAI,CAAA,OAAEd,IAAc,EAAAhI,SACtBwF,GAECqD,EACGxI,GAAW,CACHrB,MAHG,OAAOwG,GAAU,SAAWA,EAAQA,EAAMxG,MAIpDa,kBAAmBqD,EAAyB,IAC5CpD,OAAK,CAAA,OAAEQ,EAAMR,OAAK,IAClBC,WAAS,CAAA,OAAEO,EAAMP,WACjBE,WAAYwG,GACZrG,aAAca,GAAc,IAAAjB,UAAA,CAAA,OAE3BM,EAAMN,UAAQ,CAAA,CAGpB,CAAA,CAAA,CAAAkB,EAAAoH,EAAAO,EAIJhP,EAAI,CAAA,IAACkP,MAAI,CAAA,OAAEzI,EAAMR,MAAMjE,SAAW,GAAC,IAAAmE,UAAA,CAAA,OAAAgJ,GAAA,EAAA,CAAA,CAAA,KAAA,CAAA7H,EAAAC,GAAA,CAAA,IAAA6H,EAvB7BlP,EAAG,OAAQmK,GAAW,EAAI,OAAQ5D,EAAM4I,MAAM,CAAAC,EAGJ,GAAGlL,IAAa,CAAA,IAAI,OAAAgL,IAAA7H,EAAAI,GAAAG,EAAA2G,EAAAlH,EAAAI,EAAAyH,EAAA,CAAAE,IAAA/H,EAAAM,GAAA0H,EAAAZ,EAAA,SAAApH,EAAAM,EAAAyH,EAAA,CAAA/H,GAAA,CAAAI,EAAAzF,IAAAA,GAAA2F,EAAA3F,IAAAA,GAAA,CAAA,CAAAuM,KAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mansory.types.d.ts","sourceRoot":"","sources":["../../../src/components/mansory/mansory.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAE9C,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC;AAE9E,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,CAAC;AAEzE,MAAM,WAAW,qBAAqB;
|
|
1
|
+
{"version":3,"file":"mansory.types.d.ts","sourceRoot":"","sources":["../../../src/components/mansory/mansory.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAE9C,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC;AAE9E,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,CAAC;AAEzE,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,GAAG;IACnC,KAAK,EAAE,CAAC,EAAE,CAAC;IAEX,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,aAAa,KAAK,GAAG,CAAC,OAAO,CAAC;IAEtF,OAAO,CAAC,EAAE,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAE7C,GAAG,CAAC,EAAE,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAEzC,OAAO,CAAC,EAAE,OAAO,GAAG,qBAAqB,CAAC;IAE1C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IAExB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,CAAC;CAC1D;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modal.d.ts","sourceRoot":"","sources":["../../../src/components/modal/modal.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAExC,OAAO,EAAE,eAAe,EAAsB,MAAM,gBAAgB,CAAC;AAIrE,OAAO,EACL,SAAS,EAQV,MAAM,UAAU,CAAC;AAGlB,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC;IACrD,KAAK,CAAC,EAAE,OAAO,CACb,MAAM,CAAC,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,aAAa,EAAE,MAAM,CAAC,CACnF,CAAC;IACF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,GAAG;QACxC,IAAI,EAAE,WAAW,CAAC;KACnB,CAAC;CACH,CAAC;AAMF,KAAK,WAAW,GACZ,MAAM,GACN,mBAAmB,GACnB,kBAAkB,GAClB,QAAQ,GACR,YAAY,GACZ,aAAa,GACb,YAAY,GACZ,UAAU,GACV,UAAU,GACV,eAAe,GACf,kBAAkB,GAClB,YAAY,GACZ,QAAQ,GACR,iBAAiB,GACjB,cAAc,GACd,WAAW,CAAC;AAqDhB,QAAA,MAAM,cAAc,EAAE,SAAS,CAAC,SAAS,
|
|
1
|
+
{"version":3,"file":"modal.d.ts","sourceRoot":"","sources":["../../../src/components/modal/modal.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAExC,OAAO,EAAE,eAAe,EAAsB,MAAM,gBAAgB,CAAC;AAIrE,OAAO,EACL,SAAS,EAQV,MAAM,UAAU,CAAC;AAGlB,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC;IACrD,KAAK,CAAC,EAAE,OAAO,CACb,MAAM,CAAC,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,aAAa,EAAE,MAAM,CAAC,CACnF,CAAC;IACF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,GAAG;QACxC,IAAI,EAAE,WAAW,CAAC;KACnB,CAAC;CACH,CAAC;AAMF,KAAK,WAAW,GACZ,MAAM,GACN,mBAAmB,GACnB,kBAAkB,GAClB,QAAQ,GACR,YAAY,GACZ,aAAa,GACb,YAAY,GACZ,UAAU,GACV,UAAU,GACV,eAAe,GACf,kBAAkB,GAClB,YAAY,GACZ,QAAQ,GACR,iBAAiB,GACjB,cAAc,GACd,WAAW,CAAC;AAqDhB,QAAA,MAAM,cAAc,EAAE,SAAS,CAAC,SAAS,CA6LxC,CAAC;AAEF,eAAO,MAAM,KAAK,kDAA8E,CAAC;AAEjG,OAAO,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -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, () => { if (p.closeOnEsc) p.onClose(); });\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":"m2BA+DMqC,EAAuB,IAAIC,IAAiB,CAChD,oBACA,mBACA,aACA,cACA,aACA,WACA,WACA,gBACA,mBACA,aACA,SACA,kBACA,eACA,YACD,CAAC,CAGI,CAACC,EAAUC,GAAehC,EAAuB,EAAE,CAAC,CAC1D,SAASiC,GAAa,CACpB,IAAMC,EAASH,GAAU,CAACI,OAAO,CACjCD,EAAOE,KAAK,CACZJ,EAAYE,EAAO,CAIrB,IAAMG,EAAsB,IAAIC,IAEhC,SAASC,EAAqBC,EAAkB,CAC9C,GAAIA,EAAEE,MAAQ,SAAU,OACxB,IAAMC,EAAQZ,GAAU,CAACa,GAAG,GAAG,CAC3BD,GAAON,EAAoBQ,IAAIF,EAAM,IAAI,CAG/C,SAASG,EAAsBC,EAAYC,EAAgB,CACrDX,EAAoBY,OAAS,GAC/BC,SAASC,iBAAiB,UAAWZ,EAAqB,CAE5DF,EAAoBe,IAAIL,EAAIC,EAAG,CAGjC,SAASK,EAAwBN,EAAY,CAC3CV,EAAoBiB,OAAOP,EAAG,CAC1BV,EAAoBY,OAAS,GAC/BC,SAASK,oBAAoB,UAAWhB,EAAqB,CAIjE,IAAMiB,EAAuCC,GAAK,CAChDA,EAAIvD,EACF,CACES,oBAAqB,GACrBC,WAAY,GACZK,KAAM,GACNR,YAAe,GACfI,SAAU,GACVW,UAAW,GACXC,QAAS,CACPE,KAAM,eACN+B,SAAU,QACX,CACDxC,KAAM,GACP,CACDuC,EACD,CAED,IAAME,EAAU1D,GAAgB,CAEhCG,EAAU,UAA2B,CACnCiD,EAAwBM,EAAQ,CAC5BA,IAAY5B,GAAU,CAACa,GAAG,GAAG,EAC/BX,GAAY,EAEd,CAGFlC,EACEI,MACQsD,EAAExC,KACRA,GAAQ,CACFA,GACE0C,IAAY5B,GAAU,CAACa,GAAG,GAAG,EAC/BZ,EAAY,CAAC,GAAGD,GAAU,CAAE4B,EAAQ,CAAC,CAEvCb,EAAsBa,MAAe,CAAMF,EAAE7C,YAAY6C,EAAEhD,SAAS,EAAI,GAExE4C,EAAwBM,EAAQ,CAC5BA,IAAY5B,GAAU,CAACa,GAAG,GAAG,EAC/BX,GAAY,GAKtB,CAAC,CAED,IAAM4B,MAIJ,EAHI,CAACJ,EAAExC,MACH0C,IAAY5B,GAAU,CAACa,GAAG,GAAG,EAC7Ba,EAAEvC,OAAS,IACX,OAAOuC,EAAEvC,MAAS,UAAYuC,EAAEvC,MAAMC,UAAY,IAIlD2C,MACA,OAAOL,EAAEvC,MAAS,UAAYuC,EAAEvC,MAAME,OAAS,GAC1C,mBAEF,uCAGH2C,MAA8BN,EAAEhC,SAASE,MAAQ,OACjDqC,MAAwBnC,EAAqBoC,IAAIF,GAAU,CAAC,CAM5DG,MACA,CAACF,GAAiB,EAAID,GAAU,GAAK,OAChC,CAAEI,UAAWxE,EAAmB8D,EAAEhC,QAAQ,CAAG,CAE/C,EAAE,CAGL2C,MACAJ,GAAiB,CACZ,CAAEG,UAAWxE,EAAmB8D,EAAEhC,QAAQ,CAAG,CAE/C,EAAE,CAGL4C,MAAuB,CAC3B,IAAMC,EAA6B,EAAE,CAKrC,OAJIb,EAAE/C,QACJ4D,EAAM,MAAWb,EAAE/C,MACnB4D,EAAM,aAAeb,EAAE/C,OAElB4D,GAMH,CAACC,EAAaC,GAAkBxE,EAAa,GAAM,CACnDyE,MAA6BD,EAAe,GAAK,CAGvDzE,EACEI,MACQsD,EAAExC,KACRA,GAAQ,CACFA,GAAMuD,EAAe,GAAM,EAGrC,CAAC,CAID,IAAME,MAAmB,CAACV,GAAiB,EAAIO,GAAa,CAEtDI,MAA4B,CAC5BlB,EAAE9C,qBACJ8C,EAAEhD,SAAS,EAIf,OAAAmE,EACGtE,EAAM,CAAA,IACLuE,MAAI,CAAA,OAAEtE,EAAWuE,OAAK,IACtB7D,MAAI,CAAA,OAAEwC,EAAExC,MAAQ,IAChB8D,YAAW,GAAA,IACXvD,WAAS,CAAA,OAAEiC,EAAEjC,WACbwD,SAAU,CAAEC,MAAO,IAAK,CAAA,IAAA,OAAA,CAAA,OACjBxF,EAAG,OAAQgE,EAAEpC,OAAO6D,QAAQ,EAAA,IAAAC,UAAA,CAAA,MAAA,CAAAP,EAGlCvE,EAAI,CAAA,IAAC+E,MAAI,CAAA,OAAEvB,GAAmB,EAAA,IAAAsB,UAAA,CAAA,IAAAE,EAAAC,GAAA,CACY,MADZD,GAAAE,QACuBZ,EAAmBa,MAAAC,EAAAJ,EAA3D5F,EAAG,OAAQqE,GAAiB,CAAC,CAAA,CAAA,CAAAuB,GAAA,CAAA,CAAAT,EAI1CvE,EAAI,CAAA,IAAC+E,MAAI,CAAA,OAAEM,MAAA,CAAC7B,GAAmB,CAAA,EAAA,EAAIJ,EAAE9C,qBAAmB,IAAAwE,UAAA,CAAA,IAAAQ,EAAAC,GAAA,CACT,MADSD,GAAAJ,QAC5BZ,EAAmBgB,GAAA,CAAA,MAAA,CAAA,IAAAE,EAAAC,GAAA,CAAAC,EAAAF,EAAAG,WAAAC,EAAAF,EAAAC,WAAAE,EAAAD,EAAAE,YA0CP,MA1CON,GAAAN,QAKrB/C,GAAKA,EAAE4D,iBAAiB,CAAAC,EAAAR,EAAAjB,EAKhDvE,EAAI,CAAA,IAAC+E,MAAI,CAAA,OAAEM,MAAA,CAAA,CAAA1B,GAAiB,CAAA,EAAA,EAAI,CAACO,GAAa,EAAA,IAAAY,UAAA,CAAA,IAAAmB,EAAAC,GAAA,CAGW,OAHXD,EAAAnD,iBAAA,eAI3BsB,EAAoB,CAAAe,EAAAgB,GAAA,CAAA,IAAAC,EAF7BhH,EAAG,OAAQgE,EAAEpC,OAAOqF,MAAM,CAAAC,EAC1B,CAAE,GAAGtC,GAAgB,CAAE,GAAGD,GAAkB,CAAG,CAAA,OAAAqC,IAAAD,EAAAhE,GAAAiD,EAAAa,EAAAE,EAAAhE,EAAAiE,EAAA,CAAAD,EAAAI,EAAAC,EAAAP,EAAAK,EAAAH,EAAAI,EAAA,CAAAJ,GAAA,CAAAhE,EAAAsE,IAAAA,GAAAF,EAAAE,IAAAA,GAAA,CAAA,CAAAR,GAAA,CAAA,CAAAP,EAAA,CAAAM,EAAAN,OAAA,CAAA,IAAAgB,EAAArB,MAAA,CAAA,CAiBvDjC,EAAE5C,SAAQ,CAAA,UAAVkG,GAAA,OAAA,CAAA,IAAAC,EAAAC,GAAA,CACgD,OADhDC,EAAAF,EAAA,QAC2DvD,EAAEhD,QAAO,GAAA,CAAA4F,EAAAW,EAAApC,EAChE/E,EAAC,CAACoD,KAAM,GAAE,CAAA,CAAA,CAAAuC,MAAAC,EAAAuB,EADEvH,EAAG,OAAQgE,EAAEpC,OAAO8F,YAAY,CAAA,CAAA,CAAAH,KAGhD,IAAA,CAAAf,EAAA,CAAAI,EAAAJ,EAAArB,EAGEvE,EAAI,CAAA,IAAC+E,MAAI,CAAA,OAAE3B,EAAE3C,QAAM,IAAEsG,UAAQ,CAAA,WAAA,CAAA,IAAAC,EAAAC,GAAA,CAAsC,OAAtCD,EAAArB,WAAAK,EAAAgB,EAA+B1D,EAAO,KAAA,CAAA0D,KAAA,EAAA,IAAAlC,UAAA,CAAA,OACjE1B,EAAE3C,QAAiB,CAAA,CAAA,CAAAuF,EAAAH,EAAAtB,EAKrBvE,EAAI,CAAA,IAAC+E,MAAI,CAAA,OAAE3B,EAAE1C,MAAI,IAAAoE,UAAA,CAAA,OAAG1B,EAAE1C,MAAe,CAAA,CAAA,CAAAsF,EAAAN,EAAAnB,EAGvCvE,EAAI,CAAA,IAAC+E,MAAI,CAAA,OAAE3B,EAAEzC,QAAM,IAAAmE,UAAA,CAAA,IAAAsC,EAAAnC,GAAA,CAC0B,OAD1Be,EAAAoB,MAC6BhE,EAAEzC,OAAiB,CAAAwE,MAAAC,EAAAgC,EAAtDhI,EAAG,YAAagE,EAAEpC,OAAOL,OAAO,CAAA,CAAA,CAAAyG,GAAA,CAAA,CAAA,KAAA,CAAAjC,EAAAgB,GAAA,CAAA,IAAAkB,EAxBvCjI,EAAG,OAAQgE,EAAEpC,OAAOqF,MAAM,CAAAiB,EAC1B,CACL,GAAGzD,GAAoB,CACvB,GAAGG,GAAgB,CACnBuD,WAAYlD,GAAY,CAAG,UAAY,SACxC,CAAAmD,EAQWpI,EAAG,YAAagE,EAAEpC,OAAOP,OAAO,CAAAgH,EAMhCrI,EAAG,OAAQgE,EAAEpC,OAAON,KAAK,CAAA,OAAA2G,IAAAlB,EAAAhE,GAAAiD,EAAAM,EAAAS,EAAAhE,EAAAkF,EAAA,CAAAlB,EAAAI,EAAAC,EAAAd,EAAA4B,EAAAnB,EAAAI,EAAA,CAAAiB,IAAArB,EAAAuB,GAAAtC,EAAAQ,EAAAO,EAAAuB,EAAAF,EAAA,CAAAC,IAAAtB,EAAAwB,GAAAvC,EAAAS,EAAAM,EAAAwB,EAAAF,EAAA,CAAAtB,GAAA,CAAAhE,EAAAsE,IAAAA,GAAAF,EAAAE,IAAAA,GAAAiB,EAAAjB,IAAAA,GAAAkB,EAAAlB,IAAAA,GAAA,CAAA,CAAAjB,KAAA,CAAA,EAAA,CAAA,EAalCoC,EAAQrI,EAAkB4D,EAAgB,CAAEhC,UAAW,YAAa4D,KAAM,OAAQ,CAAC,CAEtE8C,EAAA,CAAA,QAAA,CAAA"}
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modalContext.d.ts","sourceRoot":"","sources":["../../../src/components/modal/modalContext.tsx"],"names":[],"mappings":"AACA,OAAO,EAAkB,SAAS,EAAE,MAAM,SAAS,CAAC;AAIpD,KAAK,aAAa,GAAG;IACnB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAEF,wBAAgB,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,CAAC,GAAG,aAAa,
|
|
1
|
+
{"version":3,"file":"modalContext.d.ts","sourceRoot":"","sources":["../../../src/components/modal/modalContext.tsx"],"names":[],"mappings":"AACA,OAAO,EAAkB,SAAS,EAAE,MAAM,SAAS,CAAC;AAIpD,KAAK,aAAa,GAAG;IACnB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAEF,wBAAgB,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,CAAC,GAAG,aAAa,CA8CzF;AAED,wBAAgB,cAAc,SAG7B"}
|