@sth87/shadcn-design-system 0.0.10 → 0.0.11
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/cjs/components/Interactive/CursorFollow.cjs +1 -1
- package/dist/cjs/components/Interactive/CursorFollow.cjs.map +1 -1
- package/dist/cjs/components/Toast/Toast.cjs.map +1 -1
- package/dist/cjs/components/Tour/Tour.cjs.map +1 -1
- package/dist/cjs/lib/TextAnimation/GradientText.cjs.map +1 -1
- package/dist/cjs/styles/index.css +1 -1
- package/dist/esm/components/Interactive/CursorFollow.js +2 -2
- package/dist/esm/components/Interactive/CursorFollow.js.map +1 -1
- package/dist/esm/components/Toast/Toast.js.map +1 -1
- package/dist/esm/components/Tour/Tour.js.map +1 -1
- package/dist/esm/lib/TextAnimation/GradientText.js.map +1 -1
- package/dist/esm/styles/index.css +1 -1
- package/dist/types/components/Accordion/Accordion.d.ts +1 -1
- package/dist/types/components/Avatar/Avatar.d.ts +1 -1
- package/dist/types/components/Badge/Badge.d.ts +1 -1
- package/dist/types/components/Button/Button.d.ts +1 -1
- package/dist/types/components/Button/ButtonGroup.d.ts +1 -1
- package/dist/types/components/Calendar/Calendar.d.ts +1 -1
- package/dist/types/components/Checkbox/Checkbox.d.ts +1 -1
- package/dist/types/components/Collapsible/Collapsible.d.ts +1 -1
- package/dist/types/components/Command/index.d.ts +1 -1
- package/dist/types/components/ContextMenu/index.d.ts +1 -1
- package/dist/types/components/DatePicker/DatePicker.d.ts +1 -1
- package/dist/types/components/DatePicker/RangePicker.d.ts +1 -1
- package/dist/types/components/DropdownMenu/index.d.ts +1 -1
- package/dist/types/components/InputOTP/InputOTP.d.ts +1 -1
- package/dist/types/components/Interactive/CursorFollow.d.ts +1 -1
- package/dist/types/components/Interactive/CursorFollow.d.ts.map +1 -1
- package/dist/types/components/Label/Label.d.ts +1 -1
- package/dist/types/components/Pagination/Pagination.d.ts +1 -1
- package/dist/types/components/Radio/Radio.d.ts +1 -1
- package/dist/types/components/Resizable/Resizable.d.ts +1 -1
- package/dist/types/components/ScrollArea/ScrollArea.d.ts +1 -1
- package/dist/types/components/Select/Select.d.ts +1 -1
- package/dist/types/components/Separator/Separator.d.ts +1 -1
- package/dist/types/components/Sheet/Sheet.d.ts +2 -2
- package/dist/types/components/Sidebar/Sidebar.d.ts +1 -1
- package/dist/types/components/Sidebar/index.d.ts +1 -1
- package/dist/types/components/Skeleton/Skeleton.d.ts +1 -1
- package/dist/types/components/Switch/Switch.d.ts +1 -1
- package/dist/types/components/Textarea/Textarea.d.ts +1 -1
- package/dist/types/components/Toast/Toast.d.ts +2 -9
- package/dist/types/components/Toast/Toast.d.ts.map +1 -1
- package/dist/types/components/Toggle/Toggle.d.ts +1 -1
- package/dist/types/components/Tooltip/Tooltip.d.ts +1 -1
- package/dist/types/components/TreeSelect/TreeSelect.d.ts +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/lib/utils.d.ts +1 -1
- package/dist/types/packages/ui/src/components/button-group.d.ts +1 -1
- package/dist/types/packages/ui/src/components/calendar.d.ts +1 -1
- package/dist/types/packages/ui/src/components/command.d.ts +1 -1
- package/dist/types/packages/ui/src/components/pagination.d.ts +1 -1
- package/dist/types/packages/ui/src/components/sidebar.d.ts +4 -4
- package/package.json +2 -2
- package/dist/types/tsconfig.json +0 -13
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const u=require("react/jsx-runtime"),I=require("react"),h=require("motion/react");require("@radix-ui/react-slot");require("../../packages/ui/src/components/button.cjs");require("../../packages/ui/src/components/button-group.cjs");require("../../packages/ui/src/components/input.cjs");require("../../packages/ui/src/components/textarea.cjs");require("@radix-ui/react-label");const P=require("../../packages/ui/src/lib/utils.cjs");require("../../packages/ui/src/components/select.cjs");require("../../packages/ui/src/components/combobox.cjs");require("@radix-ui/react-tooltip");require("lucide-react");require("react-day-picker");require("../../packages/ui/src/components/popover.cjs");require("@radix-ui/react-separator");require("../../packages/ui/src/components/switch.cjs");require("vaul");require("@radix-ui/react-scroll-area");require("../../packages/ui/src/components/tree-view.cjs");require("@radix-ui/react-alert-dialog");require("@radix-ui/react-avatar");require("../../packages/ui/src/components/badge.cjs");require("../../packages/ui/src/components/checkbox.cjs");require("@radix-ui/react-collapsible");require("cmdk");require("@radix-ui/react-dialog");require("@radix-ui/react-dropdown-menu");require("../../packages/ui/src/components/input-otp.cjs");require("../../packages/ui/src/components/radio-group.cjs");require("../../packages/ui/src/components/sidebar.cjs");require("@radix-ui/react-slider");require("../../packages/ui/src/components/tabs.cjs");require("../../packages/ui/src/components/toggle.cjs");function H(o){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(o){for(const n in o)if(n!=="default"){const i=Object.getOwnPropertyDescriptor(o,n);Object.defineProperty(e,n,i.get?i:{enumerable:!0,get:()=>o[n]})}}return e.default=o,Object.freeze(e)}const t=H(I),k={slow:{stiffness:100,damping:20,bounce:0},normal:{stiffness:500,damping:50,bounce:0},fast:{stiffness:1e3,damping:80,bounce:0},realtime:{stiffness:2e3,damping:100,bounce:0}},M=t.createContext(void 0),N=()=>{const o=t.useContext(M);if(!o)throw new Error("useCursor must be used within a CursorProvider");return o},F={default:null,pointer:u.jsx("div",{className:"h-5 w-5 rounded-full bg-white/30 border-2 border-white"})};function V({ref:o,children:e,cursorType:n="default",followText:i,showFollow:b,followAlign:q="bottom-right",followSideOffset:c=15,followTransition:y="normal",...R}){const[x,v]=t.useState({x:0,y:0}),[a,C]=t.useState(!1),r=t.useRef(null),p=t.useRef(null);t.useImperativeHandle(o,()=>r.current),t.useEffect(()=>{if(!r.current)return;const f=r.current.parentElement;if(!f)return;getComputedStyle(f).position==="static"&&(f.style.position="relative");const w=g=>{const m=f.getBoundingClientRect();v({x:g.clientX-m.left,y:g.clientY-m.top}),C(!0)},S=()=>C(!1);return f.addEventListener("mousemove",w),f.addEventListener("mouseleave",S),()=>{f.removeEventListener("mousemove",w),f.removeEventListener("mouseleave",S)}},[]);const l=n!==void 0,j=b??i!==void 0,s=k[y];return u.jsx(M.Provider,{value:{cursorPos:x,isActive:a,containerRef:r,cursorRef:p},children:u.jsxs("div",{ref:r,"data-slot":"cursor-provider",...R,children:[e,l&&u.jsx(A,{cursorType:n}),j&&u.jsx(L,{followText:i,align:q,sideOffset:c,transition:s})]})})}function A({ref:o,children:e,cursorType:n="default",className:i,style:b,...q}){const{cursorPos:c,isActive:y,containerRef:R,cursorRef:x}=N();t.useImperativeHandle(o,()=>x.current);const v=h.useMotionValue(0),a=h.useMotionValue(0),r=e||(typeof n=="string"&&n in F?F[n]:n),p=r!==null;return t.useEffect(()=>{const l=R.current?.parentElement;return l&&y&&p&&(l.style.cursor="none"),()=>{l&&(l.style.cursor="default")}},[R,y,p]),t.useEffect(()=>{v.set(c.x),a.set(c.y)},[c,v,a]),r?u.jsx(h.AnimatePresence,{children:y&&u.jsx(h.motion.div,{ref:x,"data-slot":"cursor",className:P.cn("transform-[translate(-50%,-50%)] pointer-events-none z-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const u=require("react/jsx-runtime"),I=require("react"),h=require("motion/react");require("@radix-ui/react-slot");require("../../packages/ui/src/components/button.cjs");require("../../packages/ui/src/components/button-group.cjs");require("../../packages/ui/src/components/input.cjs");require("../../packages/ui/src/components/textarea.cjs");require("@radix-ui/react-label");const P=require("../../packages/ui/src/lib/utils.cjs");require("../../packages/ui/src/components/select.cjs");require("../../packages/ui/src/components/combobox.cjs");require("@radix-ui/react-tooltip");require("lucide-react");require("react-day-picker");require("../../packages/ui/src/components/popover.cjs");require("@radix-ui/react-separator");require("../../packages/ui/src/components/switch.cjs");require("vaul");require("@radix-ui/react-scroll-area");require("../../packages/ui/src/components/tree-view.cjs");require("@radix-ui/react-alert-dialog");require("@radix-ui/react-avatar");require("../../packages/ui/src/components/badge.cjs");require("../../packages/ui/src/components/checkbox.cjs");require("@radix-ui/react-collapsible");require("cmdk");require("@radix-ui/react-dialog");require("@radix-ui/react-dropdown-menu");require("../../packages/ui/src/components/input-otp.cjs");require("../../packages/ui/src/components/radio-group.cjs");require("../../packages/ui/src/components/sidebar.cjs");require("@radix-ui/react-slider");require("../../packages/ui/src/components/tabs.cjs");require("../../packages/ui/src/components/toggle.cjs");function H(o){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(o){for(const n in o)if(n!=="default"){const i=Object.getOwnPropertyDescriptor(o,n);Object.defineProperty(e,n,i.get?i:{enumerable:!0,get:()=>o[n]})}}return e.default=o,Object.freeze(e)}const t=H(I),k={slow:{stiffness:100,damping:20,bounce:0},normal:{stiffness:500,damping:50,bounce:0},fast:{stiffness:1e3,damping:80,bounce:0},realtime:{stiffness:2e3,damping:100,bounce:0}},M=t.createContext(void 0),N=()=>{const o=t.useContext(M);if(!o)throw new Error("useCursor must be used within a CursorProvider");return o},F={default:null,pointer:u.jsx("div",{className:"h-5 w-5 rounded-full bg-white/30 border-2 border-white"})};function V({ref:o,children:e,cursorType:n="default",followText:i,showFollow:b,followAlign:q="bottom-right",followSideOffset:c=15,followTransition:y="normal",...R}){const[x,v]=t.useState({x:0,y:0}),[a,C]=t.useState(!1),r=t.useRef(null),p=t.useRef(null);t.useImperativeHandle(o,()=>r.current),t.useEffect(()=>{if(!r.current)return;const f=r.current.parentElement;if(!f)return;getComputedStyle(f).position==="static"&&(f.style.position="relative");const w=g=>{const m=f.getBoundingClientRect();v({x:g.clientX-m.left,y:g.clientY-m.top}),C(!0)},S=()=>C(!1);return f.addEventListener("mousemove",w),f.addEventListener("mouseleave",S),()=>{f.removeEventListener("mousemove",w),f.removeEventListener("mouseleave",S)}},[]);const l=n!==void 0,j=b??i!==void 0,s=k[y];return u.jsx(M.Provider,{value:{cursorPos:x,isActive:a,containerRef:r,cursorRef:p},children:u.jsxs("div",{ref:r,"data-slot":"cursor-provider",...R,children:[e,l&&u.jsx(A,{cursorType:n}),j&&u.jsx(L,{followText:i,align:q,sideOffset:c,transition:s})]})})}function A({ref:o,children:e,cursorType:n="default",className:i,style:b,...q}){const{cursorPos:c,isActive:y,containerRef:R,cursorRef:x}=N();t.useImperativeHandle(o,()=>x.current);const v=h.useMotionValue(0),a=h.useMotionValue(0),r=e||(typeof n=="string"&&n in F?F[n]:n),p=r!==null;return t.useEffect(()=>{const l=R.current?.parentElement;return l&&y&&p&&(l.style.cursor="none"),()=>{l&&(l.style.cursor="default")}},[R,y,p]),t.useEffect(()=>{v.set(c.x),a.set(c.y)},[c,v,a]),r?u.jsx(h.AnimatePresence,{children:y&&u.jsx(h.motion.div,{ref:x,"data-slot":"cursor",className:P.cn("transform-[translate(-50%,-50%)] pointer-events-none z-9999 absolute",i),style:{top:a,left:v,...b},initial:{scale:0,opacity:0},animate:{scale:1,opacity:1},exit:{scale:0,opacity:0},...q,children:r})}):null}function L({ref:o,sideOffset:e=15,align:n="bottom-right",children:i,className:b,style:q,followText:c,transition:y,transitionPreset:R="normal",...x}){const{cursorPos:v,isActive:a,cursorRef:C}=N(),r=t.useRef(null);t.useImperativeHandle(o,()=>r.current);const p=h.useMotionValue(0),l=h.useMotionValue(0),j=y||k[R],s=h.useSpring(p,j),f=h.useSpring(l,j),w=t.useCallback(()=>{const g=r.current?.getBoundingClientRect(),m=g?.width??0,E=g?.height??0;let d;switch(n){case"center":d={x:m/2,y:E/2};break;case"top":d={x:m/2,y:E+e};break;case"top-left":d={x:m+e,y:E+e};break;case"top-right":d={x:-e,y:E+e};break;case"bottom":d={x:m/2,y:-e};break;case"bottom-left":d={x:m+e,y:-e};break;case"bottom-right":d={x:-e,y:-e};break;case"left":d={x:m+e,y:E/2};break;case"right":d={x:-e,y:E/2};break;default:d={x:0,y:0}}return d},[n,e]);t.useEffect(()=>{const g=w(),m=C.current?.getBoundingClientRect(),E=m?.width??20,d=m?.height??20;p.set(v.x-g.x+E/2),l.set(v.y-g.y+d/2)},[w,v,C,p,l]);const S=()=>i||(c?typeof c=="string"?u.jsx("div",{className:"px-4 py-2 bg-white rounded-md shadow-lg text-sm font-medium",children:c}):c:null);return u.jsx(h.AnimatePresence,{children:a&&u.jsx(h.motion.div,{ref:r,"data-slot":"cursor-follow",className:P.cn("transform-[translate(-50%,-50%)] pointer-events-none z-9998 absolute",b),style:{top:f,left:s,...q},initial:{scale:0,opacity:0},animate:{scale:1,opacity:1},exit:{scale:0,opacity:0},...x,children:S()})})}function _(o={}){const{cursorType:e="default",followText:n,showFollow:i,align:b="bottom-right",sideOffset:q=15,transitionPreset:c="normal",className:y,style:R}=o,[x,v]=t.useState({x:0,y:0}),[a,C]=t.useState(!1),r=t.useRef(null),p=t.useRef(null);t.useEffect(()=>{if(!r.current)return;const s=r.current;getComputedStyle(s).position==="static"&&(s.style.position="relative");const f=S=>{const g=s.getBoundingClientRect();v({x:S.clientX-g.left,y:S.clientY-g.top}),C(!0)},w=()=>C(!1);return s.addEventListener("mousemove",f),s.addEventListener("mouseleave",w),()=>{s.removeEventListener("mousemove",f),s.removeEventListener("mouseleave",w)}},[]);const l=e!=="default";t.useEffect(()=>{if(!r.current||!a||!l)return;const s=r.current;return s.style.cursor="none",()=>{s.style.cursor="default"}},[a,l]);const j=t.useCallback(()=>a?u.jsxs(M.Provider,{value:{cursorPos:x,isActive:a,containerRef:r,cursorRef:p},children:[u.jsx(A,{cursorType:e}),(i??n!==void 0)&&u.jsx(L,{followText:n,align:b,sideOffset:q,transitionPreset:c})]}):null,[a,x,e,n,i,b,q,c]);return{ref:r,className:P.cn("relative",y),style:{...R},"data-cursor-container":!0,children:s=>u.jsxs(u.Fragment,{children:[s,j()]})}}exports.Cursor=A;exports.CursorFollow=L;exports.CursorProvider=V;exports.TRANSITION_PRESETS=k;exports.useCursor=N;exports.useCursorFollow=_;
|
|
2
2
|
//# sourceMappingURL=CursorFollow.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CursorFollow.cjs","sources":["../../../../src/components/Interactive/CursorFollow.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n motion,\n useMotionValue,\n useSpring,\n AnimatePresence,\n type HTMLMotionProps,\n type SpringOptions,\n} from \"motion/react\";\n\nimport { cn } from \"@dsui/ui/index\";\n\n// Transition presets\ntype TransitionPreset = \"slow\" | \"normal\" | \"fast\" | \"realtime\";\n\nconst TRANSITION_PRESETS: Record<TransitionPreset, SpringOptions> = {\n slow: { stiffness: 100, damping: 20, bounce: 0 },\n normal: { stiffness: 500, damping: 50, bounce: 0 },\n fast: { stiffness: 1000, damping: 80, bounce: 0 },\n realtime: { stiffness: 2000, damping: 100, bounce: 0 },\n};\n\ntype CursorContextType = {\n cursorPos: { x: number; y: number };\n isActive: boolean;\n containerRef: React.RefObject<HTMLDivElement | null>;\n cursorRef: React.RefObject<HTMLDivElement | null>;\n};\n\nconst CursorContext = React.createContext<CursorContextType | undefined>(\n undefined\n);\n\nconst useCursor = (): CursorContextType => {\n const context = React.useContext(CursorContext);\n if (!context) {\n throw new Error(\"useCursor must be used within a CursorProvider\");\n }\n return context;\n};\n\ntype Align =\n | \"top\"\n | \"top-left\"\n | \"top-right\"\n | \"bottom\"\n | \"bottom-left\"\n | \"bottom-right\"\n | \"left\"\n | \"right\"\n | \"center\";\n\ntype CursorVariantKey = \"default\" | \"pointer\";\ntype CursorVariant = CursorVariantKey | React.ReactNode;\n\n// Predefined cursor variants\nconst cursorVariants: Record<CursorVariantKey, React.ReactNode> = {\n default: null, // Use system cursor\n pointer: (\n <div className=\"h-5 w-5 rounded-full bg-white/30 border-2 border-white\" />\n ),\n};\n\ntype CursorProviderProps = React.ComponentProps<\"div\"> & {\n children: React.ReactNode;\n /** Auto-setup cursor with variant (preset key or custom ReactNode) */\n cursorType?: CursorVariant;\n /** Auto-setup follow element with content */\n followText?: React.ReactNode;\n /** Show follow element (default: true when followText is provided) */\n showFollow?: boolean;\n /** Follow element alignment */\n followAlign?: Align;\n /** Follow element side offset */\n followSideOffset?: number;\n /** Follow element transition preset */\n followTransition?: TransitionPreset;\n};\n\nfunction CursorProvider({\n ref,\n children,\n cursorType = \"default\",\n followText,\n showFollow,\n followAlign = \"bottom-right\",\n followSideOffset = 15,\n followTransition = \"normal\",\n ...props\n}: CursorProviderProps) {\n const [cursorPos, setCursorPos] = React.useState({ x: 0, y: 0 });\n const [isActive, setIsActive] = React.useState(false);\n const containerRef = React.useRef<HTMLDivElement>(null);\n const cursorRef = React.useRef<HTMLDivElement>(null);\n React.useImperativeHandle(ref, () => containerRef.current as HTMLDivElement);\n\n React.useEffect(() => {\n if (!containerRef.current) return;\n\n const parent = containerRef.current.parentElement;\n if (!parent) return;\n\n if (getComputedStyle(parent).position === \"static\") {\n parent.style.position = \"relative\";\n }\n\n const handleMouseMove = (e: MouseEvent) => {\n const rect = parent.getBoundingClientRect();\n setCursorPos({ x: e.clientX - rect.left, y: e.clientY - rect.top });\n setIsActive(true);\n };\n const handleMouseLeave = () => setIsActive(false);\n\n parent.addEventListener(\"mousemove\", handleMouseMove);\n parent.addEventListener(\"mouseleave\", handleMouseLeave);\n\n return () => {\n parent.removeEventListener(\"mousemove\", handleMouseMove);\n parent.removeEventListener(\"mouseleave\", handleMouseLeave);\n };\n }, []);\n\n // Auto-setup: determine if we should show cursor and follow\n const shouldShowCursor = cursorType !== undefined;\n const shouldShowFollowElement = showFollow ?? followText !== undefined;\n\n // Convert preset to SpringOptions\n const transitionConfig = TRANSITION_PRESETS[followTransition];\n\n return (\n <CursorContext.Provider\n value={{ cursorPos, isActive, containerRef, cursorRef }}\n >\n <div ref={containerRef} data-slot=\"cursor-provider\" {...props}>\n {children}\n\n {/* Auto-setup Cursor */}\n {shouldShowCursor && <Cursor cursorType={cursorType} />}\n\n {/* Auto-setup CursorFollow */}\n {shouldShowFollowElement && (\n <CursorFollow\n followText={followText}\n align={followAlign}\n sideOffset={followSideOffset}\n transition={transitionConfig}\n />\n )}\n </div>\n </CursorContext.Provider>\n );\n}\n\ntype CursorProps = HTMLMotionProps<\"div\"> & {\n children?: React.ReactNode;\n cursorType?: CursorVariant;\n};\n\nfunction Cursor({\n ref,\n children,\n cursorType = \"default\",\n className,\n style,\n ...props\n}: CursorProps) {\n const { cursorPos, isActive, containerRef, cursorRef } = useCursor();\n React.useImperativeHandle(ref, () => cursorRef.current as HTMLDivElement);\n\n const x = useMotionValue(0);\n const y = useMotionValue(0);\n\n // Determine which content to render\n const getCursorContent = () => {\n if (children) return children;\n\n // Check if cursorType is a preset key\n if (typeof cursorType === \"string\" && cursorType in cursorVariants) {\n return cursorVariants[cursorType as CursorVariantKey];\n }\n\n // Otherwise treat it as custom ReactNode\n return cursorType;\n };\n\n const cursorContent = getCursorContent();\n\n // Only hide system cursor if we have custom content to show\n const shouldHideSystemCursor = cursorContent !== null;\n\n React.useEffect(() => {\n const parentElement = containerRef.current?.parentElement;\n\n if (parentElement && isActive && shouldHideSystemCursor) {\n parentElement.style.cursor = \"none\";\n }\n\n return () => {\n if (parentElement) parentElement.style.cursor = \"default\";\n };\n }, [containerRef, isActive, shouldHideSystemCursor]);\n\n React.useEffect(() => {\n x.set(cursorPos.x);\n y.set(cursorPos.y);\n }, [cursorPos, x, y]);\n\n // Only render if we have content to show\n if (!cursorContent) return null;\n\n return (\n <AnimatePresence>\n {isActive && (\n <motion.div\n ref={cursorRef}\n data-slot=\"cursor\"\n className={cn(\n \"transform-[translate(-50%,-50%)] pointer-events-none z-[9999] absolute\",\n className\n )}\n style={{ top: y, left: x, ...style }}\n initial={{ scale: 0, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0, opacity: 0 }}\n {...props}\n >\n {cursorContent}\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n\ntype CursorFollowProps = HTMLMotionProps<\"div\"> & {\n sideOffset?: number;\n align?: Align;\n transition?: SpringOptions;\n transitionPreset?: TransitionPreset;\n children?: React.ReactNode;\n followText?: React.ReactNode;\n};\n\nfunction CursorFollow({\n ref,\n sideOffset = 15,\n align = \"bottom-right\",\n children,\n className,\n style,\n followText,\n transition,\n transitionPreset = \"normal\",\n ...props\n}: CursorFollowProps) {\n const { cursorPos, isActive, cursorRef } = useCursor();\n const cursorFollowRef = React.useRef<HTMLDivElement>(null);\n React.useImperativeHandle(\n ref,\n () => cursorFollowRef.current as HTMLDivElement\n );\n\n const x = useMotionValue(0);\n const y = useMotionValue(0);\n\n // Use custom transition if provided, otherwise use preset\n const finalTransition = transition || TRANSITION_PRESETS[transitionPreset];\n\n const springX = useSpring(x, finalTransition);\n const springY = useSpring(y, finalTransition);\n\n const calculateOffset = React.useCallback(() => {\n const rect = cursorFollowRef.current?.getBoundingClientRect();\n const width = rect?.width ?? 0;\n const height = rect?.height ?? 0;\n\n let newOffset;\n\n switch (align) {\n case \"center\":\n newOffset = { x: width / 2, y: height / 2 };\n break;\n case \"top\":\n newOffset = { x: width / 2, y: height + sideOffset };\n break;\n case \"top-left\":\n newOffset = { x: width + sideOffset, y: height + sideOffset };\n break;\n case \"top-right\":\n newOffset = { x: -sideOffset, y: height + sideOffset };\n break;\n case \"bottom\":\n newOffset = { x: width / 2, y: -sideOffset };\n break;\n case \"bottom-left\":\n newOffset = { x: width + sideOffset, y: -sideOffset };\n break;\n case \"bottom-right\":\n newOffset = { x: -sideOffset, y: -sideOffset };\n break;\n case \"left\":\n newOffset = { x: width + sideOffset, y: height / 2 };\n break;\n case \"right\":\n newOffset = { x: -sideOffset, y: height / 2 };\n break;\n default:\n newOffset = { x: 0, y: 0 };\n }\n\n return newOffset;\n }, [align, sideOffset]);\n\n React.useEffect(() => {\n const offset = calculateOffset();\n const cursorRect = cursorRef.current?.getBoundingClientRect();\n const cursorWidth = cursorRect?.width ?? 20;\n const cursorHeight = cursorRect?.height ?? 20;\n\n x.set(cursorPos.x - offset.x + cursorWidth / 2);\n y.set(cursorPos.y - offset.y + cursorHeight / 2);\n }, [calculateOffset, cursorPos, cursorRef, x, y]);\n\n // Determine follow content based on children or followText\n const getFollowContent = () => {\n if (children) return children;\n\n if (followText) {\n // If followText is a string, wrap it with default styling\n if (typeof followText === \"string\") {\n return (\n <div className=\"px-4 py-2 bg-white rounded-md shadow-lg text-sm font-medium\">\n {followText}\n </div>\n );\n }\n // If it's a ReactNode, render it directly\n return followText;\n }\n\n return null;\n };\n\n return (\n <AnimatePresence>\n {isActive && (\n <motion.div\n ref={cursorFollowRef}\n data-slot=\"cursor-follow\"\n className={cn(\n \"transform-[translate(-50%,-50%)] pointer-events-none z-[9998] absolute\",\n className\n )}\n style={{ top: springY, left: springX, ...style }}\n initial={{ scale: 0, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0, opacity: 0 }}\n {...props}\n >\n {getFollowContent()}\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n\n// Hook for easy cursor setup (Method 2)\ntype useCursorFollowOptions = {\n /** Cursor variant type (preset key or custom ReactNode) */\n cursorType?: CursorVariant;\n /** Follow element content */\n followText?: React.ReactNode;\n /** Show follow element */\n showFollow?: boolean;\n /** Follow element alignment */\n align?: Align;\n /** Follow element side offset */\n sideOffset?: number;\n /** Follow element transition preset */\n transitionPreset?: TransitionPreset;\n /** Additional className for the container */\n className?: string;\n /** Additional style for the container */\n style?: React.CSSProperties;\n};\n\ntype UseCursorFollowType = {\n ref: React.RefObject<HTMLDivElement | null>;\n className: string;\n style: React.CSSProperties;\n \"data-cursor-container\": true;\n children: (originalChildren: React.ReactNode) => React.ReactElement;\n};\n\nfunction useCursorFollow(\n options: useCursorFollowOptions = {}\n): UseCursorFollowType {\n const {\n cursorType = \"default\",\n followText,\n showFollow,\n align = \"bottom-right\",\n sideOffset = 15,\n transitionPreset = \"normal\",\n className,\n style,\n } = options;\n\n const [cursorPos, setCursorPos] = React.useState({ x: 0, y: 0 });\n const [isActive, setIsActive] = React.useState(false);\n const containerRef = React.useRef<HTMLDivElement>(null);\n const cursorRef = React.useRef<HTMLDivElement>(null);\n\n React.useEffect(() => {\n if (!containerRef.current) return;\n\n const element = containerRef.current;\n if (getComputedStyle(element).position === \"static\") {\n element.style.position = \"relative\";\n }\n\n const handleMouseMove = (e: MouseEvent) => {\n const rect = element.getBoundingClientRect();\n setCursorPos({ x: e.clientX - rect.left, y: e.clientY - rect.top });\n setIsActive(true);\n };\n const handleMouseLeave = () => setIsActive(false);\n\n element.addEventListener(\"mousemove\", handleMouseMove);\n element.addEventListener(\"mouseleave\", handleMouseLeave);\n\n return () => {\n element.removeEventListener(\"mousemove\", handleMouseMove);\n element.removeEventListener(\"mouseleave\", handleMouseLeave);\n };\n }, []);\n\n // Only hide system cursor if cursorType is not 'default'\n const shouldHideSystemCursor = cursorType !== \"default\";\n\n React.useEffect(() => {\n if (!containerRef.current || !isActive || !shouldHideSystemCursor) return;\n const element = containerRef.current;\n element.style.cursor = \"none\";\n return () => {\n element.style.cursor = \"default\";\n };\n }, [isActive, shouldHideSystemCursor]);\n\n // Render function for cursor elements\n const renderCursorElements = React.useCallback(() => {\n if (!isActive) return null;\n\n return (\n <CursorContext.Provider\n value={{ cursorPos, isActive, containerRef, cursorRef }}\n >\n <Cursor cursorType={cursorType} />\n {(showFollow ?? followText !== undefined) && (\n <CursorFollow\n followText={followText}\n align={align}\n sideOffset={sideOffset}\n transitionPreset={transitionPreset}\n />\n )}\n </CursorContext.Provider>\n );\n }, [\n isActive,\n cursorPos,\n cursorType,\n followText,\n showFollow,\n align,\n sideOffset,\n transitionPreset,\n ]);\n\n // Return props that can be spread on the container element\n return {\n ref: containerRef,\n className: cn(\"relative\", className),\n style: { ...style },\n \"data-cursor-container\": true as const,\n children: (originalChildren: React.ReactNode) => (\n <>\n {originalChildren}\n {renderCursorElements()}\n </>\n ),\n };\n}\n\nexport {\n CursorProvider,\n Cursor,\n CursorFollow,\n useCursor,\n useCursorFollow,\n TRANSITION_PRESETS,\n type CursorContextType,\n type CursorProviderProps,\n type CursorProps,\n type CursorFollowProps,\n type CursorVariant,\n type CursorVariantKey,\n type Align,\n type useCursorFollowOptions,\n type TransitionPreset,\n};\n"],"names":["TRANSITION_PRESETS","CursorContext","React","useCursor","context","cursorVariants","jsx","CursorProvider","ref","children","cursorType","followText","showFollow","followAlign","followSideOffset","followTransition","props","cursorPos","setCursorPos","isActive","setIsActive","containerRef","cursorRef","parent","handleMouseMove","e","rect","handleMouseLeave","shouldShowCursor","shouldShowFollowElement","transitionConfig","Cursor","CursorFollow","className","style","x","useMotionValue","y","cursorContent","shouldHideSystemCursor","parentElement","AnimatePresence","motion","cn","sideOffset","align","transition","transitionPreset","cursorFollowRef","finalTransition","springX","useSpring","springY","calculateOffset","width","height","newOffset","offset","cursorRect","cursorWidth","cursorHeight","getFollowContent","useCursorFollow","options","element","renderCursorElements","jsxs","originalChildren","Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CursorFollow.cjs","sources":["../../../../src/components/Interactive/CursorFollow.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n motion,\n useMotionValue,\n useSpring,\n AnimatePresence,\n type HTMLMotionProps,\n type SpringOptions,\n} from \"motion/react\";\n\nimport { cn } from \"@dsui/ui/index\";\n\n// Transition presets\ntype TransitionPreset = \"slow\" | \"normal\" | \"fast\" | \"realtime\";\n\nconst TRANSITION_PRESETS: Record<TransitionPreset, SpringOptions> = {\n slow: { stiffness: 100, damping: 20, bounce: 0 },\n normal: { stiffness: 500, damping: 50, bounce: 0 },\n fast: { stiffness: 1000, damping: 80, bounce: 0 },\n realtime: { stiffness: 2000, damping: 100, bounce: 0 },\n};\n\ntype CursorContextType = {\n cursorPos: { x: number; y: number };\n isActive: boolean;\n containerRef: React.RefObject<HTMLDivElement | null>;\n cursorRef: React.RefObject<HTMLDivElement | null>;\n};\n\nconst CursorContext = React.createContext<CursorContextType | undefined>(\n undefined\n);\n\nconst useCursor = (): CursorContextType => {\n const context = React.useContext(CursorContext);\n if (!context) {\n throw new Error(\"useCursor must be used within a CursorProvider\");\n }\n return context;\n};\n\ntype Align =\n | \"top\"\n | \"top-left\"\n | \"top-right\"\n | \"bottom\"\n | \"bottom-left\"\n | \"bottom-right\"\n | \"left\"\n | \"right\"\n | \"center\";\n\ntype CursorVariantKey = \"default\" | \"pointer\";\ntype CursorVariant = CursorVariantKey | React.ReactNode;\n\n// Predefined cursor variants\nconst cursorVariants: Record<CursorVariantKey, React.ReactNode> = {\n default: null, // Use system cursor\n pointer: (\n <div className=\"h-5 w-5 rounded-full bg-white/30 border-2 border-white\" />\n ),\n};\n\ntype CursorProviderProps = React.ComponentProps<\"div\"> & {\n children: React.ReactNode;\n /** Auto-setup cursor with variant (preset key or custom ReactNode) */\n cursorType?: CursorVariant;\n /** Auto-setup follow element with content */\n followText?: React.ReactNode;\n /** Show follow element (default: true when followText is provided) */\n showFollow?: boolean;\n /** Follow element alignment */\n followAlign?: Align;\n /** Follow element side offset */\n followSideOffset?: number;\n /** Follow element transition preset */\n followTransition?: TransitionPreset;\n};\n\nfunction CursorProvider({\n ref,\n children,\n cursorType = \"default\",\n followText,\n showFollow,\n followAlign = \"bottom-right\",\n followSideOffset = 15,\n followTransition = \"normal\",\n ...props\n}: CursorProviderProps) {\n const [cursorPos, setCursorPos] = React.useState({ x: 0, y: 0 });\n const [isActive, setIsActive] = React.useState(false);\n const containerRef = React.useRef<HTMLDivElement>(null);\n const cursorRef = React.useRef<HTMLDivElement>(null);\n React.useImperativeHandle(ref as React.Ref<HTMLDivElement>, () => containerRef.current as HTMLDivElement);\n\n React.useEffect(() => {\n if (!containerRef.current) return;\n\n const parent = containerRef.current.parentElement;\n if (!parent) return;\n\n if (getComputedStyle(parent).position === \"static\") {\n parent.style.position = \"relative\";\n }\n\n const handleMouseMove = (e: MouseEvent) => {\n const rect = parent.getBoundingClientRect();\n setCursorPos({ x: e.clientX - rect.left, y: e.clientY - rect.top });\n setIsActive(true);\n };\n const handleMouseLeave = () => setIsActive(false);\n\n parent.addEventListener(\"mousemove\", handleMouseMove);\n parent.addEventListener(\"mouseleave\", handleMouseLeave);\n\n return () => {\n parent.removeEventListener(\"mousemove\", handleMouseMove);\n parent.removeEventListener(\"mouseleave\", handleMouseLeave);\n };\n }, []);\n\n // Auto-setup: determine if we should show cursor and follow\n const shouldShowCursor = cursorType !== undefined;\n const shouldShowFollowElement = showFollow ?? followText !== undefined;\n\n // Convert preset to SpringOptions\n const transitionConfig = TRANSITION_PRESETS[followTransition];\n\n return (\n <CursorContext.Provider\n value={{ cursorPos, isActive, containerRef, cursorRef }}\n >\n <div ref={containerRef} data-slot=\"cursor-provider\" {...props}>\n {children}\n\n {/* Auto-setup Cursor */}\n {shouldShowCursor && <Cursor cursorType={cursorType} />}\n\n {/* Auto-setup CursorFollow */}\n {shouldShowFollowElement && (\n <CursorFollow\n followText={followText}\n align={followAlign}\n sideOffset={followSideOffset}\n transition={transitionConfig}\n />\n )}\n </div>\n </CursorContext.Provider>\n );\n}\n\ntype CursorProps = HTMLMotionProps<\"div\"> & {\n children?: React.ReactNode;\n cursorType?: CursorVariant;\n};\n\nfunction Cursor({\n ref,\n children,\n cursorType = \"default\",\n className,\n style,\n ...props\n}: CursorProps) {\n const { cursorPos, isActive, containerRef, cursorRef } = useCursor();\n React.useImperativeHandle(ref as React.Ref<HTMLDivElement>, () => cursorRef.current as HTMLDivElement);\n\n const x = useMotionValue(0);\n const y = useMotionValue(0);\n\n // Determine which content to render\n const getCursorContent = () => {\n if (children) return children;\n\n // Check if cursorType is a preset key\n if (typeof cursorType === \"string\" && cursorType in cursorVariants) {\n return cursorVariants[cursorType as CursorVariantKey];\n }\n\n // Otherwise treat it as custom ReactNode\n return cursorType;\n };\n\n const cursorContent = getCursorContent();\n\n // Only hide system cursor if we have custom content to show\n const shouldHideSystemCursor = cursorContent !== null;\n\n React.useEffect(() => {\n const parentElement = containerRef.current?.parentElement;\n\n if (parentElement && isActive && shouldHideSystemCursor) {\n parentElement.style.cursor = \"none\";\n }\n\n return () => {\n if (parentElement) parentElement.style.cursor = \"default\";\n };\n }, [containerRef, isActive, shouldHideSystemCursor]);\n\n React.useEffect(() => {\n x.set(cursorPos.x);\n y.set(cursorPos.y);\n }, [cursorPos, x, y]);\n\n // Only render if we have content to show\n if (!cursorContent) return null;\n\n return (\n <AnimatePresence>\n {isActive && (\n <motion.div\n ref={cursorRef}\n data-slot=\"cursor\"\n className={cn(\n \"transform-[translate(-50%,-50%)] pointer-events-none z-9999 absolute\",\n className\n )}\n style={{ top: y, left: x, ...style }}\n initial={{ scale: 0, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0, opacity: 0 }}\n {...props}\n >\n {cursorContent}\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n\ntype CursorFollowProps = HTMLMotionProps<\"div\"> & {\n sideOffset?: number;\n align?: Align;\n transition?: SpringOptions;\n transitionPreset?: TransitionPreset;\n children?: React.ReactNode;\n followText?: React.ReactNode;\n};\n\nfunction CursorFollow({\n ref,\n sideOffset = 15,\n align = \"bottom-right\",\n children,\n className,\n style,\n followText,\n transition,\n transitionPreset = \"normal\",\n ...props\n}: CursorFollowProps) {\n const { cursorPos, isActive, cursorRef } = useCursor();\n const cursorFollowRef = React.useRef<HTMLDivElement>(null);\n React.useImperativeHandle(\n ref as React.Ref<HTMLDivElement>,\n () => cursorFollowRef.current as HTMLDivElement\n );\n\n const x = useMotionValue(0);\n const y = useMotionValue(0);\n\n // Use custom transition if provided, otherwise use preset\n const finalTransition = transition || TRANSITION_PRESETS[transitionPreset];\n\n const springX = useSpring(x, finalTransition);\n const springY = useSpring(y, finalTransition);\n\n const calculateOffset = React.useCallback(() => {\n const rect = cursorFollowRef.current?.getBoundingClientRect();\n const width = rect?.width ?? 0;\n const height = rect?.height ?? 0;\n\n let newOffset;\n\n switch (align) {\n case \"center\":\n newOffset = { x: width / 2, y: height / 2 };\n break;\n case \"top\":\n newOffset = { x: width / 2, y: height + sideOffset };\n break;\n case \"top-left\":\n newOffset = { x: width + sideOffset, y: height + sideOffset };\n break;\n case \"top-right\":\n newOffset = { x: -sideOffset, y: height + sideOffset };\n break;\n case \"bottom\":\n newOffset = { x: width / 2, y: -sideOffset };\n break;\n case \"bottom-left\":\n newOffset = { x: width + sideOffset, y: -sideOffset };\n break;\n case \"bottom-right\":\n newOffset = { x: -sideOffset, y: -sideOffset };\n break;\n case \"left\":\n newOffset = { x: width + sideOffset, y: height / 2 };\n break;\n case \"right\":\n newOffset = { x: -sideOffset, y: height / 2 };\n break;\n default:\n newOffset = { x: 0, y: 0 };\n }\n\n return newOffset;\n }, [align, sideOffset]);\n\n React.useEffect(() => {\n const offset = calculateOffset();\n const cursorRect = cursorRef.current?.getBoundingClientRect();\n const cursorWidth = cursorRect?.width ?? 20;\n const cursorHeight = cursorRect?.height ?? 20;\n\n x.set(cursorPos.x - offset.x + cursorWidth / 2);\n y.set(cursorPos.y - offset.y + cursorHeight / 2);\n }, [calculateOffset, cursorPos, cursorRef, x, y]);\n\n // Determine follow content based on children or followText\n const getFollowContent = () => {\n if (children) return children;\n\n if (followText) {\n // If followText is a string, wrap it with default styling\n if (typeof followText === \"string\") {\n return (\n <div className=\"px-4 py-2 bg-white rounded-md shadow-lg text-sm font-medium\">\n {followText}\n </div>\n );\n }\n // If it's a ReactNode, render it directly\n return followText;\n }\n\n return null;\n };\n\n return (\n <AnimatePresence>\n {isActive && (\n <motion.div\n ref={cursorFollowRef}\n data-slot=\"cursor-follow\"\n className={cn(\n \"transform-[translate(-50%,-50%)] pointer-events-none z-9998 absolute\",\n className\n )}\n style={{ top: springY, left: springX, ...style }}\n initial={{ scale: 0, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0, opacity: 0 }}\n {...props}\n >\n {getFollowContent()}\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n\n// Hook for easy cursor setup (Method 2)\ntype useCursorFollowOptions = {\n /** Cursor variant type (preset key or custom ReactNode) */\n cursorType?: CursorVariant;\n /** Follow element content */\n followText?: React.ReactNode;\n /** Show follow element */\n showFollow?: boolean;\n /** Follow element alignment */\n align?: Align;\n /** Follow element side offset */\n sideOffset?: number;\n /** Follow element transition preset */\n transitionPreset?: TransitionPreset;\n /** Additional className for the container */\n className?: string;\n /** Additional style for the container */\n style?: React.CSSProperties;\n};\n\ntype UseCursorFollowType = {\n ref: React.RefObject<HTMLDivElement | null>;\n className: string;\n style: React.CSSProperties;\n \"data-cursor-container\": true;\n children: (children: React.ReactNode) => React.ReactElement;\n};\n\nfunction useCursorFollow(\n options: useCursorFollowOptions = {}\n): UseCursorFollowType {\n const {\n cursorType = \"default\",\n followText,\n showFollow,\n align = \"bottom-right\",\n sideOffset = 15,\n transitionPreset = \"normal\",\n className,\n style,\n } = options;\n\n const [cursorPos, setCursorPos] = React.useState({ x: 0, y: 0 });\n const [isActive, setIsActive] = React.useState(false);\n const containerRef = React.useRef<HTMLDivElement>(null);\n const cursorRef = React.useRef<HTMLDivElement>(null);\n\n React.useEffect(() => {\n if (!containerRef.current) return;\n\n const element = containerRef.current;\n if (getComputedStyle(element).position === \"static\") {\n element.style.position = \"relative\";\n }\n\n const handleMouseMove = (e: MouseEvent) => {\n const rect = element.getBoundingClientRect();\n setCursorPos({ x: e.clientX - rect.left, y: e.clientY - rect.top });\n setIsActive(true);\n };\n const handleMouseLeave = () => setIsActive(false);\n\n element.addEventListener(\"mousemove\", handleMouseMove);\n element.addEventListener(\"mouseleave\", handleMouseLeave);\n\n return () => {\n element.removeEventListener(\"mousemove\", handleMouseMove);\n element.removeEventListener(\"mouseleave\", handleMouseLeave);\n };\n }, []);\n\n // Only hide system cursor if cursorType is not 'default'\n const shouldHideSystemCursor = cursorType !== \"default\";\n\n React.useEffect(() => {\n if (!containerRef.current || !isActive || !shouldHideSystemCursor) return;\n const element = containerRef.current;\n element.style.cursor = \"none\";\n return () => {\n element.style.cursor = \"default\";\n };\n }, [isActive, shouldHideSystemCursor]);\n\n // Render function for cursor elements\n const renderCursorElements = React.useCallback(() => {\n if (!isActive) return null;\n\n return (\n <CursorContext.Provider\n value={{ cursorPos, isActive, containerRef, cursorRef }}\n >\n <Cursor cursorType={cursorType} />\n {(showFollow ?? followText !== undefined) && (\n <CursorFollow\n followText={followText}\n align={align}\n sideOffset={sideOffset}\n transitionPreset={transitionPreset}\n />\n )}\n </CursorContext.Provider>\n );\n }, [\n isActive,\n cursorPos,\n cursorType,\n followText,\n showFollow,\n align,\n sideOffset,\n transitionPreset,\n ]);\n\n // Return props that can be spread on the container element\n return {\n ref: containerRef,\n className: cn(\"relative\", className),\n style: { ...style },\n \"data-cursor-container\": true as const,\n children: (children: React.ReactNode) => (\n <>\n {children}\n {renderCursorElements()}\n </>\n ),\n };\n}\n\nexport {\n CursorProvider,\n Cursor,\n CursorFollow,\n useCursor,\n useCursorFollow,\n TRANSITION_PRESETS,\n type CursorContextType,\n type CursorProviderProps,\n type CursorProps,\n type CursorFollowProps,\n type CursorVariant,\n type CursorVariantKey,\n type Align,\n type useCursorFollowOptions,\n type TransitionPreset,\n};\n"],"names":["TRANSITION_PRESETS","CursorContext","React","useCursor","context","cursorVariants","jsx","CursorProvider","ref","children","cursorType","followText","showFollow","followAlign","followSideOffset","followTransition","props","cursorPos","setCursorPos","isActive","setIsActive","containerRef","cursorRef","parent","handleMouseMove","e","rect","handleMouseLeave","shouldShowCursor","shouldShowFollowElement","transitionConfig","Cursor","CursorFollow","className","style","x","useMotionValue","y","cursorContent","shouldHideSystemCursor","parentElement","AnimatePresence","motion","cn","sideOffset","align","transition","transitionPreset","cursorFollowRef","finalTransition","springX","useSpring","springY","calculateOffset","width","height","newOffset","offset","cursorRect","cursorWidth","cursorHeight","getFollowContent","useCursorFollow","options","element","renderCursorElements","jsxs","Fragment"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Toast.cjs","sources":["../../../../src/components/Toast/Toast.tsx"],"sourcesContent":["import {\n Toaster as SonnerToaster,\n toast as sonnerToast,\n type ToasterProps as SonnerToasterProps,\n} from \"sonner\";\nimport { CheckCircle, XCircle, Info, AlertTriangle } from \"lucide-react\";\nimport { cn } from \"@dsui/ui/index\";\n\nconst variantStyles = {\n default: \"bg-neutral-800 text-white border border-neutral-700\",\n success: \"bg-success text-white border border-success/20\",\n error: \"bg-error text-white border border-error/20\",\n warning: \"bg-warning text-black border border-warning/20\",\n info: \"bg-info text-foreground\",\n primary: \"bg-primary text-primary-foreground border border-primary/20\",\n secondary:\n \"bg-secondary text-secondary-foreground border border-secondary/20\",\n};\n\nconst variantIcons = {\n success: <CheckCircle className=\"w-4 h-4 shrink-0\" />,\n error: <XCircle className=\"w-4 h-4 shrink-0\" />,\n warning: <AlertTriangle className=\"w-4 h-4 shrink-0\" />,\n info: <Info className=\"w-4 h-4 shrink-0\" />,\n default: null,\n primary: <Info className=\"w-4 h-4 shrink-0\" />,\n secondary: <Info className=\"w-4 h-4 shrink-0\" />,\n};\n\ntype Variant = keyof typeof variantStyles;\n\nconst renderToastContent = (variant: Variant, message: React.ReactNode) => (\n <div\n className={cn(\n \"flex items-center gap-2 rounded-md px-3 py-2 shadow-md text-sm font-medium\",\n variantStyles[variant]\n )}\n >\n {variantIcons[variant]}\n <span>{message}</span>\n </div>\n);\n\nconst toast = Object.assign(\n (...args: Parameters<typeof sonnerToast>) => {\n const [message] = args;\n const content =\n typeof message === \"function\" ? message() : (message ?? \"Notification\");\n\n return sonnerToast.custom(() => renderToastContent(\"default\", content));\n },\n {\n success: (\n message: React.ReactNode,\n opts?: Parameters<typeof sonnerToast>[1]\n ) => sonnerToast.custom(() => renderToastContent(\"success\", message), opts),\n\n error: (\n message: React.ReactNode,\n opts?: Parameters<typeof sonnerToast>[1]\n ) => sonnerToast.custom(() => renderToastContent(\"error\", message), opts),\n\n warning: (\n message: React.ReactNode,\n opts?: Parameters<typeof sonnerToast>[1]\n ) => sonnerToast.custom(() => renderToastContent(\"warning\", message), opts),\n\n info: (\n message: React.ReactNode,\n opts?: Parameters<typeof sonnerToast>[1]\n ) => sonnerToast.custom(() => renderToastContent(\"info\", message), opts),\n\n primary: (\n message: React.ReactNode,\n opts?: Parameters<typeof sonnerToast>[1]\n ) => sonnerToast.custom(() => renderToastContent(\"primary\", message), opts),\n\n secondary: (\n message: React.ReactNode,\n opts?: Parameters<typeof sonnerToast>[1]\n ) =>\n sonnerToast.custom(() => renderToastContent(\"secondary\", message), opts),\n }\n);\n\nfunction Toaster({\n position = \"top-right\",\n richColors = true,\n closeButton = false,\n expand = false,\n visibleToasts = 3,\n duration = 4000,\n ...props\n}: SonnerToasterProps) {\n return (\n <SonnerToaster\n {...props}\n position={position}\n richColors={richColors}\n closeButton={closeButton}\n expand={expand}\n visibleToasts={visibleToasts}\n toastOptions={{\n duration: duration,\n classNames: {\n toast:\n \"rounded-md shadow-md border-none text-sm font-medium backdrop-blur-sm text-black dark:text-white\",\n description: \"text-muted-foreground\",\n actionButton: \"bg-white/10\",\n },\n }}\n />\n );\n}\n\nexport { toast, Toaster };\n"],"names":["variantStyles","variantIcons","jsx","CheckCircle","XCircle","AlertTriangle","Info","renderToastContent","variant","message","jsxs","cn","toast","args","content","sonnerToast","opts","Toaster","position","richColors","closeButton","expand","visibleToasts","duration","props","SonnerToaster"],"mappings":"0jDAQA,MAAMA,EAAgB,CACpB,QAAS,sDACT,QAAS,iDACT,MAAO,6CACP,QAAS,iDACT,KAAM,0BACN,QAAS,8DACT,UACE,mEACJ,EAEMC,EAAe,CACnB,QAASC,EAAAA,IAACC,EAAAA,YAAA,CAAY,UAAU,kBAAA,CAAmB,EACnD,MAAOD,EAAAA,IAACE,EAAAA,QAAA,CAAQ,UAAU,kBAAA,CAAmB,EAC7C,QAASF,EAAAA,IAACG,EAAAA,cAAA,CAAc,UAAU,kBAAA,CAAmB,EACrD,KAAMH,EAAAA,IAACI,EAAAA,KAAA,CAAK,UAAU,kBAAA,CAAmB,EACzC,QAAS,KACT,QAASJ,EAAAA,IAACI,EAAAA,KAAA,CAAK,UAAU,kBAAA,CAAmB,EAC5C,UAAWJ,EAAAA,IAACI,EAAAA,KAAA,CAAK,UAAU,kBAAA,CAAmB,CAChD,EAIMC,EAAqB,CAACC,EAAkBC,IAC5CC,EAAAA,KAAC,MAAA,CACC,UAAWC,EAAAA,GACT,6EACAX,EAAcQ,CAAO,CAAA,EAGtB,SAAA,CAAAP,EAAaO,CAAO,EACrBN,EAAAA,IAAC,QAAM,SAAAO,CAAA,CAAQ,CAAA,CAAA,CACjB,EAGIG,EAAQ,OAAO,OACnB,IAAIC,IAAyC,CAC3C,KAAM,CAACJ,CAAO,EAAII,EACZC,EACJ,OAAOL,GAAY,WAAaA,EAAA,EAAaA,GAAW,eAE1D,OAAOM,EAAAA,MAAY,OAAO,IAAMR,EAAmB,UAAWO,CAAO,CAAC,CACxE,EACA,CACE,QAAS,CACPL,EACAO,IACGD,QAAY,OAAO,IAAMR,EAAmB,UAAWE,CAAO,EAAGO,CAAI,EAE1E,MAAO,CACLP,EACAO,IACGD,QAAY,OAAO,IAAMR,EAAmB,QAASE,CAAO,EAAGO,CAAI,EAExE,QAAS,CACPP,EACAO,IACGD,QAAY,OAAO,IAAMR,EAAmB,UAAWE,CAAO,EAAGO,CAAI,EAE1E,KAAM,CACJP,EACAO,IACGD,QAAY,OAAO,IAAMR,EAAmB,OAAQE,CAAO,EAAGO,CAAI,EAEvE,QAAS,CACPP,EACAO,IACGD,QAAY,OAAO,IAAMR,EAAmB,UAAWE,CAAO,EAAGO,CAAI,EAE1E,UAAW,CACTP,EACAO,IAEAD,EAAAA,MAAY,OAAO,IAAMR,EAAmB,YAAaE,CAAO,EAAGO,CAAI,CAAA,CAE7E,EAEA,SAASC,EAAQ,CACf,SAAAC,EAAW,YACX,WAAAC,EAAa,GACb,YAAAC,EAAc,GACd,OAAAC,EAAS,GACT,cAAAC,EAAgB,EAChB,SAAAC,EAAW,IACX,GAAGC,CACL,EAAuB,CACrB,OACEtB,EAAAA,IAACuB,EAAAA,QAAA,CACE,GAAGD,EACJ,SAAAN,EACA,WAAAC,EACA,YAAAC,EACA,OAAAC,EACA,cAAAC,EACA,aAAc,CACZ,SAAAC,EACA,WAAY,CACV,MACE,mGACF,YAAa,wBACb,aAAc,aAAA,CAChB,CACF,CAAA,CAGN"}
|
|
1
|
+
{"version":3,"file":"Toast.cjs","sources":["../../../../src/components/Toast/Toast.tsx"],"sourcesContent":["import {\n Toaster as SonnerToaster,\n toast as sonnerToast,\n type ToasterProps as SonnerToasterProps,\n} from \"sonner\";\nimport { CheckCircle, XCircle, Info, AlertTriangle } from \"lucide-react\";\nimport { cn } from \"@dsui/ui/index\";\n\nconst variantStyles = {\n default: \"bg-neutral-800 text-white border border-neutral-700\",\n success: \"bg-success text-white border border-success/20\",\n error: \"bg-error text-white border border-error/20\",\n warning: \"bg-warning text-black border border-warning/20\",\n info: \"bg-info text-foreground\",\n primary: \"bg-primary text-primary-foreground border border-primary/20\",\n secondary:\n \"bg-secondary text-secondary-foreground border border-secondary/20\",\n};\n\nconst variantIcons = {\n success: <CheckCircle className=\"w-4 h-4 shrink-0\" />,\n error: <XCircle className=\"w-4 h-4 shrink-0\" />,\n warning: <AlertTriangle className=\"w-4 h-4 shrink-0\" />,\n info: <Info className=\"w-4 h-4 shrink-0\" />,\n default: null,\n primary: <Info className=\"w-4 h-4 shrink-0\" />,\n secondary: <Info className=\"w-4 h-4 shrink-0\" />,\n};\n\ntype Variant = keyof typeof variantStyles;\n\nconst renderToastContent = (variant: Variant, message: React.ReactNode) => (\n <div\n className={cn(\n \"flex items-center gap-2 rounded-md px-3 py-2 shadow-md text-sm font-medium\",\n variantStyles[variant]\n )}\n >\n {variantIcons[variant]}\n <span>{message}</span>\n </div>\n);\n\nconst toast = Object.assign(\n (...args: Parameters<typeof sonnerToast>) => {\n const [message] = args;\n const content =\n typeof message === \"function\" ? message() : (message ?? \"Notification\");\n\n return sonnerToast.custom(() => renderToastContent(\"default\", content));\n },\n {\n success: (\n message: React.ReactNode,\n opts?: Parameters<typeof sonnerToast>[1]\n ) => sonnerToast.custom(() => renderToastContent(\"success\", message), opts),\n\n error: (\n message: React.ReactNode,\n opts?: Parameters<typeof sonnerToast>[1]\n ) => sonnerToast.custom(() => renderToastContent(\"error\", message), opts),\n\n warning: (\n message: React.ReactNode,\n opts?: Parameters<typeof sonnerToast>[1]\n ) => sonnerToast.custom(() => renderToastContent(\"warning\", message), opts),\n\n info: (\n message: React.ReactNode,\n opts?: Parameters<typeof sonnerToast>[1]\n ) => sonnerToast.custom(() => renderToastContent(\"info\", message), opts),\n\n primary: (\n message: React.ReactNode,\n opts?: Parameters<typeof sonnerToast>[1]\n ) => sonnerToast.custom(() => renderToastContent(\"primary\", message), opts),\n\n secondary: (\n message: React.ReactNode,\n opts?: Parameters<typeof sonnerToast>[1]\n ) =>\n sonnerToast.custom(() => renderToastContent(\"secondary\", message), opts),\n }\n) as any;\n\nfunction Toaster({\n position = \"top-right\",\n richColors = true,\n closeButton = false,\n expand = false,\n visibleToasts = 3,\n duration = 4000,\n ...props\n}: SonnerToasterProps) {\n return (\n <SonnerToaster\n {...props}\n position={position}\n richColors={richColors}\n closeButton={closeButton}\n expand={expand}\n visibleToasts={visibleToasts}\n toastOptions={{\n duration: duration,\n classNames: {\n toast:\n \"rounded-md shadow-md border-none text-sm font-medium backdrop-blur-sm text-black dark:text-white\",\n description: \"text-muted-foreground\",\n actionButton: \"bg-white/10\",\n },\n }}\n />\n );\n}\n\nexport { toast, Toaster };\n"],"names":["variantStyles","variantIcons","jsx","CheckCircle","XCircle","AlertTriangle","Info","renderToastContent","variant","message","jsxs","cn","toast","args","content","sonnerToast","opts","Toaster","position","richColors","closeButton","expand","visibleToasts","duration","props","SonnerToaster"],"mappings":"0jDAQA,MAAMA,EAAgB,CACpB,QAAS,sDACT,QAAS,iDACT,MAAO,6CACP,QAAS,iDACT,KAAM,0BACN,QAAS,8DACT,UACE,mEACJ,EAEMC,EAAe,CACnB,QAASC,EAAAA,IAACC,EAAAA,YAAA,CAAY,UAAU,kBAAA,CAAmB,EACnD,MAAOD,EAAAA,IAACE,EAAAA,QAAA,CAAQ,UAAU,kBAAA,CAAmB,EAC7C,QAASF,EAAAA,IAACG,EAAAA,cAAA,CAAc,UAAU,kBAAA,CAAmB,EACrD,KAAMH,EAAAA,IAACI,EAAAA,KAAA,CAAK,UAAU,kBAAA,CAAmB,EACzC,QAAS,KACT,QAASJ,EAAAA,IAACI,EAAAA,KAAA,CAAK,UAAU,kBAAA,CAAmB,EAC5C,UAAWJ,EAAAA,IAACI,EAAAA,KAAA,CAAK,UAAU,kBAAA,CAAmB,CAChD,EAIMC,EAAqB,CAACC,EAAkBC,IAC5CC,EAAAA,KAAC,MAAA,CACC,UAAWC,EAAAA,GACT,6EACAX,EAAcQ,CAAO,CAAA,EAGtB,SAAA,CAAAP,EAAaO,CAAO,EACrBN,EAAAA,IAAC,QAAM,SAAAO,CAAA,CAAQ,CAAA,CAAA,CACjB,EAGIG,EAAQ,OAAO,OACnB,IAAIC,IAAyC,CAC3C,KAAM,CAACJ,CAAO,EAAII,EACZC,EACJ,OAAOL,GAAY,WAAaA,EAAA,EAAaA,GAAW,eAE1D,OAAOM,EAAAA,MAAY,OAAO,IAAMR,EAAmB,UAAWO,CAAO,CAAC,CACxE,EACA,CACE,QAAS,CACPL,EACAO,IACGD,QAAY,OAAO,IAAMR,EAAmB,UAAWE,CAAO,EAAGO,CAAI,EAE1E,MAAO,CACLP,EACAO,IACGD,QAAY,OAAO,IAAMR,EAAmB,QAASE,CAAO,EAAGO,CAAI,EAExE,QAAS,CACPP,EACAO,IACGD,QAAY,OAAO,IAAMR,EAAmB,UAAWE,CAAO,EAAGO,CAAI,EAE1E,KAAM,CACJP,EACAO,IACGD,QAAY,OAAO,IAAMR,EAAmB,OAAQE,CAAO,EAAGO,CAAI,EAEvE,QAAS,CACPP,EACAO,IACGD,QAAY,OAAO,IAAMR,EAAmB,UAAWE,CAAO,EAAGO,CAAI,EAE1E,UAAW,CACTP,EACAO,IAEAD,EAAAA,MAAY,OAAO,IAAMR,EAAmB,YAAaE,CAAO,EAAGO,CAAI,CAAA,CAE7E,EAEA,SAASC,EAAQ,CACf,SAAAC,EAAW,YACX,WAAAC,EAAa,GACb,YAAAC,EAAc,GACd,OAAAC,EAAS,GACT,cAAAC,EAAgB,EAChB,SAAAC,EAAW,IACX,GAAGC,CACL,EAAuB,CACrB,OACEtB,EAAAA,IAACuB,EAAAA,QAAA,CACE,GAAGD,EACJ,SAAAN,EACA,WAAAC,EACA,YAAAC,EACA,OAAAC,EACA,cAAAC,EACA,aAAc,CACZ,SAAAC,EACA,WAAY,CACV,MACE,mGACF,YAAa,wBACb,aAAc,aAAA,CAChB,CACF,CAAA,CAGN"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tour.cjs","sources":["../../../../src/components/Tour/Tour.tsx"],"sourcesContent":["\"use client\";\n\nimport { cn, Slot, useComposedRefs } from \"@dsui/ui/index\";\nimport {\n autoUpdate,\n flip,\n hide,\n limitShift,\n type Middleware,\n offset,\n arrow as onArrow,\n type Placement,\n shift,\n useFloating,\n} from \"@floating-ui/react-dom\";\nimport { ChevronLeft, ChevronRight, X } from \"lucide-react\";\nimport * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport { Button } from \"../Button\";\n\nconst ROOT_NAME = \"Tour\";\nconst PORTAL_NAME = \"TourPortal\";\nconst STEP_NAME = \"TourStep\";\nconst ARROW_NAME = \"TourArrow\";\nconst HEADER_NAME = \"TourHeader\";\nconst TITLE_NAME = \"TourTitle\";\nconst DESCRIPTION_NAME = \"TourDescription\";\nconst CLOSE_NAME = \"TourClose\";\nconst PREV_NAME = \"TourPrev\";\nconst NEXT_NAME = \"TourNext\";\nconst SKIP_NAME = \"TourSkip\";\nconst FOOTER_NAME = \"TourFooter\";\n\nconst POINTER_DOWN_OUTSIDE = \"tour.pointerDownOutside\";\nconst INTERACT_OUTSIDE = \"tour.interactOutside\";\nconst OPEN_AUTO_FOCUS = \"tour.openAutoFocus\";\nconst CLOSE_AUTO_FOCUS = \"tour.closeAutoFocus\";\nconst EVENT_OPTIONS = { bubbles: false, cancelable: true };\n\nconst SIDE_OPTIONS = [\"top\", \"right\", \"bottom\", \"left\"] as const;\nconst ALIGN_OPTIONS = [\"start\", \"center\", \"end\"] as const;\n\nconst DEFAULT_ALIGN_OFFSET = 0;\nconst DEFAULT_SIDE_OFFSET = 16;\nconst DEFAULT_SPOTLIGHT_PADDING = 4;\n\ntype Side = (typeof SIDE_OPTIONS)[number];\ntype Align = (typeof ALIGN_OPTIONS)[number];\ntype Direction = \"ltr\" | \"rtl\";\n\ninterface ScrollOffset {\n top?: number;\n bottom?: number;\n left?: number;\n right?: number;\n}\n\ntype Boundary = Element | null;\n\ninterface DivProps extends React.ComponentProps<\"div\"> {\n asChild?: boolean;\n}\n\ntype StepElement = React.ComponentRef<typeof TourStep>;\ntype CloseElement = React.ComponentRef<typeof TourClose>;\ntype PrevElement = React.ComponentRef<typeof TourPrev>;\ntype NextElement = React.ComponentRef<typeof TourNext>;\ntype SkipElement = React.ComponentRef<typeof TourSkip>;\ntype FooterElement = React.ComponentRef<typeof TourFooter>;\n\nconst OPPOSITE_SIDE: Record<Side, Side> = {\n top: \"bottom\",\n right: \"left\",\n bottom: \"top\",\n left: \"right\",\n};\n\nconst useIsomorphicLayoutEffect =\n typeof window === \"undefined\" ? React.useEffect : React.useLayoutEffect;\n\nfunction useAsRef<T>(props: T) {\n const ref = React.useRef<T>(props);\n\n useIsomorphicLayoutEffect(() => {\n ref.current = props;\n });\n\n return ref;\n}\n\nfunction useLazyRef<T>(fn: () => T) {\n const ref = React.useRef<T | null>(null);\n\n if (ref.current === null) {\n ref.current = fn();\n }\n\n return ref as React.RefObject<T>;\n}\n\n/**\n * @see https://github.com/radix-ui/primitives/blob/main/packages/react/focus-guards/src/focus-guards.tsx\n */\nlet focusGuardCount = 0;\n\nfunction createFocusGuard() {\n const element = document.createElement(\"span\");\n element.setAttribute(\"data-tour-focus-guard\", \"\");\n element.tabIndex = 0;\n element.style.outline = \"none\";\n element.style.opacity = \"0\";\n element.style.position = \"fixed\";\n element.style.pointerEvents = \"none\";\n return element;\n}\n\nfunction useFocusGuards() {\n React.useEffect(() => {\n const edgeGuards = document.querySelectorAll(\"[data-tour-focus-guard]\");\n document.body.insertAdjacentElement(\n \"afterbegin\",\n edgeGuards[0] ?? createFocusGuard()\n );\n document.body.insertAdjacentElement(\n \"beforeend\",\n edgeGuards[1] ?? createFocusGuard()\n );\n focusGuardCount++;\n\n return () => {\n if (focusGuardCount === 1) {\n const guards = document.querySelectorAll(\"[data-tour-focus-guard]\");\n for (const node of guards) {\n node.remove();\n }\n }\n focusGuardCount--;\n };\n }, []);\n}\n\nfunction useFocusTrap(\n containerRef: React.RefObject<HTMLElement | null>,\n enabled: boolean,\n tourOpen: boolean,\n onOpenAutoFocus?: (event: OpenAutoFocusEvent) => void,\n onCloseAutoFocus?: (event: CloseAutoFocusEvent) => void\n) {\n const lastFocusedElementRef = React.useRef<HTMLElement | null>(null);\n const onOpenAutoFocusRef = useAsRef(onOpenAutoFocus);\n const onCloseAutoFocusRef = useAsRef(onCloseAutoFocus);\n const tourOpenRef = useAsRef(tourOpen);\n\n React.useEffect(() => {\n if (!enabled) return;\n\n const container = containerRef.current;\n if (!container) return;\n\n const previouslyFocusedElement =\n document.activeElement as HTMLElement | null;\n\n function getTabbableCandidates() {\n if (!container) return [];\n\n const nodes: HTMLElement[] = [];\n const walker = document.createTreeWalker(\n container,\n NodeFilter.SHOW_ELEMENT,\n {\n acceptNode: (node: Element) => {\n const element = node as HTMLElement;\n const isHiddenInput =\n element.tagName === \"INPUT\" &&\n (element as HTMLInputElement).type === \"hidden\";\n if (element.hidden || isHiddenInput) return NodeFilter.FILTER_SKIP;\n return element.tabIndex >= 0\n ? NodeFilter.FILTER_ACCEPT\n : NodeFilter.FILTER_SKIP;\n },\n }\n );\n while (walker.nextNode()) {\n nodes.push(walker.currentNode as HTMLElement);\n }\n return nodes;\n }\n\n function getTabbableEdges() {\n const candidates = getTabbableCandidates();\n const first = candidates[0];\n const last = candidates[candidates.length - 1];\n return [first, last] as const;\n }\n\n function onFocusIn(event: FocusEvent) {\n if (!container) return;\n\n const target = event.target as HTMLElement | null;\n if (container.contains(target)) {\n lastFocusedElementRef.current = target;\n } else {\n const elementToFocus =\n lastFocusedElementRef.current ?? getTabbableCandidates()[0];\n elementToFocus?.focus({ preventScroll: true });\n }\n }\n\n function onKeyDown(event: KeyboardEvent) {\n if (event.key !== \"Tab\" || event.altKey || event.ctrlKey || event.metaKey)\n return;\n\n const [first, last] = getTabbableEdges();\n const hasTabbableElements = first && last;\n\n if (!hasTabbableElements) {\n if (document.activeElement === container) event.preventDefault();\n return;\n }\n\n if (!event.shiftKey && document.activeElement === last) {\n event.preventDefault();\n first?.focus({ preventScroll: true });\n } else if (event.shiftKey && document.activeElement === first) {\n event.preventDefault();\n last?.focus({ preventScroll: true });\n }\n }\n\n const openAutoFocusEvent = new CustomEvent(OPEN_AUTO_FOCUS, EVENT_OPTIONS);\n if (onOpenAutoFocusRef.current) {\n container.addEventListener(\n OPEN_AUTO_FOCUS,\n onOpenAutoFocusRef.current as EventListener,\n { once: true }\n );\n }\n container.dispatchEvent(openAutoFocusEvent);\n\n if (!openAutoFocusEvent.defaultPrevented) {\n const tabbableCandidates = getTabbableCandidates();\n if (tabbableCandidates.length > 0) {\n tabbableCandidates[0]?.focus({ preventScroll: true });\n } else {\n container.focus({ preventScroll: true });\n }\n }\n\n document.addEventListener(\"focusin\", onFocusIn);\n container.addEventListener(\"keydown\", onKeyDown);\n\n return () => {\n document.removeEventListener(\"focusin\", onFocusIn);\n container.removeEventListener(\"keydown\", onKeyDown);\n\n if (!tourOpenRef.current) {\n setTimeout(() => {\n const closeAutoFocusEvent = new CustomEvent(\n CLOSE_AUTO_FOCUS,\n EVENT_OPTIONS\n );\n if (onCloseAutoFocusRef.current) {\n container.addEventListener(\n CLOSE_AUTO_FOCUS,\n onCloseAutoFocusRef.current as EventListener,\n { once: true }\n );\n }\n container.dispatchEvent(closeAutoFocusEvent);\n\n if (!closeAutoFocusEvent.defaultPrevented) {\n if (\n previouslyFocusedElement &&\n document.body.contains(previouslyFocusedElement)\n ) {\n previouslyFocusedElement.focus({ preventScroll: true });\n }\n }\n\n if (onCloseAutoFocusRef.current) {\n container.removeEventListener(\n CLOSE_AUTO_FOCUS,\n onCloseAutoFocusRef.current as EventListener\n );\n }\n }, 0);\n }\n };\n }, [\n containerRef,\n enabled,\n onOpenAutoFocusRef,\n onCloseAutoFocusRef,\n tourOpenRef,\n ]);\n}\n\nconst DirectionContext = React.createContext<Direction | undefined>(undefined);\n\nfunction useDirection(dirProp?: Direction): Direction {\n const contextDir = React.useContext(DirectionContext);\n return dirProp ?? contextDir ?? \"ltr\";\n}\n\nfunction getDataState(open: boolean): string {\n return open ? \"open\" : \"closed\";\n}\n\ninterface StepData {\n target: string | React.RefObject<HTMLElement> | HTMLElement;\n align?: Align;\n alignOffset?: number;\n side?: Side;\n sideOffset?: number;\n collisionBoundary?: Boundary | Boundary[];\n collisionPadding?: number | Partial<Record<Side, number>>;\n arrowPadding?: number;\n sticky?: \"partial\" | \"always\";\n hideWhenDetached?: boolean;\n avoidCollisions?: boolean;\n onStepEnter?: () => void;\n onStepLeave?: () => void;\n required?: boolean;\n}\n\ninterface StoreState {\n open: boolean;\n value: number;\n steps: StepData[];\n maskPath: string;\n spotlightRect: { x: number; y: number; width: number; height: number } | null;\n}\n\ninterface Store {\n subscribe: (callback: () => void) => () => void;\n getState: () => StoreState;\n setState: <K extends keyof StoreState>(\n key: K,\n value: StoreState[K],\n opts?: unknown\n ) => void;\n notify: () => void;\n addStep: (stepData: StepData) => { id: string; index: number };\n removeStep: (id: string) => void;\n}\n\nfunction useStore<T>(selector: (state: StoreState) => T): T {\n const store = useStoreContext(\"useStore\");\n\n const getSnapshot = React.useCallback(\n () => selector(store.getState()),\n [store, selector]\n );\n\n return React.useSyncExternalStore(store.subscribe, getSnapshot, getSnapshot);\n}\n\nfunction getTargetElement(\n target: string | React.RefObject<HTMLElement> | HTMLElement\n): HTMLElement | null {\n if (typeof target === \"string\") {\n return document.querySelector(target);\n }\n if (target && \"current\" in target) {\n return target.current;\n }\n if (target instanceof HTMLElement) {\n return target;\n }\n return null;\n}\n\nfunction getDefaultScrollBehavior(): ScrollBehavior {\n if (typeof window === \"undefined\") return \"smooth\";\n return window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches\n ? \"auto\"\n : \"smooth\";\n}\n\nfunction onScrollToElement(\n element: HTMLElement,\n scrollBehavior: ScrollBehavior = getDefaultScrollBehavior(),\n scrollOffset?: ScrollOffset\n) {\n const offset: Required<ScrollOffset> = {\n top: 100,\n bottom: 100,\n left: 0,\n right: 0,\n ...scrollOffset,\n };\n const rect = element.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n const viewportWidth = window.innerWidth;\n\n const isInViewport =\n rect.top >= offset.top &&\n rect.bottom <= viewportHeight - offset.bottom &&\n rect.left >= offset.left &&\n rect.right <= viewportWidth - offset.right;\n\n if (!isInViewport) {\n const elementTop = rect.top + window.scrollY;\n const scrollTop = elementTop - offset.top;\n\n window.scrollTo({\n top: Math.max(0, scrollTop),\n behavior: scrollBehavior,\n });\n }\n}\n\nfunction getSideAndAlignFromPlacement(placement: Placement): [Side, Align] {\n const [side, align = \"center\"] = placement.split(\"-\") as [Side, Align?];\n return [side, align];\n}\n\nfunction getPlacement(side: Side, align: Align): Placement {\n if (align === \"center\") {\n return side as Placement;\n }\n return `${side}-${align}` as Placement;\n}\n\nfunction updateMask(\n store: Store,\n targetElement: HTMLElement,\n padding: number = DEFAULT_SPOTLIGHT_PADDING\n) {\n const clientRect = targetElement.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n const x = Math.max(0, clientRect.left - padding);\n const y = Math.max(0, clientRect.top - padding);\n const width = Math.min(viewportWidth - x, clientRect.width + padding * 2);\n const height = Math.min(viewportHeight - y, clientRect.height + padding * 2);\n\n const path = `polygon(0% 0%, 0% 100%, ${x}px 100%, ${x}px ${y}px, ${x + width}px ${y}px, ${x + width}px ${y + height}px, ${x}px ${y + height}px, ${x}px 100%, 100% 100%, 100% 0%)`;\n store.setState(\"maskPath\", path);\n store.setState(\"spotlightRect\", { x, y, width, height });\n}\n\nconst StoreContext = React.createContext<Store | null>(null);\n\nfunction useStoreContext(consumerName: string) {\n const context = React.useContext(StoreContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ROOT_NAME}\\``);\n }\n return context;\n}\n\ninterface TourContextValue {\n dir: Direction;\n alignOffset: number;\n sideOffset: number;\n spotlightPadding: number;\n dismissible: boolean;\n modal: boolean;\n stepFooter?: React.ReactElement;\n onPointerDownOutside?: (event: PointerDownOutsideEvent) => void;\n onInteractOutside?: (event: InteractOutsideEvent) => void;\n onOpenAutoFocus?: (event: OpenAutoFocusEvent) => void;\n onCloseAutoFocus?: (event: CloseAutoFocusEvent) => void;\n}\n\nconst TourContext = React.createContext<TourContextValue | null>(null);\n\nfunction useTourContext(consumerName: string) {\n const context = React.useContext(TourContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ROOT_NAME}\\``);\n }\n return context;\n}\n\ninterface StepContextValue {\n arrowX?: number;\n arrowY?: number;\n placedAlign: Align;\n placedSide: Side;\n shouldHideArrow: boolean;\n onArrowChange: (arrow: HTMLSpanElement | null) => void;\n onFooterChange: (footer: FooterElement | null) => void;\n}\n\nconst StepContext = React.createContext<StepContextValue | null>(null);\n\nfunction useStepContext(consumerName: string) {\n const context = React.useContext(StepContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${STEP_NAME}\\``);\n }\n return context;\n}\n\nconst DefaultFooterContext = React.createContext(false);\n\ninterface PortalContextValue {\n portal: HTMLElement | null;\n onPortalChange: (node: HTMLElement | null) => void;\n}\n\nconst PortalContext = React.createContext<PortalContextValue | null>(null);\n\nfunction usePortalContext(consumerName: string) {\n const context = React.useContext(PortalContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ROOT_NAME}\\``);\n }\n return context;\n}\n\nfunction useScrollLock(enabled: boolean) {\n React.useEffect(() => {\n if (!enabled) return;\n\n const originalStyle = window.getComputedStyle(document.body).overflow;\n const scrollbarWidth =\n window.innerWidth - document.documentElement.clientWidth;\n\n document.body.style.overflow = \"hidden\";\n if (scrollbarWidth > 0) {\n document.body.style.paddingRight = `${scrollbarWidth}px`;\n }\n\n return () => {\n document.body.style.overflow = originalStyle;\n document.body.style.paddingRight = \"\";\n };\n }, [enabled]);\n}\n\ntype PointerDownOutsideEvent = CustomEvent<{ originalEvent: PointerEvent }>;\ntype InteractOutsideEvent = CustomEvent<{\n originalEvent: PointerEvent | FocusEvent;\n}>;\ntype OpenAutoFocusEvent = CustomEvent<Record<string, never>>;\ntype CloseAutoFocusEvent = CustomEvent<Record<string, never>>;\n\ninterface TourRootProps extends DivProps {\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n value?: number;\n defaultValue?: number;\n onValueChange?: (step: number) => void;\n onComplete?: () => void;\n onSkip?: () => void;\n onEscapeKeyDown?: (event: KeyboardEvent) => void;\n onPointerDownOutside?: (event: PointerDownOutsideEvent) => void;\n onInteractOutside?: (event: InteractOutsideEvent) => void;\n onOpenAutoFocus?: (event: OpenAutoFocusEvent) => void;\n onCloseAutoFocus?: (event: CloseAutoFocusEvent) => void;\n dir?: Direction;\n alignOffset?: number;\n sideOffset?: number;\n spotlightPadding?: number;\n autoScroll?: boolean;\n scrollBehavior?: ScrollBehavior;\n scrollOffset?: ScrollOffset;\n dismissible?: boolean;\n modal?: boolean;\n stepFooter?: React.ReactElement;\n}\n\nfunction TourRoot(props: TourRootProps) {\n const {\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n value: valueProp,\n defaultValue = 0,\n onValueChange,\n onComplete,\n onSkip,\n autoScroll = true,\n scrollBehavior = getDefaultScrollBehavior(),\n scrollOffset,\n ...rootProps\n } = props;\n\n const stateRef = useLazyRef<StoreState>(() => ({\n open: openProp ?? defaultOpen,\n value: valueProp ?? defaultValue,\n steps: [],\n maskPath: \"\",\n spotlightRect: null,\n }));\n const listenersRef = useLazyRef<Set<() => void>>(() => new Set());\n const stepIdsMapRef = useLazyRef<Map<string, number>>(() => new Map());\n const stepIdCounterRef = useLazyRef(() => ({ current: 0 }));\n const propsRef = useAsRef({\n valueProp,\n onOpenChange,\n onValueChange,\n onComplete,\n onSkip,\n autoScroll,\n scrollBehavior,\n scrollOffset,\n });\n\n const store: Store = React.useMemo(\n () => ({\n subscribe: (cb) => {\n listenersRef.current.add(cb);\n return () => listenersRef.current.delete(cb);\n },\n getState: () => {\n return stateRef.current;\n },\n setState: (key, value) => {\n if (Object.is(stateRef.current[key], value)) return;\n stateRef.current[key] = value;\n\n if (key === \"open\" && typeof value === \"boolean\") {\n propsRef.current.onOpenChange?.(value);\n\n if (value) {\n if (stateRef.current.steps.length > 0) {\n if (stateRef.current.value >= stateRef.current.steps.length) {\n store.setState(\"value\", 0);\n }\n }\n } else {\n if (\n stateRef.current.value <\n (stateRef.current.steps.length || 0) - 1\n ) {\n propsRef.current.onSkip?.();\n }\n }\n } else if (key === \"value\" && typeof value === \"number\") {\n const prevStep = stateRef.current.steps[stateRef.current.value];\n const nextStep = stateRef.current.steps[value];\n\n prevStep?.onStepLeave?.();\n nextStep?.onStepEnter?.();\n\n if (value >= stateRef.current.steps.length) {\n propsRef.current.onComplete?.();\n\n if (propsRef.current.valueProp !== undefined) {\n propsRef.current.onValueChange?.(value);\n }\n\n store.setState(\"open\", false);\n return;\n }\n\n if (propsRef.current.valueProp !== undefined) {\n propsRef.current.onValueChange?.(value);\n return;\n }\n\n propsRef.current.onValueChange?.(value);\n\n if (nextStep && propsRef.current.autoScroll) {\n const targetElement = getTargetElement(nextStep.target);\n if (targetElement) {\n onScrollToElement(\n targetElement,\n propsRef.current.scrollBehavior,\n propsRef.current.scrollOffset\n );\n }\n }\n }\n\n store.notify();\n },\n notify: () => {\n listenersRef.current.forEach((l) => {\n l();\n });\n },\n addStep: (stepData) => {\n const id = `step-${stepIdCounterRef.current.current++}`;\n const index = stateRef.current.steps.length;\n stepIdsMapRef.current.set(id, index);\n stateRef.current.steps = [...stateRef.current.steps, stepData];\n store.notify();\n return { id, index };\n },\n removeStep: (id) => {\n const index = stepIdsMapRef.current.get(id);\n if (index === undefined) return;\n\n stateRef.current.steps = stateRef.current.steps.filter(\n (_, i) => i !== index\n );\n\n stepIdsMapRef.current.delete(id);\n\n for (const [stepId, stepIndex] of stepIdsMapRef.current.entries()) {\n if (stepIndex > index) {\n stepIdsMapRef.current.set(stepId, stepIndex - 1);\n }\n }\n\n store.notify();\n },\n }),\n [stateRef, listenersRef, stepIdsMapRef, stepIdCounterRef, propsRef]\n );\n\n useIsomorphicLayoutEffect(() => {\n if (openProp !== undefined) {\n store.setState(\"open\", openProp);\n }\n }, [openProp, store]);\n\n useIsomorphicLayoutEffect(() => {\n if (valueProp !== undefined) {\n store.setState(\"value\", valueProp);\n }\n }, [valueProp, store]);\n\n return (\n <StoreContext.Provider value={store}>\n <TourRootImpl {...rootProps} />\n </StoreContext.Provider>\n );\n}\n\ninterface TourRootImplProps\n extends Omit<\n TourRootProps,\n | \"open\"\n | \"defaultOpen\"\n | \"onOpenChange\"\n | \"value\"\n | \"defaultValue\"\n | \"onValueChange\"\n | \"onComplete\"\n | \"onSkip\"\n | \"autoScroll\"\n | \"scrollBehavior\"\n | \"scrollOffset\"\n > {}\n\nfunction TourRootImpl(props: TourRootImplProps) {\n const {\n onEscapeKeyDown,\n onPointerDownOutside,\n onInteractOutside,\n onOpenAutoFocus,\n onCloseAutoFocus,\n dir: dirProp,\n alignOffset = DEFAULT_ALIGN_OFFSET,\n sideOffset = DEFAULT_SIDE_OFFSET,\n spotlightPadding = DEFAULT_SPOTLIGHT_PADDING,\n dismissible = true,\n modal = true,\n stepFooter,\n asChild,\n ...rootImplProps\n } = props;\n\n const store = useStoreContext(\"TourRootImpl\");\n const dir = useDirection(dirProp);\n\n const [portal, setPortal] = React.useState<HTMLElement | null>(null);\n const previouslyFocusedElementRef = React.useRef<HTMLElement | null>(null);\n\n const onEscapeKeyDownRef = useAsRef(onEscapeKeyDown);\n const onCloseAutoFocusRef = useAsRef(onCloseAutoFocus);\n\n React.useEffect(() => {\n function onKeyDown(event: KeyboardEvent) {\n if (store.getState().open && event.key === \"Escape\") {\n if (onEscapeKeyDownRef.current) {\n onEscapeKeyDownRef.current(event);\n if (event.defaultPrevented) return;\n }\n store.setState(\"open\", false);\n }\n }\n\n document.addEventListener(\"keydown\", onKeyDown);\n return () => document.removeEventListener(\"keydown\", onKeyDown);\n }, [store, onEscapeKeyDownRef]);\n\n const open = useStore((state) => state.open);\n const prevOpenRef = React.useRef<boolean | undefined>(undefined);\n\n useIsomorphicLayoutEffect(() => {\n const wasOpen = prevOpenRef.current;\n\n if (open && !wasOpen) {\n previouslyFocusedElementRef.current =\n document.activeElement as HTMLElement | null;\n } else if (!open && wasOpen) {\n setTimeout(() => {\n const container = portal ?? document.body;\n const closeAutoFocusEvent = new CustomEvent(\n CLOSE_AUTO_FOCUS,\n EVENT_OPTIONS\n );\n\n if (onCloseAutoFocusRef.current) {\n container.addEventListener(\n CLOSE_AUTO_FOCUS,\n onCloseAutoFocusRef.current as EventListener,\n { once: true }\n );\n }\n container.dispatchEvent(closeAutoFocusEvent);\n\n if (!closeAutoFocusEvent.defaultPrevented) {\n const elementToFocus = previouslyFocusedElementRef.current;\n if (elementToFocus && document.body.contains(elementToFocus)) {\n elementToFocus.focus({ preventScroll: true });\n }\n }\n\n previouslyFocusedElementRef.current = null;\n }, 0);\n }\n\n prevOpenRef.current = open;\n }, [open, portal, onCloseAutoFocusRef]);\n\n const contextValue = React.useMemo<TourContextValue>(\n () => ({\n dir,\n alignOffset,\n sideOffset,\n spotlightPadding,\n dismissible,\n modal,\n stepFooter,\n onPointerDownOutside,\n onInteractOutside,\n onOpenAutoFocus,\n onCloseAutoFocus,\n }),\n [\n dir,\n alignOffset,\n sideOffset,\n spotlightPadding,\n dismissible,\n modal,\n stepFooter,\n onPointerDownOutside,\n onInteractOutside,\n onOpenAutoFocus,\n onCloseAutoFocus,\n ]\n );\n\n const portalContextValue = React.useMemo<PortalContextValue>(\n () => ({\n portal,\n onPortalChange: setPortal,\n }),\n [portal]\n );\n\n useScrollLock(open && modal);\n\n const RootPrimitive = asChild ? Slot : \"div\";\n\n return (\n <TourContext.Provider value={contextValue}>\n <PortalContext.Provider value={portalContextValue}>\n <RootPrimitive data-slot=\"tour\" dir={dir} {...rootImplProps} />\n </PortalContext.Provider>\n </TourContext.Provider>\n );\n}\n\ninterface TourStepProps extends DivProps {\n target: string | React.RefObject<HTMLElement> | HTMLElement;\n side?: Side;\n sideOffset?: number;\n align?: Align;\n alignOffset?: number;\n collisionBoundary?: Boundary | Boundary[];\n collisionPadding?: number | Partial<Record<Side, number>>;\n arrowPadding?: number;\n sticky?: \"partial\" | \"always\";\n hideWhenDetached?: boolean;\n avoidCollisions?: boolean;\n required?: boolean;\n forceMount?: boolean;\n onStepEnter?: () => void;\n onStepLeave?: () => void;\n}\n\nfunction TourStep(props: TourStepProps) {\n const {\n target,\n side = \"bottom\",\n sideOffset,\n align = \"center\",\n alignOffset,\n collisionBoundary = [],\n collisionPadding = 0,\n arrowPadding = 0,\n sticky = \"partial\",\n hideWhenDetached = false,\n avoidCollisions = true,\n required = false,\n forceMount = false,\n onStepEnter,\n onStepLeave,\n onPointerDownCapture: onPointerDownCaptureProp,\n onFocusCapture: onFocusCaptureProp,\n onBlurCapture: onBlurCaptureProp,\n children,\n className,\n style,\n asChild,\n ...stepProps\n } = props;\n\n const store = useStoreContext(STEP_NAME);\n\n const [arrow, setArrow] = React.useState<HTMLSpanElement | null>(null);\n const [footer, setFooter] = React.useState<FooterElement | null>(null);\n\n const stepRef = React.useRef<StepElement | null>(null);\n const stepIdRef = React.useRef<string>(\"\");\n const stepOrderRef = React.useRef<number>(-1);\n const isPointerInsideReactTreeRef = React.useRef(false);\n const isFocusInsideReactTreeRef = React.useRef(false);\n\n const open = useStore((state) => state.open);\n const value = useStore((state) => state.value);\n const steps = useStore((state) => state.steps);\n const context = useTourContext(STEP_NAME);\n\n const resolvedSideOffset = sideOffset ?? context.sideOffset;\n const resolvedAlignOffset = alignOffset ?? context.alignOffset;\n\n useIsomorphicLayoutEffect(() => {\n const { id, index } = store.addStep({\n target,\n align,\n alignOffset: resolvedAlignOffset,\n side,\n sideOffset: resolvedSideOffset,\n collisionBoundary,\n collisionPadding,\n arrowPadding,\n sticky,\n hideWhenDetached,\n avoidCollisions,\n onStepEnter,\n onStepLeave,\n required,\n });\n stepIdRef.current = id;\n stepOrderRef.current = index;\n\n return () => {\n store.removeStep(stepIdRef.current);\n };\n }, [\n target,\n side,\n resolvedSideOffset,\n align,\n resolvedAlignOffset,\n collisionPadding,\n arrowPadding,\n sticky,\n hideWhenDetached,\n avoidCollisions,\n required,\n onStepEnter,\n onStepLeave,\n store,\n ]);\n\n const stepData = steps[value];\n const targetElement = stepData ? getTargetElement(stepData.target) : null;\n\n const isCurrentStep = stepOrderRef.current === value;\n\n const middleware = React.useMemo(() => {\n if (!stepData) return [];\n\n const mainAxisOffset = stepData.sideOffset ?? resolvedSideOffset;\n const crossAxisOffset = stepData.alignOffset ?? resolvedAlignOffset;\n\n const padding =\n typeof stepData.collisionPadding === \"number\"\n ? stepData.collisionPadding\n : {\n top: stepData.collisionPadding?.top ?? 0,\n right: stepData.collisionPadding?.right ?? 0,\n bottom: stepData.collisionPadding?.bottom ?? 0,\n left: stepData.collisionPadding?.left ?? 0,\n };\n\n const boundary = Array.isArray(stepData.collisionBoundary)\n ? stepData.collisionBoundary\n : stepData.collisionBoundary\n ? [stepData.collisionBoundary]\n : [];\n const hasExplicitBoundaries = boundary.length > 0;\n\n const detectOverflowOptions = {\n padding,\n boundary: boundary.filter((b): b is Element => b !== null),\n altBoundary: hasExplicitBoundaries,\n };\n\n return [\n offset({\n mainAxis: mainAxisOffset,\n alignmentAxis: crossAxisOffset,\n }),\n stepData.avoidCollisions &&\n shift({\n mainAxis: true,\n crossAxis: false,\n limiter: stepData.sticky === \"partial\" ? limitShift() : undefined,\n ...detectOverflowOptions,\n }),\n stepData.avoidCollisions && flip({ ...detectOverflowOptions }),\n arrow && onArrow({ element: arrow, padding: stepData.arrowPadding }),\n stepData.hideWhenDetached &&\n hide({\n strategy: \"referenceHidden\",\n ...detectOverflowOptions,\n }),\n ].filter(Boolean) as Middleware[];\n }, [stepData, resolvedSideOffset, resolvedAlignOffset, arrow]);\n\n const placement = getPlacement(\n stepData?.side ?? side,\n stepData?.align ?? align\n );\n\n const {\n refs,\n floatingStyles,\n placement: finalPlacement,\n middlewareData,\n } = useFloating({\n placement,\n middleware,\n strategy: \"fixed\",\n whileElementsMounted: autoUpdate,\n elements: {\n reference: targetElement,\n },\n });\n\n const composedRef = useComposedRefs(refs.setFloating, stepRef);\n\n const [placedSide, placedAlign] =\n getSideAndAlignFromPlacement(finalPlacement);\n\n const arrowX = middlewareData.arrow?.x;\n const arrowY = middlewareData.arrow?.y;\n const cannotCenterArrow = middlewareData.arrow?.centerOffset !== 0;\n const isHidden = hideWhenDetached && middlewareData.hide?.referenceHidden;\n\n const stepContextValue = React.useMemo<StepContextValue>(\n () => ({\n arrowX,\n arrowY,\n placedAlign,\n placedSide,\n shouldHideArrow: cannotCenterArrow,\n onArrowChange: setArrow,\n onFooterChange: setFooter,\n }),\n [arrowX, arrowY, placedSide, placedAlign, cannotCenterArrow]\n );\n\n React.useEffect(() => {\n if (open && targetElement && isCurrentStep) {\n updateMask(store, targetElement, context.spotlightPadding);\n\n let rafId: number | null = null;\n\n function onResize() {\n if (targetElement) {\n updateMask(store, targetElement, context.spotlightPadding);\n }\n }\n\n function onScroll() {\n if (rafId !== null) return;\n rafId = requestAnimationFrame(() => {\n if (targetElement) {\n updateMask(store, targetElement, context.spotlightPadding);\n }\n rafId = null;\n });\n }\n\n window.addEventListener(\"resize\", onResize);\n window.addEventListener(\"scroll\", onScroll, { passive: true });\n return () => {\n window.removeEventListener(\"resize\", onResize);\n window.removeEventListener(\"scroll\", onScroll);\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n }\n };\n }\n }, [open, targetElement, isCurrentStep, store, context.spotlightPadding]);\n\n React.useEffect(() => {\n if (!open || !isCurrentStep) return;\n\n const stepElement = stepRef.current;\n if (!stepElement) return;\n\n const ownerDocument = stepElement.ownerDocument;\n\n function onPointerDown(event: PointerEvent) {\n if (event.target && !isPointerInsideReactTreeRef.current) {\n const pointerDownOutsideEvent = new CustomEvent(POINTER_DOWN_OUTSIDE, {\n ...EVENT_OPTIONS,\n detail: { originalEvent: event },\n });\n\n context.onPointerDownOutside?.(pointerDownOutsideEvent);\n\n const interactOutsideEvent = new CustomEvent(INTERACT_OUTSIDE, {\n ...EVENT_OPTIONS,\n detail: { originalEvent: event },\n });\n context.onInteractOutside?.(interactOutsideEvent);\n\n if (\n !pointerDownOutsideEvent.defaultPrevented &&\n !interactOutsideEvent.defaultPrevented &&\n context.dismissible\n ) {\n store.setState(\"open\", false);\n }\n }\n\n isPointerInsideReactTreeRef.current = false;\n }\n\n const timerId = window.setTimeout(() => {\n ownerDocument.addEventListener(\"pointerdown\", onPointerDown);\n }, 0);\n\n return () => {\n window.clearTimeout(timerId);\n ownerDocument.removeEventListener(\"pointerdown\", onPointerDown);\n };\n }, [open, isCurrentStep, store, context]);\n\n React.useEffect(() => {\n if (!open || !isCurrentStep) return;\n\n const stepElement = stepRef.current;\n if (!stepElement) return;\n\n const ownerDocument = stepElement.ownerDocument;\n\n function onFocusIn(event: FocusEvent) {\n const target = event.target as HTMLElement;\n\n const isFocusInStep = stepElement?.contains(target);\n const isFocusInTarget = targetElement?.contains(target);\n\n if (\n event.target &&\n !isFocusInsideReactTreeRef.current &&\n !isFocusInStep &&\n !isFocusInTarget\n ) {\n const interactOutsideEvent = new CustomEvent(INTERACT_OUTSIDE, {\n ...EVENT_OPTIONS,\n detail: { originalEvent: event },\n });\n\n context.onInteractOutside?.(interactOutsideEvent);\n\n if (!interactOutsideEvent.defaultPrevented && context.dismissible) {\n store.setState(\"open\", false);\n }\n }\n }\n\n ownerDocument.addEventListener(\"focusin\", onFocusIn);\n\n return () => {\n ownerDocument.removeEventListener(\"focusin\", onFocusIn);\n };\n }, [open, isCurrentStep, store, context, targetElement]);\n\n const onPointerDownCapture = React.useCallback(\n (event: React.PointerEvent<StepElement>) => {\n onPointerDownCaptureProp?.(event);\n isPointerInsideReactTreeRef.current = true;\n },\n [onPointerDownCaptureProp]\n );\n\n const onFocusCapture = React.useCallback(\n (event: React.FocusEvent<StepElement>) => {\n onFocusCaptureProp?.(event);\n isFocusInsideReactTreeRef.current = true;\n },\n [onFocusCaptureProp]\n );\n\n const onBlurCapture = React.useCallback(\n (event: React.FocusEvent<StepElement>) => {\n onBlurCaptureProp?.(event);\n isFocusInsideReactTreeRef.current = false;\n },\n [onBlurCaptureProp]\n );\n\n React.useEffect(() => {\n if (!open || !isCurrentStep || !targetElement) return;\n\n function onTargetPointerDownCapture() {\n isPointerInsideReactTreeRef.current = true;\n }\n\n function onTargetFocusCapture() {\n isFocusInsideReactTreeRef.current = true;\n }\n\n function onTargetBlurCapture() {\n isFocusInsideReactTreeRef.current = false;\n }\n\n targetElement.addEventListener(\n \"pointerdown\",\n onTargetPointerDownCapture,\n true\n );\n targetElement.addEventListener(\"focus\", onTargetFocusCapture, true);\n targetElement.addEventListener(\"blur\", onTargetBlurCapture, true);\n\n return () => {\n targetElement.removeEventListener(\n \"pointerdown\",\n onTargetPointerDownCapture,\n true\n );\n targetElement.removeEventListener(\"focus\", onTargetFocusCapture, true);\n targetElement.removeEventListener(\"blur\", onTargetBlurCapture, true);\n };\n }, [open, isCurrentStep, targetElement]);\n\n useFocusGuards();\n useFocusTrap(\n stepRef,\n open && isCurrentStep,\n open,\n context.onOpenAutoFocus,\n context.onCloseAutoFocus\n );\n\n if (!open || !stepData || (!targetElement && !forceMount) || !isCurrentStep) {\n return null;\n }\n\n const StepPrimitive = asChild ? Slot : \"div\";\n\n return (\n <StepContext.Provider value={stepContextValue}>\n <StepPrimitive\n ref={composedRef}\n data-slot=\"tour-step\"\n data-side={placedSide}\n data-align={placedAlign}\n dir={context.dir}\n tabIndex={-1}\n {...stepProps}\n onPointerDownCapture={onPointerDownCapture}\n onFocusCapture={onFocusCapture}\n onBlurCapture={onBlurCapture}\n className={cn(\n \"fixed z-50 flex w-80 flex-col gap-4 rounded-lg border bg-popover p-4 text-popover-foreground shadow-md outline-none\",\n className\n )}\n style={{\n ...style,\n ...floatingStyles,\n visibility: isHidden ? \"hidden\" : undefined,\n pointerEvents: isHidden ? \"none\" : undefined,\n }}\n >\n {children}\n {!footer && (\n <DefaultFooterContext.Provider value={true}>\n {context.stepFooter}\n </DefaultFooterContext.Provider>\n )}\n </StepPrimitive>\n </StepContext.Provider>\n );\n}\n\ninterface TourSpotlightProps extends DivProps {\n forceMount?: boolean;\n}\n\nfunction TourSpotlight(props: TourSpotlightProps) {\n const {\n asChild,\n className,\n style,\n forceMount = false,\n ...backdropProps\n } = props;\n\n const open = useStore((state) => state.open);\n const maskPath = useStore((state) => state.maskPath);\n\n if (!open && !forceMount) return null;\n\n const SpotlightPrimitive = asChild ? Slot : \"div\";\n\n return (\n <SpotlightPrimitive\n data-slot=\"tour-spotlight\"\n data-state={getDataState(open)}\n {...backdropProps}\n className={cn(\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-40 bg-black/80 data-[state=closed]:animate-out data-[state=open]:animate-in\",\n className\n )}\n style={{\n clipPath: maskPath,\n ...style,\n }}\n />\n );\n}\n\ninterface TourSpotlightRingProps extends DivProps {\n forceMount?: boolean;\n}\n\nfunction TourSpotlightRing(props: TourSpotlightRingProps) {\n const { asChild, className, style, forceMount = false, ...ringProps } = props;\n\n const open = useStore((state) => state.open);\n const spotlightRect = useStore((state) => state.spotlightRect);\n\n if (!open && !forceMount) return null;\n if (!spotlightRect) return null;\n\n const RingPrimitive = asChild ? Slot : \"div\";\n\n return (\n <RingPrimitive\n data-slot=\"tour-spotlight-ring\"\n data-state={getDataState(open)}\n {...ringProps}\n className={cn(\n \"pointer-events-none fixed z-40 border-ring ring-[3px] ring-ring/50\",\n className\n )}\n style={{\n left: spotlightRect.x,\n top: spotlightRect.y,\n width: spotlightRect.width,\n height: spotlightRect.height,\n ...style,\n }}\n />\n );\n}\n\ninterface TourPortalProps {\n children?: React.ReactNode;\n container?: HTMLElement | null;\n}\n\nfunction TourPortal(props: TourPortalProps) {\n const { children, container } = props;\n\n const portalContext = usePortalContext(PORTAL_NAME);\n\n const [mounted, setMounted] = React.useState(false);\n\n useIsomorphicLayoutEffect(() => {\n setMounted(true);\n\n const node = container ?? document.body;\n\n portalContext?.onPortalChange(node);\n return () => {\n portalContext?.onPortalChange(null);\n };\n }, [container, portalContext]);\n\n if (!mounted) return null;\n\n const portalContainer = container ?? portalContext?.portal ?? document.body;\n\n return ReactDOM.createPortal(children, portalContainer);\n}\n\ninterface TourArrowProps extends React.ComponentProps<\"svg\"> {\n width?: number;\n height?: number;\n asChild?: boolean;\n}\n\nfunction TourArrow(props: TourArrowProps) {\n const {\n width = 10,\n height = 5,\n className,\n children,\n asChild,\n ...arrowProps\n } = props;\n\n const stepContext = useStepContext(ARROW_NAME);\n const baseSide = OPPOSITE_SIDE[stepContext.placedSide];\n\n return (\n <span\n ref={stepContext.onArrowChange}\n data-slot=\"tour-arrow\"\n style={{\n position: \"absolute\",\n left:\n stepContext.arrowX != null ? `${stepContext.arrowX}px` : undefined,\n top: stepContext.arrowY != null ? `${stepContext.arrowY}px` : undefined,\n [baseSide]: 0,\n transformOrigin: {\n top: \"\",\n right: \"0 0\",\n bottom: \"center 0\",\n left: \"100% 0\",\n }[stepContext.placedSide],\n transform: {\n top: \"translateY(100%)\",\n right: \"translateY(50%) rotate(90deg) translateX(-50%)\",\n bottom: \"rotate(180deg)\",\n left: \"translateY(50%) rotate(-90deg) translateX(50%)\",\n }[stepContext.placedSide],\n visibility: stepContext.shouldHideArrow ? \"hidden\" : undefined,\n }}\n >\n <svg\n viewBox=\"0 0 30 10\"\n preserveAspectRatio=\"none\"\n width={width}\n height={height}\n {...arrowProps}\n className={cn(\"block fill-popover stroke-border\", className)}\n >\n {asChild ? children : <polygon points=\"0,0 30,0 15,10\" />}\n </svg>\n </span>\n );\n}\n\nfunction TourHeader(props: DivProps) {\n const { asChild, className, ...headerProps } = props;\n\n const context = useTourContext(HEADER_NAME);\n\n const HeaderPrimitive = asChild ? Slot : \"div\";\n\n return (\n <HeaderPrimitive\n data-slot=\"tour-header\"\n dir={context.dir}\n {...headerProps}\n className={cn(\n \"flex flex-col gap-1.5 text-center sm:text-left\",\n className\n )}\n />\n );\n}\n\nfunction TourTitle(props: DivProps) {\n const { asChild, className, ...titleProps } = props;\n\n const context = useTourContext(TITLE_NAME);\n\n const TitlePrimitive = asChild ? Slot : \"div\";\n\n return (\n <TitlePrimitive\n data-slot=\"tour-title\"\n dir={context.dir}\n {...titleProps}\n className={cn(\n \"font-semibold text-lg leading-none tracking-tight\",\n className\n )}\n />\n );\n}\n\nfunction TourDescription(props: DivProps) {\n const { asChild, className, ...descriptionProps } = props;\n\n const context = useTourContext(DESCRIPTION_NAME);\n\n const DescriptionPrimitive = asChild ? Slot : \"div\";\n\n return (\n <DescriptionPrimitive\n data-slot=\"tour-description\"\n dir={context.dir}\n {...descriptionProps}\n className={cn(\"text-muted-foreground text-sm\", className)}\n />\n );\n}\n\ninterface TourCloseProps extends React.ComponentProps<\"button\"> {\n asChild?: boolean;\n}\n\nfunction TourClose(props: TourCloseProps) {\n const {\n asChild,\n className,\n onClick: onClickProp,\n ...closeButtonProps\n } = props;\n\n const store = useStoreContext(CLOSE_NAME);\n\n const onClick = React.useCallback(\n (event: React.MouseEvent<CloseElement>) => {\n onClickProp?.(event);\n if (event.defaultPrevented) return;\n\n store.setState(\"open\", false);\n },\n [store, onClickProp]\n );\n\n const ClosePrimitive = asChild ? Slot : \"button\";\n\n return (\n <ClosePrimitive\n type=\"button\"\n aria-label=\"Close tour\"\n className={cn(\n \"absolute top-4 right-4 rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-hidden focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className\n )}\n onClick={onClick}\n {...closeButtonProps}\n >\n <X className=\"size-4\" />\n </ClosePrimitive>\n );\n}\n\nfunction TourPrev(props: React.ComponentProps<typeof Button>) {\n const { children, onClick: onClickProp, ...prevButtonProps } = props;\n\n const store = useStoreContext(PREV_NAME);\n const value = useStore((state) => state.value);\n\n const onClick = React.useCallback(\n (event: React.MouseEvent<PrevElement>) => {\n onClickProp?.(event);\n if (event.defaultPrevented) return;\n\n if (value > 0) {\n store.setState(\"value\", value - 1);\n }\n },\n [value, store, onClickProp]\n );\n\n return (\n <Button\n type=\"button\"\n aria-label=\"Previous step\"\n data-slot=\"tour-prev\"\n variant=\"outline\"\n {...prevButtonProps}\n onClick={onClick}\n disabled={value === 0}\n >\n {children ?? (\n <>\n <ChevronLeft />\n Previous\n </>\n )}\n </Button>\n );\n}\n\nfunction TourNext(props: React.ComponentProps<typeof Button>) {\n const { children, onClick: onClickProp, ...nextButtonProps } = props;\n const store = useStoreContext(NEXT_NAME);\n const value = useStore((state) => state.value);\n const steps = useStore((state) => state.steps);\n\n const isLastStep = value === steps.length - 1;\n\n const onClick = React.useCallback(\n (event: React.MouseEvent<NextElement>) => {\n onClickProp?.(event);\n if (event.defaultPrevented) return;\n\n store.setState(\"value\", value + 1);\n },\n [value, store, onClickProp]\n );\n\n return (\n <Button\n type=\"button\"\n aria-label=\"Next step\"\n data-slot=\"tour-next\"\n {...nextButtonProps}\n onClick={onClick}\n >\n {children ?? (\n <>\n {isLastStep ? \"Finish\" : \"Next\"}\n {!isLastStep && <ChevronRight />}\n </>\n )}\n </Button>\n );\n}\n\nfunction TourSkip(props: React.ComponentProps<typeof Button>) {\n const { children, onClick: onClickProp, ...skipButtonProps } = props;\n\n const store = useStoreContext(SKIP_NAME);\n\n const onClick = React.useCallback(\n (event: React.MouseEvent<SkipElement>) => {\n onClickProp?.(event);\n if (event.defaultPrevented) return;\n\n store.setState(\"open\", false);\n },\n [store, onClickProp]\n );\n\n return (\n <Button\n type=\"button\"\n aria-label=\"Skip tour\"\n data-slot=\"tour-skip\"\n variant=\"outline\"\n {...skipButtonProps}\n onClick={onClick}\n >\n {children ?? \"Skip\"}\n </Button>\n );\n}\n\ninterface TourStepCounterProps extends DivProps {\n format?: (current: number, total: number) => string;\n}\n\nfunction TourStepCounter(props: TourStepCounterProps) {\n const {\n format = (current, total) => `${current} / ${total}`,\n asChild,\n className,\n children,\n ...stepCounterProps\n } = props;\n\n const value = useStore((state) => state.value);\n const steps = useStore((state) => state.steps);\n\n const StepCounterPrimitive = asChild ? Slot : \"div\";\n\n return (\n <StepCounterPrimitive\n data-slot=\"tour-step-counter\"\n {...stepCounterProps}\n className={cn(\"text-muted-foreground text-sm\", className)}\n >\n {children ?? format(value + 1, steps.length)}\n </StepCounterPrimitive>\n );\n}\n\nfunction TourFooter(props: DivProps) {\n const { asChild, className, ref, ...footerProps } = props;\n\n const stepContext = useStepContext(FOOTER_NAME);\n const hasDefaultFooter = React.useContext(DefaultFooterContext);\n const context = useTourContext(FOOTER_NAME);\n\n const composedRef = useComposedRefs(\n ref,\n hasDefaultFooter ? undefined : stepContext.onFooterChange\n );\n\n const FooterPrimitive = asChild ? Slot : \"div\";\n\n return (\n <FooterPrimitive\n data-slot=\"tour-footer\"\n dir={context.dir}\n {...footerProps}\n ref={composedRef}\n className={cn(\n \"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\",\n className\n )}\n />\n );\n}\n\nexport {\n TourRoot as Root,\n TourPortal as Portal,\n TourSpotlight as Spotlight,\n TourSpotlightRing as SpotlightRing,\n TourStep as Step,\n TourArrow as Arrow,\n TourHeader as Header,\n TourTitle as Title,\n TourDescription as Description,\n TourClose as Close,\n TourPrev as Prev,\n TourNext as Next,\n TourSkip as Skip,\n TourStepCounter as StepCounter,\n TourFooter as Footer,\n //\n TourRoot as Tour,\n TourPortal,\n TourSpotlight,\n TourSpotlightRing,\n TourStep,\n TourArrow,\n TourHeader,\n TourTitle,\n TourDescription,\n TourClose,\n TourPrev,\n TourNext,\n TourSkip,\n TourStepCounter,\n TourFooter,\n //\n type TourRootProps as TourProps,\n};\n"],"names":["ROOT_NAME","PORTAL_NAME","STEP_NAME","ARROW_NAME","HEADER_NAME","TITLE_NAME","DESCRIPTION_NAME","CLOSE_NAME","PREV_NAME","NEXT_NAME","SKIP_NAME","FOOTER_NAME","POINTER_DOWN_OUTSIDE","INTERACT_OUTSIDE","OPEN_AUTO_FOCUS","CLOSE_AUTO_FOCUS","EVENT_OPTIONS","DEFAULT_ALIGN_OFFSET","DEFAULT_SIDE_OFFSET","DEFAULT_SPOTLIGHT_PADDING","OPPOSITE_SIDE","useIsomorphicLayoutEffect","React","useAsRef","props","ref","useLazyRef","fn","focusGuardCount","createFocusGuard","element","useFocusGuards","edgeGuards","guards","node","useFocusTrap","containerRef","enabled","tourOpen","onOpenAutoFocus","onCloseAutoFocus","lastFocusedElementRef","onOpenAutoFocusRef","onCloseAutoFocusRef","tourOpenRef","container","previouslyFocusedElement","getTabbableCandidates","nodes","walker","isHiddenInput","getTabbableEdges","candidates","first","last","onFocusIn","event","target","onKeyDown","openAutoFocusEvent","tabbableCandidates","closeAutoFocusEvent","DirectionContext","useDirection","dirProp","contextDir","getDataState","open","useStore","selector","store","useStoreContext","getSnapshot","getTargetElement","getDefaultScrollBehavior","onScrollToElement","scrollBehavior","scrollOffset","offset","rect","viewportHeight","viewportWidth","scrollTop","getSideAndAlignFromPlacement","placement","side","align","getPlacement","updateMask","targetElement","padding","clientRect","x","y","width","height","path","StoreContext","consumerName","context","TourContext","useTourContext","StepContext","useStepContext","DefaultFooterContext","PortalContext","usePortalContext","useScrollLock","originalStyle","scrollbarWidth","TourRoot","openProp","defaultOpen","onOpenChange","valueProp","defaultValue","onValueChange","onComplete","onSkip","autoScroll","rootProps","stateRef","listenersRef","stepIdsMapRef","stepIdCounterRef","propsRef","cb","key","value","prevStep","nextStep","l","stepData","id","index","_","i","stepId","stepIndex","jsx","TourRootImpl","onEscapeKeyDown","onPointerDownOutside","onInteractOutside","alignOffset","sideOffset","spotlightPadding","dismissible","modal","stepFooter","asChild","rootImplProps","dir","portal","setPortal","previouslyFocusedElementRef","onEscapeKeyDownRef","state","prevOpenRef","wasOpen","elementToFocus","contextValue","portalContextValue","RootPrimitive","Slot","TourStep","collisionBoundary","collisionPadding","arrowPadding","sticky","hideWhenDetached","avoidCollisions","required","forceMount","onStepEnter","onStepLeave","onPointerDownCaptureProp","onFocusCaptureProp","onBlurCaptureProp","children","className","style","stepProps","arrow","setArrow","footer","setFooter","stepRef","stepIdRef","stepOrderRef","isPointerInsideReactTreeRef","isFocusInsideReactTreeRef","steps","resolvedSideOffset","resolvedAlignOffset","isCurrentStep","middleware","mainAxisOffset","crossAxisOffset","boundary","hasExplicitBoundaries","detectOverflowOptions","b","shift","limitShift","flip","onArrow","hide","refs","floatingStyles","finalPlacement","middlewareData","useFloating","autoUpdate","composedRef","useComposedRefs","placedSide","placedAlign","arrowX","arrowY","cannotCenterArrow","isHidden","stepContextValue","onResize","onScroll","rafId","stepElement","ownerDocument","onPointerDown","pointerDownOutsideEvent","interactOutsideEvent","timerId","isFocusInStep","isFocusInTarget","onPointerDownCapture","onFocusCapture","onBlurCapture","onTargetPointerDownCapture","onTargetFocusCapture","onTargetBlurCapture","StepPrimitive","jsxs","cn","TourSpotlight","backdropProps","maskPath","SpotlightPrimitive","TourSpotlightRing","ringProps","spotlightRect","RingPrimitive","TourPortal","portalContext","mounted","setMounted","portalContainer","ReactDOM","TourArrow","arrowProps","stepContext","baseSide","TourHeader","headerProps","HeaderPrimitive","TourTitle","titleProps","TitlePrimitive","TourDescription","descriptionProps","DescriptionPrimitive","TourClose","onClickProp","closeButtonProps","onClick","ClosePrimitive","X","TourPrev","prevButtonProps","Button","Fragment","ChevronLeft","TourNext","nextButtonProps","isLastStep","ChevronRight","TourSkip","skipButtonProps","TourStepCounter","format","current","total","stepCounterProps","StepCounterPrimitive","TourFooter","footerProps","hasDefaultFooter","FooterPrimitive"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Tour.cjs","sources":["../../../../src/components/Tour/Tour.tsx"],"sourcesContent":["\"use client\";\n\nimport { cn, Slot, useComposedRefs } from \"@dsui/ui/index\";\nimport {\n autoUpdate,\n flip,\n hide,\n limitShift,\n type Middleware,\n offset,\n arrow as onArrow,\n type Placement,\n shift,\n useFloating,\n} from \"@floating-ui/react-dom\";\nimport { ChevronLeft, ChevronRight, X } from \"lucide-react\";\nimport * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport { Button } from \"../Button\";\n\nconst ROOT_NAME = \"Tour\";\nconst PORTAL_NAME = \"TourPortal\";\nconst STEP_NAME = \"TourStep\";\nconst ARROW_NAME = \"TourArrow\";\nconst HEADER_NAME = \"TourHeader\";\nconst TITLE_NAME = \"TourTitle\";\nconst DESCRIPTION_NAME = \"TourDescription\";\nconst CLOSE_NAME = \"TourClose\";\nconst PREV_NAME = \"TourPrev\";\nconst NEXT_NAME = \"TourNext\";\nconst SKIP_NAME = \"TourSkip\";\nconst FOOTER_NAME = \"TourFooter\";\n\nconst POINTER_DOWN_OUTSIDE = \"tour.pointerDownOutside\";\nconst INTERACT_OUTSIDE = \"tour.interactOutside\";\nconst OPEN_AUTO_FOCUS = \"tour.openAutoFocus\";\nconst CLOSE_AUTO_FOCUS = \"tour.closeAutoFocus\";\nconst EVENT_OPTIONS = { bubbles: false, cancelable: true };\n\nconst SIDE_OPTIONS = [\"top\", \"right\", \"bottom\", \"left\"] as const;\nconst ALIGN_OPTIONS = [\"start\", \"center\", \"end\"] as const;\n\nconst DEFAULT_ALIGN_OFFSET = 0;\nconst DEFAULT_SIDE_OFFSET = 16;\nconst DEFAULT_SPOTLIGHT_PADDING = 4;\n\ntype Side = (typeof SIDE_OPTIONS)[number];\ntype Align = (typeof ALIGN_OPTIONS)[number];\ntype Direction = \"ltr\" | \"rtl\";\n\ninterface ScrollOffset {\n top?: number;\n bottom?: number;\n left?: number;\n right?: number;\n}\n\ntype Boundary = Element | null;\n\ninterface DivProps extends React.ComponentProps<\"div\"> {\n asChild?: boolean;\n}\n\ntype StepElement = React.ComponentRef<typeof TourStep>;\ntype CloseElement = React.ComponentRef<typeof TourClose>;\ntype PrevElement = React.ComponentRef<typeof TourPrev>;\ntype NextElement = React.ComponentRef<typeof TourNext>;\ntype SkipElement = React.ComponentRef<typeof TourSkip>;\ntype FooterElement = React.ComponentRef<typeof TourFooter>;\n\nconst OPPOSITE_SIDE: Record<Side, Side> = {\n top: \"bottom\",\n right: \"left\",\n bottom: \"top\",\n left: \"right\",\n};\n\nconst useIsomorphicLayoutEffect =\n typeof window === \"undefined\" ? React.useEffect : React.useLayoutEffect;\n\nfunction useAsRef<T>(props: T) {\n const ref = React.useRef<T>(props);\n\n useIsomorphicLayoutEffect(() => {\n ref.current = props;\n });\n\n return ref;\n}\n\nfunction useLazyRef<T>(fn: () => T) {\n const ref = React.useRef<T | null>(null);\n\n if (ref.current === null) {\n ref.current = fn();\n }\n\n return ref as React.RefObject<T>;\n}\n\n/**\n * @see https://github.com/radix-ui/primitives/blob/main/packages/react/focus-guards/src/focus-guards.tsx\n */\nlet focusGuardCount = 0;\n\nfunction createFocusGuard() {\n const element = document.createElement(\"span\");\n element.setAttribute(\"data-tour-focus-guard\", \"\");\n element.tabIndex = 0;\n element.style.outline = \"none\";\n element.style.opacity = \"0\";\n element.style.position = \"fixed\";\n element.style.pointerEvents = \"none\";\n return element;\n}\n\nfunction useFocusGuards() {\n React.useEffect(() => {\n const edgeGuards = document.querySelectorAll(\"[data-tour-focus-guard]\");\n document.body.insertAdjacentElement(\n \"afterbegin\",\n edgeGuards[0] ?? createFocusGuard()\n );\n document.body.insertAdjacentElement(\n \"beforeend\",\n edgeGuards[1] ?? createFocusGuard()\n );\n focusGuardCount++;\n\n return () => {\n if (focusGuardCount === 1) {\n const guards = document.querySelectorAll(\"[data-tour-focus-guard]\");\n for (const node of guards) {\n node.remove();\n }\n }\n focusGuardCount--;\n };\n }, []);\n}\n\nfunction useFocusTrap(\n containerRef: React.RefObject<HTMLElement | null>,\n enabled: boolean,\n tourOpen: boolean,\n onOpenAutoFocus?: (event: OpenAutoFocusEvent) => void,\n onCloseAutoFocus?: (event: CloseAutoFocusEvent) => void\n) {\n const lastFocusedElementRef = React.useRef<HTMLElement | null>(null);\n const onOpenAutoFocusRef = useAsRef(onOpenAutoFocus);\n const onCloseAutoFocusRef = useAsRef(onCloseAutoFocus);\n const tourOpenRef = useAsRef(tourOpen);\n\n React.useEffect(() => {\n if (!enabled) return;\n\n const container = containerRef.current;\n if (!container) return;\n\n const previouslyFocusedElement =\n document.activeElement as HTMLElement | null;\n\n function getTabbableCandidates() {\n if (!container) return [];\n\n const nodes: HTMLElement[] = [];\n const walker = document.createTreeWalker(\n container,\n NodeFilter.SHOW_ELEMENT,\n {\n acceptNode: (node: Element) => {\n const element = node as HTMLElement;\n const isHiddenInput =\n element.tagName === \"INPUT\" &&\n (element as HTMLInputElement).type === \"hidden\";\n if (element.hidden || isHiddenInput) return NodeFilter.FILTER_SKIP;\n return element.tabIndex >= 0\n ? NodeFilter.FILTER_ACCEPT\n : NodeFilter.FILTER_SKIP;\n },\n }\n );\n while (walker.nextNode()) {\n nodes.push(walker.currentNode as HTMLElement);\n }\n return nodes;\n }\n\n function getTabbableEdges() {\n const candidates = getTabbableCandidates();\n const first = candidates[0];\n const last = candidates[candidates.length - 1];\n return [first, last] as const;\n }\n\n function onFocusIn(event: FocusEvent) {\n if (!container) return;\n\n const target = event.target as HTMLElement | null;\n if (container.contains(target)) {\n lastFocusedElementRef.current = target;\n } else {\n const elementToFocus =\n lastFocusedElementRef.current ?? getTabbableCandidates()[0];\n elementToFocus?.focus({ preventScroll: true });\n }\n }\n\n function onKeyDown(event: KeyboardEvent) {\n if (event.key !== \"Tab\" || event.altKey || event.ctrlKey || event.metaKey)\n return;\n\n const [first, last] = getTabbableEdges();\n const hasTabbableElements = first && last;\n\n if (!hasTabbableElements) {\n if (document.activeElement === container) event.preventDefault();\n return;\n }\n\n if (!event.shiftKey && document.activeElement === last) {\n event.preventDefault();\n first?.focus({ preventScroll: true });\n } else if (event.shiftKey && document.activeElement === first) {\n event.preventDefault();\n last?.focus({ preventScroll: true });\n }\n }\n\n const openAutoFocusEvent = new CustomEvent(OPEN_AUTO_FOCUS, EVENT_OPTIONS);\n if (onOpenAutoFocusRef.current) {\n container.addEventListener(\n OPEN_AUTO_FOCUS,\n onOpenAutoFocusRef.current as EventListener,\n { once: true }\n );\n }\n container.dispatchEvent(openAutoFocusEvent);\n\n if (!openAutoFocusEvent.defaultPrevented) {\n const tabbableCandidates = getTabbableCandidates();\n if (tabbableCandidates.length > 0) {\n tabbableCandidates[0]?.focus({ preventScroll: true });\n } else {\n container.focus({ preventScroll: true });\n }\n }\n\n document.addEventListener(\"focusin\", onFocusIn);\n container.addEventListener(\"keydown\", onKeyDown);\n\n return () => {\n document.removeEventListener(\"focusin\", onFocusIn);\n container.removeEventListener(\"keydown\", onKeyDown);\n\n if (!tourOpenRef.current) {\n setTimeout(() => {\n const closeAutoFocusEvent = new CustomEvent(\n CLOSE_AUTO_FOCUS,\n EVENT_OPTIONS\n );\n if (onCloseAutoFocusRef.current) {\n container.addEventListener(\n CLOSE_AUTO_FOCUS,\n onCloseAutoFocusRef.current as EventListener,\n { once: true }\n );\n }\n container.dispatchEvent(closeAutoFocusEvent);\n\n if (!closeAutoFocusEvent.defaultPrevented) {\n if (\n previouslyFocusedElement &&\n document.body.contains(previouslyFocusedElement)\n ) {\n previouslyFocusedElement.focus({ preventScroll: true });\n }\n }\n\n if (onCloseAutoFocusRef.current) {\n container.removeEventListener(\n CLOSE_AUTO_FOCUS,\n onCloseAutoFocusRef.current as EventListener\n );\n }\n }, 0);\n }\n };\n }, [\n containerRef,\n enabled,\n onOpenAutoFocusRef,\n onCloseAutoFocusRef,\n tourOpenRef,\n ]);\n}\n\nconst DirectionContext = React.createContext<Direction | undefined>(undefined);\n\nfunction useDirection(dirProp?: Direction): Direction {\n const contextDir = React.useContext(DirectionContext);\n return dirProp ?? contextDir ?? \"ltr\";\n}\n\nfunction getDataState(open: boolean): string {\n return open ? \"open\" : \"closed\";\n}\n\ninterface StepData {\n target: string | React.RefObject<HTMLElement> | HTMLElement;\n align?: Align;\n alignOffset?: number;\n side?: Side;\n sideOffset?: number;\n collisionBoundary?: Boundary | Boundary[];\n collisionPadding?: number | Partial<Record<Side, number>>;\n arrowPadding?: number;\n sticky?: \"partial\" | \"always\";\n hideWhenDetached?: boolean;\n avoidCollisions?: boolean;\n onStepEnter?: () => void;\n onStepLeave?: () => void;\n required?: boolean;\n}\n\ninterface StoreState {\n open: boolean;\n value: number;\n steps: StepData[];\n maskPath: string;\n spotlightRect: { x: number; y: number; width: number; height: number } | null;\n}\n\ninterface Store {\n subscribe: (callback: () => void) => () => void;\n getState: () => StoreState;\n setState: <K extends keyof StoreState>(\n key: K,\n value: StoreState[K],\n opts?: unknown\n ) => void;\n notify: () => void;\n addStep: (stepData: StepData) => { id: string; index: number };\n removeStep: (id: string) => void;\n}\n\nfunction useStore<T>(selector: (state: StoreState) => T): T {\n const store = useStoreContext(\"useStore\");\n\n const getSnapshot = React.useCallback(\n () => selector(store.getState()),\n [store, selector]\n );\n\n return React.useSyncExternalStore(store.subscribe, getSnapshot, getSnapshot);\n}\n\nfunction getTargetElement(\n target: string | React.RefObject<HTMLElement> | HTMLElement\n): HTMLElement | null {\n if (typeof target === \"string\") {\n return document.querySelector(target);\n }\n if (target && \"current\" in target) {\n return target.current;\n }\n if (target instanceof HTMLElement) {\n return target;\n }\n return null;\n}\n\nfunction getDefaultScrollBehavior(): ScrollBehavior {\n if (typeof window === \"undefined\") return \"smooth\";\n return window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches\n ? \"auto\"\n : \"smooth\";\n}\n\nfunction onScrollToElement(\n element: HTMLElement,\n scrollBehavior: ScrollBehavior = getDefaultScrollBehavior(),\n scrollOffset?: ScrollOffset\n) {\n const offset: Required<ScrollOffset> = {\n top: 100,\n bottom: 100,\n left: 0,\n right: 0,\n ...scrollOffset,\n };\n const rect = element.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n const viewportWidth = window.innerWidth;\n\n const isInViewport =\n rect.top >= offset.top &&\n rect.bottom <= viewportHeight - offset.bottom &&\n rect.left >= offset.left &&\n rect.right <= viewportWidth - offset.right;\n\n if (!isInViewport) {\n const elementTop = rect.top + window.scrollY;\n const scrollTop = elementTop - offset.top;\n\n window.scrollTo({\n top: Math.max(0, scrollTop),\n behavior: scrollBehavior,\n });\n }\n}\n\nfunction getSideAndAlignFromPlacement(placement: Placement): [Side, Align] {\n const [side, align = \"center\"] = placement.split(\"-\") as [Side, Align?];\n return [side, align];\n}\n\nfunction getPlacement(side: Side, align: Align): Placement {\n if (align === \"center\") {\n return side as Placement;\n }\n return `${side}-${align}` as Placement;\n}\n\nfunction updateMask(\n store: Store,\n targetElement: HTMLElement,\n padding: number = DEFAULT_SPOTLIGHT_PADDING\n) {\n const clientRect = targetElement.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n const x = Math.max(0, clientRect.left - padding);\n const y = Math.max(0, clientRect.top - padding);\n const width = Math.min(viewportWidth - x, clientRect.width + padding * 2);\n const height = Math.min(viewportHeight - y, clientRect.height + padding * 2);\n\n const path = `polygon(0% 0%, 0% 100%, ${x}px 100%, ${x}px ${y}px, ${x + width}px ${y}px, ${x + width}px ${y + height}px, ${x}px ${y + height}px, ${x}px 100%, 100% 100%, 100% 0%)`;\n store.setState(\"maskPath\", path);\n store.setState(\"spotlightRect\", { x, y, width, height });\n}\n\nconst StoreContext = React.createContext<Store | null>(null);\n\nfunction useStoreContext(consumerName: string) {\n const context = React.useContext(StoreContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ROOT_NAME}\\``);\n }\n return context;\n}\n\ninterface TourContextValue {\n dir: Direction;\n alignOffset: number;\n sideOffset: number;\n spotlightPadding: number;\n dismissible: boolean;\n modal: boolean;\n stepFooter?: React.ReactElement;\n onPointerDownOutside?: (event: PointerDownOutsideEvent) => void;\n onInteractOutside?: (event: InteractOutsideEvent) => void;\n onOpenAutoFocus?: (event: OpenAutoFocusEvent) => void;\n onCloseAutoFocus?: (event: CloseAutoFocusEvent) => void;\n}\n\nconst TourContext = React.createContext<TourContextValue | null>(null);\n\nfunction useTourContext(consumerName: string) {\n const context = React.useContext(TourContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ROOT_NAME}\\``);\n }\n return context;\n}\n\ninterface StepContextValue {\n arrowX?: number;\n arrowY?: number;\n placedAlign: Align;\n placedSide: Side;\n shouldHideArrow: boolean;\n onArrowChange: (arrow: HTMLSpanElement | null) => void;\n onFooterChange: (footer: FooterElement | null) => void;\n}\n\nconst StepContext = React.createContext<StepContextValue | null>(null);\n\nfunction useStepContext(consumerName: string) {\n const context = React.useContext(StepContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${STEP_NAME}\\``);\n }\n return context;\n}\n\nconst DefaultFooterContext = React.createContext(false);\n\ninterface PortalContextValue {\n portal: HTMLElement | null;\n onPortalChange: (node: HTMLElement | null) => void;\n}\n\nconst PortalContext = React.createContext<PortalContextValue | null>(null);\n\nfunction usePortalContext(consumerName: string) {\n const context = React.useContext(PortalContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ROOT_NAME}\\``);\n }\n return context;\n}\n\nfunction useScrollLock(enabled: boolean) {\n React.useEffect(() => {\n if (!enabled) return;\n\n const originalStyle = window.getComputedStyle(document.body).overflow;\n const scrollbarWidth =\n window.innerWidth - document.documentElement.clientWidth;\n\n document.body.style.overflow = \"hidden\";\n if (scrollbarWidth > 0) {\n document.body.style.paddingRight = `${scrollbarWidth}px`;\n }\n\n return () => {\n document.body.style.overflow = originalStyle;\n document.body.style.paddingRight = \"\";\n };\n }, [enabled]);\n}\n\ntype PointerDownOutsideEvent = CustomEvent<{ originalEvent: PointerEvent }>;\ntype InteractOutsideEvent = CustomEvent<{\n originalEvent: PointerEvent | FocusEvent;\n}>;\ntype OpenAutoFocusEvent = CustomEvent<Record<string, never>>;\ntype CloseAutoFocusEvent = CustomEvent<Record<string, never>>;\n\ninterface TourRootProps extends DivProps {\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n value?: number;\n defaultValue?: number;\n onValueChange?: (step: number) => void;\n onComplete?: () => void;\n onSkip?: () => void;\n onEscapeKeyDown?: (event: KeyboardEvent) => void;\n onPointerDownOutside?: (event: PointerDownOutsideEvent) => void;\n onInteractOutside?: (event: InteractOutsideEvent) => void;\n onOpenAutoFocus?: (event: OpenAutoFocusEvent) => void;\n onCloseAutoFocus?: (event: CloseAutoFocusEvent) => void;\n dir?: Direction;\n alignOffset?: number;\n sideOffset?: number;\n spotlightPadding?: number;\n autoScroll?: boolean;\n scrollBehavior?: ScrollBehavior;\n scrollOffset?: ScrollOffset;\n dismissible?: boolean;\n modal?: boolean;\n stepFooter?: React.ReactElement;\n}\n\nfunction TourRoot(props: TourRootProps) {\n const {\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n value: valueProp,\n defaultValue = 0,\n onValueChange,\n onComplete,\n onSkip,\n autoScroll = true,\n scrollBehavior = getDefaultScrollBehavior(),\n scrollOffset,\n ...rootProps\n } = props;\n\n const stateRef = useLazyRef<StoreState>(() => ({\n open: openProp ?? defaultOpen,\n value: valueProp ?? defaultValue,\n steps: [],\n maskPath: \"\",\n spotlightRect: null,\n }));\n const listenersRef = useLazyRef<Set<() => void>>(() => new Set());\n const stepIdsMapRef = useLazyRef<Map<string, number>>(() => new Map());\n const stepIdCounterRef = useLazyRef(() => ({ current: 0 }));\n const propsRef = useAsRef({\n valueProp,\n onOpenChange,\n onValueChange,\n onComplete,\n onSkip,\n autoScroll,\n scrollBehavior,\n scrollOffset,\n });\n\n const store: Store = React.useMemo(\n () => ({\n subscribe: (cb) => {\n listenersRef.current.add(cb);\n return () => listenersRef.current.delete(cb);\n },\n getState: () => {\n return stateRef.current;\n },\n setState: (key, value) => {\n if (Object.is(stateRef.current[key], value)) return;\n stateRef.current[key] = value;\n\n if (key === \"open\" && typeof value === \"boolean\") {\n propsRef.current.onOpenChange?.(value);\n\n if (value) {\n if (stateRef.current.steps.length > 0) {\n if (stateRef.current.value >= stateRef.current.steps.length) {\n store.setState(\"value\", 0);\n }\n }\n } else {\n if (\n stateRef.current.value <\n (stateRef.current.steps.length || 0) - 1\n ) {\n propsRef.current.onSkip?.();\n }\n }\n } else if (key === \"value\" && typeof value === \"number\") {\n const prevStep = stateRef.current.steps[stateRef.current.value];\n const nextStep = stateRef.current.steps[value];\n\n prevStep?.onStepLeave?.();\n nextStep?.onStepEnter?.();\n\n if (value >= stateRef.current.steps.length) {\n propsRef.current.onComplete?.();\n\n if (propsRef.current.valueProp !== undefined) {\n propsRef.current.onValueChange?.(value);\n }\n\n store.setState(\"open\", false);\n return;\n }\n\n if (propsRef.current.valueProp !== undefined) {\n propsRef.current.onValueChange?.(value);\n return;\n }\n\n propsRef.current.onValueChange?.(value);\n\n if (nextStep && propsRef.current.autoScroll) {\n const targetElement = getTargetElement(nextStep.target);\n if (targetElement) {\n onScrollToElement(\n targetElement,\n propsRef.current.scrollBehavior,\n propsRef.current.scrollOffset\n );\n }\n }\n }\n\n store.notify();\n },\n notify: () => {\n listenersRef.current.forEach((l) => {\n l();\n });\n },\n addStep: (stepData) => {\n const id = `step-${stepIdCounterRef.current.current++}`;\n const index = stateRef.current.steps.length;\n stepIdsMapRef.current.set(id, index);\n stateRef.current.steps = [...stateRef.current.steps, stepData];\n store.notify();\n return { id, index };\n },\n removeStep: (id) => {\n const index = stepIdsMapRef.current.get(id);\n if (index === undefined) return;\n\n stateRef.current.steps = stateRef.current.steps.filter(\n (_, i) => i !== index\n );\n\n stepIdsMapRef.current.delete(id);\n\n for (const [stepId, stepIndex] of stepIdsMapRef.current.entries()) {\n if (stepIndex > index) {\n stepIdsMapRef.current.set(stepId, stepIndex - 1);\n }\n }\n\n store.notify();\n },\n }),\n [stateRef, listenersRef, stepIdsMapRef, stepIdCounterRef, propsRef]\n );\n\n useIsomorphicLayoutEffect(() => {\n if (openProp !== undefined) {\n store.setState(\"open\", openProp);\n }\n }, [openProp, store]);\n\n useIsomorphicLayoutEffect(() => {\n if (valueProp !== undefined) {\n store.setState(\"value\", valueProp);\n }\n }, [valueProp, store]);\n\n return (\n <StoreContext.Provider value={store}>\n <TourRootImpl {...rootProps} />\n </StoreContext.Provider>\n );\n}\n\ninterface TourRootImplProps\n extends Omit<\n TourRootProps,\n | \"open\"\n | \"defaultOpen\"\n | \"onOpenChange\"\n | \"value\"\n | \"defaultValue\"\n | \"onValueChange\"\n | \"onComplete\"\n | \"onSkip\"\n | \"autoScroll\"\n | \"scrollBehavior\"\n | \"scrollOffset\"\n > {}\n\nfunction TourRootImpl(props: TourRootImplProps) {\n const {\n onEscapeKeyDown,\n onPointerDownOutside,\n onInteractOutside,\n onOpenAutoFocus,\n onCloseAutoFocus,\n dir: dirProp,\n alignOffset = DEFAULT_ALIGN_OFFSET,\n sideOffset = DEFAULT_SIDE_OFFSET,\n spotlightPadding = DEFAULT_SPOTLIGHT_PADDING,\n dismissible = true,\n modal = true,\n stepFooter,\n asChild,\n ...rootImplProps\n } = props;\n\n const store = useStoreContext(\"TourRootImpl\");\n const dir = useDirection(dirProp);\n\n const [portal, setPortal] = React.useState<HTMLElement | null>(null);\n const previouslyFocusedElementRef = React.useRef<HTMLElement | null>(null);\n\n const onEscapeKeyDownRef = useAsRef(onEscapeKeyDown);\n const onCloseAutoFocusRef = useAsRef(onCloseAutoFocus);\n\n React.useEffect(() => {\n function onKeyDown(event: KeyboardEvent) {\n if (store.getState().open && event.key === \"Escape\") {\n if (onEscapeKeyDownRef.current) {\n onEscapeKeyDownRef.current(event);\n if (event.defaultPrevented) return;\n }\n store.setState(\"open\", false);\n }\n }\n\n document.addEventListener(\"keydown\", onKeyDown);\n return () => document.removeEventListener(\"keydown\", onKeyDown);\n }, [store, onEscapeKeyDownRef]);\n\n const open = useStore((state) => state.open);\n const prevOpenRef = React.useRef<boolean | undefined>(undefined);\n\n useIsomorphicLayoutEffect(() => {\n const wasOpen = prevOpenRef.current;\n\n if (open && !wasOpen) {\n previouslyFocusedElementRef.current =\n document.activeElement as HTMLElement | null;\n } else if (!open && wasOpen) {\n setTimeout(() => {\n const container = portal ?? document.body;\n const closeAutoFocusEvent = new CustomEvent(\n CLOSE_AUTO_FOCUS,\n EVENT_OPTIONS\n );\n\n if (onCloseAutoFocusRef.current) {\n container.addEventListener(\n CLOSE_AUTO_FOCUS,\n onCloseAutoFocusRef.current as EventListener,\n { once: true }\n );\n }\n container.dispatchEvent(closeAutoFocusEvent);\n\n if (!closeAutoFocusEvent.defaultPrevented) {\n const elementToFocus = previouslyFocusedElementRef.current;\n if (elementToFocus && document.body.contains(elementToFocus)) {\n elementToFocus.focus({ preventScroll: true });\n }\n }\n\n previouslyFocusedElementRef.current = null;\n }, 0);\n }\n\n prevOpenRef.current = open;\n }, [open, portal, onCloseAutoFocusRef]);\n\n const contextValue = React.useMemo<TourContextValue>(\n () => ({\n dir,\n alignOffset,\n sideOffset,\n spotlightPadding,\n dismissible,\n modal,\n stepFooter,\n onPointerDownOutside,\n onInteractOutside,\n onOpenAutoFocus,\n onCloseAutoFocus,\n }),\n [\n dir,\n alignOffset,\n sideOffset,\n spotlightPadding,\n dismissible,\n modal,\n stepFooter,\n onPointerDownOutside,\n onInteractOutside,\n onOpenAutoFocus,\n onCloseAutoFocus,\n ]\n );\n\n const portalContextValue = React.useMemo<PortalContextValue>(\n () => ({\n portal,\n onPortalChange: setPortal,\n }),\n [portal]\n );\n\n useScrollLock(open && modal);\n\n const RootPrimitive = asChild ? Slot : \"div\";\n\n return (\n <TourContext.Provider value={contextValue}>\n <PortalContext.Provider value={portalContextValue}>\n <RootPrimitive data-slot=\"tour\" dir={dir} {...rootImplProps} />\n </PortalContext.Provider>\n </TourContext.Provider>\n );\n}\n\ninterface TourStepProps extends DivProps {\n target: string | React.RefObject<HTMLElement> | HTMLElement;\n side?: Side;\n sideOffset?: number;\n align?: Align;\n alignOffset?: number;\n collisionBoundary?: Boundary | Boundary[];\n collisionPadding?: number | Partial<Record<Side, number>>;\n arrowPadding?: number;\n sticky?: \"partial\" | \"always\";\n hideWhenDetached?: boolean;\n avoidCollisions?: boolean;\n required?: boolean;\n forceMount?: boolean;\n onStepEnter?: () => void;\n onStepLeave?: () => void;\n}\n\nfunction TourStep(props: TourStepProps) {\n const {\n target,\n side = \"bottom\",\n sideOffset,\n align = \"center\",\n alignOffset,\n collisionBoundary = [],\n collisionPadding = 0,\n arrowPadding = 0,\n sticky = \"partial\",\n hideWhenDetached = false,\n avoidCollisions = true,\n required = false,\n forceMount = false,\n onStepEnter,\n onStepLeave,\n onPointerDownCapture: onPointerDownCaptureProp,\n onFocusCapture: onFocusCaptureProp,\n onBlurCapture: onBlurCaptureProp,\n children,\n className,\n style,\n asChild,\n ...stepProps\n } = props;\n\n const store = useStoreContext(STEP_NAME);\n\n const [arrow, setArrow] = React.useState<HTMLSpanElement | null>(null);\n const [footer, setFooter] = React.useState<FooterElement | null>(null);\n\n const stepRef = React.useRef<StepElement | null>(null);\n const stepIdRef = React.useRef<string>(\"\");\n const stepOrderRef = React.useRef<number>(-1);\n const isPointerInsideReactTreeRef = React.useRef(false);\n const isFocusInsideReactTreeRef = React.useRef(false);\n\n const open = useStore((state) => state.open);\n const value = useStore((state) => state.value);\n const steps = useStore((state) => state.steps);\n const context = useTourContext(STEP_NAME);\n\n const resolvedSideOffset = sideOffset ?? context.sideOffset;\n const resolvedAlignOffset = alignOffset ?? context.alignOffset;\n\n useIsomorphicLayoutEffect(() => {\n const { id, index } = store.addStep({\n target,\n align,\n alignOffset: resolvedAlignOffset,\n side,\n sideOffset: resolvedSideOffset,\n collisionBoundary,\n collisionPadding,\n arrowPadding,\n sticky,\n hideWhenDetached,\n avoidCollisions,\n onStepEnter,\n onStepLeave,\n required,\n });\n stepIdRef.current = id;\n stepOrderRef.current = index;\n\n return () => {\n store.removeStep(stepIdRef.current);\n };\n }, [\n target,\n side,\n resolvedSideOffset,\n align,\n resolvedAlignOffset,\n collisionPadding,\n arrowPadding,\n sticky,\n hideWhenDetached,\n avoidCollisions,\n required,\n onStepEnter,\n onStepLeave,\n store,\n ]);\n\n const stepData = steps[value];\n const targetElement = stepData ? getTargetElement(stepData.target) : null;\n\n const isCurrentStep = stepOrderRef.current === value;\n\n const middleware = React.useMemo(() => {\n if (!stepData) return [];\n\n const mainAxisOffset = stepData.sideOffset ?? resolvedSideOffset;\n const crossAxisOffset = stepData.alignOffset ?? resolvedAlignOffset;\n\n const padding =\n typeof stepData.collisionPadding === \"number\"\n ? stepData.collisionPadding\n : {\n top: stepData.collisionPadding?.top ?? 0,\n right: stepData.collisionPadding?.right ?? 0,\n bottom: stepData.collisionPadding?.bottom ?? 0,\n left: stepData.collisionPadding?.left ?? 0,\n };\n\n const boundary = Array.isArray(stepData.collisionBoundary)\n ? stepData.collisionBoundary\n : stepData.collisionBoundary\n ? [stepData.collisionBoundary]\n : [];\n const hasExplicitBoundaries = boundary.length > 0;\n\n const detectOverflowOptions = {\n padding,\n boundary: boundary.filter((b): b is Element => b !== null),\n altBoundary: hasExplicitBoundaries,\n };\n\n return [\n offset({\n mainAxis: mainAxisOffset,\n alignmentAxis: crossAxisOffset,\n }),\n stepData.avoidCollisions &&\n shift({\n mainAxis: true,\n crossAxis: false,\n limiter: stepData.sticky === \"partial\" ? limitShift() : undefined,\n ...detectOverflowOptions,\n }),\n stepData.avoidCollisions && flip({ ...detectOverflowOptions }),\n arrow && onArrow({ element: arrow, padding: stepData.arrowPadding }),\n stepData.hideWhenDetached &&\n hide({\n strategy: \"referenceHidden\",\n ...detectOverflowOptions,\n }),\n ].filter(Boolean) as Middleware[];\n }, [stepData, resolvedSideOffset, resolvedAlignOffset, arrow]);\n\n const placement = getPlacement(\n stepData?.side ?? side,\n stepData?.align ?? align\n );\n\n const {\n refs,\n floatingStyles,\n placement: finalPlacement,\n middlewareData,\n } = useFloating({\n placement,\n middleware,\n strategy: \"fixed\",\n whileElementsMounted: autoUpdate,\n elements: {\n reference: targetElement,\n },\n });\n\n const composedRef = useComposedRefs(refs.setFloating, stepRef);\n\n const [placedSide, placedAlign] =\n getSideAndAlignFromPlacement(finalPlacement);\n\n const arrowX = middlewareData.arrow?.x;\n const arrowY = middlewareData.arrow?.y;\n const cannotCenterArrow = middlewareData.arrow?.centerOffset !== 0;\n const isHidden = hideWhenDetached && middlewareData.hide?.referenceHidden;\n\n const stepContextValue = React.useMemo<StepContextValue>(\n () => ({\n arrowX,\n arrowY,\n placedAlign,\n placedSide,\n shouldHideArrow: cannotCenterArrow,\n onArrowChange: setArrow,\n onFooterChange: setFooter,\n }),\n [arrowX, arrowY, placedSide, placedAlign, cannotCenterArrow]\n );\n\n React.useEffect(() => {\n if (open && targetElement && isCurrentStep) {\n updateMask(store, targetElement, context.spotlightPadding);\n\n let rafId: number | null = null;\n\n function onResize() {\n if (targetElement) {\n updateMask(store, targetElement, context.spotlightPadding);\n }\n }\n\n function onScroll() {\n if (rafId !== null) return;\n rafId = requestAnimationFrame(() => {\n if (targetElement) {\n updateMask(store, targetElement, context.spotlightPadding);\n }\n rafId = null;\n });\n }\n\n window.addEventListener(\"resize\", onResize);\n window.addEventListener(\"scroll\", onScroll, { passive: true });\n return () => {\n window.removeEventListener(\"resize\", onResize);\n window.removeEventListener(\"scroll\", onScroll);\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n }\n };\n }\n }, [open, targetElement, isCurrentStep, store, context.spotlightPadding]);\n\n React.useEffect(() => {\n if (!open || !isCurrentStep) return;\n\n const stepElement = stepRef.current;\n if (!stepElement) return;\n\n const ownerDocument = stepElement.ownerDocument;\n\n function onPointerDown(event: PointerEvent) {\n if (event.target && !isPointerInsideReactTreeRef.current) {\n const pointerDownOutsideEvent = new CustomEvent(POINTER_DOWN_OUTSIDE, {\n ...EVENT_OPTIONS,\n detail: { originalEvent: event },\n });\n\n context.onPointerDownOutside?.(pointerDownOutsideEvent);\n\n const interactOutsideEvent = new CustomEvent(INTERACT_OUTSIDE, {\n ...EVENT_OPTIONS,\n detail: { originalEvent: event },\n });\n context.onInteractOutside?.(interactOutsideEvent);\n\n if (\n !pointerDownOutsideEvent.defaultPrevented &&\n !interactOutsideEvent.defaultPrevented &&\n context.dismissible\n ) {\n store.setState(\"open\", false);\n }\n }\n\n isPointerInsideReactTreeRef.current = false;\n }\n\n const timerId = window.setTimeout(() => {\n ownerDocument.addEventListener(\"pointerdown\", onPointerDown);\n }, 0);\n\n return () => {\n window.clearTimeout(timerId);\n ownerDocument.removeEventListener(\"pointerdown\", onPointerDown);\n };\n }, [open, isCurrentStep, store, context]);\n\n React.useEffect(() => {\n if (!open || !isCurrentStep) return;\n\n const stepElement = stepRef.current;\n if (!stepElement) return;\n\n const ownerDocument = stepElement.ownerDocument;\n\n function onFocusIn(event: FocusEvent) {\n const target = event.target as HTMLElement;\n\n const isFocusInStep = stepElement?.contains(target);\n const isFocusInTarget = targetElement?.contains(target);\n\n if (\n event.target &&\n !isFocusInsideReactTreeRef.current &&\n !isFocusInStep &&\n !isFocusInTarget\n ) {\n const interactOutsideEvent = new CustomEvent(INTERACT_OUTSIDE, {\n ...EVENT_OPTIONS,\n detail: { originalEvent: event },\n });\n\n context.onInteractOutside?.(interactOutsideEvent);\n\n if (!interactOutsideEvent.defaultPrevented && context.dismissible) {\n store.setState(\"open\", false);\n }\n }\n }\n\n ownerDocument.addEventListener(\"focusin\", onFocusIn);\n\n return () => {\n ownerDocument.removeEventListener(\"focusin\", onFocusIn);\n };\n }, [open, isCurrentStep, store, context, targetElement]);\n\n const onPointerDownCapture = React.useCallback(\n (event: React.PointerEvent<StepElement>) => {\n onPointerDownCaptureProp?.(event);\n isPointerInsideReactTreeRef.current = true;\n },\n [onPointerDownCaptureProp]\n );\n\n const onFocusCapture = React.useCallback(\n (event: React.FocusEvent<StepElement>) => {\n onFocusCaptureProp?.(event);\n isFocusInsideReactTreeRef.current = true;\n },\n [onFocusCaptureProp]\n );\n\n const onBlurCapture = React.useCallback(\n (event: React.FocusEvent<StepElement>) => {\n onBlurCaptureProp?.(event);\n isFocusInsideReactTreeRef.current = false;\n },\n [onBlurCaptureProp]\n );\n\n React.useEffect(() => {\n if (!open || !isCurrentStep || !targetElement) return;\n\n function onTargetPointerDownCapture() {\n isPointerInsideReactTreeRef.current = true;\n }\n\n function onTargetFocusCapture() {\n isFocusInsideReactTreeRef.current = true;\n }\n\n function onTargetBlurCapture() {\n isFocusInsideReactTreeRef.current = false;\n }\n\n targetElement.addEventListener(\n \"pointerdown\",\n onTargetPointerDownCapture,\n true\n );\n targetElement.addEventListener(\"focus\", onTargetFocusCapture, true);\n targetElement.addEventListener(\"blur\", onTargetBlurCapture, true);\n\n return () => {\n targetElement.removeEventListener(\n \"pointerdown\",\n onTargetPointerDownCapture,\n true\n );\n targetElement.removeEventListener(\"focus\", onTargetFocusCapture, true);\n targetElement.removeEventListener(\"blur\", onTargetBlurCapture, true);\n };\n }, [open, isCurrentStep, targetElement]);\n\n useFocusGuards();\n useFocusTrap(\n stepRef,\n open && isCurrentStep,\n open,\n context.onOpenAutoFocus,\n context.onCloseAutoFocus\n );\n\n if (!open || !stepData || (!targetElement && !forceMount) || !isCurrentStep) {\n return null;\n }\n\n const StepPrimitive = asChild ? Slot : \"div\";\n\n return (\n <StepContext.Provider value={stepContextValue}>\n <StepPrimitive\n ref={composedRef}\n data-slot=\"tour-step\"\n data-side={placedSide}\n data-align={placedAlign}\n dir={context.dir}\n tabIndex={-1}\n {...stepProps}\n onPointerDownCapture={onPointerDownCapture}\n onFocusCapture={onFocusCapture}\n onBlurCapture={onBlurCapture}\n className={cn(\n \"fixed z-50 flex w-80 flex-col gap-4 rounded-lg border bg-popover p-4 text-popover-foreground shadow-md outline-none\",\n className\n )}\n style={{\n ...style,\n ...floatingStyles,\n visibility: isHidden ? \"hidden\" : undefined,\n pointerEvents: isHidden ? \"none\" : undefined,\n } as React.CSSProperties}\n >\n {children}\n {!footer && (\n <DefaultFooterContext.Provider value={true}>\n {context.stepFooter}\n </DefaultFooterContext.Provider>\n )}\n </StepPrimitive>\n </StepContext.Provider>\n );\n}\n\ninterface TourSpotlightProps extends DivProps {\n forceMount?: boolean;\n}\n\nfunction TourSpotlight(props: TourSpotlightProps) {\n const {\n asChild,\n className,\n style,\n forceMount = false,\n ...backdropProps\n } = props;\n\n const open = useStore((state) => state.open);\n const maskPath = useStore((state) => state.maskPath);\n\n if (!open && !forceMount) return null;\n\n const SpotlightPrimitive = asChild ? Slot : \"div\";\n\n return (\n <SpotlightPrimitive\n data-slot=\"tour-spotlight\"\n data-state={getDataState(open)}\n {...backdropProps}\n className={cn(\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-40 bg-black/80 data-[state=closed]:animate-out data-[state=open]:animate-in\",\n className\n )}\n style={{\n clipPath: maskPath,\n ...style,\n }}\n />\n );\n}\n\ninterface TourSpotlightRingProps extends DivProps {\n forceMount?: boolean;\n}\n\nfunction TourSpotlightRing(props: TourSpotlightRingProps) {\n const { asChild, className, style, forceMount = false, ...ringProps } = props;\n\n const open = useStore((state) => state.open);\n const spotlightRect = useStore((state) => state.spotlightRect);\n\n if (!open && !forceMount) return null;\n if (!spotlightRect) return null;\n\n const RingPrimitive = asChild ? Slot : \"div\";\n\n return (\n <RingPrimitive\n data-slot=\"tour-spotlight-ring\"\n data-state={getDataState(open)}\n {...ringProps}\n className={cn(\n \"pointer-events-none fixed z-40 border-ring ring-[3px] ring-ring/50\",\n className\n )}\n style={{\n left: spotlightRect.x,\n top: spotlightRect.y,\n width: spotlightRect.width,\n height: spotlightRect.height,\n ...style,\n }}\n />\n );\n}\n\ninterface TourPortalProps {\n children?: React.ReactNode;\n container?: HTMLElement | null;\n}\n\nfunction TourPortal(props: TourPortalProps) {\n const { children, container } = props;\n\n const portalContext = usePortalContext(PORTAL_NAME);\n\n const [mounted, setMounted] = React.useState(false);\n\n useIsomorphicLayoutEffect(() => {\n setMounted(true);\n\n const node = container ?? document.body;\n\n portalContext?.onPortalChange(node);\n return () => {\n portalContext?.onPortalChange(null);\n };\n }, [container, portalContext]);\n\n if (!mounted) return null;\n\n const portalContainer = container ?? portalContext?.portal ?? document.body;\n\n return ReactDOM.createPortal(children, portalContainer);\n}\n\ninterface TourArrowProps extends React.ComponentProps<\"svg\"> {\n width?: number;\n height?: number;\n asChild?: boolean;\n}\n\nfunction TourArrow(props: TourArrowProps) {\n const {\n width = 10,\n height = 5,\n className,\n children,\n asChild,\n ...arrowProps\n } = props;\n\n const stepContext = useStepContext(ARROW_NAME);\n const baseSide = OPPOSITE_SIDE[stepContext.placedSide];\n\n return (\n <span\n ref={stepContext.onArrowChange}\n data-slot=\"tour-arrow\"\n style={{\n position: \"absolute\",\n left:\n stepContext.arrowX != null ? `${stepContext.arrowX}px` : undefined,\n top: stepContext.arrowY != null ? `${stepContext.arrowY}px` : undefined,\n [baseSide]: 0,\n transformOrigin: {\n top: \"\",\n right: \"0 0\",\n bottom: \"center 0\",\n left: \"100% 0\",\n }[stepContext.placedSide],\n transform: {\n top: \"translateY(100%)\",\n right: \"translateY(50%) rotate(90deg) translateX(-50%)\",\n bottom: \"rotate(180deg)\",\n left: \"translateY(50%) rotate(-90deg) translateX(50%)\",\n }[stepContext.placedSide],\n visibility: stepContext.shouldHideArrow ? \"hidden\" : undefined,\n }}\n >\n <svg\n viewBox=\"0 0 30 10\"\n preserveAspectRatio=\"none\"\n width={width}\n height={height}\n {...arrowProps}\n className={cn(\"block fill-popover stroke-border\", className)}\n >\n {asChild ? children : <polygon points=\"0,0 30,0 15,10\" />}\n </svg>\n </span>\n );\n}\n\nfunction TourHeader(props: DivProps) {\n const { asChild, className, ...headerProps } = props;\n\n const context = useTourContext(HEADER_NAME);\n\n const HeaderPrimitive = asChild ? Slot : \"div\";\n\n return (\n <HeaderPrimitive\n data-slot=\"tour-header\"\n dir={context.dir}\n {...headerProps}\n className={cn(\n \"flex flex-col gap-1.5 text-center sm:text-left\",\n className\n )}\n />\n );\n}\n\nfunction TourTitle(props: DivProps) {\n const { asChild, className, ...titleProps } = props;\n\n const context = useTourContext(TITLE_NAME);\n\n const TitlePrimitive = asChild ? Slot : \"div\";\n\n return (\n <TitlePrimitive\n data-slot=\"tour-title\"\n dir={context.dir}\n {...titleProps}\n className={cn(\n \"font-semibold text-lg leading-none tracking-tight\",\n className\n )}\n />\n );\n}\n\nfunction TourDescription(props: DivProps) {\n const { asChild, className, ...descriptionProps } = props;\n\n const context = useTourContext(DESCRIPTION_NAME);\n\n const DescriptionPrimitive = asChild ? Slot : \"div\";\n\n return (\n <DescriptionPrimitive\n data-slot=\"tour-description\"\n dir={context.dir}\n {...descriptionProps}\n className={cn(\"text-muted-foreground text-sm\", className)}\n />\n );\n}\n\ninterface TourCloseProps extends React.ComponentProps<\"button\"> {\n asChild?: boolean;\n}\n\nfunction TourClose(props: TourCloseProps) {\n const {\n asChild,\n className,\n onClick: onClickProp,\n ...closeButtonProps\n } = props;\n\n const store = useStoreContext(CLOSE_NAME);\n\n const onClick = React.useCallback(\n (event: React.MouseEvent<CloseElement>) => {\n onClickProp?.(event);\n if (event.defaultPrevented) return;\n\n store.setState(\"open\", false);\n },\n [store, onClickProp]\n );\n\n const ClosePrimitive = asChild ? Slot : \"button\";\n\n return (\n <ClosePrimitive\n type=\"button\"\n aria-label=\"Close tour\"\n className={cn(\n \"absolute top-4 right-4 rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-hidden focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className\n )}\n onClick={onClick}\n {...closeButtonProps}\n >\n <X className=\"size-4\" />\n </ClosePrimitive>\n );\n}\n\nfunction TourPrev(props: React.ComponentProps<typeof Button>) {\n const { children, onClick: onClickProp, ...prevButtonProps } = props;\n\n const store = useStoreContext(PREV_NAME);\n const value = useStore((state) => state.value);\n\n const onClick = React.useCallback(\n (event: React.MouseEvent<PrevElement>) => {\n onClickProp?.(event);\n if (event.defaultPrevented) return;\n\n if (value > 0) {\n store.setState(\"value\", value - 1);\n }\n },\n [value, store, onClickProp]\n );\n\n return (\n <Button\n type=\"button\"\n aria-label=\"Previous step\"\n data-slot=\"tour-prev\"\n variant=\"outline\"\n {...prevButtonProps}\n onClick={onClick}\n disabled={value === 0}\n >\n {children ?? (\n <>\n <ChevronLeft />\n Previous\n </>\n )}\n </Button>\n );\n}\n\nfunction TourNext(props: React.ComponentProps<typeof Button>) {\n const { children, onClick: onClickProp, ...nextButtonProps } = props;\n const store = useStoreContext(NEXT_NAME);\n const value = useStore((state) => state.value);\n const steps = useStore((state) => state.steps);\n\n const isLastStep = value === steps.length - 1;\n\n const onClick = React.useCallback(\n (event: React.MouseEvent<NextElement>) => {\n onClickProp?.(event);\n if (event.defaultPrevented) return;\n\n store.setState(\"value\", value + 1);\n },\n [value, store, onClickProp]\n );\n\n return (\n <Button\n type=\"button\"\n aria-label=\"Next step\"\n data-slot=\"tour-next\"\n {...nextButtonProps}\n onClick={onClick}\n >\n {children ?? (\n <>\n {isLastStep ? \"Finish\" : \"Next\"}\n {!isLastStep && <ChevronRight />}\n </>\n )}\n </Button>\n );\n}\n\nfunction TourSkip(props: React.ComponentProps<typeof Button>) {\n const { children, onClick: onClickProp, ...skipButtonProps } = props;\n\n const store = useStoreContext(SKIP_NAME);\n\n const onClick = React.useCallback(\n (event: React.MouseEvent<SkipElement>) => {\n onClickProp?.(event);\n if (event.defaultPrevented) return;\n\n store.setState(\"open\", false);\n },\n [store, onClickProp]\n );\n\n return (\n <Button\n type=\"button\"\n aria-label=\"Skip tour\"\n data-slot=\"tour-skip\"\n variant=\"outline\"\n {...skipButtonProps}\n onClick={onClick}\n >\n {children ?? \"Skip\"}\n </Button>\n );\n}\n\ninterface TourStepCounterProps extends DivProps {\n format?: (current: number, total: number) => string;\n}\n\nfunction TourStepCounter(props: TourStepCounterProps) {\n const {\n format = (current, total) => `${current} / ${total}`,\n asChild,\n className,\n children,\n ...stepCounterProps\n } = props;\n\n const value = useStore((state) => state.value);\n const steps = useStore((state) => state.steps);\n\n const StepCounterPrimitive = asChild ? Slot : \"div\";\n\n return (\n <StepCounterPrimitive\n data-slot=\"tour-step-counter\"\n {...stepCounterProps}\n className={cn(\"text-muted-foreground text-sm\", className)}\n >\n {children ?? format(value + 1, steps.length)}\n </StepCounterPrimitive>\n );\n}\n\nfunction TourFooter(props: DivProps) {\n const { asChild, className, ref, ...footerProps } = props;\n\n const stepContext = useStepContext(FOOTER_NAME);\n const hasDefaultFooter = React.useContext(DefaultFooterContext);\n const context = useTourContext(FOOTER_NAME);\n\n const composedRef = useComposedRefs(\n ref,\n hasDefaultFooter ? undefined : stepContext.onFooterChange\n );\n\n const FooterPrimitive = asChild ? Slot : \"div\";\n\n return (\n <FooterPrimitive\n data-slot=\"tour-footer\"\n dir={context.dir}\n {...footerProps}\n ref={composedRef}\n className={cn(\n \"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\",\n className\n )}\n />\n );\n}\n\nexport {\n TourRoot as Root,\n TourPortal as Portal,\n TourSpotlight as Spotlight,\n TourSpotlightRing as SpotlightRing,\n TourStep as Step,\n TourArrow as Arrow,\n TourHeader as Header,\n TourTitle as Title,\n TourDescription as Description,\n TourClose as Close,\n TourPrev as Prev,\n TourNext as Next,\n TourSkip as Skip,\n TourStepCounter as StepCounter,\n TourFooter as Footer,\n //\n TourRoot as Tour,\n TourPortal,\n TourSpotlight,\n TourSpotlightRing,\n TourStep,\n TourArrow,\n TourHeader,\n TourTitle,\n TourDescription,\n TourClose,\n TourPrev,\n TourNext,\n TourSkip,\n TourStepCounter,\n TourFooter,\n //\n type TourRootProps as TourProps,\n};\n"],"names":["ROOT_NAME","PORTAL_NAME","STEP_NAME","ARROW_NAME","HEADER_NAME","TITLE_NAME","DESCRIPTION_NAME","CLOSE_NAME","PREV_NAME","NEXT_NAME","SKIP_NAME","FOOTER_NAME","POINTER_DOWN_OUTSIDE","INTERACT_OUTSIDE","OPEN_AUTO_FOCUS","CLOSE_AUTO_FOCUS","EVENT_OPTIONS","DEFAULT_ALIGN_OFFSET","DEFAULT_SIDE_OFFSET","DEFAULT_SPOTLIGHT_PADDING","OPPOSITE_SIDE","useIsomorphicLayoutEffect","React","useAsRef","props","ref","useLazyRef","fn","focusGuardCount","createFocusGuard","element","useFocusGuards","edgeGuards","guards","node","useFocusTrap","containerRef","enabled","tourOpen","onOpenAutoFocus","onCloseAutoFocus","lastFocusedElementRef","onOpenAutoFocusRef","onCloseAutoFocusRef","tourOpenRef","container","previouslyFocusedElement","getTabbableCandidates","nodes","walker","isHiddenInput","getTabbableEdges","candidates","first","last","onFocusIn","event","target","onKeyDown","openAutoFocusEvent","tabbableCandidates","closeAutoFocusEvent","DirectionContext","useDirection","dirProp","contextDir","getDataState","open","useStore","selector","store","useStoreContext","getSnapshot","getTargetElement","getDefaultScrollBehavior","onScrollToElement","scrollBehavior","scrollOffset","offset","rect","viewportHeight","viewportWidth","scrollTop","getSideAndAlignFromPlacement","placement","side","align","getPlacement","updateMask","targetElement","padding","clientRect","x","y","width","height","path","StoreContext","consumerName","context","TourContext","useTourContext","StepContext","useStepContext","DefaultFooterContext","PortalContext","usePortalContext","useScrollLock","originalStyle","scrollbarWidth","TourRoot","openProp","defaultOpen","onOpenChange","valueProp","defaultValue","onValueChange","onComplete","onSkip","autoScroll","rootProps","stateRef","listenersRef","stepIdsMapRef","stepIdCounterRef","propsRef","cb","key","value","prevStep","nextStep","l","stepData","id","index","_","i","stepId","stepIndex","jsx","TourRootImpl","onEscapeKeyDown","onPointerDownOutside","onInteractOutside","alignOffset","sideOffset","spotlightPadding","dismissible","modal","stepFooter","asChild","rootImplProps","dir","portal","setPortal","previouslyFocusedElementRef","onEscapeKeyDownRef","state","prevOpenRef","wasOpen","elementToFocus","contextValue","portalContextValue","RootPrimitive","Slot","TourStep","collisionBoundary","collisionPadding","arrowPadding","sticky","hideWhenDetached","avoidCollisions","required","forceMount","onStepEnter","onStepLeave","onPointerDownCaptureProp","onFocusCaptureProp","onBlurCaptureProp","children","className","style","stepProps","arrow","setArrow","footer","setFooter","stepRef","stepIdRef","stepOrderRef","isPointerInsideReactTreeRef","isFocusInsideReactTreeRef","steps","resolvedSideOffset","resolvedAlignOffset","isCurrentStep","middleware","mainAxisOffset","crossAxisOffset","boundary","hasExplicitBoundaries","detectOverflowOptions","b","shift","limitShift","flip","onArrow","hide","refs","floatingStyles","finalPlacement","middlewareData","useFloating","autoUpdate","composedRef","useComposedRefs","placedSide","placedAlign","arrowX","arrowY","cannotCenterArrow","isHidden","stepContextValue","onResize","onScroll","rafId","stepElement","ownerDocument","onPointerDown","pointerDownOutsideEvent","interactOutsideEvent","timerId","isFocusInStep","isFocusInTarget","onPointerDownCapture","onFocusCapture","onBlurCapture","onTargetPointerDownCapture","onTargetFocusCapture","onTargetBlurCapture","StepPrimitive","jsxs","cn","TourSpotlight","backdropProps","maskPath","SpotlightPrimitive","TourSpotlightRing","ringProps","spotlightRect","RingPrimitive","TourPortal","portalContext","mounted","setMounted","portalContainer","ReactDOM","TourArrow","arrowProps","stepContext","baseSide","TourHeader","headerProps","HeaderPrimitive","TourTitle","titleProps","TitlePrimitive","TourDescription","descriptionProps","DescriptionPrimitive","TourClose","onClickProp","closeButtonProps","onClick","ClosePrimitive","X","TourPrev","prevButtonProps","Button","Fragment","ChevronLeft","TourNext","nextButtonProps","isLastStep","ChevronRight","TourSkip","skipButtonProps","TourStepCounter","format","current","total","stepCounterProps","StepCounterPrimitive","TourFooter","footerProps","hasDefaultFooter","FooterPrimitive"],"mappings":"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"}
|