@hunterchen/canvas 0.8.0 → 0.10.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.
Files changed (48) hide show
  1. package/dist/components/canvas/backgrounds.js +67 -38
  2. package/dist/components/canvas/backgrounds.js.map +1 -1
  3. package/dist/components/canvas/canvas.d.ts +2 -0
  4. package/dist/components/canvas/canvas.d.ts.map +1 -1
  5. package/dist/components/canvas/canvas.js +459 -387
  6. package/dist/components/canvas/canvas.js.map +1 -1
  7. package/dist/components/canvas/component.js +108 -174
  8. package/dist/components/canvas/component.js.map +1 -1
  9. package/dist/components/canvas/draggable.js +168 -151
  10. package/dist/components/canvas/draggable.js.map +1 -1
  11. package/dist/components/canvas/navbar/index.js +164 -142
  12. package/dist/components/canvas/navbar/index.js.map +1 -1
  13. package/dist/components/canvas/navbar/single-button.js +176 -149
  14. package/dist/components/canvas/navbar/single-button.js.map +1 -1
  15. package/dist/components/canvas/toolbar.js +121 -82
  16. package/dist/components/canvas/toolbar.js.map +1 -1
  17. package/dist/components/canvas/wrapper.js +127 -99
  18. package/dist/components/canvas/wrapper.js.map +1 -1
  19. package/dist/contexts/CanvasContext.js +25 -17
  20. package/dist/contexts/CanvasContext.js.map +1 -1
  21. package/dist/contexts/PerformanceContext.js +51 -50
  22. package/dist/contexts/PerformanceContext.js.map +1 -1
  23. package/dist/hooks/usePerformanceMode.js +36 -37
  24. package/dist/hooks/usePerformanceMode.js.map +1 -1
  25. package/dist/hooks/useWindowDimensions.js +22 -18
  26. package/dist/hooks/useWindowDimensions.js.map +1 -1
  27. package/dist/index.d.ts +1 -1
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +17 -21
  30. package/dist/lib/canvas.js +65 -72
  31. package/dist/lib/canvas.js.map +1 -1
  32. package/dist/lib/constants.js +78 -92
  33. package/dist/lib/constants.js.map +1 -1
  34. package/dist/lib/utils.js +10 -5
  35. package/dist/lib/utils.js.map +1 -1
  36. package/dist/types/index.d.ts +22 -0
  37. package/dist/types/index.d.ts.map +1 -1
  38. package/dist/utils/performance.js +18 -23
  39. package/dist/utils/performance.js.map +1 -1
  40. package/package.json +7 -21
  41. package/src/components/canvas/canvas.tsx +16 -4
  42. package/src/index.ts +1 -0
  43. package/src/types/index.ts +24 -0
  44. package/dist/components/canvas/offest.js +0 -12
  45. package/dist/components/canvas/offest.js.map +0 -1
  46. package/dist/index.js.map +0 -1
  47. package/dist/types/index.js +0 -6
  48. package/dist/types/index.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"canvas.js","sourceRoot":"","sources":["../../../src/components/canvas/canvas.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"canvas.js","names":["useWindowDimensions","Toolbar"],"sources":["../../../src/components/canvas/canvas.tsx"],"sourcesContent":["import {\n motion,\n type MotionValue,\n type Point,\n useMotionValue,\n animate,\n useTransform,\n type Transition,\n} from \"framer-motion\";\nimport React, {\n useState,\n useRef,\n type PointerEvent,\n type FC,\n useEffect,\n useCallback,\n useMemo,\n} from \"react\";\nimport { CanvasProvider } from \"../../contexts/CanvasContext\";\nimport {\n calcInitialBoxWidth,\n canvasHeight,\n canvasWidth,\n getDistance,\n getMidpoint,\n getScreenSizeEnum,\n getSectionPanCoordinates,\n INTERACTIVE_SELECTOR,\n MAX_ZOOM,\n MIN_ZOOMS,\n panToOffsetScene,\n ZOOM_BOUND,\n} from \"../../lib/canvas\";\nimport {\n STAGE2_TRANSITION,\n MOUSE_WHEEL_ZOOM_SENSITIVITY,\n TRACKPAD_ZOOM_SENSITIVITY,\n DEFAULT_CANVAS_WIDTH,\n DEFAULT_CANVAS_HEIGHT,\n} from \"../../lib/constants\";\nimport useWindowDimensions from \"../../hooks/useWindowDimensions\";\nimport Navbar from \"./navbar\";\nimport Toolbar from \"./toolbar\";\nimport type {\n CanvasSection,\n NavItem,\n NavbarConfig,\n SectionCoordinates,\n ToolbarConfig,\n} from \"../../types\";\nimport { CanvasWrapper } from \"./wrapper\";\nimport { usePerformanceMode } from \"../../hooks/usePerformanceMode\";\nimport type { ReactNode } from \"react\";\nimport { DefaultCanvasBackground } from \"./backgrounds\";\n\ninterface Props {\n homeCoordinates: SectionCoordinates;\n children: React.ReactNode;\n\n // Optional height and with params, if omitted sizing will be 6000x4000\n canvasWidth?:number;\n canvasHeight?:number;\n\n // Navbar data (optional). If omitted, navbar is hidden.\n /** Array of navigation items for the navbar. If omitted, navbar is hidden. */\n navItems?: NavItem[];\n\n // ============== Intro Animation Customization ==============\n /** Disable intro animation entirely */\n skipIntro?: boolean;\n /** Custom intro content during loading */\n introContent?: ReactNode;\n /** Custom loading text */\n loadingText?: string;\n /** Background gradient for intro */\n introBackgroundGradient?: string;\n /** Canvas box gradient */\n canvasBoxGradient?: string;\n /** Custom grow transition */\n growTransition?: Transition;\n /** Custom blur transition */\n blurTransition?: Transition;\n /** Custom pan-to-home transition (stage 2) */\n panTransition?: Transition;\n\n // ============== Background Customization ==============\n /** Custom canvas background. If not provided, uses DefaultCanvasBackground. */\n canvasBackground?: ReactNode;\n /** Custom wrapper/intro background. If not provided, uses introBackgroundGradient. */\n wrapperBackground?: ReactNode;\n\n // ============== Toolbar Customization ==============\n /** Toolbar customization options */\n toolbarConfig?: ToolbarConfig;\n\n // ============== Navbar Customization ==============\n /** Navbar customization options */\n navbarConfig?: NavbarConfig;\n}\n\nconst stopAllMotion = (\n x: MotionValue<number>,\n y: MotionValue<number>,\n scale: MotionValue<number>\n) => {\n x.stop();\n y.stop();\n scale.stop();\n};\n\nconst Canvas: FC<Props> = ({\n children,\n homeCoordinates,\n navItems,\n skipIntro = false,\n introContent,\n loadingText,\n introBackgroundGradient,\n canvasBoxGradient,\n growTransition,\n blurTransition,\n panTransition,\n canvasBackground,\n wrapperBackground,\n toolbarConfig,\n navbarConfig,\n canvasHeight,\n canvasWidth,\n}) => {\n const { height: windowHeight, width: windowWidth } = useWindowDimensions();\n\n const { mode } = usePerformanceMode();\n\n const hasNavbar = Boolean(navItems && navItems.length > 0);\n\n const sceneWidth = canvasWidth ?? DEFAULT_CANVAS_WIDTH;\n const sceneHeight = canvasHeight ?? DEFAULT_CANVAS_HEIGHT;\n\n const MIN_ZOOM = MIN_ZOOMS[getScreenSizeEnum(windowWidth)];\n\n // tracks if user is panning the screen\n const [isPanning, setIsPanning] = useState<boolean>(false);\n // this one is moving from scene control, not from user\n const [isSceneMoving, setIsSceneMoving] = useState<boolean>(false);\n const [panStartPoint, setPanStartPoint] = useState<Point>({ x: 0, y: 0 });\n const [initialPanOffsetOnDrag, setInitialPanOffsetOnDrag] = useState<Point>({\n x: 0,\n y: 0,\n });\n const [isResetting, setIsResetting] = useState<boolean>(false);\n const [maxZIndex, setMaxZIndex] = useState<number>(50);\n const [animationStage, setAnimationStage] = useState<number>(0); // 0: initial, 1: finish grow, 2: pan to home\n const [nextTargetSection, setNextTargetSection] =\n useState<CanvasSection | null>(null);\n // Track if the intro (stage1 + stage2) is still running, to avoid accidental cancellation\n const isIntroAnimatingRef = useRef(true);\n\n const initialBoxWidth = useMemo(\n () => calcInitialBoxWidth(windowWidth, windowHeight),\n [windowWidth, windowHeight]\n );\n\n // somewhere near the middle-ish\n const x = useMotionValue(0);\n const y = useMotionValue(0);\n const scale = useMotionValue(initialBoxWidth);\n\n const offsetHomeCoordinates = useMemo(\n () =>\n getSectionPanCoordinates({\n windowDimensions: { width: windowWidth, height: windowHeight },\n coords: homeCoordinates,\n targetZoom: 1,\n }),\n [homeCoordinates, windowWidth, windowHeight]\n );\n\n const onResetViewAndItems = useCallback(\n (onComplete?: () => void): void => {\n setIsResetting(true);\n\n void panToOffsetScene(offsetHomeCoordinates, x, y, scale, 1).then(() => {\n setIsResetting(false);\n if (onComplete) onComplete();\n });\n },\n [offsetHomeCoordinates, x, y, scale]\n );\n\n // Shared intro progress (0->1) driven by CanvasWrapper\n const introProgress = useMotionValue(0);\n\n // Precompute final stage1 scale and offsets (snapshot dimensions once on mount)\n const stage1Targets = useMemo(() => {\n const finalScale = Math.max(\n (windowWidth || 0) / sceneWidth,\n (windowHeight || 0) / sceneHeight\n );\n const endX = (windowWidth - sceneWidth * finalScale) / 2;\n const endY = (windowHeight - sceneHeight * finalScale) / 2;\n return { finalScale, endX, endY };\n }, [windowWidth, windowHeight, sceneWidth, sceneHeight]);\n\n // Replace direct motion values with derived transforms during stage1\n const derivedScale = useTransform(\n introProgress,\n [0, 1],\n [initialBoxWidth, stage1Targets.finalScale]\n );\n const derivedX = useTransform(introProgress, [0, 1], [0, stage1Targets.endX]);\n const derivedY = useTransform(introProgress, [0, 1], [0, stage1Targets.endY]);\n\n // While intro (stage1) is running, bind x/y/scale to derived versions.\n useEffect(() => {\n const unsubscribeScale = derivedScale.on(\"change\", (v) => {\n if (animationStage === 0) scale.set(v);\n });\n const unsubscribeX = derivedX.on(\"change\", (v) => {\n if (animationStage === 0) x.set(v);\n });\n const unsubscribeY = derivedY.on(\"change\", (v) => {\n if (animationStage === 0) y.set(v);\n });\n return () => {\n unsubscribeScale();\n unsubscribeX();\n unsubscribeY();\n };\n }, [derivedScale, derivedX, derivedY, animationStage, scale, x, y]);\n\n // Merge custom panTransition with defaults\n const effectivePanTransition: Transition = useMemo(() => {\n if (!panTransition) return STAGE2_TRANSITION;\n return {\n ...STAGE2_TRANSITION,\n ...panTransition,\n };\n }, [panTransition]);\n\n // Kick off stage2 (pan to home) when grow completes (introProgress hits 1)\n const startStage2 = useCallback(() => {\n setAnimationStage(1);\n\n Promise.all([\n animate(x, offsetHomeCoordinates.x, effectivePanTransition),\n animate(y, offsetHomeCoordinates.y, effectivePanTransition),\n animate(scale, 1, effectivePanTransition),\n ])\n .then(() => {\n setAnimationStage(2);\n isIntroAnimatingRef.current = false;\n })\n .catch(() => {\n isIntroAnimatingRef.current = false;\n });\n }, [offsetHomeCoordinates, x, y, scale, effectivePanTransition]);\n\n const viewportRef = useRef<HTMLDivElement>(null);\n const sceneRef = useRef<HTMLDivElement>(null);\n\n // Stable wheel listener wrapper that always calls the latest handler via ref\n const wheelHandlerRef = useRef<((e: WheelEvent) => void) | null>(null);\n const wheelWrapper = useCallback((e: WheelEvent) => {\n wheelHandlerRef.current?.(e);\n }, []);\n\n // Ensure wheel listener attaches when the element actually mounts (wrapper delays child mount)\n const setViewportRef = useCallback(\n (node: HTMLDivElement | null) => {\n // Clean up old listener if ref changes/unmounts\n if (viewportRef.current) {\n viewportRef.current.removeEventListener(\"wheel\", wheelWrapper);\n }\n viewportRef.current = node;\n if (node) {\n node.addEventListener(\"wheel\", wheelWrapper, { passive: false });\n }\n },\n [wheelWrapper]\n );\n\n const activePointersRef = useRef<Map<number, PointerEvent<HTMLDivElement>>>(\n new Map()\n );\n const initialPinchStateRef = useRef<{\n distance: number;\n midpoint: Point;\n zoom: number;\n panOffset: Point;\n } | null>(null);\n\n const panToOffset = useCallback(\n (\n offset: Point,\n viewportRef: React.RefObject<HTMLDivElement | null>,\n onComplete?: () => void,\n zoom?: number\n ): void => {\n if (!viewportRef.current) return;\n setIsSceneMoving(true);\n\n // Calculate bounds based on scene and viewport dimensions\n const viewportWidth = viewportRef.current.offsetWidth;\n const viewportHeight = viewportRef.current.offsetHeight;\n\n const minPanX = viewportWidth - sceneWidth * (zoom ?? 1);\n const maxPanX = 0;\n const minPanY = viewportHeight - sceneHeight * (zoom ?? 1);\n const maxPanY = 0;\n\n // Clamp the offset to keep the scene within bounds, shouldn't be needed but still implemented\n const clampedX = Math.min(Math.max(offset.x, minPanX), maxPanX);\n const clampedY = Math.min(Math.max(offset.y, minPanY), maxPanY);\n\n void panToOffsetScene(\n { x: clampedX, y: clampedY },\n x,\n y,\n scale,\n zoom\n ).then(() => {\n setIsSceneMoving(false);\n if (onComplete) onComplete();\n });\n },\n [sceneWidth, sceneHeight, x, y, scale]\n );\n\n // Guarded stop that ignores attempts during intro animations\n const stopAllSceneMotion = useCallback(() => {\n if (isIntroAnimatingRef.current) return; // ignore stops while intro runs\n stopAllMotion(x, y, scale);\n }, [x, y, scale]);\n\n const handlePointerDown = useCallback(\n (event: PointerEvent<HTMLDivElement>): void => {\n if (animationStage < 2) return; // ignore during intro animations\n activePointersRef.current.set(event.pointerId, event);\n (event.target as HTMLElement).setPointerCapture(event.pointerId);\n if (isResetting || isSceneMoving) return;\n stopAllSceneMotion();\n // pan with 1 pointer, pinch with 2 pointers\n if (activePointersRef.current.size === 1) {\n // do not pan from interactive elements\n const targetElement = event.target as HTMLElement;\n if (targetElement.closest(INTERACTIVE_SELECTOR)) {\n activePointersRef.current.delete(event.pointerId);\n (event.target as HTMLElement).releasePointerCapture(event.pointerId);\n return;\n }\n\n setIsPanning(true);\n setPanStartPoint({ x: event.clientX, y: event.clientY });\n setInitialPanOffsetOnDrag({ x: x.get(), y: y.get() });\n if (viewportRef.current) viewportRef.current.style.cursor = \"grabbing\";\n } else if (activePointersRef.current.size === 2) {\n setIsPanning(false);\n const pointers = Array.from(activePointersRef.current.values());\n initialPinchStateRef.current = {\n distance: getDistance(pointers[0]!, pointers[1]!),\n midpoint: getMidpoint(pointers[0]!, pointers[1]!),\n zoom: scale.get(),\n panOffset: { x: x.get(), y: y.get() },\n };\n }\n },\n [\n isResetting,\n isSceneMoving,\n setIsPanning,\n setPanStartPoint,\n setInitialPanOffsetOnDrag,\n x,\n y,\n scale,\n viewportRef,\n animationStage,\n stopAllSceneMotion,\n ]\n );\n\n const handlePointerMove = useCallback(\n (event: PointerEvent<HTMLDivElement>): void => {\n if (animationStage < 2) return;\n if (isPanning || activePointersRef.current.size >= 2) {\n stopAllSceneMotion();\n }\n if (!activePointersRef.current.has(event.pointerId) || isResetting)\n return;\n activePointersRef.current.set(event.pointerId, event);\n\n if (isPanning && activePointersRef.current.size === 1) {\n event.preventDefault();\n const deltaX = event.clientX - panStartPoint.x;\n const deltaY = event.clientY - panStartPoint.y;\n\n // UPDATE to use motion value\n const minPanX = windowWidth - sceneWidth * scale.get();\n const maxPanX = 0;\n const minPanY = windowHeight - sceneHeight * scale.get();\n const maxPanY = 0;\n\n const newX = Math.min(\n Math.max(initialPanOffsetOnDrag.x + deltaX, minPanX),\n maxPanX\n );\n const newY = Math.min(\n Math.max(initialPanOffsetOnDrag.y + deltaY, minPanY),\n maxPanY\n );\n x.set(newX);\n y.set(newY);\n } else if (\n activePointersRef.current.size >= 2 &&\n initialPinchStateRef.current\n ) {\n event.preventDefault();\n const pointers = Array.from(activePointersRef.current.values());\n const p1 = pointers[0]!;\n const p2 = pointers[1]!;\n\n const currentDistance = getDistance(p1, p2);\n const currentMidpoint = getMidpoint(p1, p2);\n\n const {\n distance: initialDistance,\n zoom: initialZoom,\n panOffset: initialPanOffsetPinch,\n } = initialPinchStateRef.current;\n\n if (initialDistance === 0) return;\n\n let newZoom = initialZoom * (currentDistance / initialDistance);\n newZoom = Math.max(\n (window.innerWidth / sceneWidth) * ZOOM_BOUND, // Ensure zoom is at least the width of the canvas\n (window.innerHeight / sceneHeight) * ZOOM_BOUND, // Ensure zoom is at least the height of the canvas\n Math.min(newZoom, 10),\n MIN_ZOOM // Ensure zoom is not less than MIN_ZOOM\n );\n\n const mx = currentMidpoint.x;\n const my = currentMidpoint.y;\n\n const minPanX = windowWidth - sceneWidth * newZoom;\n const maxPanX = 0;\n const minPanY = windowHeight - sceneHeight * newZoom;\n const maxPanY = 0;\n\n let newPanX =\n mx - ((mx - initialPanOffsetPinch.x) / initialZoom) * newZoom;\n let newPanY =\n my - ((my - initialPanOffsetPinch.y) / initialZoom) * newZoom;\n\n // Clamp pan to prevent leaving bounds\n newPanX = Math.min(Math.max(newPanX, minPanX), maxPanX);\n newPanY = Math.min(Math.max(newPanY, minPanY), maxPanY);\n\n scale.set(newZoom);\n x.set(newPanX);\n y.set(newPanY);\n }\n },\n [\n isPanning,\n isResetting,\n x,\n y,\n scale,\n panStartPoint.x,\n panStartPoint.y,\n windowWidth,\n sceneWidth,\n windowHeight,\n sceneHeight,\n initialPanOffsetOnDrag.x,\n initialPanOffsetOnDrag.y,\n MIN_ZOOM,\n animationStage,\n stopAllSceneMotion,\n ]\n );\n\n const handlePointerUpOrCancel = useCallback(\n (event: PointerEvent<HTMLDivElement>): void => {\n if (animationStage < 2) {\n event.preventDefault();\n return; // ignore pointer up during intro\n }\n stopAllSceneMotion();\n event.preventDefault();\n if ((event.target as HTMLElement).hasPointerCapture(event.pointerId)) {\n (event.target as HTMLElement).releasePointerCapture(event.pointerId);\n }\n activePointersRef.current.delete(event.pointerId);\n\n if (isPanning && activePointersRef.current.size < 1) {\n setIsPanning(false);\n if (viewportRef.current)\n viewportRef.current.style.cursor = \"url('/customcursor.svg'), grab\";\n }\n\n if (initialPinchStateRef.current && activePointersRef.current.size < 2) {\n initialPinchStateRef.current = null;\n }\n\n if (\n !isPanning &&\n activePointersRef.current.size === 1 &&\n !initialPinchStateRef.current\n ) {\n const lastPointer = Array.from(activePointersRef.current.values())[0]!;\n setIsPanning(true);\n setPanStartPoint({ x: lastPointer.clientX, y: lastPointer.clientY });\n setInitialPanOffsetOnDrag({ x: x.get(), y: y.get() });\n }\n },\n [x, y, isPanning, animationStage, stopAllSceneMotion]\n );\n\n const handleWheelZoom = useCallback(\n (event: WheelEvent) => {\n if (animationStage < 2) {\n event.preventDefault();\n return; // block wheel interaction during intro animations\n }\n event.preventDefault();\n // pinch gesture on track\n const isPinch = event.ctrlKey || event.metaKey;\n const isMouseWheelZoom =\n event.deltaMode === WheelEvent.DOM_DELTA_LINE ||\n Math.abs(event.deltaY) >= 100;\n\n // mouse wheel zoom and track pad zoom have different sensitivities\n const ZOOM_SENSITIVITY = isMouseWheelZoom\n ? MOUSE_WHEEL_ZOOM_SENSITIVITY\n : TRACKPAD_ZOOM_SENSITIVITY;\n\n if (isPinch) {\n const currentZoom = scale.get();\n const nextZoom = Math.max(\n Math.min(\n currentZoom * (1 - event.deltaY * ZOOM_SENSITIVITY),\n MAX_ZOOM\n ),\n MIN_ZOOM,\n (window.innerWidth / sceneWidth) * ZOOM_BOUND, // Ensure zoom is at least the width of the canvas\n (window.innerHeight / sceneHeight) * ZOOM_BOUND // Ensure zoom is at least the height of the canvas\n );\n\n const rect = viewportRef.current?.getBoundingClientRect();\n\n if (!rect) return;\n\n const vpLeft = rect.left;\n const vpTop = rect.top;\n const viewportWidth = rect.width;\n const viewportHeight = rect.height;\n\n const cursorSceneX = (event.clientX - vpLeft - x.get()) / currentZoom;\n const cursorSceneY = (event.clientY - vpTop - y.get()) / currentZoom;\n\n let newPanX = event.clientX - vpLeft - cursorSceneX * nextZoom;\n let newPanY = event.clientY - vpTop - cursorSceneY * nextZoom;\n\n const minPanX = viewportWidth - sceneWidth * nextZoom;\n const minPanY = viewportHeight - sceneHeight * nextZoom;\n const maxPanX = 0;\n const maxPanY = 0;\n\n newPanX = Math.min(maxPanX, Math.max(minPanX, newPanX));\n newPanY = Math.min(maxPanY, Math.max(minPanY, newPanY));\n\n x.set(newPanX);\n y.set(newPanY);\n scale.set(nextZoom);\n } else {\n stopAllSceneMotion();\n\n const scrollSpeed = 1;\n const newPanX = x.get() - event.deltaX * scrollSpeed;\n const newPanY = y.get() - event.deltaY * scrollSpeed;\n\n const minPanX = windowWidth - sceneWidth * scale.get();\n const maxPanX = 0;\n const minPanY = windowHeight - sceneHeight * scale.get();\n const maxPanY = 0;\n\n const clampedPanX = Math.min(Math.max(newPanX, minPanX), maxPanX);\n const clampedPanY = Math.min(Math.max(newPanY, minPanY), maxPanY);\n\n x.set(clampedPanX);\n y.set(clampedPanY);\n }\n },\n [\n scale,\n MIN_ZOOM,\n x,\n y,\n sceneWidth,\n sceneHeight,\n windowWidth,\n windowHeight,\n animationStage,\n stopAllSceneMotion,\n ]\n );\n\n // Keep the wheel handler ref pointing to the latest implementation\n useEffect(() => {\n wheelHandlerRef.current = handleWheelZoom;\n }, [handleWheelZoom]);\n\n const handlePanToOffset = useCallback(\n (\n offset: { x: number; y: number },\n onComplete?: () => void,\n zoom?: number\n ) => {\n panToOffset(\n {\n x: -offset.x,\n y: -offset.y,\n },\n viewportRef,\n onComplete,\n zoom\n );\n },\n [panToOffset, viewportRef]\n );\n\n return (\n <CanvasWrapper\n introProgress={introProgress}\n onIntroGrowComplete={startStage2}\n skipIntro={skipIntro}\n introContent={introContent}\n loadingText={loadingText}\n introBackgroundGradient={introBackgroundGradient}\n wrapperBackground={wrapperBackground}\n canvasBoxGradient={canvasBoxGradient}\n growTransition={growTransition}\n blurTransition={blurTransition}\n >\n <CanvasProvider\n x={x}\n y={y}\n scale={scale}\n isResetting={isResetting}\n maxZIndex={maxZIndex}\n setMaxZIndex={setMaxZIndex}\n animationStage={animationStage}\n nextTargetSection={nextTargetSection}\n setNextTargetSection={setNextTargetSection}\n >\n {animationStage >= 2 && (\n <>\n {!toolbarConfig?.hidden && (\n <Toolbar\n homeCoordinates={offsetHomeCoordinates}\n config={toolbarConfig}\n />\n )}\n {hasNavbar && navItems && !navbarConfig?.hidden && (\n <Navbar\n panToOffset={handlePanToOffset}\n onReset={onResetViewAndItems}\n items={navItems}\n config={navbarConfig}\n />\n )}\n </>\n )}\n <div\n ref={setViewportRef}\n className=\"relative h-full w-full touch-none select-none overflow-hidden\"\n style={{\n touchAction: \"none\",\n pointerEvents: animationStage >= 2 ? \"auto\" : \"none\",\n overscrollBehavior: \"contain\",\n }}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUpOrCancel}\n onPointerLeave={handlePointerUpOrCancel}\n onPointerCancel={handlePointerUpOrCancel}\n >\n <motion.div\n ref={sceneRef}\n className=\"absolute z-20 origin-top-left\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n transition={{ duration: 0.3, ease: \"easeIn\" }}\n style={{\n width: `${sceneWidth}px`,\n height: `${sceneHeight}px`,\n x,\n y,\n scale,\n willChange:\n mode !== \"high\" && (animationStage < 2 || isPanning)\n ? \"transform\"\n : \"auto\",\n }}\n >\n {/* Canvas Background - customizable or default */}\n {canvasBackground !== undefined ? (\n canvasBackground\n ) : (\n <>\n {animationStage >= 1 && mode === \"high\" ? (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n transition={{ duration: 0.5, ease: \"easeIn\" }}\n >\n <DefaultCanvasBackground />\n </motion.div>\n ) : (\n <DefaultCanvasBackground />\n )}\n </>\n )}\n {children}\n </motion.div>\n </div>\n </CanvasProvider>\n </CanvasWrapper>\n );\n};\n\nexport default Canvas;\n"],"mappings":"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"}
@@ -1,177 +1,111 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { useEffect, useState } from "react";
3
- import { useCanvasContext } from "../../contexts/CanvasContext";
1
+ import { useCanvasContext } from "../../contexts/CanvasContext.js";
2
+ import { IMAGE_FALLBACK_WIDTH_THRESHOLD, VIEWPORT_HYSTERESIS_BUFFER } from "../../lib/constants.js";
3
+ import useWindowDimensions_default from "../../hooks/useWindowDimensions.js";
4
+ import { usePerformanceMode } from "../../hooks/usePerformanceMode.js";
4
5
  import { motion } from "framer-motion";
5
- import useWindowDimensions from "../../hooks/useWindowDimensions";
6
- import { usePerformanceMode } from "../../hooks/usePerformanceMode";
7
- import { VIEWPORT_HYSTERESIS_BUFFER, IMAGE_FALLBACK_WIDTH_THRESHOLD, } from "../../lib/constants";
8
- /**
9
- * Returns true if any portion of the component described by `offset`
10
- * is currently inside the viewport after applying the canvas pan (x,y) and scale.
11
- *
12
- * Coordinate systems:
13
- * - offset.{x,y} are in "scene" coordinates (unscaled canvas space, origin at canvas top-left).
14
- * - (sceneX, sceneY) are the current translated position of the scene's top-left
15
- * in viewport coordinates (these are <= 0; 0 means aligned with the viewport edge).
16
- * - scale uniformly scales scene coordinates about the scene's origin (top-left) AFTER translation.
17
- *
18
- * Mapping a scene-space point (sx, sy) to viewport space:
19
- * vx = sceneX + sx * scale
20
- * vy = sceneY + sy * scale
21
- *
22
- * The component's axis-aligned bounding box in viewport space is:
23
- * left = sceneX + offset.x * scale
24
- * top = sceneY + offset.y * scale
25
- * right = left + offset.width * scale
26
- * bottom = top + offset.height * scale
27
- *
28
- * It intersects the viewport iff it isn't entirely left, right, above, or below it.
29
- *
30
- * Edge handling:
31
- * - Touching an edge counts as visible (>= / <= comparisons).
32
- * - If executed during SSR (no window) and no explicit viewport dimensions are provided,
33
- * it returns true to avoid hydration mismatches.
34
- */
35
- export function isComponentInViewport(params) {
36
- const { offset, sceneX, sceneY, scale, viewportWidth, viewportHeight } = params;
37
- // SSR safe fallback: if we can't know viewport size, assume visible
38
- if (viewportWidth == null || viewportHeight == null) {
39
- if (typeof window === "undefined")
40
- return true;
41
- }
42
- const vpWidth = viewportWidth ?? window.innerWidth;
43
- const vpHeight = viewportHeight ?? window.innerHeight;
44
- // Guard: zero or negative dimensions mean "not visible"
45
- if (offset.width <= 0 || offset.height <= 0 || scale <= 0)
46
- return false;
47
- // Compute viewport-space AABB of the component
48
- const left = sceneX + offset.x * scale;
49
- const top = sceneY + offset.y * scale;
50
- const right = left + offset.width * scale;
51
- const bottom = top + offset.height * scale;
52
- // Fast reject if entirely outside on any side
53
- if (right < 0)
54
- return false; // completely left of viewport
55
- if (left > vpWidth)
56
- return false; // completely right of viewport
57
- if (bottom < 0)
58
- return false; // completely above viewport
59
- if (top > vpHeight)
60
- return false; // completely below viewport
61
- return true; // Some overlap (or touching edge) exists
62
- }
63
- export const CanvasComponent = ({ children, offset, imageFallback, coordinatesToSection = () => null, }) => {
64
- const { x, y, scale, animationStage, nextTargetSection } = useCanvasContext();
65
- const { width } = useWindowDimensions();
66
- const { mode } = usePerformanceMode();
67
- // Subscribe to motion value changes so we re-render while panning/zooming
68
- const [sceneX, setSceneX] = useState(() => x.get());
69
- const [sceneY, setSceneY] = useState(() => y.get());
70
- const [sceneScale, setSceneScale] = useState(() => scale.get());
71
- useEffect(() => {
72
- // rAF-batched subscription updates without pulling state vars into deps
73
- let frame = null;
74
- const next = { x: x.get(), y: y.get(), s: scale.get() };
75
- const flush = () => {
76
- frame = null;
77
- setSceneX(next.x);
78
- setSceneY(next.y);
79
- setSceneScale(next.s);
80
- };
81
- const schedule = () => {
82
- if (frame == null)
83
- frame = requestAnimationFrame(flush);
84
- };
85
- const unSubX = x.on("change", (v) => {
86
- next.x = v;
87
- schedule();
88
- });
89
- const unSubY = y.on("change", (v) => {
90
- next.y = v;
91
- schedule();
92
- });
93
- const unSubScale = scale.on("change", (v) => {
94
- next.s = v;
95
- schedule();
96
- });
97
- return () => {
98
- unSubX();
99
- unSubY();
100
- unSubScale();
101
- if (frame != null)
102
- cancelAnimationFrame(frame);
103
- };
104
- }, [x, y, scale]);
105
- const margin = () => {
106
- if (!offset) {
107
- return { margin: "auto" };
108
- }
109
- const style = {};
110
- if (offset.x != null) {
111
- style.marginLeft = offset.x + "px";
112
- }
113
- else {
114
- style.marginLeft = "auto";
115
- style.marginRight = "auto";
116
- }
117
- if (offset.y != null) {
118
- style.marginTop = offset.y + "px";
119
- }
120
- else {
121
- style.marginTop = "auto";
122
- style.marginBottom = "auto";
123
- }
124
- return style;
125
- };
126
- // --- Hysteresis Visibility ---
127
- // We keep a sticky visibility flag that only turns off when the component moves
128
- // beyond a buffered boundary, and turns on when it re-enters that boundary.
129
- const [visible, setVisible] = useState(true);
130
- useEffect(() => {
131
- if (!offset)
132
- return; // no offset => full screen or auto; keep visible
133
- const vpHeight = typeof window !== "undefined" ? window.innerHeight : 0;
134
- const vpWidth = width;
135
- // raw bounding box in viewport space
136
- const left = sceneX + offset.x * sceneScale;
137
- const top = sceneY + offset.y * sceneScale;
138
- const right = left + offset.width * sceneScale;
139
- const bottom = top + offset.height * sceneScale;
140
- setVisible((prev) => {
141
- if (prev) {
142
- // Only mark invisible if completely outside expanded bounds
143
- const outside = right < -VIEWPORT_HYSTERESIS_BUFFER ||
144
- left > vpWidth + VIEWPORT_HYSTERESIS_BUFFER ||
145
- bottom < -VIEWPORT_HYSTERESIS_BUFFER ||
146
- top > vpHeight + VIEWPORT_HYSTERESIS_BUFFER;
147
- return !outside;
148
- }
149
- else {
150
- // Become visible once we intersect the expanded bounds
151
- const intersects = right >= -VIEWPORT_HYSTERESIS_BUFFER &&
152
- left <= vpWidth + VIEWPORT_HYSTERESIS_BUFFER &&
153
- bottom >= -VIEWPORT_HYSTERESIS_BUFFER &&
154
- top <= vpHeight + VIEWPORT_HYSTERESIS_BUFFER;
155
- return intersects;
156
- }
157
- });
158
- }, [offset, sceneX, sceneY, sceneScale, width]);
159
- // don't show fallback for sufficiently large screens
160
- // because there is a pixel shift that occurs when switching
161
- // from the image to the real component, and on larger screens
162
- // this happens on screen also unlikely to find a weaker
163
- // device on a 1440p+ screen so performance is less of a concern
164
- const shouldShowFallback = animationStage < 2 && imageFallback && width < IMAGE_FALLBACK_WIDTH_THRESHOLD;
165
- return (_jsx("div", { className: "absolute inset-0 z-30 flex", style: {
166
- ...margin(),
167
- width: offset?.width ? offset.width + "px" : "100vw",
168
- height: offset?.height ? offset.height + "px" : "100vh",
169
- }, children: shouldShowFallback ? (_jsx(motion.img, { src: imageFallback, alt: "Canvas Fallback", width: offset?.width ?? 1920, height: offset?.height ?? 1080, className: "m-auto h-auto w-full object-contain" })) : (
170
- // In high mode always render; otherwise render when within visibility OR predicted next target
171
- (mode === "high" ||
172
- visible ||
173
- (nextTargetSection &&
174
- coordinatesToSection(offset) === nextTargetSection)) &&
175
- children) }));
6
+ import { useEffect, useState } from "react";
7
+ import { jsx } from "react/jsx-runtime";
8
+
9
+ //#region src/components/canvas/component.tsx
10
+ const CanvasComponent = ({ children, offset, imageFallback, coordinatesToSection = () => null }) => {
11
+ const { x, y, scale, animationStage, nextTargetSection } = useCanvasContext();
12
+ const { width } = useWindowDimensions_default();
13
+ const { mode } = usePerformanceMode();
14
+ const [sceneX, setSceneX] = useState(() => x.get());
15
+ const [sceneY, setSceneY] = useState(() => y.get());
16
+ const [sceneScale, setSceneScale] = useState(() => scale.get());
17
+ useEffect(() => {
18
+ let frame = null;
19
+ const next = {
20
+ x: x.get(),
21
+ y: y.get(),
22
+ s: scale.get()
23
+ };
24
+ const flush = () => {
25
+ frame = null;
26
+ setSceneX(next.x);
27
+ setSceneY(next.y);
28
+ setSceneScale(next.s);
29
+ };
30
+ const schedule = () => {
31
+ if (frame == null) frame = requestAnimationFrame(flush);
32
+ };
33
+ const unSubX = x.on("change", (v) => {
34
+ next.x = v;
35
+ schedule();
36
+ });
37
+ const unSubY = y.on("change", (v) => {
38
+ next.y = v;
39
+ schedule();
40
+ });
41
+ const unSubScale = scale.on("change", (v) => {
42
+ next.s = v;
43
+ schedule();
44
+ });
45
+ return () => {
46
+ unSubX();
47
+ unSubY();
48
+ unSubScale();
49
+ if (frame != null) cancelAnimationFrame(frame);
50
+ };
51
+ }, [
52
+ x,
53
+ y,
54
+ scale
55
+ ]);
56
+ const margin = () => {
57
+ if (!offset) return { margin: "auto" };
58
+ const style = {};
59
+ if (offset.x != null) style.marginLeft = offset.x + "px";
60
+ else {
61
+ style.marginLeft = "auto";
62
+ style.marginRight = "auto";
63
+ }
64
+ if (offset.y != null) style.marginTop = offset.y + "px";
65
+ else {
66
+ style.marginTop = "auto";
67
+ style.marginBottom = "auto";
68
+ }
69
+ return style;
70
+ };
71
+ const [visible, setVisible] = useState(true);
72
+ useEffect(() => {
73
+ if (!offset) return;
74
+ const vpHeight = typeof window !== "undefined" ? window.innerHeight : 0;
75
+ const vpWidth = width;
76
+ const left = sceneX + offset.x * sceneScale;
77
+ const top = sceneY + offset.y * sceneScale;
78
+ const right = left + offset.width * sceneScale;
79
+ const bottom = top + offset.height * sceneScale;
80
+ setVisible((prev) => {
81
+ if (prev) return !(right < -VIEWPORT_HYSTERESIS_BUFFER || left > vpWidth + VIEWPORT_HYSTERESIS_BUFFER || bottom < -VIEWPORT_HYSTERESIS_BUFFER || top > vpHeight + VIEWPORT_HYSTERESIS_BUFFER);
82
+ else return right >= -VIEWPORT_HYSTERESIS_BUFFER && left <= vpWidth + VIEWPORT_HYSTERESIS_BUFFER && bottom >= -VIEWPORT_HYSTERESIS_BUFFER && top <= vpHeight + VIEWPORT_HYSTERESIS_BUFFER;
83
+ });
84
+ }, [
85
+ offset,
86
+ sceneX,
87
+ sceneY,
88
+ sceneScale,
89
+ width
90
+ ]);
91
+ const shouldShowFallback = animationStage < 2 && imageFallback && width < IMAGE_FALLBACK_WIDTH_THRESHOLD;
92
+ return /* @__PURE__ */ jsx("div", {
93
+ className: "absolute inset-0 z-30 flex",
94
+ style: {
95
+ ...margin(),
96
+ width: offset?.width ? offset.width + "px" : "100vw",
97
+ height: offset?.height ? offset.height + "px" : "100vh"
98
+ },
99
+ children: shouldShowFallback ? /* @__PURE__ */ jsx(motion.img, {
100
+ src: imageFallback,
101
+ alt: "Canvas Fallback",
102
+ width: offset?.width ?? 1920,
103
+ height: offset?.height ?? 1080,
104
+ className: "m-auto h-auto w-full object-contain"
105
+ }) : (mode === "high" || visible || nextTargetSection && coordinatesToSection(offset) === nextTargetSection) && children
106
+ });
176
107
  };
108
+
109
+ //#endregion
110
+ export { CanvasComponent };
177
111
  //# sourceMappingURL=component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"component.js","sourceRoot":"","sources":["../../../src/components/canvas/component.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"component.js","names":["useWindowDimensions"],"sources":["../../../src/components/canvas/component.tsx"],"sourcesContent":["import { type FC, useEffect, useState } from \"react\";\nimport type { SectionCoordinates } from \"../../types\";\nimport { useCanvasContext } from \"../../contexts/CanvasContext\";\nimport { motion } from \"framer-motion\";\nimport useWindowDimensions from \"../../hooks/useWindowDimensions\";\nimport { usePerformanceMode } from \"../../hooks/usePerformanceMode\";\nimport {\n VIEWPORT_HYSTERESIS_BUFFER,\n IMAGE_FALLBACK_WIDTH_THRESHOLD,\n} from \"../../lib/constants\";\n\ninterface CanvasProps {\n children: React.ReactNode;\n offset?: SectionCoordinates;\n optimize?: boolean;\n // used for initial load on smaller screens in the mini-canvas\n // shows a static image instead of rendering the component because it's more performant\n imageFallback?: string;\n // App must provide function to map coordinates to section\n coordinatesToSection?: (coords: SectionCoordinates | undefined) => string | null;\n}\n\n/**\n * Returns true if any portion of the component described by `offset`\n * is currently inside the viewport after applying the canvas pan (x,y) and scale.\n *\n * Coordinate systems:\n * - offset.{x,y} are in \"scene\" coordinates (unscaled canvas space, origin at canvas top-left).\n * - (sceneX, sceneY) are the current translated position of the scene's top-left\n * in viewport coordinates (these are <= 0; 0 means aligned with the viewport edge).\n * - scale uniformly scales scene coordinates about the scene's origin (top-left) AFTER translation.\n *\n * Mapping a scene-space point (sx, sy) to viewport space:\n * vx = sceneX + sx * scale\n * vy = sceneY + sy * scale\n *\n * The component's axis-aligned bounding box in viewport space is:\n * left = sceneX + offset.x * scale\n * top = sceneY + offset.y * scale\n * right = left + offset.width * scale\n * bottom = top + offset.height * scale\n *\n * It intersects the viewport iff it isn't entirely left, right, above, or below it.\n *\n * Edge handling:\n * - Touching an edge counts as visible (>= / <= comparisons).\n * - If executed during SSR (no window) and no explicit viewport dimensions are provided,\n * it returns true to avoid hydration mismatches.\n */\nexport function isComponentInViewport(params: {\n offset: SectionCoordinates;\n sceneX: number; // current x motion value (.get())\n sceneY: number; // current y motion value (.get())\n scale: number; // current scale motion value (.get())\n viewportWidth?: number; // optional explicit viewport width\n viewportHeight?: number; // optional explicit viewport height\n}): boolean {\n const { offset, sceneX, sceneY, scale, viewportWidth, viewportHeight } =\n params;\n\n // SSR safe fallback: if we can't know viewport size, assume visible\n if (viewportWidth == null || viewportHeight == null) {\n if (typeof window === \"undefined\") return true;\n }\n const vpWidth = viewportWidth ?? window.innerWidth;\n const vpHeight = viewportHeight ?? window.innerHeight;\n\n // Guard: zero or negative dimensions mean \"not visible\"\n if (offset.width <= 0 || offset.height <= 0 || scale <= 0) return false;\n\n // Compute viewport-space AABB of the component\n const left = sceneX + offset.x * scale;\n const top = sceneY + offset.y * scale;\n const right = left + offset.width * scale;\n const bottom = top + offset.height * scale;\n\n // Fast reject if entirely outside on any side\n if (right < 0) return false; // completely left of viewport\n if (left > vpWidth) return false; // completely right of viewport\n if (bottom < 0) return false; // completely above viewport\n if (top > vpHeight) return false; // completely below viewport\n\n return true; // Some overlap (or touching edge) exists\n}\n\nexport const CanvasComponent: FC<CanvasProps> = ({\n children,\n offset,\n imageFallback,\n coordinatesToSection = () => null,\n}) => {\n const { x, y, scale, animationStage, nextTargetSection } = useCanvasContext();\n const { width } = useWindowDimensions();\n const { mode } = usePerformanceMode();\n\n // Subscribe to motion value changes so we re-render while panning/zooming\n const [sceneX, setSceneX] = useState(() => x.get());\n const [sceneY, setSceneY] = useState(() => y.get());\n const [sceneScale, setSceneScale] = useState(() => scale.get());\n\n useEffect(() => {\n // rAF-batched subscription updates without pulling state vars into deps\n let frame: number | null = null;\n const next = { x: x.get(), y: y.get(), s: scale.get() };\n\n const flush = () => {\n frame = null;\n setSceneX(next.x);\n setSceneY(next.y);\n setSceneScale(next.s);\n };\n const schedule = () => {\n if (frame == null) frame = requestAnimationFrame(flush);\n };\n const unSubX = x.on(\"change\", (v) => {\n next.x = v;\n schedule();\n });\n const unSubY = y.on(\"change\", (v) => {\n next.y = v;\n schedule();\n });\n const unSubScale = scale.on(\"change\", (v) => {\n next.s = v;\n schedule();\n });\n return () => {\n unSubX();\n unSubY();\n unSubScale();\n if (frame != null) cancelAnimationFrame(frame);\n };\n }, [x, y, scale]);\n\n const margin = () => {\n if (!offset) {\n return { margin: \"auto\" };\n }\n\n const style: React.CSSProperties = {};\n\n if (offset.x != null) {\n style.marginLeft = offset.x + \"px\";\n } else {\n style.marginLeft = \"auto\";\n style.marginRight = \"auto\";\n }\n\n if (offset.y != null) {\n style.marginTop = offset.y + \"px\";\n } else {\n style.marginTop = \"auto\";\n style.marginBottom = \"auto\";\n }\n\n return style;\n };\n\n // --- Hysteresis Visibility ---\n // We keep a sticky visibility flag that only turns off when the component moves\n // beyond a buffered boundary, and turns on when it re-enters that boundary.\n const [visible, setVisible] = useState(true);\n\n useEffect(() => {\n if (!offset) return; // no offset => full screen or auto; keep visible\n const vpHeight = typeof window !== \"undefined\" ? window.innerHeight : 0;\n const vpWidth = width;\n // raw bounding box in viewport space\n const left = sceneX + offset.x * sceneScale;\n const top = sceneY + offset.y * sceneScale;\n const right = left + offset.width * sceneScale;\n const bottom = top + offset.height * sceneScale;\n\n setVisible((prev) => {\n if (prev) {\n // Only mark invisible if completely outside expanded bounds\n const outside =\n right < -VIEWPORT_HYSTERESIS_BUFFER ||\n left > vpWidth + VIEWPORT_HYSTERESIS_BUFFER ||\n bottom < -VIEWPORT_HYSTERESIS_BUFFER ||\n top > vpHeight + VIEWPORT_HYSTERESIS_BUFFER;\n return !outside;\n } else {\n // Become visible once we intersect the expanded bounds\n const intersects =\n right >= -VIEWPORT_HYSTERESIS_BUFFER &&\n left <= vpWidth + VIEWPORT_HYSTERESIS_BUFFER &&\n bottom >= -VIEWPORT_HYSTERESIS_BUFFER &&\n top <= vpHeight + VIEWPORT_HYSTERESIS_BUFFER;\n return intersects;\n }\n });\n }, [offset, sceneX, sceneY, sceneScale, width]);\n\n // don't show fallback for sufficiently large screens\n // because there is a pixel shift that occurs when switching\n // from the image to the real component, and on larger screens\n // this happens on screen also unlikely to find a weaker\n // device on a 1440p+ screen so performance is less of a concern\n const shouldShowFallback =\n animationStage < 2 && imageFallback && width < IMAGE_FALLBACK_WIDTH_THRESHOLD;\n\n return (\n <div\n className=\"absolute inset-0 z-30 flex\"\n style={{\n ...margin(),\n width: offset?.width ? offset.width + \"px\" : \"100vw\",\n height: offset?.height ? offset.height + \"px\" : \"100vh\",\n }}\n >\n {shouldShowFallback ? (\n <motion.img\n src={imageFallback}\n alt=\"Canvas Fallback\"\n width={offset?.width ?? 1920}\n height={offset?.height ?? 1080}\n className=\"m-auto h-auto w-full object-contain\"\n />\n ) : (\n // In high mode always render; otherwise render when within visibility OR predicted next target\n (mode === \"high\" ||\n visible ||\n (nextTargetSection &&\n coordinatesToSection(offset) === nextTargetSection)) &&\n children\n )}\n </div>\n );\n};\n"],"mappings":";;;;;;;;;AAqFA,MAAa,mBAAoC,EAC/C,UACA,QACA,eACA,6BAA6B,WACzB;CACJ,MAAM,EAAE,GAAG,GAAG,OAAO,gBAAgB,sBAAsB,kBAAkB;CAC7E,MAAM,EAAE,UAAUA,6BAAqB;CACvC,MAAM,EAAE,SAAS,oBAAoB;CAGrC,MAAM,CAAC,QAAQ,aAAa,eAAe,EAAE,KAAK,CAAC;CACnD,MAAM,CAAC,QAAQ,aAAa,eAAe,EAAE,KAAK,CAAC;CACnD,MAAM,CAAC,YAAY,iBAAiB,eAAe,MAAM,KAAK,CAAC;AAE/D,iBAAgB;EAEd,IAAI,QAAuB;EAC3B,MAAM,OAAO;GAAE,GAAG,EAAE,KAAK;GAAE,GAAG,EAAE,KAAK;GAAE,GAAG,MAAM,KAAK;GAAE;EAEvD,MAAM,cAAc;AAClB,WAAQ;AACR,aAAU,KAAK,EAAE;AACjB,aAAU,KAAK,EAAE;AACjB,iBAAc,KAAK,EAAE;;EAEvB,MAAM,iBAAiB;AACrB,OAAI,SAAS,KAAM,SAAQ,sBAAsB,MAAM;;EAEzD,MAAM,SAAS,EAAE,GAAG,WAAW,MAAM;AACnC,QAAK,IAAI;AACT,aAAU;IACV;EACF,MAAM,SAAS,EAAE,GAAG,WAAW,MAAM;AACnC,QAAK,IAAI;AACT,aAAU;IACV;EACF,MAAM,aAAa,MAAM,GAAG,WAAW,MAAM;AAC3C,QAAK,IAAI;AACT,aAAU;IACV;AACF,eAAa;AACX,WAAQ;AACR,WAAQ;AACR,eAAY;AACZ,OAAI,SAAS,KAAM,sBAAqB,MAAM;;IAE/C;EAAC;EAAG;EAAG;EAAM,CAAC;CAEjB,MAAM,eAAe;AACnB,MAAI,CAAC,OACH,QAAO,EAAE,QAAQ,QAAQ;EAG3B,MAAM,QAA6B,EAAE;AAErC,MAAI,OAAO,KAAK,KACd,OAAM,aAAa,OAAO,IAAI;OACzB;AACL,SAAM,aAAa;AACnB,SAAM,cAAc;;AAGtB,MAAI,OAAO,KAAK,KACd,OAAM,YAAY,OAAO,IAAI;OACxB;AACL,SAAM,YAAY;AAClB,SAAM,eAAe;;AAGvB,SAAO;;CAMT,MAAM,CAAC,SAAS,cAAc,SAAS,KAAK;AAE5C,iBAAgB;AACd,MAAI,CAAC,OAAQ;EACb,MAAM,WAAW,OAAO,WAAW,cAAc,OAAO,cAAc;EACtE,MAAM,UAAU;EAEhB,MAAM,OAAO,SAAS,OAAO,IAAI;EACjC,MAAM,MAAM,SAAS,OAAO,IAAI;EAChC,MAAM,QAAQ,OAAO,OAAO,QAAQ;EACpC,MAAM,SAAS,MAAM,OAAO,SAAS;AAErC,cAAY,SAAS;AACnB,OAAI,KAOF,QAAO,EAJL,QAAQ,CAAC,8BACT,OAAO,UAAU,8BACjB,SAAS,CAAC,8BACV,MAAM,WAAW;OASnB,QAJE,SAAS,CAAC,8BACV,QAAQ,UAAU,8BAClB,UAAU,CAAC,8BACX,OAAO,WAAW;IAGtB;IACD;EAAC;EAAQ;EAAQ;EAAQ;EAAY;EAAM,CAAC;CAO/C,MAAM,qBACJ,iBAAiB,KAAK,iBAAiB,QAAQ;AAEjD,QACE,oBAAC;EACC,WAAU;EACV,OAAO;GACL,GAAG,QAAQ;GACX,OAAO,QAAQ,QAAQ,OAAO,QAAQ,OAAO;GAC7C,QAAQ,QAAQ,SAAS,OAAO,SAAS,OAAO;GACjD;YAEA,qBACC,oBAAC,OAAO;GACN,KAAK;GACL,KAAI;GACJ,OAAO,QAAQ,SAAS;GACxB,QAAQ,QAAQ,UAAU;GAC1B,WAAU;IACV,IAGD,SAAS,UACR,WACC,qBACC,qBAAqB,OAAO,KAAK,sBACrC;GAEE"}