asterui 0.12.68 → 0.12.70

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.
@@ -1 +1 @@
1
- {"version":3,"file":"Input.js","sources":["../../src/components/Input.tsx"],"sourcesContent":["import React, { forwardRef, useState, useCallback, useRef, useEffect } from 'react'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dInput = 'input'\nconst dInputXs = 'input-xs'\nconst dInputSm = 'input-sm'\nconst dInputMd = 'input-md'\nconst dInputLg = 'input-lg'\nconst dInputXl = 'input-xl'\nconst dInputNeutral = 'input-neutral'\nconst dInputPrimary = 'input-primary'\nconst dInputSecondary = 'input-secondary'\nconst dInputAccent = 'input-accent'\nconst dInputInfo = 'input-info'\nconst dInputSuccess = 'input-success'\nconst dInputWarning = 'input-warning'\nconst dInputError = 'input-error'\nconst dInputGhost = 'input-ghost'\nconst dFloatingLabel = 'floating-label'\n\nexport interface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'prefix'> {\n type?: 'text' | 'password' | 'email' | 'number' | 'date' | 'datetime-local' | 'week' | 'month' | 'tel' | 'url' | 'search' | 'time'\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n color?: 'neutral' | 'primary' | 'secondary' | 'accent' | 'info' | 'success' | 'warning' | 'error'\n /** Validation status */\n status?: 'error' | 'warning'\n ghost?: boolean\n bordered?: boolean\n className?: string\n /** Input mask pattern. Use # for digits, A for letters, * for alphanumeric */\n mask?: string\n /** Placeholder character shown in mask (default: _) */\n maskPlaceholder?: string\n /** Show clear button when input has value */\n allowClear?: boolean | { clearIcon?: React.ReactNode }\n /** Callback when clear button is clicked */\n onClear?: () => void\n /** Prefix icon or element (inside input) */\n prefix?: React.ReactNode\n /** Suffix icon or element (inside input) */\n suffix?: React.ReactNode\n /** Text/element before input (outside, using DaisyUI label) */\n addonBefore?: React.ReactNode\n /** Text/element after input (outside, using DaisyUI label) */\n addonAfter?: React.ReactNode\n /** Floating label text (uses DaisyUI floating-label) */\n floatingLabel?: string\n /** ID for error message element (for aria-describedby) */\n errorId?: string\n /** Render as unstyled input (for use inside styled wrappers) */\n unstyled?: boolean\n 'data-testid'?: string\n}\n\n// Helper to apply mask to raw value\nfunction applyMask(raw: string, mask: string, placeholder: string): string {\n let result = ''\n let rawIndex = 0\n\n for (let i = 0; i < mask.length && rawIndex <= raw.length; i++) {\n const maskChar = mask[i]\n if (maskChar === '#' || maskChar === 'A' || maskChar === '*') {\n if (rawIndex < raw.length) {\n result += raw[rawIndex]\n rawIndex++\n } else {\n result += placeholder\n }\n } else {\n result += maskChar\n }\n }\n\n return result\n}\n\n// Extract raw value from masked input\nfunction extractRaw(value: string, mask: string, placeholder: string): string {\n let raw = ''\n for (let i = 0; i < value.length && i < mask.length; i++) {\n const maskChar = mask[i]\n if ((maskChar === '#' || maskChar === 'A' || maskChar === '*') && value[i] !== placeholder) {\n raw += value[i]\n }\n }\n return raw\n}\n\n// Check if character is valid for mask position\nfunction isValidChar(char: string, maskChar: string): boolean {\n if (maskChar === '#') return /\\d/.test(char)\n if (maskChar === 'A') return /[a-zA-Z]/.test(char)\n if (maskChar === '*') return /[a-zA-Z0-9]/.test(char)\n return false\n}\n\n// Find next input position in mask\nfunction findNextInputPosition(mask: string, fromIndex: number): number {\n for (let i = fromIndex; i < mask.length; i++) {\n if (mask[i] === '#' || mask[i] === 'A' || mask[i] === '*') {\n return i\n }\n }\n return mask.length\n}\n\n// Clear icon component\nconst ClearIcon: React.FC<{ onClick: () => void; className?: string }> = ({ onClick, className }) => (\n <button\n type=\"button\"\n onClick={onClick}\n className={`flex items-center justify-center opacity-50 hover:opacity-100 transition-opacity ${className || ''}`}\n aria-label=\"Clear input\"\n tabIndex={-1}\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n)\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\n (\n {\n type = 'text',\n size,\n color,\n status,\n ghost = false,\n bordered = true,\n className = '',\n mask,\n maskPlaceholder = '_',\n allowClear,\n onClear,\n prefix,\n suffix,\n addonBefore,\n addonAfter,\n floatingLabel,\n errorId,\n unstyled = false,\n value,\n defaultValue,\n onChange,\n onKeyDown,\n disabled,\n required,\n 'data-testid': testId,\n ...props\n },\n ref\n ) => {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n\n const sizeClasses = {\n xs: dInputXs,\n sm: dInputSm,\n md: dInputMd,\n lg: dInputLg,\n xl: dInputXl,\n }\n\n const colorClasses = {\n neutral: dInputNeutral,\n primary: dInputPrimary,\n secondary: dInputSecondary,\n accent: dInputAccent,\n info: dInputInfo,\n success: dInputSuccess,\n warning: dInputWarning,\n error: dInputError,\n }\n\n const statusClasses = {\n error: dInputError,\n warning: dInputWarning,\n }\n\n // Status takes precedence over color for validation feedback\n const effectiveColorClass = status ? statusClasses[status] : (color ? colorClasses[color] : '')\n\n // When wrapped with external addons OR unstyled prop, the wrapper has the input styling\n // Inner input should be unstyled (grow to fill space)\n const hasExternalAddons = addonBefore || addonAfter\n const shouldBeUnstyled = hasExternalAddons || unstyled\n\n const inputClasses = shouldBeUnstyled\n ? ['grow', 'bg-transparent', 'border-0', 'outline-none', 'focus:outline-none', className].filter(Boolean).join(' ')\n : [\n dInput,\n !bordered && 'border-0',\n ghost && dInputGhost,\n sizeClasses[effectiveSize],\n effectiveColorClass,\n className,\n ].filter(Boolean).join(' ')\n\n // Mask handling\n const innerRef = useRef<HTMLInputElement>(null)\n const inputRef = (ref as React.RefObject<HTMLInputElement>) || innerRef\n\n const getInitialRaw = useCallback(() => {\n if (!mask) return ''\n const initial = (value ?? defaultValue ?? '') as string\n return extractRaw(initial, mask, maskPlaceholder)\n }, [mask, value, defaultValue, maskPlaceholder])\n\n const [rawValue, setRawValue] = useState(getInitialRaw)\n const [cursorPos, setCursorPos] = useState<number | null>(null)\n\n // Sync with controlled value\n useEffect(() => {\n if (mask && value !== undefined) {\n setRawValue(extractRaw(value as string, mask, maskPlaceholder))\n }\n }, [mask, value, maskPlaceholder])\n\n // Set cursor position after render\n useEffect(() => {\n if (cursorPos !== null && inputRef.current) {\n inputRef.current.setSelectionRange(cursorPos, cursorPos)\n setCursorPos(null)\n }\n }, [cursorPos, inputRef])\n\n const handleMaskedChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!mask) {\n onChange?.(e)\n return\n }\n\n const input = e.target\n const inputValue = input.value\n\n // Extract what the user is trying to type\n const newRaw = extractRaw(inputValue, mask, maskPlaceholder)\n\n // Filter to only valid characters\n let filteredRaw = ''\n let rawIdx = 0\n for (let i = 0; i < mask.length && rawIdx < newRaw.length; i++) {\n const maskChar = mask[i]\n if (maskChar === '#' || maskChar === 'A' || maskChar === '*') {\n if (isValidChar(newRaw[rawIdx], maskChar)) {\n filteredRaw += newRaw[rawIdx]\n }\n rawIdx++\n }\n }\n\n setRawValue(filteredRaw)\n\n // Calculate new cursor position\n const maskedValue = applyMask(filteredRaw, mask, maskPlaceholder)\n let newCursor = findNextInputPosition(mask, 0)\n let charsPlaced = 0\n for (let i = 0; i < mask.length; i++) {\n const maskChar = mask[i]\n if (maskChar === '#' || maskChar === 'A' || maskChar === '*') {\n if (charsPlaced < filteredRaw.length) {\n charsPlaced++\n newCursor = i + 1\n }\n }\n }\n // Skip to next input position if we're on a literal\n newCursor = findNextInputPosition(mask, newCursor)\n if (newCursor > mask.length) newCursor = mask.length\n\n setCursorPos(newCursor)\n\n // Create synthetic event with masked value\n const syntheticEvent = {\n ...e,\n target: { ...input, value: maskedValue },\n currentTarget: { ...input, value: maskedValue },\n } as React.ChangeEvent<HTMLInputElement>\n\n onChange?.(syntheticEvent)\n },\n [mask, maskPlaceholder, onChange]\n )\n\n const handleMaskedKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (!mask) {\n onKeyDown?.(e)\n return\n }\n\n if (e.key === 'Backspace') {\n e.preventDefault()\n const newRaw = rawValue.slice(0, -1)\n setRawValue(newRaw)\n\n // Calculate cursor position\n let newCursor = 0\n let charsPlaced = 0\n for (let i = 0; i < mask.length; i++) {\n const maskChar = mask[i]\n if (maskChar === '#' || maskChar === 'A' || maskChar === '*') {\n if (charsPlaced < newRaw.length) {\n charsPlaced++\n newCursor = i + 1\n } else {\n newCursor = i\n break\n }\n }\n }\n setCursorPos(newCursor)\n\n const maskedValue = applyMask(newRaw, mask, maskPlaceholder)\n const input = e.currentTarget\n const syntheticEvent = {\n target: { ...input, value: maskedValue },\n currentTarget: { ...input, value: maskedValue },\n } as unknown as React.ChangeEvent<HTMLInputElement>\n\n onChange?.(syntheticEvent)\n }\n\n onKeyDown?.(e)\n },\n [mask, maskPlaceholder, rawValue, onChange, onKeyDown]\n )\n\n // Track internal value for allowClear visibility\n const [internalValue, setInternalValue] = useState((value ?? defaultValue ?? '') as string)\n\n // Sync internal value with controlled value\n useEffect(() => {\n if (value !== undefined) {\n setInternalValue(value as string)\n }\n }, [value])\n\n const handleChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n setInternalValue(e.target.value)\n onChange?.(e)\n }, [onChange])\n\n const handleClear = useCallback(() => {\n setInternalValue('')\n setRawValue('')\n onClear?.()\n // Create synthetic event for onChange\n if (onChange && inputRef.current) {\n const syntheticEvent = {\n target: { ...inputRef.current, value: '' },\n currentTarget: { ...inputRef.current, value: '' },\n } as React.ChangeEvent<HTMLInputElement>\n onChange(syntheticEvent)\n }\n }, [onClear, onChange, inputRef])\n\n // Determine if we should show clear button\n const currentValue = mask ? rawValue : internalValue\n const showClear = allowClear && currentValue && !disabled\n\n // Get custom clear icon if provided\n const clearIcon = typeof allowClear === 'object' && allowClear.clearIcon\n ? allowClear.clearIcon\n : null\n\n // Accessibility attributes\n const ariaProps: Record<string, string | boolean | undefined> = {}\n if (status === 'error') {\n ariaProps['aria-invalid'] = true\n }\n if (errorId) {\n ariaProps['aria-describedby'] = errorId\n }\n if (required) {\n ariaProps['aria-required'] = true\n }\n\n // If we have prefix, suffix, or allowClear, wrap in a container\n const hasInternalAddons = prefix || suffix || allowClear\n const hasWrapper = hasInternalAddons || hasExternalAddons || !!floatingLabel\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n const inputTestId = testId ? (hasWrapper ? getTestId('input') : testId) : undefined\n\n // Size class for floating label\n const floatingSizeClasses = {\n xs: dInputXs,\n sm: dInputSm,\n md: dInputMd,\n lg: dInputLg,\n xl: dInputXl,\n }\n\n // Build the masked value if needed\n const maskedValue = mask ? applyMask(rawValue, mask, maskPlaceholder) : undefined\n\n // Build the core input element\n const buildInput = (extraClasses?: string) => (\n <input\n ref={inputRef}\n type={mask ? 'text' : type}\n className={[\n inputClasses,\n hasInternalAddons && 'w-full',\n prefix && 'pl-10',\n (suffix || showClear) && 'pr-10',\n extraClasses,\n ].filter(Boolean).join(' ')}\n value={maskedValue ?? (value !== undefined ? value : (hasInternalAddons ? internalValue : value))}\n defaultValue={value === undefined && !mask ? defaultValue : undefined}\n onChange={mask ? handleMaskedChange : (hasInternalAddons ? handleChange : onChange)}\n onKeyDown={mask ? handleMaskedKeyDown : onKeyDown}\n disabled={disabled}\n required={required}\n data-testid={inputTestId}\n {...ariaProps}\n {...props}\n />\n )\n\n // Build input with internal addons (prefix icon, suffix icon, clear button)\n const buildInputWithInternalAddons = (extraClasses?: string) => {\n if (!hasInternalAddons) {\n return buildInput(extraClasses)\n }\n\n return (\n <div\n className={`relative flex items-center ${extraClasses || ''}`}\n data-testid={!hasExternalAddons && !floatingLabel ? testId : getTestId('input-wrapper')}\n >\n {prefix && (\n <span\n className=\"absolute left-3 flex items-center text-base-content/70 pointer-events-none z-10\"\n data-testid={getTestId('prefix')}\n >\n {prefix}\n </span>\n )}\n {buildInput()}\n {(suffix || showClear) && (\n <span className=\"absolute right-3 flex items-center gap-1 z-10\" data-testid={getTestId('suffix')}>\n {showClear && (\n <span data-testid={getTestId('clear')}>\n {clearIcon || <ClearIcon onClick={handleClear} />}\n </span>\n )}\n {suffix && <span className=\"text-base-content/70\">{suffix}</span>}\n </span>\n )}\n </div>\n )\n }\n\n // Wrap with floating label if specified\n const wrapWithFloatingLabel = (input: React.ReactNode) => {\n if (!floatingLabel) return input\n\n const floatingClasses = [\n dFloatingLabel,\n floatingSizeClasses[effectiveSize],\n ].filter(Boolean).join(' ')\n\n return (\n <label className={floatingClasses} data-testid={testId}>\n {input}\n <span>{floatingLabel}</span>\n </label>\n )\n }\n\n // Wrap with external addons (addonBefore/addonAfter) using DaisyUI input wrapper pattern\n const wrapWithExternalAddons = (input: React.ReactNode) => {\n if (!hasExternalAddons) return input\n\n const addonClasses = [\n dInput,\n 'flex',\n 'items-center',\n 'gap-2',\n sizeClasses[effectiveSize],\n effectiveColorClass,\n ].filter(Boolean).join(' ')\n\n return (\n <label className={addonClasses} data-testid={testId}>\n {addonBefore && (\n <span className=\"text-base-content/70\" data-testid={getTestId('addon-before')}>\n {addonBefore}\n </span>\n )}\n {input}\n {addonAfter && (\n <span className=\"text-base-content/70\" data-testid={getTestId('addon-after')}>\n {addonAfter}\n </span>\n )}\n </label>\n )\n }\n\n // Build the final element\n const inputElement = buildInputWithInternalAddons(\n floatingLabel ? `${dInput} w-full` : undefined\n )\n\n // Apply wrappers\n return wrapWithExternalAddons(wrapWithFloatingLabel(\n floatingLabel ? (\n // For floating label, use raw input (label wrapper provides styling)\n <input\n ref={inputRef}\n type={mask ? 'text' : type}\n className={`${dInput} w-full`}\n value={maskedValue ?? (value !== undefined ? value : internalValue)}\n defaultValue={value === undefined && !mask ? defaultValue : undefined}\n onChange={mask ? handleMaskedChange : handleChange}\n onKeyDown={mask ? handleMaskedKeyDown : onKeyDown}\n disabled={disabled}\n required={required}\n data-testid={inputTestId}\n {...ariaProps}\n {...props}\n />\n ) : inputElement\n ))\n }\n)\n\nInput.displayName = 'Input'\n"],"names":["dInput","dInputXs","dInputSm","dInputMd","dInputLg","dInputXl","dInputNeutral","dInputPrimary","dInputSecondary","dInputAccent","dInputInfo","dInputSuccess","dInputWarning","dInputError","dInputGhost","dFloatingLabel","applyMask","raw","mask","placeholder","result","rawIndex","i","maskChar","extractRaw","value","isValidChar","char","findNextInputPosition","fromIndex","ClearIcon","onClick","className","jsx","Input","forwardRef","type","size","color","status","ghost","bordered","maskPlaceholder","allowClear","onClear","prefix","suffix","addonBefore","addonAfter","floatingLabel","errorId","unstyled","defaultValue","onChange","onKeyDown","disabled","required","testId","props","ref","componentSize","useConfig","effectiveSize","sizeClasses","effectiveColorClass","hasExternalAddons","inputClasses","innerRef","useRef","inputRef","getInitialRaw","useCallback","rawValue","setRawValue","useState","cursorPos","setCursorPos","useEffect","handleMaskedChange","e","input","inputValue","newRaw","filteredRaw","rawIdx","maskedValue","newCursor","charsPlaced","syntheticEvent","handleMaskedKeyDown","internalValue","setInternalValue","handleChange","handleClear","showClear","clearIcon","ariaProps","hasInternalAddons","hasWrapper","getTestId","inputTestId","floatingSizeClasses","buildInput","extraClasses","buildInputWithInternalAddons","jsxs","wrapWithFloatingLabel","floatingClasses","wrapWithExternalAddons","addonClasses","inputElement"],"mappings":"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"}
1
+ {"version":3,"file":"Input.js","sources":["../../src/components/Input.tsx"],"sourcesContent":["import React, { forwardRef, useState, useCallback, useRef, useEffect } from 'react'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dInput = 'input'\nconst dInputXs = 'input-xs'\nconst dInputSm = 'input-sm'\nconst dInputMd = 'input-md'\nconst dInputLg = 'input-lg'\nconst dInputXl = 'input-xl'\nconst dInputNeutral = 'input-neutral'\nconst dInputPrimary = 'input-primary'\nconst dInputSecondary = 'input-secondary'\nconst dInputAccent = 'input-accent'\nconst dInputInfo = 'input-info'\nconst dInputSuccess = 'input-success'\nconst dInputWarning = 'input-warning'\nconst dInputError = 'input-error'\nconst dInputGhost = 'input-ghost'\nconst dFloatingLabel = 'floating-label'\n\nexport interface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'prefix'> {\n type?: 'text' | 'password' | 'email' | 'number' | 'date' | 'datetime-local' | 'week' | 'month' | 'tel' | 'url' | 'search' | 'time'\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n color?: 'neutral' | 'primary' | 'secondary' | 'accent' | 'info' | 'success' | 'warning' | 'error'\n /** Validation status */\n status?: 'error' | 'warning'\n ghost?: boolean\n bordered?: boolean\n className?: string\n /** Input mask pattern. Use # for digits, A for letters, * for alphanumeric */\n mask?: string\n /** Placeholder character shown in mask (default: _) */\n maskPlaceholder?: string\n /** Show clear button when input has value */\n allowClear?: boolean | { clearIcon?: React.ReactNode }\n /** Callback when clear button is clicked */\n onClear?: () => void\n /** Prefix icon or element (inside input) */\n prefix?: React.ReactNode\n /** Suffix icon or element (inside input) */\n suffix?: React.ReactNode\n /** Text/element before input (outside, using DaisyUI label) */\n addonBefore?: React.ReactNode\n /** Text/element after input (outside, using DaisyUI label) */\n addonAfter?: React.ReactNode\n /** Floating label text (uses DaisyUI floating-label) */\n floatingLabel?: string\n /** ID for error message element (for aria-describedby) */\n errorId?: string\n /** Render as unstyled input (for use inside styled wrappers) */\n unstyled?: boolean\n 'data-testid'?: string\n}\n\n// Helper to apply mask to raw value\nfunction applyMask(raw: string, mask: string, placeholder: string): string {\n let result = ''\n let rawIndex = 0\n\n for (let i = 0; i < mask.length && rawIndex <= raw.length; i++) {\n const maskChar = mask[i]\n if (maskChar === '#' || maskChar === 'A' || maskChar === '*') {\n if (rawIndex < raw.length) {\n result += raw[rawIndex]\n rawIndex++\n } else {\n result += placeholder\n }\n } else {\n result += maskChar\n }\n }\n\n return result\n}\n\n// Extract raw value from masked input\nfunction extractRaw(value: string, mask: string, placeholder: string): string {\n let raw = ''\n for (let i = 0; i < value.length && i < mask.length; i++) {\n const maskChar = mask[i]\n if ((maskChar === '#' || maskChar === 'A' || maskChar === '*') && value[i] !== placeholder) {\n raw += value[i]\n }\n }\n return raw\n}\n\n// Check if character is valid for mask position\nfunction isValidChar(char: string, maskChar: string): boolean {\n if (maskChar === '#') return /\\d/.test(char)\n if (maskChar === 'A') return /[a-zA-Z]/.test(char)\n if (maskChar === '*') return /[a-zA-Z0-9]/.test(char)\n return false\n}\n\n// Find next input position in mask\nfunction findNextInputPosition(mask: string, fromIndex: number): number {\n for (let i = fromIndex; i < mask.length; i++) {\n if (mask[i] === '#' || mask[i] === 'A' || mask[i] === '*') {\n return i\n }\n }\n return mask.length\n}\n\n// Clear icon component\nconst ClearIcon: React.FC<{ onClick: () => void; className?: string }> = ({ onClick, className }) => (\n <button\n type=\"button\"\n onClick={onClick}\n className={`flex items-center justify-center opacity-50 hover:opacity-100 transition-opacity ${className || ''}`}\n aria-label=\"Clear input\"\n tabIndex={-1}\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n)\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\n (\n {\n type = 'text',\n size,\n color,\n status,\n ghost = false,\n bordered = true,\n className = '',\n mask,\n maskPlaceholder = '_',\n allowClear,\n onClear,\n prefix,\n suffix,\n addonBefore,\n addonAfter,\n floatingLabel,\n errorId,\n unstyled = false,\n value,\n defaultValue,\n onChange,\n onKeyDown,\n disabled,\n required,\n 'data-testid': testId,\n ...props\n },\n ref\n ) => {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n\n const sizeClasses = {\n xs: dInputXs,\n sm: dInputSm,\n md: dInputMd,\n lg: dInputLg,\n xl: dInputXl,\n }\n\n const colorClasses = {\n neutral: dInputNeutral,\n primary: dInputPrimary,\n secondary: dInputSecondary,\n accent: dInputAccent,\n info: dInputInfo,\n success: dInputSuccess,\n warning: dInputWarning,\n error: dInputError,\n }\n\n const statusClasses = {\n error: dInputError,\n warning: dInputWarning,\n }\n\n // Status takes precedence over color for validation feedback\n const effectiveColorClass = status ? statusClasses[status] : (color ? colorClasses[color] : '')\n\n // When wrapped with external addons OR unstyled prop, the wrapper has the input styling\n // Inner input should be unstyled (grow to fill space)\n const hasExternalAddons = addonBefore || addonAfter\n const shouldBeUnstyled = hasExternalAddons || unstyled\n\n const inputClasses = shouldBeUnstyled\n ? ['grow', 'bg-transparent', 'border-0', 'outline-none', 'focus:outline-none', className].filter(Boolean).join(' ')\n : [\n dInput,\n !bordered && 'border-0',\n ghost && dInputGhost,\n sizeClasses[effectiveSize],\n effectiveColorClass,\n className,\n ].filter(Boolean).join(' ')\n\n // Mask handling\n const inputRef = useRef<HTMLInputElement>(null)\n const setInputRef = useCallback(\n (node: HTMLInputElement | null) => {\n inputRef.current = node\n if (!ref) return\n if (typeof ref === 'function') {\n ref(node)\n } else {\n ;(ref as React.MutableRefObject<HTMLInputElement | null>).current = node\n }\n },\n [ref]\n )\n\n const getInitialRaw = useCallback(() => {\n if (!mask) return ''\n const initial = (value ?? defaultValue ?? '') as string\n return extractRaw(initial, mask, maskPlaceholder)\n }, [mask, value, defaultValue, maskPlaceholder])\n\n const [rawValue, setRawValue] = useState(getInitialRaw)\n const [cursorPos, setCursorPos] = useState<number | null>(null)\n\n // Sync with controlled value\n useEffect(() => {\n if (mask && value !== undefined) {\n setRawValue(extractRaw(value as string, mask, maskPlaceholder))\n }\n }, [mask, value, maskPlaceholder])\n\n // Set cursor position after render\n useEffect(() => {\n if (cursorPos !== null && inputRef.current) {\n inputRef.current.setSelectionRange(cursorPos, cursorPos)\n setCursorPos(null)\n }\n }, [cursorPos, inputRef])\n\n const handleMaskedChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!mask) {\n onChange?.(e)\n return\n }\n\n const input = e.target\n const inputValue = input.value\n\n // Extract what the user is trying to type\n const newRaw = extractRaw(inputValue, mask, maskPlaceholder)\n\n // Filter to only valid characters\n let filteredRaw = ''\n let rawIdx = 0\n for (let i = 0; i < mask.length && rawIdx < newRaw.length; i++) {\n const maskChar = mask[i]\n if (maskChar === '#' || maskChar === 'A' || maskChar === '*') {\n if (isValidChar(newRaw[rawIdx], maskChar)) {\n filteredRaw += newRaw[rawIdx]\n }\n rawIdx++\n }\n }\n\n setRawValue(filteredRaw)\n\n // Calculate new cursor position\n const maskedValue = applyMask(filteredRaw, mask, maskPlaceholder)\n let newCursor = findNextInputPosition(mask, 0)\n let charsPlaced = 0\n for (let i = 0; i < mask.length; i++) {\n const maskChar = mask[i]\n if (maskChar === '#' || maskChar === 'A' || maskChar === '*') {\n if (charsPlaced < filteredRaw.length) {\n charsPlaced++\n newCursor = i + 1\n }\n }\n }\n // Skip to next input position if we're on a literal\n newCursor = findNextInputPosition(mask, newCursor)\n if (newCursor > mask.length) newCursor = mask.length\n\n setCursorPos(newCursor)\n\n // Create synthetic event with masked value\n const syntheticEvent = {\n ...e,\n target: { ...input, value: maskedValue },\n currentTarget: { ...input, value: maskedValue },\n } as React.ChangeEvent<HTMLInputElement>\n\n onChange?.(syntheticEvent)\n },\n [mask, maskPlaceholder, onChange]\n )\n\n const handleMaskedKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (!mask) {\n onKeyDown?.(e)\n return\n }\n\n if (e.key === 'Backspace') {\n e.preventDefault()\n const newRaw = rawValue.slice(0, -1)\n setRawValue(newRaw)\n\n // Calculate cursor position\n let newCursor = 0\n let charsPlaced = 0\n for (let i = 0; i < mask.length; i++) {\n const maskChar = mask[i]\n if (maskChar === '#' || maskChar === 'A' || maskChar === '*') {\n if (charsPlaced < newRaw.length) {\n charsPlaced++\n newCursor = i + 1\n } else {\n newCursor = i\n break\n }\n }\n }\n setCursorPos(newCursor)\n\n const maskedValue = applyMask(newRaw, mask, maskPlaceholder)\n const input = e.currentTarget\n const syntheticEvent = {\n target: { ...input, value: maskedValue },\n currentTarget: { ...input, value: maskedValue },\n } as unknown as React.ChangeEvent<HTMLInputElement>\n\n onChange?.(syntheticEvent)\n }\n\n onKeyDown?.(e)\n },\n [mask, maskPlaceholder, rawValue, onChange, onKeyDown]\n )\n\n // Track internal value for allowClear visibility\n const [internalValue, setInternalValue] = useState((value ?? defaultValue ?? '') as string)\n\n // Sync internal value with controlled value\n useEffect(() => {\n if (value !== undefined) {\n setInternalValue(value as string)\n }\n }, [value])\n\n const handleChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n setInternalValue(e.target.value)\n onChange?.(e)\n }, [onChange])\n\n const handleClear = useCallback(() => {\n setInternalValue('')\n setRawValue('')\n onClear?.()\n // Create synthetic event for onChange\n if (onChange && inputRef.current) {\n const syntheticEvent = {\n target: { ...inputRef.current, value: '' },\n currentTarget: { ...inputRef.current, value: '' },\n } as React.ChangeEvent<HTMLInputElement>\n onChange(syntheticEvent)\n }\n }, [onClear, onChange, inputRef])\n\n // Determine if we should show clear button\n const currentValue = mask ? rawValue : internalValue\n const showClear = allowClear && currentValue && !disabled\n\n // Get custom clear icon if provided\n const clearIcon = typeof allowClear === 'object' && allowClear.clearIcon\n ? allowClear.clearIcon\n : null\n\n // Accessibility attributes\n const ariaProps: Record<string, string | boolean | undefined> = {}\n if (status === 'error') {\n ariaProps['aria-invalid'] = true\n }\n if (errorId) {\n ariaProps['aria-describedby'] = errorId\n }\n if (required) {\n ariaProps['aria-required'] = true\n }\n\n // If we have prefix, suffix, or allowClear, wrap in a container\n const hasInternalAddons = prefix || suffix || allowClear\n const hasWrapper = hasInternalAddons || hasExternalAddons || !!floatingLabel\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n const inputTestId = testId ? (hasWrapper ? getTestId('input') : testId) : undefined\n\n // Size class for floating label\n const floatingSizeClasses = {\n xs: dInputXs,\n sm: dInputSm,\n md: dInputMd,\n lg: dInputLg,\n xl: dInputXl,\n }\n\n // Build the masked value if needed\n const maskedValue = mask ? applyMask(rawValue, mask, maskPlaceholder) : undefined\n\n // Build the core input element\n const buildInput = (extraClasses?: string) => (\n <input\n ref={setInputRef}\n type={mask ? 'text' : type}\n className={[\n inputClasses,\n hasInternalAddons && 'w-full',\n prefix && 'pl-10',\n (suffix || showClear) && 'pr-10',\n extraClasses,\n ].filter(Boolean).join(' ')}\n value={maskedValue ?? (value !== undefined ? value : (hasInternalAddons ? internalValue : value))}\n defaultValue={value === undefined && !mask ? defaultValue : undefined}\n onChange={mask ? handleMaskedChange : (hasInternalAddons ? handleChange : onChange)}\n onKeyDown={mask ? handleMaskedKeyDown : onKeyDown}\n disabled={disabled}\n required={required}\n data-testid={inputTestId}\n {...ariaProps}\n {...props}\n />\n )\n\n // Build input with internal addons (prefix icon, suffix icon, clear button)\n const buildInputWithInternalAddons = (extraClasses?: string) => {\n if (!hasInternalAddons) {\n return buildInput(extraClasses)\n }\n\n return (\n <div\n className={`relative flex items-center ${extraClasses || ''}`}\n data-testid={!hasExternalAddons && !floatingLabel ? testId : getTestId('input-wrapper')}\n >\n {prefix && (\n <span\n className=\"absolute left-3 flex items-center text-base-content/70 pointer-events-none z-10\"\n data-testid={getTestId('prefix')}\n >\n {prefix}\n </span>\n )}\n {buildInput()}\n {(suffix || showClear) && (\n <span className=\"absolute right-3 flex items-center gap-1 z-10\" data-testid={getTestId('suffix')}>\n {showClear && (\n <span data-testid={getTestId('clear')}>\n {clearIcon || <ClearIcon onClick={handleClear} />}\n </span>\n )}\n {suffix && <span className=\"text-base-content/70\">{suffix}</span>}\n </span>\n )}\n </div>\n )\n }\n\n // Wrap with floating label if specified\n const wrapWithFloatingLabel = (input: React.ReactNode) => {\n if (!floatingLabel) return input\n\n const floatingClasses = [\n dFloatingLabel,\n floatingSizeClasses[effectiveSize],\n ].filter(Boolean).join(' ')\n\n return (\n <label className={floatingClasses} data-testid={testId}>\n {input}\n <span>{floatingLabel}</span>\n </label>\n )\n }\n\n // Wrap with external addons (addonBefore/addonAfter) using DaisyUI input wrapper pattern\n const wrapWithExternalAddons = (input: React.ReactNode) => {\n if (!hasExternalAddons) return input\n\n const addonClasses = [\n dInput,\n 'flex',\n 'items-center',\n 'gap-2',\n sizeClasses[effectiveSize],\n effectiveColorClass,\n ].filter(Boolean).join(' ')\n\n return (\n <label className={addonClasses} data-testid={testId}>\n {addonBefore && (\n <span className=\"text-base-content/70\" data-testid={getTestId('addon-before')}>\n {addonBefore}\n </span>\n )}\n {input}\n {addonAfter && (\n <span className=\"text-base-content/70\" data-testid={getTestId('addon-after')}>\n {addonAfter}\n </span>\n )}\n </label>\n )\n }\n\n // Build the final element\n const inputElement = buildInputWithInternalAddons(\n floatingLabel ? `${dInput} w-full` : undefined\n )\n\n // Apply wrappers\n return wrapWithExternalAddons(wrapWithFloatingLabel(\n floatingLabel ? (\n // For floating label, use raw input (label wrapper provides styling)\n <input\n ref={setInputRef}\n type={mask ? 'text' : type}\n className={`${dInput} w-full`}\n value={maskedValue ?? (value !== undefined ? value : internalValue)}\n defaultValue={value === undefined && !mask ? defaultValue : undefined}\n onChange={mask ? handleMaskedChange : handleChange}\n onKeyDown={mask ? handleMaskedKeyDown : onKeyDown}\n disabled={disabled}\n required={required}\n data-testid={inputTestId}\n {...ariaProps}\n {...props}\n />\n ) : inputElement\n ))\n }\n)\n\nInput.displayName = 'Input'\n"],"names":["dInput","dInputXs","dInputSm","dInputMd","dInputLg","dInputXl","dInputNeutral","dInputPrimary","dInputSecondary","dInputAccent","dInputInfo","dInputSuccess","dInputWarning","dInputError","dInputGhost","dFloatingLabel","applyMask","raw","mask","placeholder","result","rawIndex","i","maskChar","extractRaw","value","isValidChar","char","findNextInputPosition","fromIndex","ClearIcon","onClick","className","jsx","Input","forwardRef","type","size","color","status","ghost","bordered","maskPlaceholder","allowClear","onClear","prefix","suffix","addonBefore","addonAfter","floatingLabel","errorId","unstyled","defaultValue","onChange","onKeyDown","disabled","required","testId","props","ref","componentSize","useConfig","effectiveSize","sizeClasses","effectiveColorClass","hasExternalAddons","inputClasses","inputRef","useRef","setInputRef","useCallback","node","getInitialRaw","rawValue","setRawValue","useState","cursorPos","setCursorPos","useEffect","handleMaskedChange","e","input","inputValue","newRaw","filteredRaw","rawIdx","maskedValue","newCursor","charsPlaced","syntheticEvent","handleMaskedKeyDown","internalValue","setInternalValue","handleChange","handleClear","showClear","clearIcon","ariaProps","hasInternalAddons","hasWrapper","getTestId","inputTestId","floatingSizeClasses","buildInput","extraClasses","buildInputWithInternalAddons","jsxs","wrapWithFloatingLabel","floatingClasses","wrapWithExternalAddons","addonClasses","inputElement"],"mappings":"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"}
@@ -6,7 +6,7 @@ import w from "@tiptap/extension-underline";
6
6
  import j from "@tiptap/extension-link";
7
7
  import C from "@tiptap/extension-placeholder";
8
8
  import { useConfig as S } from "../providers/ConfigProvider.js";
9
- const $ = "btn", T = "btn-ghost", U = "btn-xs", q = "link", z = "link-primary", r = (e) => ({
9
+ const $ = "btn", T = "btn-ghost", U = "btn-xs", Z = "link", q = "link-primary", r = (e) => ({
10
10
  xmlns: "http://www.w3.org/2000/svg",
11
11
  fill: "none",
12
12
  viewBox: "0 0 24 24",
@@ -15,7 +15,7 @@ const $ = "btn", T = "btn-ghost", U = "btn-xs", q = "link", z = "link-primary",
15
15
  width: e,
16
16
  height: e,
17
17
  "aria-hidden": !0
18
- }), N = ({ size: e }) => /* @__PURE__ */ o("svg", { ...r(e), children: /* @__PURE__ */ o("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M6.75 3.75h6.75a3.75 3.75 0 0 1 0 7.5H6.75V3.75ZM6.75 11.25h7.5a3.75 3.75 0 0 1 0 7.5h-7.5v-7.5Z" }) }), R = ({ size: e }) => /* @__PURE__ */ o("svg", { ...r(e), children: /* @__PURE__ */ o("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M5.248 20.248h4.5m4.5 0h4.5m-7.5-16.5h4.5m4.5 0h4.5M9.748 3.748l-4.5 16.5" }) }), Z = ({ size: e }) => /* @__PURE__ */ o("svg", { ...r(e), children: /* @__PURE__ */ o("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17.995 3.744v7.5a6 6 0 1 1-12 0v-7.5m-2.25 16.502h16.5" }) }), V = ({ size: e }) => /* @__PURE__ */ o("svg", { ...r(e), children: /* @__PURE__ */ o("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 12a4.5 4.5 0 0 0 0 9c2.485 0 4.5-2.015 4.5-4.5M12 12V3m0 9H3m9 0h9m-4.5-4.5a4.5 4.5 0 0 0-9 0" }) }), D = ({ size: e }) => /* @__PURE__ */ o("svg", { ...r(e), children: /* @__PURE__ */ o("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17.25 6.75 22.5 12l-5.25 5.25m-10.5 0L1.5 12l5.25-5.25m7.5-3-4.5 16.5" }) }), G = ({ size: e }) => /* @__PURE__ */ o("svg", { ...r(e), children: /* @__PURE__ */ o("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M2.243 4.493v7.5m0 0v7.502m0-7.501h10.5m0-7.5v7.5m0 0v7.501m4.501-8.627 2.25-1.5v10.126m0 0h-2.25m2.25 0h2.25" }) }), K = ({ size: e }) => /* @__PURE__ */ o("svg", { ...r(e), children: /* @__PURE__ */ o("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M21.75 19.5H16.5v-1.609a2.25 2.25 0 0 1 1.244-2.012l2.89-1.445c.651-.326 1.116-.955 1.116-1.684 0-.498-.04-.987-.118-1.463-.135-.825-.835-1.422-1.668-1.489a15.202 15.202 0 0 0-3.464.12M2.243 4.492v7.5m0 0v7.502m0-7.501h10.5m0-7.5v7.5m0 0v7.501" }) }), W = ({ size: e }) => /* @__PURE__ */ o("svg", { ...r(e), children: /* @__PURE__ */ o("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M20.905 14.626a4.52 4.52 0 0 1 .738 3.603c-.154.695-.794 1.143-1.504 1.208a15.194 15.194 0 0 1-3.639-.104m4.405-4.707a4.52 4.52 0 0 0 .738-3.603c-.154-.696-.794-1.144-1.504-1.209a15.19 15.19 0 0 0-3.639.104m4.405 4.708H18M2.243 4.493v7.5m0 0v7.502m0-7.501h10.5m0-7.5v7.5m0 0v7.501" }) }), X = ({ size: e }) => /* @__PURE__ */ o("svg", { ...r(e), children: /* @__PURE__ */ o("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8.25 6.75h12M8.25 12h12m-12 5.25h12M3.75 6.75h.007v.008H3.75V6.75Zm.375 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0ZM3.75 12h.007v.008H3.75V12Zm.375 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm-.375 5.25h.007v.008H3.75v-.008Zm.375 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Z" }) }), F = ({ size: e }) => /* @__PURE__ */ o("svg", { ...r(e), children: /* @__PURE__ */ o("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8.242 5.992h12m-12 6.003h12m-12 5.999h12M4.117 7.495v-3.75H2.99m1.125 3.75H2.99m1.125 0H5.24m-1.92 2.577a1.125 1.125 0 1 1 1.591 1.59l-1.83 1.83h2.16M2.99 15.745h1.125a1.125 1.125 0 0 1 0 2.25H3.74m0-.002h.375a1.125 1.125 0 0 1 0 2.25H2.99" }) }), J = ({ size: e }) => /* @__PURE__ */ o("svg", { ...r(e), children: /* @__PURE__ */ o("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25H12" }) }), O = ({ size: e }) => /* @__PURE__ */ o("svg", { ...r(e), children: /* @__PURE__ */ o("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "m6.75 7.5 3 2.25-3 2.25m4.5 0h3m-9 8.25h13.5A2.25 2.25 0 0 0 21 18V6a2.25 2.25 0 0 0-2.25-2.25H5.25A2.25 2.25 0 0 0 3 6v12a2.25 2.25 0 0 0 2.25 2.25Z" }) }), Q = ({ size: e }) => /* @__PURE__ */ o("svg", { ...r(e), children: /* @__PURE__ */ o("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M5 12h14" }) }), Y = ({ size: e }) => /* @__PURE__ */ o("svg", { ...r(e), children: /* @__PURE__ */ o("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M13.19 8.688a4.5 4.5 0 0 1 1.242 7.244l-4.5 4.5a4.5 4.5 0 0 1-6.364-6.364l1.757-1.757m13.35-.622 1.757-1.757a4.5 4.5 0 0 0-6.364-6.364l-4.5 4.5a4.5 4.5 0 0 0 1.242 7.244" }) }), ee = ({ size: e }) => /* @__PURE__ */ o("svg", { ...r(e), children: /* @__PURE__ */ o("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M9 15 3 9m0 0 6-6M3 9h12a6 6 0 0 1 0 12h-3" }) }), oe = ({ size: e }) => /* @__PURE__ */ o("svg", { ...r(e), children: /* @__PURE__ */ o("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "m15 15 6-6m0 0-6-6m6 6H9a6 6 0 0 0 0 12h3" }) }), re = [
18
+ }), z = ({ size: e }) => /* @__PURE__ */ o("svg", { ...r(e), children: /* @__PURE__ */ o("path", { strokeLinejoin: "round", d: "M6.75 3.744h-.753v8.25h7.125a4.125 4.125 0 0 0 0-8.25H6.75Zm0 0v.38m0 16.122h6.747a4.5 4.5 0 0 0 0-9.001h-7.5v9h.753Zm0 0v-.37m0-15.751h6a3.75 3.75 0 1 1 0 7.5h-6m0-7.5v7.5m0 0v8.25m0-8.25h6.375a4.125 4.125 0 0 1 0 8.25H6.75m.747-15.38h4.875a3.375 3.375 0 0 1 0 6.75H7.497v-6.75Zm0 7.5h5.25a3.75 3.75 0 0 1 0 7.5h-5.25v-7.5Z" }) }), N = ({ size: e }) => /* @__PURE__ */ o("svg", { ...r(e), children: /* @__PURE__ */ o("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M5.248 20.246H9.05m0 0h3.696m-3.696 0 5.893-16.502m0 0h-3.697m3.697 0h3.803" }) }), R = ({ size: e }) => /* @__PURE__ */ o("svg", { ...r(e), children: /* @__PURE__ */ o("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17.995 3.744v7.5a6 6 0 1 1-12 0v-7.5m-2.25 16.502h16.5" }) }), V = ({ size: e }) => /* @__PURE__ */ o("svg", { ...r(e), children: /* @__PURE__ */ o("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 12a8.912 8.912 0 0 1-.318-.079c-1.585-.424-2.904-1.247-3.76-2.236-.873-1.009-1.265-2.19-.968-3.301.59-2.2 3.663-3.29 6.863-2.432A8.186 8.186 0 0 1 16.5 5.21M6.42 17.81c.857.99 2.176 1.812 3.761 2.237 3.2.858 6.274-.23 6.863-2.431.233-.868.044-1.779-.465-2.617M3.75 12h16.5" }) }), D = ({ size: e }) => /* @__PURE__ */ o("svg", { ...r(e), children: /* @__PURE__ */ o("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17.25 6.75 22.5 12l-5.25 5.25m-10.5 0L1.5 12l5.25-5.25m7.5-3-4.5 16.5" }) }), G = ({ size: e }) => /* @__PURE__ */ o("svg", { ...r(e), children: /* @__PURE__ */ o("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M2.243 4.493v7.5m0 0v7.502m0-7.501h10.5m0-7.5v7.5m0 0v7.501m4.501-8.627 2.25-1.5v10.126m0 0h-2.25m2.25 0h2.25" }) }), K = ({ size: e }) => /* @__PURE__ */ o("svg", { ...r(e), children: /* @__PURE__ */ o("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M21.75 19.5H16.5v-1.609a2.25 2.25 0 0 1 1.244-2.012l2.89-1.445c.651-.326 1.116-.955 1.116-1.683 0-.498-.04-.987-.118-1.463-.135-.825-.835-1.422-1.668-1.489a15.202 15.202 0 0 0-3.464.12M2.243 4.492v7.5m0 0v7.502m0-7.501h10.5m0-7.5v7.5m0 0v7.501" }) }), W = ({ size: e }) => /* @__PURE__ */ o("svg", { ...r(e), children: /* @__PURE__ */ o("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M20.905 14.626a4.52 4.52 0 0 1 .738 3.603c-.154.695-.794 1.143-1.504 1.208a15.194 15.194 0 0 1-3.639-.104m4.405-4.707a4.52 4.52 0 0 0 .738-3.603c-.154-.696-.794-1.144-1.504-1.209a15.19 15.19 0 0 0-3.639.104m4.405 4.708H18M2.243 4.493v7.5m0 0v7.502m0-7.501h10.5m0-7.5v7.5m0 0v7.501" }) }), X = ({ size: e }) => /* @__PURE__ */ o("svg", { ...r(e), children: /* @__PURE__ */ o("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8.25 6.75h12M8.25 12h12m-12 5.25h12M3.75 6.75h.007v.008H3.75V6.75Zm.375 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0ZM3.75 12h.007v.008H3.75V12Zm.375 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm-.375 5.25h.007v.008H3.75v-.008Zm.375 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Z" }) }), F = ({ size: e }) => /* @__PURE__ */ o("svg", { ...r(e), children: /* @__PURE__ */ o("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8.242 5.992h12m-12 6.003H20.24m-12 5.999h12M4.117 7.495v-3.75H2.99m1.125 3.75H2.99m1.125 0H5.24m-1.92 2.577a1.125 1.125 0 1 1 1.591 1.59l-1.83 1.83h2.16M2.99 15.745h1.125a1.125 1.125 0 0 1 0 2.25H3.74m0-.002h.375a1.125 1.125 0 0 1 0 2.25H2.99" }) }), J = ({ size: e }) => /* @__PURE__ */ o("svg", { ...r(e), children: /* @__PURE__ */ o("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25H12" }) }), O = ({ size: e }) => /* @__PURE__ */ o("svg", { ...r(e), children: /* @__PURE__ */ o("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M14.25 9.75 16.5 12l-2.25 2.25m-4.5 0L7.5 12l2.25-2.25M6 20.25h12A2.25 2.25 0 0 0 20.25 18V6A2.25 2.25 0 0 0 18 3.75H6A2.25 2.25 0 0 0 3.75 6v12A2.25 2.25 0 0 0 6 20.25Z" }) }), Q = ({ size: e }) => /* @__PURE__ */ o("svg", { ...r(e), children: /* @__PURE__ */ o("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M5 12h14" }) }), Y = ({ size: e }) => /* @__PURE__ */ o("svg", { ...r(e), children: /* @__PURE__ */ o("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M13.19 8.688a4.5 4.5 0 0 1 1.242 7.244l-4.5 4.5a4.5 4.5 0 0 1-6.364-6.364l1.757-1.757m13.35-.622 1.757-1.757a4.5 4.5 0 0 0-6.364-6.364l-4.5 4.5a4.5 4.5 0 0 0 1.242 7.244" }) }), ee = ({ size: e }) => /* @__PURE__ */ o("svg", { ...r(e), children: /* @__PURE__ */ o("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M9 15 3 9m0 0 6-6M3 9h12a6 6 0 0 1 0 12h-3" }) }), oe = ({ size: e }) => /* @__PURE__ */ o("svg", { ...r(e), children: /* @__PURE__ */ o("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "m15 15 6-6m0 0-6-6m6 6H9a6 6 0 0 0 0 12h3" }) }), re = [
19
19
  "bold",
20
20
  "italic",
21
21
  "underline",
@@ -84,21 +84,21 @@ const $ = "btn", T = "btn-ghost", U = "btn-xs", q = "link", z = "link-primary",
84
84
  return /* @__PURE__ */ o(ie, {}, `divider-${n}`);
85
85
  const s = {
86
86
  bold: {
87
- icon: N,
87
+ icon: z,
88
88
  action: () => e.chain().focus().toggleBold().run(),
89
89
  isActive: () => e.isActive("bold"),
90
90
  canExecute: () => e.can().chain().focus().toggleBold().run(),
91
91
  title: "Bold"
92
92
  },
93
93
  italic: {
94
- icon: R,
94
+ icon: N,
95
95
  action: () => e.chain().focus().toggleItalic().run(),
96
96
  isActive: () => e.isActive("italic"),
97
97
  canExecute: () => e.can().chain().focus().toggleItalic().run(),
98
98
  title: "Italic"
99
99
  },
100
100
  underline: {
101
- icon: Z,
101
+ icon: R,
102
102
  action: () => e.chain().focus().toggleUnderline().run(),
103
103
  isActive: () => e.isActive("underline"),
104
104
  canExecute: () => e.can().chain().focus().toggleUnderline().run(),
@@ -223,11 +223,11 @@ const $ = "btn", T = "btn-ghost", U = "btn-xs", q = "link", z = "link-primary",
223
223
  size: m,
224
224
  bordered: a = !0,
225
225
  onEditorReady: g,
226
- className: v = "",
226
+ className: f = "",
227
227
  "data-testid": M = "rich-text-editor",
228
- ...k
229
- }, b) => {
230
- const { componentSize: L } = S(), _ = m ?? L ?? "md", t = I({
228
+ ...b
229
+ }, k) => {
230
+ const { componentSize: L } = S(), v = m ?? L ?? "md", t = I({
231
231
  extensions: [
232
232
  B.configure({
233
233
  heading: {
@@ -238,7 +238,7 @@ const $ = "btn", T = "btn-ghost", U = "btn-xs", q = "link", z = "link-primary",
238
238
  j.configure({
239
239
  openOnClick: !1,
240
240
  HTMLAttributes: {
241
- class: `${q} ${z}`
241
+ class: `${Z} ${q}`
242
242
  }
243
243
  }),
244
244
  C.configure({
@@ -254,7 +254,7 @@ const $ = "btn", T = "btn-ghost", U = "btn-xs", q = "link", z = "link-primary",
254
254
  },
255
255
  editorProps: {
256
256
  attributes: {
257
- class: `prose prose-sm max-w-none focus:outline-none ${te[_]}`
257
+ class: `prose prose-sm max-w-none focus:outline-none ${te[v]}`
258
258
  }
259
259
  }
260
260
  });
@@ -265,30 +265,30 @@ const $ = "btn", T = "btn-ghost", U = "btn-xs", q = "link", z = "link-primary",
265
265
  }, [e, t]), p(() => {
266
266
  t && t.setEditable(!h);
267
267
  }, [h, t]);
268
- const x = typeof n == "number" ? `${n}px` : n, f = s ? typeof s == "number" ? `${s}px` : s : void 0;
268
+ const x = typeof n == "number" ? `${n}px` : n, _ = s ? typeof s == "number" ? `${s}px` : s : void 0;
269
269
  return /* @__PURE__ */ A(
270
270
  "div",
271
271
  {
272
- ref: b,
272
+ ref: k,
273
273
  className: `
274
274
  bg-base-100 rounded-lg overflow-hidden
275
275
  ${a ? "border border-base-300" : ""}
276
- ${v}
276
+ ${f}
277
277
  `,
278
278
  "data-testid": M,
279
- ...k,
279
+ ...b,
280
280
  children: [
281
- !d && /* @__PURE__ */ o(se, { editor: t, toolbar: u, editorSize: _ }),
281
+ !d && /* @__PURE__ */ o(se, { editor: t, toolbar: u, editorSize: v }),
282
282
  /* @__PURE__ */ o(
283
283
  "div",
284
284
  {
285
285
  className: `
286
286
  p-4 overflow-y-auto
287
- ${f ? "overflow-y-auto" : ""}
287
+ ${_ ? "overflow-y-auto" : ""}
288
288
  `,
289
289
  style: {
290
290
  minHeight: x,
291
- maxHeight: f
291
+ maxHeight: _
292
292
  },
293
293
  children: /* @__PURE__ */ o(
294
294
  E,
@@ -1 +1 @@
1
- {"version":3,"file":"RichTextEditor.js","sources":["../../src/components/RichTextEditor.tsx"],"sourcesContent":["import React, { forwardRef, useCallback, useEffect } from 'react'\nimport { useEditor, EditorContent, Editor } from '@tiptap/react'\nimport StarterKit from '@tiptap/starter-kit'\nimport Underline from '@tiptap/extension-underline'\nimport Link from '@tiptap/extension-link'\nimport Placeholder from '@tiptap/extension-placeholder'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dBtn = 'btn'\nconst dBtnGhost = 'btn-ghost'\nconst dBtnXs = 'btn-xs'\nconst dLink = 'link'\nconst dLinkPrimary = 'link-primary'\n\n// Inline toolbar icons (from Heroicons outline)\nconst iconProps = (size: number) => ({\n xmlns: 'http://www.w3.org/2000/svg',\n fill: 'none',\n viewBox: '0 0 24 24',\n strokeWidth: 1.5,\n stroke: 'currentColor',\n width: size,\n height: size,\n 'aria-hidden': true as const,\n})\n\nconst BoldIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6.75 3.75h6.75a3.75 3.75 0 0 1 0 7.5H6.75V3.75ZM6.75 11.25h7.5a3.75 3.75 0 0 1 0 7.5h-7.5v-7.5Z\" />\n </svg>\n)\n\nconst ItalicIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5.248 20.248h4.5m4.5 0h4.5m-7.5-16.5h4.5m4.5 0h4.5M9.748 3.748l-4.5 16.5\" />\n </svg>\n)\n\nconst UnderlineIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M17.995 3.744v7.5a6 6 0 1 1-12 0v-7.5m-2.25 16.502h16.5\" />\n </svg>\n)\n\nconst StrikethroughIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 12a4.5 4.5 0 0 0 0 9c2.485 0 4.5-2.015 4.5-4.5M12 12V3m0 9H3m9 0h9m-4.5-4.5a4.5 4.5 0 0 0-9 0\" />\n </svg>\n)\n\nconst CodeBracketIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M17.25 6.75 22.5 12l-5.25 5.25m-10.5 0L1.5 12l5.25-5.25m7.5-3-4.5 16.5\" />\n </svg>\n)\n\nconst H1Icon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M2.243 4.493v7.5m0 0v7.502m0-7.501h10.5m0-7.5v7.5m0 0v7.501m4.501-8.627 2.25-1.5v10.126m0 0h-2.25m2.25 0h2.25\" />\n </svg>\n)\n\nconst H2Icon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21.75 19.5H16.5v-1.609a2.25 2.25 0 0 1 1.244-2.012l2.89-1.445c.651-.326 1.116-.955 1.116-1.684 0-.498-.04-.987-.118-1.463-.135-.825-.835-1.422-1.668-1.489a15.202 15.202 0 0 0-3.464.12M2.243 4.492v7.5m0 0v7.502m0-7.501h10.5m0-7.5v7.5m0 0v7.501\" />\n </svg>\n)\n\nconst H3Icon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M20.905 14.626a4.52 4.52 0 0 1 .738 3.603c-.154.695-.794 1.143-1.504 1.208a15.194 15.194 0 0 1-3.639-.104m4.405-4.707a4.52 4.52 0 0 0 .738-3.603c-.154-.696-.794-1.144-1.504-1.209a15.19 15.19 0 0 0-3.639.104m4.405 4.708H18M2.243 4.493v7.5m0 0v7.502m0-7.501h10.5m0-7.5v7.5m0 0v7.501\" />\n </svg>\n)\n\nconst ListBulletIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8.25 6.75h12M8.25 12h12m-12 5.25h12M3.75 6.75h.007v.008H3.75V6.75Zm.375 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0ZM3.75 12h.007v.008H3.75V12Zm.375 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm-.375 5.25h.007v.008H3.75v-.008Zm.375 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Z\" />\n </svg>\n)\n\nconst NumberedListIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8.242 5.992h12m-12 6.003h12m-12 5.999h12M4.117 7.495v-3.75H2.99m1.125 3.75H2.99m1.125 0H5.24m-1.92 2.577a1.125 1.125 0 1 1 1.591 1.59l-1.83 1.83h2.16M2.99 15.745h1.125a1.125 1.125 0 0 1 0 2.25H3.74m0-.002h.375a1.125 1.125 0 0 1 0 2.25H2.99\" />\n </svg>\n)\n\nconst Bars3BottomLeftIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25H12\" />\n </svg>\n)\n\nconst CommandLineIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"m6.75 7.5 3 2.25-3 2.25m4.5 0h3m-9 8.25h13.5A2.25 2.25 0 0 0 21 18V6a2.25 2.25 0 0 0-2.25-2.25H5.25A2.25 2.25 0 0 0 3 6v12a2.25 2.25 0 0 0 2.25 2.25Z\" />\n </svg>\n)\n\nconst MinusIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 12h14\" />\n </svg>\n)\n\nconst LinkIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M13.19 8.688a4.5 4.5 0 0 1 1.242 7.244l-4.5 4.5a4.5 4.5 0 0 1-6.364-6.364l1.757-1.757m13.35-.622 1.757-1.757a4.5 4.5 0 0 0-6.364-6.364l-4.5 4.5a4.5 4.5 0 0 0 1.242 7.244\" />\n </svg>\n)\n\nconst ArrowUturnLeftIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 15 3 9m0 0 6-6M3 9h12a6 6 0 0 1 0 12h-3\" />\n </svg>\n)\n\nconst ArrowUturnRightIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"m15 15 6-6m0 0-6-6m6 6H9a6 6 0 0 0 0 12h3\" />\n </svg>\n)\n\nexport type ToolbarItem =\n | 'bold'\n | 'italic'\n | 'underline'\n | 'strikethrough'\n | 'code'\n | 'heading1'\n | 'heading2'\n | 'heading3'\n | 'bulletList'\n | 'orderedList'\n | 'blockquote'\n | 'codeBlock'\n | 'horizontalRule'\n | 'link'\n | 'undo'\n | 'redo'\n | '|'\n\nexport interface RichTextEditorProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n /** Initial HTML content */\n value?: string\n /** Callback when content changes */\n onChange?: (html: string) => void\n /** Placeholder text */\n placeholder?: string\n /** Toolbar items to display */\n toolbar?: ToolbarItem[]\n /** Hide the toolbar */\n hideToolbar?: boolean\n /** Make editor read-only */\n readOnly?: boolean\n /** Auto focus on mount */\n autoFocus?: boolean\n /** Minimum height of the editor */\n minHeight?: string | number\n /** Maximum height of the editor (enables scrolling) */\n maxHeight?: string | number\n /** Editor size variant */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n /** Show border around editor */\n bordered?: boolean\n /** Callback with editor instance */\n onEditorReady?: (editor: Editor) => void\n 'data-testid'?: string\n}\n\nconst defaultToolbar: ToolbarItem[] = [\n 'bold',\n 'italic',\n 'underline',\n 'strikethrough',\n '|',\n 'heading1',\n 'heading2',\n '|',\n 'bulletList',\n 'orderedList',\n 'blockquote',\n '|',\n 'link',\n 'code',\n 'codeBlock',\n '|',\n 'undo',\n 'redo',\n]\n\nconst sizeClasses = {\n xs: 'text-xs',\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg',\n xl: 'text-xl',\n}\n\ninterface ToolbarButtonProps {\n onClick: () => void\n isActive?: boolean\n disabled?: boolean\n title: string\n children: React.ReactNode\n}\n\nconst ToolbarButton: React.FC<ToolbarButtonProps> = ({\n onClick,\n isActive,\n disabled,\n title,\n children,\n}) => (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n title={title}\n className={`\n ${dBtn} ${dBtnGhost} ${dBtnXs} px-2 min-h-8 h-8\n ${isActive ? 'bg-base-300 text-base-content' : 'text-base-content/70'}\n ${disabled ? 'opacity-50 cursor-not-allowed' : 'hover:bg-base-200'}\n `}\n >\n {children}\n </button>\n)\n\nconst ToolbarDivider: React.FC = () => (\n <div className=\"w-px h-6 bg-base-300 mx-1\" />\n)\n\n// Map editor size to icon pixel size\nconst editorSizeToIconSize: Record<'xs' | 'sm' | 'md' | 'lg' | 'xl', number> = {\n xs: 12,\n sm: 14,\n md: 16,\n lg: 20,\n xl: 24,\n}\n\nconst EditorToolbar: React.FC<{\n editor: Editor | null\n toolbar: ToolbarItem[]\n editorSize: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n}> = ({ editor, toolbar, editorSize }) => {\n const iconSize = editorSizeToIconSize[editorSize]\n const setLink = useCallback(() => {\n if (!editor) return\n\n const previousUrl = editor.getAttributes('link').href\n const url = window.prompt('URL', previousUrl)\n\n if (url === null) return\n\n if (url === '') {\n editor.chain().focus().extendMarkRange('link').unsetLink().run()\n return\n }\n\n editor.chain().focus().extendMarkRange('link').setLink({ href: url }).run()\n }, [editor])\n\n if (!editor) return null\n\n const renderToolbarItem = (item: ToolbarItem, index: number) => {\n if (item === '|') {\n return <ToolbarDivider key={`divider-${index}`} />\n }\n\n const toolbarActions: Record<\n Exclude<ToolbarItem, '|'>,\n { icon: React.FC<{ size: number }>; action: () => void; isActive: () => boolean; canExecute: () => boolean; title: string }\n > = {\n bold: {\n icon: BoldIcon,\n action: () => editor.chain().focus().toggleBold().run(),\n isActive: () => editor.isActive('bold'),\n canExecute: () => editor.can().chain().focus().toggleBold().run(),\n title: 'Bold',\n },\n italic: {\n icon: ItalicIcon,\n action: () => editor.chain().focus().toggleItalic().run(),\n isActive: () => editor.isActive('italic'),\n canExecute: () => editor.can().chain().focus().toggleItalic().run(),\n title: 'Italic',\n },\n underline: {\n icon: UnderlineIcon,\n action: () => editor.chain().focus().toggleUnderline().run(),\n isActive: () => editor.isActive('underline'),\n canExecute: () => editor.can().chain().focus().toggleUnderline().run(),\n title: 'Underline',\n },\n strikethrough: {\n icon: StrikethroughIcon,\n action: () => editor.chain().focus().toggleStrike().run(),\n isActive: () => editor.isActive('strike'),\n canExecute: () => editor.can().chain().focus().toggleStrike().run(),\n title: 'Strikethrough',\n },\n code: {\n icon: CodeBracketIcon,\n action: () => editor.chain().focus().toggleCode().run(),\n isActive: () => editor.isActive('code'),\n canExecute: () => editor.can().chain().focus().toggleCode().run(),\n title: 'Inline Code',\n },\n heading1: {\n icon: H1Icon,\n action: () => editor.chain().focus().toggleHeading({ level: 1 }).run(),\n isActive: () => editor.isActive('heading', { level: 1 }),\n canExecute: () => true,\n title: 'Heading 1',\n },\n heading2: {\n icon: H2Icon,\n action: () => editor.chain().focus().toggleHeading({ level: 2 }).run(),\n isActive: () => editor.isActive('heading', { level: 2 }),\n canExecute: () => true,\n title: 'Heading 2',\n },\n heading3: {\n icon: H3Icon,\n action: () => editor.chain().focus().toggleHeading({ level: 3 }).run(),\n isActive: () => editor.isActive('heading', { level: 3 }),\n canExecute: () => true,\n title: 'Heading 3',\n },\n bulletList: {\n icon: ListBulletIcon,\n action: () => editor.chain().focus().toggleBulletList().run(),\n isActive: () => editor.isActive('bulletList'),\n canExecute: () => true,\n title: 'Bullet List',\n },\n orderedList: {\n icon: NumberedListIcon,\n action: () => editor.chain().focus().toggleOrderedList().run(),\n isActive: () => editor.isActive('orderedList'),\n canExecute: () => true,\n title: 'Numbered List',\n },\n blockquote: {\n icon: Bars3BottomLeftIcon,\n action: () => editor.chain().focus().toggleBlockquote().run(),\n isActive: () => editor.isActive('blockquote'),\n canExecute: () => true,\n title: 'Blockquote',\n },\n codeBlock: {\n icon: CommandLineIcon,\n action: () => editor.chain().focus().toggleCodeBlock().run(),\n isActive: () => editor.isActive('codeBlock'),\n canExecute: () => true,\n title: 'Code Block',\n },\n horizontalRule: {\n icon: MinusIcon,\n action: () => editor.chain().focus().setHorizontalRule().run(),\n isActive: () => false,\n canExecute: () => true,\n title: 'Horizontal Rule',\n },\n link: {\n icon: LinkIcon,\n action: setLink,\n isActive: () => editor.isActive('link'),\n canExecute: () => true,\n title: 'Add Link',\n },\n undo: {\n icon: ArrowUturnLeftIcon,\n action: () => editor.chain().focus().undo().run(),\n isActive: () => false,\n canExecute: () => editor.can().chain().focus().undo().run(),\n title: 'Undo',\n },\n redo: {\n icon: ArrowUturnRightIcon,\n action: () => editor.chain().focus().redo().run(),\n isActive: () => false,\n canExecute: () => editor.can().chain().focus().redo().run(),\n title: 'Redo',\n },\n }\n\n const { icon: Icon, ...config } = toolbarActions[item]\n return (\n <ToolbarButton\n key={item}\n onClick={config.action}\n isActive={config.isActive()}\n disabled={!config.canExecute()}\n title={config.title}\n >\n <Icon size={iconSize} />\n </ToolbarButton>\n )\n }\n\n return (\n <div className=\"flex flex-wrap items-center gap-0.5 p-2 border-b border-base-300 bg-base-200/50\">\n {toolbar.map((item, index) => renderToolbarItem(item, index))}\n </div>\n )\n}\n\nexport const RichTextEditor = forwardRef<HTMLDivElement, RichTextEditorProps>(\n (\n {\n value = '',\n onChange,\n placeholder = 'Start typing...',\n toolbar = defaultToolbar,\n hideToolbar = false,\n readOnly = false,\n autoFocus = false,\n minHeight = 200,\n maxHeight,\n size,\n bordered = true,\n onEditorReady,\n className = '',\n 'data-testid': testId = 'rich-text-editor',\n ...rest\n },\n ref\n ) => {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n\n const editor = useEditor({\n extensions: [\n StarterKit.configure({\n heading: {\n levels: [1, 2, 3],\n },\n }),\n Underline,\n Link.configure({\n openOnClick: false,\n HTMLAttributes: {\n class: `${dLink} ${dLinkPrimary}`,\n },\n }),\n Placeholder.configure({\n placeholder,\n emptyEditorClass: 'is-editor-empty',\n }),\n ],\n content: value,\n editable: !readOnly,\n autofocus: autoFocus,\n onUpdate: ({ editor }) => {\n onChange?.(editor.getHTML())\n },\n editorProps: {\n attributes: {\n class: `prose prose-sm max-w-none focus:outline-none ${sizeClasses[effectiveSize]}`,\n },\n },\n })\n\n useEffect(() => {\n if (editor && onEditorReady) {\n onEditorReady(editor)\n }\n }, [editor, onEditorReady])\n\n // Sync value prop changes\n useEffect(() => {\n if (editor && value !== editor.getHTML()) {\n editor.commands.setContent(value, false)\n }\n }, [value, editor])\n\n // Sync editable state\n useEffect(() => {\n if (editor) {\n editor.setEditable(!readOnly)\n }\n }, [readOnly, editor])\n\n const minHeightStyle = typeof minHeight === 'number' ? `${minHeight}px` : minHeight\n const maxHeightStyle = maxHeight\n ? typeof maxHeight === 'number'\n ? `${maxHeight}px`\n : maxHeight\n : undefined\n\n return (\n <div\n ref={ref}\n className={`\n bg-base-100 rounded-lg overflow-hidden\n ${bordered ? 'border border-base-300' : ''}\n ${className}\n `}\n data-testid={testId}\n {...rest}\n >\n {!hideToolbar && <EditorToolbar editor={editor} toolbar={toolbar} editorSize={effectiveSize} />}\n <div\n className={`\n p-4 overflow-y-auto\n ${maxHeightStyle ? 'overflow-y-auto' : ''}\n `}\n style={{\n minHeight: minHeightStyle,\n maxHeight: maxHeightStyle,\n }}\n >\n <EditorContent\n editor={editor}\n className={`\n [&_.ProseMirror]:min-h-full [&_.ProseMirror]:outline-none\n [&_.ProseMirror_p.is-editor-empty:first-child::before]:content-[attr(data-placeholder)]\n [&_.ProseMirror_p.is-editor-empty:first-child::before]:text-base-content/40\n [&_.ProseMirror_p.is-editor-empty:first-child::before]:float-left\n [&_.ProseMirror_p.is-editor-empty:first-child::before]:h-0\n [&_.ProseMirror_p.is-editor-empty:first-child::before]:pointer-events-none\n [&_.ProseMirror_h1]:text-2xl [&_.ProseMirror_h1]:font-bold [&_.ProseMirror_h1]:mt-4 [&_.ProseMirror_h1]:mb-2\n [&_.ProseMirror_h2]:text-xl [&_.ProseMirror_h2]:font-bold [&_.ProseMirror_h2]:mt-3 [&_.ProseMirror_h2]:mb-2\n [&_.ProseMirror_h3]:text-lg [&_.ProseMirror_h3]:font-bold [&_.ProseMirror_h3]:mt-2 [&_.ProseMirror_h3]:mb-1\n [&_.ProseMirror_p]:my-2\n [&_.ProseMirror_ul]:list-disc [&_.ProseMirror_ul]:pl-6 [&_.ProseMirror_ul]:my-2\n [&_.ProseMirror_ol]:list-decimal [&_.ProseMirror_ol]:pl-6 [&_.ProseMirror_ol]:my-2\n [&_.ProseMirror_li]:my-1\n [&_.ProseMirror_blockquote]:border-l-4 [&_.ProseMirror_blockquote]:border-base-300\n [&_.ProseMirror_blockquote]:pl-4 [&_.ProseMirror_blockquote]:italic [&_.ProseMirror_blockquote]:my-2\n [&_.ProseMirror_code]:bg-base-200 [&_.ProseMirror_code]:px-1 [&_.ProseMirror_code]:py-0.5\n [&_.ProseMirror_code]:rounded [&_.ProseMirror_code]:font-mono [&_.ProseMirror_code]:text-sm\n [&_.ProseMirror_pre]:bg-base-200 [&_.ProseMirror_pre]:p-4 [&_.ProseMirror_pre]:rounded-lg\n [&_.ProseMirror_pre]:my-2 [&_.ProseMirror_pre]:overflow-x-auto\n [&_.ProseMirror_pre_code]:bg-transparent [&_.ProseMirror_pre_code]:p-0\n [&_.ProseMirror_hr]:border-base-300 [&_.ProseMirror_hr]:my-4\n [&_.ProseMirror_a]:text-primary [&_.ProseMirror_a]:underline\n `}\n />\n </div>\n </div>\n )\n }\n)\n\nRichTextEditor.displayName = 'RichTextEditor'\n\nexport default RichTextEditor\n"],"names":["dBtn","dBtnGhost","dBtnXs","dLink","dLinkPrimary","iconProps","size","BoldIcon","jsx","ItalicIcon","UnderlineIcon","StrikethroughIcon","CodeBracketIcon","H1Icon","H2Icon","H3Icon","ListBulletIcon","NumberedListIcon","Bars3BottomLeftIcon","CommandLineIcon","MinusIcon","LinkIcon","ArrowUturnLeftIcon","ArrowUturnRightIcon","defaultToolbar","sizeClasses","ToolbarButton","onClick","isActive","disabled","title","children","ToolbarDivider","editorSizeToIconSize","EditorToolbar","editor","toolbar","editorSize","iconSize","setLink","useCallback","previousUrl","url","renderToolbarItem","item","index","toolbarActions","Icon","config","RichTextEditor","forwardRef","value","onChange","placeholder","hideToolbar","readOnly","autoFocus","minHeight","maxHeight","bordered","onEditorReady","className","testId","rest","ref","componentSize","useConfig","effectiveSize","useEditor","StarterKit","Underline","Link","Placeholder","useEffect","minHeightStyle","maxHeightStyle","jsxs","EditorContent"],"mappings":"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"}
1
+ {"version":3,"file":"RichTextEditor.js","sources":["../../src/components/RichTextEditor.tsx"],"sourcesContent":["import React, { forwardRef, useCallback, useEffect } from 'react'\nimport { useEditor, EditorContent, Editor } from '@tiptap/react'\nimport StarterKit from '@tiptap/starter-kit'\nimport Underline from '@tiptap/extension-underline'\nimport Link from '@tiptap/extension-link'\nimport Placeholder from '@tiptap/extension-placeholder'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dBtn = 'btn'\nconst dBtnGhost = 'btn-ghost'\nconst dBtnXs = 'btn-xs'\nconst dLink = 'link'\nconst dLinkPrimary = 'link-primary'\n\n// Inline toolbar icons (from Heroicons outline)\nconst iconProps = (size: number) => ({\n xmlns: 'http://www.w3.org/2000/svg',\n fill: 'none',\n viewBox: '0 0 24 24',\n strokeWidth: 1.5,\n stroke: 'currentColor',\n width: size,\n height: size,\n 'aria-hidden': true as const,\n})\n\nconst BoldIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinejoin=\"round\" d=\"M6.75 3.744h-.753v8.25h7.125a4.125 4.125 0 0 0 0-8.25H6.75Zm0 0v.38m0 16.122h6.747a4.5 4.5 0 0 0 0-9.001h-7.5v9h.753Zm0 0v-.37m0-15.751h6a3.75 3.75 0 1 1 0 7.5h-6m0-7.5v7.5m0 0v8.25m0-8.25h6.375a4.125 4.125 0 0 1 0 8.25H6.75m.747-15.38h4.875a3.375 3.375 0 0 1 0 6.75H7.497v-6.75Zm0 7.5h5.25a3.75 3.75 0 0 1 0 7.5h-5.25v-7.5Z\" />\n </svg>\n)\n\nconst ItalicIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5.248 20.246H9.05m0 0h3.696m-3.696 0 5.893-16.502m0 0h-3.697m3.697 0h3.803\" />\n </svg>\n)\n\nconst UnderlineIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M17.995 3.744v7.5a6 6 0 1 1-12 0v-7.5m-2.25 16.502h16.5\" />\n </svg>\n)\n\nconst StrikethroughIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 12a8.912 8.912 0 0 1-.318-.079c-1.585-.424-2.904-1.247-3.76-2.236-.873-1.009-1.265-2.19-.968-3.301.59-2.2 3.663-3.29 6.863-2.432A8.186 8.186 0 0 1 16.5 5.21M6.42 17.81c.857.99 2.176 1.812 3.761 2.237 3.2.858 6.274-.23 6.863-2.431.233-.868.044-1.779-.465-2.617M3.75 12h16.5\" />\n </svg>\n)\n\nconst CodeBracketIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M17.25 6.75 22.5 12l-5.25 5.25m-10.5 0L1.5 12l5.25-5.25m7.5-3-4.5 16.5\" />\n </svg>\n)\n\nconst H1Icon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M2.243 4.493v7.5m0 0v7.502m0-7.501h10.5m0-7.5v7.5m0 0v7.501m4.501-8.627 2.25-1.5v10.126m0 0h-2.25m2.25 0h2.25\" />\n </svg>\n)\n\nconst H2Icon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21.75 19.5H16.5v-1.609a2.25 2.25 0 0 1 1.244-2.012l2.89-1.445c.651-.326 1.116-.955 1.116-1.683 0-.498-.04-.987-.118-1.463-.135-.825-.835-1.422-1.668-1.489a15.202 15.202 0 0 0-3.464.12M2.243 4.492v7.5m0 0v7.502m0-7.501h10.5m0-7.5v7.5m0 0v7.501\" />\n </svg>\n)\n\nconst H3Icon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M20.905 14.626a4.52 4.52 0 0 1 .738 3.603c-.154.695-.794 1.143-1.504 1.208a15.194 15.194 0 0 1-3.639-.104m4.405-4.707a4.52 4.52 0 0 0 .738-3.603c-.154-.696-.794-1.144-1.504-1.209a15.19 15.19 0 0 0-3.639.104m4.405 4.708H18M2.243 4.493v7.5m0 0v7.502m0-7.501h10.5m0-7.5v7.5m0 0v7.501\" />\n </svg>\n)\n\nconst ListBulletIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8.25 6.75h12M8.25 12h12m-12 5.25h12M3.75 6.75h.007v.008H3.75V6.75Zm.375 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0ZM3.75 12h.007v.008H3.75V12Zm.375 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm-.375 5.25h.007v.008H3.75v-.008Zm.375 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Z\" />\n </svg>\n)\n\nconst NumberedListIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8.242 5.992h12m-12 6.003H20.24m-12 5.999h12M4.117 7.495v-3.75H2.99m1.125 3.75H2.99m1.125 0H5.24m-1.92 2.577a1.125 1.125 0 1 1 1.591 1.59l-1.83 1.83h2.16M2.99 15.745h1.125a1.125 1.125 0 0 1 0 2.25H3.74m0-.002h.375a1.125 1.125 0 0 1 0 2.25H2.99\" />\n </svg>\n)\n\nconst Bars3BottomLeftIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25H12\" />\n </svg>\n)\n\nconst CommandLineIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M14.25 9.75 16.5 12l-2.25 2.25m-4.5 0L7.5 12l2.25-2.25M6 20.25h12A2.25 2.25 0 0 0 20.25 18V6A2.25 2.25 0 0 0 18 3.75H6A2.25 2.25 0 0 0 3.75 6v12A2.25 2.25 0 0 0 6 20.25Z\" />\n </svg>\n)\n\nconst MinusIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 12h14\" />\n </svg>\n)\n\nconst LinkIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M13.19 8.688a4.5 4.5 0 0 1 1.242 7.244l-4.5 4.5a4.5 4.5 0 0 1-6.364-6.364l1.757-1.757m13.35-.622 1.757-1.757a4.5 4.5 0 0 0-6.364-6.364l-4.5 4.5a4.5 4.5 0 0 0 1.242 7.244\" />\n </svg>\n)\n\nconst ArrowUturnLeftIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 15 3 9m0 0 6-6M3 9h12a6 6 0 0 1 0 12h-3\" />\n </svg>\n)\n\nconst ArrowUturnRightIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"m15 15 6-6m0 0-6-6m6 6H9a6 6 0 0 0 0 12h3\" />\n </svg>\n)\n\nexport type ToolbarItem =\n | 'bold'\n | 'italic'\n | 'underline'\n | 'strikethrough'\n | 'code'\n | 'heading1'\n | 'heading2'\n | 'heading3'\n | 'bulletList'\n | 'orderedList'\n | 'blockquote'\n | 'codeBlock'\n | 'horizontalRule'\n | 'link'\n | 'undo'\n | 'redo'\n | '|'\n\nexport interface RichTextEditorProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n /** Initial HTML content */\n value?: string\n /** Callback when content changes */\n onChange?: (html: string) => void\n /** Placeholder text */\n placeholder?: string\n /** Toolbar items to display */\n toolbar?: ToolbarItem[]\n /** Hide the toolbar */\n hideToolbar?: boolean\n /** Make editor read-only */\n readOnly?: boolean\n /** Auto focus on mount */\n autoFocus?: boolean\n /** Minimum height of the editor */\n minHeight?: string | number\n /** Maximum height of the editor (enables scrolling) */\n maxHeight?: string | number\n /** Editor size variant */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n /** Show border around editor */\n bordered?: boolean\n /** Callback with editor instance */\n onEditorReady?: (editor: Editor) => void\n 'data-testid'?: string\n}\n\nconst defaultToolbar: ToolbarItem[] = [\n 'bold',\n 'italic',\n 'underline',\n 'strikethrough',\n '|',\n 'heading1',\n 'heading2',\n '|',\n 'bulletList',\n 'orderedList',\n 'blockquote',\n '|',\n 'link',\n 'code',\n 'codeBlock',\n '|',\n 'undo',\n 'redo',\n]\n\nconst sizeClasses = {\n xs: 'text-xs',\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg',\n xl: 'text-xl',\n}\n\ninterface ToolbarButtonProps {\n onClick: () => void\n isActive?: boolean\n disabled?: boolean\n title: string\n children: React.ReactNode\n}\n\nconst ToolbarButton: React.FC<ToolbarButtonProps> = ({\n onClick,\n isActive,\n disabled,\n title,\n children,\n}) => (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n title={title}\n className={`\n ${dBtn} ${dBtnGhost} ${dBtnXs} px-2 min-h-8 h-8\n ${isActive ? 'bg-base-300 text-base-content' : 'text-base-content/70'}\n ${disabled ? 'opacity-50 cursor-not-allowed' : 'hover:bg-base-200'}\n `}\n >\n {children}\n </button>\n)\n\nconst ToolbarDivider: React.FC = () => (\n <div className=\"w-px h-6 bg-base-300 mx-1\" />\n)\n\n// Map editor size to icon pixel size\nconst editorSizeToIconSize: Record<'xs' | 'sm' | 'md' | 'lg' | 'xl', number> = {\n xs: 12,\n sm: 14,\n md: 16,\n lg: 20,\n xl: 24,\n}\n\nconst EditorToolbar: React.FC<{\n editor: Editor | null\n toolbar: ToolbarItem[]\n editorSize: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n}> = ({ editor, toolbar, editorSize }) => {\n const iconSize = editorSizeToIconSize[editorSize]\n const setLink = useCallback(() => {\n if (!editor) return\n\n const previousUrl = editor.getAttributes('link').href\n const url = window.prompt('URL', previousUrl)\n\n if (url === null) return\n\n if (url === '') {\n editor.chain().focus().extendMarkRange('link').unsetLink().run()\n return\n }\n\n editor.chain().focus().extendMarkRange('link').setLink({ href: url }).run()\n }, [editor])\n\n if (!editor) return null\n\n const renderToolbarItem = (item: ToolbarItem, index: number) => {\n if (item === '|') {\n return <ToolbarDivider key={`divider-${index}`} />\n }\n\n const toolbarActions: Record<\n Exclude<ToolbarItem, '|'>,\n { icon: React.FC<{ size: number }>; action: () => void; isActive: () => boolean; canExecute: () => boolean; title: string }\n > = {\n bold: {\n icon: BoldIcon,\n action: () => editor.chain().focus().toggleBold().run(),\n isActive: () => editor.isActive('bold'),\n canExecute: () => editor.can().chain().focus().toggleBold().run(),\n title: 'Bold',\n },\n italic: {\n icon: ItalicIcon,\n action: () => editor.chain().focus().toggleItalic().run(),\n isActive: () => editor.isActive('italic'),\n canExecute: () => editor.can().chain().focus().toggleItalic().run(),\n title: 'Italic',\n },\n underline: {\n icon: UnderlineIcon,\n action: () => editor.chain().focus().toggleUnderline().run(),\n isActive: () => editor.isActive('underline'),\n canExecute: () => editor.can().chain().focus().toggleUnderline().run(),\n title: 'Underline',\n },\n strikethrough: {\n icon: StrikethroughIcon,\n action: () => editor.chain().focus().toggleStrike().run(),\n isActive: () => editor.isActive('strike'),\n canExecute: () => editor.can().chain().focus().toggleStrike().run(),\n title: 'Strikethrough',\n },\n code: {\n icon: CodeBracketIcon,\n action: () => editor.chain().focus().toggleCode().run(),\n isActive: () => editor.isActive('code'),\n canExecute: () => editor.can().chain().focus().toggleCode().run(),\n title: 'Inline Code',\n },\n heading1: {\n icon: H1Icon,\n action: () => editor.chain().focus().toggleHeading({ level: 1 }).run(),\n isActive: () => editor.isActive('heading', { level: 1 }),\n canExecute: () => true,\n title: 'Heading 1',\n },\n heading2: {\n icon: H2Icon,\n action: () => editor.chain().focus().toggleHeading({ level: 2 }).run(),\n isActive: () => editor.isActive('heading', { level: 2 }),\n canExecute: () => true,\n title: 'Heading 2',\n },\n heading3: {\n icon: H3Icon,\n action: () => editor.chain().focus().toggleHeading({ level: 3 }).run(),\n isActive: () => editor.isActive('heading', { level: 3 }),\n canExecute: () => true,\n title: 'Heading 3',\n },\n bulletList: {\n icon: ListBulletIcon,\n action: () => editor.chain().focus().toggleBulletList().run(),\n isActive: () => editor.isActive('bulletList'),\n canExecute: () => true,\n title: 'Bullet List',\n },\n orderedList: {\n icon: NumberedListIcon,\n action: () => editor.chain().focus().toggleOrderedList().run(),\n isActive: () => editor.isActive('orderedList'),\n canExecute: () => true,\n title: 'Numbered List',\n },\n blockquote: {\n icon: Bars3BottomLeftIcon,\n action: () => editor.chain().focus().toggleBlockquote().run(),\n isActive: () => editor.isActive('blockquote'),\n canExecute: () => true,\n title: 'Blockquote',\n },\n codeBlock: {\n icon: CommandLineIcon,\n action: () => editor.chain().focus().toggleCodeBlock().run(),\n isActive: () => editor.isActive('codeBlock'),\n canExecute: () => true,\n title: 'Code Block',\n },\n horizontalRule: {\n icon: MinusIcon,\n action: () => editor.chain().focus().setHorizontalRule().run(),\n isActive: () => false,\n canExecute: () => true,\n title: 'Horizontal Rule',\n },\n link: {\n icon: LinkIcon,\n action: setLink,\n isActive: () => editor.isActive('link'),\n canExecute: () => true,\n title: 'Add Link',\n },\n undo: {\n icon: ArrowUturnLeftIcon,\n action: () => editor.chain().focus().undo().run(),\n isActive: () => false,\n canExecute: () => editor.can().chain().focus().undo().run(),\n title: 'Undo',\n },\n redo: {\n icon: ArrowUturnRightIcon,\n action: () => editor.chain().focus().redo().run(),\n isActive: () => false,\n canExecute: () => editor.can().chain().focus().redo().run(),\n title: 'Redo',\n },\n }\n\n const { icon: Icon, ...config } = toolbarActions[item]\n return (\n <ToolbarButton\n key={item}\n onClick={config.action}\n isActive={config.isActive()}\n disabled={!config.canExecute()}\n title={config.title}\n >\n <Icon size={iconSize} />\n </ToolbarButton>\n )\n }\n\n return (\n <div className=\"flex flex-wrap items-center gap-0.5 p-2 border-b border-base-300 bg-base-200/50\">\n {toolbar.map((item, index) => renderToolbarItem(item, index))}\n </div>\n )\n}\n\nexport const RichTextEditor = forwardRef<HTMLDivElement, RichTextEditorProps>(\n (\n {\n value = '',\n onChange,\n placeholder = 'Start typing...',\n toolbar = defaultToolbar,\n hideToolbar = false,\n readOnly = false,\n autoFocus = false,\n minHeight = 200,\n maxHeight,\n size,\n bordered = true,\n onEditorReady,\n className = '',\n 'data-testid': testId = 'rich-text-editor',\n ...rest\n },\n ref\n ) => {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n\n const editor = useEditor({\n extensions: [\n StarterKit.configure({\n heading: {\n levels: [1, 2, 3],\n },\n }),\n Underline,\n Link.configure({\n openOnClick: false,\n HTMLAttributes: {\n class: `${dLink} ${dLinkPrimary}`,\n },\n }),\n Placeholder.configure({\n placeholder,\n emptyEditorClass: 'is-editor-empty',\n }),\n ],\n content: value,\n editable: !readOnly,\n autofocus: autoFocus,\n onUpdate: ({ editor }) => {\n onChange?.(editor.getHTML())\n },\n editorProps: {\n attributes: {\n class: `prose prose-sm max-w-none focus:outline-none ${sizeClasses[effectiveSize]}`,\n },\n },\n })\n\n useEffect(() => {\n if (editor && onEditorReady) {\n onEditorReady(editor)\n }\n }, [editor, onEditorReady])\n\n // Sync value prop changes\n useEffect(() => {\n if (editor && value !== editor.getHTML()) {\n editor.commands.setContent(value, false)\n }\n }, [value, editor])\n\n // Sync editable state\n useEffect(() => {\n if (editor) {\n editor.setEditable(!readOnly)\n }\n }, [readOnly, editor])\n\n const minHeightStyle = typeof minHeight === 'number' ? `${minHeight}px` : minHeight\n const maxHeightStyle = maxHeight\n ? typeof maxHeight === 'number'\n ? `${maxHeight}px`\n : maxHeight\n : undefined\n\n return (\n <div\n ref={ref}\n className={`\n bg-base-100 rounded-lg overflow-hidden\n ${bordered ? 'border border-base-300' : ''}\n ${className}\n `}\n data-testid={testId}\n {...rest}\n >\n {!hideToolbar && <EditorToolbar editor={editor} toolbar={toolbar} editorSize={effectiveSize} />}\n <div\n className={`\n p-4 overflow-y-auto\n ${maxHeightStyle ? 'overflow-y-auto' : ''}\n `}\n style={{\n minHeight: minHeightStyle,\n maxHeight: maxHeightStyle,\n }}\n >\n <EditorContent\n editor={editor}\n className={`\n [&_.ProseMirror]:min-h-full [&_.ProseMirror]:outline-none\n [&_.ProseMirror_p.is-editor-empty:first-child::before]:content-[attr(data-placeholder)]\n [&_.ProseMirror_p.is-editor-empty:first-child::before]:text-base-content/40\n [&_.ProseMirror_p.is-editor-empty:first-child::before]:float-left\n [&_.ProseMirror_p.is-editor-empty:first-child::before]:h-0\n [&_.ProseMirror_p.is-editor-empty:first-child::before]:pointer-events-none\n [&_.ProseMirror_h1]:text-2xl [&_.ProseMirror_h1]:font-bold [&_.ProseMirror_h1]:mt-4 [&_.ProseMirror_h1]:mb-2\n [&_.ProseMirror_h2]:text-xl [&_.ProseMirror_h2]:font-bold [&_.ProseMirror_h2]:mt-3 [&_.ProseMirror_h2]:mb-2\n [&_.ProseMirror_h3]:text-lg [&_.ProseMirror_h3]:font-bold [&_.ProseMirror_h3]:mt-2 [&_.ProseMirror_h3]:mb-1\n [&_.ProseMirror_p]:my-2\n [&_.ProseMirror_ul]:list-disc [&_.ProseMirror_ul]:pl-6 [&_.ProseMirror_ul]:my-2\n [&_.ProseMirror_ol]:list-decimal [&_.ProseMirror_ol]:pl-6 [&_.ProseMirror_ol]:my-2\n [&_.ProseMirror_li]:my-1\n [&_.ProseMirror_blockquote]:border-l-4 [&_.ProseMirror_blockquote]:border-base-300\n [&_.ProseMirror_blockquote]:pl-4 [&_.ProseMirror_blockquote]:italic [&_.ProseMirror_blockquote]:my-2\n [&_.ProseMirror_code]:bg-base-200 [&_.ProseMirror_code]:px-1 [&_.ProseMirror_code]:py-0.5\n [&_.ProseMirror_code]:rounded [&_.ProseMirror_code]:font-mono [&_.ProseMirror_code]:text-sm\n [&_.ProseMirror_pre]:bg-base-200 [&_.ProseMirror_pre]:p-4 [&_.ProseMirror_pre]:rounded-lg\n [&_.ProseMirror_pre]:my-2 [&_.ProseMirror_pre]:overflow-x-auto\n [&_.ProseMirror_pre_code]:bg-transparent [&_.ProseMirror_pre_code]:p-0\n [&_.ProseMirror_hr]:border-base-300 [&_.ProseMirror_hr]:my-4\n [&_.ProseMirror_a]:text-primary [&_.ProseMirror_a]:underline\n `}\n />\n </div>\n </div>\n )\n }\n)\n\nRichTextEditor.displayName = 'RichTextEditor'\n\nexport default RichTextEditor\n"],"names":["dBtn","dBtnGhost","dBtnXs","dLink","dLinkPrimary","iconProps","size","BoldIcon","jsx","ItalicIcon","UnderlineIcon","StrikethroughIcon","CodeBracketIcon","H1Icon","H2Icon","H3Icon","ListBulletIcon","NumberedListIcon","Bars3BottomLeftIcon","CommandLineIcon","MinusIcon","LinkIcon","ArrowUturnLeftIcon","ArrowUturnRightIcon","defaultToolbar","sizeClasses","ToolbarButton","onClick","isActive","disabled","title","children","ToolbarDivider","editorSizeToIconSize","EditorToolbar","editor","toolbar","editorSize","iconSize","setLink","useCallback","previousUrl","url","renderToolbarItem","item","index","toolbarActions","Icon","config","RichTextEditor","forwardRef","value","onChange","placeholder","hideToolbar","readOnly","autoFocus","minHeight","maxHeight","bordered","onEditorReady","className","testId","rest","ref","componentSize","useConfig","effectiveSize","useEditor","StarterKit","Underline","Link","Placeholder","useEffect","minHeightStyle","maxHeightStyle","jsxs","EditorContent"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -76,7 +76,7 @@ export { FloatButton } from './components/FloatButton';
76
76
  export type { FloatButtonProps, BackTopProps } from './components/FloatButton';
77
77
  export { Footer } from './components/Footer';
78
78
  export type { FooterProps, FooterTitleProps } from './components/Footer';
79
- export { Form, useFormInstance } from './components/Form';
79
+ export { Form, useForm, useFormInstance, useWatch } from './components/Form';
80
80
  export type { FormProps, FormItemProps, FormRule, FormInstance, FormErrorListProps, ValidateTrigger } from './components/Form';
81
81
  export { Grid, Row, Col } from './components/Grid';
82
82
  export type { RowProps, ColProps } from './components/Grid';