@spark-ui/components 16.2.3 → 17.0.1-beta.0
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/Button-CXL2NOrq.js +2 -0
- package/dist/Button-CXL2NOrq.js.map +1 -0
- package/dist/{Button-DPncfbbM.mjs → Button-CcIRizse.mjs} +25 -79
- package/dist/Button-CcIRizse.mjs.map +1 -0
- package/dist/{Icon-C23-htlD.mjs → Icon-BO327oHU.mjs} +8 -9
- package/dist/Icon-BO327oHU.mjs.map +1 -0
- package/dist/Icon-C-cNTnzd.js +2 -0
- package/dist/Icon-C-cNTnzd.js.map +1 -0
- package/dist/{IconButton-Bfd-6BAD.mjs → IconButton-CP4JbWsI.mjs} +14 -14
- package/dist/IconButton-CP4JbWsI.mjs.map +1 -0
- package/dist/IconButton-JFDGiOOn.js +2 -0
- package/dist/IconButton-JFDGiOOn.js.map +1 -0
- package/dist/Spinner-Br4Rp9V2.js +2 -0
- package/dist/Spinner-Br4Rp9V2.js.map +1 -0
- package/dist/{Spinner-aLrtE2JN.mjs → Spinner-Co3AjkQV.mjs} +7 -8
- package/dist/Spinner-Co3AjkQV.mjs.map +1 -0
- package/dist/TextLink-5MvP0P8D.js +2 -0
- package/dist/TextLink-5MvP0P8D.js.map +1 -0
- package/dist/{TextLink-D7mOCjY_.mjs → TextLink-Cc_LeVcx.mjs} +10 -11
- package/dist/TextLink-Cc_LeVcx.mjs.map +1 -0
- package/dist/accordion/index.js +1 -1
- package/dist/accordion/index.mjs +1 -1
- package/dist/avatar/index.js +1 -1
- package/dist/avatar/index.mjs +2 -2
- package/dist/badge/BadgeItem.styles.d.ts +1 -1
- package/dist/badge/index.js +1 -1
- package/dist/badge/index.js.map +1 -1
- package/dist/badge/index.mjs +10 -11
- package/dist/badge/index.mjs.map +1 -1
- package/dist/breadcrumb/index.js +1 -1
- package/dist/breadcrumb/index.mjs +2 -2
- package/dist/button/Button.styles.d.ts +1 -1
- package/dist/button/index.js +1 -1
- package/dist/button/index.mjs +1 -1
- package/dist/button/variants/contrast.d.ts +0 -4
- package/dist/button/variants/filled.d.ts +0 -4
- package/dist/button/variants/ghost.d.ts +0 -4
- package/dist/button/variants/outlined.d.ts +0 -4
- package/dist/button/variants/tinted.d.ts +0 -4
- package/dist/card/Backdrop.d.ts +1 -1
- package/dist/card/Card.styles.d.ts +1 -1
- package/dist/card/Content.styles.d.ts +1 -1
- package/dist/card/index.js +1 -1
- package/dist/card/index.js.map +1 -1
- package/dist/card/index.mjs +12 -31
- package/dist/card/index.mjs.map +1 -1
- package/dist/carousel/CarouselPageIndicator.d.ts +1 -1
- package/dist/carousel/index.js +1 -1
- package/dist/carousel/index.js.map +1 -1
- package/dist/carousel/index.mjs +29 -29
- package/dist/carousel/index.mjs.map +1 -1
- package/dist/checkbox/CheckboxInput.styles.d.ts +1 -1
- package/dist/checkbox/index.js +1 -1
- package/dist/checkbox/index.js.map +1 -1
- package/dist/checkbox/index.mjs +26 -33
- package/dist/checkbox/index.mjs.map +1 -1
- package/dist/chip/Chip.styles.d.ts +1 -1
- package/dist/chip/index.js +1 -1
- package/dist/chip/index.js.map +1 -1
- package/dist/chip/index.mjs +34 -69
- package/dist/chip/index.mjs.map +1 -1
- package/dist/chip/variants/dashed.d.ts +0 -4
- package/dist/chip/variants/outlined.d.ts +0 -4
- package/dist/chip/variants/tinted.d.ts +0 -4
- package/dist/combobox/index.js +1 -1
- package/dist/combobox/index.js.map +1 -1
- package/dist/combobox/index.mjs +41 -41
- package/dist/combobox/index.mjs.map +1 -1
- package/dist/dialog/index.js +1 -1
- package/dist/dialog/index.mjs +2 -2
- package/dist/drawer/index.js +1 -1
- package/dist/drawer/index.mjs +2 -2
- package/dist/dropdown/index.js +1 -1
- package/dist/dropdown/index.js.map +1 -1
- package/dist/dropdown/index.mjs +2 -2
- package/dist/dropdown/index.mjs.map +1 -1
- package/dist/file-upload/index.js +1 -1
- package/dist/file-upload/index.js.map +1 -1
- package/dist/file-upload/index.mjs +4 -4
- package/dist/file-upload/index.mjs.map +1 -1
- package/dist/form-field/index.js +1 -1
- package/dist/form-field/index.mjs +1 -1
- package/dist/icon/Icon.styles.d.ts +1 -1
- package/dist/icon/index.js +1 -1
- package/dist/icon/index.mjs +1 -1
- package/dist/icon-button/index.js +1 -1
- package/dist/icon-button/index.mjs +1 -1
- package/dist/input/index.js +1 -1
- package/dist/input/index.js.map +1 -1
- package/dist/input/index.mjs +7 -7
- package/dist/input/index.mjs.map +1 -1
- package/dist/pagination/index.js +1 -1
- package/dist/pagination/index.mjs +3 -3
- package/dist/popover/PopoverContent.styles.d.ts +1 -1
- package/dist/popover/PopoverContext.d.ts +1 -1
- package/dist/popover/index.js +1 -1
- package/dist/popover/index.js.map +1 -1
- package/dist/popover/index.mjs +33 -35
- package/dist/popover/index.mjs.map +1 -1
- package/dist/progress/ProgressIndicator.d.ts +1 -1
- package/dist/progress/index.js +1 -1
- package/dist/progress/index.js.map +1 -1
- package/dist/progress/index.mjs +42 -43
- package/dist/progress/index.mjs.map +1 -1
- package/dist/progress-tracker/ProgressTrackerStep.styles.d.ts +1 -1
- package/dist/progress-tracker/ProgressTrackerStepIndicator.styles.d.ts +1 -1
- package/dist/progress-tracker/index.js +1 -1
- package/dist/progress-tracker/index.js.map +1 -1
- package/dist/progress-tracker/index.mjs +38 -38
- package/dist/progress-tracker/index.mjs.map +1 -1
- package/dist/radio-group/RadioIndicator.styles.d.ts +1 -1
- package/dist/radio-group/RadioInput.styles.d.ts +1 -1
- package/dist/radio-group/index.js +1 -1
- package/dist/radio-group/index.js.map +1 -1
- package/dist/radio-group/index.mjs +47 -53
- package/dist/radio-group/index.mjs.map +1 -1
- package/dist/rating/index.js +1 -1
- package/dist/rating/index.mjs +1 -1
- package/dist/rating-display/index.js +1 -1
- package/dist/rating-display/index.mjs +1 -1
- package/dist/scrolling-list/index.js +1 -1
- package/dist/scrolling-list/index.mjs +3 -3
- package/dist/segmented-gauge/SegmentedGauge.d.ts +1 -1
- package/dist/segmented-gauge/SegmentedGaugeContext.d.ts +1 -1
- package/dist/segmented-gauge/index.js +1 -1
- package/dist/segmented-gauge/index.js.map +1 -1
- package/dist/segmented-gauge/index.mjs +14 -16
- package/dist/segmented-gauge/index.mjs.map +1 -1
- package/dist/select/index.js +1 -1
- package/dist/select/index.js.map +1 -1
- package/dist/select/index.mjs +2 -2
- package/dist/select/index.mjs.map +1 -1
- package/dist/slider/SliderThumb.styles.d.ts +1 -1
- package/dist/slider/SliderTrack.styles.d.ts +1 -1
- package/dist/slider/index.js +1 -1
- package/dist/slider/index.js.map +1 -1
- package/dist/slider/index.mjs +3 -5
- package/dist/slider/index.mjs.map +1 -1
- package/dist/snackbar/SnackbarItem.styles.d.ts +1 -1
- package/dist/snackbar/index.js +1 -1
- package/dist/snackbar/index.js.map +1 -1
- package/dist/snackbar/index.mjs +24 -35
- package/dist/snackbar/index.mjs.map +1 -1
- package/dist/snackbar/snackbarVariants.d.ts +0 -8
- package/dist/spinner/Spinner.styles.d.ts +1 -1
- package/dist/spinner/index.js +1 -1
- package/dist/spinner/index.mjs +1 -1
- package/dist/stepper/index.js +1 -1
- package/dist/stepper/index.mjs +2 -2
- package/dist/switch/SwitchInput.styles.d.ts +1 -1
- package/dist/switch/index.js +1 -1
- package/dist/switch/index.js.map +1 -1
- package/dist/switch/index.mjs +22 -23
- package/dist/switch/index.mjs.map +1 -1
- package/dist/tabs/TabsTrigger.styles.d.ts +1 -1
- package/dist/tabs/index.js +1 -1
- package/dist/tabs/index.js.map +1 -1
- package/dist/tabs/index.mjs +20 -21
- package/dist/tabs/index.mjs.map +1 -1
- package/dist/tag/Tag.styles.d.ts +1 -1
- package/dist/tag/index.js +1 -1
- package/dist/tag/index.js.map +1 -1
- package/dist/tag/index.mjs +19 -35
- package/dist/tag/index.mjs.map +1 -1
- package/dist/tag/variants/filled.d.ts +0 -4
- package/dist/tag/variants/outlined.d.ts +0 -4
- package/dist/tag/variants/tinted.d.ts +0 -4
- package/dist/text-link/TextLink.d.ts +1 -1
- package/dist/text-link/index.js +1 -1
- package/dist/text-link/index.mjs +1 -1
- package/dist/textarea/index.js +1 -1
- package/dist/textarea/index.js.map +1 -1
- package/dist/textarea/index.mjs +10 -14
- package/dist/textarea/index.mjs.map +1 -1
- package/dist/toast/Toast.styles.d.ts +1 -1
- package/dist/toast/index.js +1 -1
- package/dist/toast/index.js.map +1 -1
- package/dist/toast/index.mjs +25 -37
- package/dist/toast/index.mjs.map +1 -1
- package/dist/toast/types.d.ts +1 -1
- package/package.json +4 -4
- package/dist/Button-B6rA3-e5.js +0 -2
- package/dist/Button-B6rA3-e5.js.map +0 -1
- package/dist/Button-DPncfbbM.mjs.map +0 -1
- package/dist/Icon-C23-htlD.mjs.map +0 -1
- package/dist/Icon-CF0W0LKr.js +0 -2
- package/dist/Icon-CF0W0LKr.js.map +0 -1
- package/dist/IconButton-Bfd-6BAD.mjs.map +0 -1
- package/dist/IconButton-D3g86WpZ.js +0 -2
- package/dist/IconButton-D3g86WpZ.js.map +0 -1
- package/dist/Spinner-_Kffli3B.js +0 -2
- package/dist/Spinner-_Kffli3B.js.map +0 -1
- package/dist/Spinner-aLrtE2JN.mjs.map +0 -1
- package/dist/TextLink-C3xDLsbC.js +0 -2
- package/dist/TextLink-C3xDLsbC.js.map +0 -1
- package/dist/TextLink-D7mOCjY_.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../src/carousel/useCarouselVisibility.ts","../../src/carousel/useEvent.ts","../../src/carousel/useIsMounted.ts","../../src/carousel/useScrollEnd.ts","../../src/carousel/useResizeObserver.ts","../../src/carousel/utils.ts","../../src/carousel/useSnapPoints.ts","../../src/carousel/useCarousel.ts","../../src/carousel/Carousel.tsx","../../src/carousel/CarouselControls.tsx","../../src/carousel/CarouselNextButton.tsx","../../src/carousel/CarouselPageIndicator.tsx","../../src/carousel/CarouselPagePicker.tsx","../../src/carousel/CarouselPrevButton.tsx","../../src/carousel/useIsVisible.ts","../../src/carousel/CarouselSlide.tsx","../../src/carousel/CarouselSlides.tsx","../../src/carousel/CarouselViewport.tsx","../../src/carousel/index.ts"],"sourcesContent":["import { RefObject, useCallback, useEffect, useRef } from 'react'\n\n/**\n * Hook to manage slide visibility using a centralized IntersectionObserver.\n * This optimizes performance by using a single observer per carousel instead of one per slide.\n *\n * @param carouselRef - Reference to the carousel container element\n * @returns Object with functions to register/unregister slides and check visibility\n */\nexport function useCarouselVisibility(carouselRef: RefObject<HTMLDivElement | null>) {\n const slideVisibilityMap = useRef<Map<HTMLElement, boolean>>(new Map())\n const visibilityObserverRef = useRef<IntersectionObserver | null>(null)\n const visibilityCallbacksRef = useRef<Map<HTMLElement, (isVisible: boolean) => void>>(new Map())\n\n // Create the shared IntersectionObserver callback\n const createObserverCallback = useCallback(() => {\n return (entries: IntersectionObserverEntry[]) => {\n // Batch all visibility updates to minimize re-renders\n entries.forEach(entry => {\n const isVisible = entry.isIntersecting\n const element = entry.target as HTMLElement\n slideVisibilityMap.current.set(element, isVisible)\n\n // Notify the callback if it exists\n const callback = visibilityCallbacksRef.current.get(element)\n if (callback) {\n callback(isVisible)\n }\n })\n }\n }, [])\n\n // Initialize or get the shared IntersectionObserver\n const getOrCreateObserver = useCallback(() => {\n if (visibilityObserverRef.current) {\n return visibilityObserverRef.current\n }\n\n const container = carouselRef.current\n if (!container) return null\n\n const observer = new IntersectionObserver(createObserverCallback(), {\n root: container,\n threshold: 0.2,\n })\n\n visibilityObserverRef.current = observer\n\n return observer\n }, [carouselRef, createObserverCallback])\n\n // Initialize the shared IntersectionObserver when container is ready\n useEffect(() => {\n const observer = getOrCreateObserver()\n // Capture ref values to avoid stale closure warnings\n const visibilityMap = slideVisibilityMap.current\n const callbacksMap = visibilityCallbacksRef.current\n\n return () => {\n if (observer) {\n observer.disconnect()\n visibilityMap.clear()\n callbacksMap.clear()\n visibilityObserverRef.current = null\n }\n }\n }, [getOrCreateObserver])\n\n // Register a slide element with the observer\n const registerSlide = useCallback(\n (element: HTMLElement | null, callback: (isVisible: boolean) => void) => {\n if (!element) return\n\n const observer = getOrCreateObserver()\n if (!observer) {\n // If container is not ready yet, retry on next tick\n setTimeout(() => registerSlide(element, callback), 0)\n\n return\n }\n\n // Check initial visibility (default to true for slides that are already in view)\n const initialVisible = slideVisibilityMap.current.get(element) ?? true\n slideVisibilityMap.current.set(element, initialVisible)\n visibilityCallbacksRef.current.set(element, callback)\n observer.observe(element)\n\n // Call callback with initial state\n callback(initialVisible)\n },\n [getOrCreateObserver]\n )\n\n // Unregister a slide element from the observer\n const unregisterSlide = useCallback((element: HTMLElement | null) => {\n if (!element) return\n\n const observer = visibilityObserverRef.current\n if (observer) {\n observer.unobserve(element)\n }\n slideVisibilityMap.current.delete(element)\n visibilityCallbacksRef.current.delete(element)\n }, [])\n\n // Get current visibility state for a slide\n const isSlideVisible = useCallback((element: HTMLElement | null): boolean => {\n if (!element) return true\n\n return slideVisibilityMap.current.get(element) ?? true\n }, [])\n\n return {\n registerSlide,\n unregisterSlide,\n isSlideVisible,\n }\n}\n","import { useCallback, useLayoutEffect, useRef } from 'react'\n\ntype AnyFunction = (...args: any[]) => any\n\n/**\n * Directly from this gist: https://gist.github.com/diegohaz/695097a06f038a707c3a1b11e4e40195\n * Until React releases a native `useEvent` hook.\n */\nexport function useEvent<T extends AnyFunction>(callback?: T) {\n const ref = useRef<AnyFunction | undefined>(() => {\n throw new Error('Cannot call an event handler while rendering.')\n })\n\n useLayoutEffect(() => {\n ref.current = callback\n })\n\n return useCallback<AnyFunction>((...args) => ref.current?.(...args), []) as T\n}\n","import { useEffect, useRef } from 'react'\n\nexport const useIsMounted = () => {\n const isMounted = useRef(false)\n\n useEffect(() => {\n isMounted.current = true\n\n return () => {\n isMounted.current = false\n }\n }, [])\n\n return isMounted\n}\n","import { useEffect, useRef, RefObject } from 'react'\n\nexport function useScrollEnd(scrollRef: RefObject<HTMLDivElement | null>, callback: () => void) {\n const scrollLeft = useRef(0)\n\n /**\n * Safari (and some smaller browsers) to not yet support the `scrollend` event.\n * For those we must rely on the `scroll` event and and an idle state delay to trigger the \"scroll end\".\n *\n * Caveats:\n * - when using a trackpad or your fingers on a touch device, scrolling then holding the position might trigger the \"scrollend\" callback too early.\n */\n const safariTimeout = useRef<NodeJS.Timeout | null>(null)\n\n useEffect(() => {\n const element = scrollRef.current\n if (!element) return\n\n const supportsScrollend = 'onscrollend' in window\n\n const handleScrollEnd = () => {\n callback()\n }\n\n const handleSafariScroll = () => {\n if (safariTimeout.current) {\n clearTimeout(safariTimeout.current)\n }\n\n if (scrollRef.current) {\n scrollLeft.current = scrollRef.current.scrollLeft\n\n safariTimeout.current = setTimeout(() => {\n if (scrollRef.current) {\n handleScrollEnd()\n }\n }, 150)\n }\n }\n\n if (supportsScrollend) {\n element.addEventListener('scrollend', handleScrollEnd)\n } else {\n element.addEventListener('scroll', handleSafariScroll)\n }\n\n return () => {\n if (safariTimeout.current) {\n clearTimeout(safariTimeout.current)\n }\n\n if (supportsScrollend) {\n element.removeEventListener('scrollend', handleScrollEnd)\n } else {\n element.removeEventListener('scroll', handleSafariScroll)\n }\n }\n }, [callback, scrollRef])\n}\n\nexport default useScrollEnd\n","import { useLayoutEffect, RefObject } from 'react'\n\nexport function useResizeObserver<T extends HTMLElement | null>(\n ref: RefObject<T>,\n callback: (width: number) => void\n) {\n useLayoutEffect(() => {\n const element = ref.current\n if (!element) return\n\n const observer = new ResizeObserver(entries => {\n for (const entry of entries) {\n callback(entry.contentRect.width)\n }\n })\n\n observer.observe(element)\n\n return () => observer.disconnect() // Cleanup on unmount\n }, [ref, callback])\n}\n","/**\n * Get the indices of each slides that serves as the start of a page\n * @returns number[] (ex: [0, 2, 4])\n */\nfunction getSnapIndices({\n totalSlides,\n slidesPerMove,\n slidesPerPage,\n}: {\n totalSlides: number\n slidesPerMove: number | 'auto'\n slidesPerPage: number\n}) {\n const slideBy = slidesPerMove === 'auto' ? slidesPerPage : slidesPerMove\n const snapPoints: number[] = []\n\n const lastSnapIndex = Math.floor((totalSlides - slidesPerPage) / slideBy) * slideBy\n\n for (let i = 0; i <= lastSnapIndex; i += slideBy) {\n snapPoints.push(i)\n }\n\n // Adding final snap point if necessary\n if (snapPoints[snapPoints.length - 1] !== totalSlides - slidesPerPage) {\n snapPoints.push(totalSlides - slidesPerPage)\n }\n\n return snapPoints\n}\n\nexport function getSlideElements(container: HTMLDivElement | null): Element[] {\n return container ? Array.from(container.querySelectorAll('[data-part=\"item\"]')) : []\n}\n\nexport function isSnapPoint(\n slideIndex: number,\n {\n container,\n slidesPerMove,\n slidesPerPage,\n }: {\n container: HTMLDivElement | null\n slidesPerMove: number | 'auto'\n slidesPerPage: number\n }\n) {\n return getSnapIndices({\n totalSlides: getSlideElements(container).length,\n slidesPerPage,\n slidesPerMove,\n }).includes(slideIndex)\n}\n\n/**\n * Get the scroll value of each slides that serves as the start of a page\n * @returns number[] (ex for a 400px carousel with no gap: [400, 800, 1200])\n */\nexport function getSnapPositions({\n container,\n slidesPerMove,\n slidesPerPage,\n}: {\n container: HTMLDivElement | null\n slidesPerMove: number | 'auto'\n slidesPerPage: number\n}) {\n if (!container) return []\n\n return getSlideElements(container)\n .filter((_, index) => {\n return isSnapPoint(index, {\n slidesPerMove,\n slidesPerPage,\n container,\n })\n })\n .map(slide => (slide as HTMLElement).offsetLeft)\n}\n\n/**\n * Calculate the state of a dot indicator of a carousel depending on the current page and the total number of pages.\n */\nexport function computeDotState({\n dotIndex,\n pageState,\n totalPages,\n maxDots = 5,\n}: {\n dotIndex: number\n pageState: number\n totalPages: number\n maxDots?: number\n}): 'active' | 'edge' | 'idle' | 'hidden' {\n if (totalPages <= maxDots) {\n return dotIndex === pageState ? 'active' : 'idle'\n }\n\n if (pageState <= Math.floor(maxDots / 2)) {\n if (dotIndex > maxDots - 1) return 'hidden'\n if (dotIndex === pageState) return 'active'\n if (dotIndex === maxDots - 1) return 'edge'\n\n return 'idle'\n }\n\n if (pageState >= totalPages - Math.ceil(maxDots / 2)) {\n const startIndex = totalPages - maxDots\n if (dotIndex < startIndex) return 'hidden'\n if (dotIndex === pageState) return 'active'\n if (dotIndex === startIndex) return 'edge'\n\n return 'idle'\n }\n\n const startIndex = pageState - Math.floor(maxDots / 2)\n const endIndex = pageState + Math.floor(maxDots / 2)\n if (dotIndex < startIndex || dotIndex > endIndex) return 'hidden'\n if (dotIndex === pageState) return 'active'\n if (dotIndex === startIndex || dotIndex === endIndex) return 'edge'\n\n return 'idle'\n}\n","import { useMemo, useState, RefObject } from 'react'\n\nimport { useResizeObserver } from './useResizeObserver'\nimport { getSnapPositions } from './utils'\n\n/**\n * Get the scroll value of each slides that serves as the start of a page\n * The array is updated when resize event are caught in the carousel.\n */\nexport function useSnapPoints<T extends HTMLDivElement | null>(\n initialSnapPoints: number[] = [],\n {\n carouselRef,\n slidesPerMove,\n slidesPerPage,\n }: {\n carouselRef: RefObject<T>\n slidesPerMove: 'auto' | number\n slidesPerPage: number\n }\n) {\n const [pageSnapPoints, setPageSnapPoints] = useState(initialSnapPoints)\n\n const stableSnapPoints = useMemo(() => pageSnapPoints, [pageSnapPoints])\n\n /**\n * On resize, dimensions of the carousel might changes, which requires to update the snap points positions in the state.\n */\n useResizeObserver(carouselRef, () => {\n const newSnapPoints = getSnapPositions({\n slidesPerMove,\n slidesPerPage,\n container: carouselRef.current,\n })\n\n if (JSON.stringify(pageSnapPoints) !== JSON.stringify(newSnapPoints)) {\n setPageSnapPoints(newSnapPoints)\n }\n })\n\n return [stableSnapPoints, setPageSnapPoints] as const\n}\n","/* eslint-disable max-lines-per-function */\nimport {\n KeyboardEvent,\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react'\n\nimport {\n CarouselAPI,\n ComputedControlProps,\n ComputedIndicatorGroupProps,\n ComputedIndicatorProps,\n ComputedRootProps,\n ComputedSlideGroupProps,\n ComputedSlideProps,\n ComputedTriggerProps,\n UseCarouselProps,\n} from './types'\nimport { useCarouselVisibility } from './useCarouselVisibility'\nimport { useEvent } from './useEvent'\nimport { useIsMounted } from './useIsMounted'\nimport { useScrollEnd } from './useScrollEnd'\nimport { useSnapPoints } from './useSnapPoints'\nimport { computeDotState, getSnapPositions, isSnapPoint } from './utils'\n\nconst DATA_SCOPE = 'carousel' as const\nconst DIRECTION = 'ltr' as const\n\nexport const useCarousel = ({\n defaultPage,\n gap = 16,\n snapType = 'mandatory',\n snapStop = 'always',\n scrollPadding = 0,\n slidesPerPage = 1,\n slidesPerMove = 'auto',\n scrollBehavior = 'smooth',\n loop = false,\n pagePickerInset = false,\n maxDots = 5,\n // state control\n page: controlledPage,\n onPageChange: onPageChangeProp,\n}: UseCarouselProps): CarouselAPI => {\n const carouselId = useId()\n const [pageState, setPageState] = useState(defaultPage || controlledPage || 0)\n\n const carouselRef = useRef<HTMLDivElement>(null)\n const pageIndicatorsRefs = useRef<(HTMLElement | null)[]>([])\n const isMountedRef = useIsMounted()\n const isMounted = isMountedRef.current\n const onPageChange = useEvent(onPageChangeProp)\n\n // Centralized visibility management with a single IntersectionObserver per carousel\n const { registerSlide, unregisterSlide, isSlideVisible } = useCarouselVisibility(carouselRef)\n\n const [pageSnapPoints] = useSnapPoints([], {\n carouselRef,\n slidesPerMove,\n slidesPerPage,\n })\n\n const canScrollPrev = useRef(loop || pageState > 0)\n const canScrollNext = useRef(loop || pageState < pageSnapPoints.length - 1)\n canScrollPrev.current = loop || pageState > 0\n canScrollNext.current = loop || pageState < pageSnapPoints.length - 1\n\n const handlePageChange = useCallback(\n (page: number) => {\n if (page !== pageState) {\n setPageState(page)\n onPageChange?.(page)\n }\n },\n [onPageChange, pageState]\n )\n\n const scrollTo = useCallback(\n (page: number, behavior: 'instant' | 'smooth') => {\n if (carouselRef.current) {\n carouselRef.current.scrollTo({\n left: pageSnapPoints[page],\n behavior: behavior === 'instant' ? 'auto' : 'smooth',\n })\n handlePageChange(page)\n }\n },\n [handlePageChange, pageSnapPoints]\n )\n\n const scrollPrev = useCallback(\n (cb?: (pageIndex: number) => void) => {\n if (canScrollPrev) {\n const targetPage =\n loop && pageState === 0 ? pageSnapPoints.length - 1 : Math.max(pageState - 1, 0)\n\n scrollTo(targetPage, scrollBehavior)\n cb?.(targetPage)\n }\n },\n [loop, pageSnapPoints, pageState, scrollBehavior, scrollTo]\n )\n\n const scrollNext = useCallback(\n (cb?: (pageIndex: number) => void) => {\n if (canScrollNext) {\n const targetPage =\n loop && pageState === pageSnapPoints.length - 1\n ? 0\n : Math.min(pageState + 1, pageSnapPoints.length - 1)\n\n scrollTo(targetPage, scrollBehavior)\n cb?.(targetPage)\n }\n },\n [loop, pageSnapPoints, pageState, scrollBehavior, scrollTo]\n )\n\n useEffect(() => {\n if (controlledPage != null) {\n scrollTo(controlledPage, scrollBehavior)\n }\n }, [controlledPage, scrollBehavior, scrollTo])\n\n /**\n * Set the default scroll position of the carousel based on `defaultPage`.\n * As this operation is done before the snap points are set in the state, we have to get them from the ref directly.\n */\n useLayoutEffect(() => {\n if (defaultPage != null && !isMounted && carouselRef.current) {\n const snapPositions = getSnapPositions({\n container: carouselRef.current,\n slidesPerMove,\n slidesPerPage,\n })\n\n carouselRef.current.scrollTo({\n left: snapPositions[defaultPage],\n behavior: 'instant',\n })\n }\n }, [defaultPage, isMounted, slidesPerMove, slidesPerPage])\n\n /**\n * Monitoring scrollend events inside the scrollable area to sync the carousel active page with current scroll position.\n * Scrollend has been chosen over \"scroll\" for performance reason.\n */\n const syncPageStateWithScrollPosition = useCallback(() => {\n if (!carouselRef.current || pageSnapPoints.length === 0) return\n\n const { scrollLeft } = carouselRef.current\n\n const distances = pageSnapPoints.map(pagePosition => Math.abs(scrollLeft - pagePosition))\n const pageInViewport = distances.indexOf(Math.min(...distances))\n\n if (pageInViewport !== -1) {\n handlePageChange(pageInViewport)\n }\n }, [pageSnapPoints, handlePageChange])\n\n useScrollEnd(carouselRef, syncPageStateWithScrollPosition)\n\n const contextValue: CarouselAPI = {\n ref: carouselRef,\n pageIndicatorsRefs,\n // props\n gap,\n snapType,\n snapStop,\n scrollPadding,\n slidesPerPage,\n slidesPerMove,\n scrollBehavior,\n loop,\n pagePickerInset,\n maxDots,\n // computed state\n page: pageState,\n pageSnapPoints,\n canScrollNext: canScrollNext.current,\n canScrollPrev: canScrollPrev.current,\n scrollTo,\n scrollPrev,\n scrollNext,\n // visibility management\n registerSlide,\n unregisterSlide,\n isSlideVisible,\n // anatomy\n getRootProps: (): ComputedRootProps => ({\n id: `carousel::${carouselId}:`,\n role: 'region',\n 'aria-roledescription': 'carousel',\n 'data-scope': DATA_SCOPE,\n 'data-part': 'root',\n 'data-orientation': 'horizontal',\n dir: DIRECTION,\n style: {\n '--slides-per-page': slidesPerPage,\n '--slide-spacing': `${gap}px`,\n '--slide-item-size':\n 'calc(100% / var(--slides-per-page) - var(--slide-spacing) * (var(--slides-per-page) - 1) / var(--slides-per-page))',\n },\n }),\n\n getControlProps: (): ComputedControlProps => ({\n 'data-scope': DATA_SCOPE,\n 'data-part': 'control',\n 'data-orientation': 'horizontal',\n }),\n\n getPrevTriggerProps: (): ComputedTriggerProps<'prev-trigger'> => ({\n id: `carousel::${carouselId}::prev-trigger`,\n 'aria-controls': `carousel::${carouselId}::item-group`,\n 'data-scope': DATA_SCOPE,\n 'data-part': 'prev-trigger',\n 'data-orientation': 'horizontal',\n type: 'button',\n dir: DIRECTION,\n disabled: !canScrollPrev.current,\n onClick: () => scrollPrev(),\n }),\n\n getNextTriggerProps: (): ComputedTriggerProps<'next-trigger'> => ({\n id: `carousel::${carouselId}::next-trigger`,\n 'aria-controls': `carousel::${carouselId}::item-group`,\n 'data-scope': DATA_SCOPE,\n 'data-part': 'next-trigger',\n 'data-orientation': 'horizontal',\n type: 'button',\n dir: DIRECTION,\n disabled: !canScrollNext.current,\n onClick: () => scrollNext(),\n }),\n\n getSlidesContainerProps: (): ComputedSlideGroupProps => ({\n id: `carousel::${carouselId}::item-group`,\n /**\n * The carousel pattern was originally designed for a single slide.\n * When there is more than one slide, the aria-live region is set to off to avoid announcing the whole list of slides.\n * This is not ideal but we keep it for backwards compatibility.\n *\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/carousel/#wai-aria-attributes\n */\n 'aria-live': slidesPerPage > 1 ? 'off' : 'polite',\n 'data-scope': DATA_SCOPE,\n 'data-part': 'item-group',\n 'data-orientation': 'horizontal',\n dir: DIRECTION,\n tabIndex: 0,\n style: {\n display: 'grid',\n gap: 'var(--slide-spacing)',\n scrollSnapType: `x ${snapType}`,\n gridAutoFlow: 'column',\n scrollbarWidth: 'none',\n gridAutoColumns: 'var(--slide-item-size)',\n overflowX: 'auto',\n },\n ref: carouselRef,\n }),\n\n getSlideProps: ({ index }): ComputedSlideProps => {\n const isStopPoint = isSnapPoint(index, {\n container: carouselRef.current,\n slidesPerMove,\n slidesPerPage,\n })\n\n return {\n id: `carousel::${carouselId}::item:${index}`,\n role: 'group',\n 'aria-roledescription': 'slide',\n 'data-scope': DATA_SCOPE,\n 'data-part': 'item',\n 'data-index': index,\n 'data-orientation': 'horizontal',\n dir: DIRECTION,\n style: {\n ...(isStopPoint && {\n scrollSnapAlign: 'start',\n scrollSnapStop: snapStop,\n }),\n },\n }\n },\n\n getIndicatorGroupProps: (): ComputedIndicatorGroupProps => ({\n role: 'radiogroup',\n id: `carousel::${carouselId}::indicator-group`,\n 'data-scope': DATA_SCOPE,\n 'data-part': 'indicator-group',\n 'data-orientation': 'horizontal',\n dir: DIRECTION,\n }),\n\n getIndicatorProps: ({ index }): ComputedIndicatorProps => {\n const dotState = computeDotState({\n dotIndex: index,\n pageState,\n totalPages: pageSnapPoints.length,\n maxDots,\n })\n\n return {\n role: 'radio',\n id: `carousel::${carouselId}::indicator:${index}`,\n 'aria-checked': index === pageState,\n 'data-scope': DATA_SCOPE,\n 'data-part': 'indicator',\n 'data-orientation': 'horizontal',\n 'data-index': index,\n 'data-state': dotState,\n tabIndex: index === pageState ? 0 : -1,\n onClick: () => {\n scrollTo(index, scrollBehavior)\n },\n onKeyDown: (event: KeyboardEvent) => {\n const focusActiveIndicator = (page: number) => {\n pageIndicatorsRefs.current[page]?.focus()\n }\n\n if (event.key === 'ArrowRight' && canScrollNext) {\n scrollNext(focusActiveIndicator)\n } else if (event.key === 'ArrowLeft' && canScrollPrev) {\n scrollPrev(focusActiveIndicator)\n }\n },\n }\n },\n }\n\n return contextValue\n}\n","import { cx } from 'class-variance-authority'\nimport { ComponentProps, createContext, ReactNode, useContext } from 'react'\n\nimport { CarouselAPI, UseCarouselProps } from './types'\nimport { useCarousel } from './useCarousel'\n\ninterface Props extends UseCarouselProps, ComponentProps<'div'> {\n children?: ReactNode\n className?: string\n}\n\nconst CarouselContext = createContext<CarouselAPI | null>(null)\n\nexport const Carousel = ({\n className,\n snapType = 'mandatory',\n snapStop = 'always',\n scrollBehavior = 'smooth',\n slidesPerMove = 'auto',\n pagePickerInset = false,\n slidesPerPage = 1,\n loop = false,\n children,\n gap = 16,\n defaultPage,\n page,\n onPageChange,\n maxDots = 5,\n ...props\n}: Props) => {\n const carouselApi = useCarousel({\n defaultPage,\n slidesPerPage,\n slidesPerMove,\n loop,\n gap,\n scrollBehavior,\n snapStop,\n snapType,\n page,\n pagePickerInset,\n onPageChange,\n maxDots,\n })\n\n return (\n <CarouselContext.Provider\n value={{\n ...carouselApi,\n scrollBehavior,\n }}\n >\n <div\n data-spark-component=\"carousel\"\n className={cx('gap-lg relative box-border flex flex-col', className)}\n {...carouselApi.getRootProps()}\n {...props}\n >\n {children}\n </div>\n </CarouselContext.Provider>\n )\n}\n\nCarousel.displayName = 'Carousel'\n\nexport const useCarouselContext = () => {\n const context = useContext(CarouselContext)\n\n if (!context) {\n throw Error('useCarouselContext must be used within a Carousel provider')\n }\n\n return context\n}\n","import { cx } from 'class-variance-authority'\nimport { HTMLAttributes, ReactNode } from 'react'\n\nimport { useCarouselContext } from './Carousel'\n\ninterface ControlsProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode\n}\n\nexport const CarouselControls = ({ children, className, ...props }: ControlsProps) => {\n const ctx = useCarouselContext()\n\n return (\n <div\n data-spark-component=\"carousel-controls\"\n className={cx(\n 'default:px-lg pointer-events-none absolute inset-0 flex flex-row items-center justify-between',\n className\n )}\n {...ctx.getControlProps()}\n {...props}\n >\n {children}\n </div>\n )\n}\n\nCarouselControls.displayName = 'Carousel.Controls'\n","import { ArrowVerticalRight } from '@spark-ui/icons/ArrowVerticalRight'\n\nimport { Icon } from '../icon'\nimport { IconButton, IconButtonProps } from '../icon-button'\nimport { useCarouselContext } from './Carousel'\n\nexport const CarouselNextButton = ({\n 'aria-label': ariaLabel,\n ...buttonProps\n}: IconButtonProps) => {\n const ctx = useCarouselContext()\n\n return (\n <IconButton\n data-spark-component=\"carousel-next-button\"\n {...ctx.getNextTriggerProps()}\n intent=\"surface\"\n design=\"filled\"\n className=\"pointer-events-auto cursor-pointer shadow-sm disabled:invisible\"\n aria-label={ariaLabel}\n {...buttonProps}\n >\n <Icon>\n <ArrowVerticalRight />\n </Icon>\n </IconButton>\n )\n}\n\nCarouselNextButton.displayName = 'Carousel.NextButton'\n","import { cx } from 'class-variance-authority'\nimport { ReactNode, useEffect, useRef } from 'react'\n\nimport { useCarouselContext } from './Carousel'\n\ninterface Props {\n children?: ReactNode\n 'aria-label': string\n index: number\n className?: string\n unstyled?: boolean\n intent?: 'basic' | 'surface'\n}\n\nexport const CarouselPageIndicator = ({\n children,\n unstyled = false,\n index,\n 'aria-label': ariaLabel,\n className,\n intent = 'basic',\n}: Props) => {\n const ctx = useCarouselContext()\n\n const ref = useRef<HTMLButtonElement | null>(null)\n\n useEffect(() => {\n if (ctx.pageIndicatorsRefs.current) {\n ctx.pageIndicatorsRefs.current[index] = ref.current\n }\n })\n\n const indicatorProps = ctx.getIndicatorProps({ index })\n\n return (\n <button\n data-spark-component=\"carousel-page-indicator\"\n ref={ref}\n key={index}\n {...indicatorProps}\n aria-label={ariaLabel}\n className={cx(\n {\n [cx(\n 'border-outline group relative flex justify-center border-0 hover:cursor-pointer',\n 'm-sm rounded-sm transition-all duration-[200ms] ease-linear',\n 'w-sz-8 h-sz-8',\n 'data-[state=active]:w-sz-32 data-[state=active]:h-sz-8',\n 'data-[state=edge]:w-sz-4 data-[state=edge]:h-sz-4',\n 'data-[state=hidden]:m-0 data-[state=hidden]:size-0',\n intent === 'surface'\n ? 'data-[state=active]:bg-surface bg-surface/dim-2'\n : 'data-[state=active]:bg-basic bg-on-surface/dim-2'\n )]: !unstyled,\n // [dotsStyles]: !unstyled,\n },\n className\n )}\n >\n {children}\n </button>\n )\n}\n\nCarouselPageIndicator.displayName = 'Carousel.PageIndicator'\n","import { cx } from 'class-variance-authority'\nimport { ReactNode } from 'react'\n\nimport { useCarouselContext } from './Carousel'\nimport { CarouselAPI } from './types'\n\ninterface RenderProps extends CarouselAPI {\n pages: number[]\n}\n\ninterface Props {\n children: (renderProps: RenderProps) => ReactNode\n className?: string\n}\n\nexport const CarouselPagePicker = ({ children, className }: Props) => {\n const ctx = useCarouselContext()\n\n return (\n <>\n <div\n data-spark-component=\"carousel-page-picker\"\n {...ctx.getIndicatorGroupProps()}\n className={cx(\n 'flex-wrap items-center justify-center',\n 'default:min-h-sz-16 flex',\n ctx.pagePickerInset && 'bottom-sz-12 absolute inset-x-0',\n className\n )}\n >\n {ctx.pageSnapPoints.length <= 1\n ? null\n : children({\n ...ctx,\n pages: Array.from({ length: ctx.pageSnapPoints.length }, (_, i) => i),\n })}\n </div>\n </>\n )\n}\n\nCarouselPagePicker.displayName = 'Carousel.PagePicker'\n","import { ArrowVerticalLeft } from '@spark-ui/icons/ArrowVerticalLeft'\n\nimport { Icon } from '../icon'\nimport { IconButton, IconButtonProps } from '../icon-button'\nimport { useCarouselContext } from './Carousel'\n\nexport const CarouselPrevButton = ({\n 'aria-label': ariaLabel,\n ...buttonProps\n}: IconButtonProps) => {\n const ctx = useCarouselContext()\n\n return (\n <IconButton\n data-spark-component=\"carousel-prev-button\"\n {...ctx.getPrevTriggerProps()}\n intent=\"surface\"\n design=\"filled\"\n className=\"pointer-events-auto cursor-pointer shadow-sm disabled:invisible\"\n aria-label={ariaLabel}\n {...buttonProps}\n >\n <Icon>\n <ArrowVerticalLeft />\n </Icon>\n </IconButton>\n )\n}\n\nCarouselPrevButton.displayName = 'Carousel.PrevButton'\n","import { RefObject, useEffect, useState } from 'react'\n\nimport { useCarouselContext } from './Carousel'\n\n/**\n * Hook to track slide visibility using the centralized IntersectionObserver.\n * This optimizes performance by using a single observer per carousel instead of one per slide.\n */\nexport function useIsVisible(\n elementRef: RefObject<HTMLElement | null>,\n _parentRef: RefObject<HTMLElement | null>\n) {\n const [isVisible, setIsVisible] = useState(true)\n const ctx = useCarouselContext()\n\n useEffect(() => {\n const el = elementRef.current\n if (!el) return\n\n // Extract stable functions from context to avoid unnecessary re-renders\n const { registerSlide, unregisterSlide } = ctx\n\n // Register the slide with the centralized observer\n registerSlide(el, setIsVisible)\n\n // Cleanup: unregister when the component unmounts\n return () => {\n unregisterSlide(el)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [elementRef]) // Only depend on elementRef, registerSlide/unregisterSlide are stable callbacks\n\n return isVisible\n}\n","import { cx } from 'class-variance-authority'\nimport { ComponentProps, ReactNode, useRef } from 'react'\n\nimport { useCarouselContext } from './Carousel'\nimport { useIsVisible } from './useIsVisible'\n\nexport interface CarouselSlideProps extends ComponentProps<'div'> {\n isSnapPoint?: boolean\n children?: ReactNode\n index?: number\n totalSlides?: number\n className?: string\n}\n\nexport const CarouselSlide = ({\n children,\n index = 0,\n totalSlides,\n className = '',\n ...props\n}: CarouselSlideProps) => {\n const itemRef = useRef<HTMLDivElement>(null)\n const ctx = useCarouselContext()\n\n const isVisible = useIsVisible(itemRef, ctx.ref)\n\n return (\n <div\n data-spark-component=\"carousel-slide\"\n ref={itemRef}\n {...ctx.getSlideProps({ index, totalSlides: totalSlides as number })}\n className={cx('default:bg-surface relative overflow-hidden', className)}\n aria-hidden={!isVisible}\n inert={!isVisible}\n {...props}\n >\n {children}\n </div>\n )\n}\n\nCarouselSlide.displayName = 'Carousel.Slide'\n","import { cx } from 'class-variance-authority'\nimport { Children, cloneElement, ComponentProps, isValidElement, ReactNode } from 'react'\n\nimport { useCarouselContext } from './Carousel'\nimport { CarouselSlideProps } from './CarouselSlide'\n\ninterface Props extends ComponentProps<'div'> {\n children?: ReactNode\n className?: string\n}\n\nexport const CarouselSlides = ({ children, className = '' }: Props) => {\n const ctx = useCarouselContext()\n\n const childrenElements = Children.toArray(children)\n\n return (\n <div\n data-spark-component=\"carousel-slides\"\n {...ctx.getSlidesContainerProps()}\n className={cx(\n 'focus-visible:u-outline relative w-full',\n '[-ms-overflow-style:none] [scrollbar-width:none] [&::-webkit-scrollbar]:hidden',\n className\n )}\n >\n {childrenElements.map((child, index) =>\n isValidElement<CarouselSlideProps>(child)\n ? cloneElement(child, {\n index,\n totalSlides: childrenElements.length,\n })\n : child\n )}\n </div>\n )\n}\n\nCarouselSlides.displayName = 'Carousel.Slides'\n","import { ReactNode } from 'react'\n\ninterface Props {\n children: ReactNode\n}\n\nexport const CarouselViewport = ({ children }: Props) => {\n return <div className=\"relative flex items-center justify-around p-0\">{children}</div>\n}\n\nCarouselViewport.displayName = 'Carousel.Viewport'\n","import { Carousel as Root } from './Carousel'\nimport { CarouselControls as Controls } from './CarouselControls'\nimport { CarouselNextButton as NextButton } from './CarouselNextButton'\nimport { CarouselPageIndicator as PageIndicator } from './CarouselPageIndicator'\nimport { CarouselPagePicker as PagePicker } from './CarouselPagePicker'\nimport { CarouselPrevButton as PrevButton } from './CarouselPrevButton'\nimport { CarouselSlide as Slide } from './CarouselSlide'\nimport { CarouselSlides as Slides } from './CarouselSlides'\nimport { CarouselViewport as Viewport } from './CarouselViewport'\n\nexport const Carousel: typeof Root & {\n Controls: typeof Controls\n NextButton: typeof NextButton\n PrevButton: typeof PrevButton\n Slide: typeof Slide\n Slides: typeof Slides\n Viewport: typeof Viewport\n PagePicker: typeof PagePicker\n PageIndicator: typeof PageIndicator\n} = Object.assign(Root, {\n Controls,\n NextButton,\n PrevButton,\n Slide,\n Slides,\n Viewport,\n PagePicker,\n PageIndicator,\n})\n\nCarousel.displayName = 'Carousel'\n"],"names":["useCarouselVisibility","carouselRef","slideVisibilityMap","useRef","visibilityObserverRef","visibilityCallbacksRef","createObserverCallback","useCallback","entries","entry","isVisible","element","callback","getOrCreateObserver","container","observer","useEffect","visibilityMap","callbacksMap","registerSlide","initialVisible","unregisterSlide","isSlideVisible","useEvent","ref","useLayoutEffect","args","useIsMounted","isMounted","useScrollEnd","scrollRef","scrollLeft","safariTimeout","supportsScrollend","handleScrollEnd","handleSafariScroll","useResizeObserver","getSnapIndices","totalSlides","slidesPerMove","slidesPerPage","slideBy","snapPoints","lastSnapIndex","i","getSlideElements","isSnapPoint","slideIndex","getSnapPositions","_","index","slide","computeDotState","dotIndex","pageState","totalPages","maxDots","startIndex","endIndex","useSnapPoints","initialSnapPoints","pageSnapPoints","setPageSnapPoints","useState","stableSnapPoints","useMemo","newSnapPoints","DATA_SCOPE","DIRECTION","useCarousel","defaultPage","gap","snapType","snapStop","scrollPadding","scrollBehavior","loop","pagePickerInset","controlledPage","onPageChangeProp","carouselId","useId","setPageState","pageIndicatorsRefs","onPageChange","canScrollPrev","canScrollNext","handlePageChange","page","scrollTo","behavior","scrollPrev","cb","targetPage","scrollNext","snapPositions","syncPageStateWithScrollPosition","distances","pagePosition","pageInViewport","isStopPoint","dotState","event","focusActiveIndicator","CarouselContext","createContext","Carousel","className","children","props","carouselApi","jsx","cx","useCarouselContext","context","useContext","CarouselControls","ctx","CarouselNextButton","ariaLabel","buttonProps","IconButton","Icon","ArrowVerticalRight","CarouselPageIndicator","unstyled","intent","indicatorProps","CarouselPagePicker","Fragment","CarouselPrevButton","ArrowVerticalLeft","useIsVisible","elementRef","_parentRef","setIsVisible","el","CarouselSlide","itemRef","CarouselSlides","childrenElements","Children","child","isValidElement","cloneElement","CarouselViewport","Root","Controls","NextButton","PrevButton","Slide","Slides","Viewport","PagePicker","PageIndicator"],"mappings":";;;;;;;AASO,SAASA,GAAsBC,GAA+C;AACnF,QAAMC,IAAqBC,EAAkC,oBAAI,KAAK,GAChEC,IAAwBD,EAAoC,IAAI,GAChEE,IAAyBF,EAAuD,oBAAI,KAAK,GAGzFG,IAAyBC,EAAY,MAClC,CAACC,MAAyC;AAE/C,IAAAA,EAAQ,QAAQ,CAAAC,MAAS;AACvB,YAAMC,IAAYD,EAAM,gBAClBE,IAAUF,EAAM;AACtB,MAAAP,EAAmB,QAAQ,IAAIS,GAASD,CAAS;AAGjD,YAAME,IAAWP,EAAuB,QAAQ,IAAIM,CAAO;AAC3D,MAAIC,KACFA,EAASF,CAAS;AAAA,IAEtB,CAAC;AAAA,EACH,GACC,CAAA,CAAE,GAGCG,IAAsBN,EAAY,MAAM;AAC5C,QAAIH,EAAsB;AACxB,aAAOA,EAAsB;AAG/B,UAAMU,IAAYb,EAAY;AAC9B,QAAI,CAACa,EAAW,QAAO;AAEvB,UAAMC,IAAW,IAAI,qBAAqBT,KAA0B;AAAA,MAClE,MAAMQ;AAAA,MACN,WAAW;AAAA,IAAA,CACZ;AAED,WAAAV,EAAsB,UAAUW,GAEzBA;AAAA,EACT,GAAG,CAACd,GAAaK,CAAsB,CAAC;AAGxC,EAAAU,EAAU,MAAM;AACd,UAAMD,IAAWF,EAAA,GAEXI,IAAgBf,EAAmB,SACnCgB,IAAeb,EAAuB;AAE5C,WAAO,MAAM;AACX,MAAIU,MACFA,EAAS,WAAA,GACTE,EAAc,MAAA,GACdC,EAAa,MAAA,GACbd,EAAsB,UAAU;AAAA,IAEpC;AAAA,EACF,GAAG,CAACS,CAAmB,CAAC;AAGxB,QAAMM,IAAgBZ;AAAA,IACpB,CAACI,GAA6BC,MAA2C;AACvE,UAAI,CAACD,EAAS;AAEd,YAAMI,IAAWF,EAAA;AACjB,UAAI,CAACE,GAAU;AAEb,mBAAW,MAAMI,EAAcR,GAASC,CAAQ,GAAG,CAAC;AAEpD;AAAA,MACF;AAGA,YAAMQ,IAAiBlB,EAAmB,QAAQ,IAAIS,CAAO,KAAK;AAClE,MAAAT,EAAmB,QAAQ,IAAIS,GAASS,CAAc,GACtDf,EAAuB,QAAQ,IAAIM,GAASC,CAAQ,GACpDG,EAAS,QAAQJ,CAAO,GAGxBC,EAASQ,CAAc;AAAA,IACzB;AAAA,IACA,CAACP,CAAmB;AAAA,EAAA,GAIhBQ,IAAkBd,EAAY,CAACI,MAAgC;AACnE,QAAI,CAACA,EAAS;AAEd,UAAMI,IAAWX,EAAsB;AACvC,IAAIW,KACFA,EAAS,UAAUJ,CAAO,GAE5BT,EAAmB,QAAQ,OAAOS,CAAO,GACzCN,EAAuB,QAAQ,OAAOM,CAAO;AAAA,EAC/C,GAAG,CAAA,CAAE,GAGCW,IAAiBf,EAAY,CAACI,MAC7BA,IAEET,EAAmB,QAAQ,IAAIS,CAAO,KAAK,KAF7B,IAGpB,CAAA,CAAE;AAEL,SAAO;AAAA,IACL,eAAAQ;AAAA,IACA,iBAAAE;AAAA,IACA,gBAAAC;AAAA,EAAA;AAEJ;AC7GO,SAASC,GAAgCX,GAAc;AAC5D,QAAMY,IAAMrB,EAAgC,MAAM;AAChD,UAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE,CAAC;AAED,SAAAsB,EAAgB,MAAM;AACpB,IAAAD,EAAI,UAAUZ;AAAA,EAChB,CAAC,GAEML,EAAyB,IAAImB,MAASF,EAAI,UAAU,GAAGE,CAAI,GAAG,EAAE;AACzE;AChBO,MAAMC,KAAe,MAAM;AAChC,QAAMC,IAAYzB,EAAO,EAAK;AAE9B,SAAAa,EAAU,OACRY,EAAU,UAAU,IAEb,MAAM;AACX,IAAAA,EAAU,UAAU;AAAA,EACtB,IACC,CAAA,CAAE,GAEEA;AACT;ACZO,SAASC,GAAaC,GAA6ClB,GAAsB;AAC9F,QAAMmB,IAAa5B,EAAO,CAAC,GASrB6B,IAAgB7B,EAA8B,IAAI;AAExD,EAAAa,EAAU,MAAM;AACd,UAAML,IAAUmB,EAAU;AAC1B,QAAI,CAACnB,EAAS;AAEd,UAAMsB,IAAoB,iBAAiB,QAErCC,IAAkB,MAAM;AAC5B,MAAAtB,EAAA;AAAA,IACF,GAEMuB,IAAqB,MAAM;AAC/B,MAAIH,EAAc,WAChB,aAAaA,EAAc,OAAO,GAGhCF,EAAU,YACZC,EAAW,UAAUD,EAAU,QAAQ,YAEvCE,EAAc,UAAU,WAAW,MAAM;AACvC,QAAIF,EAAU,WACZI,EAAA;AAAA,MAEJ,GAAG,GAAG;AAAA,IAEV;AAEA,WAAID,IACFtB,EAAQ,iBAAiB,aAAauB,CAAe,IAErDvB,EAAQ,iBAAiB,UAAUwB,CAAkB,GAGhD,MAAM;AACX,MAAIH,EAAc,WAChB,aAAaA,EAAc,OAAO,GAGhCC,IACFtB,EAAQ,oBAAoB,aAAauB,CAAe,IAExDvB,EAAQ,oBAAoB,UAAUwB,CAAkB;AAAA,IAE5D;AAAA,EACF,GAAG,CAACvB,GAAUkB,CAAS,CAAC;AAC1B;ACxDO,SAASM,GACdZ,GACAZ,GACA;AACA,EAAAa,EAAgB,MAAM;AACpB,UAAMd,IAAUa,EAAI;AACpB,QAAI,CAACb,EAAS;AAEd,UAAMI,IAAW,IAAI,eAAe,CAAAP,MAAW;AAC7C,iBAAWC,KAASD;AAClB,QAAAI,EAASH,EAAM,YAAY,KAAK;AAAA,IAEpC,CAAC;AAED,WAAAM,EAAS,QAAQJ,CAAO,GAEjB,MAAMI,EAAS,WAAA;AAAA,EACxB,GAAG,CAACS,GAAKZ,CAAQ,CAAC;AACpB;AChBA,SAASyB,GAAe;AAAA,EACtB,aAAAC;AAAA,EACA,eAAAC;AAAA,EACA,eAAAC;AACF,GAIG;AACD,QAAMC,IAAUF,MAAkB,SAASC,IAAgBD,GACrDG,IAAuB,CAAA,GAEvBC,IAAgB,KAAK,OAAOL,IAAcE,KAAiBC,CAAO,IAAIA;AAE5E,WAASG,IAAI,GAAGA,KAAKD,GAAeC,KAAKH;AACvC,IAAAC,EAAW,KAAKE,CAAC;AAInB,SAAIF,EAAWA,EAAW,SAAS,CAAC,MAAMJ,IAAcE,KACtDE,EAAW,KAAKJ,IAAcE,CAAa,GAGtCE;AACT;AAEO,SAASG,EAAiB/B,GAA6C;AAC5E,SAAOA,IAAY,MAAM,KAAKA,EAAU,iBAAiB,oBAAoB,CAAC,IAAI,CAAA;AACpF;AAEO,SAASgC,EACdC,GACA;AAAA,EACE,WAAAjC;AAAA,EACA,eAAAyB;AAAA,EACA,eAAAC;AACF,GAKA;AACA,SAAOH,GAAe;AAAA,IACpB,aAAaQ,EAAiB/B,CAAS,EAAE;AAAA,IACzC,eAAA0B;AAAA,IACA,eAAAD;AAAA,EAAA,CACD,EAAE,SAASQ,CAAU;AACxB;AAMO,SAASC,EAAiB;AAAA,EAC/B,WAAAlC;AAAA,EACA,eAAAyB;AAAA,EACA,eAAAC;AACF,GAIG;AACD,SAAK1B,IAEE+B,EAAiB/B,CAAS,EAC9B,OAAO,CAACmC,GAAGC,MACHJ,EAAYI,GAAO;AAAA,IACxB,eAAAX;AAAA,IACA,eAAAC;AAAA,IACA,WAAA1B;AAAA,EAAA,CACD,CACF,EACA,IAAI,CAAAqC,MAAUA,EAAsB,UAAU,IAV1B,CAAA;AAWzB;AAKO,SAASC,GAAgB;AAAA,EAC9B,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,YAAAC;AAAA,EACA,SAAAC,IAAU;AACZ,GAK0C;AACxC,MAAID,KAAcC;AAChB,WAAOH,MAAaC,IAAY,WAAW;AAG7C,MAAIA,KAAa,KAAK,MAAME,IAAU,CAAC;AACrC,WAAIH,IAAWG,IAAU,IAAU,WAC/BH,MAAaC,IAAkB,WAC/BD,MAAaG,IAAU,IAAU,SAE9B;AAGT,MAAIF,KAAaC,IAAa,KAAK,KAAKC,IAAU,CAAC,GAAG;AACpD,UAAMC,IAAaF,IAAaC;AAChC,WAAIH,IAAWI,IAAmB,WAC9BJ,MAAaC,IAAkB,WAC/BD,MAAaI,IAAmB,SAE7B;AAAA,EACT;AAEA,QAAMA,IAAaH,IAAY,KAAK,MAAME,IAAU,CAAC,GAC/CE,IAAWJ,IAAY,KAAK,MAAME,IAAU,CAAC;AACnD,SAAIH,IAAWI,KAAcJ,IAAWK,IAAiB,WACrDL,MAAaC,IAAkB,WAC/BD,MAAaI,KAAcJ,MAAaK,IAAiB,SAEtD;AACT;AChHO,SAASC,GACdC,IAA8B,IAC9B;AAAA,EACE,aAAA3D;AAAA,EACA,eAAAsC;AAAA,EACA,eAAAC;AACF,GAKA;AACA,QAAM,CAACqB,GAAgBC,CAAiB,IAAIC,EAASH,CAAiB,GAEhEI,IAAmBC,GAAQ,MAAMJ,GAAgB,CAACA,CAAc,CAAC;AAKvE,SAAAzB,GAAkBnC,GAAa,MAAM;AACnC,UAAMiE,IAAgBlB,EAAiB;AAAA,MACrC,eAAAT;AAAA,MACA,eAAAC;AAAA,MACA,WAAWvC,EAAY;AAAA,IAAA,CACxB;AAED,IAAI,KAAK,UAAU4D,CAAc,MAAM,KAAK,UAAUK,CAAa,KACjEJ,EAAkBI,CAAa;AAAA,EAEnC,CAAC,GAEM,CAACF,GAAkBF,CAAiB;AAC7C;ACZA,MAAMK,IAAa,YACbC,IAAY,OAELC,KAAc,CAAC;AAAA,EAC1B,aAAAC;AAAA,EACA,KAAAC,IAAM;AAAA,EACN,UAAAC,IAAW;AAAA,EACX,UAAAC,IAAW;AAAA,EACX,eAAAC,IAAgB;AAAA,EAChB,eAAAlC,IAAgB;AAAA,EAChB,eAAAD,IAAgB;AAAA,EAChB,gBAAAoC,IAAiB;AAAA,EACjB,MAAAC,IAAO;AAAA,EACP,iBAAAC,IAAkB;AAAA,EAClB,SAAArB,IAAU;AAAA;AAAA,EAEV,MAAMsB;AAAA,EACN,cAAcC;AAChB,MAAqC;AACnC,QAAMC,IAAaC,GAAA,GACb,CAAC3B,GAAW4B,CAAY,IAAInB,EAASO,KAAeQ,KAAkB,CAAC,GAEvE7E,IAAcE,EAAuB,IAAI,GACzCgF,IAAqBhF,EAA+B,EAAE,GAEtDyB,IADeD,GAAA,EACU,SACzByD,IAAe7D,GAASwD,CAAgB,GAGxC,EAAE,eAAA5D,IAAe,iBAAAE,IAAiB,gBAAAC,GAAA,IAAmBtB,GAAsBC,CAAW,GAEtF,CAAC4D,CAAc,IAAIF,GAAc,IAAI;AAAA,IACzC,aAAA1D;AAAA,IACA,eAAAsC;AAAA,IACA,eAAAC;AAAA,EAAA,CACD,GAEK6C,IAAgBlF,EAAOyE,KAAQtB,IAAY,CAAC,GAC5CgC,IAAgBnF,EAAOyE,KAAQtB,IAAYO,EAAe,SAAS,CAAC;AAC1E,EAAAwB,EAAc,UAAUT,KAAQtB,IAAY,GAC5CgC,EAAc,UAAUV,KAAQtB,IAAYO,EAAe,SAAS;AAEpE,QAAM0B,IAAmBhF;AAAA,IACvB,CAACiF,MAAiB;AAChB,MAAIA,MAASlC,MACX4B,EAAaM,CAAI,GACjBJ,IAAeI,CAAI;AAAA,IAEvB;AAAA,IACA,CAACJ,GAAc9B,CAAS;AAAA,EAAA,GAGpBmC,IAAWlF;AAAA,IACf,CAACiF,GAAcE,MAAmC;AAChD,MAAIzF,EAAY,YACdA,EAAY,QAAQ,SAAS;AAAA,QAC3B,MAAM4D,EAAe2B,CAAI;AAAA,QACzB,UAAUE,MAAa,YAAY,SAAS;AAAA,MAAA,CAC7C,GACDH,EAAiBC,CAAI;AAAA,IAEzB;AAAA,IACA,CAACD,GAAkB1B,CAAc;AAAA,EAAA,GAG7B8B,IAAapF;AAAA,IACjB,CAACqF,MAAqC;AACpC,UAAIP,GAAe;AACjB,cAAMQ,IACJjB,KAAQtB,MAAc,IAAIO,EAAe,SAAS,IAAI,KAAK,IAAIP,IAAY,GAAG,CAAC;AAEjF,QAAAmC,EAASI,GAAYlB,CAAc,GACnCiB,IAAKC,CAAU;AAAA,MACjB;AAAA,IACF;AAAA,IACA,CAACjB,GAAMf,GAAgBP,GAAWqB,GAAgBc,CAAQ;AAAA,EAAA,GAGtDK,IAAavF;AAAA,IACjB,CAACqF,MAAqC;AACpC,UAAIN,GAAe;AACjB,cAAMO,IACJjB,KAAQtB,MAAcO,EAAe,SAAS,IAC1C,IACA,KAAK,IAAIP,IAAY,GAAGO,EAAe,SAAS,CAAC;AAEvD,QAAA4B,EAASI,GAAYlB,CAAc,GACnCiB,IAAKC,CAAU;AAAA,MACjB;AAAA,IACF;AAAA,IACA,CAACjB,GAAMf,GAAgBP,GAAWqB,GAAgBc,CAAQ;AAAA,EAAA;AAG5D,EAAAzE,EAAU,MAAM;AACd,IAAI8D,KAAkB,QACpBW,EAASX,GAAgBH,CAAc;AAAA,EAE3C,GAAG,CAACG,GAAgBH,GAAgBc,CAAQ,CAAC,GAM7ChE,EAAgB,MAAM;AACpB,QAAI6C,KAAe,QAAQ,CAAC1C,KAAa3B,EAAY,SAAS;AAC5D,YAAM8F,IAAgB/C,EAAiB;AAAA,QACrC,WAAW/C,EAAY;AAAA,QACvB,eAAAsC;AAAA,QACA,eAAAC;AAAA,MAAA,CACD;AAED,MAAAvC,EAAY,QAAQ,SAAS;AAAA,QAC3B,MAAM8F,EAAczB,CAAW;AAAA,QAC/B,UAAU;AAAA,MAAA,CACX;AAAA,IACH;AAAA,EACF,GAAG,CAACA,GAAa1C,GAAWW,GAAeC,CAAa,CAAC;AAMzD,QAAMwD,KAAkCzF,EAAY,MAAM;AACxD,QAAI,CAACN,EAAY,WAAW4D,EAAe,WAAW,EAAG;AAEzD,UAAM,EAAE,YAAA9B,MAAe9B,EAAY,SAE7BgG,IAAYpC,EAAe,IAAI,CAAAqC,MAAgB,KAAK,IAAInE,IAAamE,CAAY,CAAC,GAClFC,IAAiBF,EAAU,QAAQ,KAAK,IAAI,GAAGA,CAAS,CAAC;AAE/D,IAAIE,MAAmB,MACrBZ,EAAiBY,CAAc;AAAA,EAEnC,GAAG,CAACtC,GAAgB0B,CAAgB,CAAC;AAErC,SAAA1D,GAAa5B,GAAa+F,EAA+B,GAEvB;AAAA,IAChC,KAAK/F;AAAA,IACL,oBAAAkF;AAAA;AAAA,IAEA,KAAAZ;AAAA,IACA,UAAAC;AAAA,IACA,UAAAC;AAAA,IACA,eAAAC;AAAA,IACA,eAAAlC;AAAA,IACA,eAAAD;AAAA,IACA,gBAAAoC;AAAA,IACA,MAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,SAAArB;AAAA;AAAA,IAEA,MAAMF;AAAA,IACN,gBAAAO;AAAA,IACA,eAAeyB,EAAc;AAAA,IAC7B,eAAeD,EAAc;AAAA,IAC7B,UAAAI;AAAA,IACA,YAAAE;AAAA,IACA,YAAAG;AAAA;AAAA,IAEA,eAAA3E;AAAA,IACA,iBAAAE;AAAA,IACA,gBAAAC;AAAA;AAAA,IAEA,cAAc,OAA0B;AAAA,MACtC,IAAI,aAAa0D,CAAU;AAAA,MAC3B,MAAM;AAAA,MACN,wBAAwB;AAAA,MACxB,cAAcb;AAAA,MACd,aAAa;AAAA,MACb,oBAAoB;AAAA,MACpB,KAAKC;AAAA,MACL,OAAO;AAAA,QACL,qBAAqB5B;AAAA,QACrB,mBAAmB,GAAG+B,CAAG;AAAA,QACzB,qBACE;AAAA,MAAA;AAAA,IACJ;AAAA,IAGF,iBAAiB,OAA6B;AAAA,MAC5C,cAAcJ;AAAA,MACd,aAAa;AAAA,MACb,oBAAoB;AAAA,IAAA;AAAA,IAGtB,qBAAqB,OAA6C;AAAA,MAChE,IAAI,aAAaa,CAAU;AAAA,MAC3B,iBAAiB,aAAaA,CAAU;AAAA,MACxC,cAAcb;AAAA,MACd,aAAa;AAAA,MACb,oBAAoB;AAAA,MACpB,MAAM;AAAA,MACN,KAAKC;AAAA,MACL,UAAU,CAACiB,EAAc;AAAA,MACzB,SAAS,MAAMM,EAAA;AAAA,IAAW;AAAA,IAG5B,qBAAqB,OAA6C;AAAA,MAChE,IAAI,aAAaX,CAAU;AAAA,MAC3B,iBAAiB,aAAaA,CAAU;AAAA,MACxC,cAAcb;AAAA,MACd,aAAa;AAAA,MACb,oBAAoB;AAAA,MACpB,MAAM;AAAA,MACN,KAAKC;AAAA,MACL,UAAU,CAACkB,EAAc;AAAA,MACzB,SAAS,MAAMQ,EAAA;AAAA,IAAW;AAAA,IAG5B,yBAAyB,OAAgC;AAAA,MACvD,IAAI,aAAad,CAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQ3B,aAAaxC,IAAgB,IAAI,QAAQ;AAAA,MACzC,cAAc2B;AAAA,MACd,aAAa;AAAA,MACb,oBAAoB;AAAA,MACpB,KAAKC;AAAA,MACL,UAAU;AAAA,MACV,OAAO;AAAA,QACL,SAAS;AAAA,QACT,KAAK;AAAA,QACL,gBAAgB,KAAKI,CAAQ;AAAA,QAC7B,cAAc;AAAA,QACd,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,QACjB,WAAW;AAAA,MAAA;AAAA,MAEb,KAAKvE;AAAA,IAAA;AAAA,IAGP,eAAe,CAAC,EAAE,OAAAiD,QAAgC;AAChD,YAAMkD,IAActD,EAAYI,GAAO;AAAA,QACrC,WAAWjD,EAAY;AAAA,QACvB,eAAAsC;AAAA,QACA,eAAAC;AAAA,MAAA,CACD;AAED,aAAO;AAAA,QACL,IAAI,aAAawC,CAAU,UAAU9B,CAAK;AAAA,QAC1C,MAAM;AAAA,QACN,wBAAwB;AAAA,QACxB,cAAciB;AAAA,QACd,aAAa;AAAA,QACb,cAAcjB;AAAA,QACd,oBAAoB;AAAA,QACpB,KAAKkB;AAAA,QACL,OAAO;AAAA,UACL,GAAIgC,KAAe;AAAA,YACjB,iBAAiB;AAAA,YACjB,gBAAgB3B;AAAA,UAAA;AAAA,QAClB;AAAA,MACF;AAAA,IAEJ;AAAA,IAEA,wBAAwB,OAAoC;AAAA,MAC1D,MAAM;AAAA,MACN,IAAI,aAAaO,CAAU;AAAA,MAC3B,cAAcb;AAAA,MACd,aAAa;AAAA,MACb,oBAAoB;AAAA,MACpB,KAAKC;AAAA,IAAA;AAAA,IAGP,mBAAmB,CAAC,EAAE,OAAAlB,QAAoC;AACxD,YAAMmD,IAAWjD,GAAgB;AAAA,QAC/B,UAAUF;AAAA,QACV,WAAAI;AAAA,QACA,YAAYO,EAAe;AAAA,QAC3B,SAAAL;AAAA,MAAA,CACD;AAED,aAAO;AAAA,QACL,MAAM;AAAA,QACN,IAAI,aAAawB,CAAU,eAAe9B,CAAK;AAAA,QAC/C,gBAAgBA,MAAUI;AAAA,QAC1B,cAAca;AAAA,QACd,aAAa;AAAA,QACb,oBAAoB;AAAA,QACpB,cAAcjB;AAAA,QACd,cAAcmD;AAAA,QACd,UAAUnD,MAAUI,IAAY,IAAI;AAAA,QACpC,SAAS,MAAM;AACb,UAAAmC,EAASvC,GAAOyB,CAAc;AAAA,QAChC;AAAA,QACA,WAAW,CAAC2B,MAAyB;AACnC,gBAAMC,IAAuB,CAACf,OAAiB;AAC7C,YAAAL,EAAmB,QAAQK,EAAI,GAAG,MAAA;AAAA,UACpC;AAEA,UAAIc,EAAM,QAAQ,gBAAgBhB,IAChCQ,EAAWS,CAAoB,IACtBD,EAAM,QAAQ,eAAejB,KACtCM,EAAWY,CAAoB;AAAA,QAEnC;AAAA,MAAA;AAAA,IAEJ;AAAA,EAAA;AAIJ,GCtUMC,IAAkBC,GAAkC,IAAI,GAEjDC,IAAW,CAAC;AAAA,EACvB,WAAAC;AAAA,EACA,UAAAnC,IAAW;AAAA,EACX,UAAAC,IAAW;AAAA,EACX,gBAAAE,IAAiB;AAAA,EACjB,eAAApC,IAAgB;AAAA,EAChB,iBAAAsC,IAAkB;AAAA,EAClB,eAAArC,IAAgB;AAAA,EAChB,MAAAoC,IAAO;AAAA,EACP,UAAAgC;AAAA,EACA,KAAArC,IAAM;AAAA,EACN,aAAAD;AAAA,EACA,MAAAkB;AAAA,EACA,cAAAJ;AAAA,EACA,SAAA5B,IAAU;AAAA,EACV,GAAGqD;AACL,MAAa;AACX,QAAMC,IAAczC,GAAY;AAAA,IAC9B,aAAAC;AAAA,IACA,eAAA9B;AAAA,IACA,eAAAD;AAAA,IACA,MAAAqC;AAAA,IACA,KAAAL;AAAA,IACA,gBAAAI;AAAA,IACA,UAAAF;AAAA,IACA,UAAAD;AAAA,IACA,MAAAgB;AAAA,IACA,iBAAAX;AAAA,IACA,cAAAO;AAAA,IACA,SAAA5B;AAAA,EAAA,CACD;AAED,SACE,gBAAAuD;AAAA,IAACP,EAAgB;AAAA,IAAhB;AAAA,MACC,OAAO;AAAA,QACL,GAAGM;AAAA,QACH,gBAAAnC;AAAA,MAAA;AAAA,MAGF,UAAA,gBAAAoC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,wBAAqB;AAAA,UACrB,WAAWC,EAAG,4CAA4CL,CAAS;AAAA,UAClE,GAAGG,EAAY,aAAA;AAAA,UACf,GAAGD;AAAA,UAEH,UAAAD;AAAA,QAAA;AAAA,MAAA;AAAA,IACH;AAAA,EAAA;AAGN;AAEAF,EAAS,cAAc;AAEhB,MAAMO,IAAqB,MAAM;AACtC,QAAMC,IAAUC,GAAWX,CAAe;AAE1C,MAAI,CAACU;AACH,UAAM,MAAM,4DAA4D;AAG1E,SAAOA;AACT,GCjEaE,IAAmB,CAAC,EAAE,UAAAR,GAAU,WAAAD,GAAW,GAAGE,QAA2B;AACpF,QAAMQ,IAAMJ,EAAA;AAEZ,SACE,gBAAAF;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,wBAAqB;AAAA,MACrB,WAAWC;AAAA,QACT;AAAA,QACAL;AAAA,MAAA;AAAA,MAED,GAAGU,EAAI,gBAAA;AAAA,MACP,GAAGR;AAAA,MAEH,UAAAD;AAAA,IAAA;AAAA,EAAA;AAGP;AAEAQ,EAAiB,cAAc;ACrBxB,MAAME,IAAqB,CAAC;AAAA,EACjC,cAAcC;AAAA,EACd,GAAGC;AACL,MAAuB;AACrB,QAAMH,IAAMJ,EAAA;AAEZ,SACE,gBAAAF;AAAA,IAACU;AAAA,IAAA;AAAA,MACC,wBAAqB;AAAA,MACpB,GAAGJ,EAAI,oBAAA;AAAA,MACR,QAAO;AAAA,MACP,QAAO;AAAA,MACP,WAAU;AAAA,MACV,cAAYE;AAAA,MACX,GAAGC;AAAA,MAEJ,UAAA,gBAAAT,EAACW,GAAA,EACC,UAAA,gBAAAX,EAACY,IAAA,CAAA,CAAmB,EAAA,CACtB;AAAA,IAAA;AAAA,EAAA;AAGN;AAEAL,EAAmB,cAAc;ACf1B,MAAMM,IAAwB,CAAC;AAAA,EACpC,UAAAhB;AAAA,EACA,UAAAiB,IAAW;AAAA,EACX,OAAA3E;AAAA,EACA,cAAcqE;AAAA,EACd,WAAAZ;AAAA,EACA,QAAAmB,IAAS;AACX,MAAa;AACX,QAAMT,IAAMJ,EAAA,GAENzF,IAAMrB,EAAiC,IAAI;AAEjD,EAAAa,EAAU,MAAM;AACd,IAAIqG,EAAI,mBAAmB,YACzBA,EAAI,mBAAmB,QAAQnE,CAAK,IAAI1B,EAAI;AAAA,EAEhD,CAAC;AAED,QAAMuG,IAAiBV,EAAI,kBAAkB,EAAE,OAAAnE,GAAO;AAEtD,SACE,gBAAA6D;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,wBAAqB;AAAA,MACrB,KAAAvF;AAAA,MAEC,GAAGuG;AAAA,MACJ,cAAYR;AAAA,MACZ,WAAWP;AAAA,QACT;AAAA,UACE,CAACA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACAc,MAAW,YACP,oDACA;AAAA,UAAA,CACL,GAAG,CAACD;AAAA;AAAA,QAAA;AAAA,QAGPlB;AAAA,MAAA;AAAA,MAGD,UAAAC;AAAA,IAAA;AAAA,IArBI1D;AAAA,EAAA;AAwBX;AAEA0E,EAAsB,cAAc;ACjD7B,MAAMI,IAAqB,CAAC,EAAE,UAAApB,GAAU,WAAAD,QAAuB;AACpE,QAAMU,IAAMJ,EAAA;AAEZ,SACE,gBAAAF,EAAAkB,IAAA,EACE,UAAA,gBAAAlB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,wBAAqB;AAAA,MACpB,GAAGM,EAAI,uBAAA;AAAA,MACR,WAAWL;AAAA,QACT;AAAA,QACA;AAAA,QACAK,EAAI,mBAAmB;AAAA,QACvBV;AAAA,MAAA;AAAA,MAGD,UAAAU,EAAI,eAAe,UAAU,IAC1B,OACAT,EAAS;AAAA,QACP,GAAGS;AAAA,QACH,OAAO,MAAM,KAAK,EAAE,QAAQA,EAAI,eAAe,OAAA,GAAU,CAACpE,GAAGL,MAAMA,CAAC;AAAA,MAAA,CACrE;AAAA,IAAA;AAAA,EAAA,GAET;AAEJ;AAEAoF,EAAmB,cAAc;ACnC1B,MAAME,IAAqB,CAAC;AAAA,EACjC,cAAcX;AAAA,EACd,GAAGC;AACL,MAAuB;AACrB,QAAMH,IAAMJ,EAAA;AAEZ,SACE,gBAAAF;AAAA,IAACU;AAAA,IAAA;AAAA,MACC,wBAAqB;AAAA,MACpB,GAAGJ,EAAI,oBAAA;AAAA,MACR,QAAO;AAAA,MACP,QAAO;AAAA,MACP,WAAU;AAAA,MACV,cAAYE;AAAA,MACX,GAAGC;AAAA,MAEJ,UAAA,gBAAAT,EAACW,GAAA,EACC,UAAA,gBAAAX,EAACoB,IAAA,CAAA,CAAkB,EAAA,CACrB;AAAA,IAAA;AAAA,EAAA;AAGN;AAEAD,EAAmB,cAAc;ACrB1B,SAASE,GACdC,GACAC,GACA;AACA,QAAM,CAAC5H,GAAW6H,CAAY,IAAIxE,EAAS,EAAI,GACzCsD,IAAMJ,EAAA;AAEZ,SAAAjG,EAAU,MAAM;AACd,UAAMwH,IAAKH,EAAW;AACtB,QAAI,CAACG,EAAI;AAGT,UAAM,EAAE,eAAArH,GAAe,iBAAAE,EAAA,IAAoBgG;AAG3C,WAAAlG,EAAcqH,GAAID,CAAY,GAGvB,MAAM;AACX,MAAAlH,EAAgBmH,CAAE;AAAA,IACpB;AAAA,EAEF,GAAG,CAACH,CAAU,CAAC,GAER3H;AACT;ACnBO,MAAM+H,IAAgB,CAAC;AAAA,EAC5B,UAAA7B;AAAA,EACA,OAAA1D,IAAQ;AAAA,EACR,aAAAZ;AAAA,EACA,WAAAqE,IAAY;AAAA,EACZ,GAAGE;AACL,MAA0B;AACxB,QAAM6B,IAAUvI,EAAuB,IAAI,GACrCkH,IAAMJ,EAAA,GAENvG,IAAY0H,GAAaM,GAASrB,EAAI,GAAG;AAE/C,SACE,gBAAAN;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,wBAAqB;AAAA,MACrB,KAAK2B;AAAA,MACJ,GAAGrB,EAAI,cAAc,EAAE,OAAAnE,GAAO,aAAAZ,GAAoC;AAAA,MACnE,WAAW0E,EAAG,+CAA+CL,CAAS;AAAA,MACtE,eAAa,CAACjG;AAAA,MACd,OAAO,CAACA;AAAA,MACP,GAAGmG;AAAA,MAEH,UAAAD;AAAA,IAAA;AAAA,EAAA;AAGP;AAEA6B,EAAc,cAAc;AC9BrB,MAAME,KAAiB,CAAC,EAAE,UAAA/B,GAAU,WAAAD,IAAY,SAAgB;AACrE,QAAMU,IAAMJ,EAAA,GAEN2B,IAAmBC,GAAS,QAAQjC,CAAQ;AAElD,SACE,gBAAAG;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,wBAAqB;AAAA,MACpB,GAAGM,EAAI,wBAAA;AAAA,MACR,WAAWL;AAAA,QACT;AAAA,QACA;AAAA,QACAL;AAAA,MAAA;AAAA,MAGD,UAAAiC,EAAiB;AAAA,QAAI,CAACE,GAAO5F,MAC5B6F,GAAmCD,CAAK,IACpCE,GAAaF,GAAO;AAAA,UAClB,OAAA5F;AAAA,UACA,aAAa0F,EAAiB;AAAA,QAAA,CAC/B,IACDE;AAAA,MAAA;AAAA,IACN;AAAA,EAAA;AAGN;AAEAH,GAAe,cAAc;AChCtB,MAAMM,KAAmB,CAAC,EAAE,UAAArC,QAC1B,gBAAAG,EAAC,OAAA,EAAI,WAAU,iDAAiD,UAAAH,EAAA,CAAS;AAGlFqC,GAAiB,cAAc;ACAxB,MAAMvC,KAST,OAAO,OAAOwC,GAAM;AAAA,EAAA,UACtBC;AAAAA,EAAA,YACAC;AAAAA,EAAA,YACAC;AAAAA,EAAA,OACAC;AAAAA,EAAA,QACAC;AAAAA,EAAA,UACAC;AAAAA,EAAA,YACAC;AAAAA,EAAA,eACAC;AACF,CAAC;AAEDhD,GAAS,cAAc;"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../src/carousel/useCarouselVisibility.ts","../../src/carousel/useEvent.ts","../../src/carousel/useIsMounted.ts","../../src/carousel/useScrollEnd.ts","../../src/carousel/useResizeObserver.ts","../../src/carousel/utils.ts","../../src/carousel/useSnapPoints.ts","../../src/carousel/useCarousel.ts","../../src/carousel/Carousel.tsx","../../src/carousel/CarouselControls.tsx","../../src/carousel/CarouselNextButton.tsx","../../src/carousel/CarouselPageIndicator.tsx","../../src/carousel/CarouselPagePicker.tsx","../../src/carousel/CarouselPrevButton.tsx","../../src/carousel/useIsVisible.ts","../../src/carousel/CarouselSlide.tsx","../../src/carousel/CarouselSlides.tsx","../../src/carousel/CarouselViewport.tsx","../../src/carousel/index.ts"],"sourcesContent":["import { RefObject, useCallback, useEffect, useRef } from 'react'\n\n/**\n * Hook to manage slide visibility using a centralized IntersectionObserver.\n * This optimizes performance by using a single observer per carousel instead of one per slide.\n *\n * @param carouselRef - Reference to the carousel container element\n * @returns Object with functions to register/unregister slides and check visibility\n */\nexport function useCarouselVisibility(carouselRef: RefObject<HTMLDivElement | null>) {\n const slideVisibilityMap = useRef<Map<HTMLElement, boolean>>(new Map())\n const visibilityObserverRef = useRef<IntersectionObserver | null>(null)\n const visibilityCallbacksRef = useRef<Map<HTMLElement, (isVisible: boolean) => void>>(new Map())\n\n // Create the shared IntersectionObserver callback\n const createObserverCallback = useCallback(() => {\n return (entries: IntersectionObserverEntry[]) => {\n // Batch all visibility updates to minimize re-renders\n entries.forEach(entry => {\n const isVisible = entry.isIntersecting\n const element = entry.target as HTMLElement\n slideVisibilityMap.current.set(element, isVisible)\n\n // Notify the callback if it exists\n const callback = visibilityCallbacksRef.current.get(element)\n if (callback) {\n callback(isVisible)\n }\n })\n }\n }, [])\n\n // Initialize or get the shared IntersectionObserver\n const getOrCreateObserver = useCallback(() => {\n if (visibilityObserverRef.current) {\n return visibilityObserverRef.current\n }\n\n const container = carouselRef.current\n if (!container) return null\n\n const observer = new IntersectionObserver(createObserverCallback(), {\n root: container,\n threshold: 0.2,\n })\n\n visibilityObserverRef.current = observer\n\n return observer\n }, [carouselRef, createObserverCallback])\n\n // Initialize the shared IntersectionObserver when container is ready\n useEffect(() => {\n const observer = getOrCreateObserver()\n // Capture ref values to avoid stale closure warnings\n const visibilityMap = slideVisibilityMap.current\n const callbacksMap = visibilityCallbacksRef.current\n\n return () => {\n if (observer) {\n observer.disconnect()\n visibilityMap.clear()\n callbacksMap.clear()\n visibilityObserverRef.current = null\n }\n }\n }, [getOrCreateObserver])\n\n // Register a slide element with the observer\n const registerSlide = useCallback(\n (element: HTMLElement | null, callback: (isVisible: boolean) => void) => {\n if (!element) return\n\n const observer = getOrCreateObserver()\n if (!observer) {\n // If container is not ready yet, retry on next tick\n setTimeout(() => registerSlide(element, callback), 0)\n\n return\n }\n\n // Check initial visibility (default to true for slides that are already in view)\n const initialVisible = slideVisibilityMap.current.get(element) ?? true\n slideVisibilityMap.current.set(element, initialVisible)\n visibilityCallbacksRef.current.set(element, callback)\n observer.observe(element)\n\n // Call callback with initial state\n callback(initialVisible)\n },\n [getOrCreateObserver]\n )\n\n // Unregister a slide element from the observer\n const unregisterSlide = useCallback((element: HTMLElement | null) => {\n if (!element) return\n\n const observer = visibilityObserverRef.current\n if (observer) {\n observer.unobserve(element)\n }\n slideVisibilityMap.current.delete(element)\n visibilityCallbacksRef.current.delete(element)\n }, [])\n\n // Get current visibility state for a slide\n const isSlideVisible = useCallback((element: HTMLElement | null): boolean => {\n if (!element) return true\n\n return slideVisibilityMap.current.get(element) ?? true\n }, [])\n\n return {\n registerSlide,\n unregisterSlide,\n isSlideVisible,\n }\n}\n","import { useCallback, useLayoutEffect, useRef } from 'react'\n\ntype AnyFunction = (...args: any[]) => any\n\n/**\n * Directly from this gist: https://gist.github.com/diegohaz/695097a06f038a707c3a1b11e4e40195\n * Until React releases a native `useEvent` hook.\n */\nexport function useEvent<T extends AnyFunction>(callback?: T) {\n const ref = useRef<AnyFunction | undefined>(() => {\n throw new Error('Cannot call an event handler while rendering.')\n })\n\n useLayoutEffect(() => {\n ref.current = callback\n })\n\n return useCallback<AnyFunction>((...args) => ref.current?.(...args), []) as T\n}\n","import { useEffect, useRef } from 'react'\n\nexport const useIsMounted = () => {\n const isMounted = useRef(false)\n\n useEffect(() => {\n isMounted.current = true\n\n return () => {\n isMounted.current = false\n }\n }, [])\n\n return isMounted\n}\n","import { useEffect, useRef, RefObject } from 'react'\n\nexport function useScrollEnd(scrollRef: RefObject<HTMLDivElement | null>, callback: () => void) {\n const scrollLeft = useRef(0)\n\n /**\n * Safari (and some smaller browsers) to not yet support the `scrollend` event.\n * For those we must rely on the `scroll` event and and an idle state delay to trigger the \"scroll end\".\n *\n * Caveats:\n * - when using a trackpad or your fingers on a touch device, scrolling then holding the position might trigger the \"scrollend\" callback too early.\n */\n const safariTimeout = useRef<NodeJS.Timeout | null>(null)\n\n useEffect(() => {\n const element = scrollRef.current\n if (!element) return\n\n const supportsScrollend = 'onscrollend' in window\n\n const handleScrollEnd = () => {\n callback()\n }\n\n const handleSafariScroll = () => {\n if (safariTimeout.current) {\n clearTimeout(safariTimeout.current)\n }\n\n if (scrollRef.current) {\n scrollLeft.current = scrollRef.current.scrollLeft\n\n safariTimeout.current = setTimeout(() => {\n if (scrollRef.current) {\n handleScrollEnd()\n }\n }, 150)\n }\n }\n\n if (supportsScrollend) {\n element.addEventListener('scrollend', handleScrollEnd)\n } else {\n element.addEventListener('scroll', handleSafariScroll)\n }\n\n return () => {\n if (safariTimeout.current) {\n clearTimeout(safariTimeout.current)\n }\n\n if (supportsScrollend) {\n element.removeEventListener('scrollend', handleScrollEnd)\n } else {\n element.removeEventListener('scroll', handleSafariScroll)\n }\n }\n }, [callback, scrollRef])\n}\n\nexport default useScrollEnd\n","import { useLayoutEffect, RefObject } from 'react'\n\nexport function useResizeObserver<T extends HTMLElement | null>(\n ref: RefObject<T>,\n callback: (width: number) => void\n) {\n useLayoutEffect(() => {\n const element = ref.current\n if (!element) return\n\n const observer = new ResizeObserver(entries => {\n for (const entry of entries) {\n callback(entry.contentRect.width)\n }\n })\n\n observer.observe(element)\n\n return () => observer.disconnect() // Cleanup on unmount\n }, [ref, callback])\n}\n","/**\n * Get the indices of each slides that serves as the start of a page\n * @returns number[] (ex: [0, 2, 4])\n */\nfunction getSnapIndices({\n totalSlides,\n slidesPerMove,\n slidesPerPage,\n}: {\n totalSlides: number\n slidesPerMove: number | 'auto'\n slidesPerPage: number\n}) {\n const slideBy = slidesPerMove === 'auto' ? slidesPerPage : slidesPerMove\n const snapPoints: number[] = []\n\n const lastSnapIndex = Math.floor((totalSlides - slidesPerPage) / slideBy) * slideBy\n\n for (let i = 0; i <= lastSnapIndex; i += slideBy) {\n snapPoints.push(i)\n }\n\n // Adding final snap point if necessary\n if (snapPoints[snapPoints.length - 1] !== totalSlides - slidesPerPage) {\n snapPoints.push(totalSlides - slidesPerPage)\n }\n\n return snapPoints\n}\n\nexport function getSlideElements(container: HTMLDivElement | null): Element[] {\n return container ? Array.from(container.querySelectorAll('[data-part=\"item\"]')) : []\n}\n\nexport function isSnapPoint(\n slideIndex: number,\n {\n container,\n slidesPerMove,\n slidesPerPage,\n }: {\n container: HTMLDivElement | null\n slidesPerMove: number | 'auto'\n slidesPerPage: number\n }\n) {\n return getSnapIndices({\n totalSlides: getSlideElements(container).length,\n slidesPerPage,\n slidesPerMove,\n }).includes(slideIndex)\n}\n\n/**\n * Get the scroll value of each slides that serves as the start of a page\n * @returns number[] (ex for a 400px carousel with no gap: [400, 800, 1200])\n */\nexport function getSnapPositions({\n container,\n slidesPerMove,\n slidesPerPage,\n}: {\n container: HTMLDivElement | null\n slidesPerMove: number | 'auto'\n slidesPerPage: number\n}) {\n if (!container) return []\n\n return getSlideElements(container)\n .filter((_, index) => {\n return isSnapPoint(index, {\n slidesPerMove,\n slidesPerPage,\n container,\n })\n })\n .map(slide => (slide as HTMLElement).offsetLeft)\n}\n\n/**\n * Calculate the state of a dot indicator of a carousel depending on the current page and the total number of pages.\n */\nexport function computeDotState({\n dotIndex,\n pageState,\n totalPages,\n maxDots = 5,\n}: {\n dotIndex: number\n pageState: number\n totalPages: number\n maxDots?: number\n}): 'active' | 'edge' | 'idle' | 'hidden' {\n if (totalPages <= maxDots) {\n return dotIndex === pageState ? 'active' : 'idle'\n }\n\n if (pageState <= Math.floor(maxDots / 2)) {\n if (dotIndex > maxDots - 1) return 'hidden'\n if (dotIndex === pageState) return 'active'\n if (dotIndex === maxDots - 1) return 'edge'\n\n return 'idle'\n }\n\n if (pageState >= totalPages - Math.ceil(maxDots / 2)) {\n const startIndex = totalPages - maxDots\n if (dotIndex < startIndex) return 'hidden'\n if (dotIndex === pageState) return 'active'\n if (dotIndex === startIndex) return 'edge'\n\n return 'idle'\n }\n\n const startIndex = pageState - Math.floor(maxDots / 2)\n const endIndex = pageState + Math.floor(maxDots / 2)\n if (dotIndex < startIndex || dotIndex > endIndex) return 'hidden'\n if (dotIndex === pageState) return 'active'\n if (dotIndex === startIndex || dotIndex === endIndex) return 'edge'\n\n return 'idle'\n}\n","import { useMemo, useState, RefObject } from 'react'\n\nimport { useResizeObserver } from './useResizeObserver'\nimport { getSnapPositions } from './utils'\n\n/**\n * Get the scroll value of each slides that serves as the start of a page\n * The array is updated when resize event are caught in the carousel.\n */\nexport function useSnapPoints<T extends HTMLDivElement | null>(\n initialSnapPoints: number[] = [],\n {\n carouselRef,\n slidesPerMove,\n slidesPerPage,\n }: {\n carouselRef: RefObject<T>\n slidesPerMove: 'auto' | number\n slidesPerPage: number\n }\n) {\n const [pageSnapPoints, setPageSnapPoints] = useState(initialSnapPoints)\n\n const stableSnapPoints = useMemo(() => pageSnapPoints, [pageSnapPoints])\n\n /**\n * On resize, dimensions of the carousel might changes, which requires to update the snap points positions in the state.\n */\n useResizeObserver(carouselRef, () => {\n const newSnapPoints = getSnapPositions({\n slidesPerMove,\n slidesPerPage,\n container: carouselRef.current,\n })\n\n if (JSON.stringify(pageSnapPoints) !== JSON.stringify(newSnapPoints)) {\n setPageSnapPoints(newSnapPoints)\n }\n })\n\n return [stableSnapPoints, setPageSnapPoints] as const\n}\n","/* eslint-disable max-lines-per-function */\nimport {\n KeyboardEvent,\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react'\n\nimport {\n CarouselAPI,\n ComputedControlProps,\n ComputedIndicatorGroupProps,\n ComputedIndicatorProps,\n ComputedRootProps,\n ComputedSlideGroupProps,\n ComputedSlideProps,\n ComputedTriggerProps,\n UseCarouselProps,\n} from './types'\nimport { useCarouselVisibility } from './useCarouselVisibility'\nimport { useEvent } from './useEvent'\nimport { useIsMounted } from './useIsMounted'\nimport { useScrollEnd } from './useScrollEnd'\nimport { useSnapPoints } from './useSnapPoints'\nimport { computeDotState, getSnapPositions, isSnapPoint } from './utils'\n\nconst DATA_SCOPE = 'carousel' as const\nconst DIRECTION = 'ltr' as const\n\nexport const useCarousel = ({\n defaultPage,\n gap = 16,\n snapType = 'mandatory',\n snapStop = 'always',\n scrollPadding = 0,\n slidesPerPage = 1,\n slidesPerMove = 'auto',\n scrollBehavior = 'smooth',\n loop = false,\n pagePickerInset = false,\n maxDots = 5,\n // state control\n page: controlledPage,\n onPageChange: onPageChangeProp,\n}: UseCarouselProps): CarouselAPI => {\n const carouselId = useId()\n const [pageState, setPageState] = useState(defaultPage || controlledPage || 0)\n\n const carouselRef = useRef<HTMLDivElement>(null)\n const pageIndicatorsRefs = useRef<(HTMLElement | null)[]>([])\n const isMountedRef = useIsMounted()\n const isMounted = isMountedRef.current\n const onPageChange = useEvent(onPageChangeProp)\n\n // Centralized visibility management with a single IntersectionObserver per carousel\n const { registerSlide, unregisterSlide, isSlideVisible } = useCarouselVisibility(carouselRef)\n\n const [pageSnapPoints] = useSnapPoints([], {\n carouselRef,\n slidesPerMove,\n slidesPerPage,\n })\n\n const canScrollPrev = useRef(loop || pageState > 0)\n const canScrollNext = useRef(loop || pageState < pageSnapPoints.length - 1)\n canScrollPrev.current = loop || pageState > 0\n canScrollNext.current = loop || pageState < pageSnapPoints.length - 1\n\n const handlePageChange = useCallback(\n (page: number) => {\n if (page !== pageState) {\n setPageState(page)\n onPageChange?.(page)\n }\n },\n [onPageChange, pageState]\n )\n\n const scrollTo = useCallback(\n (page: number, behavior: 'instant' | 'smooth') => {\n if (carouselRef.current) {\n carouselRef.current.scrollTo({\n left: pageSnapPoints[page],\n behavior: behavior === 'instant' ? 'auto' : 'smooth',\n })\n handlePageChange(page)\n }\n },\n [handlePageChange, pageSnapPoints]\n )\n\n const scrollPrev = useCallback(\n (cb?: (pageIndex: number) => void) => {\n if (canScrollPrev) {\n const targetPage =\n loop && pageState === 0 ? pageSnapPoints.length - 1 : Math.max(pageState - 1, 0)\n\n scrollTo(targetPage, scrollBehavior)\n cb?.(targetPage)\n }\n },\n [loop, pageSnapPoints, pageState, scrollBehavior, scrollTo]\n )\n\n const scrollNext = useCallback(\n (cb?: (pageIndex: number) => void) => {\n if (canScrollNext) {\n const targetPage =\n loop && pageState === pageSnapPoints.length - 1\n ? 0\n : Math.min(pageState + 1, pageSnapPoints.length - 1)\n\n scrollTo(targetPage, scrollBehavior)\n cb?.(targetPage)\n }\n },\n [loop, pageSnapPoints, pageState, scrollBehavior, scrollTo]\n )\n\n useEffect(() => {\n if (controlledPage != null) {\n scrollTo(controlledPage, scrollBehavior)\n }\n }, [controlledPage, scrollBehavior, scrollTo])\n\n /**\n * Set the default scroll position of the carousel based on `defaultPage`.\n * As this operation is done before the snap points are set in the state, we have to get them from the ref directly.\n */\n useLayoutEffect(() => {\n if (defaultPage != null && !isMounted && carouselRef.current) {\n const snapPositions = getSnapPositions({\n container: carouselRef.current,\n slidesPerMove,\n slidesPerPage,\n })\n\n carouselRef.current.scrollTo({\n left: snapPositions[defaultPage],\n behavior: 'instant',\n })\n }\n }, [defaultPage, isMounted, slidesPerMove, slidesPerPage])\n\n /**\n * Monitoring scrollend events inside the scrollable area to sync the carousel active page with current scroll position.\n * Scrollend has been chosen over \"scroll\" for performance reason.\n */\n const syncPageStateWithScrollPosition = useCallback(() => {\n if (!carouselRef.current || pageSnapPoints.length === 0) return\n\n const { scrollLeft } = carouselRef.current\n\n const distances = pageSnapPoints.map(pagePosition => Math.abs(scrollLeft - pagePosition))\n const pageInViewport = distances.indexOf(Math.min(...distances))\n\n if (pageInViewport !== -1) {\n handlePageChange(pageInViewport)\n }\n }, [pageSnapPoints, handlePageChange])\n\n useScrollEnd(carouselRef, syncPageStateWithScrollPosition)\n\n const contextValue: CarouselAPI = {\n ref: carouselRef,\n pageIndicatorsRefs,\n // props\n gap,\n snapType,\n snapStop,\n scrollPadding,\n slidesPerPage,\n slidesPerMove,\n scrollBehavior,\n loop,\n pagePickerInset,\n maxDots,\n // computed state\n page: pageState,\n pageSnapPoints,\n canScrollNext: canScrollNext.current,\n canScrollPrev: canScrollPrev.current,\n scrollTo,\n scrollPrev,\n scrollNext,\n // visibility management\n registerSlide,\n unregisterSlide,\n isSlideVisible,\n // anatomy\n getRootProps: (): ComputedRootProps => ({\n id: `carousel::${carouselId}:`,\n role: 'region',\n 'aria-roledescription': 'carousel',\n 'data-scope': DATA_SCOPE,\n 'data-part': 'root',\n 'data-orientation': 'horizontal',\n dir: DIRECTION,\n style: {\n '--slides-per-page': slidesPerPage,\n '--slide-spacing': `${gap}px`,\n '--slide-item-size':\n 'calc(100% / var(--slides-per-page) - var(--slide-spacing) * (var(--slides-per-page) - 1) / var(--slides-per-page))',\n },\n }),\n\n getControlProps: (): ComputedControlProps => ({\n 'data-scope': DATA_SCOPE,\n 'data-part': 'control',\n 'data-orientation': 'horizontal',\n }),\n\n getPrevTriggerProps: (): ComputedTriggerProps<'prev-trigger'> => ({\n id: `carousel::${carouselId}::prev-trigger`,\n 'aria-controls': `carousel::${carouselId}::item-group`,\n 'data-scope': DATA_SCOPE,\n 'data-part': 'prev-trigger',\n 'data-orientation': 'horizontal',\n type: 'button',\n dir: DIRECTION,\n disabled: !canScrollPrev.current,\n onClick: () => scrollPrev(),\n }),\n\n getNextTriggerProps: (): ComputedTriggerProps<'next-trigger'> => ({\n id: `carousel::${carouselId}::next-trigger`,\n 'aria-controls': `carousel::${carouselId}::item-group`,\n 'data-scope': DATA_SCOPE,\n 'data-part': 'next-trigger',\n 'data-orientation': 'horizontal',\n type: 'button',\n dir: DIRECTION,\n disabled: !canScrollNext.current,\n onClick: () => scrollNext(),\n }),\n\n getSlidesContainerProps: (): ComputedSlideGroupProps => ({\n id: `carousel::${carouselId}::item-group`,\n /**\n * The carousel pattern was originally designed for a single slide.\n * When there is more than one slide, the aria-live region is set to off to avoid announcing the whole list of slides.\n * This is not ideal but we keep it for backwards compatibility.\n *\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/carousel/#wai-aria-attributes\n */\n 'aria-live': slidesPerPage > 1 ? 'off' : 'polite',\n 'data-scope': DATA_SCOPE,\n 'data-part': 'item-group',\n 'data-orientation': 'horizontal',\n dir: DIRECTION,\n tabIndex: 0,\n style: {\n display: 'grid',\n gap: 'var(--slide-spacing)',\n scrollSnapType: `x ${snapType}`,\n gridAutoFlow: 'column',\n scrollbarWidth: 'none',\n gridAutoColumns: 'var(--slide-item-size)',\n overflowX: 'auto',\n },\n ref: carouselRef,\n }),\n\n getSlideProps: ({ index }): ComputedSlideProps => {\n const isStopPoint = isSnapPoint(index, {\n container: carouselRef.current,\n slidesPerMove,\n slidesPerPage,\n })\n\n return {\n id: `carousel::${carouselId}::item:${index}`,\n role: 'group',\n 'aria-roledescription': 'slide',\n 'data-scope': DATA_SCOPE,\n 'data-part': 'item',\n 'data-index': index,\n 'data-orientation': 'horizontal',\n dir: DIRECTION,\n style: {\n ...(isStopPoint && {\n scrollSnapAlign: 'start',\n scrollSnapStop: snapStop,\n }),\n },\n }\n },\n\n getIndicatorGroupProps: (): ComputedIndicatorGroupProps => ({\n role: 'radiogroup',\n id: `carousel::${carouselId}::indicator-group`,\n 'data-scope': DATA_SCOPE,\n 'data-part': 'indicator-group',\n 'data-orientation': 'horizontal',\n dir: DIRECTION,\n }),\n\n getIndicatorProps: ({ index }): ComputedIndicatorProps => {\n const dotState = computeDotState({\n dotIndex: index,\n pageState,\n totalPages: pageSnapPoints.length,\n maxDots,\n })\n\n return {\n role: 'radio',\n id: `carousel::${carouselId}::indicator:${index}`,\n 'aria-checked': index === pageState,\n 'data-scope': DATA_SCOPE,\n 'data-part': 'indicator',\n 'data-orientation': 'horizontal',\n 'data-index': index,\n 'data-state': dotState,\n tabIndex: index === pageState ? 0 : -1,\n onClick: () => {\n scrollTo(index, scrollBehavior)\n },\n onKeyDown: (event: KeyboardEvent) => {\n const focusActiveIndicator = (page: number) => {\n pageIndicatorsRefs.current[page]?.focus()\n }\n\n if (event.key === 'ArrowRight' && canScrollNext) {\n scrollNext(focusActiveIndicator)\n } else if (event.key === 'ArrowLeft' && canScrollPrev) {\n scrollPrev(focusActiveIndicator)\n }\n },\n }\n },\n }\n\n return contextValue\n}\n","import { cx } from 'class-variance-authority'\nimport { ComponentProps, createContext, ReactNode, useContext } from 'react'\n\nimport { CarouselAPI, UseCarouselProps } from './types'\nimport { useCarousel } from './useCarousel'\n\ninterface Props extends UseCarouselProps, ComponentProps<'div'> {\n children?: ReactNode\n className?: string\n}\n\nconst CarouselContext = createContext<CarouselAPI | null>(null)\n\nexport const Carousel = ({\n className,\n snapType = 'mandatory',\n snapStop = 'always',\n scrollBehavior = 'smooth',\n slidesPerMove = 'auto',\n pagePickerInset = false,\n slidesPerPage = 1,\n loop = false,\n children,\n gap = 16,\n defaultPage,\n page,\n onPageChange,\n maxDots = 5,\n ...props\n}: Props) => {\n const carouselApi = useCarousel({\n defaultPage,\n slidesPerPage,\n slidesPerMove,\n loop,\n gap,\n scrollBehavior,\n snapStop,\n snapType,\n page,\n pagePickerInset,\n onPageChange,\n maxDots,\n })\n\n return (\n <CarouselContext.Provider\n value={{\n ...carouselApi,\n scrollBehavior,\n }}\n >\n <div\n data-spark-component=\"carousel\"\n className={cx('gap-lg relative box-border flex flex-col', className)}\n {...carouselApi.getRootProps()}\n {...props}\n >\n {children}\n </div>\n </CarouselContext.Provider>\n )\n}\n\nCarousel.displayName = 'Carousel'\n\nexport const useCarouselContext = () => {\n const context = useContext(CarouselContext)\n\n if (!context) {\n throw Error('useCarouselContext must be used within a Carousel provider')\n }\n\n return context\n}\n","import { cx } from 'class-variance-authority'\nimport { HTMLAttributes, ReactNode } from 'react'\n\nimport { useCarouselContext } from './Carousel'\n\ninterface ControlsProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode\n}\n\nexport const CarouselControls = ({ children, className, ...props }: ControlsProps) => {\n const ctx = useCarouselContext()\n\n return (\n <div\n data-spark-component=\"carousel-controls\"\n className={cx(\n 'default:px-lg pointer-events-none absolute inset-0 flex flex-row items-center justify-between',\n className\n )}\n {...ctx.getControlProps()}\n {...props}\n >\n {children}\n </div>\n )\n}\n\nCarouselControls.displayName = 'Carousel.Controls'\n","import { ArrowVerticalRight } from '@spark-ui/icons/ArrowVerticalRight'\n\nimport { Icon } from '../icon'\nimport { IconButton, IconButtonProps } from '../icon-button'\nimport { useCarouselContext } from './Carousel'\n\nexport const CarouselNextButton = ({\n 'aria-label': ariaLabel,\n ...buttonProps\n}: IconButtonProps) => {\n const ctx = useCarouselContext()\n\n return (\n <IconButton\n data-spark-component=\"carousel-next-button\"\n {...ctx.getNextTriggerProps()}\n intent=\"surface\"\n design=\"filled\"\n className=\"pointer-events-auto cursor-pointer shadow-sm disabled:invisible\"\n aria-label={ariaLabel}\n {...buttonProps}\n >\n <Icon>\n <ArrowVerticalRight />\n </Icon>\n </IconButton>\n )\n}\n\nCarouselNextButton.displayName = 'Carousel.NextButton'\n","import { cx } from 'class-variance-authority'\nimport { ReactNode, useEffect, useRef } from 'react'\n\nimport { useCarouselContext } from './Carousel'\n\ninterface Props {\n children?: ReactNode\n 'aria-label': string\n index: number\n className?: string\n unstyled?: boolean\n intent?: 'support' | 'surface'\n}\n\nexport const CarouselPageIndicator = ({\n children,\n unstyled = false,\n index,\n 'aria-label': ariaLabel,\n className,\n intent = 'support',\n}: Props) => {\n const ctx = useCarouselContext()\n\n const ref = useRef<HTMLButtonElement | null>(null)\n\n useEffect(() => {\n if (ctx.pageIndicatorsRefs.current) {\n ctx.pageIndicatorsRefs.current[index] = ref.current\n }\n })\n\n const indicatorProps = ctx.getIndicatorProps({ index })\n\n return (\n <button\n data-spark-component=\"carousel-page-indicator\"\n ref={ref}\n key={index}\n {...indicatorProps}\n aria-label={ariaLabel}\n className={cx(\n {\n [cx(\n 'border-outline group relative flex justify-center border-0 hover:cursor-pointer',\n 'm-sm rounded-sm transition-all duration-[200ms] ease-linear',\n 'w-sz-8 h-sz-8',\n 'data-[state=active]:w-sz-32 data-[state=active]:h-sz-8',\n 'data-[state=edge]:w-sz-4 data-[state=edge]:h-sz-4',\n 'data-[state=hidden]:m-0 data-[state=hidden]:size-0',\n intent === 'surface'\n ? 'data-[state=active]:bg-surface bg-surface/dim-2'\n : 'data-[state=active]:bg-support bg-on-surface/dim-2'\n )]: !unstyled,\n // [dotsStyles]: !unstyled,\n },\n className\n )}\n >\n {children}\n </button>\n )\n}\n\nCarouselPageIndicator.displayName = 'Carousel.PageIndicator'\n","import { cx } from 'class-variance-authority'\nimport { ReactNode } from 'react'\n\nimport { useCarouselContext } from './Carousel'\nimport { CarouselAPI } from './types'\n\ninterface RenderProps extends CarouselAPI {\n pages: number[]\n}\n\ninterface Props {\n children: (renderProps: RenderProps) => ReactNode\n className?: string\n}\n\nexport const CarouselPagePicker = ({ children, className }: Props) => {\n const ctx = useCarouselContext()\n\n return (\n <>\n <div\n data-spark-component=\"carousel-page-picker\"\n {...ctx.getIndicatorGroupProps()}\n className={cx(\n 'flex-wrap items-center justify-center',\n 'default:min-h-sz-16 flex',\n ctx.pagePickerInset && 'bottom-sz-12 absolute inset-x-0',\n className\n )}\n >\n {ctx.pageSnapPoints.length <= 1\n ? null\n : children({\n ...ctx,\n pages: Array.from({ length: ctx.pageSnapPoints.length }, (_, i) => i),\n })}\n </div>\n </>\n )\n}\n\nCarouselPagePicker.displayName = 'Carousel.PagePicker'\n","import { ArrowVerticalLeft } from '@spark-ui/icons/ArrowVerticalLeft'\n\nimport { Icon } from '../icon'\nimport { IconButton, IconButtonProps } from '../icon-button'\nimport { useCarouselContext } from './Carousel'\n\nexport const CarouselPrevButton = ({\n 'aria-label': ariaLabel,\n ...buttonProps\n}: IconButtonProps) => {\n const ctx = useCarouselContext()\n\n return (\n <IconButton\n data-spark-component=\"carousel-prev-button\"\n {...ctx.getPrevTriggerProps()}\n intent=\"surface\"\n design=\"filled\"\n className=\"pointer-events-auto cursor-pointer shadow-sm disabled:invisible\"\n aria-label={ariaLabel}\n {...buttonProps}\n >\n <Icon>\n <ArrowVerticalLeft />\n </Icon>\n </IconButton>\n )\n}\n\nCarouselPrevButton.displayName = 'Carousel.PrevButton'\n","import { RefObject, useEffect, useState } from 'react'\n\nimport { useCarouselContext } from './Carousel'\n\n/**\n * Hook to track slide visibility using the centralized IntersectionObserver.\n * This optimizes performance by using a single observer per carousel instead of one per slide.\n */\nexport function useIsVisible(\n elementRef: RefObject<HTMLElement | null>,\n _parentRef: RefObject<HTMLElement | null>\n) {\n const [isVisible, setIsVisible] = useState(true)\n const ctx = useCarouselContext()\n\n useEffect(() => {\n const el = elementRef.current\n if (!el) return\n\n // Extract stable functions from context to avoid unnecessary re-renders\n const { registerSlide, unregisterSlide } = ctx\n\n // Register the slide with the centralized observer\n registerSlide(el, setIsVisible)\n\n // Cleanup: unregister when the component unmounts\n return () => {\n unregisterSlide(el)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [elementRef]) // Only depend on elementRef, registerSlide/unregisterSlide are stable callbacks\n\n return isVisible\n}\n","import { cx } from 'class-variance-authority'\nimport { ComponentProps, ReactNode, useRef } from 'react'\n\nimport { useCarouselContext } from './Carousel'\nimport { useIsVisible } from './useIsVisible'\n\nexport interface CarouselSlideProps extends ComponentProps<'div'> {\n isSnapPoint?: boolean\n children?: ReactNode\n index?: number\n totalSlides?: number\n className?: string\n}\n\nexport const CarouselSlide = ({\n children,\n index = 0,\n totalSlides,\n className = '',\n ...props\n}: CarouselSlideProps) => {\n const itemRef = useRef<HTMLDivElement>(null)\n const ctx = useCarouselContext()\n\n const isVisible = useIsVisible(itemRef, ctx.ref)\n\n return (\n <div\n data-spark-component=\"carousel-slide\"\n ref={itemRef}\n {...ctx.getSlideProps({ index, totalSlides: totalSlides as number })}\n className={cx('default:bg-surface relative overflow-hidden', className)}\n aria-hidden={!isVisible}\n inert={!isVisible}\n {...props}\n >\n {children}\n </div>\n )\n}\n\nCarouselSlide.displayName = 'Carousel.Slide'\n","import { cx } from 'class-variance-authority'\nimport { Children, cloneElement, ComponentProps, isValidElement, ReactNode } from 'react'\n\nimport { useCarouselContext } from './Carousel'\nimport { CarouselSlideProps } from './CarouselSlide'\n\ninterface Props extends ComponentProps<'div'> {\n children?: ReactNode\n className?: string\n}\n\nexport const CarouselSlides = ({ children, className = '' }: Props) => {\n const ctx = useCarouselContext()\n\n const childrenElements = Children.toArray(children)\n\n return (\n <div\n data-spark-component=\"carousel-slides\"\n {...ctx.getSlidesContainerProps()}\n className={cx(\n 'focus-visible:u-outline relative w-full',\n '[-ms-overflow-style:none] [scrollbar-width:none] [&::-webkit-scrollbar]:hidden',\n className\n )}\n >\n {childrenElements.map((child, index) =>\n isValidElement<CarouselSlideProps>(child)\n ? cloneElement(child, {\n index,\n totalSlides: childrenElements.length,\n })\n : child\n )}\n </div>\n )\n}\n\nCarouselSlides.displayName = 'Carousel.Slides'\n","import { ReactNode } from 'react'\n\ninterface Props {\n children: ReactNode\n}\n\nexport const CarouselViewport = ({ children }: Props) => {\n return <div className=\"relative flex items-center justify-around p-0\">{children}</div>\n}\n\nCarouselViewport.displayName = 'Carousel.Viewport'\n","import { Carousel as Root } from './Carousel'\nimport { CarouselControls as Controls } from './CarouselControls'\nimport { CarouselNextButton as NextButton } from './CarouselNextButton'\nimport { CarouselPageIndicator as PageIndicator } from './CarouselPageIndicator'\nimport { CarouselPagePicker as PagePicker } from './CarouselPagePicker'\nimport { CarouselPrevButton as PrevButton } from './CarouselPrevButton'\nimport { CarouselSlide as Slide } from './CarouselSlide'\nimport { CarouselSlides as Slides } from './CarouselSlides'\nimport { CarouselViewport as Viewport } from './CarouselViewport'\n\nexport const Carousel: typeof Root & {\n Controls: typeof Controls\n NextButton: typeof NextButton\n PrevButton: typeof PrevButton\n Slide: typeof Slide\n Slides: typeof Slides\n Viewport: typeof Viewport\n PagePicker: typeof PagePicker\n PageIndicator: typeof PageIndicator\n} = Object.assign(Root, {\n Controls,\n NextButton,\n PrevButton,\n Slide,\n Slides,\n Viewport,\n PagePicker,\n PageIndicator,\n})\n\nCarousel.displayName = 'Carousel'\n"],"names":["useCarouselVisibility","carouselRef","slideVisibilityMap","useRef","visibilityObserverRef","visibilityCallbacksRef","createObserverCallback","useCallback","entries","entry","isVisible","element","callback","getOrCreateObserver","container","observer","useEffect","visibilityMap","callbacksMap","registerSlide","initialVisible","unregisterSlide","isSlideVisible","useEvent","ref","useLayoutEffect","args","useIsMounted","isMounted","useScrollEnd","scrollRef","scrollLeft","safariTimeout","supportsScrollend","handleScrollEnd","handleSafariScroll","useResizeObserver","getSnapIndices","totalSlides","slidesPerMove","slidesPerPage","slideBy","snapPoints","lastSnapIndex","i","getSlideElements","isSnapPoint","slideIndex","getSnapPositions","_","index","slide","computeDotState","dotIndex","pageState","totalPages","maxDots","startIndex","endIndex","useSnapPoints","initialSnapPoints","pageSnapPoints","setPageSnapPoints","useState","stableSnapPoints","useMemo","newSnapPoints","DATA_SCOPE","DIRECTION","useCarousel","defaultPage","gap","snapType","snapStop","scrollPadding","scrollBehavior","loop","pagePickerInset","controlledPage","onPageChangeProp","carouselId","useId","setPageState","pageIndicatorsRefs","onPageChange","canScrollPrev","canScrollNext","handlePageChange","page","scrollTo","behavior","scrollPrev","cb","targetPage","scrollNext","snapPositions","syncPageStateWithScrollPosition","distances","pagePosition","pageInViewport","isStopPoint","dotState","event","focusActiveIndicator","CarouselContext","createContext","Carousel","className","children","props","carouselApi","jsx","cx","useCarouselContext","context","useContext","CarouselControls","ctx","CarouselNextButton","ariaLabel","buttonProps","IconButton","Icon","ArrowVerticalRight","CarouselPageIndicator","unstyled","intent","indicatorProps","CarouselPagePicker","Fragment","CarouselPrevButton","ArrowVerticalLeft","useIsVisible","elementRef","_parentRef","setIsVisible","el","CarouselSlide","itemRef","CarouselSlides","childrenElements","Children","child","isValidElement","cloneElement","CarouselViewport","Root","Controls","NextButton","PrevButton","Slide","Slides","Viewport","PagePicker","PageIndicator"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { VariantProps } from 'class-variance-authority';
|
|
2
2
|
export declare const checkboxInputStyles: (props?: ({
|
|
3
|
-
intent?: "main" | "alert" | "error" | "support" | "accent" | "
|
|
3
|
+
intent?: "main" | "alert" | "error" | "support" | "accent" | "success" | "info" | "neutral" | null | undefined;
|
|
4
4
|
} & import('class-variance-authority/types').ClassProp) | undefined) => string;
|
|
5
5
|
export type CheckboxInputStylesProps = VariantProps<typeof checkboxInputStyles>;
|
package/dist/checkbox/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),E=require("@spark-ui/components/form-field"),ee=require("@spark-ui/hooks/use-merge-refs"),N=require("class-variance-authority"),c=require("react"),te=require("@spark-ui/icons/Check"),ae=require("@spark-ui/icons/Minus"),P=require("radix-ui"),ne=require("../Icon-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),E=require("@spark-ui/components/form-field"),ee=require("@spark-ui/hooks/use-merge-refs"),N=require("class-variance-authority"),c=require("react"),te=require("@spark-ui/icons/Check"),ae=require("@spark-ui/icons/Minus"),P=require("radix-ui"),ne=require("../Icon-C-cNTnzd.js"),re=require("@spark-ui/internal-utils"),se=require("../label/index.js"),ce=require("@spark-ui/hooks/use-combined-state"),U=c.createContext({}),oe=()=>c.useContext(U),ie=P.Checkbox.CheckboxIndicator,D=a=>e.jsx(ie,{className:"flex size-full items-center justify-center",...a});D.displayName="CheckboxIndicator";const de=N.cva(["size-sz-24 shrink-0 items-center justify-center rounded-sm border-md bg-transparent","disabled:cursor-not-allowed disabled:opacity-dim-3 disabled:hover:ring-0","focus-visible:u-outline","hover:ring-4 hover:cursor-pointer","u-shadow-border-transition"],{variants:{intent:re.makeVariants({main:["text-on-main","hover:ring-main-container","data-[state=unchecked]:border-outline","data-[state=indeterminate]:border-main data-[state=indeterminate]:bg-main","data-[state=checked]:border-main data-[state=checked]:bg-main"],support:["text-on-support","hover:ring-support-container","data-[state=unchecked]:border-outline","data-[state=indeterminate]:border-support data-[state=indeterminate]:bg-support","data-[state=checked]:border-support data-[state=checked]:bg-support"],accent:["text-on-accent","hover:ring-accent-container","data-[state=unchecked]:border-outline","data-[state=indeterminate]:border-accent data-[state=indeterminate]:bg-accent","data-[state=checked]:border-accent data-[state=checked]:bg-accent"],success:["text-on-success","hover:ring-success-container","data-[state=unchecked]:border-success","data-[state=indeterminate]:border-success data-[state=indeterminate]:bg-success","data-[state=checked]:border-success data-[state=checked]:bg-success"],alert:["text-on-alert","hover:ring-alert-container","data-[state=unchecked]:border-alert","data-[state=indeterminate]:border-alert data-[state=indeterminate]:bg-alert","data-[state=checked]:border-alert data-[state=checked]:bg-alert"],error:["text-on-error","hover:ring-error-container","data-[state=unchecked]:border-error","data-[state=indeterminate]:border-error data-[state=indeterminate]:bg-error","data-[state=checked]:border-error data-[state=checked]:bg-error"],info:["text-on-info","hover:ring-info-container","data-[state=unchecked]:border-info","data-[state=indeterminate]:border-info data-[state=indeterminate]:bg-info","data-[state=checked]:border-info data-[state=checked]:bg-info"],neutral:["text-on-neutral","hover:ring-neutral-container","data-[state=unchecked]:border-outline","data-[state=indeterminate]:border-neutral data-[state=indeterminate]:bg-neutral","data-[state=checked]:border-neutral data-[state=checked]:bg-neutral"]})},defaultVariants:{intent:"support"}}),ue=P.Checkbox.Checkbox,O=({className:a,icon:o=e.jsx(te.Check,{}),indeterminateIcon:b=e.jsx(ae.Minus,{}),intent:h,checked:r,ref:d,...i})=>e.jsx(ue,{ref:d,className:de({intent:h,className:a}),checked:r,...i,children:e.jsx(D,{children:e.jsx(ne.Icon,{size:"sm",children:r==="indeterminate"?b:o})})});O.displayName="CheckboxInput";const le=N.cva("grow",{variants:{disabled:{true:["text-neutral/dim-2","cursor-not-allowed"],false:["cursor-pointer"]}},defaultVariants:{disabled:!1}}),T=({disabled:a,...o})=>e.jsx(se.Label,{className:le({disabled:a}),...o});T.displayName="CheckboxLabel";const A=":checkbox",X=({id:a,className:o,intent:b,checked:h,value:r,disabled:d,reverse:i=!1,onCheckedChange:v,children:m,ref:M,...G})=>{const x=`${A}-${c.useId()}`,k=a||x,g=`${A}-${c.useId()}`,u=E.useFormFieldControl(),t=oe(),f=c.useRef(null),p=ee.useMergeRefs(M,f),I=({fieldState:n,groupState:s,checkboxIntent:H})=>{const J=n.name??s.name,K=n.isRequired??s.isRequired,Q=n.state??s.state,W=n.isInvalid??s.isInvalid,$=n.id!==s.id,Y=$?n.id:void 0,Z=$?n.description:void 0,S=Q??H??s.intent;return{name:J,isRequired:K,isInvalid:W,id:Y,description:Z,intent:S}},q=r?t.value?.includes(r):h,y=n=>{v?.(n);const s=f.current?.value;s&&t.onCheckedChange&&t.onCheckedChange(n,s)},{id:C,name:V,isInvalid:L,description:z,intent:j,isRequired:l}=I({fieldState:u,groupState:t,checkboxIntent:b}),R=c.useMemo(()=>t?l?!t.value?.length:!1:l,[t,l]),F=m&&e.jsx(T,{disabled:d,htmlFor:C||k,id:g,children:m}),w=e.jsx(O,{ref:p,id:C||k,name:V,value:r,intent:j,checked:q,disabled:d,required:R,"aria-describedby":z,"aria-invalid":L,onCheckedChange:y,"aria-labelledby":m?g:u.labelId,...G}),B=t.reverse||i?e.jsxs(e.Fragment,{children:[F,w]}):e.jsxs(e.Fragment,{children:[w,F]});return e.jsx("span",{"data-spark-component":"checkbox",className:N.cx("gap-md text-body-1 relative flex items-start",o),children:B})};X.displayName="Checkbox";const be=N.cva(["flex"],{variants:{orientation:{vertical:["flex-col","gap-lg"],horizontal:["gap-xl"]}}}),_=({name:a,value:o,defaultValue:b,className:h,intent:r,orientation:d="vertical",onCheckedChange:i,reverse:v=!1,children:m,ref:M,...G})=>{const[x,k]=ce.useCombinedState(o,b),g=E.useFormFieldControl(),u=c.useRef(i),{id:t,labelId:f,description:p,state:I,isInvalid:q,isRequired:y}=g,C=a??g.name,V=c.useMemo(()=>({id:t,name:C,value:x,intent:r,state:I,isInvalid:q,description:p,isRequired:y,reverse:v,onCheckedChange:(z,j)=>{const l=x||[],R=z?[...l,j]:l.filter(F=>F!==j);k(R),u.current&&u.current(R)}}),[t,C,x,r,I,q,p,y,k,v]);return c.useEffect(()=>{u.current=i},[i]),e.jsx(U.Provider,{value:V,children:e.jsx("div",{ref:M,className:be({className:h,orientation:d}),role:"group","aria-labelledby":f,"aria-describedby":p,...G,children:m})})};_.displayName="CheckboxGroup";exports.Checkbox=X;exports.CheckboxGroup=_;
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/checkbox/CheckboxGroupContext.tsx","../../src/checkbox/CheckboxIndicator.tsx","../../src/checkbox/CheckboxInput.styles.ts","../../src/checkbox/CheckboxInput.tsx","../../src/checkbox/CheckboxLabel.styles.ts","../../src/checkbox/CheckboxLabel.tsx","../../src/checkbox/Checkbox.tsx","../../src/checkbox/CheckboxGroup.styles.ts","../../src/checkbox/CheckboxGroup.tsx"],"sourcesContent":["import { createContext, useContext } from 'react'\n\nimport { CheckboxInputStylesProps } from './CheckboxInput.styles'\n\nexport interface CheckboxGroupContextState extends Pick<CheckboxInputStylesProps, 'intent'> {\n /**\n * The id of the checkbox group.\n */\n id: string\n /**\n * The name of the group. Submitted with its owning form as part of a name/value pair.\n */\n name?: string\n /**\n * The value of the checkbox group.\n */\n value?: string[]\n /**\n * A set of ids separated by a space used to describe the input component given by a set of messages.\n */\n description?: string\n /**\n * The validation state of the checkbox group.\n */\n state?: 'error' | 'success' | 'alert'\n /**\n * If true, the checkbox group will be invalid.\n */\n isInvalid?: boolean\n /**\n * If true, the checkbox group will be required.\n */\n isRequired?: boolean\n /**\n * Callback used to update or notify the value of the checkbox group.\n */\n onCheckedChange?: (checked: boolean, changed: string) => void\n /**\n * When true, the label will be placed on the left side of the Checkbox\n */\n reverse?: boolean\n}\n\nexport const CheckboxGroupContext = createContext<Partial<CheckboxGroupContextState>>({})\n\nexport const useCheckboxGroup = () => {\n const context = useContext(CheckboxGroupContext)\n\n return context\n}\n","import { Checkbox } from 'radix-ui'\nimport { Ref } from 'react'\n\nconst CheckboxIndicatorPrimitive = Checkbox.CheckboxIndicator\n\nexport type CheckboxIndicatorProps = Checkbox.CheckboxIndicatorProps & {\n ref?: Ref<HTMLSpanElement>\n}\n\nexport const CheckboxIndicator = (props: CheckboxIndicatorProps) => (\n <CheckboxIndicatorPrimitive className=\"flex size-full items-center justify-center\" {...props} />\n)\n\nCheckboxIndicator.displayName = 'CheckboxIndicator'\n","import { makeVariants } from '@spark-ui/internal-utils'\nimport { cva, VariantProps } from 'class-variance-authority'\n\nexport const checkboxInputStyles = cva(\n [\n 'size-sz-24 shrink-0 items-center justify-center rounded-sm border-md bg-transparent',\n 'disabled:cursor-not-allowed disabled:opacity-dim-3 disabled:hover:ring-0',\n 'focus-visible:u-outline',\n 'hover:ring-4 hover:cursor-pointer',\n 'u-shadow-border-transition',\n ],\n {\n variants: {\n /**\n * Color scheme of the checkbox.\n */\n intent: makeVariants<\n 'intent',\n ['main', 'support', 'accent', 'basic', 'success', 'alert', 'error', 'info', 'neutral']\n >({\n main: [\n 'text-on-main',\n 'hover:ring-main-container',\n 'data-[state=unchecked]:border-outline',\n 'data-[state=indeterminate]:border-main data-[state=indeterminate]:bg-main',\n 'data-[state=checked]:border-main data-[state=checked]:bg-main',\n ],\n support: [\n 'text-on-support',\n 'hover:ring-support-container',\n 'data-[state=unchecked]:border-outline',\n 'data-[state=indeterminate]:border-support data-[state=indeterminate]:bg-support',\n 'data-[state=checked]:border-support data-[state=checked]:bg-support',\n ],\n accent: [\n 'text-on-accent',\n 'hover:ring-accent-container',\n 'data-[state=unchecked]:border-outline',\n 'data-[state=indeterminate]:border-accent data-[state=indeterminate]:bg-accent',\n 'data-[state=checked]:border-accent data-[state=checked]:bg-accent',\n ],\n basic: [\n 'text-on-basic',\n 'hover:ring-basic-container',\n 'data-[state=unchecked]:border-outline',\n 'data-[state=indeterminate]:border-basic data-[state=indeterminate]:bg-basic',\n 'data-[state=checked]:border-basic data-[state=checked]:bg-basic',\n ],\n success: [\n 'text-on-success',\n 'hover:ring-success-container',\n 'data-[state=unchecked]:border-success',\n 'data-[state=indeterminate]:border-success data-[state=indeterminate]:bg-success',\n 'data-[state=checked]:border-success data-[state=checked]:bg-success',\n ],\n alert: [\n 'text-on-alert',\n 'hover:ring-alert-container',\n 'data-[state=unchecked]:border-alert',\n 'data-[state=indeterminate]:border-alert data-[state=indeterminate]:bg-alert',\n 'data-[state=checked]:border-alert data-[state=checked]:bg-alert',\n ],\n error: [\n 'text-on-error',\n 'hover:ring-error-container',\n 'data-[state=unchecked]:border-error',\n 'data-[state=indeterminate]:border-error data-[state=indeterminate]:bg-error',\n 'data-[state=checked]:border-error data-[state=checked]:bg-error',\n ],\n info: [\n 'text-on-info',\n 'hover:ring-info-container',\n 'data-[state=unchecked]:border-info',\n 'data-[state=indeterminate]:border-info data-[state=indeterminate]:bg-info',\n 'data-[state=checked]:border-info data-[state=checked]:bg-info',\n ],\n neutral: [\n 'text-on-neutral',\n 'hover:ring-neutral-container',\n 'data-[state=unchecked]:border-outline',\n 'data-[state=indeterminate]:border-neutral data-[state=indeterminate]:bg-neutral',\n 'data-[state=checked]:border-neutral data-[state=checked]:bg-neutral',\n ],\n }),\n },\n defaultVariants: {\n intent: 'basic',\n },\n }\n)\n\nexport type CheckboxInputStylesProps = VariantProps<typeof checkboxInputStyles>\n","import { Check } from '@spark-ui/icons/Check'\nimport { Minus } from '@spark-ui/icons/Minus'\nimport { Checkbox } from 'radix-ui'\nimport { ComponentPropsWithoutRef, ReactNode, Ref } from 'react'\n\nimport { Icon } from '../icon'\nimport { CheckboxIndicator } from './CheckboxIndicator'\nimport { checkboxInputStyles, type CheckboxInputStylesProps } from './CheckboxInput.styles'\n\ntype CheckedStatus = boolean | 'indeterminate'\n\nconst CheckboxPrimitive = Checkbox.Checkbox\n\nexport interface CheckboxInputProps\n extends CheckboxInputStylesProps,\n Omit<ComponentPropsWithoutRef<'button'>, 'onChange' | 'value' | 'checked' | 'defaultChecked'> {\n /**\n * The checked icon to use.\n */\n icon?: ReactNode\n /**\n * The indeterminate icon to use.\n */\n indeterminateIcon?: ReactNode\n /**\n * The checked state of the checkbox when it is initially rendered. Use when you do not need to control its checked state.\n */\n defaultChecked?: boolean\n /**\n * The controlled checked state of the checkbox. Must be used in conjunction with onCheckedChange.\n */\n checked?: CheckedStatus\n /**\n * When true, prevents the user from interacting with the checkbox.\n */\n disabled?: boolean\n /**\n * When true, indicates that the user must check the checkbox before the owning form can be submitted.\n */\n required?: boolean\n /**\n * The name of the checkbox. Submitted with its owning form as part of a name/value pair.\n */\n name?: string\n /**\n * The value given as data when submitted with a name.\n */\n value?: string\n /**\n * Event handler called when the checked state of the checkbox changes.\n */\n onCheckedChange?: (checked: boolean) => void\n ref?: Ref<HTMLButtonElement>\n}\n\nexport const CheckboxInput = ({\n className,\n icon = <Check />,\n indeterminateIcon = <Minus />,\n intent,\n checked,\n ref,\n ...others\n}: CheckboxInputProps) => (\n <CheckboxPrimitive\n ref={ref}\n className={checkboxInputStyles({ intent, className })}\n checked={checked}\n {...others}\n >\n <CheckboxIndicator>\n <Icon size=\"sm\">{checked === 'indeterminate' ? indeterminateIcon : icon}</Icon>\n </CheckboxIndicator>\n </CheckboxPrimitive>\n)\n\nCheckboxInput.displayName = 'CheckboxInput'\n","import { cva, VariantProps } from 'class-variance-authority'\n\nexport const labelStyles = cva('grow', {\n variants: {\n disabled: {\n true: ['text-neutral/dim-2', 'cursor-not-allowed'],\n false: ['cursor-pointer'],\n },\n },\n defaultVariants: {\n disabled: false,\n },\n})\n\nexport type LabelStylesProps = VariantProps<typeof labelStyles>\n","import { Label, LabelProps } from '../label'\nimport { labelStyles, type LabelStylesProps } from './CheckboxLabel.styles'\n\nexport interface CheckboxLabelProps extends LabelProps, LabelStylesProps {\n /**\n * When true, prevents the user from interacting with the checkbox item.\n */\n disabled?: boolean\n}\n\nexport const CheckboxLabel = ({ disabled, ...others }: CheckboxLabelProps) => (\n <Label className={labelStyles({ disabled })} {...others} />\n)\n\nCheckboxLabel.displayName = 'CheckboxLabel'\n","import { useFormFieldControl } from '@spark-ui/components/form-field'\nimport { useMergeRefs } from '@spark-ui/hooks/use-merge-refs'\nimport { cx } from 'class-variance-authority'\nimport { Ref, useId, useMemo, useRef } from 'react'\n\nimport { CheckboxGroupContextState, useCheckboxGroup } from './CheckboxGroupContext'\nimport { CheckboxInput, CheckboxInputProps } from './CheckboxInput'\nimport { CheckboxLabel } from './CheckboxLabel'\n\nexport type CheckboxProps = CheckboxInputProps &\n Pick<CheckboxGroupContextState, 'reverse'> & {\n ref?: Ref<HTMLButtonElement>\n }\n\nconst ID_PREFIX = ':checkbox'\n\nexport const Checkbox = ({\n id: idProp,\n className,\n intent: intentProp,\n checked: checkedProp,\n value,\n disabled,\n reverse = false,\n onCheckedChange,\n children,\n ref: forwardedRef,\n ...others\n}: CheckboxProps) => {\n const checkboxId = `${ID_PREFIX}-${useId()}`\n const innerId = idProp || checkboxId\n\n const innerLabelId = `${ID_PREFIX}-${useId()}`\n\n const field = useFormFieldControl()\n const group = useCheckboxGroup()\n\n const rootRef = useRef<HTMLButtonElement | undefined>(null)\n const ref = useMergeRefs(forwardedRef, rootRef)\n\n const getCheckboxAttributes = ({\n fieldState,\n groupState,\n checkboxIntent,\n }: {\n fieldState: ReturnType<typeof useFormFieldControl>\n groupState: ReturnType<typeof useCheckboxGroup>\n checkboxIntent: CheckboxInputProps['intent']\n }) => {\n const name = fieldState.name ?? groupState.name\n const isRequired = fieldState.isRequired ?? groupState.isRequired\n const state = fieldState.state ?? groupState.state\n const isInvalid = fieldState.isInvalid ?? groupState.isInvalid\n\n const isFieldEnclosed = fieldState.id !== groupState.id\n const id = isFieldEnclosed ? fieldState.id : undefined\n const description = isFieldEnclosed ? fieldState.description : undefined\n\n const intent = state ?? checkboxIntent ?? groupState.intent\n\n return { name, isRequired, isInvalid, id, description, intent }\n }\n\n const checked = value ? group.value?.includes(value) : checkedProp\n\n const handleCheckedChange = (isChecked: boolean) => {\n onCheckedChange?.(isChecked)\n\n const rootRefValue = rootRef.current?.value\n if (rootRefValue && group.onCheckedChange) {\n group.onCheckedChange(isChecked, rootRefValue)\n }\n }\n\n const {\n id,\n name,\n isInvalid,\n description,\n intent,\n isRequired: isRequiredAttr,\n } = getCheckboxAttributes({\n fieldState: field,\n groupState: group,\n checkboxIntent: intentProp,\n })\n\n const isRequired = useMemo(() => {\n if (!group) return isRequiredAttr\n\n return isRequiredAttr ? !group.value?.length : false\n }, [group, isRequiredAttr])\n\n const checkboxLabel = children && (\n <CheckboxLabel disabled={disabled} htmlFor={id || innerId} id={innerLabelId}>\n {children}\n </CheckboxLabel>\n )\n\n const checkboxInput = (\n <CheckboxInput\n ref={ref}\n id={id || innerId}\n name={name}\n value={value}\n intent={intent}\n checked={checked}\n disabled={disabled}\n required={isRequired}\n aria-describedby={description}\n aria-invalid={isInvalid}\n onCheckedChange={handleCheckedChange}\n aria-labelledby={children ? innerLabelId : field.labelId}\n {...others}\n />\n )\n\n const content =\n group.reverse || reverse ? (\n <>\n {checkboxLabel}\n {checkboxInput}\n </>\n ) : (\n <>\n {checkboxInput}\n {checkboxLabel}\n </>\n )\n\n return (\n <span\n data-spark-component=\"checkbox\"\n className={cx('gap-md text-body-1 relative flex items-start', className)}\n >\n {content}\n </span>\n )\n}\n\nCheckbox.displayName = 'Checkbox'\n","import { cva, VariantProps } from 'class-variance-authority'\n\nexport const checkboxGroupStyles = cva(['flex'], {\n variants: {\n /**\n * Prop to set the orientation of the checkbox group which could be `vertical` or `horizontal`.\n */\n orientation: {\n vertical: ['flex-col', 'gap-lg'],\n horizontal: ['gap-xl'],\n },\n },\n})\n\nexport type CheckboxGroupStylesProps = VariantProps<typeof checkboxGroupStyles>\n","import { useFormFieldControl } from '@spark-ui/components/form-field'\nimport { useCombinedState } from '@spark-ui/hooks/use-combined-state'\nimport { ComponentPropsWithoutRef, Ref, useEffect, useMemo, useRef } from 'react'\n\nimport { checkboxGroupStyles, CheckboxGroupStylesProps } from './CheckboxGroup.styles'\nimport { CheckboxGroupContext, CheckboxGroupContextState } from './CheckboxGroupContext'\n\nexport interface CheckboxGroupProps\n extends Omit<ComponentPropsWithoutRef<'div'>, 'value' | 'defaultValue' | 'onChange'>,\n CheckboxGroupStylesProps,\n Pick<CheckboxGroupContextState, 'intent' | 'name' | 'value' | 'reverse'> {\n /**\n * The initial value of the checkbox group\n */\n defaultValue?: string[]\n /**\n * The callback fired when any children Checkbox is checked or unchecked\n */\n onCheckedChange?: (value: string[]) => void\n ref?: Ref<HTMLDivElement>\n}\n\nexport const CheckboxGroup = ({\n name: nameProp,\n value: valueProp,\n defaultValue,\n className,\n intent,\n orientation = 'vertical',\n onCheckedChange: onCheckedChangeProp,\n reverse = false,\n children,\n ref,\n ...others\n}: CheckboxGroupProps) => {\n const [value, setValue] = useCombinedState(valueProp, defaultValue)\n const field = useFormFieldControl()\n const onCheckedChangeRef = useRef(onCheckedChangeProp)\n\n const { id, labelId, description, state, isInvalid, isRequired } = field\n const name = nameProp ?? field.name\n\n const current = useMemo(() => {\n const handleCheckedChange = (checked: boolean, changed: string) => {\n const values = value || []\n const modified = checked ? [...values, changed] : values.filter(val => val !== changed)\n\n setValue(modified)\n\n if (onCheckedChangeRef.current) {\n onCheckedChangeRef.current(modified)\n }\n }\n\n return {\n id,\n name,\n value,\n intent,\n state,\n isInvalid,\n description,\n isRequired,\n reverse,\n onCheckedChange: handleCheckedChange,\n }\n }, [id, name, value, intent, state, isInvalid, description, isRequired, setValue, reverse])\n\n useEffect(() => {\n onCheckedChangeRef.current = onCheckedChangeProp\n }, [onCheckedChangeProp])\n\n return (\n <CheckboxGroupContext.Provider value={current}>\n <div\n ref={ref}\n className={checkboxGroupStyles({ className, orientation })}\n role=\"group\"\n aria-labelledby={labelId}\n aria-describedby={description}\n {...others}\n >\n {children}\n </div>\n </CheckboxGroupContext.Provider>\n )\n}\n\nCheckboxGroup.displayName = 'CheckboxGroup'\n"],"names":["CheckboxGroupContext","createContext","useCheckboxGroup","useContext","CheckboxIndicatorPrimitive","Checkbox","CheckboxIndicator","props","jsx","checkboxInputStyles","cva","makeVariants","CheckboxPrimitive","CheckboxInput","className","icon","Check","indeterminateIcon","Minus","intent","checked","ref","others","Icon","labelStyles","CheckboxLabel","disabled","Label","ID_PREFIX","idProp","intentProp","checkedProp","value","reverse","onCheckedChange","children","forwardedRef","checkboxId","useId","innerId","innerLabelId","field","useFormFieldControl","group","rootRef","useRef","useMergeRefs","getCheckboxAttributes","fieldState","groupState","checkboxIntent","name","isRequired","state","isInvalid","isFieldEnclosed","id","description","handleCheckedChange","isChecked","rootRefValue","isRequiredAttr","useMemo","checkboxLabel","checkboxInput","content","jsxs","Fragment","cx","checkboxGroupStyles","CheckboxGroup","nameProp","valueProp","defaultValue","orientation","onCheckedChangeProp","setValue","useCombinedState","onCheckedChangeRef","labelId","current","changed","values","modified","val","useEffect"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/checkbox/CheckboxGroupContext.tsx","../../src/checkbox/CheckboxIndicator.tsx","../../src/checkbox/CheckboxInput.styles.ts","../../src/checkbox/CheckboxInput.tsx","../../src/checkbox/CheckboxLabel.styles.ts","../../src/checkbox/CheckboxLabel.tsx","../../src/checkbox/Checkbox.tsx","../../src/checkbox/CheckboxGroup.styles.ts","../../src/checkbox/CheckboxGroup.tsx"],"sourcesContent":["import { createContext, useContext } from 'react'\n\nimport { CheckboxInputStylesProps } from './CheckboxInput.styles'\n\nexport interface CheckboxGroupContextState extends Pick<CheckboxInputStylesProps, 'intent'> {\n /**\n * The id of the checkbox group.\n */\n id: string\n /**\n * The name of the group. Submitted with its owning form as part of a name/value pair.\n */\n name?: string\n /**\n * The value of the checkbox group.\n */\n value?: string[]\n /**\n * A set of ids separated by a space used to describe the input component given by a set of messages.\n */\n description?: string\n /**\n * The validation state of the checkbox group.\n */\n state?: 'error' | 'success' | 'alert'\n /**\n * If true, the checkbox group will be invalid.\n */\n isInvalid?: boolean\n /**\n * If true, the checkbox group will be required.\n */\n isRequired?: boolean\n /**\n * Callback used to update or notify the value of the checkbox group.\n */\n onCheckedChange?: (checked: boolean, changed: string) => void\n /**\n * When true, the label will be placed on the left side of the Checkbox\n */\n reverse?: boolean\n}\n\nexport const CheckboxGroupContext = createContext<Partial<CheckboxGroupContextState>>({})\n\nexport const useCheckboxGroup = () => {\n const context = useContext(CheckboxGroupContext)\n\n return context\n}\n","import { Checkbox } from 'radix-ui'\nimport { Ref } from 'react'\n\nconst CheckboxIndicatorPrimitive = Checkbox.CheckboxIndicator\n\nexport type CheckboxIndicatorProps = Checkbox.CheckboxIndicatorProps & {\n ref?: Ref<HTMLSpanElement>\n}\n\nexport const CheckboxIndicator = (props: CheckboxIndicatorProps) => (\n <CheckboxIndicatorPrimitive className=\"flex size-full items-center justify-center\" {...props} />\n)\n\nCheckboxIndicator.displayName = 'CheckboxIndicator'\n","import { makeVariants } from '@spark-ui/internal-utils'\nimport { cva, VariantProps } from 'class-variance-authority'\n\nexport const checkboxInputStyles = cva(\n [\n 'size-sz-24 shrink-0 items-center justify-center rounded-sm border-md bg-transparent',\n 'disabled:cursor-not-allowed disabled:opacity-dim-3 disabled:hover:ring-0',\n 'focus-visible:u-outline',\n 'hover:ring-4 hover:cursor-pointer',\n 'u-shadow-border-transition',\n ],\n {\n variants: {\n /**\n * Color scheme of the checkbox.\n */\n intent: makeVariants<\n 'intent',\n ['main', 'support', 'accent', 'success', 'alert', 'error', 'info', 'neutral']\n >({\n main: [\n 'text-on-main',\n 'hover:ring-main-container',\n 'data-[state=unchecked]:border-outline',\n 'data-[state=indeterminate]:border-main data-[state=indeterminate]:bg-main',\n 'data-[state=checked]:border-main data-[state=checked]:bg-main',\n ],\n support: [\n 'text-on-support',\n 'hover:ring-support-container',\n 'data-[state=unchecked]:border-outline',\n 'data-[state=indeterminate]:border-support data-[state=indeterminate]:bg-support',\n 'data-[state=checked]:border-support data-[state=checked]:bg-support',\n ],\n accent: [\n 'text-on-accent',\n 'hover:ring-accent-container',\n 'data-[state=unchecked]:border-outline',\n 'data-[state=indeterminate]:border-accent data-[state=indeterminate]:bg-accent',\n 'data-[state=checked]:border-accent data-[state=checked]:bg-accent',\n ],\n success: [\n 'text-on-success',\n 'hover:ring-success-container',\n 'data-[state=unchecked]:border-success',\n 'data-[state=indeterminate]:border-success data-[state=indeterminate]:bg-success',\n 'data-[state=checked]:border-success data-[state=checked]:bg-success',\n ],\n alert: [\n 'text-on-alert',\n 'hover:ring-alert-container',\n 'data-[state=unchecked]:border-alert',\n 'data-[state=indeterminate]:border-alert data-[state=indeterminate]:bg-alert',\n 'data-[state=checked]:border-alert data-[state=checked]:bg-alert',\n ],\n error: [\n 'text-on-error',\n 'hover:ring-error-container',\n 'data-[state=unchecked]:border-error',\n 'data-[state=indeterminate]:border-error data-[state=indeterminate]:bg-error',\n 'data-[state=checked]:border-error data-[state=checked]:bg-error',\n ],\n info: [\n 'text-on-info',\n 'hover:ring-info-container',\n 'data-[state=unchecked]:border-info',\n 'data-[state=indeterminate]:border-info data-[state=indeterminate]:bg-info',\n 'data-[state=checked]:border-info data-[state=checked]:bg-info',\n ],\n neutral: [\n 'text-on-neutral',\n 'hover:ring-neutral-container',\n 'data-[state=unchecked]:border-outline',\n 'data-[state=indeterminate]:border-neutral data-[state=indeterminate]:bg-neutral',\n 'data-[state=checked]:border-neutral data-[state=checked]:bg-neutral',\n ],\n }),\n },\n defaultVariants: {\n intent: 'support',\n },\n }\n)\n\nexport type CheckboxInputStylesProps = VariantProps<typeof checkboxInputStyles>\n","import { Check } from '@spark-ui/icons/Check'\nimport { Minus } from '@spark-ui/icons/Minus'\nimport { Checkbox } from 'radix-ui'\nimport { ComponentPropsWithoutRef, ReactNode, Ref } from 'react'\n\nimport { Icon } from '../icon'\nimport { CheckboxIndicator } from './CheckboxIndicator'\nimport { checkboxInputStyles, type CheckboxInputStylesProps } from './CheckboxInput.styles'\n\ntype CheckedStatus = boolean | 'indeterminate'\n\nconst CheckboxPrimitive = Checkbox.Checkbox\n\nexport interface CheckboxInputProps\n extends CheckboxInputStylesProps,\n Omit<ComponentPropsWithoutRef<'button'>, 'onChange' | 'value' | 'checked' | 'defaultChecked'> {\n /**\n * The checked icon to use.\n */\n icon?: ReactNode\n /**\n * The indeterminate icon to use.\n */\n indeterminateIcon?: ReactNode\n /**\n * The checked state of the checkbox when it is initially rendered. Use when you do not need to control its checked state.\n */\n defaultChecked?: boolean\n /**\n * The controlled checked state of the checkbox. Must be used in conjunction with onCheckedChange.\n */\n checked?: CheckedStatus\n /**\n * When true, prevents the user from interacting with the checkbox.\n */\n disabled?: boolean\n /**\n * When true, indicates that the user must check the checkbox before the owning form can be submitted.\n */\n required?: boolean\n /**\n * The name of the checkbox. Submitted with its owning form as part of a name/value pair.\n */\n name?: string\n /**\n * The value given as data when submitted with a name.\n */\n value?: string\n /**\n * Event handler called when the checked state of the checkbox changes.\n */\n onCheckedChange?: (checked: boolean) => void\n ref?: Ref<HTMLButtonElement>\n}\n\nexport const CheckboxInput = ({\n className,\n icon = <Check />,\n indeterminateIcon = <Minus />,\n intent,\n checked,\n ref,\n ...others\n}: CheckboxInputProps) => (\n <CheckboxPrimitive\n ref={ref}\n className={checkboxInputStyles({ intent, className })}\n checked={checked}\n {...others}\n >\n <CheckboxIndicator>\n <Icon size=\"sm\">{checked === 'indeterminate' ? indeterminateIcon : icon}</Icon>\n </CheckboxIndicator>\n </CheckboxPrimitive>\n)\n\nCheckboxInput.displayName = 'CheckboxInput'\n","import { cva, VariantProps } from 'class-variance-authority'\n\nexport const labelStyles = cva('grow', {\n variants: {\n disabled: {\n true: ['text-neutral/dim-2', 'cursor-not-allowed'],\n false: ['cursor-pointer'],\n },\n },\n defaultVariants: {\n disabled: false,\n },\n})\n\nexport type LabelStylesProps = VariantProps<typeof labelStyles>\n","import { Label, LabelProps } from '../label'\nimport { labelStyles, type LabelStylesProps } from './CheckboxLabel.styles'\n\nexport interface CheckboxLabelProps extends LabelProps, LabelStylesProps {\n /**\n * When true, prevents the user from interacting with the checkbox item.\n */\n disabled?: boolean\n}\n\nexport const CheckboxLabel = ({ disabled, ...others }: CheckboxLabelProps) => (\n <Label className={labelStyles({ disabled })} {...others} />\n)\n\nCheckboxLabel.displayName = 'CheckboxLabel'\n","import { useFormFieldControl } from '@spark-ui/components/form-field'\nimport { useMergeRefs } from '@spark-ui/hooks/use-merge-refs'\nimport { cx } from 'class-variance-authority'\nimport { Ref, useId, useMemo, useRef } from 'react'\n\nimport { CheckboxGroupContextState, useCheckboxGroup } from './CheckboxGroupContext'\nimport { CheckboxInput, CheckboxInputProps } from './CheckboxInput'\nimport { CheckboxLabel } from './CheckboxLabel'\n\nexport type CheckboxProps = CheckboxInputProps &\n Pick<CheckboxGroupContextState, 'reverse'> & {\n ref?: Ref<HTMLButtonElement>\n }\n\nconst ID_PREFIX = ':checkbox'\n\nexport const Checkbox = ({\n id: idProp,\n className,\n intent: intentProp,\n checked: checkedProp,\n value,\n disabled,\n reverse = false,\n onCheckedChange,\n children,\n ref: forwardedRef,\n ...others\n}: CheckboxProps) => {\n const checkboxId = `${ID_PREFIX}-${useId()}`\n const innerId = idProp || checkboxId\n\n const innerLabelId = `${ID_PREFIX}-${useId()}`\n\n const field = useFormFieldControl()\n const group = useCheckboxGroup()\n\n const rootRef = useRef<HTMLButtonElement | undefined>(null)\n const ref = useMergeRefs(forwardedRef, rootRef)\n\n const getCheckboxAttributes = ({\n fieldState,\n groupState,\n checkboxIntent,\n }: {\n fieldState: ReturnType<typeof useFormFieldControl>\n groupState: ReturnType<typeof useCheckboxGroup>\n checkboxIntent: CheckboxInputProps['intent']\n }) => {\n const name = fieldState.name ?? groupState.name\n const isRequired = fieldState.isRequired ?? groupState.isRequired\n const state = fieldState.state ?? groupState.state\n const isInvalid = fieldState.isInvalid ?? groupState.isInvalid\n\n const isFieldEnclosed = fieldState.id !== groupState.id\n const id = isFieldEnclosed ? fieldState.id : undefined\n const description = isFieldEnclosed ? fieldState.description : undefined\n\n const intent = state ?? checkboxIntent ?? groupState.intent\n\n return { name, isRequired, isInvalid, id, description, intent }\n }\n\n const checked = value ? group.value?.includes(value) : checkedProp\n\n const handleCheckedChange = (isChecked: boolean) => {\n onCheckedChange?.(isChecked)\n\n const rootRefValue = rootRef.current?.value\n if (rootRefValue && group.onCheckedChange) {\n group.onCheckedChange(isChecked, rootRefValue)\n }\n }\n\n const {\n id,\n name,\n isInvalid,\n description,\n intent,\n isRequired: isRequiredAttr,\n } = getCheckboxAttributes({\n fieldState: field,\n groupState: group,\n checkboxIntent: intentProp,\n })\n\n const isRequired = useMemo(() => {\n if (!group) return isRequiredAttr\n\n return isRequiredAttr ? !group.value?.length : false\n }, [group, isRequiredAttr])\n\n const checkboxLabel = children && (\n <CheckboxLabel disabled={disabled} htmlFor={id || innerId} id={innerLabelId}>\n {children}\n </CheckboxLabel>\n )\n\n const checkboxInput = (\n <CheckboxInput\n ref={ref}\n id={id || innerId}\n name={name}\n value={value}\n intent={intent}\n checked={checked}\n disabled={disabled}\n required={isRequired}\n aria-describedby={description}\n aria-invalid={isInvalid}\n onCheckedChange={handleCheckedChange}\n aria-labelledby={children ? innerLabelId : field.labelId}\n {...others}\n />\n )\n\n const content =\n group.reverse || reverse ? (\n <>\n {checkboxLabel}\n {checkboxInput}\n </>\n ) : (\n <>\n {checkboxInput}\n {checkboxLabel}\n </>\n )\n\n return (\n <span\n data-spark-component=\"checkbox\"\n className={cx('gap-md text-body-1 relative flex items-start', className)}\n >\n {content}\n </span>\n )\n}\n\nCheckbox.displayName = 'Checkbox'\n","import { cva, VariantProps } from 'class-variance-authority'\n\nexport const checkboxGroupStyles = cva(['flex'], {\n variants: {\n /**\n * Prop to set the orientation of the checkbox group which could be `vertical` or `horizontal`.\n */\n orientation: {\n vertical: ['flex-col', 'gap-lg'],\n horizontal: ['gap-xl'],\n },\n },\n})\n\nexport type CheckboxGroupStylesProps = VariantProps<typeof checkboxGroupStyles>\n","import { useFormFieldControl } from '@spark-ui/components/form-field'\nimport { useCombinedState } from '@spark-ui/hooks/use-combined-state'\nimport { ComponentPropsWithoutRef, Ref, useEffect, useMemo, useRef } from 'react'\n\nimport { checkboxGroupStyles, CheckboxGroupStylesProps } from './CheckboxGroup.styles'\nimport { CheckboxGroupContext, CheckboxGroupContextState } from './CheckboxGroupContext'\n\nexport interface CheckboxGroupProps\n extends Omit<ComponentPropsWithoutRef<'div'>, 'value' | 'defaultValue' | 'onChange'>,\n CheckboxGroupStylesProps,\n Pick<CheckboxGroupContextState, 'intent' | 'name' | 'value' | 'reverse'> {\n /**\n * The initial value of the checkbox group\n */\n defaultValue?: string[]\n /**\n * The callback fired when any children Checkbox is checked or unchecked\n */\n onCheckedChange?: (value: string[]) => void\n ref?: Ref<HTMLDivElement>\n}\n\nexport const CheckboxGroup = ({\n name: nameProp,\n value: valueProp,\n defaultValue,\n className,\n intent,\n orientation = 'vertical',\n onCheckedChange: onCheckedChangeProp,\n reverse = false,\n children,\n ref,\n ...others\n}: CheckboxGroupProps) => {\n const [value, setValue] = useCombinedState(valueProp, defaultValue)\n const field = useFormFieldControl()\n const onCheckedChangeRef = useRef(onCheckedChangeProp)\n\n const { id, labelId, description, state, isInvalid, isRequired } = field\n const name = nameProp ?? field.name\n\n const current = useMemo(() => {\n const handleCheckedChange = (checked: boolean, changed: string) => {\n const values = value || []\n const modified = checked ? [...values, changed] : values.filter(val => val !== changed)\n\n setValue(modified)\n\n if (onCheckedChangeRef.current) {\n onCheckedChangeRef.current(modified)\n }\n }\n\n return {\n id,\n name,\n value,\n intent,\n state,\n isInvalid,\n description,\n isRequired,\n reverse,\n onCheckedChange: handleCheckedChange,\n }\n }, [id, name, value, intent, state, isInvalid, description, isRequired, setValue, reverse])\n\n useEffect(() => {\n onCheckedChangeRef.current = onCheckedChangeProp\n }, [onCheckedChangeProp])\n\n return (\n <CheckboxGroupContext.Provider value={current}>\n <div\n ref={ref}\n className={checkboxGroupStyles({ className, orientation })}\n role=\"group\"\n aria-labelledby={labelId}\n aria-describedby={description}\n {...others}\n >\n {children}\n </div>\n </CheckboxGroupContext.Provider>\n )\n}\n\nCheckboxGroup.displayName = 'CheckboxGroup'\n"],"names":["CheckboxGroupContext","createContext","useCheckboxGroup","useContext","CheckboxIndicatorPrimitive","Checkbox","CheckboxIndicator","props","jsx","checkboxInputStyles","cva","makeVariants","CheckboxPrimitive","CheckboxInput","className","icon","Check","indeterminateIcon","Minus","intent","checked","ref","others","Icon","labelStyles","CheckboxLabel","disabled","Label","ID_PREFIX","idProp","intentProp","checkedProp","value","reverse","onCheckedChange","children","forwardedRef","checkboxId","useId","innerId","innerLabelId","field","useFormFieldControl","group","rootRef","useRef","useMergeRefs","getCheckboxAttributes","fieldState","groupState","checkboxIntent","name","isRequired","state","isInvalid","isFieldEnclosed","id","description","handleCheckedChange","isChecked","rootRefValue","isRequiredAttr","useMemo","checkboxLabel","checkboxInput","content","jsxs","Fragment","cx","checkboxGroupStyles","CheckboxGroup","nameProp","valueProp","defaultValue","orientation","onCheckedChangeProp","setValue","useCombinedState","onCheckedChangeRef","labelId","current","changed","values","modified","val","useEffect"],"mappings":"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"}
|
package/dist/checkbox/index.mjs
CHANGED
|
@@ -6,10 +6,10 @@ import { createContext as ne, useContext as oe, useId as A, useRef as X, useMemo
|
|
|
6
6
|
import { Check as se } from "@spark-ui/icons/Check";
|
|
7
7
|
import { Minus as ie } from "@spark-ui/icons/Minus";
|
|
8
8
|
import { Checkbox as B } from "radix-ui";
|
|
9
|
-
import { I as de } from "../Icon-
|
|
9
|
+
import { I as de } from "../Icon-BO327oHU.mjs";
|
|
10
10
|
import { makeVariants as le } from "@spark-ui/internal-utils";
|
|
11
|
-
import { Label as
|
|
12
|
-
import { useCombinedState as
|
|
11
|
+
import { Label as ue } from "../label/index.mjs";
|
|
12
|
+
import { useCombinedState as be } from "@spark-ui/hooks/use-combined-state";
|
|
13
13
|
const H = ne({}), he = () => oe(H), me = B.CheckboxIndicator, J = (a) => /* @__PURE__ */ e(me, { className: "flex size-full items-center justify-center", ...a });
|
|
14
14
|
J.displayName = "CheckboxIndicator";
|
|
15
15
|
const ke = V(
|
|
@@ -47,13 +47,6 @@ const ke = V(
|
|
|
47
47
|
"data-[state=indeterminate]:border-accent data-[state=indeterminate]:bg-accent",
|
|
48
48
|
"data-[state=checked]:border-accent data-[state=checked]:bg-accent"
|
|
49
49
|
],
|
|
50
|
-
basic: [
|
|
51
|
-
"text-on-basic",
|
|
52
|
-
"hover:ring-basic-container",
|
|
53
|
-
"data-[state=unchecked]:border-outline",
|
|
54
|
-
"data-[state=indeterminate]:border-basic data-[state=indeterminate]:bg-basic",
|
|
55
|
-
"data-[state=checked]:border-basic data-[state=checked]:bg-basic"
|
|
56
|
-
],
|
|
57
50
|
success: [
|
|
58
51
|
"text-on-success",
|
|
59
52
|
"hover:ring-success-container",
|
|
@@ -92,14 +85,14 @@ const ke = V(
|
|
|
92
85
|
})
|
|
93
86
|
},
|
|
94
87
|
defaultVariants: {
|
|
95
|
-
intent: "
|
|
88
|
+
intent: "support"
|
|
96
89
|
}
|
|
97
90
|
}
|
|
98
91
|
), pe = B.Checkbox, K = ({
|
|
99
92
|
className: a,
|
|
100
93
|
icon: c = /* @__PURE__ */ e(se, {}),
|
|
101
|
-
indeterminateIcon:
|
|
102
|
-
intent:
|
|
94
|
+
indeterminateIcon: u = /* @__PURE__ */ e(ie, {}),
|
|
95
|
+
intent: b,
|
|
103
96
|
checked: n,
|
|
104
97
|
ref: i,
|
|
105
98
|
...s
|
|
@@ -107,10 +100,10 @@ const ke = V(
|
|
|
107
100
|
pe,
|
|
108
101
|
{
|
|
109
102
|
ref: i,
|
|
110
|
-
className: ke({ intent:
|
|
103
|
+
className: ke({ intent: b, className: a }),
|
|
111
104
|
checked: n,
|
|
112
105
|
...s,
|
|
113
|
-
children: /* @__PURE__ */ e(J, { children: /* @__PURE__ */ e(de, { size: "sm", children: n === "indeterminate" ?
|
|
106
|
+
children: /* @__PURE__ */ e(J, { children: /* @__PURE__ */ e(de, { size: "sm", children: n === "indeterminate" ? u : c }) })
|
|
114
107
|
}
|
|
115
108
|
);
|
|
116
109
|
K.displayName = "CheckboxInput";
|
|
@@ -124,13 +117,13 @@ const xe = V("grow", {
|
|
|
124
117
|
defaultVariants: {
|
|
125
118
|
disabled: !1
|
|
126
119
|
}
|
|
127
|
-
}), O = ({ disabled: a, ...c }) => /* @__PURE__ */ e(
|
|
120
|
+
}), O = ({ disabled: a, ...c }) => /* @__PURE__ */ e(ue, { className: xe({ disabled: a }), ...c });
|
|
128
121
|
O.displayName = "CheckboxLabel";
|
|
129
122
|
const P = ":checkbox", fe = ({
|
|
130
123
|
id: a,
|
|
131
124
|
className: c,
|
|
132
|
-
intent:
|
|
133
|
-
checked:
|
|
125
|
+
intent: u,
|
|
126
|
+
checked: b,
|
|
134
127
|
value: n,
|
|
135
128
|
disabled: i,
|
|
136
129
|
reverse: s = !1,
|
|
@@ -139,16 +132,16 @@ const P = ":checkbox", fe = ({
|
|
|
139
132
|
ref: F,
|
|
140
133
|
...z
|
|
141
134
|
}) => {
|
|
142
|
-
const m = `${P}-${A()}`, k = a || m, p = `${P}-${A()}`, d = D(), t = he(),
|
|
135
|
+
const m = `${P}-${A()}`, k = a || m, p = `${P}-${A()}`, d = D(), t = he(), C = X(null), x = ae(F, C), v = ({
|
|
143
136
|
fieldState: r,
|
|
144
137
|
groupState: o,
|
|
145
138
|
checkboxIntent: T
|
|
146
139
|
}) => {
|
|
147
140
|
const U = r.name ?? o.name, W = r.isRequired ?? o.isRequired, Y = r.state ?? o.state, Z = r.isInvalid ?? o.isInvalid, w = r.id !== o.id, S = w ? r.id : void 0, ee = w ? r.description : void 0, te = Y ?? T ?? o.intent;
|
|
148
141
|
return { name: U, isRequired: W, isInvalid: Z, id: S, description: ee, intent: te };
|
|
149
|
-
}, I = n ? t.value?.includes(n) :
|
|
142
|
+
}, I = n ? t.value?.includes(n) : b, y = (r) => {
|
|
150
143
|
g?.(r);
|
|
151
|
-
const o =
|
|
144
|
+
const o = C.current?.value;
|
|
152
145
|
o && t.onCheckedChange && t.onCheckedChange(r, o);
|
|
153
146
|
}, {
|
|
154
147
|
id: f,
|
|
@@ -157,10 +150,10 @@ const P = ":checkbox", fe = ({
|
|
|
157
150
|
description: L,
|
|
158
151
|
intent: R,
|
|
159
152
|
isRequired: l
|
|
160
|
-
} =
|
|
153
|
+
} = v({
|
|
161
154
|
fieldState: d,
|
|
162
155
|
groupState: t,
|
|
163
|
-
checkboxIntent:
|
|
156
|
+
checkboxIntent: u
|
|
164
157
|
}), N = _(() => t ? l ? !t.value?.length : !1 : l, [t, l]), q = h && /* @__PURE__ */ e(O, { disabled: i, htmlFor: f || k, id: p, children: h }), j = /* @__PURE__ */ e(
|
|
165
158
|
K,
|
|
166
159
|
{
|
|
@@ -205,11 +198,11 @@ const ge = V(["flex"], {
|
|
|
205
198
|
horizontal: ["gap-xl"]
|
|
206
199
|
}
|
|
207
200
|
}
|
|
208
|
-
}),
|
|
201
|
+
}), Ce = ({
|
|
209
202
|
name: a,
|
|
210
203
|
value: c,
|
|
211
|
-
defaultValue:
|
|
212
|
-
className:
|
|
204
|
+
defaultValue: u,
|
|
205
|
+
className: b,
|
|
213
206
|
intent: n,
|
|
214
207
|
orientation: i = "vertical",
|
|
215
208
|
onCheckedChange: s,
|
|
@@ -218,12 +211,12 @@ const ge = V(["flex"], {
|
|
|
218
211
|
ref: F,
|
|
219
212
|
...z
|
|
220
213
|
}) => {
|
|
221
|
-
const [m, k] =
|
|
214
|
+
const [m, k] = be(c, u), p = D(), d = X(s), { id: t, labelId: C, description: x, state: v, isInvalid: I, isRequired: y } = p, f = a ?? p.name, G = _(() => ({
|
|
222
215
|
id: t,
|
|
223
216
|
name: f,
|
|
224
217
|
value: m,
|
|
225
218
|
intent: n,
|
|
226
|
-
state:
|
|
219
|
+
state: v,
|
|
227
220
|
isInvalid: I,
|
|
228
221
|
description: x,
|
|
229
222
|
isRequired: y,
|
|
@@ -232,25 +225,25 @@ const ge = V(["flex"], {
|
|
|
232
225
|
const l = m || [], N = L ? [...l, R] : l.filter((q) => q !== R);
|
|
233
226
|
k(N), d.current && d.current(N);
|
|
234
227
|
}
|
|
235
|
-
}), [t, f, m, n,
|
|
228
|
+
}), [t, f, m, n, v, I, x, y, k, g]);
|
|
236
229
|
return ce(() => {
|
|
237
230
|
d.current = s;
|
|
238
231
|
}, [s]), /* @__PURE__ */ e(H.Provider, { value: G, children: /* @__PURE__ */ e(
|
|
239
232
|
"div",
|
|
240
233
|
{
|
|
241
234
|
ref: F,
|
|
242
|
-
className: ge({ className:
|
|
235
|
+
className: ge({ className: b, orientation: i }),
|
|
243
236
|
role: "group",
|
|
244
|
-
"aria-labelledby":
|
|
237
|
+
"aria-labelledby": C,
|
|
245
238
|
"aria-describedby": x,
|
|
246
239
|
...z,
|
|
247
240
|
children: h
|
|
248
241
|
}
|
|
249
242
|
) });
|
|
250
243
|
};
|
|
251
|
-
|
|
244
|
+
Ce.displayName = "CheckboxGroup";
|
|
252
245
|
export {
|
|
253
246
|
fe as Checkbox,
|
|
254
|
-
|
|
247
|
+
Ce as CheckboxGroup
|
|
255
248
|
};
|
|
256
249
|
//# sourceMappingURL=index.mjs.map
|