asterui 0.12.62 → 0.12.64
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Anchor.d.ts +2 -0
- package/dist/components/Anchor.js +79 -75
- package/dist/components/Anchor.js.map +1 -1
- package/dist/components/Autocomplete.d.ts +1 -0
- package/dist/components/Autocomplete.js +115 -110
- package/dist/components/Autocomplete.js.map +1 -1
- package/dist/components/Breadcrumb.d.ts +4 -2
- package/dist/components/Breadcrumb.js +54 -29
- package/dist/components/Breadcrumb.js.map +1 -1
- package/dist/components/Button.d.ts +5 -1
- package/dist/components/Button.js +117 -107
- package/dist/components/Button.js.map +1 -1
- package/dist/components/Chart.d.ts +1 -0
- package/dist/components/Chart.js +31 -30
- package/dist/components/Chart.js.map +1 -1
- package/dist/components/Chat.d.ts +1 -0
- package/dist/components/Chat.js +32 -30
- package/dist/components/Chat.js.map +1 -1
- package/dist/components/Collapse.js +58 -56
- package/dist/components/Collapse.js.map +1 -1
- package/dist/components/Command.d.ts +5 -2
- package/dist/components/Command.js +262 -233
- package/dist/components/Command.js.map +1 -1
- package/dist/components/ContextMenu.d.ts +4 -0
- package/dist/components/ContextMenu.js +149 -130
- package/dist/components/ContextMenu.js.map +1 -1
- package/dist/components/DatePicker.d.ts +19 -1
- package/dist/components/DatePicker.js +266 -87
- package/dist/components/DatePicker.js.map +1 -1
- package/dist/components/Dock.d.ts +2 -0
- package/dist/components/Dock.js +70 -46
- package/dist/components/Dock.js.map +1 -1
- package/dist/components/FileInput.d.ts +1 -0
- package/dist/components/FileInput.js +26 -26
- package/dist/components/FileInput.js.map +1 -1
- package/dist/components/Filter.d.ts +1 -0
- package/dist/components/Filter.js +43 -40
- package/dist/components/Filter.js.map +1 -1
- package/dist/components/Flex.d.ts +1 -0
- package/dist/components/Flex.js +43 -42
- package/dist/components/Flex.js.map +1 -1
- package/dist/components/FloatButton.d.ts +3 -0
- package/dist/components/FloatButton.js +178 -127
- package/dist/components/FloatButton.js.map +1 -1
- package/dist/components/Input.d.ts +1 -0
- package/dist/components/Input.js +201 -184
- package/dist/components/Input.js.map +1 -1
- package/dist/components/Loading.d.ts +1 -0
- package/dist/components/Loading.js +40 -37
- package/dist/components/Loading.js.map +1 -1
- package/dist/components/Masonry.d.ts +1 -0
- package/dist/components/Masonry.js +45 -42
- package/dist/components/Masonry.js.map +1 -1
- package/dist/components/Mention.d.ts +1 -0
- package/dist/components/Mention.js +95 -91
- package/dist/components/Mention.js.map +1 -1
- package/dist/components/Menu.d.ts +1 -1
- package/dist/components/Menu.js +99 -93
- package/dist/components/Menu.js.map +1 -1
- package/dist/components/Modal.js +26 -17
- package/dist/components/Modal.js.map +1 -1
- package/dist/components/MonthCalendar.d.ts +1 -0
- package/dist/components/MonthCalendar.js +104 -97
- package/dist/components/MonthCalendar.js.map +1 -1
- package/dist/components/Notification.js +53 -45
- package/dist/components/Notification.js.map +1 -1
- package/dist/components/QRCode.d.ts +1 -0
- package/dist/components/QRCode.js +84 -55
- package/dist/components/QRCode.js.map +1 -1
- package/dist/components/RadialProgress.d.ts +1 -0
- package/dist/components/RadialProgress.js +19 -17
- package/dist/components/RadialProgress.js.map +1 -1
- package/dist/components/Range.d.ts +1 -0
- package/dist/components/Range.js +45 -43
- package/dist/components/Range.js.map +1 -1
- package/dist/components/Rating.d.ts +4 -2
- package/dist/components/Rating.js +83 -79
- package/dist/components/Rating.js.map +1 -1
- package/dist/components/Responsive.d.ts +4 -2
- package/dist/components/Responsive.js +10 -9
- package/dist/components/Responsive.js.map +1 -1
- package/dist/components/Result.d.ts +1 -0
- package/dist/components/Result.js +24 -22
- package/dist/components/Result.js.map +1 -1
- package/dist/components/Select.d.ts +1 -0
- package/dist/components/Select.js +72 -62
- package/dist/components/Select.js.map +1 -1
- package/dist/components/Splitter.d.ts +2 -0
- package/dist/components/Splitter.js +137 -131
- package/dist/components/Splitter.js.map +1 -1
- package/dist/components/Stat.d.ts +4 -2
- package/dist/components/Stat.js +19 -18
- package/dist/components/Stat.js.map +1 -1
- package/dist/components/Steps.d.ts +4 -2
- package/dist/components/Steps.js +56 -52
- package/dist/components/Steps.js.map +1 -1
- package/dist/components/Tabs.js +69 -57
- package/dist/components/Tabs.js.map +1 -1
- package/dist/components/TextRotate.d.ts +1 -0
- package/dist/components/TextRotate.js +14 -12
- package/dist/components/TextRotate.js.map +1 -1
- package/dist/components/Textarea.d.ts +1 -0
- package/dist/components/Textarea.js +31 -30
- package/dist/components/Textarea.js.map +1 -1
- package/dist/components/ThemeController.d.ts +6 -3
- package/dist/components/ThemeController.js +101 -92
- package/dist/components/ThemeController.js.map +1 -1
- package/dist/components/Tooltip.js +38 -35
- package/dist/components/Tooltip.js.map +1 -1
- package/dist/components/Transfer.js +130 -121
- package/dist/components/Transfer.js.map +1 -1
- package/dist/components/TreeSelect.js +49 -48
- package/dist/components/TreeSelect.js.map +1 -1
- package/dist/components/Typography.d.ts +10 -5
- package/dist/components/Typography.js +84 -81
- package/dist/components/Typography.js.map +1 -1
- package/dist/components/VirtualList.d.ts +2 -1
- package/dist/components/VirtualList.js +40 -36
- package/dist/components/VirtualList.js.map +1 -1
- package/dist/components/Watermark.d.ts +1 -0
- package/dist/components/Watermark.js +74 -71
- package/dist/components/Watermark.js.map +1 -1
- package/dist/components/WeekCalendar.d.ts +1 -0
- package/dist/components/WeekCalendar.js +91 -76
- package/dist/components/WeekCalendar.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/package.json +1 -1
|
@@ -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}\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 ...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\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 {...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 className={`relative flex items-center ${extraClasses || ''}`}>\n {prefix && (\n <span className=\"absolute left-3 flex items-center text-base-content/70 pointer-events-none z-10\">\n {prefix}\n </span>\n )}\n {buildInput()}\n {(suffix || showClear) && (\n <span className=\"absolute right-3 flex items-center gap-1 z-10\">\n {showClear && (clearIcon || <ClearIcon onClick={handleClear} />)}\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}>\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}>\n {addonBefore && <span className=\"text-base-content/70\">{addonBefore}</span>}\n {input}\n {addonAfter && <span className=\"text-base-content/70\">{addonAfter}</span>}\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 {...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","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","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 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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"}
|
|
@@ -7,5 +7,6 @@ export interface LoadingProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
|
7
7
|
tip?: string;
|
|
8
8
|
/** Accessible label for the loading indicator (defaults to tip or "Loading") */
|
|
9
9
|
label?: string;
|
|
10
|
+
'data-testid'?: string;
|
|
10
11
|
}
|
|
11
12
|
export declare const Loading: React.FC<LoadingProps>;
|
|
@@ -1,60 +1,63 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import { useConfig as
|
|
3
|
-
const
|
|
4
|
-
size:
|
|
5
|
-
type:
|
|
6
|
-
className:
|
|
7
|
-
spinning:
|
|
8
|
-
children:
|
|
9
|
-
tip:
|
|
10
|
-
label:
|
|
11
|
-
|
|
1
|
+
import { jsxs as t, jsx as s } from "react/jsx-runtime";
|
|
2
|
+
import { useConfig as b } from "../providers/ConfigProvider.js";
|
|
3
|
+
const v = "loading", y = "loading-xs", N = "loading-sm", h = "loading-md", C = "loading-lg", j = "loading-xl", z = "loading-spinner", S = "loading-dots", B = "loading-ring", X = "loading-ball", $ = "loading-bars", k = "loading-infinity", T = ({
|
|
4
|
+
size: c,
|
|
5
|
+
type: g = "spinner",
|
|
6
|
+
className: m = "",
|
|
7
|
+
spinning: e = !0,
|
|
8
|
+
children: d,
|
|
9
|
+
tip: a,
|
|
10
|
+
label: f,
|
|
11
|
+
"data-testid": i,
|
|
12
|
+
...o
|
|
12
13
|
}) => {
|
|
13
|
-
const { componentSize:
|
|
14
|
-
xs:
|
|
15
|
-
sm:
|
|
16
|
-
md:
|
|
17
|
-
lg:
|
|
18
|
-
xl:
|
|
19
|
-
},
|
|
20
|
-
spinner:
|
|
21
|
-
dots:
|
|
22
|
-
ring:
|
|
23
|
-
ball:
|
|
24
|
-
bars:
|
|
25
|
-
infinity:
|
|
26
|
-
}[
|
|
27
|
-
return
|
|
28
|
-
|
|
14
|
+
const { componentSize: p } = b(), L = c ?? p ?? "md", l = f || a || "Loading", u = {
|
|
15
|
+
xs: y,
|
|
16
|
+
sm: N,
|
|
17
|
+
md: h,
|
|
18
|
+
lg: C,
|
|
19
|
+
xl: j
|
|
20
|
+
}, r = [v, {
|
|
21
|
+
spinner: z,
|
|
22
|
+
dots: S,
|
|
23
|
+
ring: B,
|
|
24
|
+
ball: X,
|
|
25
|
+
bars: $,
|
|
26
|
+
infinity: k
|
|
27
|
+
}[g], u[L], m].filter(Boolean).join(" "), n = (x) => i ? `${i}-${x}` : void 0;
|
|
28
|
+
return d ? /* @__PURE__ */ t("div", { className: "relative", "aria-busy": e, "data-testid": i, ...o, children: [
|
|
29
|
+
e && /* @__PURE__ */ t(
|
|
29
30
|
"div",
|
|
30
31
|
{
|
|
31
32
|
className: "absolute inset-0 flex flex-col items-center justify-center bg-base-100/50 backdrop-blur-sm z-10",
|
|
32
33
|
role: "status",
|
|
33
34
|
"aria-live": "polite",
|
|
35
|
+
"data-testid": n("overlay"),
|
|
34
36
|
children: [
|
|
35
|
-
/* @__PURE__ */
|
|
36
|
-
|
|
37
|
-
!
|
|
37
|
+
/* @__PURE__ */ s("span", { className: r, "aria-hidden": "true", "data-testid": n("spinner") }),
|
|
38
|
+
a && /* @__PURE__ */ s("p", { className: "mt-2 text-sm", "data-testid": n("tip"), children: a }),
|
|
39
|
+
!a && /* @__PURE__ */ s("span", { className: "sr-only", children: l })
|
|
38
40
|
]
|
|
39
41
|
}
|
|
40
42
|
),
|
|
41
|
-
/* @__PURE__ */
|
|
42
|
-
] }) :
|
|
43
|
+
/* @__PURE__ */ s("div", { className: e ? "pointer-events-none" : "", "aria-hidden": e, "data-testid": n("content"), children: d })
|
|
44
|
+
] }) : e ? /* @__PURE__ */ t(
|
|
43
45
|
"div",
|
|
44
46
|
{
|
|
45
47
|
className: "flex flex-col items-center gap-2",
|
|
46
48
|
role: "status",
|
|
47
49
|
"aria-live": "polite",
|
|
48
|
-
|
|
50
|
+
"data-testid": i,
|
|
51
|
+
...o,
|
|
49
52
|
children: [
|
|
50
|
-
/* @__PURE__ */
|
|
51
|
-
|
|
52
|
-
!
|
|
53
|
+
/* @__PURE__ */ s("span", { className: r, "aria-hidden": "true", "data-testid": n("spinner") }),
|
|
54
|
+
a && /* @__PURE__ */ s("p", { className: "text-sm", "data-testid": n("tip"), children: a }),
|
|
55
|
+
!a && /* @__PURE__ */ s("span", { className: "sr-only", children: l })
|
|
53
56
|
]
|
|
54
57
|
}
|
|
55
58
|
) : null;
|
|
56
59
|
};
|
|
57
60
|
export {
|
|
58
|
-
|
|
61
|
+
T as Loading
|
|
59
62
|
};
|
|
60
63
|
//# sourceMappingURL=Loading.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Loading.js","sources":["../../src/components/Loading.tsx"],"sourcesContent":["import React from 'react'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dLoading = 'loading'\nconst dLoadingXs = 'loading-xs'\nconst dLoadingSm = 'loading-sm'\nconst dLoadingMd = 'loading-md'\nconst dLoadingLg = 'loading-lg'\nconst dLoadingXl = 'loading-xl'\nconst dLoadingSpinner = 'loading-spinner'\nconst dLoadingDots = 'loading-dots'\nconst dLoadingRing = 'loading-ring'\nconst dLoadingBall = 'loading-ball'\nconst dLoadingBars = 'loading-bars'\nconst dLoadingInfinity = 'loading-infinity'\n\nexport interface LoadingProps extends React.HTMLAttributes<HTMLDivElement> {\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n type?: 'spinner' | 'dots' | 'ring' | 'ball' | 'bars' | 'infinity'\n spinning?: boolean\n children?: React.ReactNode\n tip?: string\n /** Accessible label for the loading indicator (defaults to tip or \"Loading\") */\n label?: string\n}\n\nexport const Loading: React.FC<LoadingProps> = ({\n size,\n type = 'spinner',\n className = '',\n spinning = true,\n children,\n tip,\n label,\n ...rest\n}) => {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n const accessibleLabel = label || tip || 'Loading'\n\n const sizeClasses = {\n xs: dLoadingXs,\n sm: dLoadingSm,\n md: dLoadingMd,\n lg: dLoadingLg,\n xl: dLoadingXl,\n }\n\n const typeClasses = {\n spinner: dLoadingSpinner,\n dots: dLoadingDots,\n ring: dLoadingRing,\n ball: dLoadingBall,\n bars: dLoadingBars,\n infinity: dLoadingInfinity,\n }\n\n const spinnerClasses = [dLoading, typeClasses[type], sizeClasses[effectiveSize], className]\n .filter(Boolean)\n .join(' ')\n\n if (children) {\n return (\n <div className=\"relative\" aria-busy={spinning} {...rest}>\n {spinning && (\n <div\n className=\"absolute inset-0 flex flex-col items-center justify-center bg-base-100/50 backdrop-blur-sm z-10\"\n role=\"status\"\n aria-live=\"polite\"\n >\n <span className={spinnerClasses} aria-hidden=\"true\"></span>\n {tip && <p className=\"mt-2 text-sm\">{tip}</p>}\n {!tip && <span className=\"sr-only\">{accessibleLabel}</span>}\n </div>\n )}\n <div className={spinning ? 'pointer-events-none' : ''} aria-hidden={spinning}>\n {children}\n </div>\n </div>\n )\n }\n\n if (!spinning) {\n return null\n }\n\n return (\n <div\n className=\"flex flex-col items-center gap-2\"\n role=\"status\"\n aria-live=\"polite\"\n {...rest}\n >\n <span className={spinnerClasses} aria-hidden=\"true\"></span>\n {tip && <p className=\"text-sm\">{tip}</p>}\n {!tip && <span className=\"sr-only\">{accessibleLabel}</span>}\n </div>\n )\n}\n"],"names":["dLoading","dLoadingXs","dLoadingSm","dLoadingMd","dLoadingLg","dLoadingXl","dLoadingSpinner","dLoadingDots","dLoadingRing","dLoadingBall","dLoadingBars","dLoadingInfinity","Loading","size","type","className","spinning","children","tip","label","rest","componentSize","useConfig","effectiveSize","accessibleLabel","sizeClasses","spinnerClasses","jsxs","jsx"],"mappings":";;AAIA,MAAMA,IAAW,WACXC,IAAa,cACbC,IAAa,cACbC,IAAa,cACbC,IAAa,cACbC,IAAa,cACbC,IAAkB,mBAClBC,IAAe,gBACfC,IAAe,gBACfC,IAAe,gBACfC,IAAe,gBACfC,IAAmB,
|
|
1
|
+
{"version":3,"file":"Loading.js","sources":["../../src/components/Loading.tsx"],"sourcesContent":["import React from 'react'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dLoading = 'loading'\nconst dLoadingXs = 'loading-xs'\nconst dLoadingSm = 'loading-sm'\nconst dLoadingMd = 'loading-md'\nconst dLoadingLg = 'loading-lg'\nconst dLoadingXl = 'loading-xl'\nconst dLoadingSpinner = 'loading-spinner'\nconst dLoadingDots = 'loading-dots'\nconst dLoadingRing = 'loading-ring'\nconst dLoadingBall = 'loading-ball'\nconst dLoadingBars = 'loading-bars'\nconst dLoadingInfinity = 'loading-infinity'\n\nexport interface LoadingProps extends React.HTMLAttributes<HTMLDivElement> {\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n type?: 'spinner' | 'dots' | 'ring' | 'ball' | 'bars' | 'infinity'\n spinning?: boolean\n children?: React.ReactNode\n tip?: string\n /** Accessible label for the loading indicator (defaults to tip or \"Loading\") */\n label?: string\n 'data-testid'?: string\n}\n\nexport const Loading: React.FC<LoadingProps> = ({\n size,\n type = 'spinner',\n className = '',\n spinning = true,\n children,\n tip,\n label,\n 'data-testid': testId,\n ...rest\n}) => {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n const accessibleLabel = label || tip || 'Loading'\n\n const sizeClasses = {\n xs: dLoadingXs,\n sm: dLoadingSm,\n md: dLoadingMd,\n lg: dLoadingLg,\n xl: dLoadingXl,\n }\n\n const typeClasses = {\n spinner: dLoadingSpinner,\n dots: dLoadingDots,\n ring: dLoadingRing,\n ball: dLoadingBall,\n bars: dLoadingBars,\n infinity: dLoadingInfinity,\n }\n\n const spinnerClasses = [dLoading, typeClasses[type], sizeClasses[effectiveSize], className]\n .filter(Boolean)\n .join(' ')\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n\n if (children) {\n return (\n <div className=\"relative\" aria-busy={spinning} data-testid={testId} {...rest}>\n {spinning && (\n <div\n className=\"absolute inset-0 flex flex-col items-center justify-center bg-base-100/50 backdrop-blur-sm z-10\"\n role=\"status\"\n aria-live=\"polite\"\n data-testid={getTestId('overlay')}\n >\n <span className={spinnerClasses} aria-hidden=\"true\" data-testid={getTestId('spinner')}></span>\n {tip && <p className=\"mt-2 text-sm\" data-testid={getTestId('tip')}>{tip}</p>}\n {!tip && <span className=\"sr-only\">{accessibleLabel}</span>}\n </div>\n )}\n <div className={spinning ? 'pointer-events-none' : ''} aria-hidden={spinning} data-testid={getTestId('content')}>\n {children}\n </div>\n </div>\n )\n }\n\n if (!spinning) {\n return null\n }\n\n return (\n <div\n className=\"flex flex-col items-center gap-2\"\n role=\"status\"\n aria-live=\"polite\"\n data-testid={testId}\n {...rest}\n >\n <span className={spinnerClasses} aria-hidden=\"true\" data-testid={getTestId('spinner')}></span>\n {tip && <p className=\"text-sm\" data-testid={getTestId('tip')}>{tip}</p>}\n {!tip && <span className=\"sr-only\">{accessibleLabel}</span>}\n </div>\n )\n}\n"],"names":["dLoading","dLoadingXs","dLoadingSm","dLoadingMd","dLoadingLg","dLoadingXl","dLoadingSpinner","dLoadingDots","dLoadingRing","dLoadingBall","dLoadingBars","dLoadingInfinity","Loading","size","type","className","spinning","children","tip","label","testId","rest","componentSize","useConfig","effectiveSize","accessibleLabel","sizeClasses","spinnerClasses","getTestId","suffix","jsxs","jsx"],"mappings":";;AAIA,MAAMA,IAAW,WACXC,IAAa,cACbC,IAAa,cACbC,IAAa,cACbC,IAAa,cACbC,IAAa,cACbC,IAAkB,mBAClBC,IAAe,gBACfC,IAAe,gBACfC,IAAe,gBACfC,IAAe,gBACfC,IAAmB,oBAaZC,IAAkC,CAAC;AAAA,EAC9C,MAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,WAAAC,IAAY;AAAA,EACZ,UAAAC,IAAW;AAAA,EACX,UAAAC;AAAA,EACA,KAAAC;AAAA,EACA,OAAAC;AAAA,EACA,eAAeC;AAAA,EACf,GAAGC;AACL,MAAM;AACJ,QAAM,EAAE,eAAAC,EAAA,IAAkBC,EAAA,GACpBC,IAAgBX,KAAQS,KAAiB,MACzCG,IAAkBN,KAASD,KAAO,WAElCQ,IAAc;AAAA,IAClB,IAAIzB;AAAA,IACJ,IAAIC;AAAA,IACJ,IAAIC;AAAA,IACJ,IAAIC;AAAA,IACJ,IAAIC;AAAA,EAAA,GAYAsB,IAAiB,CAAC3B,GATJ;AAAA,IAClB,SAASM;AAAA,IACT,MAAMC;AAAA,IACN,MAAMC;AAAA,IACN,MAAMC;AAAA,IACN,MAAMC;AAAA,IACN,UAAUC;AAAA,EAAA,EAGkCG,CAAI,GAAGY,EAAYF,CAAa,GAAGT,CAAS,EACvF,OAAO,OAAO,EACd,KAAK,GAAG,GACLa,IAAY,CAACC,MAAoBT,IAAS,GAAGA,CAAM,IAAIS,CAAM,KAAK;AAExE,SAAIZ,IAEA,gBAAAa,EAAC,SAAI,WAAU,YAAW,aAAWd,GAAU,eAAaI,GAAS,GAAGC,GACrE,UAAA;AAAA,IAAAL,KACC,gBAAAc;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,MAAK;AAAA,QACL,aAAU;AAAA,QACV,eAAaF,EAAU,SAAS;AAAA,QAEhC,UAAA;AAAA,UAAA,gBAAAG,EAAC,QAAA,EAAK,WAAWJ,GAAgB,eAAY,QAAO,eAAaC,EAAU,SAAS,GAAG;AAAA,UACtFV,uBAAQ,KAAA,EAAE,WAAU,gBAAe,eAAaU,EAAU,KAAK,GAAI,UAAAV,EAAA,CAAI;AAAA,UACvE,CAACA,KAAO,gBAAAa,EAAC,QAAA,EAAK,WAAU,WAAW,UAAAN,EAAA,CAAgB;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAGxD,gBAAAM,EAAC,OAAA,EAAI,WAAWf,IAAW,wBAAwB,IAAI,eAAaA,GAAU,eAAaY,EAAU,SAAS,GAC3G,UAAAX,EAAA,CACH;AAAA,EAAA,GACF,IAICD,IAKH,gBAAAc;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,MAAK;AAAA,MACL,aAAU;AAAA,MACV,eAAaV;AAAA,MACZ,GAAGC;AAAA,MAEJ,UAAA;AAAA,QAAA,gBAAAU,EAAC,QAAA,EAAK,WAAWJ,GAAgB,eAAY,QAAO,eAAaC,EAAU,SAAS,GAAG;AAAA,QACtFV,uBAAQ,KAAA,EAAE,WAAU,WAAU,eAAaU,EAAU,KAAK,GAAI,UAAAV,EAAA,CAAI;AAAA,QAClE,CAACA,KAAO,gBAAAa,EAAC,QAAA,EAAK,WAAU,WAAW,UAAAN,EAAA,CAAgB;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA,IAb/C;AAgBX;"}
|
|
@@ -1,84 +1,87 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import
|
|
3
|
-
const
|
|
1
|
+
import { jsx as R } from "react/jsx-runtime";
|
|
2
|
+
import O, { useRef as b, useState as A, useCallback as _, useLayoutEffect as L } from "react";
|
|
3
|
+
const f = {
|
|
4
4
|
sm: 640,
|
|
5
5
|
md: 768,
|
|
6
6
|
lg: 1024,
|
|
7
7
|
xl: 1280,
|
|
8
8
|
"2xl": 1536
|
|
9
9
|
};
|
|
10
|
-
function
|
|
11
|
-
return typeof t == "number" ? t : t ? t["2xl"] !== void 0 &&
|
|
10
|
+
function T(t, i) {
|
|
11
|
+
return typeof t == "number" ? t : t ? t["2xl"] !== void 0 && i >= f["2xl"] ? t["2xl"] : t.xl !== void 0 && i >= f.xl ? t.xl : t.lg !== void 0 && i >= f.lg ? t.lg : t.md !== void 0 && i >= f.md ? t.md : t.sm !== void 0 && i >= f.sm ? t.sm : t.xs !== void 0 ? t.xs : 3 : 3;
|
|
12
12
|
}
|
|
13
|
-
const
|
|
13
|
+
const q = ({
|
|
14
14
|
children: t,
|
|
15
|
-
columns:
|
|
16
|
-
gap:
|
|
15
|
+
columns: i = 3,
|
|
16
|
+
gap: o = 16,
|
|
17
17
|
className: z = "",
|
|
18
18
|
style: M,
|
|
19
|
+
"data-testid": u,
|
|
19
20
|
...P
|
|
20
21
|
}) => {
|
|
21
|
-
const
|
|
22
|
-
const
|
|
23
|
-
if (!
|
|
24
|
-
const n =
|
|
25
|
-
|
|
26
|
-
const
|
|
27
|
-
if (!
|
|
28
|
-
let h = 0,
|
|
29
|
-
for (let
|
|
30
|
-
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
}),
|
|
36
|
-
}, [t,
|
|
37
|
-
|
|
22
|
+
const v = b(null), [l, $] = A([]), [w, N] = A(0), g = b([]), a = O.Children.toArray(t), s = _(() => {
|
|
23
|
+
const e = v.current;
|
|
24
|
+
if (!e || a.length === 0) return;
|
|
25
|
+
const n = e.offsetWidth, y = typeof window < "u" ? window.innerWidth : n, c = T(i, y), k = (n - o * (c - 1)) / c, r = new Array(c).fill(0), x = [];
|
|
26
|
+
a.forEach((D, C) => {
|
|
27
|
+
const E = g.current[C];
|
|
28
|
+
if (!E) return;
|
|
29
|
+
let h = 0, H = r[0];
|
|
30
|
+
for (let d = 1; d < c; d++)
|
|
31
|
+
r[d] < H && (H = r[d], h = d);
|
|
32
|
+
const B = h * (k + o), F = r[h];
|
|
33
|
+
x[C] = { left: B, top: F };
|
|
34
|
+
const K = E.offsetHeight;
|
|
35
|
+
r[h] += K + o;
|
|
36
|
+
}), $(x), N(Math.max(...r) - o);
|
|
37
|
+
}, [t, i, o, a.length]);
|
|
38
|
+
L(() => {
|
|
38
39
|
s();
|
|
39
|
-
const
|
|
40
|
+
const e = () => {
|
|
40
41
|
s();
|
|
41
42
|
};
|
|
42
|
-
return window.addEventListener("resize",
|
|
43
|
-
}, [s]),
|
|
44
|
-
const
|
|
45
|
-
return () => clearTimeout(
|
|
43
|
+
return window.addEventListener("resize", e), () => window.removeEventListener("resize", e);
|
|
44
|
+
}, [s]), L(() => {
|
|
45
|
+
const e = setTimeout(s, 0);
|
|
46
|
+
return () => clearTimeout(e);
|
|
46
47
|
}, [t, s]);
|
|
47
|
-
const
|
|
48
|
-
return /* @__PURE__ */
|
|
48
|
+
const m = v.current?.offsetWidth ?? 0, S = typeof window < "u" ? window.innerWidth : m, p = T(i, S), W = m > 0 ? (m - o * (p - 1)) / p : 0, j = (e) => u ? `${u}-${e}` : void 0;
|
|
49
|
+
return /* @__PURE__ */ R(
|
|
49
50
|
"div",
|
|
50
51
|
{
|
|
51
|
-
ref:
|
|
52
|
+
ref: v,
|
|
52
53
|
className: z,
|
|
53
54
|
style: {
|
|
54
55
|
position: "relative",
|
|
55
|
-
height:
|
|
56
|
+
height: w > 0 ? w : void 0,
|
|
56
57
|
...M
|
|
57
58
|
},
|
|
59
|
+
"data-testid": u,
|
|
58
60
|
...P,
|
|
59
|
-
children:
|
|
61
|
+
children: a.map((e, n) => /* @__PURE__ */ R(
|
|
60
62
|
"div",
|
|
61
63
|
{
|
|
62
|
-
ref: (
|
|
63
|
-
|
|
64
|
+
ref: (y) => {
|
|
65
|
+
g.current[n] = y;
|
|
64
66
|
},
|
|
65
67
|
style: {
|
|
66
68
|
position: l.length > 0 ? "absolute" : "relative",
|
|
67
69
|
left: l[n]?.left ?? 0,
|
|
68
70
|
top: l[n]?.top ?? 0,
|
|
69
|
-
width:
|
|
71
|
+
width: W > 0 ? W : "100%",
|
|
70
72
|
visibility: l.length > 0 ? "visible" : "hidden"
|
|
71
73
|
},
|
|
72
|
-
|
|
74
|
+
"data-testid": j(`item-${n}`),
|
|
75
|
+
children: e
|
|
73
76
|
},
|
|
74
77
|
n
|
|
75
78
|
))
|
|
76
79
|
}
|
|
77
80
|
);
|
|
78
81
|
};
|
|
79
|
-
|
|
82
|
+
q.displayName = "Masonry";
|
|
80
83
|
export {
|
|
81
|
-
|
|
82
|
-
|
|
84
|
+
q as Masonry,
|
|
85
|
+
q as default
|
|
83
86
|
};
|
|
84
87
|
//# sourceMappingURL=Masonry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Masonry.js","sources":["../../src/components/Masonry.tsx"],"sourcesContent":["import React, { useRef, useState, useLayoutEffect, useCallback } from 'react'\n\nexport interface MasonryProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n columns?:\n | number\n | {\n xs?: number\n sm?: number\n md?: number\n lg?: number\n xl?: number\n '2xl'?: number\n }\n gap?: number\n}\n\n// Tailwind breakpoints in pixels\nconst BREAKPOINTS = {\n sm: 640,\n md: 768,\n lg: 1024,\n xl: 1280,\n '2xl': 1536,\n}\n\nfunction getColumnsForWidth(\n columns: MasonryProps['columns'],\n width: number\n): number {\n if (typeof columns === 'number') {\n return columns\n }\n\n if (!columns) return 3\n\n // Find the appropriate column count for current width\n // Start from largest breakpoint and work down\n if (columns['2xl'] !== undefined && width >= BREAKPOINTS['2xl']) {\n return columns['2xl']\n }\n if (columns.xl !== undefined && width >= BREAKPOINTS.xl) {\n return columns.xl\n }\n if (columns.lg !== undefined && width >= BREAKPOINTS.lg) {\n return columns.lg\n }\n if (columns.md !== undefined && width >= BREAKPOINTS.md) {\n return columns.md\n }\n if (columns.sm !== undefined && width >= BREAKPOINTS.sm) {\n return columns.sm\n }\n if (columns.xs !== undefined) {\n return columns.xs\n }\n\n // Default fallback\n return 3\n}\n\nexport const Masonry: React.FC<MasonryProps> = ({\n children,\n columns = 3,\n gap = 16,\n className = '',\n style,\n ...rest\n}) => {\n const containerRef = useRef<HTMLDivElement>(null)\n const [positions, setPositions] = useState<\n Array<{ left: number; top: number }>\n >([])\n const [containerHeight, setContainerHeight] = useState(0)\n const itemRefs = useRef<(HTMLDivElement | null)[]>([])\n\n const childArray = React.Children.toArray(children)\n\n const calculateLayout = useCallback(() => {\n const container = containerRef.current\n if (!container || childArray.length === 0) return\n\n const containerWidth = container.offsetWidth\n // Use viewport width for responsive breakpoints (matches Tailwind behavior)\n const viewportWidth = typeof window !== 'undefined' ? window.innerWidth : containerWidth\n const numColumns = getColumnsForWidth(columns, viewportWidth)\n const columnWidth = (containerWidth - gap * (numColumns - 1)) / numColumns\n\n // Track height of each column\n const columnHeights = new Array(numColumns).fill(0)\n const newPositions: Array<{ left: number; top: number }> = []\n\n // Place each item in the shortest column\n childArray.forEach((_, index) => {\n const itemEl = itemRefs.current[index]\n if (!itemEl) return\n\n // Find shortest column\n let shortestColumn = 0\n let minHeight = columnHeights[0]\n for (let i = 1; i < numColumns; i++) {\n if (columnHeights[i] < minHeight) {\n minHeight = columnHeights[i]\n shortestColumn = i\n }\n }\n\n // Calculate position\n const left = shortestColumn * (columnWidth + gap)\n const top = columnHeights[shortestColumn]\n\n newPositions[index] = { left, top }\n\n // Update column height\n const itemHeight = itemEl.offsetHeight\n columnHeights[shortestColumn] += itemHeight + gap\n })\n\n setPositions(newPositions)\n setContainerHeight(Math.max(...columnHeights) - gap)\n }, [children, columns, gap, childArray.length])\n\n // Calculate layout after render and on resize\n useLayoutEffect(() => {\n calculateLayout()\n\n const handleResize = () => {\n calculateLayout()\n }\n\n window.addEventListener('resize', handleResize)\n return () => window.removeEventListener('resize', handleResize)\n }, [calculateLayout])\n\n // Recalculate when children change\n useLayoutEffect(() => {\n // Small delay to ensure refs are populated\n const timer = setTimeout(calculateLayout, 0)\n return () => clearTimeout(timer)\n }, [children, calculateLayout])\n\n const containerWidth = containerRef.current?.offsetWidth ?? 0\n const viewportWidth = typeof window !== 'undefined' ? window.innerWidth : containerWidth\n const numColumns = getColumnsForWidth(columns, viewportWidth)\n const columnWidth =\n containerWidth > 0\n ? (containerWidth - gap * (numColumns - 1)) / numColumns\n : 0\n\n return (\n <div\n ref={containerRef}\n className={className}\n style={{\n position: 'relative',\n height: containerHeight > 0 ? containerHeight : undefined,\n ...style,\n }}\n {...rest}\n >\n {childArray.map((child, index) => (\n <div\n key={index}\n ref={(el) => {\n itemRefs.current[index] = el\n }}\n style={{\n position: positions.length > 0 ? 'absolute' : 'relative',\n left: positions[index]?.left ?? 0,\n top: positions[index]?.top ?? 0,\n width: columnWidth > 0 ? columnWidth : '100%',\n visibility: positions.length > 0 ? 'visible' : 'hidden',\n }}\n >\n {child}\n </div>\n ))}\n </div>\n )\n}\n\nMasonry.displayName = 'Masonry'\n\nexport default Masonry\n"],"names":["BREAKPOINTS","getColumnsForWidth","columns","width","Masonry","children","gap","className","style","rest","containerRef","useRef","positions","setPositions","useState","containerHeight","setContainerHeight","itemRefs","childArray","React","calculateLayout","useCallback","container","containerWidth","viewportWidth","numColumns","columnWidth","columnHeights","newPositions","index","itemEl","shortestColumn","minHeight","i","left","top","itemHeight","useLayoutEffect","handleResize","timer","jsx","child","el"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"Masonry.js","sources":["../../src/components/Masonry.tsx"],"sourcesContent":["import React, { useRef, useState, useLayoutEffect, useCallback } from 'react'\n\nexport interface MasonryProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n columns?:\n | number\n | {\n xs?: number\n sm?: number\n md?: number\n lg?: number\n xl?: number\n '2xl'?: number\n }\n gap?: number\n 'data-testid'?: string\n}\n\n// Tailwind breakpoints in pixels\nconst BREAKPOINTS = {\n sm: 640,\n md: 768,\n lg: 1024,\n xl: 1280,\n '2xl': 1536,\n}\n\nfunction getColumnsForWidth(\n columns: MasonryProps['columns'],\n width: number\n): number {\n if (typeof columns === 'number') {\n return columns\n }\n\n if (!columns) return 3\n\n // Find the appropriate column count for current width\n // Start from largest breakpoint and work down\n if (columns['2xl'] !== undefined && width >= BREAKPOINTS['2xl']) {\n return columns['2xl']\n }\n if (columns.xl !== undefined && width >= BREAKPOINTS.xl) {\n return columns.xl\n }\n if (columns.lg !== undefined && width >= BREAKPOINTS.lg) {\n return columns.lg\n }\n if (columns.md !== undefined && width >= BREAKPOINTS.md) {\n return columns.md\n }\n if (columns.sm !== undefined && width >= BREAKPOINTS.sm) {\n return columns.sm\n }\n if (columns.xs !== undefined) {\n return columns.xs\n }\n\n // Default fallback\n return 3\n}\n\nexport const Masonry: React.FC<MasonryProps> = ({\n children,\n columns = 3,\n gap = 16,\n className = '',\n style,\n 'data-testid': testId,\n ...rest\n}) => {\n const containerRef = useRef<HTMLDivElement>(null)\n const [positions, setPositions] = useState<\n Array<{ left: number; top: number }>\n >([])\n const [containerHeight, setContainerHeight] = useState(0)\n const itemRefs = useRef<(HTMLDivElement | null)[]>([])\n\n const childArray = React.Children.toArray(children)\n\n const calculateLayout = useCallback(() => {\n const container = containerRef.current\n if (!container || childArray.length === 0) return\n\n const containerWidth = container.offsetWidth\n // Use viewport width for responsive breakpoints (matches Tailwind behavior)\n const viewportWidth = typeof window !== 'undefined' ? window.innerWidth : containerWidth\n const numColumns = getColumnsForWidth(columns, viewportWidth)\n const columnWidth = (containerWidth - gap * (numColumns - 1)) / numColumns\n\n // Track height of each column\n const columnHeights = new Array(numColumns).fill(0)\n const newPositions: Array<{ left: number; top: number }> = []\n\n // Place each item in the shortest column\n childArray.forEach((_, index) => {\n const itemEl = itemRefs.current[index]\n if (!itemEl) return\n\n // Find shortest column\n let shortestColumn = 0\n let minHeight = columnHeights[0]\n for (let i = 1; i < numColumns; i++) {\n if (columnHeights[i] < minHeight) {\n minHeight = columnHeights[i]\n shortestColumn = i\n }\n }\n\n // Calculate position\n const left = shortestColumn * (columnWidth + gap)\n const top = columnHeights[shortestColumn]\n\n newPositions[index] = { left, top }\n\n // Update column height\n const itemHeight = itemEl.offsetHeight\n columnHeights[shortestColumn] += itemHeight + gap\n })\n\n setPositions(newPositions)\n setContainerHeight(Math.max(...columnHeights) - gap)\n }, [children, columns, gap, childArray.length])\n\n // Calculate layout after render and on resize\n useLayoutEffect(() => {\n calculateLayout()\n\n const handleResize = () => {\n calculateLayout()\n }\n\n window.addEventListener('resize', handleResize)\n return () => window.removeEventListener('resize', handleResize)\n }, [calculateLayout])\n\n // Recalculate when children change\n useLayoutEffect(() => {\n // Small delay to ensure refs are populated\n const timer = setTimeout(calculateLayout, 0)\n return () => clearTimeout(timer)\n }, [children, calculateLayout])\n\n const containerWidth = containerRef.current?.offsetWidth ?? 0\n const viewportWidth = typeof window !== 'undefined' ? window.innerWidth : containerWidth\n const numColumns = getColumnsForWidth(columns, viewportWidth)\n const columnWidth =\n containerWidth > 0\n ? (containerWidth - gap * (numColumns - 1)) / numColumns\n : 0\n\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n\n return (\n <div\n ref={containerRef}\n className={className}\n style={{\n position: 'relative',\n height: containerHeight > 0 ? containerHeight : undefined,\n ...style,\n }}\n data-testid={testId}\n {...rest}\n >\n {childArray.map((child, index) => (\n <div\n key={index}\n ref={(el) => {\n itemRefs.current[index] = el\n }}\n style={{\n position: positions.length > 0 ? 'absolute' : 'relative',\n left: positions[index]?.left ?? 0,\n top: positions[index]?.top ?? 0,\n width: columnWidth > 0 ? columnWidth : '100%',\n visibility: positions.length > 0 ? 'visible' : 'hidden',\n }}\n data-testid={getTestId(`item-${index}`)}\n >\n {child}\n </div>\n ))}\n </div>\n )\n}\n\nMasonry.displayName = 'Masonry'\n\nexport default Masonry\n"],"names":["BREAKPOINTS","getColumnsForWidth","columns","width","Masonry","children","gap","className","style","testId","rest","containerRef","useRef","positions","setPositions","useState","containerHeight","setContainerHeight","itemRefs","childArray","React","calculateLayout","useCallback","container","containerWidth","viewportWidth","numColumns","columnWidth","columnHeights","newPositions","_","index","itemEl","shortestColumn","minHeight","i","left","top","itemHeight","useLayoutEffect","handleResize","timer","getTestId","suffix","jsx","child","el"],"mappings":"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"}
|
|
@@ -26,5 +26,6 @@ export interface MentionProps extends Omit<React.HTMLAttributes<HTMLDivElement>,
|
|
|
26
26
|
notFoundContent?: React.ReactNode;
|
|
27
27
|
filterOption?: boolean | ((input: string, option: MentionOption) => boolean);
|
|
28
28
|
dropdownClassName?: string;
|
|
29
|
+
'data-testid'?: string;
|
|
29
30
|
}
|
|
30
31
|
export declare const Mention: React.FC<MentionProps>;
|