asterui 0.12.58 → 0.12.60

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/dist/components/Autocomplete.js +1 -1
  2. package/dist/components/Autocomplete.js.map +1 -1
  3. package/dist/components/Button.js +1 -1
  4. package/dist/components/Button.js.map +1 -1
  5. package/dist/components/Cascader.js +147 -146
  6. package/dist/components/Cascader.js.map +1 -1
  7. package/dist/components/Checkbox.js +1 -1
  8. package/dist/components/Checkbox.js.map +1 -1
  9. package/dist/components/ColorPicker.js +1 -1
  10. package/dist/components/ColorPicker.js.map +1 -1
  11. package/dist/components/ContextMenu.js +90 -89
  12. package/dist/components/ContextMenu.js.map +1 -1
  13. package/dist/components/CopyButton.js +1 -1
  14. package/dist/components/CopyButton.js.map +1 -1
  15. package/dist/components/Countdown.js +1 -1
  16. package/dist/components/Countdown.js.map +1 -1
  17. package/dist/components/DatePicker.js +1 -1
  18. package/dist/components/DatePicker.js.map +1 -1
  19. package/dist/components/Dock.js +1 -1
  20. package/dist/components/Dock.js.map +1 -1
  21. package/dist/components/Drawer.js +66 -65
  22. package/dist/components/Drawer.js.map +1 -1
  23. package/dist/components/Dropdown.js +174 -173
  24. package/dist/components/Dropdown.js.map +1 -1
  25. package/dist/components/Empty.js +1 -1
  26. package/dist/components/Empty.js.map +1 -1
  27. package/dist/components/FileInput.js +1 -1
  28. package/dist/components/FileInput.js.map +1 -1
  29. package/dist/components/Filter.js +1 -1
  30. package/dist/components/Filter.js.map +1 -1
  31. package/dist/components/Form.js +1 -1
  32. package/dist/components/Form.js.map +1 -1
  33. package/dist/components/Input.js +1 -1
  34. package/dist/components/Input.js.map +1 -1
  35. package/dist/components/InputNumber.js +1 -1
  36. package/dist/components/InputNumber.js.map +1 -1
  37. package/dist/components/List.js +1 -1
  38. package/dist/components/List.js.map +1 -1
  39. package/dist/components/Loading.js +1 -1
  40. package/dist/components/Loading.js.map +1 -1
  41. package/dist/components/Mention.js +66 -65
  42. package/dist/components/Mention.js.map +1 -1
  43. package/dist/components/Modal.js +1 -1
  44. package/dist/components/Modal.js.map +1 -1
  45. package/dist/components/OTPInput.js +1 -1
  46. package/dist/components/OTPInput.js.map +1 -1
  47. package/dist/components/Pagination.js +1 -1
  48. package/dist/components/Pagination.js.map +1 -1
  49. package/dist/components/Popconfirm.js +1 -1
  50. package/dist/components/Popconfirm.js.map +1 -1
  51. package/dist/components/Radio.js +1 -1
  52. package/dist/components/Radio.js.map +1 -1
  53. package/dist/components/Range.js +1 -1
  54. package/dist/components/Range.js.map +1 -1
  55. package/dist/components/Rating.js +1 -1
  56. package/dist/components/Rating.js.map +1 -1
  57. package/dist/components/RichTextEditor.js +1 -1
  58. package/dist/components/RichTextEditor.js.map +1 -1
  59. package/dist/components/Segmented.js +1 -1
  60. package/dist/components/Segmented.js.map +1 -1
  61. package/dist/components/Select.js +1 -1
  62. package/dist/components/Select.js.map +1 -1
  63. package/dist/components/Table.d.ts +19 -0
  64. package/dist/components/Table.js +348 -310
  65. package/dist/components/Table.js.map +1 -1
  66. package/dist/components/Tabs.js +1 -1
  67. package/dist/components/Tabs.js.map +1 -1
  68. package/dist/components/Textarea.js +1 -1
  69. package/dist/components/Textarea.js.map +1 -1
  70. package/dist/components/ThemeController.js +1 -1
  71. package/dist/components/ThemeController.js.map +1 -1
  72. package/dist/components/TimePicker.js +1 -1
  73. package/dist/components/TimePicker.js.map +1 -1
  74. package/dist/components/Toggle.js +1 -1
  75. package/dist/components/Toggle.js.map +1 -1
  76. package/dist/components/Tour.js +83 -82
  77. package/dist/components/Tour.js.map +1 -1
  78. package/dist/components/Transfer.js +107 -103
  79. package/dist/components/Transfer.js.map +1 -1
  80. package/dist/components/TreeSelect.js +245 -244
  81. package/dist/components/TreeSelect.js.map +1 -1
  82. package/dist/hooks/useTheme.d.ts +1 -1
  83. package/dist/hooks/useTheme.js +1 -1
  84. package/dist/hooks/useTheme.js.map +1 -1
  85. package/dist/index.d.ts +4 -4
  86. package/dist/index.js +2 -2
  87. package/dist/{components → providers}/ConfigProvider.d.ts +8 -0
  88. package/dist/providers/ConfigProvider.js +50 -0
  89. package/dist/providers/ConfigProvider.js.map +1 -0
  90. package/dist/providers/ThemeProvider.js.map +1 -0
  91. package/package.json +1 -1
  92. package/dist/components/ConfigProvider.js +0 -46
  93. package/dist/components/ConfigProvider.js.map +0 -1
  94. package/dist/components/ThemeProvider.js.map +0 -1
  95. /package/dist/{components → providers}/ThemeProvider.d.ts +0 -0
  96. /package/dist/{components → providers}/ThemeProvider.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"Tour.js","sources":["../../src/components/Tour.tsx"],"sourcesContent":["import React, {\n useState,\n useEffect,\n useCallback,\n useRef,\n forwardRef,\n useImperativeHandle,\n} from 'react'\nimport { createPortal } from 'react-dom'\n\n// DaisyUI classes\nconst dBtn = 'btn'\nconst dBtnGhost = 'btn-ghost'\nconst dBtnSm = 'btn-sm'\nconst dBtnPrimary = 'btn-primary'\nconst dBtnXs = 'btn-xs'\nconst dBtnCircle = 'btn-circle'\n\nexport type TourPlacement =\n | 'top'\n | 'topLeft'\n | 'topRight'\n | 'bottom'\n | 'bottomLeft'\n | 'bottomRight'\n | 'left'\n | 'leftTop'\n | 'leftBottom'\n | 'right'\n | 'rightTop'\n | 'rightBottom'\n | 'center'\n\nexport type TourType = 'default' | 'primary'\n\nexport interface TourArrowConfig {\n pointAtCenter?: boolean\n}\n\nexport interface TourMaskConfig {\n style?: React.CSSProperties\n color?: string\n}\n\nexport interface TourButtonProps {\n children?: React.ReactNode\n onClick?: () => void\n}\n\nexport interface TourStepProps {\n /** Target element ref or function returning element */\n target?: React.RefObject<HTMLElement | null> | (() => HTMLElement | null) | null\n /** Step title */\n title: React.ReactNode\n /** Step description */\n description?: React.ReactNode\n /** Cover image or content above title */\n cover?: React.ReactNode\n /** Placement of popover relative to target */\n placement?: TourPlacement\n /** Whether to show arrow (overrides Tour setting) */\n arrow?: boolean | TourArrowConfig\n /** Custom close icon for this step */\n closeIcon?: React.ReactNode\n /** Show mask overlay (overrides Tour setting) */\n mask?: boolean | TourMaskConfig\n /** Type affects styling (overrides Tour setting) */\n type?: TourType\n /** Scroll into view options (overrides Tour setting) */\n scrollIntoViewOptions?: boolean | ScrollIntoViewOptions\n /** Next button props */\n nextButtonProps?: TourButtonProps\n /** Previous button props */\n prevButtonProps?: TourButtonProps\n /** Custom class for this step's popover */\n className?: string\n /** Custom style for this step's popover */\n style?: React.CSSProperties\n /** Called when this step becomes active */\n onClose?: () => void\n}\n\nexport type TourSemanticName = 'root' | 'mask' | 'popover' | 'header' | 'content' | 'footer' | 'indicator' | 'close'\n\nexport interface TourActionInfo {\n current: number\n total: number\n}\n\nexport interface TourRef {\n /** Go to a specific step */\n goTo: (step: number) => void\n /** Go to the next step */\n next: () => void\n /** Go to the previous step */\n prev: () => void\n /** Close the tour */\n close: () => void\n}\n\nexport interface TourProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n /** Whether tour is visible */\n open?: boolean\n /** Callback when tour closes */\n onClose?: () => void\n /** Callback when tour finishes (last step completed) */\n onFinish?: () => void\n /** Tour steps */\n steps: TourStepProps[]\n /** Current step (controlled) */\n current?: number\n /** Callback when step changes */\n onChange?: (current: number) => void\n /** Whether to show arrow on popover */\n arrow?: boolean | TourArrowConfig\n /** Custom close icon */\n closeIcon?: React.ReactNode\n /** Show mask overlay */\n mask?: boolean | TourMaskConfig\n /** Disable interaction on highlighted area */\n disabledInteraction?: boolean\n /** Type affects styling */\n type?: TourType\n /** Gap between highlight and target */\n gap?: { offset?: number | [number, number]; radius?: number }\n /** Text for prev button */\n prevButtonText?: React.ReactNode\n /** Text for next button */\n nextButtonText?: React.ReactNode\n /** Text for finish button */\n finishButtonText?: React.ReactNode\n /** Text for skip button */\n skipButtonText?: React.ReactNode\n /** Show skip button */\n showSkip?: boolean\n /** Show step indicators */\n showIndicators?: boolean\n /** Close on mask click */\n closeOnMaskClick?: boolean\n /** Close on escape key */\n closeOnEscape?: boolean\n /** Scroll target into view */\n scrollIntoViewOptions?: boolean | ScrollIntoViewOptions\n /** Z-index for tour overlay */\n zIndex?: number\n /** Custom indicator renderer */\n indicatorsRender?: (current: number, total: number) => React.ReactNode\n /** Custom action buttons renderer */\n actionsRender?: (originNode: React.ReactNode, info: TourActionInfo) => React.ReactNode\n /** Rendering container for tour */\n getPopupContainer?: (node: HTMLElement) => HTMLElement\n /** Semantic class names */\n classNames?: Partial<Record<TourSemanticName, string>>\n /** Semantic styles */\n styles?: Partial<Record<TourSemanticName, React.CSSProperties>>\n /** Test ID for testing */\n 'data-testid'?: string\n}\n\nconst getTargetElement = (\n target: TourStepProps['target']\n): HTMLElement | null => {\n if (!target) return null\n if (typeof target === 'function') return target()\n return target.current\n}\n\nconst getPopoverPosition = (\n targetRect: DOMRect | null,\n placement: TourPlacement,\n popoverRect: DOMRect,\n gap: number,\n arrow: boolean | TourArrowConfig\n): { top: number; left: number } => {\n if (!targetRect || placement === 'center') {\n return {\n top: window.innerHeight / 2 - popoverRect.height / 2,\n left: window.innerWidth / 2 - popoverRect.width / 2,\n }\n }\n\n const scrollY = window.scrollY\n const scrollX = window.scrollX\n const pointAtCenter = typeof arrow === 'object' && arrow.pointAtCenter\n\n const positions: Record<TourPlacement, { top: number; left: number }> = {\n top: {\n top: targetRect.top + scrollY - popoverRect.height - gap,\n left: pointAtCenter\n ? targetRect.left + scrollX + targetRect.width / 2 - popoverRect.width / 2\n : targetRect.left + scrollX + targetRect.width / 2 - popoverRect.width / 2,\n },\n topLeft: {\n top: targetRect.top + scrollY - popoverRect.height - gap,\n left: targetRect.left + scrollX,\n },\n topRight: {\n top: targetRect.top + scrollY - popoverRect.height - gap,\n left: targetRect.right + scrollX - popoverRect.width,\n },\n bottom: {\n top: targetRect.bottom + scrollY + gap,\n left: targetRect.left + scrollX + targetRect.width / 2 - popoverRect.width / 2,\n },\n bottomLeft: {\n top: targetRect.bottom + scrollY + gap,\n left: targetRect.left + scrollX,\n },\n bottomRight: {\n top: targetRect.bottom + scrollY + gap,\n left: targetRect.right + scrollX - popoverRect.width,\n },\n left: {\n top: targetRect.top + scrollY + targetRect.height / 2 - popoverRect.height / 2,\n left: targetRect.left + scrollX - popoverRect.width - gap,\n },\n leftTop: {\n top: targetRect.top + scrollY,\n left: targetRect.left + scrollX - popoverRect.width - gap,\n },\n leftBottom: {\n top: targetRect.bottom + scrollY - popoverRect.height,\n left: targetRect.left + scrollX - popoverRect.width - gap,\n },\n right: {\n top: targetRect.top + scrollY + targetRect.height / 2 - popoverRect.height / 2,\n left: targetRect.right + scrollX + gap,\n },\n rightTop: {\n top: targetRect.top + scrollY,\n left: targetRect.right + scrollX + gap,\n },\n rightBottom: {\n top: targetRect.bottom + scrollY - popoverRect.height,\n left: targetRect.right + scrollX + gap,\n },\n center: {\n top: window.innerHeight / 2 - popoverRect.height / 2,\n left: window.innerWidth / 2 - popoverRect.width / 2,\n },\n }\n\n return positions[placement]\n}\n\nconst getArrowPosition = (\n placement: TourPlacement\n): { position: string; transform: string } => {\n const arrowPositions: Record<TourPlacement, { position: string; transform: string }> = {\n top: { position: 'bottom-0 left-1/2', transform: 'translate(-50%, 50%) rotate(45deg)' },\n topLeft: { position: 'bottom-0 left-4', transform: 'translate(0, 50%) rotate(45deg)' },\n topRight: { position: 'bottom-0 right-4', transform: 'translate(0, 50%) rotate(45deg)' },\n bottom: { position: 'top-0 left-1/2', transform: 'translate(-50%, -50%) rotate(45deg)' },\n bottomLeft: { position: 'top-0 left-4', transform: 'translate(0, -50%) rotate(45deg)' },\n bottomRight: { position: 'top-0 right-4', transform: 'translate(0, -50%) rotate(45deg)' },\n left: { position: 'right-0 top-1/2', transform: 'translate(50%, -50%) rotate(45deg)' },\n leftTop: { position: 'right-0 top-4', transform: 'translate(50%, 0) rotate(45deg)' },\n leftBottom: { position: 'right-0 bottom-4', transform: 'translate(50%, 0) rotate(45deg)' },\n right: { position: 'left-0 top-1/2', transform: 'translate(-50%, -50%) rotate(45deg)' },\n rightTop: { position: 'left-0 top-4', transform: 'translate(-50%, 0) rotate(45deg)' },\n rightBottom: { position: 'left-0 bottom-4', transform: 'translate(-50%, 0) rotate(45deg)' },\n center: { position: 'hidden', transform: '' },\n }\n return arrowPositions[placement]\n}\n\nconst defaultCloseIcon = (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n)\n\nexport const Tour = forwardRef<TourRef, TourProps>(\n (\n {\n open = false,\n onClose,\n onFinish,\n steps,\n current: controlledCurrent,\n onChange,\n arrow = true,\n closeIcon,\n mask = true,\n disabledInteraction = false,\n type = 'default',\n gap = { offset: 6, radius: 2 },\n prevButtonText = 'Previous',\n nextButtonText = 'Next',\n finishButtonText = 'Finish',\n skipButtonText = 'Skip',\n showSkip = true,\n showIndicators = true,\n closeOnMaskClick = true,\n closeOnEscape = true,\n scrollIntoViewOptions = true,\n zIndex = 1001,\n indicatorsRender,\n actionsRender,\n getPopupContainer,\n classNames = {},\n styles = {},\n className,\n style,\n 'data-testid': testId,\n ...rest\n },\n ref\n ) => {\n const [internalCurrent, setInternalCurrent] = useState(0)\n const [targetRect, setTargetRect] = useState<DOMRect | null>(null)\n const [popoverPosition, setPopoverPosition] = useState({ top: 0, left: 0 })\n const popoverRef = useRef<HTMLDivElement>(null)\n const containerRef = useRef<HTMLDivElement>(null)\n const liveRegionRef = useRef<HTMLDivElement>(null)\n\n const baseTestId = testId ?? 'tour'\n const getTestId = (suffix: string) => `${baseTestId}-${suffix}`\n\n const isControlled = controlledCurrent !== undefined\n const currentStep = isControlled ? controlledCurrent : internalCurrent\n const step = steps[currentStep]\n\n // Resolve gap values\n const gapOffset = gap.offset ?? 6\n const gapRadius = gap.radius ?? 2\n const gapOffsetValue = Array.isArray(gapOffset) ? gapOffset[0] : gapOffset\n\n // Resolve per-step overrides\n const resolvedArrow = step?.arrow ?? arrow\n const resolvedMask = step?.mask ?? mask\n const resolvedType = step?.type ?? type\n const resolvedScrollOptions = step?.scrollIntoViewOptions ?? scrollIntoViewOptions\n const resolvedCloseIcon = step?.closeIcon ?? closeIcon\n\n const showArrow = resolvedArrow !== false && step?.placement !== 'center'\n\n // Mask color\n const maskColor =\n typeof resolvedMask === 'object' && resolvedMask.color\n ? resolvedMask.color\n : 'rgba(0, 0, 0, 0.5)'\n const maskStyle =\n typeof resolvedMask === 'object' && resolvedMask.style ? resolvedMask.style : {}\n\n const updatePosition = useCallback(() => {\n if (!step) return\n\n const target = getTargetElement(step.target)\n const rect = target?.getBoundingClientRect() ?? null\n setTargetRect(rect)\n\n if (popoverRef.current) {\n const popoverRect = popoverRef.current.getBoundingClientRect()\n const placement = step.placement ?? 'bottom'\n const pos = getPopoverPosition(\n rect,\n placement,\n popoverRect,\n gapOffsetValue + gapRadius,\n resolvedArrow\n )\n setPopoverPosition(pos)\n }\n }, [step, gapOffsetValue, gapRadius, resolvedArrow])\n\n const goToStep = useCallback(\n (stepIndex: number) => {\n if (stepIndex < 0 || stepIndex >= steps.length) return\n\n // Call onClose for current step\n steps[currentStep]?.onClose?.()\n\n if (!isControlled) {\n setInternalCurrent(stepIndex)\n }\n onChange?.(stepIndex)\n\n // Announce step change\n if (liveRegionRef.current) {\n liveRegionRef.current.textContent = `Step ${stepIndex + 1} of ${steps.length}: ${\n typeof steps[stepIndex]?.title === 'string' ? steps[stepIndex]?.title : ''\n }`\n }\n },\n [steps, currentStep, isControlled, onChange]\n )\n\n const handleClose = useCallback(() => {\n onClose?.()\n }, [onClose])\n\n const handlePrev = useCallback(() => {\n step?.prevButtonProps?.onClick?.()\n goToStep(currentStep - 1)\n }, [currentStep, goToStep, step])\n\n const handleNext = useCallback(() => {\n step?.nextButtonProps?.onClick?.()\n if (currentStep === steps.length - 1) {\n onFinish?.()\n onClose?.()\n } else {\n goToStep(currentStep + 1)\n }\n }, [currentStep, steps.length, goToStep, onFinish, onClose, step])\n\n const handleSkip = useCallback(() => {\n onClose?.()\n }, [onClose])\n\n const handleMaskClick = useCallback(() => {\n if (closeOnMaskClick) {\n onClose?.()\n }\n }, [closeOnMaskClick, onClose])\n\n // Expose imperative methods\n useImperativeHandle(\n ref,\n () => ({\n goTo: goToStep,\n next: handleNext,\n prev: handlePrev,\n close: handleClose,\n }),\n [goToStep, handleNext, handlePrev, handleClose]\n )\n\n // Reset to first step when opening\n useEffect(() => {\n if (open && !isControlled) {\n setInternalCurrent(0)\n }\n }, [open, isControlled])\n\n // Update position on step change or open\n useEffect(() => {\n if (!open) return\n\n updatePosition()\n\n // Scroll target into view\n if (resolvedScrollOptions && step?.target) {\n const target = getTargetElement(step.target)\n if (target) {\n const scrollOptions: ScrollIntoViewOptions =\n typeof resolvedScrollOptions === 'object'\n ? resolvedScrollOptions\n : { behavior: 'smooth', block: 'center' }\n target.scrollIntoView(scrollOptions)\n }\n }\n\n // Announce first step\n if (currentStep === 0 && liveRegionRef.current) {\n liveRegionRef.current.textContent = `Tour started. Step 1 of ${steps.length}: ${\n typeof step?.title === 'string' ? step?.title : ''\n }`\n }\n }, [open, currentStep, step, resolvedScrollOptions, updatePosition, steps.length])\n\n // Update position on resize/scroll\n useEffect(() => {\n if (!open) return\n\n const handleUpdate = () => updatePosition()\n window.addEventListener('resize', handleUpdate)\n window.addEventListener('scroll', handleUpdate, true)\n\n // Initial position after popover renders\n requestAnimationFrame(updatePosition)\n\n return () => {\n window.removeEventListener('resize', handleUpdate)\n window.removeEventListener('scroll', handleUpdate, true)\n }\n }, [open, updatePosition])\n\n // Keyboard handling\n useEffect(() => {\n if (!open) return\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && closeOnEscape) {\n onClose?.()\n } else if (e.key === 'ArrowRight' || e.key === 'ArrowDown') {\n e.preventDefault()\n handleNext()\n } else if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') {\n e.preventDefault()\n handlePrev()\n } else if (e.key === 'Tab') {\n // Focus trap within popover\n if (popoverRef.current) {\n const focusableElements = popoverRef.current.querySelectorAll<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n )\n const firstElement = focusableElements[0]\n const lastElement = focusableElements[focusableElements.length - 1]\n\n if (e.shiftKey && document.activeElement === firstElement) {\n e.preventDefault()\n lastElement?.focus()\n } else if (!e.shiftKey && document.activeElement === lastElement) {\n e.preventDefault()\n firstElement?.focus()\n }\n }\n }\n }\n\n document.addEventListener('keydown', handleKeyDown)\n return () => document.removeEventListener('keydown', handleKeyDown)\n }, [open, closeOnEscape, onClose, handleNext, handlePrev])\n\n // Focus management - focus first button when tour opens\n useEffect(() => {\n if (open && popoverRef.current) {\n requestAnimationFrame(() => {\n const firstButton = popoverRef.current?.querySelector<HTMLElement>('button')\n firstButton?.focus()\n })\n }\n }, [open, currentStep])\n\n if (!open || !step) return null\n\n const isFirstStep = currentStep === 0\n const isLastStep = currentStep === steps.length - 1\n const placement = step.placement ?? 'bottom'\n const arrowPos = getArrowPosition(placement)\n\n // Default indicators\n const defaultIndicators =\n showIndicators && steps.length > 1 ? (\n <div\n className={`flex gap-1 mb-4 ${classNames.indicator ?? ''}`}\n style={styles.indicator}\n data-testid={getTestId('indicators')}\n >\n {steps.map((_, index) => (\n <button\n key={index}\n className={`w-2 h-2 rounded-full transition-colors ${\n index === currentStep\n ? 'bg-primary'\n : 'bg-base-300 hover:bg-base-content/30'\n }`}\n onClick={() => goToStep(index)}\n aria-label={`Go to step ${index + 1}`}\n aria-current={index === currentStep ? 'step' : undefined}\n data-testid={getTestId(`indicator-${index}`)}\n />\n ))}\n </div>\n ) : null\n\n const indicators = indicatorsRender\n ? indicatorsRender(currentStep, steps.length)\n : defaultIndicators\n\n // Default action buttons\n const defaultActions = (\n <div\n className={`flex items-center justify-between gap-2 ${classNames.footer ?? ''}`}\n style={styles.footer}\n data-testid={getTestId('footer')}\n >\n <div>\n {showSkip && !isLastStep && (\n <button\n className={`${dBtn} ${dBtnGhost} ${dBtnSm}`}\n onClick={handleSkip}\n data-testid={getTestId('skip')}\n >\n {skipButtonText}\n </button>\n )}\n </div>\n <div className=\"flex gap-2\">\n {!isFirstStep && (\n <button\n className={`${dBtn} ${dBtnGhost} ${dBtnSm}`}\n onClick={handlePrev}\n data-testid={getTestId('prev')}\n >\n {step.prevButtonProps?.children ?? prevButtonText}\n </button>\n )}\n <button\n className={`${dBtn} ${dBtnSm} ${resolvedType === 'primary' ? dBtnPrimary : ''}`}\n onClick={handleNext}\n data-testid={getTestId('next')}\n >\n {step.nextButtonProps?.children ?? (isLastStep ? finishButtonText : nextButtonText)}\n </button>\n </div>\n </div>\n )\n\n const actions = actionsRender\n ? actionsRender(defaultActions, { current: currentStep, total: steps.length })\n : defaultActions\n\n const content = (\n <div\n ref={containerRef}\n className={`fixed inset-0 ${classNames.root ?? ''} ${className ?? ''}`}\n style={{ zIndex, ...styles.root, ...style }}\n data-testid={baseTestId}\n data-state={open ? 'open' : 'closed'}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={`Tour step ${currentStep + 1} of ${steps.length}`}\n {...rest}\n >\n {/* Live region for screen reader announcements */}\n <div\n ref={liveRegionRef}\n className=\"sr-only\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n />\n\n {/* Mask overlay with spotlight cutout */}\n {resolvedMask && (\n <svg\n className={`absolute inset-0 w-full h-full ${\n disabledInteraction ? 'pointer-events-auto' : 'pointer-events-auto'\n } ${classNames.mask ?? ''}`}\n style={{ zIndex, ...maskStyle, ...styles.mask }}\n onClick={handleMaskClick}\n data-testid={getTestId('mask')}\n aria-hidden=\"true\"\n >\n <defs>\n <mask id={`tour-mask-${baseTestId}`}>\n <rect x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" fill=\"white\" />\n {targetRect && (\n <rect\n x={targetRect.left - gapRadius}\n y={targetRect.top - gapRadius}\n width={targetRect.width + gapRadius * 2}\n height={targetRect.height + gapRadius * 2}\n rx={gapRadius}\n fill=\"black\"\n />\n )}\n </mask>\n </defs>\n <rect\n x=\"0\"\n y=\"0\"\n width=\"100%\"\n height=\"100%\"\n fill={maskColor}\n mask={`url(#tour-mask-${baseTestId})`}\n />\n </svg>\n )}\n\n {/* Interaction blocker for highlighted area */}\n {disabledInteraction && targetRect && (\n <div\n className=\"absolute pointer-events-auto\"\n style={{\n left: targetRect.left - gapRadius,\n top: targetRect.top - gapRadius,\n width: targetRect.width + gapRadius * 2,\n height: targetRect.height + gapRadius * 2,\n zIndex: zIndex + 1,\n }}\n data-testid={getTestId('blocker')}\n />\n )}\n\n {/* Popover */}\n <div\n ref={popoverRef}\n className={`absolute bg-base-100 rounded-lg shadow-xl border border-base-300 max-w-sm ${\n classNames.popover ?? ''\n } ${step.className ?? ''}`}\n style={{\n top: popoverPosition.top,\n left: popoverPosition.left,\n zIndex: zIndex + 2,\n ...styles.popover,\n ...step.style,\n }}\n onClick={(e) => e.stopPropagation()}\n data-testid={getTestId('popover')}\n data-placement={placement}\n >\n {/* Arrow */}\n {showArrow && (\n <div\n className={`absolute w-3 h-3 bg-base-100 border-base-300 ${arrowPos.position}`}\n style={{\n transform: arrowPos.transform,\n borderWidth: '1px',\n borderTopColor: 'transparent',\n borderLeftColor: 'transparent',\n }}\n data-testid={getTestId('arrow')}\n />\n )}\n\n {/* Close button */}\n {resolvedCloseIcon !== false && (\n <button\n className={`absolute top-2 right-2 ${dBtn} ${dBtnGhost} ${dBtnXs} ${dBtnCircle} ${\n classNames.close ?? ''\n }`}\n style={styles.close}\n onClick={handleClose}\n aria-label=\"Close tour\"\n data-testid={getTestId('close')}\n >\n {resolvedCloseIcon ?? defaultCloseIcon}\n </button>\n )}\n\n {/* Cover */}\n {step.cover && (\n <div className=\"rounded-t-lg overflow-hidden\" data-testid={getTestId('cover')}>\n {step.cover}\n </div>\n )}\n\n {/* Content */}\n <div\n className={`p-4 ${classNames.content ?? ''}`}\n style={styles.content}\n data-testid={getTestId('content')}\n >\n <div\n className={`${classNames.header ?? ''}`}\n style={styles.header}\n data-testid={getTestId('header')}\n >\n <h3 className=\"font-semibold text-lg mb-1 pr-6\">{step.title}</h3>\n {step.description && (\n <p className=\"text-base-content/70 text-sm mb-4\">{step.description}</p>\n )}\n </div>\n\n {/* Indicators */}\n {indicators}\n\n {/* Navigation */}\n {actions}\n </div>\n </div>\n </div>\n )\n\n // Get container for portal\n const container = getPopupContainer\n ? getPopupContainer(document.body)\n : document.body\n\n return createPortal(content, container)\n }\n)\n\nTour.displayName = 'Tour'\n"],"names":["dBtn","dBtnGhost","dBtnSm","dBtnPrimary","dBtnXs","dBtnCircle","getTargetElement","target","getPopoverPosition","targetRect","placement","popoverRect","gap","arrow","scrollY","scrollX","pointAtCenter","getArrowPosition","defaultCloseIcon","jsx","Tour","forwardRef","open","onClose","onFinish","steps","controlledCurrent","onChange","closeIcon","mask","disabledInteraction","type","prevButtonText","nextButtonText","finishButtonText","skipButtonText","showSkip","showIndicators","closeOnMaskClick","closeOnEscape","scrollIntoViewOptions","zIndex","indicatorsRender","actionsRender","getPopupContainer","classNames","styles","className","style","testId","rest","ref","internalCurrent","setInternalCurrent","useState","setTargetRect","popoverPosition","setPopoverPosition","popoverRef","useRef","containerRef","liveRegionRef","baseTestId","getTestId","suffix","isControlled","currentStep","step","gapOffset","gapRadius","gapOffsetValue","resolvedArrow","resolvedMask","resolvedType","resolvedScrollOptions","resolvedCloseIcon","showArrow","maskColor","maskStyle","updatePosition","useCallback","rect","pos","goToStep","stepIndex","handleClose","handlePrev","handleNext","handleSkip","handleMaskClick","useImperativeHandle","useEffect","scrollOptions","handleUpdate","handleKeyDown","e","focusableElements","firstElement","lastElement","isFirstStep","isLastStep","arrowPos","defaultIndicators","_","index","indicators","defaultActions","jsxs","actions","content","container","createPortal"],"mappings":"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"}
1
+ {"version":3,"file":"Tour.js","sources":["../../src/components/Tour.tsx"],"sourcesContent":["import React, {\n useState,\n useEffect,\n useCallback,\n useRef,\n forwardRef,\n useImperativeHandle,\n} from 'react'\nimport { createPortal } from 'react-dom'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dBtn = 'btn'\nconst dBtnGhost = 'btn-ghost'\nconst dBtnSm = 'btn-sm'\nconst dBtnPrimary = 'btn-primary'\nconst dBtnXs = 'btn-xs'\nconst dBtnCircle = 'btn-circle'\n\nexport type TourPlacement =\n | 'top'\n | 'topLeft'\n | 'topRight'\n | 'bottom'\n | 'bottomLeft'\n | 'bottomRight'\n | 'left'\n | 'leftTop'\n | 'leftBottom'\n | 'right'\n | 'rightTop'\n | 'rightBottom'\n | 'center'\n\nexport type TourType = 'default' | 'primary'\n\nexport interface TourArrowConfig {\n pointAtCenter?: boolean\n}\n\nexport interface TourMaskConfig {\n style?: React.CSSProperties\n color?: string\n}\n\nexport interface TourButtonProps {\n children?: React.ReactNode\n onClick?: () => void\n}\n\nexport interface TourStepProps {\n /** Target element ref or function returning element */\n target?: React.RefObject<HTMLElement | null> | (() => HTMLElement | null) | null\n /** Step title */\n title: React.ReactNode\n /** Step description */\n description?: React.ReactNode\n /** Cover image or content above title */\n cover?: React.ReactNode\n /** Placement of popover relative to target */\n placement?: TourPlacement\n /** Whether to show arrow (overrides Tour setting) */\n arrow?: boolean | TourArrowConfig\n /** Custom close icon for this step */\n closeIcon?: React.ReactNode\n /** Show mask overlay (overrides Tour setting) */\n mask?: boolean | TourMaskConfig\n /** Type affects styling (overrides Tour setting) */\n type?: TourType\n /** Scroll into view options (overrides Tour setting) */\n scrollIntoViewOptions?: boolean | ScrollIntoViewOptions\n /** Next button props */\n nextButtonProps?: TourButtonProps\n /** Previous button props */\n prevButtonProps?: TourButtonProps\n /** Custom class for this step's popover */\n className?: string\n /** Custom style for this step's popover */\n style?: React.CSSProperties\n /** Called when this step becomes active */\n onClose?: () => void\n}\n\nexport type TourSemanticName = 'root' | 'mask' | 'popover' | 'header' | 'content' | 'footer' | 'indicator' | 'close'\n\nexport interface TourActionInfo {\n current: number\n total: number\n}\n\nexport interface TourRef {\n /** Go to a specific step */\n goTo: (step: number) => void\n /** Go to the next step */\n next: () => void\n /** Go to the previous step */\n prev: () => void\n /** Close the tour */\n close: () => void\n}\n\nexport interface TourProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n /** Whether tour is visible */\n open?: boolean\n /** Callback when tour closes */\n onClose?: () => void\n /** Callback when tour finishes (last step completed) */\n onFinish?: () => void\n /** Tour steps */\n steps: TourStepProps[]\n /** Current step (controlled) */\n current?: number\n /** Callback when step changes */\n onChange?: (current: number) => void\n /** Whether to show arrow on popover */\n arrow?: boolean | TourArrowConfig\n /** Custom close icon */\n closeIcon?: React.ReactNode\n /** Show mask overlay */\n mask?: boolean | TourMaskConfig\n /** Disable interaction on highlighted area */\n disabledInteraction?: boolean\n /** Type affects styling */\n type?: TourType\n /** Gap between highlight and target */\n gap?: { offset?: number | [number, number]; radius?: number }\n /** Text for prev button */\n prevButtonText?: React.ReactNode\n /** Text for next button */\n nextButtonText?: React.ReactNode\n /** Text for finish button */\n finishButtonText?: React.ReactNode\n /** Text for skip button */\n skipButtonText?: React.ReactNode\n /** Show skip button */\n showSkip?: boolean\n /** Show step indicators */\n showIndicators?: boolean\n /** Close on mask click */\n closeOnMaskClick?: boolean\n /** Close on escape key */\n closeOnEscape?: boolean\n /** Scroll target into view */\n scrollIntoViewOptions?: boolean | ScrollIntoViewOptions\n /** Z-index for tour overlay */\n zIndex?: number\n /** Custom indicator renderer */\n indicatorsRender?: (current: number, total: number) => React.ReactNode\n /** Custom action buttons renderer */\n actionsRender?: (originNode: React.ReactNode, info: TourActionInfo) => React.ReactNode\n /** Rendering container for tour */\n getPopupContainer?: (node: HTMLElement) => HTMLElement\n /** Semantic class names */\n classNames?: Partial<Record<TourSemanticName, string>>\n /** Semantic styles */\n styles?: Partial<Record<TourSemanticName, React.CSSProperties>>\n /** Test ID for testing */\n 'data-testid'?: string\n}\n\nconst getTargetElement = (\n target: TourStepProps['target']\n): HTMLElement | null => {\n if (!target) return null\n if (typeof target === 'function') return target()\n return target.current\n}\n\nconst getPopoverPosition = (\n targetRect: DOMRect | null,\n placement: TourPlacement,\n popoverRect: DOMRect,\n gap: number,\n arrow: boolean | TourArrowConfig\n): { top: number; left: number } => {\n if (!targetRect || placement === 'center') {\n return {\n top: window.innerHeight / 2 - popoverRect.height / 2,\n left: window.innerWidth / 2 - popoverRect.width / 2,\n }\n }\n\n const scrollY = window.scrollY\n const scrollX = window.scrollX\n const pointAtCenter = typeof arrow === 'object' && arrow.pointAtCenter\n\n const positions: Record<TourPlacement, { top: number; left: number }> = {\n top: {\n top: targetRect.top + scrollY - popoverRect.height - gap,\n left: pointAtCenter\n ? targetRect.left + scrollX + targetRect.width / 2 - popoverRect.width / 2\n : targetRect.left + scrollX + targetRect.width / 2 - popoverRect.width / 2,\n },\n topLeft: {\n top: targetRect.top + scrollY - popoverRect.height - gap,\n left: targetRect.left + scrollX,\n },\n topRight: {\n top: targetRect.top + scrollY - popoverRect.height - gap,\n left: targetRect.right + scrollX - popoverRect.width,\n },\n bottom: {\n top: targetRect.bottom + scrollY + gap,\n left: targetRect.left + scrollX + targetRect.width / 2 - popoverRect.width / 2,\n },\n bottomLeft: {\n top: targetRect.bottom + scrollY + gap,\n left: targetRect.left + scrollX,\n },\n bottomRight: {\n top: targetRect.bottom + scrollY + gap,\n left: targetRect.right + scrollX - popoverRect.width,\n },\n left: {\n top: targetRect.top + scrollY + targetRect.height / 2 - popoverRect.height / 2,\n left: targetRect.left + scrollX - popoverRect.width - gap,\n },\n leftTop: {\n top: targetRect.top + scrollY,\n left: targetRect.left + scrollX - popoverRect.width - gap,\n },\n leftBottom: {\n top: targetRect.bottom + scrollY - popoverRect.height,\n left: targetRect.left + scrollX - popoverRect.width - gap,\n },\n right: {\n top: targetRect.top + scrollY + targetRect.height / 2 - popoverRect.height / 2,\n left: targetRect.right + scrollX + gap,\n },\n rightTop: {\n top: targetRect.top + scrollY,\n left: targetRect.right + scrollX + gap,\n },\n rightBottom: {\n top: targetRect.bottom + scrollY - popoverRect.height,\n left: targetRect.right + scrollX + gap,\n },\n center: {\n top: window.innerHeight / 2 - popoverRect.height / 2,\n left: window.innerWidth / 2 - popoverRect.width / 2,\n },\n }\n\n return positions[placement]\n}\n\nconst getArrowPosition = (\n placement: TourPlacement\n): { position: string; transform: string } => {\n const arrowPositions: Record<TourPlacement, { position: string; transform: string }> = {\n top: { position: 'bottom-0 left-1/2', transform: 'translate(-50%, 50%) rotate(45deg)' },\n topLeft: { position: 'bottom-0 left-4', transform: 'translate(0, 50%) rotate(45deg)' },\n topRight: { position: 'bottom-0 right-4', transform: 'translate(0, 50%) rotate(45deg)' },\n bottom: { position: 'top-0 left-1/2', transform: 'translate(-50%, -50%) rotate(45deg)' },\n bottomLeft: { position: 'top-0 left-4', transform: 'translate(0, -50%) rotate(45deg)' },\n bottomRight: { position: 'top-0 right-4', transform: 'translate(0, -50%) rotate(45deg)' },\n left: { position: 'right-0 top-1/2', transform: 'translate(50%, -50%) rotate(45deg)' },\n leftTop: { position: 'right-0 top-4', transform: 'translate(50%, 0) rotate(45deg)' },\n leftBottom: { position: 'right-0 bottom-4', transform: 'translate(50%, 0) rotate(45deg)' },\n right: { position: 'left-0 top-1/2', transform: 'translate(-50%, -50%) rotate(45deg)' },\n rightTop: { position: 'left-0 top-4', transform: 'translate(-50%, 0) rotate(45deg)' },\n rightBottom: { position: 'left-0 bottom-4', transform: 'translate(-50%, 0) rotate(45deg)' },\n center: { position: 'hidden', transform: '' },\n }\n return arrowPositions[placement]\n}\n\nconst defaultCloseIcon = (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n)\n\nexport const Tour = forwardRef<TourRef, TourProps>(\n (\n {\n open = false,\n onClose,\n onFinish,\n steps,\n current: controlledCurrent,\n onChange,\n arrow = true,\n closeIcon,\n mask = true,\n disabledInteraction = false,\n type = 'default',\n gap = { offset: 6, radius: 2 },\n prevButtonText = 'Previous',\n nextButtonText = 'Next',\n finishButtonText = 'Finish',\n skipButtonText = 'Skip',\n showSkip = true,\n showIndicators = true,\n closeOnMaskClick = true,\n closeOnEscape = true,\n scrollIntoViewOptions = true,\n zIndex = 1001,\n indicatorsRender,\n actionsRender,\n getPopupContainer,\n classNames = {},\n styles = {},\n className,\n style,\n 'data-testid': testId,\n ...rest\n },\n ref\n ) => {\n const { getPopupContainer: globalGetPopupContainer } = useConfig()\n const effectiveGetPopupContainer = getPopupContainer ?? globalGetPopupContainer\n\n const [internalCurrent, setInternalCurrent] = useState(0)\n const [targetRect, setTargetRect] = useState<DOMRect | null>(null)\n const [popoverPosition, setPopoverPosition] = useState({ top: 0, left: 0 })\n const popoverRef = useRef<HTMLDivElement>(null)\n const containerRef = useRef<HTMLDivElement>(null)\n const liveRegionRef = useRef<HTMLDivElement>(null)\n\n const baseTestId = testId ?? 'tour'\n const getTestId = (suffix: string) => `${baseTestId}-${suffix}`\n\n const isControlled = controlledCurrent !== undefined\n const currentStep = isControlled ? controlledCurrent : internalCurrent\n const step = steps[currentStep]\n\n // Resolve gap values\n const gapOffset = gap.offset ?? 6\n const gapRadius = gap.radius ?? 2\n const gapOffsetValue = Array.isArray(gapOffset) ? gapOffset[0] : gapOffset\n\n // Resolve per-step overrides\n const resolvedArrow = step?.arrow ?? arrow\n const resolvedMask = step?.mask ?? mask\n const resolvedType = step?.type ?? type\n const resolvedScrollOptions = step?.scrollIntoViewOptions ?? scrollIntoViewOptions\n const resolvedCloseIcon = step?.closeIcon ?? closeIcon\n\n const showArrow = resolvedArrow !== false && step?.placement !== 'center'\n\n // Mask color\n const maskColor =\n typeof resolvedMask === 'object' && resolvedMask.color\n ? resolvedMask.color\n : 'rgba(0, 0, 0, 0.5)'\n const maskStyle =\n typeof resolvedMask === 'object' && resolvedMask.style ? resolvedMask.style : {}\n\n const updatePosition = useCallback(() => {\n if (!step) return\n\n const target = getTargetElement(step.target)\n const rect = target?.getBoundingClientRect() ?? null\n setTargetRect(rect)\n\n if (popoverRef.current) {\n const popoverRect = popoverRef.current.getBoundingClientRect()\n const placement = step.placement ?? 'bottom'\n const pos = getPopoverPosition(\n rect,\n placement,\n popoverRect,\n gapOffsetValue + gapRadius,\n resolvedArrow\n )\n setPopoverPosition(pos)\n }\n }, [step, gapOffsetValue, gapRadius, resolvedArrow])\n\n const goToStep = useCallback(\n (stepIndex: number) => {\n if (stepIndex < 0 || stepIndex >= steps.length) return\n\n // Call onClose for current step\n steps[currentStep]?.onClose?.()\n\n if (!isControlled) {\n setInternalCurrent(stepIndex)\n }\n onChange?.(stepIndex)\n\n // Announce step change\n if (liveRegionRef.current) {\n liveRegionRef.current.textContent = `Step ${stepIndex + 1} of ${steps.length}: ${\n typeof steps[stepIndex]?.title === 'string' ? steps[stepIndex]?.title : ''\n }`\n }\n },\n [steps, currentStep, isControlled, onChange]\n )\n\n const handleClose = useCallback(() => {\n onClose?.()\n }, [onClose])\n\n const handlePrev = useCallback(() => {\n step?.prevButtonProps?.onClick?.()\n goToStep(currentStep - 1)\n }, [currentStep, goToStep, step])\n\n const handleNext = useCallback(() => {\n step?.nextButtonProps?.onClick?.()\n if (currentStep === steps.length - 1) {\n onFinish?.()\n onClose?.()\n } else {\n goToStep(currentStep + 1)\n }\n }, [currentStep, steps.length, goToStep, onFinish, onClose, step])\n\n const handleSkip = useCallback(() => {\n onClose?.()\n }, [onClose])\n\n const handleMaskClick = useCallback(() => {\n if (closeOnMaskClick) {\n onClose?.()\n }\n }, [closeOnMaskClick, onClose])\n\n // Expose imperative methods\n useImperativeHandle(\n ref,\n () => ({\n goTo: goToStep,\n next: handleNext,\n prev: handlePrev,\n close: handleClose,\n }),\n [goToStep, handleNext, handlePrev, handleClose]\n )\n\n // Reset to first step when opening\n useEffect(() => {\n if (open && !isControlled) {\n setInternalCurrent(0)\n }\n }, [open, isControlled])\n\n // Update position on step change or open\n useEffect(() => {\n if (!open) return\n\n updatePosition()\n\n // Scroll target into view\n if (resolvedScrollOptions && step?.target) {\n const target = getTargetElement(step.target)\n if (target) {\n const scrollOptions: ScrollIntoViewOptions =\n typeof resolvedScrollOptions === 'object'\n ? resolvedScrollOptions\n : { behavior: 'smooth', block: 'center' }\n target.scrollIntoView(scrollOptions)\n }\n }\n\n // Announce first step\n if (currentStep === 0 && liveRegionRef.current) {\n liveRegionRef.current.textContent = `Tour started. Step 1 of ${steps.length}: ${\n typeof step?.title === 'string' ? step?.title : ''\n }`\n }\n }, [open, currentStep, step, resolvedScrollOptions, updatePosition, steps.length])\n\n // Update position on resize/scroll\n useEffect(() => {\n if (!open) return\n\n const handleUpdate = () => updatePosition()\n window.addEventListener('resize', handleUpdate)\n window.addEventListener('scroll', handleUpdate, true)\n\n // Initial position after popover renders\n requestAnimationFrame(updatePosition)\n\n return () => {\n window.removeEventListener('resize', handleUpdate)\n window.removeEventListener('scroll', handleUpdate, true)\n }\n }, [open, updatePosition])\n\n // Keyboard handling\n useEffect(() => {\n if (!open) return\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && closeOnEscape) {\n onClose?.()\n } else if (e.key === 'ArrowRight' || e.key === 'ArrowDown') {\n e.preventDefault()\n handleNext()\n } else if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') {\n e.preventDefault()\n handlePrev()\n } else if (e.key === 'Tab') {\n // Focus trap within popover\n if (popoverRef.current) {\n const focusableElements = popoverRef.current.querySelectorAll<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n )\n const firstElement = focusableElements[0]\n const lastElement = focusableElements[focusableElements.length - 1]\n\n if (e.shiftKey && document.activeElement === firstElement) {\n e.preventDefault()\n lastElement?.focus()\n } else if (!e.shiftKey && document.activeElement === lastElement) {\n e.preventDefault()\n firstElement?.focus()\n }\n }\n }\n }\n\n document.addEventListener('keydown', handleKeyDown)\n return () => document.removeEventListener('keydown', handleKeyDown)\n }, [open, closeOnEscape, onClose, handleNext, handlePrev])\n\n // Focus management - focus first button when tour opens\n useEffect(() => {\n if (open && popoverRef.current) {\n requestAnimationFrame(() => {\n const firstButton = popoverRef.current?.querySelector<HTMLElement>('button')\n firstButton?.focus()\n })\n }\n }, [open, currentStep])\n\n if (!open || !step) return null\n\n const isFirstStep = currentStep === 0\n const isLastStep = currentStep === steps.length - 1\n const placement = step.placement ?? 'bottom'\n const arrowPos = getArrowPosition(placement)\n\n // Default indicators\n const defaultIndicators =\n showIndicators && steps.length > 1 ? (\n <div\n className={`flex gap-1 mb-4 ${classNames.indicator ?? ''}`}\n style={styles.indicator}\n data-testid={getTestId('indicators')}\n >\n {steps.map((_, index) => (\n <button\n key={index}\n className={`w-2 h-2 rounded-full transition-colors ${\n index === currentStep\n ? 'bg-primary'\n : 'bg-base-300 hover:bg-base-content/30'\n }`}\n onClick={() => goToStep(index)}\n aria-label={`Go to step ${index + 1}`}\n aria-current={index === currentStep ? 'step' : undefined}\n data-testid={getTestId(`indicator-${index}`)}\n />\n ))}\n </div>\n ) : null\n\n const indicators = indicatorsRender\n ? indicatorsRender(currentStep, steps.length)\n : defaultIndicators\n\n // Default action buttons\n const defaultActions = (\n <div\n className={`flex items-center justify-between gap-2 ${classNames.footer ?? ''}`}\n style={styles.footer}\n data-testid={getTestId('footer')}\n >\n <div>\n {showSkip && !isLastStep && (\n <button\n className={`${dBtn} ${dBtnGhost} ${dBtnSm}`}\n onClick={handleSkip}\n data-testid={getTestId('skip')}\n >\n {skipButtonText}\n </button>\n )}\n </div>\n <div className=\"flex gap-2\">\n {!isFirstStep && (\n <button\n className={`${dBtn} ${dBtnGhost} ${dBtnSm}`}\n onClick={handlePrev}\n data-testid={getTestId('prev')}\n >\n {step.prevButtonProps?.children ?? prevButtonText}\n </button>\n )}\n <button\n className={`${dBtn} ${dBtnSm} ${resolvedType === 'primary' ? dBtnPrimary : ''}`}\n onClick={handleNext}\n data-testid={getTestId('next')}\n >\n {step.nextButtonProps?.children ?? (isLastStep ? finishButtonText : nextButtonText)}\n </button>\n </div>\n </div>\n )\n\n const actions = actionsRender\n ? actionsRender(defaultActions, { current: currentStep, total: steps.length })\n : defaultActions\n\n const content = (\n <div\n ref={containerRef}\n className={`fixed inset-0 ${classNames.root ?? ''} ${className ?? ''}`}\n style={{ zIndex, ...styles.root, ...style }}\n data-testid={baseTestId}\n data-state={open ? 'open' : 'closed'}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={`Tour step ${currentStep + 1} of ${steps.length}`}\n {...rest}\n >\n {/* Live region for screen reader announcements */}\n <div\n ref={liveRegionRef}\n className=\"sr-only\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n />\n\n {/* Mask overlay with spotlight cutout */}\n {resolvedMask && (\n <svg\n className={`absolute inset-0 w-full h-full ${\n disabledInteraction ? 'pointer-events-auto' : 'pointer-events-auto'\n } ${classNames.mask ?? ''}`}\n style={{ zIndex, ...maskStyle, ...styles.mask }}\n onClick={handleMaskClick}\n data-testid={getTestId('mask')}\n aria-hidden=\"true\"\n >\n <defs>\n <mask id={`tour-mask-${baseTestId}`}>\n <rect x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" fill=\"white\" />\n {targetRect && (\n <rect\n x={targetRect.left - gapRadius}\n y={targetRect.top - gapRadius}\n width={targetRect.width + gapRadius * 2}\n height={targetRect.height + gapRadius * 2}\n rx={gapRadius}\n fill=\"black\"\n />\n )}\n </mask>\n </defs>\n <rect\n x=\"0\"\n y=\"0\"\n width=\"100%\"\n height=\"100%\"\n fill={maskColor}\n mask={`url(#tour-mask-${baseTestId})`}\n />\n </svg>\n )}\n\n {/* Interaction blocker for highlighted area */}\n {disabledInteraction && targetRect && (\n <div\n className=\"absolute pointer-events-auto\"\n style={{\n left: targetRect.left - gapRadius,\n top: targetRect.top - gapRadius,\n width: targetRect.width + gapRadius * 2,\n height: targetRect.height + gapRadius * 2,\n zIndex: zIndex + 1,\n }}\n data-testid={getTestId('blocker')}\n />\n )}\n\n {/* Popover */}\n <div\n ref={popoverRef}\n className={`absolute bg-base-100 rounded-lg shadow-xl border border-base-300 max-w-sm ${\n classNames.popover ?? ''\n } ${step.className ?? ''}`}\n style={{\n top: popoverPosition.top,\n left: popoverPosition.left,\n zIndex: zIndex + 2,\n ...styles.popover,\n ...step.style,\n }}\n onClick={(e) => e.stopPropagation()}\n data-testid={getTestId('popover')}\n data-placement={placement}\n >\n {/* Arrow */}\n {showArrow && (\n <div\n className={`absolute w-3 h-3 bg-base-100 border-base-300 ${arrowPos.position}`}\n style={{\n transform: arrowPos.transform,\n borderWidth: '1px',\n borderTopColor: 'transparent',\n borderLeftColor: 'transparent',\n }}\n data-testid={getTestId('arrow')}\n />\n )}\n\n {/* Close button */}\n {resolvedCloseIcon !== false && (\n <button\n className={`absolute top-2 right-2 ${dBtn} ${dBtnGhost} ${dBtnXs} ${dBtnCircle} ${\n classNames.close ?? ''\n }`}\n style={styles.close}\n onClick={handleClose}\n aria-label=\"Close tour\"\n data-testid={getTestId('close')}\n >\n {resolvedCloseIcon ?? defaultCloseIcon}\n </button>\n )}\n\n {/* Cover */}\n {step.cover && (\n <div className=\"rounded-t-lg overflow-hidden\" data-testid={getTestId('cover')}>\n {step.cover}\n </div>\n )}\n\n {/* Content */}\n <div\n className={`p-4 ${classNames.content ?? ''}`}\n style={styles.content}\n data-testid={getTestId('content')}\n >\n <div\n className={`${classNames.header ?? ''}`}\n style={styles.header}\n data-testid={getTestId('header')}\n >\n <h3 className=\"font-semibold text-lg mb-1 pr-6\">{step.title}</h3>\n {step.description && (\n <p className=\"text-base-content/70 text-sm mb-4\">{step.description}</p>\n )}\n </div>\n\n {/* Indicators */}\n {indicators}\n\n {/* Navigation */}\n {actions}\n </div>\n </div>\n </div>\n )\n\n // Get container for portal\n const container = effectiveGetPopupContainer\n ? effectiveGetPopupContainer(document.body)\n : document.body\n\n return createPortal(content, container)\n }\n)\n\nTour.displayName = 'Tour'\n"],"names":["dBtn","dBtnGhost","dBtnSm","dBtnPrimary","dBtnXs","dBtnCircle","getTargetElement","target","getPopoverPosition","targetRect","placement","popoverRect","gap","arrow","scrollY","scrollX","pointAtCenter","getArrowPosition","defaultCloseIcon","jsx","Tour","forwardRef","open","onClose","onFinish","steps","controlledCurrent","onChange","closeIcon","mask","disabledInteraction","type","prevButtonText","nextButtonText","finishButtonText","skipButtonText","showSkip","showIndicators","closeOnMaskClick","closeOnEscape","scrollIntoViewOptions","zIndex","indicatorsRender","actionsRender","getPopupContainer","classNames","styles","className","style","testId","rest","ref","globalGetPopupContainer","useConfig","effectiveGetPopupContainer","internalCurrent","setInternalCurrent","useState","setTargetRect","popoverPosition","setPopoverPosition","popoverRef","useRef","containerRef","liveRegionRef","baseTestId","getTestId","suffix","isControlled","currentStep","step","gapOffset","gapRadius","gapOffsetValue","resolvedArrow","resolvedMask","resolvedType","resolvedScrollOptions","resolvedCloseIcon","showArrow","maskColor","maskStyle","updatePosition","useCallback","rect","pos","goToStep","stepIndex","handleClose","handlePrev","handleNext","handleSkip","handleMaskClick","useImperativeHandle","useEffect","scrollOptions","handleUpdate","handleKeyDown","e","focusableElements","firstElement","lastElement","isFirstStep","isLastStep","arrowPos","defaultIndicators","_","index","indicators","defaultActions","jsxs","actions","content","container","createPortal"],"mappings":";;;;AAYA,MAAMA,IAAO,OACPC,IAAY,aACZC,IAAS,UACTC,KAAc,eACdC,KAAS,UACTC,KAAa,cA+IbC,KAAmB,CACvBC,MAEKA,IACD,OAAOA,KAAW,aAAmBA,EAAA,IAClCA,EAAO,UAFM,MAKhBC,KAAqB,CACzBC,GACAC,GACAC,GACAC,GACAC,MACkC;AAClC,MAAI,CAACJ,KAAcC,MAAc;AAC/B,WAAO;AAAA,MACL,KAAK,OAAO,cAAc,IAAIC,EAAY,SAAS;AAAA,MACnD,MAAM,OAAO,aAAa,IAAIA,EAAY,QAAQ;AAAA,IAAA;AAItD,QAAMG,IAAU,OAAO,SACjBC,IAAU,OAAO,SACjBC,IAAgB,OAAOH,KAAU,YAAYA,EAAM;AA2DzD,SAzDwE;AAAA,IACtE,KAAK;AAAA,MACH,KAAKJ,EAAW,MAAMK,IAAUH,EAAY,SAASC;AAAA,MACrD,MACIH,EAAW,OAAOM,IAAUN,EAAW,QAAQ,IAAIE,EAAY,QAAQ;AAAA,IACA;AAAA,IAE7E,SAAS;AAAA,MACP,KAAKF,EAAW,MAAMK,IAAUH,EAAY,SAASC;AAAA,MACrD,MAAMH,EAAW,OAAOM;AAAA,IAAA;AAAA,IAE1B,UAAU;AAAA,MACR,KAAKN,EAAW,MAAMK,IAAUH,EAAY,SAASC;AAAA,MACrD,MAAMH,EAAW,QAAQM,IAAUJ,EAAY;AAAA,IAAA;AAAA,IAEjD,QAAQ;AAAA,MACN,KAAKF,EAAW,SAASK,IAAUF;AAAA,MACnC,MAAMH,EAAW,OAAOM,IAAUN,EAAW,QAAQ,IAAIE,EAAY,QAAQ;AAAA,IAAA;AAAA,IAE/E,YAAY;AAAA,MACV,KAAKF,EAAW,SAASK,IAAUF;AAAA,MACnC,MAAMH,EAAW,OAAOM;AAAA,IAAA;AAAA,IAE1B,aAAa;AAAA,MACX,KAAKN,EAAW,SAASK,IAAUF;AAAA,MACnC,MAAMH,EAAW,QAAQM,IAAUJ,EAAY;AAAA,IAAA;AAAA,IAEjD,MAAM;AAAA,MACJ,KAAKF,EAAW,MAAMK,IAAUL,EAAW,SAAS,IAAIE,EAAY,SAAS;AAAA,MAC7E,MAAMF,EAAW,OAAOM,IAAUJ,EAAY,QAAQC;AAAA,IAAA;AAAA,IAExD,SAAS;AAAA,MACP,KAAKH,EAAW,MAAMK;AAAA,MACtB,MAAML,EAAW,OAAOM,IAAUJ,EAAY,QAAQC;AAAA,IAAA;AAAA,IAExD,YAAY;AAAA,MACV,KAAKH,EAAW,SAASK,IAAUH,EAAY;AAAA,MAC/C,MAAMF,EAAW,OAAOM,IAAUJ,EAAY,QAAQC;AAAA,IAAA;AAAA,IAExD,OAAO;AAAA,MACL,KAAKH,EAAW,MAAMK,IAAUL,EAAW,SAAS,IAAIE,EAAY,SAAS;AAAA,MAC7E,MAAMF,EAAW,QAAQM,IAAUH;AAAA,IAAA;AAAA,IAErC,UAAU;AAAA,MACR,KAAKH,EAAW,MAAMK;AAAA,MACtB,MAAML,EAAW,QAAQM,IAAUH;AAAA,IAAA;AAAA,IAErC,aAAa;AAAA,MACX,KAAKH,EAAW,SAASK,IAAUH,EAAY;AAAA,MAC/C,MAAMF,EAAW,QAAQM,IAAUH;AAAA,IAAA;AAAA,IAErC,QAAQ;AAAA,MACN,KAAK,OAAO,cAAc,IAAID,EAAY,SAAS;AAAA,MACnD,MAAM,OAAO,aAAa,IAAIA,EAAY,QAAQ;AAAA,IAAA;AAAA,EACpD,EAGeD,CAAS;AAC5B,GAEMO,KAAmB,CACvBP,OAEuF;AAAA,EACrF,KAAK,EAAE,UAAU,qBAAqB,WAAW,qCAAA;AAAA,EACjD,SAAS,EAAE,UAAU,mBAAmB,WAAW,kCAAA;AAAA,EACnD,UAAU,EAAE,UAAU,oBAAoB,WAAW,kCAAA;AAAA,EACrD,QAAQ,EAAE,UAAU,kBAAkB,WAAW,sCAAA;AAAA,EACjD,YAAY,EAAE,UAAU,gBAAgB,WAAW,mCAAA;AAAA,EACnD,aAAa,EAAE,UAAU,iBAAiB,WAAW,mCAAA;AAAA,EACrD,MAAM,EAAE,UAAU,mBAAmB,WAAW,qCAAA;AAAA,EAChD,SAAS,EAAE,UAAU,iBAAiB,WAAW,kCAAA;AAAA,EACjD,YAAY,EAAE,UAAU,oBAAoB,WAAW,kCAAA;AAAA,EACvD,OAAO,EAAE,UAAU,kBAAkB,WAAW,sCAAA;AAAA,EAChD,UAAU,EAAE,UAAU,gBAAgB,WAAW,mCAAA;AAAA,EACjD,aAAa,EAAE,UAAU,mBAAmB,WAAW,mCAAA;AAAA,EACvD,QAAQ,EAAE,UAAU,UAAU,WAAW,GAAA;AAAG,GAExBA,CAAS,GAG3BQ,uBACH,OAAA,EAAI,WAAU,WAAU,MAAK,QAAO,SAAQ,aAAY,QAAO,gBAC9D,UAAA,gBAAAC,EAAC,QAAA,EAAK,eAAc,SAAQ,gBAAe,SAAQ,aAAa,GAAG,GAAE,uBAAA,CAAuB,EAAA,CAC9F,GAGWC,KAAOC;AAAA,EAClB,CACE;AAAA,IACE,MAAAC,IAAO;AAAA,IACP,SAAAC;AAAA,IACA,UAAAC;AAAA,IACA,OAAAC;AAAA,IACA,SAASC;AAAA,IACT,UAAAC;AAAA,IACA,OAAAd,IAAQ;AAAA,IACR,WAAAe;AAAA,IACA,MAAAC,IAAO;AAAA,IACP,qBAAAC,IAAsB;AAAA,IACtB,MAAAC,KAAO;AAAA,IACP,KAAAnB,IAAM,EAAE,QAAQ,GAAG,QAAQ,EAAA;AAAA,IAC3B,gBAAAoB,KAAiB;AAAA,IACjB,gBAAAC,KAAiB;AAAA,IACjB,kBAAAC,KAAmB;AAAA,IACnB,gBAAAC,KAAiB;AAAA,IACjB,UAAAC,KAAW;AAAA,IACX,gBAAAC,KAAiB;AAAA,IACjB,kBAAAC,IAAmB;AAAA,IACnB,eAAAC,IAAgB;AAAA,IAChB,uBAAAC,KAAwB;AAAA,IACxB,QAAAC,IAAS;AAAA,IACT,kBAAAC;AAAA,IACA,eAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,YAAAC,IAAa,CAAA;AAAA,IACb,QAAAC,IAAS,CAAA;AAAA,IACT,WAAAC;AAAA,IACA,OAAAC;AAAA,IACA,eAAeC;AAAA,IACf,GAAGC;AAAA,EAAA,GAELC,OACG;AACH,UAAM,EAAE,mBAAmBC,GAAA,IAA4BC,GAAA,GACjDC,IAA6BV,MAAqBQ,IAElD,CAACG,IAAiBC,CAAkB,IAAIC,EAAS,CAAC,GAClD,CAAChD,GAAYiD,EAAa,IAAID,EAAyB,IAAI,GAC3D,CAACE,GAAiBC,EAAkB,IAAIH,EAAS,EAAE,KAAK,GAAG,MAAM,GAAG,GACpEI,IAAaC,EAAuB,IAAI,GACxCC,KAAeD,EAAuB,IAAI,GAC1CE,IAAgBF,EAAuB,IAAI,GAE3CG,IAAahB,MAAU,QACvBiB,IAAY,CAACC,MAAmB,GAAGF,CAAU,IAAIE,CAAM,IAEvDC,IAAe1C,MAAsB,QACrC2C,IAAcD,IAAe1C,IAAoB6B,IACjDe,IAAO7C,EAAM4C,CAAW,GAGxBE,IAAY3D,EAAI,UAAU,GAC1B4D,IAAY5D,EAAI,UAAU,GAC1B6D,IAAiB,MAAM,QAAQF,CAAS,IAAIA,EAAU,CAAC,IAAIA,GAG3DG,IAAgBJ,GAAM,SAASzD,GAC/B8D,IAAeL,GAAM,QAAQzC,GAC7B+C,KAAeN,GAAM,QAAQvC,IAC7B8C,IAAwBP,GAAM,yBAAyB9B,IACvDsC,KAAoBR,GAAM,aAAa1C,GAEvCmD,KAAYL,MAAkB,MAASJ,GAAM,cAAc,UAG3DU,KACJ,OAAOL,KAAiB,YAAYA,EAAa,QAC7CA,EAAa,QACb,sBACAM,KACJ,OAAON,KAAiB,YAAYA,EAAa,QAAQA,EAAa,QAAQ,CAAA,GAE1EO,IAAiBC,EAAY,MAAM;AACvC,UAAI,CAACb,EAAM;AAGX,YAAMc,IADS9E,GAAiBgE,EAAK,MAAM,GACtB,sBAAA,KAA2B;AAGhD,UAFAZ,GAAc0B,CAAI,GAEdvB,EAAW,SAAS;AACtB,cAAMlD,IAAckD,EAAW,QAAQ,sBAAA,GACjCnD,IAAY4D,EAAK,aAAa,UAC9Be,IAAM7E;AAAA,UACV4E;AAAA,UACA1E;AAAAA,UACAC;AAAA,UACA8D,IAAiBD;AAAA,UACjBE;AAAA,QAAA;AAEF,QAAAd,GAAmByB,CAAG;AAAA,MACxB;AAAA,IACF,GAAG,CAACf,GAAMG,GAAgBD,GAAWE,CAAa,CAAC,GAE7CY,IAAWH;AAAA,MACf,CAACI,MAAsB;AACrB,QAAIA,IAAY,KAAKA,KAAa9D,EAAM,WAGxCA,EAAM4C,CAAW,GAAG,UAAA,GAEfD,KACHZ,EAAmB+B,CAAS,GAE9B5D,IAAW4D,CAAS,GAGhBvB,EAAc,YAChBA,EAAc,QAAQ,cAAc,QAAQuB,IAAY,CAAC,OAAO9D,EAAM,MAAM,KAC1E,OAAOA,EAAM8D,CAAS,GAAG,SAAU,WAAW9D,EAAM8D,CAAS,GAAG,QAAQ,EAC1E;AAAA,MAEJ;AAAA,MACA,CAAC9D,GAAO4C,GAAaD,GAAczC,CAAQ;AAAA,IAAA,GAGvC6D,IAAcL,EAAY,MAAM;AACpC,MAAA5D,IAAA;AAAA,IACF,GAAG,CAACA,CAAO,CAAC,GAENkE,IAAaN,EAAY,MAAM;AACnC,MAAAb,GAAM,iBAAiB,UAAA,GACvBgB,EAASjB,IAAc,CAAC;AAAA,IAC1B,GAAG,CAACA,GAAaiB,GAAUhB,CAAI,CAAC,GAE1BoB,IAAaP,EAAY,MAAM;AACnC,MAAAb,GAAM,iBAAiB,UAAA,GACnBD,MAAgB5C,EAAM,SAAS,KACjCD,IAAA,GACAD,IAAA,KAEA+D,EAASjB,IAAc,CAAC;AAAA,IAE5B,GAAG,CAACA,GAAa5C,EAAM,QAAQ6D,GAAU9D,GAAUD,GAAS+C,CAAI,CAAC,GAE3DqB,KAAaR,EAAY,MAAM;AACnC,MAAA5D,IAAA;AAAA,IACF,GAAG,CAACA,CAAO,CAAC,GAENqE,KAAkBT,EAAY,MAAM;AACxC,MAAI7C,KACFf,IAAA;AAAA,IAEJ,GAAG,CAACe,GAAkBf,CAAO,CAAC;AA+G9B,QA5GAsE;AAAA,MACE1C;AAAA,MACA,OAAO;AAAA,QACL,MAAMmC;AAAA,QACN,MAAMI;AAAA,QACN,MAAMD;AAAA,QACN,OAAOD;AAAA,MAAA;AAAA,MAET,CAACF,GAAUI,GAAYD,GAAYD,CAAW;AAAA,IAAA,GAIhDM,EAAU,MAAM;AACd,MAAIxE,KAAQ,CAAC8C,KACXZ,EAAmB,CAAC;AAAA,IAExB,GAAG,CAAClC,GAAM8C,CAAY,CAAC,GAGvB0B,EAAU,MAAM;AACd,UAAKxE,GAKL;AAAA,YAHA4D,EAAA,GAGIL,KAAyBP,GAAM,QAAQ;AACzC,gBAAM/D,IAASD,GAAiBgE,EAAK,MAAM;AAC3C,cAAI/D,GAAQ;AACV,kBAAMwF,IACJ,OAAOlB,KAA0B,WAC7BA,IACA,EAAE,UAAU,UAAU,OAAO,SAAA;AACnC,YAAAtE,EAAO,eAAewF,CAAa;AAAA,UACrC;AAAA,QACF;AAGA,QAAI1B,MAAgB,KAAKL,EAAc,YACrCA,EAAc,QAAQ,cAAc,2BAA2BvC,EAAM,MAAM,KACzE,OAAO6C,GAAM,SAAU,WAAWA,GAAM,QAAQ,EAClD;AAAA;AAAA,IAEJ,GAAG,CAAChD,GAAM+C,GAAaC,GAAMO,GAAuBK,GAAgBzD,EAAM,MAAM,CAAC,GAGjFqE,EAAU,MAAM;AACd,UAAI,CAACxE,EAAM;AAEX,YAAM0E,IAAe,MAAMd,EAAA;AAC3B,oBAAO,iBAAiB,UAAUc,CAAY,GAC9C,OAAO,iBAAiB,UAAUA,GAAc,EAAI,GAGpD,sBAAsBd,CAAc,GAE7B,MAAM;AACX,eAAO,oBAAoB,UAAUc,CAAY,GACjD,OAAO,oBAAoB,UAAUA,GAAc,EAAI;AAAA,MACzD;AAAA,IACF,GAAG,CAAC1E,GAAM4D,CAAc,CAAC,GAGzBY,EAAU,MAAM;AACd,UAAI,CAACxE,EAAM;AAEX,YAAM2E,IAAgB,CAACC,MAAqB;AAC1C,YAAIA,EAAE,QAAQ,YAAY3D;AACxB,UAAAhB,IAAA;AAAA,iBACS2E,EAAE,QAAQ,gBAAgBA,EAAE,QAAQ;AAC7C,UAAAA,EAAE,eAAA,GACFR,EAAA;AAAA,iBACSQ,EAAE,QAAQ,eAAeA,EAAE,QAAQ;AAC5C,UAAAA,EAAE,eAAA,GACFT,EAAA;AAAA,iBACSS,EAAE,QAAQ,SAEfrC,EAAW,SAAS;AACtB,gBAAMsC,IAAoBtC,EAAW,QAAQ;AAAA,YAC3C;AAAA,UAAA,GAEIuC,IAAeD,EAAkB,CAAC,GAClCE,IAAcF,EAAkBA,EAAkB,SAAS,CAAC;AAElE,UAAID,EAAE,YAAY,SAAS,kBAAkBE,KAC3CF,EAAE,eAAA,GACFG,GAAa,MAAA,KACJ,CAACH,EAAE,YAAY,SAAS,kBAAkBG,MACnDH,EAAE,eAAA,GACFE,GAAc,MAAA;AAAA,QAElB;AAAA,MAEJ;AAEA,sBAAS,iBAAiB,WAAWH,CAAa,GAC3C,MAAM,SAAS,oBAAoB,WAAWA,CAAa;AAAA,IACpE,GAAG,CAAC3E,GAAMiB,GAAehB,GAASmE,GAAYD,CAAU,CAAC,GAGzDK,EAAU,MAAM;AACd,MAAIxE,KAAQuC,EAAW,WACrB,sBAAsB,MAAM;AAE1B,QADoBA,EAAW,SAAS,cAA2B,QAAQ,GAC9D,MAAA;AAAA,MACf,CAAC;AAAA,IAEL,GAAG,CAACvC,GAAM+C,CAAW,CAAC,GAElB,CAAC/C,KAAQ,CAACgD,EAAM,QAAO;AAE3B,UAAMgC,KAAcjC,MAAgB,GAC9BkC,KAAalC,MAAgB5C,EAAM,SAAS,GAC5Cf,KAAY4D,EAAK,aAAa,UAC9BkC,KAAWvF,GAAiBP,EAAS,GAGrC+F,KACJpE,MAAkBZ,EAAM,SAAS,IAC/B,gBAAAN;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW,mBAAmB0B,EAAW,aAAa,EAAE;AAAA,QACxD,OAAOC,EAAO;AAAA,QACd,eAAaoB,EAAU,YAAY;AAAA,QAElC,UAAAzC,EAAM,IAAI,CAACiF,GAAGC,MACb,gBAAAxF;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,WAAW,0CACTwF,MAAUtC,IACN,eACA,sCACN;AAAA,YACA,SAAS,MAAMiB,EAASqB,CAAK;AAAA,YAC7B,cAAY,cAAcA,IAAQ,CAAC;AAAA,YACnC,gBAAcA,MAAUtC,IAAc,SAAS;AAAA,YAC/C,eAAaH,EAAU,aAAayC,CAAK,EAAE;AAAA,UAAA;AAAA,UATtCA;AAAA,QAAA,CAWR;AAAA,MAAA;AAAA,IAAA,IAED,MAEAC,KAAalE,IACfA,EAAiB2B,GAAa5C,EAAM,MAAM,IAC1CgF,IAGEI,KACJ,gBAAAC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW,2CAA2CjE,EAAW,UAAU,EAAE;AAAA,QAC7E,OAAOC,EAAO;AAAA,QACd,eAAaoB,EAAU,QAAQ;AAAA,QAE/B,UAAA;AAAA,UAAA,gBAAA/C,EAAC,OAAA,EACE,UAAAiB,MAAY,CAACmE,MACZ,gBAAApF;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAW,GAAGnB,CAAI,IAAIC,CAAS,IAAIC,CAAM;AAAA,cACzC,SAASyF;AAAA,cACT,eAAazB,EAAU,MAAM;AAAA,cAE5B,UAAA/B;AAAA,YAAA;AAAA,UAAA,GAGP;AAAA,UACA,gBAAA2E,EAAC,OAAA,EAAI,WAAU,cACZ,UAAA;AAAA,YAAA,CAACR,MACA,gBAAAnF;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAW,GAAGnB,CAAI,IAAIC,CAAS,IAAIC,CAAM;AAAA,gBACzC,SAASuF;AAAA,gBACT,eAAavB,EAAU,MAAM;AAAA,gBAE5B,UAAAI,EAAK,iBAAiB,YAAYtC;AAAA,cAAA;AAAA,YAAA;AAAA,YAGvC,gBAAAb;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAW,GAAGnB,CAAI,IAAIE,CAAM,IAAI0E,OAAiB,YAAYzE,KAAc,EAAE;AAAA,gBAC7E,SAASuF;AAAA,gBACT,eAAaxB,EAAU,MAAM;AAAA,gBAE5B,UAAAI,EAAK,iBAAiB,aAAaiC,KAAarE,KAAmBD;AAAA,cAAA;AAAA,YAAA;AAAA,UACtE,EAAA,CACF;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,GAIE8E,KAAUpE,IACZA,EAAckE,IAAgB,EAAE,SAASxC,GAAa,OAAO5C,EAAM,OAAA,CAAQ,IAC3EoF,IAEEG,KACJ,gBAAAF;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAK/C;AAAA,QACL,WAAW,iBAAiBlB,EAAW,QAAQ,EAAE,IAAIE,MAAa,EAAE;AAAA,QACpE,OAAO,EAAE,QAAAN,GAAQ,GAAGK,EAAO,MAAM,GAAGE,GAAA;AAAA,QACpC,eAAaiB;AAAA,QACb,cAAY3C,IAAO,SAAS;AAAA,QAC5B,MAAK;AAAA,QACL,cAAW;AAAA,QACX,cAAY,aAAa+C,IAAc,CAAC,OAAO5C,EAAM,MAAM;AAAA,QAC1D,GAAGyB;AAAA,QAGJ,UAAA;AAAA,UAAA,gBAAA/B;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,KAAK6C;AAAA,cACL,WAAU;AAAA,cACV,MAAK;AAAA,cACL,aAAU;AAAA,cACV,eAAY;AAAA,YAAA;AAAA,UAAA;AAAA,UAIbW,KACC,gBAAAmC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAW,sDAEPjE,EAAW,QAAQ,EAAE;AAAA,cACzB,OAAO,EAAE,QAAAJ,GAAQ,GAAGwC,IAAW,GAAGnC,EAAO,KAAA;AAAA,cACzC,SAAS8C;AAAA,cACT,eAAa1B,EAAU,MAAM;AAAA,cAC7B,eAAY;AAAA,cAEZ,UAAA;AAAA,gBAAA,gBAAA/C,EAAC,UACC,UAAA,gBAAA2F,EAAC,QAAA,EAAK,IAAI,aAAa7C,CAAU,IAC/B,UAAA;AAAA,kBAAA,gBAAA9C,EAAC,QAAA,EAAK,GAAE,KAAI,GAAE,KAAI,OAAM,QAAO,QAAO,QAAO,MAAK,QAAA,CAAQ;AAAA,kBACzDV,KACC,gBAAAU;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,GAAGV,EAAW,OAAO+D;AAAA,sBACrB,GAAG/D,EAAW,MAAM+D;AAAA,sBACpB,OAAO/D,EAAW,QAAQ+D,IAAY;AAAA,sBACtC,QAAQ/D,EAAW,SAAS+D,IAAY;AAAA,sBACxC,IAAIA;AAAA,sBACJ,MAAK;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACP,EAAA,CAEJ,EAAA,CACF;AAAA,gBACA,gBAAArD;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,GAAE;AAAA,oBACF,GAAE;AAAA,oBACF,OAAM;AAAA,oBACN,QAAO;AAAA,oBACP,MAAM6D;AAAA,oBACN,MAAM,kBAAkBf,CAAU;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACpC;AAAA,YAAA;AAAA,UAAA;AAAA,UAKHnC,KAAuBrB,KACtB,gBAAAU;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO;AAAA,gBACL,MAAMV,EAAW,OAAO+D;AAAA,gBACxB,KAAK/D,EAAW,MAAM+D;AAAA,gBACtB,OAAO/D,EAAW,QAAQ+D,IAAY;AAAA,gBACtC,QAAQ/D,EAAW,SAAS+D,IAAY;AAAA,gBACxC,QAAQ/B,IAAS;AAAA,cAAA;AAAA,cAEnB,eAAayB,EAAU,SAAS;AAAA,YAAA;AAAA,UAAA;AAAA,UAKpC,gBAAA4C;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,KAAKjD;AAAA,cACL,WAAW,6EACThB,EAAW,WAAW,EACxB,IAAIyB,EAAK,aAAa,EAAE;AAAA,cACxB,OAAO;AAAA,gBACL,KAAKX,EAAgB;AAAA,gBACrB,MAAMA,EAAgB;AAAA,gBACtB,QAAQlB,IAAS;AAAA,gBACjB,GAAGK,EAAO;AAAA,gBACV,GAAGwB,EAAK;AAAA,cAAA;AAAA,cAEV,SAAS,CAAC4B,MAAMA,EAAE,gBAAA;AAAA,cAClB,eAAahC,EAAU,SAAS;AAAA,cAChC,kBAAgBxD;AAAA,cAGf,UAAA;AAAA,gBAAAqE,MACC,gBAAA5D;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAW,gDAAgDqF,GAAS,QAAQ;AAAA,oBAC5E,OAAO;AAAA,sBACL,WAAWA,GAAS;AAAA,sBACpB,aAAa;AAAA,sBACb,gBAAgB;AAAA,sBAChB,iBAAiB;AAAA,oBAAA;AAAA,oBAEnB,eAAatC,EAAU,OAAO;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAKjCY,OAAsB,MACrB,gBAAA3D;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAW,0BAA0BnB,CAAI,IAAIC,CAAS,IAAIG,EAAM,IAAIC,EAAU,IAC5EwC,EAAW,SAAS,EACtB;AAAA,oBACA,OAAOC,EAAO;AAAA,oBACd,SAAS0C;AAAA,oBACT,cAAW;AAAA,oBACX,eAAatB,EAAU,OAAO;AAAA,oBAE7B,UAAAY,MAAqB5D;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAKzBoD,EAAK,SACJ,gBAAAnD,EAAC,OAAA,EAAI,WAAU,gCAA+B,eAAa+C,EAAU,OAAO,GACzE,UAAAI,EAAK,MAAA,CACR;AAAA,gBAIF,gBAAAwC;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAW,OAAOjE,EAAW,WAAW,EAAE;AAAA,oBAC1C,OAAOC,EAAO;AAAA,oBACd,eAAaoB,EAAU,SAAS;AAAA,oBAEhC,UAAA;AAAA,sBAAA,gBAAA4C;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,WAAW,GAAGjE,EAAW,UAAU,EAAE;AAAA,0BACrC,OAAOC,EAAO;AAAA,0BACd,eAAaoB,EAAU,QAAQ;AAAA,0BAE/B,UAAA;AAAA,4BAAA,gBAAA/C,EAAC,MAAA,EAAG,WAAU,mCAAmC,UAAAmD,EAAK,OAAM;AAAA,4BAC3DA,EAAK,eACJ,gBAAAnD,EAAC,OAAE,WAAU,qCAAqC,YAAK,YAAA,CAAY;AAAA,0BAAA;AAAA,wBAAA;AAAA,sBAAA;AAAA,sBAKtEyF;AAAA,sBAGAG;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACH;AAAA,YAAA;AAAA,UAAA;AAAA,QACF;AAAA,MAAA;AAAA,IAAA,GAKEE,KAAY3D,IACdA,EAA2B,SAAS,IAAI,IACxC,SAAS;AAEb,WAAO4D,GAAaF,IAASC,EAAS;AAAA,EACxC;AACF;AAEA7F,GAAK,cAAc;"}
@@ -1,86 +1,88 @@
1
1
  import { jsxs as y, jsx as s } from "react/jsx-runtime";
2
- import { useState as M, useMemo as B, useCallback as L } from "react";
3
- const K = "checkbox", V = "checkbox-sm", W = "checkbox-primary", U = "input", X = "input-sm", P = "btn", q = "btn-sm", z = "btn-outline";
4
- function A({
5
- items: o,
2
+ import { useState as j, useMemo as D, useCallback as S } from "react";
3
+ import { useConfig as _ } from "../providers/ConfigProvider.js";
4
+ const E = "checkbox", P = "checkbox-sm", q = "checkbox-primary", O = "input", ee = "input-sm", z = "btn", A = "btn-sm", F = "btn-outline";
5
+ function G({
6
+ items: r,
6
7
  selectedKeys: n,
7
- onSelectChange: g,
8
- title: x,
9
- showSearch: k,
8
+ onSelectChange: p,
9
+ title: g,
10
+ showSearch: x,
10
11
  filterOption: N,
11
12
  render: T,
12
13
  showSelectAll: C,
13
- disabled: a,
14
+ disabled: d,
14
15
  listStyle: I,
15
- testId: i
16
+ testId: B,
17
+ emptyContent: L = "No data"
16
18
  }) {
17
- const [b, S] = M(""), d = B(() => b ? o.filter((e) => N(b, e)) : o, [o, b, N]), m = d.filter((e) => !e.disabled), c = m.length > 0 && m.every((e) => n.includes(e.key)), p = m.some((e) => n.includes(e.key)), $ = () => {
18
- if (!a)
19
- if (c)
20
- g(n.filter((e) => !m.some((r) => r.key === e)));
19
+ const [k, $] = j(""), b = D(() => k ? r.filter((e) => N(k, e)) : r, [r, k, N]), o = b.filter((e) => !e.disabled), u = o.length > 0 && o.every((e) => n.includes(e.key)), i = o.some((e) => n.includes(e.key)), M = () => {
20
+ if (!d)
21
+ if (u)
22
+ p(n.filter((e) => !o.some((a) => a.key === e)));
21
23
  else {
22
- const e = m.map((v) => v.key), r = [.../* @__PURE__ */ new Set([...n, ...e])];
23
- g(r);
24
+ const e = o.map((l) => l.key), a = [.../* @__PURE__ */ new Set([...n, ...e])];
25
+ p(a);
24
26
  }
25
- }, u = (e, r) => {
26
- a || r || (n.includes(e) ? g(n.filter((v) => v !== e)) : g([...n, e]));
27
+ }, v = (e, a) => {
28
+ d || a || (n.includes(e) ? p(n.filter((l) => l !== e)) : p([...n, e]));
27
29
  };
28
30
  return /* @__PURE__ */ y(
29
31
  "div",
30
32
  {
31
33
  className: "flex flex-col border border-base-300 rounded-lg bg-base-100 overflow-hidden",
32
34
  style: { width: 200, height: 300, ...I },
33
- "data-testid": i,
35
+ "data-testid": B,
34
36
  children: [
35
37
  /* @__PURE__ */ y("div", { className: "flex items-center gap-2 px-3 py-2 border-b border-base-300 bg-base-200", children: [
36
38
  C && /* @__PURE__ */ s(
37
39
  "input",
38
40
  {
39
41
  type: "checkbox",
40
- className: `${K} ${V} ${W}`,
41
- checked: c,
42
+ className: `${E} ${P} ${q}`,
43
+ checked: u,
42
44
  ref: (e) => {
43
- e && (e.indeterminate = p && !c);
45
+ e && (e.indeterminate = i && !u);
44
46
  },
45
- onChange: $,
46
- disabled: a || m.length === 0
47
+ onChange: M,
48
+ disabled: d || o.length === 0
47
49
  }
48
50
  ),
49
- /* @__PURE__ */ s("span", { className: "flex-1 font-medium text-sm truncate", children: x }),
51
+ /* @__PURE__ */ s("span", { className: "flex-1 font-medium text-sm truncate", children: g }),
50
52
  /* @__PURE__ */ y("span", { className: "text-xs text-base-content/50", children: [
51
- n.filter((e) => d.some((r) => r.key === e)).length,
53
+ n.filter((e) => b.some((a) => a.key === e)).length,
52
54
  "/",
53
- d.length
55
+ b.length
54
56
  ] })
55
57
  ] }),
56
- k && /* @__PURE__ */ s("div", { className: "px-2 py-2 border-b border-base-300", children: /* @__PURE__ */ s(
58
+ x && /* @__PURE__ */ s("div", { className: "px-2 py-2 border-b border-base-300", children: /* @__PURE__ */ s(
57
59
  "input",
58
60
  {
59
61
  type: "text",
60
- className: `${U} ${X} w-full`,
62
+ className: `${O} ${ee} w-full`,
61
63
  placeholder: "Search...",
62
- value: b,
63
- onChange: (e) => S(e.target.value),
64
- disabled: a
64
+ value: k,
65
+ onChange: (e) => $(e.target.value),
66
+ disabled: d
65
67
  }
66
68
  ) }),
67
- /* @__PURE__ */ s("div", { className: "flex-1 overflow-auto", children: d.length > 0 ? d.map((e) => /* @__PURE__ */ y(
69
+ /* @__PURE__ */ s("div", { className: "flex-1 overflow-auto", children: b.length > 0 ? b.map((e) => /* @__PURE__ */ y(
68
70
  "div",
69
71
  {
70
72
  className: [
71
73
  "flex items-center gap-2 px-3 py-2 cursor-pointer hover:bg-base-200 transition-colors",
72
74
  n.includes(e.key) && "bg-primary/10",
73
- (a || e.disabled) && "opacity-50 cursor-not-allowed"
75
+ (d || e.disabled) && "opacity-50 cursor-not-allowed"
74
76
  ].filter(Boolean).join(" "),
75
- onClick: () => u(e.key, !!e.disabled),
77
+ onClick: () => v(e.key, !!e.disabled),
76
78
  children: [
77
79
  /* @__PURE__ */ s(
78
80
  "input",
79
81
  {
80
82
  type: "checkbox",
81
- className: `${K} ${V} ${W}`,
83
+ className: `${E} ${P} ${q}`,
82
84
  checked: n.includes(e.key),
83
- disabled: a || e.disabled,
85
+ disabled: d || e.disabled,
84
86
  onChange: () => {
85
87
  }
86
88
  }
@@ -89,85 +91,86 @@ function A({
89
91
  ]
90
92
  },
91
93
  e.key
92
- )) : /* @__PURE__ */ s("div", { className: "flex items-center justify-center h-full text-base-content/50 text-sm", children: "No data" }) })
94
+ )) : /* @__PURE__ */ s("div", { className: "flex items-center justify-center h-full text-base-content/50 text-sm", children: L }) })
93
95
  ]
94
96
  }
95
97
  );
96
98
  }
97
- function _({
98
- dataSource: o,
99
+ function re({
100
+ dataSource: r,
99
101
  targetKeys: n,
100
- defaultTargetKeys: g = [],
101
- onChange: x,
102
- onSelectChange: k,
102
+ defaultTargetKeys: p = [],
103
+ onChange: g,
104
+ onSelectChange: x,
103
105
  titles: N = ["Source", "Target"],
104
- render: T = (c) => c.title,
106
+ render: T = (o) => o.title,
105
107
  showSearch: C = !1,
106
- filterOption: a = (c, p) => (typeof p.title == "string" ? p.title : String(p.title)).toLowerCase().includes(c.toLowerCase()),
108
+ filterOption: d = (o, u) => (typeof u.title == "string" ? u.title : String(u.title)).toLowerCase().includes(o.toLowerCase()),
107
109
  showSelectAll: I = !0,
108
- disabled: i = !1,
109
- listStyle: b,
110
- className: S = "",
111
- "data-testid": d,
112
- ...m
110
+ disabled: B,
111
+ listStyle: L,
112
+ className: k = "",
113
+ "data-testid": $,
114
+ ...b
113
115
  }) {
114
- const c = (t) => d ? `${d}-${t}` : void 0, [p, $] = M(g), [u, e] = M([]), [r, v] = M([]), h = n ?? p, D = B(
115
- () => o.filter((t) => !h.includes(t.key)),
116
- [o, h]
117
- ), E = B(
118
- () => o.filter((t) => h.includes(t.key)),
119
- [o, h]
120
- ), F = L(
116
+ const { componentDisabled: o, renderEmpty: u } = _(), i = B ?? o ?? !1, M = u?.("Transfer") ?? "No data", v = (t) => $ ? `${$}-${t}` : void 0, [e, a] = j(p), [l, V] = j([]), [h, W] = j([]), m = n ?? e, H = D(
117
+ () => r.filter((t) => !m.includes(t.key)),
118
+ [r, m]
119
+ ), J = D(
120
+ () => r.filter((t) => m.includes(t.key)),
121
+ [r, m]
122
+ ), Q = S(
121
123
  (t) => {
122
- e(t), k?.(t, r);
124
+ V(t), x?.(t, h);
123
125
  },
124
- [r, k]
125
- ), G = L(
126
+ [h, x]
127
+ ), R = S(
126
128
  (t) => {
127
- v(t), k?.(u, t);
129
+ W(t), x?.(l, t);
128
130
  },
129
- [u, k]
130
- ), H = L(() => {
131
- if (i || u.length === 0) return;
132
- const t = u.filter((f) => {
133
- const w = o.find((j) => j.key === f);
131
+ [l, x]
132
+ ), U = S(() => {
133
+ if (i || l.length === 0) return;
134
+ const t = l.filter((f) => {
135
+ const w = r.find((K) => K.key === f);
134
136
  return w && !w.disabled;
135
137
  });
136
138
  if (t.length === 0) return;
137
- const l = [...h, ...t];
138
- n === void 0 && $(l), e([]), x?.(l, "right", t);
139
- }, [i, u, h, n, x, o]), J = L(() => {
140
- if (i || r.length === 0) return;
141
- const t = r.filter((f) => {
142
- const w = o.find((j) => j.key === f);
139
+ const c = [...m, ...t];
140
+ n === void 0 && a(c), V([]), g?.(c, "right", t);
141
+ }, [i, l, m, n, g, r]), X = S(() => {
142
+ if (i || h.length === 0) return;
143
+ const t = h.filter((f) => {
144
+ const w = r.find((K) => K.key === f);
143
145
  return w && !w.disabled;
144
146
  });
145
147
  if (t.length === 0) return;
146
- const l = h.filter((f) => !t.includes(f));
147
- n === void 0 && $(l), v([]), x?.(l, "left", t);
148
- }, [i, r, h, n, x, o]), Q = u.some((t) => {
149
- const l = o.find((f) => f.key === t);
150
- return l && !l.disabled;
151
- }), R = r.some((t) => {
152
- const l = o.find((f) => f.key === t);
153
- return l && !l.disabled;
148
+ const c = m.filter((f) => !t.includes(f));
149
+ n === void 0 && a(c), W([]), g?.(c, "left", t);
150
+ }, [i, h, m, n, g, r]), Y = l.some((t) => {
151
+ const c = r.find((f) => f.key === t);
152
+ return c && !c.disabled;
153
+ }), Z = h.some((t) => {
154
+ const c = r.find((f) => f.key === t);
155
+ return c && !c.disabled;
154
156
  });
155
- return /* @__PURE__ */ y("div", { className: `flex items-center gap-4 ${S}`, "data-testid": d, ...m, children: [
157
+ return /* @__PURE__ */ y("div", { className: `flex items-center gap-4 ${k}`, "data-testid": $, ...b, children: [
156
158
  /* @__PURE__ */ s(
157
- A,
159
+ G,
158
160
  {
159
- items: D,
160
- selectedKeys: u,
161
- onSelectChange: F,
161
+ items: H,
162
+ selectedKeys: l,
163
+ onSelectChange: Q,
162
164
  title: N[0],
163
165
  showSearch: C,
164
- filterOption: a,
166
+ filterOption: d,
165
167
  render: T,
166
168
  showSelectAll: I,
167
169
  disabled: i,
168
- listStyle: b,
170
+ listStyle: L,
169
171
  direction: "left",
170
- testId: c("source")
172
+ testId: v("source"),
173
+ emptyContent: M
171
174
  }
172
175
  ),
173
176
  /* @__PURE__ */ y("div", { className: "flex flex-col gap-2", children: [
@@ -175,11 +178,11 @@ function _({
175
178
  "button",
176
179
  {
177
180
  type: "button",
178
- className: `${P} ${q} ${z}`,
179
- onClick: H,
180
- disabled: i || !Q,
181
+ className: `${z} ${A} ${F}`,
182
+ onClick: U,
183
+ disabled: i || !Y,
181
184
  "aria-label": "Move to target",
182
- "data-testid": c("move-right"),
185
+ "data-testid": v("move-right"),
183
186
  children: /* @__PURE__ */ s("svg", { className: "w-4 h-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: /* @__PURE__ */ s("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 5l7 7-7 7" }) })
184
187
  }
185
188
  ),
@@ -187,35 +190,36 @@ function _({
187
190
  "button",
188
191
  {
189
192
  type: "button",
190
- className: `${P} ${q} ${z}`,
191
- onClick: J,
192
- disabled: i || !R,
193
+ className: `${z} ${A} ${F}`,
194
+ onClick: X,
195
+ disabled: i || !Z,
193
196
  "aria-label": "Move to source",
194
- "data-testid": c("move-left"),
197
+ "data-testid": v("move-left"),
195
198
  children: /* @__PURE__ */ s("svg", { className: "w-4 h-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: /* @__PURE__ */ s("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M15 19l-7-7 7-7" }) })
196
199
  }
197
200
  )
198
201
  ] }),
199
202
  /* @__PURE__ */ s(
200
- A,
203
+ G,
201
204
  {
202
- items: E,
203
- selectedKeys: r,
204
- onSelectChange: G,
205
+ items: J,
206
+ selectedKeys: h,
207
+ onSelectChange: R,
205
208
  title: N[1],
206
209
  showSearch: C,
207
- filterOption: a,
210
+ filterOption: d,
208
211
  render: T,
209
212
  showSelectAll: I,
210
213
  disabled: i,
211
- listStyle: b,
214
+ listStyle: L,
212
215
  direction: "right",
213
- testId: c("target")
216
+ testId: v("target"),
217
+ emptyContent: M
214
218
  }
215
219
  )
216
220
  ] });
217
221
  }
218
222
  export {
219
- _ as Transfer
223
+ re as Transfer
220
224
  };
221
225
  //# sourceMappingURL=Transfer.js.map