@gajendra-naphade/react-web-guide
Version:
React Web Guide: A customizable, interactive tour component for React apps.
1 lines • 37.4 kB
Source Map (JSON)
{"version":3,"file":"index.umd.cjs","sources":["../src/components/TourCursor.jsx","../src/components/TourGuide.jsx"],"sourcesContent":["import { useEffect, useState } from 'react';\r\n\r\n\r\nconst TourCursor = ({ \r\n x, \r\n CursorMessageGap,\r\n y, \r\n isOffScreen,\r\n Theme,\r\n name = \"Guide\", \r\n color = \"#ff6b6b\", \r\n message, \r\n isVisible = true, \r\n onClick, \r\n showNext = false,\r\n cursorImage = null,\r\n messageBoxStyle = {},\r\n cursorStyle = {},\r\n nextButtonText,\r\n nextButtonContinueText,\r\n nextButtonClassName,\r\n nextButtonStyle = {},\r\n messageClass,\r\n CustomCursorClass=\"\",\r\n}) => {\r\n const [messagePosition, setMessagePosition] = useState({ left: false, top: false });\r\n const [isHidden, setIsHidden] = useState(false);\r\n \r\n useEffect(() => {\r\n // Message bubble dimensions\r\n const messageWidth = 192; // w-48 = 12rem = 192px\r\n const messageHeight = 100; // Approximate height including padding and content\r\n const cursorOffset = 24; // Distance from cursor to message\r\n \r\n // Calculate available space in each direction\r\n const spaceRight = window.innerWidth - x - cursorOffset;\r\n const spaceLeft = x - cursorOffset;\r\n const spaceBottom = window.innerHeight - y - cursorOffset;\r\n const spaceTop = y - cursorOffset;\r\n \r\n // change position if message would go off-screen\r\n const shouldBeOnLeft = spaceRight < messageWidth && spaceLeft > messageWidth;\r\n const shouldBeOnTop = spaceBottom < messageHeight && spaceTop > messageHeight;\r\n \r\n setMessagePosition({\r\n left: shouldBeOnLeft,\r\n top: shouldBeOnTop\r\n });\r\n }, [x, y]);\r\n\r\n if (!isVisible) return null;\r\n \r\n const messageClasses = [\r\n `${messageClass} ${Theme == \"Light\" ? \"bg-[#ffffff2d] text-gray-900\" : \"bg-[#0a0b1b] text-white\"} z-[999999999999999999999999999999] absolute px-2 md:!px-3 py-2 rounded-lg text-[10px] md:!text-xs font-medium 2xl:!text-sm backdrop-blur-md shadow-lg border-[0.2px] w-24 md:!w-48`,\r\n messagePosition.left ? \"right-14\" : \"left-8\",\r\n messagePosition.top && !messagePosition.left ? \"bottom-2 left-6\" : \"top-6\",\r\n \"transition-all duration-500 ease-in-out\"\r\n ].join(\" \");\r\n\r\n const handleHide = (e) => {\r\n e.stopPropagation();\r\n setIsHidden(true);\r\n };\r\n\r\n const handleContinue = (e) => {\r\n e.stopPropagation();\r\n setIsHidden(false);\r\n };\r\n \r\n return (\r\n <div \r\n className=\"fixed react-web-guide pointer-events-none z-[999999999999999999999999999999]\"\r\n style={{ \r\n left: isHidden ? `${window.innerWidth - 60}px` : `${x}px`,\r\n top: isHidden ? `50%` : `${y}px`,\r\n transition: 'all 0.5s ease-out',\r\n ...cursorStyle\r\n }}\r\n >\r\n {/* Main cursor */}\r\n <div className=\"relative z-[999999999999999999999999999999999]\">\r\n {cursorImage ? (\r\n <img \r\n src={cursorImage} \r\n alt=\"Custom cursor\" \r\n className={` ${CustomCursorClass} w-6 h-6 drop-shadow-lg ${messagePosition.top ? '-translate-y-5' : ''} z-[99999999999999999]`}\r\n style={{\r\n filter: 'drop-shadow(0 2px 4px rgba(0,0,0,0.2))'\r\n }}\r\n />\r\n ) : (\r\n <svg \r\n width=\"24\" \r\n height=\"24\" \r\n viewBox=\"0 0 24 24\" \r\n fill=\"none\" \r\n className={`drop-shadow-lg ${messagePosition.top ? '-translate-y-5' : ''} z-[99999999999999999]`}\r\n style={{\r\n filter: 'drop-shadow(0 2px 4px rgba(0,0,0,0.2))'\r\n }}\r\n >\r\n <path\r\n d=\"M5.65376 12.3673H5.46026L5.31717 12.4976L0.500002 16.8829L0.500002 1.19841L11.7841 12.3673H5.65376Z\"\r\n fill={color}\r\n stroke=\"white\"\r\n strokeWidth=\"2\"\r\n />\r\n </svg>\r\n )}\r\n \r\n {/* Name tag */}\r\n <div \r\n className={`absolute ${!messagePosition.top ? 'top-6 -left-4' : 'bottom-1 -left-4'} px-2 py-[1px] rounded-full text-[10px] max-w-[65px] truncate text-white font-medium whitespace-nowrap shadow-md`}\r\n style={{ backgroundColor: color }}\r\n >\r\n {name}\r\n </div>\r\n \r\n {/* Message bubble */}\r\n {message && (\r\n <>\r\n <div \r\n className={messageClasses}\r\n style={{\r\n ...messageBoxStyle,\r\n opacity: isHidden ? 0 : 1,\r\n transform: isHidden ? 'translateX(100px)' : 'translateX(0)',\r\n marginLeft: messagePosition.left ? '0' : `${CursorMessageGap}px`,\r\n }}\r\n >\r\n <button \r\n onClick={handleHide}\r\n title='Pause the tour'\r\n className={` ${Theme === \"Light\" ? \"bg-[#ffffff6c]\" : \"bg-[#6b6b6b6c] \"} pointer-events-auto absolute -top-6 -right-6 border backdrop-blur-md rounded-full p-[6px] shadow-md hover:shadow-lg transition-all duration-200 hover:scale-110`}\r\n >\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"red\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-heart-crack\" aria-hidden=\"true\"><path d=\"M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z\"></path><path d=\"m12 13-1-1 2-2-3-3 2-2\"></path></svg>\r\n </button>\r\n <div className=\"mb-2\">{message}</div>\r\n {showNext && !isHidden && (\r\n <button \r\n title={isOffScreen ? nextButtonContinueText : nextButtonText}\r\n onClick={onClick}\r\n className={`${nextButtonClassName} ${Theme === \"Light\" ? \"text-white bg-black/90\" : \"bg-white/90 text-black\"} !pointer-events-auto !z-[99999999999999999999] backdrop-blur-sm rounded-md border px-3 py-[1px] rounded-full text-[10px] flex items-center justify-center font-medium hover:shadow-lg transition-all duration-200 transform hover:scale-105 active:scale-95`}\r\n style={nextButtonStyle}\r\n >\r\n {isOffScreen ? nextButtonContinueText : nextButtonText}\r\n </button>\r\n )}\r\n </div>\r\n {/* Heart button - positioned independently */}\r\n {isHidden && (\r\n <div \r\n className=\"absolute\"\r\n style={{\r\n left: messagePosition.left ? 'auto' : 'calc(100% - 0.4rem)',\r\n right: messagePosition.left ? 'calc(100% - 3rem)' : 'auto',\r\n top: '50%',\r\n transform: 'translateY(-50%)'\r\n }}\r\n >\r\n <button \r\n onClick={handleContinue}\r\n title='Continue the tour'\r\n className={` ${Theme === \"Light\" ? \"bg-[#ffffff6c]\" : \"bg-[#6b6b6b6c] \"} pointer-events-auto backdrop-blur-md border rounded-full p-[6px] shadow-md hover:shadow-lg transition-all duration-200 hover:scale-110`}\r\n >\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"red\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-heart\" aria-hidden=\"true\"><path d=\"M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z\"></path></svg>\r\n </button>\r\n </div>\r\n )}\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default TourCursor; ","import React, { useState, useEffect, useRef } from 'react';\r\nimport TourCursor from './TourCursor';\r\n\r\nconst TourTooltip = ({ isVisible, onClose, theme }) => {\r\n if (!isVisible) return null;\r\n\r\n return (\r\n <div \r\n className=\"react-web-guide absolute w-36 bottom-full mb-2 left-1/2 transform -translate-x-1/2 animate-bounce-subtle z-[99999999999999999]\"\r\n >\r\n <div \r\n className={`relative ${theme === \"Dark\" ? \"bg-black/90 text-white\" : \"bg-white/90 text-black\"} px-3 py-2 rounded-lg shadow-lg backdrop-blur-sm tooltip-enter tooltip-enter-active`}\r\n >\r\n <button\r\n onClick={onClose}\r\n className={`absolute -top-2 -right-2 ${theme === \"Dark\" ? \"bg-black/90 text-white\" : \"bg-white/90 text-black\"} backdrop-blur-sm rounded-full p-1 shadow-md hover:shadow-lg transition-all duration-200 hover:scale-110`}\r\n >\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <path d=\"M18 6 6 18\"></path>\r\n <path d=\"m6 6 12 12\"></path>\r\n </svg>\r\n </button>\r\n <div className=\"text-sm font-medium text-center flex items-center gap-2\">\r\n <span>Start your web tour here!</span>\r\n </div>\r\n <div className={`absolute bottom-0 right-2 transform translate-y-1/2 rotate-45 w-2 h-2 ${theme === \"Dark\" ? \"bg-black/90\" : \"bg-white/90\"}`}></div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\n// Enhanced function to find the scrollable container\r\nconst findScrollableContainer = (element) => {\r\n if (!element || element === document.body) return window;\r\n \r\n const { overflow, overflowY, overflowX, height } = window.getComputedStyle(element);\r\n const hasScrollableContent = element.scrollHeight > element.clientHeight || element.scrollWidth > element.clientWidth;\r\n const isScrollable = ['auto', 'scroll'].some(value => \r\n [overflow, overflowY, overflowX].includes(value)\r\n );\r\n \r\n // Check for h-screen class or 100vh height\r\n const hasFixedHeight = element.classList.contains('h-screen') || \r\n height === '100vh' || \r\n height === '100%' ||\r\n element.style.height === '100vh' ||\r\n element.style.height === '100%';\r\n \r\n if ((isScrollable || hasFixedHeight) && hasScrollableContent) {\r\n return element;\r\n }\r\n \r\n return findScrollableContainer(element.parentElement);\r\n};\r\n\r\n// Enhanced viewport check for both window and container scrolling\r\nconst isElementInViewport = (element, container = window) => {\r\n if (!element) return false;\r\n \r\n const rect = element.getBoundingClientRect();\r\n \r\n if (container === window) {\r\n return (\r\n rect.top >= -100 &&\r\n rect.bottom <= window.innerHeight + 100 &&\r\n rect.left >= -100 &&\r\n rect.right <= window.innerWidth + 100\r\n );\r\n } else {\r\n const containerRect = container.getBoundingClientRect();\r\n return (\r\n rect.top >= containerRect.top - 100 &&\r\n rect.bottom <= containerRect.bottom + 100 &&\r\n rect.left >= containerRect.left - 100 &&\r\n rect.right <= containerRect.right + 100\r\n );\r\n }\r\n};\r\n\r\nconst TourGuide = ({ \r\n steps = [], \r\n Theme = \"Light\",\r\n onComplete,\r\n startButtonText = \"Start Tour\",\r\n skipButtonText = \"Skip Tour\",\r\n minimizedStartText = \"Start\",\r\n minimizedSkipText = \"Skip\",\r\n showProgress = true,\r\n Minimized = true,\r\n showTooltip = true,\r\n buttonPosition = {\r\n bottom: '1.5rem',\r\n right: '1.5rem',\r\n left: 'auto',\r\n top: 'auto'\r\n },\r\n expandedButtonClassName = ` ${Theme === \"Dark\" ? \"text-white bg-black/90\" : \"bg-white/90 text-black\"} border px-4 py-2 rounded-full shadow-lg hover:shadow-xl transition-all duration-300 hover:scale-105`,\r\n minimizedButtonClassName = ` ${Theme === \"Dark\" ? \"text-white bg-black/90\" : \"bg-white/90 text-black\"} border px-2 py-2 rounded-full shadow-lg hover:shadow-xl transition-all duration-300 hover:scale-105`,\r\n buttonStyle = {},\r\n CloseButtonText= <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"lucide lucide-x\" aria-hidden=\"true\"><path d=\"M18 6 6 18\"></path><path d=\"m6 6 12 12\"></path></svg>,\r\n ExpandButtonText= <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"lucide lucide-maximize2 lucide-maximize-2\" aria-hidden=\"true\"><path d=\"M15 3h6v6\"></path><path d=\"m21 3-7 7\"></path><path d=\"m3 21 7-7\"></path><path d=\"M9 21H3v-6\"></path></svg>,\r\n minimizedButtonStyle = {\r\n width: '3rem',\r\n height: '3rem',\r\n fontSize: '0.875rem'\r\n },\r\n closeButtonClassName = `${Theme === \"Dark\" ? \"text-white bg-black/90\" : \"bg-white/90 text-black\"} -translate-y-4 -translate-x-1 rounded-full p-1 shadow-md hover:shadow-lg transition-all duration-200 hover:scale-110`,\r\n expandButtonClassName = `${Theme === \"Dark\" ? \"text-white bg-black/90\" : \"bg-white/90 text-black\"} -translate-y-4 -translate-x-1 rounded-full p-1 shadow-md hover:shadow-lg transition-all duration-200 hover:scale-110`,\r\n closeButtonStyle = {},\r\n expandButtonStyle = {},\r\n cursorImage = null,\r\n messageBoxStyle = {},\r\n cursorStyle = {},\r\n nextButtonText = \"Next\",\r\n nextButtonContinueText= \"Continue\",\r\n nextButtonClassName,\r\n nextButtonStyle = {},\r\n messageClass,\r\n // New prop to specify scrollable container selector or element\r\n scrollContainer = null,\r\n CustomCursorClass,\r\n}) => {\r\n const [currentStep, setCurrentStep] = useState(0);\r\n const [isActive, setIsActive] = useState(false);\r\n const [isMinimized, setIsMinimized] = useState(Minimized);\r\n const [cursorPosition, setCursorPosition] = useState({ x: 0, y: 0 });\r\n const [isOffScreen, setIsOffScreen] = useState(false);\r\n const [showCursor, setShowCursor] = useState(true);\r\n const [showStartTooltip, setShowStartTooltip] = useState(showTooltip);\r\n const [scrollableContainer, setScrollableContainer] = useState(null);\r\n const containerRef = useRef(null);\r\n\r\n // Find the appropriate scrollable container\r\n useEffect(() => {\r\n if (!isActive || !steps[currentStep]?.ref.current) return;\r\n\r\n let container;\r\n \r\n if (scrollContainer) {\r\n // Use provided container (can be selector string or element)\r\n if (typeof scrollContainer === 'string') {\r\n container = document.querySelector(scrollContainer);\r\n } else {\r\n container = scrollContainer;\r\n }\r\n } else {\r\n // Auto-detect scrollable container with enhanced detection\r\n container = findScrollableContainer(steps[currentStep].ref.current);\r\n \r\n // Additional check for common scrollable containers\r\n if (container === window) {\r\n // Look for common scrollable container patterns\r\n const commonSelectors = [\r\n '.scrollDiv', // Your specific class\r\n '[class*=\"h-screen\"]',\r\n '[class*=\"overflow\"]',\r\n '.scroll-smooth',\r\n 'main',\r\n '#app',\r\n '#root'\r\n ];\r\n \r\n for (const selector of commonSelectors) {\r\n const foundContainer = document.querySelector(selector);\r\n if (foundContainer && foundContainer.scrollHeight > foundContainer.clientHeight) {\r\n container = foundContainer;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n \r\n setScrollableContainer(container);\r\n containerRef.current = container;\r\n }, [isActive, currentStep, scrollContainer]);\r\n\r\n const updateCursorPosition = () => {\r\n if (!isActive || currentStep >= steps.length) return;\r\n \r\n const step = steps[currentStep];\r\n if (step.ref.current) {\r\n const rect = step.ref.current.getBoundingClientRect();\r\n const x = rect.left + (step.offsetX || rect.width / 2);\r\n const y = rect.top + (step.offsetY || rect.height / 2);\r\n \r\n setCursorPosition({ x, y });\r\n \r\n // Check if element is visible within its container\r\n const container = containerRef.current || window;\r\n const isVisible = isElementInViewport(step.ref.current, container);\r\n setIsOffScreen(!isVisible);\r\n }\r\n };\r\n\r\n const scrollToElement = (element, container) => {\r\n if (!element) return;\r\n\r\n if (container === window) {\r\n // Window scrolling - avoid horizontal scrolling\r\n element.scrollIntoView({ \r\n behavior: 'smooth', \r\n block: 'center',\r\n inline: 'nearest'\r\n });\r\n } else if (container && container.scrollTo) {\r\n // Container scrolling - only scroll vertically\r\n const containerRect = container.getBoundingClientRect();\r\n const elementRect = element.getBoundingClientRect();\r\n \r\n const scrollTop = container.scrollTop + elementRect.top - containerRect.top - container.clientHeight / 2 + elementRect.height / 2;\r\n \r\n container.scrollTo({\r\n top: scrollTop,\r\n behavior: 'smooth'\r\n });\r\n } else {\r\n // Fallback to scrollIntoView - avoid horizontal scrolling\r\n element.scrollIntoView({ \r\n behavior: 'smooth', \r\n block: 'center',\r\n inline: 'nearest'\r\n });\r\n }\r\n };\r\n\r\n const handleNextClick = () => {\r\n if (currentStep < steps.length - 1) {\r\n const nextElement = steps[currentStep + 1]?.ref.current;\r\n const container = containerRef.current || window;\r\n \r\n if (nextElement && !isElementInViewport(nextElement, container)) {\r\n setShowCursor(false); // Hide cursor while scrolling\r\n scrollToElement(nextElement, container);\r\n \r\n setTimeout(() => {\r\n setIsOffScreen(false);\r\n setShowCursor(true); // Show cursor again after scrolling\r\n nextStep();\r\n }, 800);\r\n } else {\r\n nextStep();\r\n }\r\n } else {\r\n nextStep();\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n if (!isActive) return;\r\n \r\n updateCursorPosition();\r\n \r\n const container = containerRef.current;\r\n const handleScroll = () => updateCursorPosition();\r\n const handleResize = () => updateCursorPosition();\r\n \r\n // Add keyboard event handler\r\n const handleKeyDown = (e) => {\r\n if (e.key === 'ArrowRight') {\r\n handleNextClick();\r\n }\r\n };\r\n \r\n // Add scroll listeners to both window and container\r\n window.addEventListener('scroll', handleScroll, { passive: true });\r\n window.addEventListener('resize', handleResize);\r\n window.addEventListener('keydown', handleKeyDown);\r\n \r\n if (container && container !== window) {\r\n container.addEventListener('scroll', handleScroll, { passive: true });\r\n }\r\n \r\n return () => {\r\n window.removeEventListener('scroll', handleScroll);\r\n window.removeEventListener('resize', handleResize);\r\n window.removeEventListener('keydown', handleKeyDown);\r\n \r\n if (container && container !== window) {\r\n container.removeEventListener('scroll', handleScroll);\r\n }\r\n };\r\n }, [isActive, currentStep, scrollableContainer]);\r\n\r\n const nextStep = () => {\r\n if (currentStep < steps.length - 1) {\r\n setCurrentStep(currentStep + 1);\r\n } else {\r\n setIsActive(false);\r\n onComplete?.();\r\n }\r\n };\r\n\r\n const startTour = () => {\r\n setIsActive(true);\r\n setCurrentStep(0);\r\n setShowCursor(true);\r\n setTimeout(updateCursorPosition, 500);\r\n };\r\n\r\n const handleButtonClick = () => {\r\n if (isActive) {\r\n setIsActive(false);\r\n onComplete?.();\r\n } else {\r\n startTour();\r\n setShowStartTooltip(false);\r\n }\r\n };\r\n\r\n const handleMinimize = (e) => {\r\n e.stopPropagation();\r\n setIsMinimized(true);\r\n };\r\n\r\n const handleExpand = (e) => {\r\n e.stopPropagation();\r\n setIsMinimized(false);\r\n };\r\n\r\n return (\r\n <div className='react-web-guide'>\r\n <div \r\n className=\"fixed z-[999999999999999999999999999999999]\"\r\n style={buttonPosition}\r\n >\r\n {isMinimized ? (\r\n <div className=\"relative\">\r\n <TourTooltip \r\n isVisible={showStartTooltip && !isActive} \r\n onClose={() => setShowStartTooltip(false)}\r\n theme={Theme}\r\n />\r\n <button\r\n onClick={handleButtonClick}\r\n className={`${minimizedButtonClassName} transition-all duration-500`}\r\n style={{\r\n ...minimizedButtonStyle,\r\n ...buttonStyle\r\n }}\r\n >\r\n {isActive ? minimizedSkipText : minimizedStartText}\r\n </button>\r\n <button\r\n onClick={handleExpand}\r\n className={`${expandButtonClassName} transition-all p-1 duration-500`}\r\n style={expandButtonStyle}\r\n >\r\n {ExpandButtonText}\r\n </button>\r\n </div>\r\n ) : (\r\n <div className=\"relative z-[99999999999999999]\">\r\n <TourTooltip \r\n isVisible={showStartTooltip && !isActive} \r\n onClose={() => setShowStartTooltip(false)}\r\n theme={Theme}\r\n />\r\n <button\r\n onClick={handleButtonClick}\r\n className={`${expandedButtonClassName} transition-all duration-500`}\r\n style={buttonStyle}\r\n >\r\n {isActive ? skipButtonText : startButtonText}\r\n </button>\r\n <button\r\n onClick={handleMinimize}\r\n className={`${closeButtonClassName} transition-all p-1 duration-500`}\r\n style={closeButtonStyle}\r\n >\r\n {CloseButtonText}\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {isActive && (\r\n <>\r\n <TourCursor\r\n x={isOffScreen ? window.innerWidth / 2 : cursorPosition.x}\r\n y={isOffScreen ? window.innerHeight / 2 : cursorPosition.y}\r\n Theme={Theme}\r\n name={steps[currentStep]?.name || \"Guide\"}\r\n color={steps[currentStep]?.color || \"#ff6b6b\"}\r\n message={isOffScreen ? \"Hey the tour is incomplete!\" : steps[currentStep]?.message}\r\n isVisible={showCursor}\r\n onClick={handleNextClick}\r\n showNext={true}\r\n isOffScreen={isOffScreen}\r\n cursorImage={cursorImage}\r\n messageBoxStyle={messageBoxStyle}\r\n cursorStyle={cursorStyle}\r\n nextButtonText={nextButtonText}\r\n nextButtonContinueText={nextButtonContinueText}\r\n nextButtonClassName={nextButtonClassName}\r\n nextButtonStyle={nextButtonStyle}\r\n messageClass={messageClass}\r\n CursorMessageGap={steps[currentStep]?.CursorMessageGap || 0}\r\n CustomCursorClass={CustomCursorClass}\r\n />\r\n \r\n {showProgress && (\r\n <div className={`fixed top-4 right-4 z-[999999999] ${Theme =='Dark' ? 'bg-[#202020]' : 'bg-white/90' } backdrop-blur-sm border rounded-full px-4 py-2 shadow-lg`}>\r\n <div className={`text-sm font-medium ${Theme =='Dark' ? 'text-white' : 'text-gray-700' } `}>\r\n <span className=\"hidden sm:!block text-center\">Step {currentStep + 1} of {steps.length}</span>\r\n <span className=\"sm:hidden\">{currentStep + 1}/{steps.length}</span>\r\n </div>\r\n <div className=\"w-full h-1 bg-gray-200 rounded-full mt-1\">\r\n <div \r\n className=\"h-full bg-gradient-to-r from-purple-500 to-blue-500 rounded-full transition-all duration-500\"\r\n style={{ width: `${((currentStep + 1) / steps.length) * 100}%` }}\r\n />\r\n </div>\r\n </div>\r\n )}\r\n </>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default TourGuide;"],"names":["TourCursor","x","CursorMessageGap","y","isOffScreen","Theme","name","color","message","isVisible","onClick","showNext","cursorImage","messageBoxStyle","cursorStyle","nextButtonText","nextButtonContinueText","nextButtonClassName","nextButtonStyle","messageClass","CustomCursorClass","messagePosition","setMessagePosition","useState","isHidden","setIsHidden","useEffect","spaceRight","spaceLeft","spaceBottom","spaceTop","shouldBeOnLeft","shouldBeOnTop","messageClasses","handleHide","e","handleContinue","jsx","jsxs","Fragment","TourTooltip","onClose","theme","findScrollableContainer","element","overflow","overflowY","overflowX","height","hasScrollableContent","isScrollable","value","hasFixedHeight","isElementInViewport","container","rect","containerRect","TourGuide","steps","onComplete","startButtonText","skipButtonText","minimizedStartText","minimizedSkipText","showProgress","Minimized","showTooltip","buttonPosition","expandedButtonClassName","minimizedButtonClassName","buttonStyle","CloseButtonText","ExpandButtonText","minimizedButtonStyle","closeButtonClassName","expandButtonClassName","closeButtonStyle","expandButtonStyle","scrollContainer","currentStep","setCurrentStep","isActive","setIsActive","isMinimized","setIsMinimized","cursorPosition","setCursorPosition","setIsOffScreen","showCursor","setShowCursor","showStartTooltip","setShowStartTooltip","scrollableContainer","setScrollableContainer","containerRef","useRef","_a","commonSelectors","selector","foundContainer","updateCursorPosition","step","scrollToElement","elementRect","scrollTop","handleNextClick","nextElement","nextStep","handleScroll","handleResize","handleKeyDown","startTour","handleButtonClick","handleMinimize","handleExpand","_b","_c","_d"],"mappings":"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"}