asterui 0.12.57 → 0.12.59
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/Autocomplete.js +1 -1
- package/dist/components/Autocomplete.js.map +1 -1
- package/dist/components/Button.js +1 -1
- package/dist/components/Button.js.map +1 -1
- package/dist/components/Checkbox.js +1 -1
- package/dist/components/Checkbox.js.map +1 -1
- package/dist/components/ColorPicker.js +1 -1
- package/dist/components/ColorPicker.js.map +1 -1
- package/dist/components/CopyButton.js +1 -1
- package/dist/components/CopyButton.js.map +1 -1
- package/dist/components/Countdown.js +1 -1
- package/dist/components/Countdown.js.map +1 -1
- package/dist/components/DatePicker.js +1 -1
- package/dist/components/DatePicker.js.map +1 -1
- package/dist/components/Dock.js +1 -1
- package/dist/components/Dock.js.map +1 -1
- package/dist/components/Empty.js +1 -1
- package/dist/components/Empty.js.map +1 -1
- package/dist/components/FileInput.js +1 -1
- package/dist/components/FileInput.js.map +1 -1
- package/dist/components/Filter.js +1 -1
- package/dist/components/Filter.js.map +1 -1
- package/dist/components/Form.d.ts +10 -1
- package/dist/components/Form.js +205 -184
- package/dist/components/Form.js.map +1 -1
- package/dist/components/Input.js +1 -1
- package/dist/components/Input.js.map +1 -1
- package/dist/components/InputNumber.js +1 -1
- package/dist/components/InputNumber.js.map +1 -1
- package/dist/components/List.js +1 -1
- package/dist/components/List.js.map +1 -1
- package/dist/components/Loading.js +1 -1
- package/dist/components/Loading.js.map +1 -1
- package/dist/components/Modal.js +1 -1
- package/dist/components/Modal.js.map +1 -1
- package/dist/components/OTPInput.js +1 -1
- package/dist/components/OTPInput.js.map +1 -1
- package/dist/components/Pagination.js +1 -1
- package/dist/components/Pagination.js.map +1 -1
- package/dist/components/Popconfirm.js +1 -1
- package/dist/components/Popconfirm.js.map +1 -1
- package/dist/components/Radio.js +1 -1
- package/dist/components/Radio.js.map +1 -1
- package/dist/components/Range.js +1 -1
- package/dist/components/Range.js.map +1 -1
- package/dist/components/Rating.js +1 -1
- package/dist/components/Rating.js.map +1 -1
- package/dist/components/RichTextEditor.js +1 -1
- package/dist/components/RichTextEditor.js.map +1 -1
- package/dist/components/Segmented.js +1 -1
- package/dist/components/Segmented.js.map +1 -1
- package/dist/components/Select.js +1 -1
- package/dist/components/Select.js.map +1 -1
- package/dist/components/Table.d.ts +19 -0
- package/dist/components/Table.js +348 -310
- package/dist/components/Table.js.map +1 -1
- package/dist/components/Tabs.js +1 -1
- package/dist/components/Tabs.js.map +1 -1
- package/dist/components/Textarea.js +1 -1
- package/dist/components/Textarea.js.map +1 -1
- package/dist/components/ThemeController.js +1 -1
- package/dist/components/ThemeController.js.map +1 -1
- package/dist/components/TimePicker.js +1 -1
- package/dist/components/TimePicker.js.map +1 -1
- package/dist/components/Toggle.js +1 -1
- package/dist/components/Toggle.js.map +1 -1
- package/dist/hooks/useTheme.d.ts +1 -1
- package/dist/hooks/useTheme.js +1 -1
- package/dist/hooks/useTheme.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.js +2 -2
- package/dist/providers/ConfigProvider.js.map +1 -0
- package/dist/providers/ThemeProvider.js.map +1 -0
- package/package.json +1 -1
- package/dist/components/ConfigProvider.js.map +0 -1
- package/dist/components/ThemeProvider.js.map +0 -1
- /package/dist/{components → providers}/ConfigProvider.d.ts +0 -0
- /package/dist/{components → providers}/ConfigProvider.js +0 -0
- /package/dist/{components → providers}/ThemeProvider.d.ts +0 -0
- /package/dist/{components → providers}/ThemeProvider.js +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsxs as M, jsx as o } from "react/jsx-runtime";
|
|
2
2
|
import { useId as de, useState as k, useRef as O, useEffect as z } from "react";
|
|
3
|
-
import { useConfig as ue } from "
|
|
3
|
+
import { useConfig as ue } from "../providers/ConfigProvider.js";
|
|
4
4
|
const pe = "dropdown", fe = "dropdown-bottom", he = "dropdown-open", be = "dropdown-content", me = "menu", Ie = "input", ge = "input-xs", we = "input-sm", xe = "input-md", ye = "input-lg", ve = "input-xl", Ce = "input-neutral", ke = "input-primary", De = "input-secondary", Ne = "input-accent", $e = "input-info", je = "input-success", A = "input-warning", R = "input-error", Ee = ({ onClick: l, className: I }) => /* @__PURE__ */ o(
|
|
5
5
|
"button",
|
|
6
6
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Autocomplete.js","sources":["../../src/components/Autocomplete.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useId } from 'react'\nimport { useConfig } from './ConfigProvider'\n\n// DaisyUI classes\nconst dDropdown = 'dropdown'\nconst dDropdownBottom = 'dropdown-bottom'\nconst dDropdownOpen = 'dropdown-open'\nconst dDropdownContent = 'dropdown-content'\nconst dMenu = 'menu'\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'\n\nexport interface AutocompleteOption {\n value: string\n label: string\n disabled?: boolean\n}\n\nexport interface AutocompleteProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'onSelect'> {\n value?: string\n defaultValue?: string\n onChange?: (value: string) => void\n onSelect?: (value: string, option: AutocompleteOption) => void\n onSearch?: (value: string) => void\n options: AutocompleteOption[] | string[]\n placeholder?: string\n disabled?: boolean\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 allowCustomValue?: boolean\n filterOption?: (option: AutocompleteOption, inputValue: string) => boolean\n notFoundContent?: React.ReactNode\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 /** Controlled open state */\n open?: boolean\n /** Default open state */\n defaultOpen?: boolean\n /** Callback when open state changes */\n onOpenChange?: (open: boolean) => void\n /** Activate first option by default */\n defaultActiveFirstOption?: boolean\n}\n\n// Clear icon component\nconst ClearIcon: React.FC<{ onClick: (e: React.MouseEvent) => 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 Autocomplete: React.FC<AutocompleteProps> = ({\n value,\n defaultValue = '',\n onChange,\n onSelect,\n onSearch,\n options: rawOptions,\n placeholder = 'Type to search...',\n disabled = false,\n size,\n color,\n status,\n className = '',\n allowCustomValue = true,\n filterOption,\n notFoundContent = 'No results found',\n allowClear,\n onClear,\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n defaultActiveFirstOption = true,\n ...rest\n}) => {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n // Generate unique IDs for ARIA\n const baseId = useId()\n const inputId = `${baseId}-input`\n const listboxId = `${baseId}-listbox`\n\n // Normalize options to AutocompleteOption[]\n const options: AutocompleteOption[] = rawOptions.map((opt) =>\n typeof opt === 'string' ? { value: opt, label: opt } : opt\n )\n\n const [inputValue, setInputValue] = useState(defaultValue)\n const [internalOpen, setInternalOpen] = useState(defaultOpen)\n const [highlightedIndex, setHighlightedIndex] = useState(-1)\n const inputRef = useRef<HTMLInputElement>(null)\n const dropdownRef = useRef<HTMLUListElement>(null)\n\n // Determine if open state is controlled\n const isOpenControlled = controlledOpen !== undefined\n const isOpen = isOpenControlled ? controlledOpen : internalOpen\n\n const setIsOpen = (newOpen: boolean) => {\n if (!isOpenControlled) {\n setInternalOpen(newOpen)\n }\n onOpenChange?.(newOpen)\n }\n\n // Update input value when controlled value changes\n useEffect(() => {\n if (value !== undefined) {\n const selectedOption = options.find((opt) => opt.value === value)\n setInputValue(selectedOption?.label || value)\n }\n }, [value, options])\n\n // Filter options based on input\n const defaultFilter = (option: AutocompleteOption, input: string) =>\n option.label.toLowerCase().includes(input.toLowerCase())\n\n const filteredOptions = options.filter((option) =>\n filterOption ? filterOption(option, inputValue) : defaultFilter(option, inputValue)\n )\n\n // Get only enabled options for keyboard navigation\n const enabledOptions = filteredOptions.filter(opt => !opt.disabled)\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newInputValue = e.target.value\n setInputValue(newInputValue)\n setIsOpen(true)\n\n if (defaultActiveFirstOption && enabledOptions.length > 0) {\n setHighlightedIndex(0)\n } else {\n setHighlightedIndex(-1)\n }\n\n onSearch?.(newInputValue)\n\n if (allowCustomValue) {\n onChange?.(newInputValue)\n }\n }\n\n const handleOptionClick = (option: AutocompleteOption) => {\n if (option.disabled) return\n\n setInputValue(option.label)\n setIsOpen(false)\n setHighlightedIndex(-1)\n\n onChange?.(option.value)\n onSelect?.(option.value, option)\n inputRef.current?.focus()\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (!isOpen && (e.key === 'ArrowDown' || e.key === 'ArrowUp')) {\n setIsOpen(true)\n if (defaultActiveFirstOption && enabledOptions.length > 0) {\n setHighlightedIndex(0)\n }\n return\n }\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n setHighlightedIndex((prev) => {\n // Find next enabled option\n for (let i = prev + 1; i < filteredOptions.length; i++) {\n if (!filteredOptions[i].disabled) return i\n }\n return prev\n })\n break\n case 'ArrowUp':\n e.preventDefault()\n setHighlightedIndex((prev) => {\n // Find previous enabled option\n for (let i = prev - 1; i >= 0; i--) {\n if (!filteredOptions[i].disabled) return i\n }\n return prev\n })\n break\n case 'Enter':\n e.preventDefault()\n if (highlightedIndex >= 0 && filteredOptions[highlightedIndex] && !filteredOptions[highlightedIndex].disabled) {\n handleOptionClick(filteredOptions[highlightedIndex])\n } else if (!allowCustomValue && enabledOptions.length > 0) {\n handleOptionClick(enabledOptions[0])\n }\n break\n case 'Escape':\n setIsOpen(false)\n setHighlightedIndex(-1)\n inputRef.current?.blur()\n break\n }\n }\n\n const handleFocus = () => {\n setIsOpen(true)\n if (defaultActiveFirstOption && enabledOptions.length > 0) {\n setHighlightedIndex(0)\n }\n }\n\n const handleBlur = (e: React.FocusEvent) => {\n // Don't close if clicking inside dropdown\n if (dropdownRef.current && dropdownRef.current.contains(e.relatedTarget as Node)) {\n return\n }\n setTimeout(() => setIsOpen(false), 200)\n }\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation()\n setInputValue('')\n onChange?.('')\n onClear?.()\n inputRef.current?.focus()\n }\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 // Scroll highlighted option into view\n useEffect(() => {\n if (highlightedIndex >= 0 && dropdownRef.current) {\n const highlightedElement = dropdownRef.current.children[highlightedIndex] as HTMLElement\n highlightedElement?.scrollIntoView({ block: 'nearest' })\n }\n }, [highlightedIndex])\n\n // Determine if we should show clear button\n const showClear = allowClear && inputValue && !disabled\n\n // Get custom clear icon if provided\n const clearIcon = typeof allowClear === 'object' && allowClear.clearIcon\n ? allowClear.clearIcon\n : null\n\n // Get option ID for ARIA\n const getOptionId = (index: number) => `${baseId}-option-${index}`\n\n const inputClasses = [\n `${dInput} w-full`,\n sizeClasses[effectiveSize],\n effectiveColorClass,\n showClear && 'pr-10',\n ].filter(Boolean).join(' ')\n\n return (\n <div\n className={`${dDropdown} ${dDropdownBottom} w-full ${isOpen && !disabled ? dDropdownOpen : ''} ${className}`}\n data-state={isOpen ? 'open' : 'closed'}\n {...rest}\n >\n <div className=\"relative w-full\">\n <input\n ref={inputRef}\n id={inputId}\n type=\"text\"\n role=\"combobox\"\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n aria-controls={listboxId}\n aria-autocomplete=\"list\"\n aria-activedescendant={highlightedIndex >= 0 ? getOptionId(highlightedIndex) : undefined}\n aria-invalid={status === 'error' ? true : undefined}\n value={inputValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n placeholder={placeholder}\n disabled={disabled}\n className={inputClasses}\n />\n {showClear && (\n <span className=\"absolute right-3 top-1/2 -translate-y-1/2 z-10\">\n {clearIcon || <ClearIcon onClick={handleClear} />}\n </span>\n )}\n </div>\n\n {isOpen && !disabled && (\n <ul\n ref={dropdownRef}\n id={listboxId}\n role=\"listbox\"\n aria-label=\"Suggestions\"\n tabIndex={-1}\n className={`${dDropdownContent} ${dMenu} bg-base-100 rounded-box z-50 w-full shadow-lg border border-base-300 max-h-60 overflow-auto flex-nowrap`}\n >\n {filteredOptions.length > 0 ? (\n filteredOptions.map((option, index) => (\n <li key={option.value}>\n <a\n id={getOptionId(index)}\n role=\"option\"\n aria-selected={highlightedIndex === index}\n aria-disabled={option.disabled}\n onMouseDown={(e) => {\n e.preventDefault()\n handleOptionClick(option)\n }}\n onMouseEnter={() => !option.disabled && setHighlightedIndex(index)}\n className={[\n index === highlightedIndex && !option.disabled && 'active',\n option.disabled && 'disabled text-base-content/40 cursor-not-allowed',\n ].filter(Boolean).join(' ')}\n >\n {option.label}\n </a>\n </li>\n ))\n ) : (\n <li className=\"disabled\">\n <span className=\"text-base-content/60 text-center cursor-default\">{notFoundContent}</span>\n </li>\n )}\n </ul>\n )}\n </div>\n )\n}\n"],"names":["dDropdown","dDropdownBottom","dDropdownOpen","dDropdownContent","dMenu","dInput","dInputXs","dInputSm","dInputMd","dInputLg","dInputXl","dInputNeutral","dInputPrimary","dInputSecondary","dInputAccent","dInputInfo","dInputSuccess","dInputWarning","dInputError","ClearIcon","onClick","className","jsx","Autocomplete","value","defaultValue","onChange","onSelect","onSearch","rawOptions","placeholder","disabled","size","color","status","allowCustomValue","filterOption","notFoundContent","allowClear","onClear","controlledOpen","defaultOpen","onOpenChange","defaultActiveFirstOption","rest","componentSize","useConfig","effectiveSize","baseId","useId","inputId","listboxId","options","opt","inputValue","setInputValue","useState","internalOpen","setInternalOpen","highlightedIndex","setHighlightedIndex","inputRef","useRef","dropdownRef","isOpenControlled","isOpen","setIsOpen","newOpen","useEffect","selectedOption","defaultFilter","option","input","filteredOptions","enabledOptions","handleInputChange","newInputValue","handleOptionClick","handleKeyDown","prev","i","handleFocus","handleBlur","handleClear","sizeClasses","effectiveColorClass","showClear","clearIcon","getOptionId","index","inputClasses","jsxs","e"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Autocomplete.js","sources":["../../src/components/Autocomplete.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useId } from 'react'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dDropdown = 'dropdown'\nconst dDropdownBottom = 'dropdown-bottom'\nconst dDropdownOpen = 'dropdown-open'\nconst dDropdownContent = 'dropdown-content'\nconst dMenu = 'menu'\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'\n\nexport interface AutocompleteOption {\n value: string\n label: string\n disabled?: boolean\n}\n\nexport interface AutocompleteProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'onSelect'> {\n value?: string\n defaultValue?: string\n onChange?: (value: string) => void\n onSelect?: (value: string, option: AutocompleteOption) => void\n onSearch?: (value: string) => void\n options: AutocompleteOption[] | string[]\n placeholder?: string\n disabled?: boolean\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 allowCustomValue?: boolean\n filterOption?: (option: AutocompleteOption, inputValue: string) => boolean\n notFoundContent?: React.ReactNode\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 /** Controlled open state */\n open?: boolean\n /** Default open state */\n defaultOpen?: boolean\n /** Callback when open state changes */\n onOpenChange?: (open: boolean) => void\n /** Activate first option by default */\n defaultActiveFirstOption?: boolean\n}\n\n// Clear icon component\nconst ClearIcon: React.FC<{ onClick: (e: React.MouseEvent) => 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 Autocomplete: React.FC<AutocompleteProps> = ({\n value,\n defaultValue = '',\n onChange,\n onSelect,\n onSearch,\n options: rawOptions,\n placeholder = 'Type to search...',\n disabled = false,\n size,\n color,\n status,\n className = '',\n allowCustomValue = true,\n filterOption,\n notFoundContent = 'No results found',\n allowClear,\n onClear,\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n defaultActiveFirstOption = true,\n ...rest\n}) => {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n // Generate unique IDs for ARIA\n const baseId = useId()\n const inputId = `${baseId}-input`\n const listboxId = `${baseId}-listbox`\n\n // Normalize options to AutocompleteOption[]\n const options: AutocompleteOption[] = rawOptions.map((opt) =>\n typeof opt === 'string' ? { value: opt, label: opt } : opt\n )\n\n const [inputValue, setInputValue] = useState(defaultValue)\n const [internalOpen, setInternalOpen] = useState(defaultOpen)\n const [highlightedIndex, setHighlightedIndex] = useState(-1)\n const inputRef = useRef<HTMLInputElement>(null)\n const dropdownRef = useRef<HTMLUListElement>(null)\n\n // Determine if open state is controlled\n const isOpenControlled = controlledOpen !== undefined\n const isOpen = isOpenControlled ? controlledOpen : internalOpen\n\n const setIsOpen = (newOpen: boolean) => {\n if (!isOpenControlled) {\n setInternalOpen(newOpen)\n }\n onOpenChange?.(newOpen)\n }\n\n // Update input value when controlled value changes\n useEffect(() => {\n if (value !== undefined) {\n const selectedOption = options.find((opt) => opt.value === value)\n setInputValue(selectedOption?.label || value)\n }\n }, [value, options])\n\n // Filter options based on input\n const defaultFilter = (option: AutocompleteOption, input: string) =>\n option.label.toLowerCase().includes(input.toLowerCase())\n\n const filteredOptions = options.filter((option) =>\n filterOption ? filterOption(option, inputValue) : defaultFilter(option, inputValue)\n )\n\n // Get only enabled options for keyboard navigation\n const enabledOptions = filteredOptions.filter(opt => !opt.disabled)\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newInputValue = e.target.value\n setInputValue(newInputValue)\n setIsOpen(true)\n\n if (defaultActiveFirstOption && enabledOptions.length > 0) {\n setHighlightedIndex(0)\n } else {\n setHighlightedIndex(-1)\n }\n\n onSearch?.(newInputValue)\n\n if (allowCustomValue) {\n onChange?.(newInputValue)\n }\n }\n\n const handleOptionClick = (option: AutocompleteOption) => {\n if (option.disabled) return\n\n setInputValue(option.label)\n setIsOpen(false)\n setHighlightedIndex(-1)\n\n onChange?.(option.value)\n onSelect?.(option.value, option)\n inputRef.current?.focus()\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (!isOpen && (e.key === 'ArrowDown' || e.key === 'ArrowUp')) {\n setIsOpen(true)\n if (defaultActiveFirstOption && enabledOptions.length > 0) {\n setHighlightedIndex(0)\n }\n return\n }\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n setHighlightedIndex((prev) => {\n // Find next enabled option\n for (let i = prev + 1; i < filteredOptions.length; i++) {\n if (!filteredOptions[i].disabled) return i\n }\n return prev\n })\n break\n case 'ArrowUp':\n e.preventDefault()\n setHighlightedIndex((prev) => {\n // Find previous enabled option\n for (let i = prev - 1; i >= 0; i--) {\n if (!filteredOptions[i].disabled) return i\n }\n return prev\n })\n break\n case 'Enter':\n e.preventDefault()\n if (highlightedIndex >= 0 && filteredOptions[highlightedIndex] && !filteredOptions[highlightedIndex].disabled) {\n handleOptionClick(filteredOptions[highlightedIndex])\n } else if (!allowCustomValue && enabledOptions.length > 0) {\n handleOptionClick(enabledOptions[0])\n }\n break\n case 'Escape':\n setIsOpen(false)\n setHighlightedIndex(-1)\n inputRef.current?.blur()\n break\n }\n }\n\n const handleFocus = () => {\n setIsOpen(true)\n if (defaultActiveFirstOption && enabledOptions.length > 0) {\n setHighlightedIndex(0)\n }\n }\n\n const handleBlur = (e: React.FocusEvent) => {\n // Don't close if clicking inside dropdown\n if (dropdownRef.current && dropdownRef.current.contains(e.relatedTarget as Node)) {\n return\n }\n setTimeout(() => setIsOpen(false), 200)\n }\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation()\n setInputValue('')\n onChange?.('')\n onClear?.()\n inputRef.current?.focus()\n }\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 // Scroll highlighted option into view\n useEffect(() => {\n if (highlightedIndex >= 0 && dropdownRef.current) {\n const highlightedElement = dropdownRef.current.children[highlightedIndex] as HTMLElement\n highlightedElement?.scrollIntoView({ block: 'nearest' })\n }\n }, [highlightedIndex])\n\n // Determine if we should show clear button\n const showClear = allowClear && inputValue && !disabled\n\n // Get custom clear icon if provided\n const clearIcon = typeof allowClear === 'object' && allowClear.clearIcon\n ? allowClear.clearIcon\n : null\n\n // Get option ID for ARIA\n const getOptionId = (index: number) => `${baseId}-option-${index}`\n\n const inputClasses = [\n `${dInput} w-full`,\n sizeClasses[effectiveSize],\n effectiveColorClass,\n showClear && 'pr-10',\n ].filter(Boolean).join(' ')\n\n return (\n <div\n className={`${dDropdown} ${dDropdownBottom} w-full ${isOpen && !disabled ? dDropdownOpen : ''} ${className}`}\n data-state={isOpen ? 'open' : 'closed'}\n {...rest}\n >\n <div className=\"relative w-full\">\n <input\n ref={inputRef}\n id={inputId}\n type=\"text\"\n role=\"combobox\"\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n aria-controls={listboxId}\n aria-autocomplete=\"list\"\n aria-activedescendant={highlightedIndex >= 0 ? getOptionId(highlightedIndex) : undefined}\n aria-invalid={status === 'error' ? true : undefined}\n value={inputValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n placeholder={placeholder}\n disabled={disabled}\n className={inputClasses}\n />\n {showClear && (\n <span className=\"absolute right-3 top-1/2 -translate-y-1/2 z-10\">\n {clearIcon || <ClearIcon onClick={handleClear} />}\n </span>\n )}\n </div>\n\n {isOpen && !disabled && (\n <ul\n ref={dropdownRef}\n id={listboxId}\n role=\"listbox\"\n aria-label=\"Suggestions\"\n tabIndex={-1}\n className={`${dDropdownContent} ${dMenu} bg-base-100 rounded-box z-50 w-full shadow-lg border border-base-300 max-h-60 overflow-auto flex-nowrap`}\n >\n {filteredOptions.length > 0 ? (\n filteredOptions.map((option, index) => (\n <li key={option.value}>\n <a\n id={getOptionId(index)}\n role=\"option\"\n aria-selected={highlightedIndex === index}\n aria-disabled={option.disabled}\n onMouseDown={(e) => {\n e.preventDefault()\n handleOptionClick(option)\n }}\n onMouseEnter={() => !option.disabled && setHighlightedIndex(index)}\n className={[\n index === highlightedIndex && !option.disabled && 'active',\n option.disabled && 'disabled text-base-content/40 cursor-not-allowed',\n ].filter(Boolean).join(' ')}\n >\n {option.label}\n </a>\n </li>\n ))\n ) : (\n <li className=\"disabled\">\n <span className=\"text-base-content/60 text-center cursor-default\">{notFoundContent}</span>\n </li>\n )}\n </ul>\n )}\n </div>\n )\n}\n"],"names":["dDropdown","dDropdownBottom","dDropdownOpen","dDropdownContent","dMenu","dInput","dInputXs","dInputSm","dInputMd","dInputLg","dInputXl","dInputNeutral","dInputPrimary","dInputSecondary","dInputAccent","dInputInfo","dInputSuccess","dInputWarning","dInputError","ClearIcon","onClick","className","jsx","Autocomplete","value","defaultValue","onChange","onSelect","onSearch","rawOptions","placeholder","disabled","size","color","status","allowCustomValue","filterOption","notFoundContent","allowClear","onClear","controlledOpen","defaultOpen","onOpenChange","defaultActiveFirstOption","rest","componentSize","useConfig","effectiveSize","baseId","useId","inputId","listboxId","options","opt","inputValue","setInputValue","useState","internalOpen","setInternalOpen","highlightedIndex","setHighlightedIndex","inputRef","useRef","dropdownRef","isOpenControlled","isOpen","setIsOpen","newOpen","useEffect","selectedOption","defaultFilter","option","input","filteredOptions","enabledOptions","handleInputChange","newInputValue","handleOptionClick","handleKeyDown","prev","i","handleFocus","handleBlur","handleClear","sizeClasses","effectiveColorClass","showClear","clearIcon","getOptionId","index","inputClasses","jsxs","e"],"mappings":";;;AAIA,MAAMA,KAAY,YACZC,KAAkB,mBAClBC,KAAgB,iBAChBC,KAAmB,oBACnBC,KAAQ,QACRC,KAAS,SACTC,KAAW,YACXC,KAAW,YACXC,KAAW,YACXC,KAAW,YACXC,KAAW,YACXC,KAAgB,iBAChBC,KAAgB,iBAChBC,KAAkB,mBAClBC,KAAe,gBACfC,KAAa,cACbC,KAAgB,iBAChBC,IAAgB,iBAChBC,IAAc,eAuCdC,KAAsF,CAAC,EAAE,SAAAC,GAAS,WAAAC,QACtG,gBAAAC;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,MAAK;AAAA,IACL,SAAAF;AAAA,IACA,WAAW,oFAAoFC,KAAa,EAAE;AAAA,IAC9G,cAAW;AAAA,IACX,UAAU;AAAA,IAEV,UAAA,gBAAAC,EAAC,SAAI,WAAU,WAAU,MAAK,QAAO,SAAQ,aAAY,QAAO,gBAAe,eAAY,QACzF,UAAA,gBAAAA,EAAC,QAAA,EAAK,eAAc,SAAQ,gBAAe,SAAQ,aAAa,GAAG,GAAE,uBAAA,CAAuB,EAAA,CAC9F;AAAA,EAAA;AACF,GAGWC,KAA4C,CAAC;AAAA,EACxD,OAAAC;AAAA,EACA,cAAAC,IAAe;AAAA,EACf,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,SAASC;AAAA,EACT,aAAAC,IAAc;AAAA,EACd,UAAAC,IAAW;AAAA,EACX,MAAAC;AAAA,EACA,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA,WAAAb,IAAY;AAAA,EACZ,kBAAAc,IAAmB;AAAA,EACnB,cAAAC;AAAA,EACA,iBAAAC,IAAkB;AAAA,EAClB,YAAAC;AAAA,EACA,SAAAC;AAAA,EACA,MAAMC;AAAA,EACN,aAAAC,IAAc;AAAA,EACd,cAAAC;AAAA,EACA,0BAAAC,IAA2B;AAAA,EAC3B,GAAGC;AACL,MAAM;AACJ,QAAM,EAAE,eAAAC,EAAA,IAAkBC,GAAA,GACpBC,IAAgBf,KAAQa,KAAiB,MAEzCG,IAASC,GAAA,GACTC,IAAU,GAAGF,CAAM,UACnBG,IAAY,GAAGH,CAAM,YAGrBI,IAAgCvB,EAAW;AAAA,IAAI,CAACwB,MACpD,OAAOA,KAAQ,WAAW,EAAE,OAAOA,GAAK,OAAOA,MAAQA;AAAA,EAAA,GAGnD,CAACC,GAAYC,CAAa,IAAIC,EAAS/B,CAAY,GACnD,CAACgC,GAAcC,CAAe,IAAIF,EAASf,CAAW,GACtD,CAACkB,GAAkBC,CAAmB,IAAIJ,EAAS,EAAE,GACrDK,IAAWC,EAAyB,IAAI,GACxCC,IAAcD,EAAyB,IAAI,GAG3CE,IAAmBxB,MAAmB,QACtCyB,IAASD,IAAmBxB,IAAiBiB,GAE7CS,IAAY,CAACC,MAAqB;AACtC,IAAKH,KACHN,EAAgBS,CAAO,GAEzBzB,IAAeyB,CAAO;AAAA,EACxB;AAGA,EAAAC,EAAU,MAAM;AACd,QAAI5C,MAAU,QAAW;AACvB,YAAM6C,IAAiBjB,EAAQ,KAAK,CAACC,MAAQA,EAAI,UAAU7B,CAAK;AAChE,MAAA+B,EAAcc,GAAgB,SAAS7C,CAAK;AAAA,IAC9C;AAAA,EACF,GAAG,CAACA,GAAO4B,CAAO,CAAC;AAGnB,QAAMkB,KAAgB,CAACC,GAA4BC,MACjDD,EAAO,MAAM,cAAc,SAASC,EAAM,YAAA,CAAa,GAEnDC,IAAkBrB,EAAQ;AAAA,IAAO,CAACmB,MACtCnC,IAAeA,EAAamC,GAAQjB,CAAU,IAAIgB,GAAcC,GAAQjB,CAAU;AAAA,EAAA,GAI9EoB,IAAiBD,EAAgB,OAAO,CAAApB,MAAO,CAACA,EAAI,QAAQ,GAE5DsB,KAAoB,CAAC,MAA2C;AACpE,UAAMC,IAAgB,EAAE,OAAO;AAC/B,IAAArB,EAAcqB,CAAa,GAC3BV,EAAU,EAAI,GAEVvB,KAA4B+B,EAAe,SAAS,IACtDd,EAAoB,CAAC,IAErBA,EAAoB,EAAE,GAGxBhC,IAAWgD,CAAa,GAEpBzC,KACFT,IAAWkD,CAAa;AAAA,EAE5B,GAEMC,IAAoB,CAACN,MAA+B;AACxD,IAAIA,EAAO,aAEXhB,EAAcgB,EAAO,KAAK,GAC1BL,EAAU,EAAK,GACfN,EAAoB,EAAE,GAEtBlC,IAAW6C,EAAO,KAAK,GACvB5C,IAAW4C,EAAO,OAAOA,CAAM,GAC/BV,EAAS,SAAS,MAAA;AAAA,EACpB,GAEMiB,KAAgB,CAAC,MAA6C;AAClE,QAAI,CAACb,MAAW,EAAE,QAAQ,eAAe,EAAE,QAAQ,YAAY;AAC7D,MAAAC,EAAU,EAAI,GACVvB,KAA4B+B,EAAe,SAAS,KACtDd,EAAoB,CAAC;AAEvB;AAAA,IACF;AAEA,YAAQ,EAAE,KAAA;AAAA,MACR,KAAK;AACH,UAAE,eAAA,GACFA,EAAoB,CAACmB,MAAS;AAE5B,mBAASC,IAAID,IAAO,GAAGC,IAAIP,EAAgB,QAAQO;AACjD,gBAAI,CAACP,EAAgBO,CAAC,EAAE,SAAU,QAAOA;AAE3C,iBAAOD;AAAA,QACT,CAAC;AACD;AAAA,MACF,KAAK;AACH,UAAE,eAAA,GACFnB,EAAoB,CAACmB,MAAS;AAE5B,mBAASC,IAAID,IAAO,GAAGC,KAAK,GAAGA;AAC7B,gBAAI,CAACP,EAAgBO,CAAC,EAAE,SAAU,QAAOA;AAE3C,iBAAOD;AAAA,QACT,CAAC;AACD;AAAA,MACF,KAAK;AACH,UAAE,eAAA,GACEpB,KAAoB,KAAKc,EAAgBd,CAAgB,KAAK,CAACc,EAAgBd,CAAgB,EAAE,WACnGkB,EAAkBJ,EAAgBd,CAAgB,CAAC,IAC1C,CAACxB,KAAoBuC,EAAe,SAAS,KACtDG,EAAkBH,EAAe,CAAC,CAAC;AAErC;AAAA,MACF,KAAK;AACH,QAAAR,EAAU,EAAK,GACfN,EAAoB,EAAE,GACtBC,EAAS,SAAS,KAAA;AAClB;AAAA,IAAA;AAAA,EAEN,GAEMoB,KAAc,MAAM;AACxB,IAAAf,EAAU,EAAI,GACVvB,KAA4B+B,EAAe,SAAS,KACtDd,EAAoB,CAAC;AAAA,EAEzB,GAEMsB,KAAa,CAAC,MAAwB;AAE1C,IAAInB,EAAY,WAAWA,EAAY,QAAQ,SAAS,EAAE,aAAqB,KAG/E,WAAW,MAAMG,EAAU,EAAK,GAAG,GAAG;AAAA,EACxC,GAEMiB,KAAc,CAAC,MAAwB;AAC3C,MAAE,gBAAA,GACF5B,EAAc,EAAE,GAChB7B,IAAW,EAAE,GACba,IAAA,GACAsB,EAAS,SAAS,MAAA;AAAA,EACpB,GAEMuB,KAAc;AAAA,IAClB,IAAI9E;AAAA,IACJ,IAAIC;AAAA,IACJ,IAAIC;AAAA,IACJ,IAAIC;AAAA,IACJ,IAAIC;AAAA,EAAA,GAoBA2E,KAAsBnD,IANN;AAAA,IACpB,OAAOhB;AAAA,IACP,SAASD;AAAA,EAAA,EAIwCiB,CAAM,IAAKD,IAjBzC;AAAA,IACnB,SAAStB;AAAA,IACT,SAASC;AAAA,IACT,WAAWC;AAAA,IACX,QAAQC;AAAA,IACR,MAAMC;AAAA,IACN,SAASC;AAAA,IACT,SAASC;AAAA,IACT,OAAOC;AAAA,EAAA,EAS0Ee,CAAK,IAAI;AAG5F,EAAAmC,EAAU,MAAM;AACd,IAAIT,KAAoB,KAAKI,EAAY,WACZA,EAAY,QAAQ,SAASJ,CAAgB,GACpD,eAAe,EAAE,OAAO,UAAA,CAAW;AAAA,EAE3D,GAAG,CAACA,CAAgB,CAAC;AAGrB,QAAM2B,IAAYhD,KAAcgB,KAAc,CAACvB,GAGzCwD,KAAY,OAAOjD,KAAe,YAAYA,EAAW,YAC3DA,EAAW,YACX,MAGEkD,IAAc,CAACC,MAAkB,GAAGzC,CAAM,WAAWyC,CAAK,IAE1DC,KAAe;AAAA,IACnB,GAAGrF,EAAM;AAAA,IACT+E,GAAYrC,CAAa;AAAA,IACzBsC;AAAA,IACAC,KAAa;AAAA,EAAA,EACb,OAAO,OAAO,EAAE,KAAK,GAAG;AAE1B,SACE,gBAAAK;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,GAAG3F,EAAS,IAAIC,EAAe,WAAWgE,KAAU,CAAClC,IAAW7B,KAAgB,EAAE,IAAImB,CAAS;AAAA,MAC1G,cAAY4C,IAAS,SAAS;AAAA,MAC7B,GAAGrB;AAAA,MAEJ,UAAA;AAAA,QAAA,gBAAA+C,EAAC,OAAA,EAAI,WAAU,mBACb,UAAA;AAAA,UAAA,gBAAArE;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,KAAKuC;AAAA,cACL,IAAIX;AAAA,cACJ,MAAK;AAAA,cACL,MAAK;AAAA,cACL,iBAAee;AAAA,cACf,iBAAc;AAAA,cACd,iBAAed;AAAA,cACf,qBAAkB;AAAA,cAClB,yBAAuBQ,KAAoB,IAAI6B,EAAY7B,CAAgB,IAAI;AAAA,cAC/E,gBAAczB,MAAW,UAAU,KAAO;AAAA,cAC1C,OAAOoB;AAAA,cACP,UAAUqB;AAAA,cACV,WAAWG;AAAA,cACX,SAASG;AAAA,cACT,QAAQC;AAAA,cACR,aAAApD;AAAA,cACA,UAAAC;AAAA,cACA,WAAW2D;AAAA,YAAA;AAAA,UAAA;AAAA,UAEZJ,KACC,gBAAAhE,EAAC,QAAA,EAAK,WAAU,kDACb,gBAAa,gBAAAA,EAACH,IAAA,EAAU,SAASgE,GAAA,CAAa,EAAA,CACjD;AAAA,QAAA,GAEJ;AAAA,QAEClB,KAAU,CAAClC,KACV,gBAAAT;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAKyC;AAAA,YACL,IAAIZ;AAAA,YACJ,MAAK;AAAA,YACL,cAAW;AAAA,YACX,UAAU;AAAA,YACV,WAAW,GAAGhD,EAAgB,IAAIC,EAAK;AAAA,YAEtC,UAAAqE,EAAgB,SAAS,IACxBA,EAAgB,IAAI,CAACF,GAAQkB,MAC3B,gBAAAnE,EAAC,MAAA,EACC,UAAA,gBAAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,IAAIkE,EAAYC,CAAK;AAAA,gBACrB,MAAK;AAAA,gBACL,iBAAe9B,MAAqB8B;AAAA,gBACpC,iBAAelB,EAAO;AAAA,gBACtB,aAAa,CAACqB,MAAM;AAClB,kBAAAA,EAAE,eAAA,GACFf,EAAkBN,CAAM;AAAA,gBAC1B;AAAA,gBACA,cAAc,MAAM,CAACA,EAAO,YAAYX,EAAoB6B,CAAK;AAAA,gBACjE,WAAW;AAAA,kBACTA,MAAU9B,KAAoB,CAACY,EAAO,YAAY;AAAA,kBAClDA,EAAO,YAAY;AAAA,gBAAA,EACnB,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,gBAEzB,UAAAA,EAAO;AAAA,cAAA;AAAA,YAAA,EACV,GAjBOA,EAAO,KAkBhB,CACD,IAED,gBAAAjD,EAAC,MAAA,EAAG,WAAU,YACZ,UAAA,gBAAAA,EAAC,QAAA,EAAK,WAAU,mDAAmD,aAAgB,EAAA,CACrF;AAAA,UAAA;AAAA,QAAA;AAAA,MAEJ;AAAA,IAAA;AAAA,EAAA;AAIR;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as r, jsxs as A, Fragment as E } from "react/jsx-runtime";
|
|
2
2
|
import { SizeProvider as I } from "../contexts/SizeContext.js";
|
|
3
|
-
import { useConfig as W } from "
|
|
3
|
+
import { useConfig as W } from "../providers/ConfigProvider.js";
|
|
4
4
|
const X = "btn", F = "btn-primary", G = "btn-secondary", O = "btn-accent", H = "btn-info", J = "btn-success", M = "btn-warning", Q = "btn-error", R = "btn-neutral", U = "btn-outline", V = "btn-dash", Y = "btn-soft", Z = "btn-ghost", _ = "btn-link", P = "btn-xs", nn = "btn-sm", tn = "btn-lg", sn = "btn-xl", en = "btn-active", rn = "btn-square", on = "btn-circle", cn = "btn-wide", an = "btn-block", dn = "loading", ln = "loading-spinner", gn = ({
|
|
5
5
|
children: o,
|
|
6
6
|
color: y,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Button.js","sources":["../../src/components/Button.tsx"],"sourcesContent":["import React from 'react'\nimport { SizeProvider } from '../contexts/SizeContext'\nimport { useConfig } from './ConfigProvider'\n\n// DaisyUI classes\nconst dBtn = 'btn'\nconst dBtnPrimary = 'btn-primary'\nconst dBtnSecondary = 'btn-secondary'\nconst dBtnAccent = 'btn-accent'\nconst dBtnInfo = 'btn-info'\nconst dBtnSuccess = 'btn-success'\nconst dBtnWarning = 'btn-warning'\nconst dBtnError = 'btn-error'\nconst dBtnNeutral = 'btn-neutral'\nconst dBtnOutline = 'btn-outline'\nconst dBtnDash = 'btn-dash'\nconst dBtnSoft = 'btn-soft'\nconst dBtnGhost = 'btn-ghost'\nconst dBtnLink = 'btn-link'\nconst dBtnXs = 'btn-xs'\nconst dBtnSm = 'btn-sm'\nconst dBtnLg = 'btn-lg'\nconst dBtnXl = 'btn-xl'\nconst dBtnActive = 'btn-active'\nconst dBtnSquare = 'btn-square'\nconst dBtnCircle = 'btn-circle'\nconst dBtnWide = 'btn-wide'\nconst dBtnBlock = 'btn-block'\nconst dLoading = 'loading'\nconst dLoadingSpinner = 'loading-spinner'\n\ntype BaseButtonProps = {\n /** Button color */\n color?: 'primary' | 'secondary' | 'accent' | 'info' | 'success' | 'warning' | 'error' | 'neutral'\n /** Button style variant */\n variant?: 'solid' | 'outline' | 'dash' | 'soft' | 'ghost' | 'link'\n /** Button size */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n /** Active/pressed visual state */\n active?: boolean\n /** Show loading spinner and disable button */\n loading?: boolean\n /** Button shape */\n shape?: 'square' | 'circle' | 'wide' | 'block' | 'round'\n /** Disable click animation */\n noAnimation?: boolean\n /** Icon element to display */\n icon?: React.ReactNode\n /** Position of the icon */\n iconPosition?: 'start' | 'end'\n /** Applies error/danger styling (shorthand for color=\"error\") */\n danger?: boolean\n /** Toggle button pressed state (sets aria-pressed) */\n pressed?: boolean\n}\n\ntype ButtonAsButton = BaseButtonProps &\n Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'type'> & {\n href?: undefined\n htmlType?: 'button' | 'submit' | 'reset'\n }\n\ntype ButtonAsAnchor = BaseButtonProps &\n Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, 'type'> & {\n href: string\n htmlType?: undefined\n /** Disable the link button */\n disabled?: boolean\n }\n\nexport type ButtonProps = ButtonAsButton | ButtonAsAnchor\n\nexport const Button: React.FC<ButtonProps> = ({\n children,\n color,\n variant,\n size,\n active = false,\n loading = false,\n shape,\n noAnimation = false,\n icon,\n iconPosition = 'start',\n danger = false,\n pressed,\n className = '',\n ...props\n}) => {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n // danger prop is a shorthand for color=\"error\"\n const effectiveColor = danger ? 'error' : color\n\n const colorClasses = {\n primary: dBtnPrimary,\n secondary: dBtnSecondary,\n accent: dBtnAccent,\n info: dBtnInfo,\n success: dBtnSuccess,\n warning: dBtnWarning,\n error: dBtnError,\n neutral: dBtnNeutral,\n }\n\n const variantClasses = {\n solid: '', // default, no extra class needed\n outline: dBtnOutline,\n dash: dBtnDash,\n soft: dBtnSoft,\n ghost: dBtnGhost,\n link: dBtnLink,\n }\n\n const sizeClasses = {\n xs: dBtnXs,\n sm: dBtnSm,\n md: '',\n lg: dBtnLg,\n xl: dBtnXl,\n }\n\n const shapeClasses = {\n square: dBtnSquare,\n circle: dBtnCircle,\n wide: dBtnWide,\n block: dBtnBlock,\n round: 'rounded-full',\n }\n\n const classes = [\n dBtn,\n effectiveColor && colorClasses[effectiveColor],\n variant && variantClasses[variant],\n sizeClasses[effectiveSize],\n active && dBtnActive,\n shape && shapeClasses[shape],\n noAnimation && 'no-animation',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n // Determine icon spacing based on whether there's text content and button size\n const hasChildren = children !== undefined && children !== null && children !== ''\n const spacingBySize = {\n xs: iconPosition === 'start' ? 'mr-1' : 'ml-1',\n sm: iconPosition === 'start' ? 'mr-1' : 'ml-1',\n md: iconPosition === 'start' ? 'mr-1.5' : 'ml-1.5',\n lg: iconPosition === 'start' ? 'mr-2' : 'ml-2',\n xl: iconPosition === 'start' ? 'mr-2' : 'ml-2',\n }\n const iconSpacing = hasChildren ? spacingBySize[effectiveSize] : ''\n\n const iconElement = icon && (\n <SizeProvider size={effectiveSize}>\n <span className={`inline-flex items-center ${iconSpacing}`} aria-hidden=\"true\">\n {icon}\n </span>\n </SizeProvider>\n )\n\n const content = (\n <>\n {loading && <span className={`${dLoading} ${dLoadingSpinner}`} aria-hidden=\"true\"></span>}\n {!loading && icon && iconPosition === 'start' && iconElement}\n {children}\n {!loading && icon && iconPosition === 'end' && iconElement}\n </>\n )\n\n if ('href' in props && props.href !== undefined) {\n const { href, disabled, onKeyDown, onClick, ...anchorProps } = props as ButtonAsAnchor & {\n onKeyDown?: React.KeyboardEventHandler<HTMLAnchorElement>\n onClick?: React.MouseEventHandler<HTMLAnchorElement>\n }\n const isDisabled = disabled || loading\n\n // Handle Space key for anchor buttons (links only respond to Enter natively)\n const handleKeyDown = (event: React.KeyboardEvent<HTMLAnchorElement>) => {\n if (event.key === ' ' && !isDisabled) {\n event.preventDefault()\n event.currentTarget.click()\n }\n onKeyDown?.(event)\n }\n\n // Prevent click when disabled\n const handleClick = (event: React.MouseEvent<HTMLAnchorElement>) => {\n if (isDisabled) {\n event.preventDefault()\n return\n }\n onClick?.(event)\n }\n\n return (\n <a\n href={isDisabled ? undefined : href}\n role=\"button\"\n className={classes}\n aria-disabled={isDisabled || undefined}\n aria-busy={loading || undefined}\n aria-pressed={pressed}\n tabIndex={isDisabled ? -1 : 0}\n onKeyDown={handleKeyDown}\n onClick={handleClick}\n {...anchorProps}\n >\n {content}\n </a>\n )\n }\n\n const { htmlType, ...buttonProps } = props as Omit<ButtonAsButton, keyof BaseButtonProps>\n const buttonType: 'button' | 'submit' | 'reset' = htmlType ?? 'button'\n return (\n <button\n type={buttonType}\n className={classes}\n aria-busy={loading || undefined}\n aria-pressed={pressed}\n disabled={loading || buttonProps.disabled}\n {...buttonProps}\n >\n {content}\n </button>\n )\n}\n"],"names":["dBtn","dBtnPrimary","dBtnSecondary","dBtnAccent","dBtnInfo","dBtnSuccess","dBtnWarning","dBtnError","dBtnNeutral","dBtnOutline","dBtnDash","dBtnSoft","dBtnGhost","dBtnLink","dBtnXs","dBtnSm","dBtnLg","dBtnXl","dBtnActive","dBtnSquare","dBtnCircle","dBtnWide","dBtnBlock","dLoading","dLoadingSpinner","Button","children","color","variant","size","active","loading","shape","noAnimation","icon","iconPosition","danger","pressed","className","props","componentSize","useConfig","effectiveSize","effectiveColor","colorClasses","variantClasses","sizeClasses","shapeClasses","classes","iconSpacing","iconElement","jsx","SizeProvider","content","jsxs","Fragment","href","disabled","onKeyDown","onClick","anchorProps","isDisabled","event","htmlType","buttonProps"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Button.js","sources":["../../src/components/Button.tsx"],"sourcesContent":["import React from 'react'\nimport { SizeProvider } from '../contexts/SizeContext'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dBtn = 'btn'\nconst dBtnPrimary = 'btn-primary'\nconst dBtnSecondary = 'btn-secondary'\nconst dBtnAccent = 'btn-accent'\nconst dBtnInfo = 'btn-info'\nconst dBtnSuccess = 'btn-success'\nconst dBtnWarning = 'btn-warning'\nconst dBtnError = 'btn-error'\nconst dBtnNeutral = 'btn-neutral'\nconst dBtnOutline = 'btn-outline'\nconst dBtnDash = 'btn-dash'\nconst dBtnSoft = 'btn-soft'\nconst dBtnGhost = 'btn-ghost'\nconst dBtnLink = 'btn-link'\nconst dBtnXs = 'btn-xs'\nconst dBtnSm = 'btn-sm'\nconst dBtnLg = 'btn-lg'\nconst dBtnXl = 'btn-xl'\nconst dBtnActive = 'btn-active'\nconst dBtnSquare = 'btn-square'\nconst dBtnCircle = 'btn-circle'\nconst dBtnWide = 'btn-wide'\nconst dBtnBlock = 'btn-block'\nconst dLoading = 'loading'\nconst dLoadingSpinner = 'loading-spinner'\n\ntype BaseButtonProps = {\n /** Button color */\n color?: 'primary' | 'secondary' | 'accent' | 'info' | 'success' | 'warning' | 'error' | 'neutral'\n /** Button style variant */\n variant?: 'solid' | 'outline' | 'dash' | 'soft' | 'ghost' | 'link'\n /** Button size */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n /** Active/pressed visual state */\n active?: boolean\n /** Show loading spinner and disable button */\n loading?: boolean\n /** Button shape */\n shape?: 'square' | 'circle' | 'wide' | 'block' | 'round'\n /** Disable click animation */\n noAnimation?: boolean\n /** Icon element to display */\n icon?: React.ReactNode\n /** Position of the icon */\n iconPosition?: 'start' | 'end'\n /** Applies error/danger styling (shorthand for color=\"error\") */\n danger?: boolean\n /** Toggle button pressed state (sets aria-pressed) */\n pressed?: boolean\n}\n\ntype ButtonAsButton = BaseButtonProps &\n Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'type'> & {\n href?: undefined\n htmlType?: 'button' | 'submit' | 'reset'\n }\n\ntype ButtonAsAnchor = BaseButtonProps &\n Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, 'type'> & {\n href: string\n htmlType?: undefined\n /** Disable the link button */\n disabled?: boolean\n }\n\nexport type ButtonProps = ButtonAsButton | ButtonAsAnchor\n\nexport const Button: React.FC<ButtonProps> = ({\n children,\n color,\n variant,\n size,\n active = false,\n loading = false,\n shape,\n noAnimation = false,\n icon,\n iconPosition = 'start',\n danger = false,\n pressed,\n className = '',\n ...props\n}) => {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n // danger prop is a shorthand for color=\"error\"\n const effectiveColor = danger ? 'error' : color\n\n const colorClasses = {\n primary: dBtnPrimary,\n secondary: dBtnSecondary,\n accent: dBtnAccent,\n info: dBtnInfo,\n success: dBtnSuccess,\n warning: dBtnWarning,\n error: dBtnError,\n neutral: dBtnNeutral,\n }\n\n const variantClasses = {\n solid: '', // default, no extra class needed\n outline: dBtnOutline,\n dash: dBtnDash,\n soft: dBtnSoft,\n ghost: dBtnGhost,\n link: dBtnLink,\n }\n\n const sizeClasses = {\n xs: dBtnXs,\n sm: dBtnSm,\n md: '',\n lg: dBtnLg,\n xl: dBtnXl,\n }\n\n const shapeClasses = {\n square: dBtnSquare,\n circle: dBtnCircle,\n wide: dBtnWide,\n block: dBtnBlock,\n round: 'rounded-full',\n }\n\n const classes = [\n dBtn,\n effectiveColor && colorClasses[effectiveColor],\n variant && variantClasses[variant],\n sizeClasses[effectiveSize],\n active && dBtnActive,\n shape && shapeClasses[shape],\n noAnimation && 'no-animation',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n // Determine icon spacing based on whether there's text content and button size\n const hasChildren = children !== undefined && children !== null && children !== ''\n const spacingBySize = {\n xs: iconPosition === 'start' ? 'mr-1' : 'ml-1',\n sm: iconPosition === 'start' ? 'mr-1' : 'ml-1',\n md: iconPosition === 'start' ? 'mr-1.5' : 'ml-1.5',\n lg: iconPosition === 'start' ? 'mr-2' : 'ml-2',\n xl: iconPosition === 'start' ? 'mr-2' : 'ml-2',\n }\n const iconSpacing = hasChildren ? spacingBySize[effectiveSize] : ''\n\n const iconElement = icon && (\n <SizeProvider size={effectiveSize}>\n <span className={`inline-flex items-center ${iconSpacing}`} aria-hidden=\"true\">\n {icon}\n </span>\n </SizeProvider>\n )\n\n const content = (\n <>\n {loading && <span className={`${dLoading} ${dLoadingSpinner}`} aria-hidden=\"true\"></span>}\n {!loading && icon && iconPosition === 'start' && iconElement}\n {children}\n {!loading && icon && iconPosition === 'end' && iconElement}\n </>\n )\n\n if ('href' in props && props.href !== undefined) {\n const { href, disabled, onKeyDown, onClick, ...anchorProps } = props as ButtonAsAnchor & {\n onKeyDown?: React.KeyboardEventHandler<HTMLAnchorElement>\n onClick?: React.MouseEventHandler<HTMLAnchorElement>\n }\n const isDisabled = disabled || loading\n\n // Handle Space key for anchor buttons (links only respond to Enter natively)\n const handleKeyDown = (event: React.KeyboardEvent<HTMLAnchorElement>) => {\n if (event.key === ' ' && !isDisabled) {\n event.preventDefault()\n event.currentTarget.click()\n }\n onKeyDown?.(event)\n }\n\n // Prevent click when disabled\n const handleClick = (event: React.MouseEvent<HTMLAnchorElement>) => {\n if (isDisabled) {\n event.preventDefault()\n return\n }\n onClick?.(event)\n }\n\n return (\n <a\n href={isDisabled ? undefined : href}\n role=\"button\"\n className={classes}\n aria-disabled={isDisabled || undefined}\n aria-busy={loading || undefined}\n aria-pressed={pressed}\n tabIndex={isDisabled ? -1 : 0}\n onKeyDown={handleKeyDown}\n onClick={handleClick}\n {...anchorProps}\n >\n {content}\n </a>\n )\n }\n\n const { htmlType, ...buttonProps } = props as Omit<ButtonAsButton, keyof BaseButtonProps>\n const buttonType: 'button' | 'submit' | 'reset' = htmlType ?? 'button'\n return (\n <button\n type={buttonType}\n className={classes}\n aria-busy={loading || undefined}\n aria-pressed={pressed}\n disabled={loading || buttonProps.disabled}\n {...buttonProps}\n >\n {content}\n </button>\n )\n}\n"],"names":["dBtn","dBtnPrimary","dBtnSecondary","dBtnAccent","dBtnInfo","dBtnSuccess","dBtnWarning","dBtnError","dBtnNeutral","dBtnOutline","dBtnDash","dBtnSoft","dBtnGhost","dBtnLink","dBtnXs","dBtnSm","dBtnLg","dBtnXl","dBtnActive","dBtnSquare","dBtnCircle","dBtnWide","dBtnBlock","dLoading","dLoadingSpinner","Button","children","color","variant","size","active","loading","shape","noAnimation","icon","iconPosition","danger","pressed","className","props","componentSize","useConfig","effectiveSize","effectiveColor","colorClasses","variantClasses","sizeClasses","shapeClasses","classes","iconSpacing","iconElement","jsx","SizeProvider","content","jsxs","Fragment","href","disabled","onKeyDown","onClick","anchorProps","isDisabled","event","htmlType","buttonProps"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsxs as g, jsx as c } from "react/jsx-runtime";
|
|
2
2
|
import V, { forwardRef as G, useContext as O, createContext as P } from "react";
|
|
3
|
-
import { useConfig as B } from "
|
|
3
|
+
import { useConfig as B } from "../providers/ConfigProvider.js";
|
|
4
4
|
const T = "checkbox", X = "checkbox-xs", A = "checkbox-sm", D = "checkbox-md", E = "checkbox-lg", F = "checkbox-xl", L = "checkbox-primary", M = "checkbox-secondary", W = "checkbox-accent", q = "checkbox-neutral", H = "checkbox-success", I = "checkbox-warning", J = "checkbox-info", K = "checkbox-error", Q = "swap", U = "swap-rotate", Y = "swap-flip", Z = "swap-on", _ = "swap-off", R = P(null);
|
|
5
5
|
function ee({
|
|
6
6
|
children: u,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Checkbox.js","sources":["../../src/components/Checkbox.tsx"],"sourcesContent":["import React, { forwardRef, createContext, useContext } from 'react'\nimport { useConfig } from './ConfigProvider'\n\n// DaisyUI classes\nconst dCheckbox = 'checkbox'\nconst dCheckboxXs = 'checkbox-xs'\nconst dCheckboxSm = 'checkbox-sm'\nconst dCheckboxMd = 'checkbox-md'\nconst dCheckboxLg = 'checkbox-lg'\nconst dCheckboxXl = 'checkbox-xl'\nconst dCheckboxPrimary = 'checkbox-primary'\nconst dCheckboxSecondary = 'checkbox-secondary'\nconst dCheckboxAccent = 'checkbox-accent'\nconst dCheckboxNeutral = 'checkbox-neutral'\nconst dCheckboxSuccess = 'checkbox-success'\nconst dCheckboxWarning = 'checkbox-warning'\nconst dCheckboxInfo = 'checkbox-info'\nconst dCheckboxError = 'checkbox-error'\nconst dSwap = 'swap'\nconst dSwapRotate = 'swap-rotate'\nconst dSwapFlip = 'swap-flip'\nconst dSwapOn = 'swap-on'\nconst dSwapOff = 'swap-off'\n\nexport interface CheckboxSwapConfig {\n /** Content shown when checked */\n on: React.ReactNode\n /** Content shown when unchecked */\n off: React.ReactNode\n /** Animation effect for the swap transition */\n effect?: 'rotate' | 'flip'\n}\n\nexport interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'type'> {\n children?: React.ReactNode\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n color?: 'primary' | 'secondary' | 'accent' | 'neutral' | 'success' | 'warning' | 'info' | 'error'\n indeterminate?: boolean\n /** Swap mode: toggle between two visual states instead of showing a checkbox */\n swap?: CheckboxSwapConfig\n className?: string\n}\n\nexport interface CheckboxOptionType {\n label: React.ReactNode\n value: string | number\n disabled?: boolean\n}\n\nexport interface CheckboxGroupProps {\n children?: React.ReactNode\n value?: (string | number)[]\n defaultValue?: (string | number)[]\n onChange?: (values: (string | number)[]) => void\n disabled?: boolean\n options?: (string | number | CheckboxOptionType)[]\n /** Layout direction for options */\n direction?: 'horizontal' | 'vertical'\n /** HTML name attribute for all checkboxes in the group (for form submission) */\n name?: string\n className?: string\n 'data-testid'?: string\n}\n\ninterface CheckboxGroupContextValue {\n value?: (string | number)[]\n onChange?: (checkedValue: string | number, checked: boolean) => void\n disabled?: boolean\n name?: string\n}\n\nconst CheckboxGroupContext = createContext<CheckboxGroupContextValue | null>(null)\n\nfunction CheckboxGroup({\n children,\n value,\n defaultValue,\n onChange,\n disabled = false,\n options,\n direction = 'vertical',\n name,\n className = '',\n 'data-testid': testId\n}: CheckboxGroupProps) {\n const [internalValue, setInternalValue] = React.useState<(string | number)[]>(defaultValue || [])\n const currentValue = value !== undefined ? value : internalValue\n\n const handleChange = (checkedValue: string | number, checked: boolean) => {\n const newValue = checked\n ? [...currentValue, checkedValue]\n : currentValue.filter((v) => v !== checkedValue)\n\n if (value === undefined) {\n setInternalValue(newValue)\n }\n onChange?.(newValue)\n }\n\n const contextValue: CheckboxGroupContextValue = {\n value: currentValue,\n onChange: handleChange,\n disabled,\n name,\n }\n\n // If options are provided, render checkboxes automatically\n if (options) {\n const directionClasses = direction === 'horizontal' ? 'flex flex-row flex-wrap gap-4' : 'flex flex-col gap-2'\n return (\n <CheckboxGroupContext.Provider value={contextValue}>\n <div className={`${directionClasses} ${className}`.trim()} data-testid={testId}>\n {options.map((option) => {\n if (typeof option === 'string' || typeof option === 'number') {\n const optionTestId = testId ? `${testId}-option-${option}` : undefined\n return (\n <label key={option} className=\"flex items-center cursor-pointer gap-2\">\n <CheckboxRoot value={option} data-testid={optionTestId} />\n <span>{option}</span>\n </label>\n )\n } else {\n const optionTestId = testId ? `${testId}-option-${option.value}` : undefined\n return (\n <label key={option.value} className=\"flex items-center cursor-pointer gap-2\">\n <CheckboxRoot value={option.value} disabled={option.disabled} data-testid={optionTestId} />\n <span>{option.label}</span>\n </label>\n )\n }\n })}\n </div>\n </CheckboxGroupContext.Provider>\n )\n }\n\n return (\n <CheckboxGroupContext.Provider value={contextValue}>\n <div className={className}>{children}</div>\n </CheckboxGroupContext.Provider>\n )\n}\n\nconst CheckboxRoot = forwardRef<HTMLInputElement, CheckboxProps>(\n (\n {\n children,\n size,\n color,\n indeterminate = false,\n swap,\n className = '',\n value,\n checked,\n onChange,\n disabled: disabledProp,\n ...props\n },\n ref\n ) => {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n const groupContext = useContext(CheckboxGroupContext)\n\n const sizeClasses = {\n xs: dCheckboxXs,\n sm: dCheckboxSm,\n md: dCheckboxMd,\n lg: dCheckboxLg,\n xl: dCheckboxXl,\n }\n\n const colorClasses = {\n primary: dCheckboxPrimary,\n secondary: dCheckboxSecondary,\n accent: dCheckboxAccent,\n neutral: dCheckboxNeutral,\n success: dCheckboxSuccess,\n warning: dCheckboxWarning,\n info: dCheckboxInfo,\n error: dCheckboxError,\n }\n\n const checkboxClasses = [\n dCheckbox,\n effectiveSize && sizeClasses[effectiveSize],\n color && colorClasses[color],\n ]\n .filter(Boolean)\n .join(' ')\n\n // Get name from group context or props\n const inputName = groupContext?.name ?? props.name\n\n // aria-checked should be \"mixed\" for indeterminate state\n const ariaChecked = indeterminate ? 'mixed' : undefined\n\n // If in a group, use group's value to determine checked state\n const isChecked = groupContext && value !== undefined && (typeof value === 'string' || typeof value === 'number')\n ? groupContext.value?.includes(value) ?? false\n : checked\n\n const isDisabled = groupContext?.disabled || disabledProp\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (groupContext && value !== undefined && (typeof value === 'string' || typeof value === 'number')) {\n groupContext.onChange?.(value, e.target.checked)\n }\n onChange?.(e)\n }\n\n // Handle indeterminate state\n const checkboxRef = React.useCallback(\n (node: HTMLInputElement | null) => {\n if (node) {\n node.indeterminate = indeterminate\n }\n if (typeof ref === 'function') {\n ref(node)\n } else if (ref) {\n ref.current = node\n }\n },\n [indeterminate, ref]\n )\n\n const dataState = indeterminate ? 'indeterminate' : isChecked ? 'checked' : 'unchecked'\n\n // Swap mode: render as a swap toggle instead of checkbox\n if (swap) {\n const swapClasses = [\n dSwap,\n swap.effect === 'rotate' && dSwapRotate,\n swap.effect === 'flip' && dSwapFlip,\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <label className={swapClasses}>\n <input\n ref={ref}\n type=\"checkbox\"\n name={inputName}\n checked={isChecked}\n onChange={handleChange}\n disabled={isDisabled}\n aria-checked={ariaChecked}\n data-state={dataState}\n {...props}\n />\n <div className={dSwapOn}>{swap.on}</div>\n <div className={dSwapOff}>{swap.off}</div>\n </label>\n )\n }\n\n // If children provided, wrap in label\n if (children) {\n return (\n <label className={`flex items-center cursor-pointer gap-2 ${className}`.trim()}>\n <input\n ref={checkboxRef}\n type=\"checkbox\"\n className={checkboxClasses}\n name={inputName}\n value={value}\n checked={isChecked}\n onChange={handleChange}\n disabled={isDisabled}\n aria-checked={ariaChecked}\n data-state={dataState}\n {...props}\n />\n <span>{children}</span>\n </label>\n )\n }\n\n // Bare checkbox input (no children, no swap)\n return (\n <input\n ref={checkboxRef}\n type=\"checkbox\"\n className={`${checkboxClasses} ${className}`.trim()}\n name={inputName}\n value={value}\n checked={isChecked}\n onChange={handleChange}\n disabled={isDisabled}\n aria-checked={ariaChecked}\n data-state={dataState}\n {...props}\n />\n )\n }\n)\n\nCheckboxRoot.displayName = 'Checkbox'\n\nexport const Checkbox = Object.assign(CheckboxRoot, {\n Group: CheckboxGroup,\n})\n"],"names":["dCheckbox","dCheckboxXs","dCheckboxSm","dCheckboxMd","dCheckboxLg","dCheckboxXl","dCheckboxPrimary","dCheckboxSecondary","dCheckboxAccent","dCheckboxNeutral","dCheckboxSuccess","dCheckboxWarning","dCheckboxInfo","dCheckboxError","dSwap","dSwapRotate","dSwapFlip","dSwapOn","dSwapOff","CheckboxGroupContext","createContext","CheckboxGroup","children","value","defaultValue","onChange","disabled","options","direction","name","className","testId","internalValue","setInternalValue","React","currentValue","contextValue","checkedValue","checked","newValue","v","directionClasses","jsx","option","optionTestId","jsxs","CheckboxRoot","forwardRef","size","color","indeterminate","swap","disabledProp","props","ref","componentSize","useConfig","effectiveSize","groupContext","useContext","sizeClasses","colorClasses","checkboxClasses","inputName","ariaChecked","isChecked","isDisabled","handleChange","e","checkboxRef","node","dataState","swapClasses","Checkbox"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Checkbox.js","sources":["../../src/components/Checkbox.tsx"],"sourcesContent":["import React, { forwardRef, createContext, useContext } from 'react'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dCheckbox = 'checkbox'\nconst dCheckboxXs = 'checkbox-xs'\nconst dCheckboxSm = 'checkbox-sm'\nconst dCheckboxMd = 'checkbox-md'\nconst dCheckboxLg = 'checkbox-lg'\nconst dCheckboxXl = 'checkbox-xl'\nconst dCheckboxPrimary = 'checkbox-primary'\nconst dCheckboxSecondary = 'checkbox-secondary'\nconst dCheckboxAccent = 'checkbox-accent'\nconst dCheckboxNeutral = 'checkbox-neutral'\nconst dCheckboxSuccess = 'checkbox-success'\nconst dCheckboxWarning = 'checkbox-warning'\nconst dCheckboxInfo = 'checkbox-info'\nconst dCheckboxError = 'checkbox-error'\nconst dSwap = 'swap'\nconst dSwapRotate = 'swap-rotate'\nconst dSwapFlip = 'swap-flip'\nconst dSwapOn = 'swap-on'\nconst dSwapOff = 'swap-off'\n\nexport interface CheckboxSwapConfig {\n /** Content shown when checked */\n on: React.ReactNode\n /** Content shown when unchecked */\n off: React.ReactNode\n /** Animation effect for the swap transition */\n effect?: 'rotate' | 'flip'\n}\n\nexport interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'type'> {\n children?: React.ReactNode\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n color?: 'primary' | 'secondary' | 'accent' | 'neutral' | 'success' | 'warning' | 'info' | 'error'\n indeterminate?: boolean\n /** Swap mode: toggle between two visual states instead of showing a checkbox */\n swap?: CheckboxSwapConfig\n className?: string\n}\n\nexport interface CheckboxOptionType {\n label: React.ReactNode\n value: string | number\n disabled?: boolean\n}\n\nexport interface CheckboxGroupProps {\n children?: React.ReactNode\n value?: (string | number)[]\n defaultValue?: (string | number)[]\n onChange?: (values: (string | number)[]) => void\n disabled?: boolean\n options?: (string | number | CheckboxOptionType)[]\n /** Layout direction for options */\n direction?: 'horizontal' | 'vertical'\n /** HTML name attribute for all checkboxes in the group (for form submission) */\n name?: string\n className?: string\n 'data-testid'?: string\n}\n\ninterface CheckboxGroupContextValue {\n value?: (string | number)[]\n onChange?: (checkedValue: string | number, checked: boolean) => void\n disabled?: boolean\n name?: string\n}\n\nconst CheckboxGroupContext = createContext<CheckboxGroupContextValue | null>(null)\n\nfunction CheckboxGroup({\n children,\n value,\n defaultValue,\n onChange,\n disabled = false,\n options,\n direction = 'vertical',\n name,\n className = '',\n 'data-testid': testId\n}: CheckboxGroupProps) {\n const [internalValue, setInternalValue] = React.useState<(string | number)[]>(defaultValue || [])\n const currentValue = value !== undefined ? value : internalValue\n\n const handleChange = (checkedValue: string | number, checked: boolean) => {\n const newValue = checked\n ? [...currentValue, checkedValue]\n : currentValue.filter((v) => v !== checkedValue)\n\n if (value === undefined) {\n setInternalValue(newValue)\n }\n onChange?.(newValue)\n }\n\n const contextValue: CheckboxGroupContextValue = {\n value: currentValue,\n onChange: handleChange,\n disabled,\n name,\n }\n\n // If options are provided, render checkboxes automatically\n if (options) {\n const directionClasses = direction === 'horizontal' ? 'flex flex-row flex-wrap gap-4' : 'flex flex-col gap-2'\n return (\n <CheckboxGroupContext.Provider value={contextValue}>\n <div className={`${directionClasses} ${className}`.trim()} data-testid={testId}>\n {options.map((option) => {\n if (typeof option === 'string' || typeof option === 'number') {\n const optionTestId = testId ? `${testId}-option-${option}` : undefined\n return (\n <label key={option} className=\"flex items-center cursor-pointer gap-2\">\n <CheckboxRoot value={option} data-testid={optionTestId} />\n <span>{option}</span>\n </label>\n )\n } else {\n const optionTestId = testId ? `${testId}-option-${option.value}` : undefined\n return (\n <label key={option.value} className=\"flex items-center cursor-pointer gap-2\">\n <CheckboxRoot value={option.value} disabled={option.disabled} data-testid={optionTestId} />\n <span>{option.label}</span>\n </label>\n )\n }\n })}\n </div>\n </CheckboxGroupContext.Provider>\n )\n }\n\n return (\n <CheckboxGroupContext.Provider value={contextValue}>\n <div className={className}>{children}</div>\n </CheckboxGroupContext.Provider>\n )\n}\n\nconst CheckboxRoot = forwardRef<HTMLInputElement, CheckboxProps>(\n (\n {\n children,\n size,\n color,\n indeterminate = false,\n swap,\n className = '',\n value,\n checked,\n onChange,\n disabled: disabledProp,\n ...props\n },\n ref\n ) => {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n const groupContext = useContext(CheckboxGroupContext)\n\n const sizeClasses = {\n xs: dCheckboxXs,\n sm: dCheckboxSm,\n md: dCheckboxMd,\n lg: dCheckboxLg,\n xl: dCheckboxXl,\n }\n\n const colorClasses = {\n primary: dCheckboxPrimary,\n secondary: dCheckboxSecondary,\n accent: dCheckboxAccent,\n neutral: dCheckboxNeutral,\n success: dCheckboxSuccess,\n warning: dCheckboxWarning,\n info: dCheckboxInfo,\n error: dCheckboxError,\n }\n\n const checkboxClasses = [\n dCheckbox,\n effectiveSize && sizeClasses[effectiveSize],\n color && colorClasses[color],\n ]\n .filter(Boolean)\n .join(' ')\n\n // Get name from group context or props\n const inputName = groupContext?.name ?? props.name\n\n // aria-checked should be \"mixed\" for indeterminate state\n const ariaChecked = indeterminate ? 'mixed' : undefined\n\n // If in a group, use group's value to determine checked state\n const isChecked = groupContext && value !== undefined && (typeof value === 'string' || typeof value === 'number')\n ? groupContext.value?.includes(value) ?? false\n : checked\n\n const isDisabled = groupContext?.disabled || disabledProp\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (groupContext && value !== undefined && (typeof value === 'string' || typeof value === 'number')) {\n groupContext.onChange?.(value, e.target.checked)\n }\n onChange?.(e)\n }\n\n // Handle indeterminate state\n const checkboxRef = React.useCallback(\n (node: HTMLInputElement | null) => {\n if (node) {\n node.indeterminate = indeterminate\n }\n if (typeof ref === 'function') {\n ref(node)\n } else if (ref) {\n ref.current = node\n }\n },\n [indeterminate, ref]\n )\n\n const dataState = indeterminate ? 'indeterminate' : isChecked ? 'checked' : 'unchecked'\n\n // Swap mode: render as a swap toggle instead of checkbox\n if (swap) {\n const swapClasses = [\n dSwap,\n swap.effect === 'rotate' && dSwapRotate,\n swap.effect === 'flip' && dSwapFlip,\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <label className={swapClasses}>\n <input\n ref={ref}\n type=\"checkbox\"\n name={inputName}\n checked={isChecked}\n onChange={handleChange}\n disabled={isDisabled}\n aria-checked={ariaChecked}\n data-state={dataState}\n {...props}\n />\n <div className={dSwapOn}>{swap.on}</div>\n <div className={dSwapOff}>{swap.off}</div>\n </label>\n )\n }\n\n // If children provided, wrap in label\n if (children) {\n return (\n <label className={`flex items-center cursor-pointer gap-2 ${className}`.trim()}>\n <input\n ref={checkboxRef}\n type=\"checkbox\"\n className={checkboxClasses}\n name={inputName}\n value={value}\n checked={isChecked}\n onChange={handleChange}\n disabled={isDisabled}\n aria-checked={ariaChecked}\n data-state={dataState}\n {...props}\n />\n <span>{children}</span>\n </label>\n )\n }\n\n // Bare checkbox input (no children, no swap)\n return (\n <input\n ref={checkboxRef}\n type=\"checkbox\"\n className={`${checkboxClasses} ${className}`.trim()}\n name={inputName}\n value={value}\n checked={isChecked}\n onChange={handleChange}\n disabled={isDisabled}\n aria-checked={ariaChecked}\n data-state={dataState}\n {...props}\n />\n )\n }\n)\n\nCheckboxRoot.displayName = 'Checkbox'\n\nexport const Checkbox = Object.assign(CheckboxRoot, {\n Group: CheckboxGroup,\n})\n"],"names":["dCheckbox","dCheckboxXs","dCheckboxSm","dCheckboxMd","dCheckboxLg","dCheckboxXl","dCheckboxPrimary","dCheckboxSecondary","dCheckboxAccent","dCheckboxNeutral","dCheckboxSuccess","dCheckboxWarning","dCheckboxInfo","dCheckboxError","dSwap","dSwapRotate","dSwapFlip","dSwapOn","dSwapOff","CheckboxGroupContext","createContext","CheckboxGroup","children","value","defaultValue","onChange","disabled","options","direction","name","className","testId","internalValue","setInternalValue","React","currentValue","contextValue","checkedValue","checked","newValue","v","directionClasses","jsx","option","optionTestId","jsxs","CheckboxRoot","forwardRef","size","color","indeterminate","swap","disabledProp","props","ref","componentSize","useConfig","effectiveSize","groupContext","useContext","sizeClasses","colorClasses","checkboxClasses","inputName","ariaChecked","isChecked","isDisabled","handleChange","e","checkboxRef","node","dataState","swapClasses","Checkbox"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsxs as A, jsx as f, Fragment as de } from "react/jsx-runtime";
|
|
2
2
|
import { forwardRef as ue, useState as g, useRef as U, useEffect as V, useCallback as $ } from "react";
|
|
3
|
-
import { useConfig as he } from "
|
|
3
|
+
import { useConfig as he } from "../providers/ConfigProvider.js";
|
|
4
4
|
const pe = "input", me = "input-xs", we = "input-sm", ge = "input-md", be = "input-lg", xe = "input-xl", ve = "btn", Me = "btn-ghost", ke = "btn-xs", $e = "btn-circle", Ce = [
|
|
5
5
|
"#000000",
|
|
6
6
|
"#434343",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ColorPicker.js","sources":["../../src/components/ColorPicker.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useCallback, forwardRef } from 'react'\nimport { useConfig } from './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 dBtn = 'btn'\nconst dBtnGhost = 'btn-ghost'\nconst dBtnXs = 'btn-xs'\nconst dBtnCircle = 'btn-circle'\n\nexport interface ColorPickerProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue'> {\n value?: string\n defaultValue?: string\n onChange?: (color: string) => void\n mode?: 'swatches' | 'picker' | 'both'\n presets?: string[]\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n disabled?: boolean\n showText?: boolean\n allowClear?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n 'data-testid'?: string\n}\n\nconst DEFAULT_PRESETS = [\n '#000000', '#434343', '#666666', '#999999', '#b7b7b7', '#cccccc', '#d9d9d9', '#efefef', '#f3f3f3', '#ffffff',\n '#980000', '#ff0000', '#ff9900', '#ffff00', '#00ff00', '#00ffff', '#4a86e8', '#0000ff', '#9900ff', '#ff00ff',\n '#e6b8af', '#f4cccc', '#fce5cd', '#fff2cc', '#d9ead3', '#d0e0e3', '#c9daf8', '#cfe2f3', '#d9d2e9', '#ead1dc',\n '#dd7e6b', '#ea9999', '#f9cb9c', '#ffe599', '#b6d7a8', '#a2c4c9', '#a4c2f4', '#9fc5e8', '#b4a7d6', '#d5a6bd',\n '#cc4125', '#e06666', '#f6b26b', '#ffd966', '#93c47d', '#76a5af', '#6d9eeb', '#6fa8dc', '#8e7cc3', '#c27ba0',\n '#a61c00', '#cc0000', '#e69138', '#f1c232', '#6aa84f', '#45818e', '#3c78d8', '#3d85c6', '#674ea7', '#a64d79',\n '#85200c', '#990000', '#b45f06', '#bf9000', '#38761d', '#134f5c', '#1155cc', '#0b5394', '#351c75', '#741b47',\n '#5b0f00', '#660000', '#783f04', '#7f6000', '#274e13', '#0c343d', '#1c4587', '#073763', '#20124d', '#4c1130',\n]\n\n// Convert HSL to Hex\nfunction hslToHex(h: number, s: number, l: number): string {\n s /= 100\n l /= 100\n const a = s * Math.min(l, 1 - l)\n const f = (n: number) => {\n const k = (n + h / 30) % 12\n const color = l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1)\n return Math.round(255 * color).toString(16).padStart(2, '0')\n }\n return `#${f(0)}${f(8)}${f(4)}`\n}\n\n// Convert Hex to HSL\nfunction hexToHsl(hex: string): { h: number; s: number; l: number } {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex)\n if (!result) return { h: 0, s: 100, l: 50 }\n\n let r = parseInt(result[1], 16) / 255\n let g = parseInt(result[2], 16) / 255\n let b = parseInt(result[3], 16) / 255\n\n const max = Math.max(r, g, b)\n const min = Math.min(r, g, b)\n let h = 0\n let s = 0\n const l = (max + min) / 2\n\n if (max !== min) {\n const d = max - min\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min)\n switch (max) {\n case r:\n h = ((g - b) / d + (g < b ? 6 : 0)) / 6\n break\n case g:\n h = ((b - r) / d + 2) / 6\n break\n case b:\n h = ((r - g) / d + 4) / 6\n break\n }\n }\n\n return { h: Math.round(h * 360), s: Math.round(s * 100), l: Math.round(l * 100) }\n}\n\n// Validate hex color\nfunction isValidHex(hex: string): boolean {\n return /^#[0-9A-Fa-f]{6}$/.test(hex)\n}\n\n// Normalize hex (add # if missing, uppercase)\nfunction normalizeHex(hex: string): string {\n let normalized = hex.trim()\n if (!normalized.startsWith('#')) {\n normalized = '#' + normalized\n }\n return normalized.toLowerCase()\n}\n\nexport const ColorPicker = forwardRef<HTMLDivElement, ColorPickerProps>(({\n value,\n defaultValue = '#000000',\n onChange,\n mode = 'both',\n presets = DEFAULT_PRESETS,\n size,\n disabled = false,\n showText = false,\n allowClear = false,\n open: controlledOpen,\n onOpenChange,\n className,\n 'data-testid': testId,\n ...rest\n}, ref) => {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n const initialValue = value !== undefined ? value : defaultValue\n const [internalValue, setInternalValue] = useState(initialValue)\n const currentValue = value !== undefined ? value : internalValue\n\n const [hsl, setHsl] = useState(() => hexToHsl(currentValue))\n const [hexInput, setHexInput] = useState(currentValue)\n const baseTestId = testId || 'colorpicker'\n const [isDraggingSL, setIsDraggingSL] = useState(false)\n const [isDraggingHue, setIsDraggingHue] = useState(false)\n const slPanelRef = useRef<HTMLDivElement>(null)\n const hueSliderRef = useRef<HTMLDivElement>(null)\n\n // Sync internal state when value prop changes\n useEffect(() => {\n if (value !== undefined && isValidHex(value)) {\n setHsl(hexToHsl(value))\n setHexInput(value)\n }\n }, [value])\n\n // Keyboard navigation state\n const [focusedPanel, setFocusedPanel] = useState<'sl' | 'hue' | null>(null)\n\n const updateColor = useCallback((newHsl: { h: number; s: number; l: number }) => {\n setHsl(newHsl)\n const hex = hslToHex(newHsl.h, newHsl.s, newHsl.l)\n setHexInput(hex)\n if (value === undefined) {\n setInternalValue(hex)\n }\n onChange?.(hex)\n }, [onChange, value])\n\n // Keyboard navigation for panels\n const handleKeyDown = useCallback((e: React.KeyboardEvent, panel: 'sl' | 'hue') => {\n if (disabled) return\n const step = e.shiftKey ? 10 : 1\n\n if (panel === 'sl') {\n let newS = hsl.s\n let newL = hsl.l\n switch (e.key) {\n case 'ArrowLeft':\n e.preventDefault()\n newS = Math.max(0, hsl.s - step)\n break\n case 'ArrowRight':\n e.preventDefault()\n newS = Math.min(100, hsl.s + step)\n break\n case 'ArrowUp':\n e.preventDefault()\n newL = Math.min(100, hsl.l + step)\n break\n case 'ArrowDown':\n e.preventDefault()\n newL = Math.max(0, hsl.l - step)\n break\n default:\n return\n }\n updateColor({ ...hsl, s: newS, l: newL })\n } else if (panel === 'hue') {\n let newH = hsl.h\n switch (e.key) {\n case 'ArrowLeft':\n e.preventDefault()\n newH = (hsl.h - step + 360) % 360\n break\n case 'ArrowRight':\n e.preventDefault()\n newH = (hsl.h + step) % 360\n break\n default:\n return\n }\n updateColor({ ...hsl, h: newH })\n }\n }, [disabled, hsl, updateColor])\n\n // Saturation/Lightness panel handlers\n const handleSLChange = useCallback((clientX: number, clientY: number) => {\n if (!slPanelRef.current || disabled) return\n const rect = slPanelRef.current.getBoundingClientRect()\n const x = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width))\n const y = Math.max(0, Math.min(1, (clientY - rect.top) / rect.height))\n\n // Convert x,y to saturation and lightness\n // x = saturation (0-100), y = lightness (100-0)\n const s = Math.round(x * 100)\n const l = Math.round((1 - y) * 100)\n updateColor({ ...hsl, s, l })\n }, [hsl, updateColor, disabled])\n\n const handleSLMouseDown = (e: React.MouseEvent) => {\n if (disabled) return\n setIsDraggingSL(true)\n handleSLChange(e.clientX, e.clientY)\n }\n\n // Hue slider handlers\n const handleHueChange = useCallback((clientX: number) => {\n if (!hueSliderRef.current || disabled) return\n const rect = hueSliderRef.current.getBoundingClientRect()\n const x = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width))\n const h = Math.round(x * 360)\n updateColor({ ...hsl, h })\n }, [hsl, updateColor, disabled])\n\n const handleHueMouseDown = (e: React.MouseEvent) => {\n if (disabled) return\n setIsDraggingHue(true)\n handleHueChange(e.clientX)\n }\n\n // Global mouse handlers for dragging\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n if (isDraggingSL) {\n handleSLChange(e.clientX, e.clientY)\n } else if (isDraggingHue) {\n handleHueChange(e.clientX)\n }\n }\n\n const handleMouseUp = () => {\n setIsDraggingSL(false)\n setIsDraggingHue(false)\n }\n\n if (isDraggingSL || isDraggingHue) {\n document.addEventListener('mousemove', handleMouseMove)\n document.addEventListener('mouseup', handleMouseUp)\n return () => {\n document.removeEventListener('mousemove', handleMouseMove)\n document.removeEventListener('mouseup', handleMouseUp)\n }\n }\n }, [isDraggingSL, isDraggingHue, handleSLChange, handleHueChange])\n\n // Hex input handler\n const handleHexChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value\n setHexInput(newValue)\n const normalized = normalizeHex(newValue)\n if (isValidHex(normalized)) {\n setHsl(hexToHsl(normalized))\n if (value === undefined) {\n setInternalValue(normalized)\n }\n onChange?.(normalized)\n }\n }\n\n // Preset click handler\n const handlePresetClick = (color: string) => {\n if (disabled) return\n const normalized = normalizeHex(color)\n setHsl(hexToHsl(normalized))\n setHexInput(normalized)\n if (value === undefined) {\n setInternalValue(normalized)\n }\n onChange?.(normalized)\n }\n\n // Clear handler\n const handleClear = useCallback(() => {\n if (disabled) return\n const cleared = defaultValue\n setHsl(hexToHsl(cleared))\n setHexInput(cleared)\n if (value === undefined) {\n setInternalValue(cleared)\n }\n onChange?.(cleared)\n }, [disabled, defaultValue, value, onChange])\n\n // Size configurations\n const sizeConfig = {\n xs: { panel: 'w-32 h-32', hue: 'h-3', swatch: 'w-4 h-4', input: dInputXs },\n sm: { panel: 'w-40 h-40', hue: 'h-4', swatch: 'w-5 h-5', input: dInputSm },\n md: { panel: 'w-48 h-48', hue: 'h-5', swatch: 'w-6 h-6', input: dInputMd },\n lg: { panel: 'w-56 h-56', hue: 'h-6', swatch: 'w-7 h-7', input: dInputLg },\n xl: { panel: 'w-64 h-64', hue: 'h-7', swatch: 'w-8 h-8', input: dInputXl },\n }\n\n const config = sizeConfig[effectiveSize]\n const showPicker = mode === 'picker' || mode === 'both'\n const showSwatches = mode === 'swatches' || mode === 'both'\n\n // Calculate picker position\n const slX = hsl.s / 100\n const slY = 1 - hsl.l / 100\n const hueX = hsl.h / 360\n\n return (\n <div\n ref={ref}\n className={['inline-flex flex-col gap-3', disabled ? 'opacity-50 pointer-events-none' : '', className].filter(Boolean).join(' ')}\n data-testid={baseTestId}\n {...rest}\n >\n {showPicker && (\n <>\n {/* Saturation/Lightness Panel */}\n <div\n ref={slPanelRef}\n className={[config.panel, 'relative rounded cursor-crosshair select-none', focusedPanel === 'sl' ? 'ring-2 ring-primary' : ''].filter(Boolean).join(' ')}\n style={{\n background: `\n linear-gradient(to top, #000, transparent),\n linear-gradient(to right, #fff, hsl(${hsl.h}, 100%, 50%))\n `,\n }}\n onMouseDown={handleSLMouseDown}\n onKeyDown={(e) => handleKeyDown(e, 'sl')}\n onFocus={() => setFocusedPanel('sl')}\n onBlur={() => setFocusedPanel(null)}\n tabIndex={disabled ? -1 : 0}\n role=\"slider\"\n aria-label=\"Color saturation and lightness\"\n aria-valuetext={`Saturation ${hsl.s}%, Lightness ${hsl.l}%`}\n data-testid={`${baseTestId}-sl-panel`}\n >\n {/* Picker indicator */}\n <div\n className=\"absolute w-4 h-4 border-2 border-white rounded-full shadow-md pointer-events-none\"\n style={{\n left: `calc(${slX * 100}% - 8px)`,\n top: `calc(${slY * 100}% - 8px)`,\n boxShadow: '0 0 0 1px rgba(0,0,0,0.3), 0 2px 4px rgba(0,0,0,0.3)',\n }}\n />\n </div>\n\n {/* Hue Slider */}\n <div\n ref={hueSliderRef}\n className={[config.hue, 'w-full relative rounded cursor-pointer select-none', focusedPanel === 'hue' ? 'ring-2 ring-primary' : ''].filter(Boolean).join(' ')}\n style={{\n background: 'linear-gradient(to right, #f00, #ff0, #0f0, #0ff, #00f, #f0f, #f00)',\n }}\n onMouseDown={handleHueMouseDown}\n onKeyDown={(e) => handleKeyDown(e, 'hue')}\n onFocus={() => setFocusedPanel('hue')}\n onBlur={() => setFocusedPanel(null)}\n tabIndex={disabled ? -1 : 0}\n role=\"slider\"\n aria-label=\"Color hue\"\n aria-valuemin={0}\n aria-valuemax={360}\n aria-valuenow={hsl.h}\n aria-valuetext={`Hue ${hsl.h} degrees`}\n data-testid={`${baseTestId}-hue-slider`}\n >\n {/* Hue indicator */}\n <div\n className=\"absolute top-1/2 w-3 h-full border-2 border-white rounded-sm shadow-md pointer-events-none\"\n style={{\n left: `calc(${hueX * 100}% - 6px)`,\n transform: 'translateY(-50%)',\n boxShadow: '0 0 0 1px rgba(0,0,0,0.3), 0 2px 4px rgba(0,0,0,0.3)',\n }}\n />\n </div>\n\n {/* Hex Input and Preview */}\n <div className=\"flex items-center gap-2\">\n <div\n className=\"w-8 h-8 rounded border border-base-300 flex-shrink-0\"\n style={{ backgroundColor: isValidHex(normalizeHex(hexInput)) ? normalizeHex(hexInput) : currentValue }}\n data-testid={`${baseTestId}-preview`}\n aria-label={`Color preview: ${hexInput}`}\n />\n <input\n type=\"text\"\n value={hexInput}\n onChange={handleHexChange}\n className={[dInput, config.input, 'w-full font-mono uppercase'].join(' ')}\n placeholder=\"#000000\"\n maxLength={7}\n disabled={disabled}\n aria-label=\"Hex color value\"\n data-testid={`${baseTestId}-input`}\n />\n {allowClear && !disabled && (\n <button\n type=\"button\"\n onClick={handleClear}\n className={`${dBtn} ${dBtnGhost} ${dBtnXs} ${dBtnCircle}`}\n aria-label=\"Clear color\"\n data-testid={`${baseTestId}-clear`}\n >\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n )}\n </div>\n\n {/* Show text display */}\n {showText && (\n <div className=\"text-sm font-mono text-base-content/70\" data-testid={`${baseTestId}-text`}>\n {hexInput.toUpperCase()}\n </div>\n )}\n </>\n )}\n\n {showSwatches && (\n <div className=\"grid grid-cols-10 gap-1\" role=\"listbox\" aria-label=\"Color presets\" data-testid={`${baseTestId}-swatches`}>\n {presets.map((color, index) => (\n <button\n key={`${color}-${index}`}\n type=\"button\"\n role=\"option\"\n aria-selected={currentValue.toLowerCase() === color.toLowerCase()}\n className={[\n config.swatch,\n 'rounded border border-base-300 cursor-pointer hover:scale-110 transition-transform',\n currentValue.toLowerCase() === color.toLowerCase() ? 'ring-2 ring-primary ring-offset-1' : ''\n ].filter(Boolean).join(' ')}\n style={{ backgroundColor: color }}\n onClick={() => handlePresetClick(color)}\n disabled={disabled}\n aria-label={`Select color ${color}`}\n data-testid={`${baseTestId}-swatch-${index}`}\n />\n ))}\n </div>\n )}\n </div>\n )\n})\n\nColorPicker.displayName = 'ColorPicker'\n"],"names":["dInput","dInputXs","dInputSm","dInputMd","dInputLg","dInputXl","dBtn","dBtnGhost","dBtnXs","dBtnCircle","DEFAULT_PRESETS","hslToHex","h","s","l","a","f","n","k","color","hexToHsl","hex","result","r","g","b","max","min","d","isValidHex","normalizeHex","normalized","ColorPicker","forwardRef","value","defaultValue","onChange","mode","presets","size","disabled","showText","allowClear","controlledOpen","onOpenChange","className","testId","rest","ref","componentSize","useConfig","effectiveSize","initialValue","internalValue","setInternalValue","useState","currentValue","hsl","setHsl","hexInput","setHexInput","baseTestId","isDraggingSL","setIsDraggingSL","isDraggingHue","setIsDraggingHue","slPanelRef","useRef","hueSliderRef","useEffect","focusedPanel","setFocusedPanel","updateColor","useCallback","newHsl","handleKeyDown","panel","step","newS","newL","newH","handleSLChange","clientX","clientY","rect","x","y","handleSLMouseDown","handleHueChange","handleHueMouseDown","handleMouseMove","e","handleMouseUp","handleHexChange","newValue","handlePresetClick","handleClear","cleared","config","showPicker","showSwatches","slX","slY","hueX","jsxs","Fragment","jsx","index"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ColorPicker.js","sources":["../../src/components/ColorPicker.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useCallback, forwardRef } 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 dBtn = 'btn'\nconst dBtnGhost = 'btn-ghost'\nconst dBtnXs = 'btn-xs'\nconst dBtnCircle = 'btn-circle'\n\nexport interface ColorPickerProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue'> {\n value?: string\n defaultValue?: string\n onChange?: (color: string) => void\n mode?: 'swatches' | 'picker' | 'both'\n presets?: string[]\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n disabled?: boolean\n showText?: boolean\n allowClear?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n 'data-testid'?: string\n}\n\nconst DEFAULT_PRESETS = [\n '#000000', '#434343', '#666666', '#999999', '#b7b7b7', '#cccccc', '#d9d9d9', '#efefef', '#f3f3f3', '#ffffff',\n '#980000', '#ff0000', '#ff9900', '#ffff00', '#00ff00', '#00ffff', '#4a86e8', '#0000ff', '#9900ff', '#ff00ff',\n '#e6b8af', '#f4cccc', '#fce5cd', '#fff2cc', '#d9ead3', '#d0e0e3', '#c9daf8', '#cfe2f3', '#d9d2e9', '#ead1dc',\n '#dd7e6b', '#ea9999', '#f9cb9c', '#ffe599', '#b6d7a8', '#a2c4c9', '#a4c2f4', '#9fc5e8', '#b4a7d6', '#d5a6bd',\n '#cc4125', '#e06666', '#f6b26b', '#ffd966', '#93c47d', '#76a5af', '#6d9eeb', '#6fa8dc', '#8e7cc3', '#c27ba0',\n '#a61c00', '#cc0000', '#e69138', '#f1c232', '#6aa84f', '#45818e', '#3c78d8', '#3d85c6', '#674ea7', '#a64d79',\n '#85200c', '#990000', '#b45f06', '#bf9000', '#38761d', '#134f5c', '#1155cc', '#0b5394', '#351c75', '#741b47',\n '#5b0f00', '#660000', '#783f04', '#7f6000', '#274e13', '#0c343d', '#1c4587', '#073763', '#20124d', '#4c1130',\n]\n\n// Convert HSL to Hex\nfunction hslToHex(h: number, s: number, l: number): string {\n s /= 100\n l /= 100\n const a = s * Math.min(l, 1 - l)\n const f = (n: number) => {\n const k = (n + h / 30) % 12\n const color = l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1)\n return Math.round(255 * color).toString(16).padStart(2, '0')\n }\n return `#${f(0)}${f(8)}${f(4)}`\n}\n\n// Convert Hex to HSL\nfunction hexToHsl(hex: string): { h: number; s: number; l: number } {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex)\n if (!result) return { h: 0, s: 100, l: 50 }\n\n let r = parseInt(result[1], 16) / 255\n let g = parseInt(result[2], 16) / 255\n let b = parseInt(result[3], 16) / 255\n\n const max = Math.max(r, g, b)\n const min = Math.min(r, g, b)\n let h = 0\n let s = 0\n const l = (max + min) / 2\n\n if (max !== min) {\n const d = max - min\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min)\n switch (max) {\n case r:\n h = ((g - b) / d + (g < b ? 6 : 0)) / 6\n break\n case g:\n h = ((b - r) / d + 2) / 6\n break\n case b:\n h = ((r - g) / d + 4) / 6\n break\n }\n }\n\n return { h: Math.round(h * 360), s: Math.round(s * 100), l: Math.round(l * 100) }\n}\n\n// Validate hex color\nfunction isValidHex(hex: string): boolean {\n return /^#[0-9A-Fa-f]{6}$/.test(hex)\n}\n\n// Normalize hex (add # if missing, uppercase)\nfunction normalizeHex(hex: string): string {\n let normalized = hex.trim()\n if (!normalized.startsWith('#')) {\n normalized = '#' + normalized\n }\n return normalized.toLowerCase()\n}\n\nexport const ColorPicker = forwardRef<HTMLDivElement, ColorPickerProps>(({\n value,\n defaultValue = '#000000',\n onChange,\n mode = 'both',\n presets = DEFAULT_PRESETS,\n size,\n disabled = false,\n showText = false,\n allowClear = false,\n open: controlledOpen,\n onOpenChange,\n className,\n 'data-testid': testId,\n ...rest\n}, ref) => {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n const initialValue = value !== undefined ? value : defaultValue\n const [internalValue, setInternalValue] = useState(initialValue)\n const currentValue = value !== undefined ? value : internalValue\n\n const [hsl, setHsl] = useState(() => hexToHsl(currentValue))\n const [hexInput, setHexInput] = useState(currentValue)\n const baseTestId = testId || 'colorpicker'\n const [isDraggingSL, setIsDraggingSL] = useState(false)\n const [isDraggingHue, setIsDraggingHue] = useState(false)\n const slPanelRef = useRef<HTMLDivElement>(null)\n const hueSliderRef = useRef<HTMLDivElement>(null)\n\n // Sync internal state when value prop changes\n useEffect(() => {\n if (value !== undefined && isValidHex(value)) {\n setHsl(hexToHsl(value))\n setHexInput(value)\n }\n }, [value])\n\n // Keyboard navigation state\n const [focusedPanel, setFocusedPanel] = useState<'sl' | 'hue' | null>(null)\n\n const updateColor = useCallback((newHsl: { h: number; s: number; l: number }) => {\n setHsl(newHsl)\n const hex = hslToHex(newHsl.h, newHsl.s, newHsl.l)\n setHexInput(hex)\n if (value === undefined) {\n setInternalValue(hex)\n }\n onChange?.(hex)\n }, [onChange, value])\n\n // Keyboard navigation for panels\n const handleKeyDown = useCallback((e: React.KeyboardEvent, panel: 'sl' | 'hue') => {\n if (disabled) return\n const step = e.shiftKey ? 10 : 1\n\n if (panel === 'sl') {\n let newS = hsl.s\n let newL = hsl.l\n switch (e.key) {\n case 'ArrowLeft':\n e.preventDefault()\n newS = Math.max(0, hsl.s - step)\n break\n case 'ArrowRight':\n e.preventDefault()\n newS = Math.min(100, hsl.s + step)\n break\n case 'ArrowUp':\n e.preventDefault()\n newL = Math.min(100, hsl.l + step)\n break\n case 'ArrowDown':\n e.preventDefault()\n newL = Math.max(0, hsl.l - step)\n break\n default:\n return\n }\n updateColor({ ...hsl, s: newS, l: newL })\n } else if (panel === 'hue') {\n let newH = hsl.h\n switch (e.key) {\n case 'ArrowLeft':\n e.preventDefault()\n newH = (hsl.h - step + 360) % 360\n break\n case 'ArrowRight':\n e.preventDefault()\n newH = (hsl.h + step) % 360\n break\n default:\n return\n }\n updateColor({ ...hsl, h: newH })\n }\n }, [disabled, hsl, updateColor])\n\n // Saturation/Lightness panel handlers\n const handleSLChange = useCallback((clientX: number, clientY: number) => {\n if (!slPanelRef.current || disabled) return\n const rect = slPanelRef.current.getBoundingClientRect()\n const x = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width))\n const y = Math.max(0, Math.min(1, (clientY - rect.top) / rect.height))\n\n // Convert x,y to saturation and lightness\n // x = saturation (0-100), y = lightness (100-0)\n const s = Math.round(x * 100)\n const l = Math.round((1 - y) * 100)\n updateColor({ ...hsl, s, l })\n }, [hsl, updateColor, disabled])\n\n const handleSLMouseDown = (e: React.MouseEvent) => {\n if (disabled) return\n setIsDraggingSL(true)\n handleSLChange(e.clientX, e.clientY)\n }\n\n // Hue slider handlers\n const handleHueChange = useCallback((clientX: number) => {\n if (!hueSliderRef.current || disabled) return\n const rect = hueSliderRef.current.getBoundingClientRect()\n const x = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width))\n const h = Math.round(x * 360)\n updateColor({ ...hsl, h })\n }, [hsl, updateColor, disabled])\n\n const handleHueMouseDown = (e: React.MouseEvent) => {\n if (disabled) return\n setIsDraggingHue(true)\n handleHueChange(e.clientX)\n }\n\n // Global mouse handlers for dragging\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n if (isDraggingSL) {\n handleSLChange(e.clientX, e.clientY)\n } else if (isDraggingHue) {\n handleHueChange(e.clientX)\n }\n }\n\n const handleMouseUp = () => {\n setIsDraggingSL(false)\n setIsDraggingHue(false)\n }\n\n if (isDraggingSL || isDraggingHue) {\n document.addEventListener('mousemove', handleMouseMove)\n document.addEventListener('mouseup', handleMouseUp)\n return () => {\n document.removeEventListener('mousemove', handleMouseMove)\n document.removeEventListener('mouseup', handleMouseUp)\n }\n }\n }, [isDraggingSL, isDraggingHue, handleSLChange, handleHueChange])\n\n // Hex input handler\n const handleHexChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value\n setHexInput(newValue)\n const normalized = normalizeHex(newValue)\n if (isValidHex(normalized)) {\n setHsl(hexToHsl(normalized))\n if (value === undefined) {\n setInternalValue(normalized)\n }\n onChange?.(normalized)\n }\n }\n\n // Preset click handler\n const handlePresetClick = (color: string) => {\n if (disabled) return\n const normalized = normalizeHex(color)\n setHsl(hexToHsl(normalized))\n setHexInput(normalized)\n if (value === undefined) {\n setInternalValue(normalized)\n }\n onChange?.(normalized)\n }\n\n // Clear handler\n const handleClear = useCallback(() => {\n if (disabled) return\n const cleared = defaultValue\n setHsl(hexToHsl(cleared))\n setHexInput(cleared)\n if (value === undefined) {\n setInternalValue(cleared)\n }\n onChange?.(cleared)\n }, [disabled, defaultValue, value, onChange])\n\n // Size configurations\n const sizeConfig = {\n xs: { panel: 'w-32 h-32', hue: 'h-3', swatch: 'w-4 h-4', input: dInputXs },\n sm: { panel: 'w-40 h-40', hue: 'h-4', swatch: 'w-5 h-5', input: dInputSm },\n md: { panel: 'w-48 h-48', hue: 'h-5', swatch: 'w-6 h-6', input: dInputMd },\n lg: { panel: 'w-56 h-56', hue: 'h-6', swatch: 'w-7 h-7', input: dInputLg },\n xl: { panel: 'w-64 h-64', hue: 'h-7', swatch: 'w-8 h-8', input: dInputXl },\n }\n\n const config = sizeConfig[effectiveSize]\n const showPicker = mode === 'picker' || mode === 'both'\n const showSwatches = mode === 'swatches' || mode === 'both'\n\n // Calculate picker position\n const slX = hsl.s / 100\n const slY = 1 - hsl.l / 100\n const hueX = hsl.h / 360\n\n return (\n <div\n ref={ref}\n className={['inline-flex flex-col gap-3', disabled ? 'opacity-50 pointer-events-none' : '', className].filter(Boolean).join(' ')}\n data-testid={baseTestId}\n {...rest}\n >\n {showPicker && (\n <>\n {/* Saturation/Lightness Panel */}\n <div\n ref={slPanelRef}\n className={[config.panel, 'relative rounded cursor-crosshair select-none', focusedPanel === 'sl' ? 'ring-2 ring-primary' : ''].filter(Boolean).join(' ')}\n style={{\n background: `\n linear-gradient(to top, #000, transparent),\n linear-gradient(to right, #fff, hsl(${hsl.h}, 100%, 50%))\n `,\n }}\n onMouseDown={handleSLMouseDown}\n onKeyDown={(e) => handleKeyDown(e, 'sl')}\n onFocus={() => setFocusedPanel('sl')}\n onBlur={() => setFocusedPanel(null)}\n tabIndex={disabled ? -1 : 0}\n role=\"slider\"\n aria-label=\"Color saturation and lightness\"\n aria-valuetext={`Saturation ${hsl.s}%, Lightness ${hsl.l}%`}\n data-testid={`${baseTestId}-sl-panel`}\n >\n {/* Picker indicator */}\n <div\n className=\"absolute w-4 h-4 border-2 border-white rounded-full shadow-md pointer-events-none\"\n style={{\n left: `calc(${slX * 100}% - 8px)`,\n top: `calc(${slY * 100}% - 8px)`,\n boxShadow: '0 0 0 1px rgba(0,0,0,0.3), 0 2px 4px rgba(0,0,0,0.3)',\n }}\n />\n </div>\n\n {/* Hue Slider */}\n <div\n ref={hueSliderRef}\n className={[config.hue, 'w-full relative rounded cursor-pointer select-none', focusedPanel === 'hue' ? 'ring-2 ring-primary' : ''].filter(Boolean).join(' ')}\n style={{\n background: 'linear-gradient(to right, #f00, #ff0, #0f0, #0ff, #00f, #f0f, #f00)',\n }}\n onMouseDown={handleHueMouseDown}\n onKeyDown={(e) => handleKeyDown(e, 'hue')}\n onFocus={() => setFocusedPanel('hue')}\n onBlur={() => setFocusedPanel(null)}\n tabIndex={disabled ? -1 : 0}\n role=\"slider\"\n aria-label=\"Color hue\"\n aria-valuemin={0}\n aria-valuemax={360}\n aria-valuenow={hsl.h}\n aria-valuetext={`Hue ${hsl.h} degrees`}\n data-testid={`${baseTestId}-hue-slider`}\n >\n {/* Hue indicator */}\n <div\n className=\"absolute top-1/2 w-3 h-full border-2 border-white rounded-sm shadow-md pointer-events-none\"\n style={{\n left: `calc(${hueX * 100}% - 6px)`,\n transform: 'translateY(-50%)',\n boxShadow: '0 0 0 1px rgba(0,0,0,0.3), 0 2px 4px rgba(0,0,0,0.3)',\n }}\n />\n </div>\n\n {/* Hex Input and Preview */}\n <div className=\"flex items-center gap-2\">\n <div\n className=\"w-8 h-8 rounded border border-base-300 flex-shrink-0\"\n style={{ backgroundColor: isValidHex(normalizeHex(hexInput)) ? normalizeHex(hexInput) : currentValue }}\n data-testid={`${baseTestId}-preview`}\n aria-label={`Color preview: ${hexInput}`}\n />\n <input\n type=\"text\"\n value={hexInput}\n onChange={handleHexChange}\n className={[dInput, config.input, 'w-full font-mono uppercase'].join(' ')}\n placeholder=\"#000000\"\n maxLength={7}\n disabled={disabled}\n aria-label=\"Hex color value\"\n data-testid={`${baseTestId}-input`}\n />\n {allowClear && !disabled && (\n <button\n type=\"button\"\n onClick={handleClear}\n className={`${dBtn} ${dBtnGhost} ${dBtnXs} ${dBtnCircle}`}\n aria-label=\"Clear color\"\n data-testid={`${baseTestId}-clear`}\n >\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n )}\n </div>\n\n {/* Show text display */}\n {showText && (\n <div className=\"text-sm font-mono text-base-content/70\" data-testid={`${baseTestId}-text`}>\n {hexInput.toUpperCase()}\n </div>\n )}\n </>\n )}\n\n {showSwatches && (\n <div className=\"grid grid-cols-10 gap-1\" role=\"listbox\" aria-label=\"Color presets\" data-testid={`${baseTestId}-swatches`}>\n {presets.map((color, index) => (\n <button\n key={`${color}-${index}`}\n type=\"button\"\n role=\"option\"\n aria-selected={currentValue.toLowerCase() === color.toLowerCase()}\n className={[\n config.swatch,\n 'rounded border border-base-300 cursor-pointer hover:scale-110 transition-transform',\n currentValue.toLowerCase() === color.toLowerCase() ? 'ring-2 ring-primary ring-offset-1' : ''\n ].filter(Boolean).join(' ')}\n style={{ backgroundColor: color }}\n onClick={() => handlePresetClick(color)}\n disabled={disabled}\n aria-label={`Select color ${color}`}\n data-testid={`${baseTestId}-swatch-${index}`}\n />\n ))}\n </div>\n )}\n </div>\n )\n})\n\nColorPicker.displayName = 'ColorPicker'\n"],"names":["dInput","dInputXs","dInputSm","dInputMd","dInputLg","dInputXl","dBtn","dBtnGhost","dBtnXs","dBtnCircle","DEFAULT_PRESETS","hslToHex","h","s","l","a","f","n","k","color","hexToHsl","hex","result","r","g","b","max","min","d","isValidHex","normalizeHex","normalized","ColorPicker","forwardRef","value","defaultValue","onChange","mode","presets","size","disabled","showText","allowClear","controlledOpen","onOpenChange","className","testId","rest","ref","componentSize","useConfig","effectiveSize","initialValue","internalValue","setInternalValue","useState","currentValue","hsl","setHsl","hexInput","setHexInput","baseTestId","isDraggingSL","setIsDraggingSL","isDraggingHue","setIsDraggingHue","slPanelRef","useRef","hueSliderRef","useEffect","focusedPanel","setFocusedPanel","updateColor","useCallback","newHsl","handleKeyDown","panel","step","newS","newL","newH","handleSLChange","clientX","clientY","rect","x","y","handleSLMouseDown","handleHueChange","handleHueMouseDown","handleMouseMove","e","handleMouseUp","handleHexChange","newValue","handlePresetClick","handleClear","cleared","config","showPicker","showSwatches","slX","slY","hueX","jsxs","Fragment","jsx","index"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as t } from "react/jsx-runtime";
|
|
2
2
|
import { useClipboard as D } from "../hooks/useClipboard.js";
|
|
3
3
|
import { SizeProvider as F, useSize as p } from "../contexts/SizeContext.js";
|
|
4
|
-
import { useConfig as G } from "
|
|
4
|
+
import { useConfig as G } from "../providers/ConfigProvider.js";
|
|
5
5
|
const H = "btn", M = "btn-primary", O = "btn-secondary", V = "btn-accent", J = "btn-info", h = "btn-success", K = "btn-warning", Q = "btn-error", R = "btn-neutral", U = "btn-outline", Y = "btn-dash", Z = "btn-soft", _ = "btn-ghost", $ = "btn-link", T = "btn-xs", tt = "btn-sm", nt = "btn-lg", ot = "btn-xl", st = "btn-square", et = "btn-circle", ct = "tooltip", B = {
|
|
6
6
|
xs: "w-3.5 h-3.5",
|
|
7
7
|
sm: "w-3.5 h-3.5",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CopyButton.js","sources":["../../src/components/CopyButton.tsx"],"sourcesContent":["import React from 'react'\nimport { useClipboard } from '../hooks/useClipboard'\nimport { SizeProvider, useSize } from '../contexts/SizeContext'\nimport { useConfig } from '
|
|
1
|
+
{"version":3,"file":"CopyButton.js","sources":["../../src/components/CopyButton.tsx"],"sourcesContent":["import React from 'react'\nimport { useClipboard } from '../hooks/useClipboard'\nimport { SizeProvider, useSize } from '../contexts/SizeContext'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dBtn = 'btn'\nconst dBtnPrimary = 'btn-primary'\nconst dBtnSecondary = 'btn-secondary'\nconst dBtnAccent = 'btn-accent'\nconst dBtnInfo = 'btn-info'\nconst dBtnSuccess = 'btn-success'\nconst dBtnWarning = 'btn-warning'\nconst dBtnError = 'btn-error'\nconst dBtnNeutral = 'btn-neutral'\nconst dBtnOutline = 'btn-outline'\nconst dBtnDash = 'btn-dash'\nconst dBtnSoft = 'btn-soft'\nconst dBtnGhost = 'btn-ghost'\nconst dBtnLink = 'btn-link'\nconst dBtnXs = 'btn-xs'\nconst dBtnSm = 'btn-sm'\nconst dBtnLg = 'btn-lg'\nconst dBtnXl = 'btn-xl'\nconst dBtnSquare = 'btn-square'\nconst dBtnCircle = 'btn-circle'\nconst dTooltip = 'tooltip'\n\nconst iconSizeClasses = {\n xs: 'w-3.5 h-3.5',\n sm: 'w-3.5 h-3.5',\n md: 'w-4 h-4',\n lg: 'w-5 h-5',\n xl: 'w-6 h-6',\n}\n\nexport type CopyButtonPosition = 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left'\n\nexport interface CopyButtonProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children' | 'onError'> {\n /** Text to copy to clipboard */\n text: string\n /** Duration in ms to show copied state */\n timeout?: number\n /** Button color */\n color?: 'primary' | 'secondary' | 'accent' | 'info' | 'success' | 'warning' | 'error' | 'neutral'\n /** Button style variant */\n variant?: 'solid' | 'outline' | 'dash' | 'soft' | 'ghost' | 'link'\n /** Button size */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n /** Button shape */\n shape?: 'square' | 'circle'\n /** Absolute position within parent (parent must have position: relative) */\n position?: CopyButtonPosition\n /** Custom icon for default state */\n icon?: React.ReactNode\n /** Custom icon for copied state */\n copiedIcon?: React.ReactNode\n /** Custom content for default state (overrides icon) */\n children?: React.ReactNode\n /** Custom content for copied state */\n copiedChildren?: React.ReactNode\n /** Callback when copy succeeds */\n onCopy?: () => void\n /** Callback when copy fails */\n onError?: (error: Error) => void\n /** Show tooltip with copy status */\n showTooltip?: boolean\n /** Tooltip text for default state */\n tooltipText?: string\n /** Tooltip text for copied state */\n copiedTooltipText?: string\n}\n\nconst CopyIcon: React.FC = () => {\n const size = useSize() ?? 'md'\n return (\n <svg\n className={iconSizeClasses[size]}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\" />\n </svg>\n )\n}\n\nconst CheckIcon: React.FC = () => {\n const size = useSize() ?? 'md'\n return (\n <svg\n className={iconSizeClasses[size]}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"m4.5 12.75 6 6 9-13.5\" />\n </svg>\n )\n}\n\nconst positionClasses: Record<CopyButtonPosition, string> = {\n 'top-right': 'absolute top-2 right-2',\n 'top-left': 'absolute top-2 left-2',\n 'bottom-right': 'absolute bottom-2 right-2',\n 'bottom-left': 'absolute bottom-2 left-2',\n}\n\nexport const CopyButton: React.FC<CopyButtonProps> = ({\n text,\n timeout = 2000,\n color,\n variant,\n size,\n shape,\n position,\n icon,\n copiedIcon,\n children,\n copiedChildren,\n onCopy,\n onError,\n showTooltip = false,\n tooltipText = 'Copy',\n copiedTooltipText = 'Copied!',\n className = '',\n disabled,\n onClick,\n ...rest\n}) => {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n const { copy, copied } = useClipboard(timeout)\n\n const handleClick = async (e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e)\n if (disabled) return\n\n const success = await copy(text)\n if (success) {\n onCopy?.()\n } else {\n onError?.(new Error('Failed to copy to clipboard'))\n }\n }\n\n const colorClasses = {\n primary: dBtnPrimary,\n secondary: dBtnSecondary,\n accent: dBtnAccent,\n info: dBtnInfo,\n success: dBtnSuccess,\n warning: dBtnWarning,\n error: dBtnError,\n neutral: dBtnNeutral,\n }\n\n const variantClasses = {\n solid: '',\n outline: dBtnOutline,\n dash: dBtnDash,\n soft: dBtnSoft,\n ghost: dBtnGhost,\n link: dBtnLink,\n }\n\n const sizeClasses = {\n xs: dBtnXs,\n sm: dBtnSm,\n md: '',\n lg: dBtnLg,\n xl: dBtnXl,\n }\n\n const shapeClasses = {\n square: dBtnSquare,\n circle: dBtnCircle,\n }\n\n const classes = [\n dBtn,\n color && colorClasses[color],\n copied && dBtnSuccess,\n variant && variantClasses[variant],\n sizeClasses[effectiveSize],\n shape && shapeClasses[shape],\n // Only add position classes if not using tooltip (tooltip wrapper gets them instead)\n !showTooltip && position && positionClasses[position],\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const defaultIcon = icon ?? <CopyIcon />\n const successIcon = copiedIcon ?? <CheckIcon />\n\n const content = copied\n ? (copiedChildren ?? successIcon)\n : (children ?? defaultIcon)\n\n const button = (\n <button\n type=\"button\"\n className={classes}\n onClick={handleClick}\n disabled={disabled}\n aria-label={copied ? copiedTooltipText : tooltipText}\n {...rest}\n >\n <SizeProvider size={effectiveSize}>\n {content}\n </SizeProvider>\n </button>\n )\n\n if (showTooltip) {\n const tooltipClasses = [dTooltip, position && positionClasses[position]].filter(Boolean).join(' ')\n return (\n <div className={tooltipClasses} data-tip={copied ? copiedTooltipText : tooltipText}>\n {button}\n </div>\n )\n }\n\n return button\n}\n\nCopyButton.displayName = 'CopyButton'\n"],"names":["dBtn","dBtnPrimary","dBtnSecondary","dBtnAccent","dBtnInfo","dBtnSuccess","dBtnWarning","dBtnError","dBtnNeutral","dBtnOutline","dBtnDash","dBtnSoft","dBtnGhost","dBtnLink","dBtnXs","dBtnSm","dBtnLg","dBtnXl","dBtnSquare","dBtnCircle","dTooltip","iconSizeClasses","CopyIcon","size","useSize","jsx","CheckIcon","positionClasses","CopyButton","text","timeout","color","variant","shape","position","icon","copiedIcon","children","copiedChildren","onCopy","onError","showTooltip","tooltipText","copiedTooltipText","className","disabled","onClick","rest","componentSize","useConfig","effectiveSize","copy","copied","useClipboard","handleClick","colorClasses","variantClasses","sizeClasses","shapeClasses","classes","button","SizeProvider","tooltipClasses"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsxs as c, jsx as s, Fragment as N } from "react/jsx-runtime";
|
|
2
2
|
import { useState as D, useCallback as k, useEffect as I } from "react";
|
|
3
|
-
import { useConfig as E } from "
|
|
3
|
+
import { useConfig as E } from "../providers/ConfigProvider.js";
|
|
4
4
|
const F = "countdown", U = "--value", V = "--digits", T = (t) => {
|
|
5
5
|
const e = t - Date.now();
|
|
6
6
|
return e <= 0 ? { days: 0, hours: 0, minutes: 0, seconds: 0 } : {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Countdown.js","sources":["../../src/components/Countdown.tsx"],"sourcesContent":["import React, { useEffect, useState, useCallback } from 'react'\nimport { useConfig } from '
|
|
1
|
+
{"version":3,"file":"Countdown.js","sources":["../../src/components/Countdown.tsx"],"sourcesContent":["import React, { useEffect, useState, useCallback } from 'react'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dCountdown = 'countdown'\nconst dCssValue = '--value'\nconst dCssDigits = '--digits'\n\nexport interface CountdownProps {\n /** Target timestamp in milliseconds or Date object */\n value: number | Date\n /** Format string: 'D' days, 'H' hours, 'M' minutes, 'S' seconds */\n format?: string\n /** Callback when countdown reaches zero */\n onFinish?: () => void\n /** Callback on each tick with remaining time */\n onChange?: (value: number) => void\n /** Additional CSS classes */\n className?: string\n /** Size variant */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n /** Show labels under each unit */\n showLabels?: boolean\n /** Custom labels */\n labels?: {\n days?: string\n hours?: string\n minutes?: string\n seconds?: string\n }\n /** Show box style around each unit */\n boxed?: boolean\n}\n\ninterface TimeLeft {\n days: number\n hours: number\n minutes: number\n seconds: number\n}\n\nconst calculateTimeLeft = (targetTime: number): TimeLeft => {\n const difference = targetTime - Date.now()\n\n if (difference <= 0) {\n return { days: 0, hours: 0, minutes: 0, seconds: 0 }\n }\n\n return {\n days: Math.floor(difference / (1000 * 60 * 60 * 24)),\n hours: Math.floor((difference / (1000 * 60 * 60)) % 24),\n minutes: Math.floor((difference / 1000 / 60) % 60),\n seconds: Math.floor((difference / 1000) % 60),\n }\n}\n\nconst CountdownUnit: React.FC<{\n value: number\n label?: string\n size?: CountdownProps['size']\n showLabel?: boolean\n boxed?: boolean\n}> = ({ value, label, size, showLabel, boxed }) => {\n const sizeClasses = {\n xs: 'text-lg',\n sm: 'text-2xl',\n md: 'text-4xl',\n lg: 'text-5xl',\n xl: 'text-6xl',\n }\n\n const content = (\n <span className={`${dCountdown} font-mono ${sizeClasses[size || 'md']}`}>\n <span\n style={{ [dCssValue]: value, [dCssDigits]: 2 } as React.CSSProperties}\n aria-live=\"polite\"\n aria-label={String(value)}\n >\n {String(value).padStart(2, '0')}\n </span>\n </span>\n )\n\n if (boxed) {\n return (\n <div className=\"flex flex-col items-center bg-neutral text-neutral-content rounded-box p-2\">\n {content}\n {showLabel && label && <span className=\"text-xs mt-1\">{label}</span>}\n </div>\n )\n }\n\n if (showLabel) {\n return (\n <div className=\"flex flex-col items-center\">\n {content}\n {label && <span className=\"text-xs text-base-content/70\">{label}</span>}\n </div>\n )\n }\n\n return content\n}\n\nexport const Countdown: React.FC<CountdownProps> = ({\n value,\n format = 'HH:MM:SS',\n onFinish,\n onChange,\n className = '',\n size,\n showLabels = false,\n labels = {},\n boxed = false,\n}) => {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n const targetTime = value instanceof Date ? value.getTime() : value\n const [timeLeft, setTimeLeft] = useState<TimeLeft>(() => calculateTimeLeft(targetTime))\n const [finished, setFinished] = useState(false)\n\n const defaultLabels = {\n days: labels.days || 'days',\n hours: labels.hours || 'hours',\n minutes: labels.minutes || 'min',\n seconds: labels.seconds || 'sec',\n }\n\n const tick = useCallback(() => {\n const newTimeLeft = calculateTimeLeft(targetTime)\n setTimeLeft(newTimeLeft)\n\n const remaining = targetTime - Date.now()\n onChange?.(Math.max(0, remaining))\n\n if (remaining <= 0 && !finished) {\n setFinished(true)\n onFinish?.()\n }\n }, [targetTime, onChange, onFinish, finished])\n\n useEffect(() => {\n const timer = setInterval(tick, 1000)\n tick() // Initial tick\n\n return () => clearInterval(timer)\n }, [tick])\n\n const showDays = format.includes('D')\n const showHours = format.includes('H')\n const showMinutes = format.includes('M')\n const showSeconds = format.includes('S')\n\n const separatorSize = effectiveSize === 'lg' || effectiveSize === 'xl' ? 'text-3xl' : effectiveSize === 'md' ? 'text-2xl' : 'text-xl'\n const showSeparators = !showLabels && !boxed\n\n return (\n <div className={`flex gap-4 items-center ${className}`}>\n {showDays && (\n <>\n <CountdownUnit\n value={timeLeft.days}\n label={defaultLabels.days}\n size={effectiveSize}\n showLabel={showLabels}\n boxed={boxed}\n />\n {showSeparators && (showHours || showMinutes || showSeconds) && (\n <span className={separatorSize}>:</span>\n )}\n </>\n )}\n {showHours && (\n <>\n <CountdownUnit\n value={timeLeft.hours}\n label={defaultLabels.hours}\n size={effectiveSize}\n showLabel={showLabels}\n boxed={boxed}\n />\n {showSeparators && (showMinutes || showSeconds) && (\n <span className={separatorSize}>:</span>\n )}\n </>\n )}\n {showMinutes && (\n <>\n <CountdownUnit\n value={timeLeft.minutes}\n label={defaultLabels.minutes}\n size={effectiveSize}\n showLabel={showLabels}\n boxed={boxed}\n />\n {showSeparators && showSeconds && <span className={separatorSize}>:</span>}\n </>\n )}\n {showSeconds && (\n <CountdownUnit\n value={timeLeft.seconds}\n label={defaultLabels.seconds}\n size={effectiveSize}\n showLabel={showLabels}\n boxed={boxed}\n />\n )}\n </div>\n )\n}\n\nCountdown.displayName = 'Countdown'\n"],"names":["dCountdown","dCssValue","dCssDigits","calculateTimeLeft","targetTime","difference","CountdownUnit","value","label","size","showLabel","boxed","content","jsx","jsxs","Countdown","format","onFinish","onChange","className","showLabels","labels","componentSize","useConfig","effectiveSize","timeLeft","setTimeLeft","useState","finished","setFinished","defaultLabels","tick","useCallback","newTimeLeft","remaining","useEffect","timer","showDays","showHours","showMinutes","showSeconds","separatorSize","showSeparators","Fragment"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsxs as f, jsx as t } from "react/jsx-runtime";
|
|
2
2
|
import { forwardRef as J, useState as m, useRef as P, useEffect as Y } from "react";
|
|
3
3
|
import { Input as V } from "./Input.js";
|
|
4
|
-
import { useConfig as G } from "
|
|
4
|
+
import { useConfig as G } from "../providers/ConfigProvider.js";
|
|
5
5
|
const M = "btn", y = "btn-ghost", S = "btn-sm", F = "btn-square", H = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"], W = [
|
|
6
6
|
"January",
|
|
7
7
|
"February",
|