@bigbinary/neeto-atoms 1.0.10 → 1.0.12
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/{Accordion-BzfsJePA.js → Accordion-Ch9S_qd3.js} +3 -3
- package/dist/Accordion-Ch9S_qd3.js.map +1 -0
- package/dist/{ColorPicker-D-7QGnf9.js → ColorPicker-DtOvy0Gy.js} +3 -2
- package/dist/ColorPicker-DtOvy0Gy.js.map +1 -0
- package/dist/Input-C1gcv9o2.js.map +1 -1
- package/dist/MultiEmailInput-SCTYovtX.js.map +1 -1
- package/dist/RadioGroup-BNeYQAoT.js.map +1 -1
- package/dist/{Select-BGODpJGc.js → Select-TlFBcxcY.js} +7 -3
- package/dist/Select-TlFBcxcY.js.map +1 -0
- package/dist/Textarea-C0z50h0N.js.map +1 -1
- package/dist/TimePickerPanel-CiF0RExY.js.map +1 -1
- package/dist/TranslationProvider-Ba9rn47H.js.map +1 -1
- package/dist/{Tree-Dkr11OPy.js → Tree-C7r10UY5.js} +2 -2
- package/dist/{Tree-Dkr11OPy.js.map → Tree-C7r10UY5.js.map} +1 -1
- package/dist/{TreeSelect-Cmc90YWJ.js → TreeSelect-DRGcYz-6.js} +2 -2
- package/dist/{TreeSelect-Cmc90YWJ.js.map → TreeSelect-DRGcYz-6.js.map} +1 -1
- package/dist/{Typography-D5TjXEfu.js → Typography-CMJ8OveZ.js} +3 -9
- package/dist/Typography-CMJ8OveZ.js.map +1 -0
- package/dist/cjs/{Accordion-BX5I9ypV.js → Accordion-BoTckTBI.js} +3 -3
- package/dist/cjs/Accordion-BoTckTBI.js.map +1 -0
- package/dist/cjs/{ColorPicker-DEELmqH8.js → ColorPicker-Uxgn8U0h.js} +3 -2
- package/dist/cjs/ColorPicker-Uxgn8U0h.js.map +1 -0
- package/dist/cjs/Input-pkugjUb0.js.map +1 -1
- package/dist/cjs/MultiEmailInput-l0_YVjbp.js.map +1 -1
- package/dist/cjs/RadioGroup-1RAoe38m.js.map +1 -1
- package/dist/cjs/{Select-DOPZHlqc.js → Select-Br1AT_wm.js} +7 -3
- package/dist/cjs/Select-Br1AT_wm.js.map +1 -0
- package/dist/cjs/Textarea-BfdlAJ59.js.map +1 -1
- package/dist/cjs/TimePickerPanel-DGNr97cj.js.map +1 -1
- package/dist/cjs/TranslationProvider-DBZHXmzX.js.map +1 -1
- package/dist/cjs/{Tree-qpOcsGL9.js → Tree-BPd0DuLh.js} +2 -2
- package/dist/cjs/{Tree-qpOcsGL9.js.map → Tree-BPd0DuLh.js.map} +1 -1
- package/dist/cjs/{TreeSelect-DiIEdiAU.js → TreeSelect-C9nQJKNo.js} +2 -2
- package/dist/cjs/{TreeSelect-DiIEdiAU.js.map → TreeSelect-C9nQJKNo.js.map} +1 -1
- package/dist/cjs/{Typography-C3rGpmAY.js → Typography-PojQmdAY.js} +3 -28
- package/dist/cjs/Typography-PojQmdAY.js.map +1 -0
- package/dist/cjs/components/Accordion.js +1 -1
- package/dist/cjs/components/ColorPicker.js +1 -1
- package/dist/cjs/components/DropdownMenu.js.map +1 -1
- package/dist/cjs/components/Select.js +1 -1
- package/dist/cjs/components/Tree.js +6 -34
- package/dist/cjs/components/Tree.js.map +1 -1
- package/dist/cjs/components/TreeSelect.js +2 -2
- package/dist/cjs/components/Typography.js +1 -1
- package/dist/cjs/components/index.js +180 -0
- package/dist/cjs/components/index.js.map +1 -0
- package/dist/cjs/formik/ActionBlock.js +48 -0
- package/dist/cjs/formik/ActionBlock.js.map +1 -0
- package/dist/cjs/formik/BlockNavigation.js +111 -0
- package/dist/cjs/formik/BlockNavigation.js.map +1 -0
- package/dist/cjs/formik/Select.js +2 -2
- package/dist/cjs/formik/Select.js.map +1 -1
- package/dist/cjs/formik/TreeSelect.js +2 -2
- package/dist/cjs/formik/index.js +12 -3
- package/dist/cjs/formik/index.js.map +1 -1
- package/dist/cjs/index.js +10 -9
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/search-CfYUGi4v.js +37 -0
- package/dist/cjs/search-CfYUGi4v.js.map +1 -0
- package/dist/components/Accordion/Accordion.d.ts +3 -1
- package/dist/components/Accordion.js +1 -1
- package/dist/components/ColorPicker/ColorPicker.d.ts +1 -2
- package/dist/components/ColorPicker/Palette.d.ts +1 -1
- package/dist/components/ColorPicker/types.d.ts +6 -1
- package/dist/components/ColorPicker.js +1 -1
- package/dist/components/DropdownMenu/MenuItemButton.d.ts +1 -2
- package/dist/components/DropdownMenu/index.d.ts +1 -0
- package/dist/components/DropdownMenu.js.map +1 -1
- package/dist/components/Input/Input.d.ts +3 -1
- package/dist/components/MultiEmailInput/MultiEmailInput.d.ts +1 -2
- package/dist/components/RadioGroup/RadioGroup.d.ts +1 -1
- package/dist/components/RadioGroup/index.d.ts +1 -1
- package/dist/components/Select/Select.d.ts +1 -2
- package/dist/components/Select.js +1 -1
- package/dist/components/Textarea/Textarea.d.ts +3 -1
- package/dist/components/TimePicker/TimePickerPanel.d.ts +1 -2
- package/dist/components/Tree.js +2 -34
- package/dist/components/Tree.js.map +1 -1
- package/dist/components/TreeSelect.js +2 -2
- package/dist/components/Typography/Typography.d.ts +11 -4
- package/dist/components/Typography.js +1 -1
- package/dist/components/index.d.ts +36 -0
- package/dist/components/index.js +128 -0
- package/dist/components/index.js.map +1 -0
- package/dist/formik/ActionBlock.d.ts +18 -0
- package/dist/formik/ActionBlock.js +46 -0
- package/dist/formik/ActionBlock.js.map +1 -0
- package/dist/formik/BlockNavigation/BlockNavigationAlert.d.ts +23 -0
- package/dist/formik/BlockNavigation/index.d.ts +11 -0
- package/dist/formik/BlockNavigation.js +109 -0
- package/dist/formik/BlockNavigation.js.map +1 -0
- package/dist/formik/RadioGroup.d.ts +11 -0
- package/dist/formik/Select.js +2 -2
- package/dist/formik/Select.js.map +1 -1
- package/dist/formik/TreeSelect.js +2 -2
- package/dist/formik/index.d.ts +4 -0
- package/dist/formik/index.js +10 -3
- package/dist/formik/index.js.map +1 -1
- package/dist/hooks/useNavPrompt.d.ts +15 -0
- package/dist/index.js +10 -9
- package/dist/index.js.map +1 -1
- package/dist/search-BK7Ozh5_.js +33 -0
- package/dist/search-BK7Ozh5_.js.map +1 -0
- package/package.json +18 -7
- package/dist/Accordion-BzfsJePA.js.map +0 -1
- package/dist/ColorPicker-D-7QGnf9.js.map +0 -1
- package/dist/Select-BGODpJGc.js.map +0 -1
- package/dist/Typography-D5TjXEfu.js.map +0 -1
- package/dist/cjs/Accordion-BX5I9ypV.js.map +0 -1
- package/dist/cjs/ColorPicker-DEELmqH8.js.map +0 -1
- package/dist/cjs/Select-DOPZHlqc.js.map +0 -1
- package/dist/cjs/Typography-C3rGpmAY.js.map +0 -1
- package/dist/shadcn/components/typography.d.ts +0 -17
|
@@ -3,7 +3,7 @@ import { useId, useMemo, useState, useCallback, useRef, forwardRef } from 'react
|
|
|
3
3
|
import { c as cn } from './utils-DdHUxIdC.js';
|
|
4
4
|
import { Popover, PopoverTrigger, PopoverContent } from './primitives/Popover.js';
|
|
5
5
|
import { S as SelectFieldWrapper } from './SelectFieldWrapper-BJzq9aCY.js';
|
|
6
|
-
import { f as findNode, w as walkTree, T as Tree } from './Tree-
|
|
6
|
+
import { f as findNode, w as walkTree, T as Tree } from './Tree-C7r10UY5.js';
|
|
7
7
|
import { X } from './x-_o2T3n6D.js';
|
|
8
8
|
import { C as ChevronDown } from './chevron-down-BNi0ntys.js';
|
|
9
9
|
|
|
@@ -165,4 +165,4 @@ const TreeSelect = forwardRef((props, ref) => {
|
|
|
165
165
|
TreeSelect.displayName = "TreeSelect";
|
|
166
166
|
|
|
167
167
|
export { TreeSelect as T };
|
|
168
|
-
//# sourceMappingURL=TreeSelect-
|
|
168
|
+
//# sourceMappingURL=TreeSelect-DRGcYz-6.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TreeSelect-Cmc90YWJ.js","sources":["../src/components/TreeSelect/utils/pruneTree.ts","../src/components/TreeSelect/utils/resolveFieldNames.ts","../src/components/TreeSelect/hooks/useTreeSelectValue.ts","../src/components/TreeSelect/hooks/useTreeSelectState.ts","../src/components/TreeSelect/constants.ts","../src/components/TreeSelect/TreeSelectTrigger.tsx","../src/components/TreeSelect/TreeSelect.tsx"],"sourcesContent":["import type { TreeNodeData } from \"../../Tree/types\";\n\nexport const pruneTree = (\n nodes: TreeNodeData[],\n searchTerm: string\n): TreeNodeData[] => {\n if (!searchTerm.trim()) return nodes;\n\n const lower = searchTerm.toLowerCase();\n\n const prune = (items: TreeNodeData[]): TreeNodeData[] =>\n items.reduce<TreeNodeData[]>((acc, node) => {\n const titleStr = typeof node.title === \"string\" ? node.title : \"\";\n const nodeMatches = titleStr.toLowerCase().includes(lower);\n\n if (nodeMatches) {\n acc.push(node);\n } else {\n const prunedChildren = node.children ? prune(node.children) : [];\n if (prunedChildren.length > 0) {\n acc.push({ ...node, children: prunedChildren });\n }\n }\n\n return acc;\n }, []);\n\n return prune(nodes);\n};\n","import type { ReactNode } from \"react\";\nimport type { TreeNodeData } from \"../../Tree/types\";\n\nexport const resolveFieldNames = (\n nodes: Record<string, unknown>[],\n fieldNames: { label?: string; value?: string }\n): TreeNodeData[] => {\n const labelKey = fieldNames.label ?? \"title\";\n const valueKey = fieldNames.value ?? \"key\";\n\n const remap = (items: Record<string, unknown>[]): TreeNodeData[] =>\n items.map(item => ({\n key: String(item[valueKey] ?? \"\"),\n title: item[labelKey] as ReactNode,\n disabled: item.disabled as boolean | undefined,\n children: Array.isArray(item.children)\n ? remap(item.children as Record<string, unknown>[])\n : undefined,\n }));\n\n return remap(nodes);\n};\n","import { useCallback, useId, useMemo, useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { findNode } from \"../../Tree/utils/adapter\";\nimport type { TreeSelectProps } from \"../types\";\nimport { resolveFieldNames } from \"../utils/resolveFieldNames\";\n\nexport function useTreeSelectValue(props: TreeSelectProps) {\n const {\n value: valueProp,\n defaultValue,\n onChange,\n treeData: rawTreeData,\n fieldNames,\n isClearable = false,\n isDisabled = false,\n size = \"medium\",\n label = \"\",\n error = \"\",\n helpText = \"\" as ReactNode,\n required = false,\n } = props;\n\n const id = useId();\n const errorId = `error_${id}`;\n const helpTextId = `helpText_${id}`;\n\n const treeData = useMemo(() => {\n if (!fieldNames) return rawTreeData;\n\n return resolveFieldNames(\n rawTreeData as unknown as Record<string, unknown>[],\n fieldNames\n );\n }, [rawTreeData, fieldNames?.label, fieldNames?.value]);\n\n const isControlled = valueProp !== undefined;\n const [internalValue, setInternalValue] = useState(defaultValue ?? \"\");\n const currentValue = isControlled ? (valueProp ?? \"\") : internalValue;\n\n const applyValue = useCallback(\n (next: string) => {\n if (!isControlled) setInternalValue(next);\n onChange?.(next);\n },\n [isControlled, onChange]\n );\n\n const selectedLabel = useMemo(() => {\n if (!currentValue) return \"\";\n const node = findNode(currentValue, treeData);\n if (!node) return currentValue;\n\n return typeof node.title === \"string\" ? node.title : \"\";\n }, [currentValue, treeData]);\n\n const handleClear = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n applyValue(\"\");\n },\n [applyValue]\n );\n\n const showClearButton = isClearable && !!currentValue && !isDisabled;\n\n return {\n id,\n errorId,\n helpTextId,\n label,\n error,\n helpText,\n required,\n isDisabled,\n size,\n treeData,\n currentValue,\n selectedLabel,\n applyValue,\n handleClear,\n showClearButton,\n };\n}\n","import { useCallback, useMemo, useRef, useState } from \"react\";\nimport type { TreeNodeData } from \"../../Tree/types\";\nimport { walkTree } from \"../../Tree/utils/adapter\";\nimport type { TreeSelectProps } from \"../types\";\nimport { pruneTree } from \"../utils/pruneTree\";\nimport { useTreeSelectValue } from \"./useTreeSelectValue\";\n\nexport function useTreeSelectState(props: TreeSelectProps) {\n const { isSearchable = false, defaultExpandedKeys } = props;\n const defaultExpandedKeysRef = useRef(defaultExpandedKeys);\n defaultExpandedKeysRef.current = defaultExpandedKeys;\n const value = useTreeSelectValue(props);\n\n const [isOpen, setIsOpen] = useState(false);\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [expandedKeys, setExpandedKeys] = useState<string[]>(\n defaultExpandedKeys ?? []\n );\n\n const prunedTreeData = useMemo(\n () =>\n searchTerm.trim()\n ? pruneTree(value.treeData, searchTerm)\n : value.treeData,\n [value.treeData, searchTerm]\n );\n\n const effectiveExpandedKeys = useMemo(() => {\n if (!searchTerm) return expandedKeys;\n\n const allKeys: string[] = [];\n walkTree(prunedTreeData, node => {\n if (node.children?.length) allKeys.push(node.key);\n });\n\n return allKeys;\n }, [searchTerm, prunedTreeData]);\n\n const handleSelect = useCallback(\n (keys: string[], info: { node: TreeNodeData }) => {\n if (value.isDisabled || info.node.disabled) return;\n value.applyValue(keys[0] ?? \"\");\n setIsOpen(false);\n setSearchTerm(\"\");\n },\n [value.applyValue, value.isDisabled]\n );\n\n const handleOpenChange = useCallback(\n (open: boolean) => {\n if (value.isDisabled) return;\n setIsOpen(open);\n if (!open) {\n setSearchTerm(\"\");\n setExpandedKeys(defaultExpandedKeysRef.current ?? []);\n }\n },\n [value.isDisabled]\n );\n\n const handleExpand = useCallback(\n (keys: string[]) => setExpandedKeys(keys),\n []\n );\n\n return {\n ...value,\n isSearchable,\n isOpen,\n handleOpenChange,\n searchTerm,\n setSearchTerm,\n prunedTreeData,\n effectiveExpandedKeys,\n handleSelect,\n handleExpand,\n };\n}\n","export const DROPDOWN_HEIGHT = 256;\n\nexport const SIZE_CONFIG: Record<\n \"small\" | \"medium\" | \"large\",\n { trigger: string; text: string }\n> = {\n small: { trigger: \"min-h-7 px-2 py-0.5\", text: \"text-xs\" },\n medium: { trigger: \"min-h-8 px-2.5 py-1\", text: \"text-sm\" },\n large: { trigger: \"min-h-10 px-2.5 py-1.5\", text: \"text-sm\" },\n};\n","import { forwardRef, type ReactNode } from \"react\";\nimport { ChevronDown, X } from \"lucide-react\";\nimport { cn } from \"src/shadcn/lib/utils\";\nimport { SIZE_CONFIG } from \"./constants\";\n\ninterface TreeSelectTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n size: \"small\" | \"medium\" | \"large\";\n currentValue: string;\n selectedLabel: string;\n placeholder?: string;\n isDisabled: boolean;\n error: string;\n showClearButton: boolean;\n handleClear: (e: React.MouseEvent) => void;\n suffixIcon?: ReactNode;\n}\n\nexport const TreeSelectTrigger = forwardRef<\n HTMLButtonElement,\n TreeSelectTriggerProps\n>(\n (\n {\n size,\n currentValue,\n selectedLabel,\n placeholder,\n isDisabled,\n error,\n showClearButton,\n handleClear,\n suffixIcon,\n className,\n ...rest\n },\n ref\n ) => (\n <button\n ref={ref}\n type=\"button\"\n disabled={isDisabled}\n {...rest}\n className={cn(\n \"inline-flex w-full items-center gap-1 rounded-md border border-input bg-background outline-none\",\n \"hover:bg-accent focus:ring-1 focus:ring-ring\",\n \"disabled:pointer-events-none disabled:opacity-50\",\n error && \"border-destructive\",\n SIZE_CONFIG[size].trigger,\n SIZE_CONFIG[size].text,\n className\n )}\n >\n <span\n className={cn(\n \"flex-1 truncate text-left\",\n !currentValue && \"text-muted-foreground\"\n )}\n >\n {selectedLabel || placeholder || \"\"}\n </span>\n {showClearButton && (\n <span\n role=\"button\"\n tabIndex={-1}\n aria-label=\"Clear selection\"\n className=\"shrink-0 text-muted-foreground hover:text-foreground\"\n onClick={handleClear}\n >\n <X className=\"size-3.5\" />\n </span>\n )}\n {suffixIcon ?? <ChevronDown className=\"size-4 shrink-0 opacity-50\" />}\n </button>\n )\n);\n\nTreeSelectTrigger.displayName = \"TreeSelectTrigger\";\n","import { forwardRef } from \"react\";\nimport { cn } from \"src/shadcn/lib/utils\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"src/primitives/Popover\";\nimport { SelectFieldWrapper } from \"../Select/SelectFieldWrapper\";\nimport { Tree } from \"../Tree\";\nimport { useTreeSelectState } from \"./hooks/useTreeSelectState\";\nimport { TreeSelectTrigger } from \"./TreeSelectTrigger\";\nimport { SIZE_CONFIG, DROPDOWN_HEIGHT } from \"./constants\";\nimport type { TreeSelectProps } from \"./types\";\n\nconst TreeSelect = forwardRef<HTMLButtonElement, TreeSelectProps>(\n (props, ref) => {\n const s = useTreeSelectState(props);\n const { suffixIcon, switcherIcon, autoExpandParent, className } = props;\n\n return (\n <SelectFieldWrapper\n id={s.id}\n label={s.label}\n error={s.error}\n helpText={s.helpText}\n errorId={s.errorId}\n helpTextId={s.helpTextId}\n isDisabled={s.isDisabled}\n required={s.required}\n className={className}\n >\n <Popover open={s.isOpen} onOpenChange={s.handleOpenChange}>\n <PopoverTrigger asChild>\n <TreeSelectTrigger\n ref={ref}\n currentValue={s.currentValue}\n error={s.error}\n handleClear={s.handleClear}\n isDisabled={s.isDisabled}\n placeholder={props.placeholder}\n selectedLabel={s.selectedLabel}\n showClearButton={s.showClearButton}\n size={s.size}\n suffixIcon={suffixIcon}\n />\n </PopoverTrigger>\n <PopoverContent\n align=\"start\"\n className=\"w-[var(--radix-popover-trigger-width)] p-0\"\n onOpenAutoFocus={e => {\n if (s.isSearchable) e.preventDefault();\n }}\n >\n {s.isSearchable && (\n <div className=\"border-b px-2 py-1.5\">\n <input\n autoFocus\n type=\"text\"\n className={cn(\n \"w-full bg-transparent outline-none placeholder:text-muted-foreground\",\n SIZE_CONFIG[s.size].text\n )}\n placeholder=\"Search...\"\n value={s.searchTerm}\n onChange={e => s.setSearchTerm(e.target.value)}\n />\n </div>\n )}\n {s.prunedTreeData.length > 0 ? (\n <div className=\"p-1\">\n <Tree\n autoExpandParent={autoExpandParent}\n expandedKeys={s.effectiveExpandedKeys}\n height={DROPDOWN_HEIGHT}\n switcherIcon={switcherIcon}\n treeData={s.prunedTreeData}\n onExpand={s.handleExpand}\n onSelect={s.handleSelect}\n />\n </div>\n ) : (\n <div className=\"py-6 text-center text-sm text-muted-foreground\">\n No results found.\n </div>\n )}\n </PopoverContent>\n </Popover>\n </SelectFieldWrapper>\n );\n }\n);\n\nTreeSelect.displayName = \"TreeSelect\";\n\nexport { TreeSelect };\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TreeSelect-DRGcYz-6.js","sources":["../src/components/TreeSelect/utils/pruneTree.ts","../src/components/TreeSelect/utils/resolveFieldNames.ts","../src/components/TreeSelect/hooks/useTreeSelectValue.ts","../src/components/TreeSelect/hooks/useTreeSelectState.ts","../src/components/TreeSelect/constants.ts","../src/components/TreeSelect/TreeSelectTrigger.tsx","../src/components/TreeSelect/TreeSelect.tsx"],"sourcesContent":["import type { TreeNodeData } from \"../../Tree/types\";\n\nexport const pruneTree = (\n nodes: TreeNodeData[],\n searchTerm: string\n): TreeNodeData[] => {\n if (!searchTerm.trim()) return nodes;\n\n const lower = searchTerm.toLowerCase();\n\n const prune = (items: TreeNodeData[]): TreeNodeData[] =>\n items.reduce<TreeNodeData[]>((acc, node) => {\n const titleStr = typeof node.title === \"string\" ? node.title : \"\";\n const nodeMatches = titleStr.toLowerCase().includes(lower);\n\n if (nodeMatches) {\n acc.push(node);\n } else {\n const prunedChildren = node.children ? prune(node.children) : [];\n if (prunedChildren.length > 0) {\n acc.push({ ...node, children: prunedChildren });\n }\n }\n\n return acc;\n }, []);\n\n return prune(nodes);\n};\n","import type { ReactNode } from \"react\";\nimport type { TreeNodeData } from \"../../Tree/types\";\n\nexport const resolveFieldNames = (\n nodes: Record<string, unknown>[],\n fieldNames: { label?: string; value?: string }\n): TreeNodeData[] => {\n const labelKey = fieldNames.label ?? \"title\";\n const valueKey = fieldNames.value ?? \"key\";\n\n const remap = (items: Record<string, unknown>[]): TreeNodeData[] =>\n items.map(item => ({\n key: String(item[valueKey] ?? \"\"),\n title: item[labelKey] as ReactNode,\n disabled: item.disabled as boolean | undefined,\n children: Array.isArray(item.children)\n ? remap(item.children as Record<string, unknown>[])\n : undefined,\n }));\n\n return remap(nodes);\n};\n","import { useCallback, useId, useMemo, useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { findNode } from \"../../Tree/utils/adapter\";\nimport type { TreeSelectProps } from \"../types\";\nimport { resolveFieldNames } from \"../utils/resolveFieldNames\";\n\nexport function useTreeSelectValue(props: TreeSelectProps) {\n const {\n value: valueProp,\n defaultValue,\n onChange,\n treeData: rawTreeData,\n fieldNames,\n isClearable = false,\n isDisabled = false,\n size = \"medium\",\n label = \"\",\n error = \"\",\n helpText = \"\" as ReactNode,\n required = false,\n } = props;\n\n const id = useId();\n const errorId = `error_${id}`;\n const helpTextId = `helpText_${id}`;\n\n const treeData = useMemo(() => {\n if (!fieldNames) return rawTreeData;\n\n return resolveFieldNames(\n rawTreeData as unknown as Record<string, unknown>[],\n fieldNames\n );\n }, [rawTreeData, fieldNames?.label, fieldNames?.value]);\n\n const isControlled = valueProp !== undefined;\n const [internalValue, setInternalValue] = useState(defaultValue ?? \"\");\n const currentValue = isControlled ? (valueProp ?? \"\") : internalValue;\n\n const applyValue = useCallback(\n (next: string) => {\n if (!isControlled) setInternalValue(next);\n onChange?.(next);\n },\n [isControlled, onChange]\n );\n\n const selectedLabel = useMemo(() => {\n if (!currentValue) return \"\";\n const node = findNode(currentValue, treeData);\n if (!node) return currentValue;\n\n return typeof node.title === \"string\" ? node.title : \"\";\n }, [currentValue, treeData]);\n\n const handleClear = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n applyValue(\"\");\n },\n [applyValue]\n );\n\n const showClearButton = isClearable && !!currentValue && !isDisabled;\n\n return {\n id,\n errorId,\n helpTextId,\n label,\n error,\n helpText,\n required,\n isDisabled,\n size,\n treeData,\n currentValue,\n selectedLabel,\n applyValue,\n handleClear,\n showClearButton,\n };\n}\n","import { useCallback, useMemo, useRef, useState } from \"react\";\nimport type { TreeNodeData } from \"../../Tree/types\";\nimport { walkTree } from \"../../Tree/utils/adapter\";\nimport type { TreeSelectProps } from \"../types\";\nimport { pruneTree } from \"../utils/pruneTree\";\nimport { useTreeSelectValue } from \"./useTreeSelectValue\";\n\nexport function useTreeSelectState(props: TreeSelectProps) {\n const { isSearchable = false, defaultExpandedKeys } = props;\n const defaultExpandedKeysRef = useRef(defaultExpandedKeys);\n defaultExpandedKeysRef.current = defaultExpandedKeys;\n const value = useTreeSelectValue(props);\n\n const [isOpen, setIsOpen] = useState(false);\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [expandedKeys, setExpandedKeys] = useState<string[]>(\n defaultExpandedKeys ?? []\n );\n\n const prunedTreeData = useMemo(\n () =>\n searchTerm.trim()\n ? pruneTree(value.treeData, searchTerm)\n : value.treeData,\n [value.treeData, searchTerm]\n );\n\n const effectiveExpandedKeys = useMemo(() => {\n if (!searchTerm) return expandedKeys;\n\n const allKeys: string[] = [];\n walkTree(prunedTreeData, node => {\n if (node.children?.length) allKeys.push(node.key);\n });\n\n return allKeys;\n }, [searchTerm, prunedTreeData]);\n\n const handleSelect = useCallback(\n (keys: string[], info: { node: TreeNodeData }) => {\n if (value.isDisabled || info.node.disabled) return;\n value.applyValue(keys[0] ?? \"\");\n setIsOpen(false);\n setSearchTerm(\"\");\n },\n [value.applyValue, value.isDisabled]\n );\n\n const handleOpenChange = useCallback(\n (open: boolean) => {\n if (value.isDisabled) return;\n setIsOpen(open);\n if (!open) {\n setSearchTerm(\"\");\n setExpandedKeys(defaultExpandedKeysRef.current ?? []);\n }\n },\n [value.isDisabled]\n );\n\n const handleExpand = useCallback(\n (keys: string[]) => setExpandedKeys(keys),\n []\n );\n\n return {\n ...value,\n isSearchable,\n isOpen,\n handleOpenChange,\n searchTerm,\n setSearchTerm,\n prunedTreeData,\n effectiveExpandedKeys,\n handleSelect,\n handleExpand,\n };\n}\n","export const DROPDOWN_HEIGHT = 256;\n\nexport const SIZE_CONFIG: Record<\n \"small\" | \"medium\" | \"large\",\n { trigger: string; text: string }\n> = {\n small: { trigger: \"min-h-7 px-2 py-0.5\", text: \"text-xs\" },\n medium: { trigger: \"min-h-8 px-2.5 py-1\", text: \"text-sm\" },\n large: { trigger: \"min-h-10 px-2.5 py-1.5\", text: \"text-sm\" },\n};\n","import { forwardRef, type ReactNode } from \"react\";\nimport { ChevronDown, X } from \"lucide-react\";\nimport { cn } from \"src/shadcn/lib/utils\";\nimport { SIZE_CONFIG } from \"./constants\";\n\ninterface TreeSelectTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n size: \"small\" | \"medium\" | \"large\";\n currentValue: string;\n selectedLabel: string;\n placeholder?: string;\n isDisabled: boolean;\n error: string;\n showClearButton: boolean;\n handleClear: (e: React.MouseEvent) => void;\n suffixIcon?: ReactNode;\n}\n\nexport const TreeSelectTrigger = forwardRef<\n HTMLButtonElement,\n TreeSelectTriggerProps\n>(\n (\n {\n size,\n currentValue,\n selectedLabel,\n placeholder,\n isDisabled,\n error,\n showClearButton,\n handleClear,\n suffixIcon,\n className,\n ...rest\n },\n ref\n ) => (\n <button\n ref={ref}\n type=\"button\"\n disabled={isDisabled}\n {...rest}\n className={cn(\n \"inline-flex w-full items-center gap-1 rounded-md border border-input bg-background outline-none\",\n \"hover:bg-accent focus:ring-1 focus:ring-ring\",\n \"disabled:pointer-events-none disabled:opacity-50\",\n error && \"border-destructive\",\n SIZE_CONFIG[size].trigger,\n SIZE_CONFIG[size].text,\n className\n )}\n >\n <span\n className={cn(\n \"flex-1 truncate text-left\",\n !currentValue && \"text-muted-foreground\"\n )}\n >\n {selectedLabel || placeholder || \"\"}\n </span>\n {showClearButton && (\n <span\n role=\"button\"\n tabIndex={-1}\n aria-label=\"Clear selection\"\n className=\"shrink-0 text-muted-foreground hover:text-foreground\"\n onClick={handleClear}\n >\n <X className=\"size-3.5\" />\n </span>\n )}\n {suffixIcon ?? <ChevronDown className=\"size-4 shrink-0 opacity-50\" />}\n </button>\n )\n);\n\nTreeSelectTrigger.displayName = \"TreeSelectTrigger\";\n","import { forwardRef } from \"react\";\nimport { cn } from \"src/shadcn/lib/utils\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"src/primitives/Popover\";\nimport { SelectFieldWrapper } from \"../Select/SelectFieldWrapper\";\nimport { Tree } from \"../Tree\";\nimport { useTreeSelectState } from \"./hooks/useTreeSelectState\";\nimport { TreeSelectTrigger } from \"./TreeSelectTrigger\";\nimport { SIZE_CONFIG, DROPDOWN_HEIGHT } from \"./constants\";\nimport type { TreeSelectProps } from \"./types\";\n\nconst TreeSelect = forwardRef<HTMLButtonElement, TreeSelectProps>(\n (props, ref) => {\n const s = useTreeSelectState(props);\n const { suffixIcon, switcherIcon, autoExpandParent, className } = props;\n\n return (\n <SelectFieldWrapper\n id={s.id}\n label={s.label}\n error={s.error}\n helpText={s.helpText}\n errorId={s.errorId}\n helpTextId={s.helpTextId}\n isDisabled={s.isDisabled}\n required={s.required}\n className={className}\n >\n <Popover open={s.isOpen} onOpenChange={s.handleOpenChange}>\n <PopoverTrigger asChild>\n <TreeSelectTrigger\n ref={ref}\n currentValue={s.currentValue}\n error={s.error}\n handleClear={s.handleClear}\n isDisabled={s.isDisabled}\n placeholder={props.placeholder}\n selectedLabel={s.selectedLabel}\n showClearButton={s.showClearButton}\n size={s.size}\n suffixIcon={suffixIcon}\n />\n </PopoverTrigger>\n <PopoverContent\n align=\"start\"\n className=\"w-[var(--radix-popover-trigger-width)] p-0\"\n onOpenAutoFocus={e => {\n if (s.isSearchable) e.preventDefault();\n }}\n >\n {s.isSearchable && (\n <div className=\"border-b px-2 py-1.5\">\n <input\n autoFocus\n type=\"text\"\n className={cn(\n \"w-full bg-transparent outline-none placeholder:text-muted-foreground\",\n SIZE_CONFIG[s.size].text\n )}\n placeholder=\"Search...\"\n value={s.searchTerm}\n onChange={e => s.setSearchTerm(e.target.value)}\n />\n </div>\n )}\n {s.prunedTreeData.length > 0 ? (\n <div className=\"p-1\">\n <Tree\n autoExpandParent={autoExpandParent}\n expandedKeys={s.effectiveExpandedKeys}\n height={DROPDOWN_HEIGHT}\n switcherIcon={switcherIcon}\n treeData={s.prunedTreeData}\n onExpand={s.handleExpand}\n onSelect={s.handleSelect}\n />\n </div>\n ) : (\n <div className=\"py-6 text-center text-sm text-muted-foreground\">\n No results found.\n </div>\n )}\n </PopoverContent>\n </Popover>\n </SelectFieldWrapper>\n );\n }\n);\n\nTreeSelect.displayName = \"TreeSelect\";\n\nexport { TreeSelect };\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { jsx } from 'react/jsx-runtime';
|
|
2
|
-
import * as React from 'react';
|
|
3
2
|
import { forwardRef } from 'react';
|
|
4
3
|
import { c as cva } from './index-D7Zy7P05.js';
|
|
5
4
|
import { c as cn } from './utils-DdHUxIdC.js';
|
|
@@ -67,16 +66,11 @@ const defaultElementMap = {
|
|
|
67
66
|
nano: "span",
|
|
68
67
|
code: "code",
|
|
69
68
|
};
|
|
70
|
-
const Typography
|
|
71
|
-
const Comp = asChild
|
|
72
|
-
? Slot
|
|
73
|
-
: defaultElementMap[variant ?? "body3"] ?? "p";
|
|
69
|
+
const Typography = forwardRef(({ className, variant = "body3", weight, color = "default", lineClamp, asChild = false, ...props }, ref) => {
|
|
70
|
+
const Comp = (asChild ? Slot : (defaultElementMap[variant ?? "body3"] ?? "p"));
|
|
74
71
|
return (jsx(Comp, { ref: ref, "data-slot": "typography", "data-variant": variant, className: cn(typographyVariants({ variant, weight, color, lineClamp, className })), ...props }));
|
|
75
72
|
});
|
|
76
|
-
Typography$1.displayName = "Typography";
|
|
77
|
-
|
|
78
|
-
const Typography = forwardRef((props, ref) => jsx(Typography$1, { ref: ref, ...props }));
|
|
79
73
|
Typography.displayName = "Typography";
|
|
80
74
|
|
|
81
75
|
export { Typography as T, typographyVariants as t };
|
|
82
|
-
//# sourceMappingURL=Typography-
|
|
76
|
+
//# sourceMappingURL=Typography-CMJ8OveZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Typography-CMJ8OveZ.js","sources":["../src/components/Typography/Typography.tsx"],"sourcesContent":["import React, { forwardRef } from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { Slot } from \"radix-ui\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\n\nconst typographyVariants = cva(\"\", {\n variants: {\n variant: {\n jumbo: \"text-5xl font-semibold leading-none tracking-tight\",\n h1: \"text-[40px] font-semibold leading-tight tracking-tight\",\n h2: \"text-[32px] font-semibold leading-tight tracking-tight\",\n h3: \"text-[28px] font-semibold leading-tight tracking-tight\",\n h4: \"text-2xl font-semibold leading-tight\",\n h5: \"text-xl font-semibold leading-tight\",\n h6: \"text-lg font-semibold leading-tight\",\n body1: \"text-base leading-normal\",\n body2: \"text-[15px] leading-normal\",\n body3: \"text-sm leading-normal\",\n caption: \"text-xs leading-normal\",\n nano: \"text-[10px] leading-normal\",\n code: \"font-mono text-sm\",\n },\n weight: {\n thin: \"font-thin\",\n extralight: \"font-extralight\",\n light: \"font-light\",\n normal: \"font-normal\",\n medium: \"font-medium\",\n semibold: \"font-semibold\",\n bold: \"font-bold\",\n extrabold: \"font-extrabold\",\n black: \"font-black\",\n },\n color: {\n default: \"text-foreground\",\n muted: \"text-muted-foreground\",\n primary: \"text-primary\",\n destructive: \"text-destructive\",\n inherit: \"text-inherit\",\n },\n lineClamp: {\n none: \"\",\n 1: \"line-clamp-1\",\n 2: \"line-clamp-2\",\n 3: \"line-clamp-3\",\n },\n },\n defaultVariants: {\n variant: \"body3\",\n color: \"default\",\n },\n});\n\nconst defaultElementMap: Record<string, keyof React.JSX.IntrinsicElements> = {\n jumbo: \"h1\",\n h1: \"h1\",\n h2: \"h2\",\n h3: \"h3\",\n h4: \"h4\",\n h5: \"h5\",\n h6: \"h6\",\n body1: \"p\",\n body2: \"p\",\n body3: \"p\",\n caption: \"span\",\n nano: \"span\",\n code: \"code\",\n};\n\nconst Typography = forwardRef<\n HTMLElement,\n React.ComponentProps<\"p\"> &\n VariantProps<typeof typographyVariants> & {\n asChild?: boolean;\n }\n>(\n (\n {\n className,\n variant = \"body3\",\n weight,\n color = \"default\",\n lineClamp,\n asChild = false,\n ...props\n },\n ref\n ) => {\n const Comp = (\n asChild ? Slot.Root : (defaultElementMap[variant ?? \"body3\"] ?? \"p\")\n ) as React.ElementType;\n\n return (\n <Comp\n ref={ref}\n data-slot=\"typography\"\n data-variant={variant}\n className={cn(\n typographyVariants({ variant, weight, color, lineClamp, className })\n )}\n {...props}\n />\n );\n }\n);\n\nTypography.displayName = \"Typography\";\n\nexport { Typography, typographyVariants };\n"],"names":["Slot.Root","_jsx"],"mappings":"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"}
|
|
@@ -11,7 +11,7 @@ var React__default = /*#__PURE__*/_interopDefault(React);
|
|
|
11
11
|
|
|
12
12
|
const AccordionItemComponent = React.forwardRef(({ title, children, className, value, ...otherProps }, ref) => (jsxRuntime.jsxs(primitives_Accordion.AccordionItem, { ref: ref, value: value, className: utils.cn(className), ...otherProps, children: [jsxRuntime.jsx(primitives_Accordion.AccordionTrigger, { children: title }), jsxRuntime.jsx(primitives_Accordion.AccordionContent, { children: children })] })));
|
|
13
13
|
AccordionItemComponent.displayName = "Accordion.Item";
|
|
14
|
-
const Accordion = React.forwardRef(({ className, children, ...otherProps }, ref) => {
|
|
14
|
+
const Accordion = React.forwardRef(({ className, children, type = "single", ...otherProps }, ref) => {
|
|
15
15
|
// Auto-generate value props for items that don't have one
|
|
16
16
|
const enhancedChildren = React.Children.map(children, (child, index) => {
|
|
17
17
|
if (!React__default.default.isValidElement(child))
|
|
@@ -19,10 +19,10 @@ const Accordion = React.forwardRef(({ className, children, ...otherProps }, ref)
|
|
|
19
19
|
const childValue = child.props.value ?? `item-${index}`;
|
|
20
20
|
return React__default.default.cloneElement(child, { value: childValue });
|
|
21
21
|
});
|
|
22
|
-
return (jsxRuntime.jsx(primitives_Accordion.Accordion, { ref: ref, className: utils.cn(className), ...otherProps, children: enhancedChildren }));
|
|
22
|
+
return (jsxRuntime.jsx(primitives_Accordion.Accordion, { ref: ref, type: type, className: utils.cn(className), ...otherProps, children: enhancedChildren }));
|
|
23
23
|
});
|
|
24
24
|
Accordion.displayName = "Accordion";
|
|
25
25
|
Accordion.Item = AccordionItemComponent;
|
|
26
26
|
|
|
27
27
|
exports.Accordion = Accordion;
|
|
28
|
-
//# sourceMappingURL=Accordion-
|
|
28
|
+
//# sourceMappingURL=Accordion-BoTckTBI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Accordion-BoTckTBI.js","sources":["../../../src/components/Accordion/Accordion.tsx"],"sourcesContent":["import React, { forwardRef, type ReactNode, Children } from \"react\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\nimport {\n Accordion as PrimitiveAccordion,\n AccordionItem as PrimitiveAccordionItem,\n AccordionTrigger as PrimitiveAccordionTrigger,\n AccordionContent as PrimitiveAccordionContent,\n} from \"src/primitives/Accordion\";\n\ntype AccordionRootProps = React.ComponentProps<typeof PrimitiveAccordion>;\n\nexport interface AccordionProps extends Omit<\n AccordionRootProps,\n \"children\" | \"type\"\n> {\n /** Whether one or many items can be opened at the same time. */\n type?: \"single\" | \"multiple\";\n /** Accordion.Item children. */\n children?: ReactNode;\n}\n\ninterface AccordionItemProps extends React.ComponentProps<\n typeof PrimitiveAccordionItem\n> {\n /** Header text displayed in the trigger. */\n title: string;\n /** Content rendered when the item is expanded. */\n children?: ReactNode;\n}\n\nconst AccordionItemComponent = forwardRef<HTMLDivElement, AccordionItemProps>(\n ({ title, children, className, value, ...otherProps }, ref) => (\n <PrimitiveAccordionItem\n ref={ref}\n value={value}\n className={cn(className)}\n {...otherProps}\n >\n <PrimitiveAccordionTrigger>{title}</PrimitiveAccordionTrigger>\n <PrimitiveAccordionContent>{children}</PrimitiveAccordionContent>\n </PrimitiveAccordionItem>\n )\n);\n\nAccordionItemComponent.displayName = \"Accordion.Item\";\n\nconst Accordion = forwardRef<HTMLDivElement, AccordionProps>(\n ({ className, children, type = \"single\", ...otherProps }, ref) => {\n // Auto-generate value props for items that don't have one\n const enhancedChildren = Children.map(children, (child, index) => {\n if (!React.isValidElement<AccordionItemProps>(child)) return child;\n const childValue = child.props.value ?? `item-${index}`;\n return React.cloneElement(child, { value: childValue });\n });\n\n return (\n <PrimitiveAccordion\n ref={ref}\n type={type}\n className={cn(className)}\n {...(otherProps as Record<string, unknown>)}\n >\n {enhancedChildren}\n </PrimitiveAccordion>\n );\n }\n) as React.ForwardRefExoticComponent<\n AccordionProps & React.RefAttributes<HTMLDivElement>\n> & {\n Item: typeof AccordionItemComponent;\n};\n\nAccordion.displayName = \"Accordion\";\nAccordion.Item = AccordionItemComponent;\n\nexport { Accordion };\n"],"names":["forwardRef","_jsxs","PrimitiveAccordionItem","cn","_jsx","PrimitiveAccordionTrigger","PrimitiveAccordionContent","Children","React","PrimitiveAccordion"],"mappings":";;;;;;;;;;;AA+BA,MAAM,sBAAsB,GAAGA,gBAAU,CACvC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,UAAU,EAAE,EAAE,GAAG,MACxDC,eAAA,CAACC,kCAAsB,EAAA,EACrB,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,KAAK,EACZ,SAAS,EAAEC,QAAE,CAAC,SAAS,CAAC,EAAA,GACpB,UAAU,EAAA,QAAA,EAAA,CAEdC,cAAA,CAACC,qCAAyB,EAAA,EAAA,QAAA,EAAE,KAAK,EAAA,CAA6B,EAC9DD,cAAA,CAACE,qCAAyB,EAAA,EAAA,QAAA,EAAE,QAAQ,EAAA,CAA6B,CAAA,EAAA,CAC1C,CAC1B,CACF;AAED,sBAAsB,CAAC,WAAW,GAAG,gBAAgB;AAErD,MAAM,SAAS,GAAGN,gBAAU,CAC1B,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,GAAG,QAAQ,EAAE,GAAG,UAAU,EAAE,EAAE,GAAG,KAAI;;AAE/D,IAAA,MAAM,gBAAgB,GAAGO,cAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAI;AAC/D,QAAA,IAAI,CAACC,sBAAK,CAAC,cAAc,CAAqB,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK;QAClE,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,CAAA,KAAA,EAAQ,KAAK,CAAA,CAAE;AACvD,QAAA,OAAOA,sBAAK,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AACzD,IAAA,CAAC,CAAC;IAEF,QACEJ,cAAA,CAACK,8BAAkB,EAAA,EACjB,GAAG,EAAE,GAAG,EACR,IAAI,EAAE,IAAI,EACV,SAAS,EAAEN,QAAE,CAAC,SAAS,CAAC,EAAA,GACnB,UAAsC,EAAA,QAAA,EAE1C,gBAAgB,EAAA,CACE;AAEzB,CAAC;AAOH,SAAS,CAAC,WAAW,GAAG,WAAW;AACnC,SAAS,CAAC,IAAI,GAAG,sBAAsB;;;;"}
|
|
@@ -185,7 +185,8 @@ const getColor = (colorValue, showTransparencyControl) => {
|
|
|
185
185
|
};
|
|
186
186
|
|
|
187
187
|
const Palette = React.forwardRef(({ color, colorList = DEFAULT_PALETTE_COLORS, onChange, className, ...props }, ref) => (jsxRuntime.jsx("div", { ref: ref, className: utils.cn("flex flex-row flex-wrap items-start justify-start gap-1", className), ...props, children: colorList.map(item => {
|
|
188
|
-
const
|
|
188
|
+
const rgbValue = "rgb" in item && typeof item.rgb === "string" ? item.rgb : undefined;
|
|
189
|
+
const value = item.hex ?? rgbValue ?? "";
|
|
189
190
|
const isActive = !!color && !!value && color.toLowerCase() === value.toLowerCase();
|
|
190
191
|
return (jsxRuntime.jsx("button", { type: "button", "data-testid": "color-palette-item", className: utils.cn("size-6 rounded-[5px] border cursor-pointer overflow-hidden transition-colors", isActive
|
|
191
192
|
? "border-muted-foreground"
|
|
@@ -276,4 +277,4 @@ const ColorPicker = React.forwardRef(({ color = "", size = "large", onChange, dr
|
|
|
276
277
|
ColorPicker.displayName = "ColorPicker";
|
|
277
278
|
|
|
278
279
|
exports.ColorPicker = ColorPicker;
|
|
279
|
-
//# sourceMappingURL=ColorPicker-
|
|
280
|
+
//# sourceMappingURL=ColorPicker-Uxgn8U0h.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ColorPicker-Uxgn8U0h.js","sources":["../../node_modules/lucide-react/dist/esm/icons/pipette.js","../../../src/components/ColorPicker/hooks/useEyeDropper.ts","../../../src/components/ColorPicker/constants.ts","../../../src/components/ColorPicker/hooks/useRecentlyUsedColors.ts","../../../src/components/ColorPicker/utils.ts","../../../src/components/ColorPicker/Palette.tsx","../../../src/components/ColorPicker/Target.tsx","../../../src/components/ColorPicker/ColorPicker.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"m12 9-8.414 8.414A2 2 0 0 0 3 18.828v1.344a2 2 0 0 1-.586 1.414A2 2 0 0 1 3.828 21h1.344a2 2 0 0 0 1.414-.586L15 12\",\n key: \"1y3wsu\"\n }\n ],\n [\n \"path\",\n {\n d: \"m18 9 .4.4a1 1 0 1 1-3 3l-3.8-3.8a1 1 0 1 1 3-3l.4.4 3.4-3.4a1 1 0 1 1 3 3z\",\n key: \"110lr1\"\n }\n ],\n [\"path\", { d: \"m2 22 .414-.414\", key: \"jhxm08\" }]\n];\nconst Pipette = createLucideIcon(\"pipette\", __iconNode);\n\nexport { __iconNode, Pipette as default };\n//# sourceMappingURL=pipette.js.map\n","import { useCallback } from \"react\";\n\ninterface EyeDropperResult {\n sRGBHex: string;\n}\n\ndeclare global {\n interface Window {\n EyeDropper?: new () => { open: () => Promise<EyeDropperResult> };\n }\n}\n\nconst isSupported = typeof window !== \"undefined\" && \"EyeDropper\" in window;\n\nexport const useEyeDropper = () => {\n const open = useCallback(async (): Promise<string> => {\n if (!window.EyeDropper) throw new Error(\"EyeDropper API not supported\");\n\n const dropper = new window.EyeDropper();\n const result = await dropper.open();\n\n return result.sRGBHex;\n }, []);\n\n return { isSupported, open };\n};\n","export const DEFAULT_PALETTE_COLORS = [\n { hex: \"#FFFFFF\" },\n { hex: \"#D6D6D6\" },\n { hex: \"#0A0E13\" },\n { hex: \"#FECE1E\" },\n { hex: \"#F32E48\" },\n { hex: \"#02C39A\" },\n { hex: \"#2A79C4\" },\n { hex: \"#B3E5FC\" },\n { hex: \"#C3C6F9\" },\n { hex: \"#8064CE\" },\n { hex: \"#FE861E\" },\n { hex: \"#FF7DC9\" },\n { hex: \"#028090\" },\n { hex: \"#095482\" },\n];\n\nexport const RECENTLY_USED_STORAGE_KEY = \"recently-used-colors\";\n\nexport const TARGET_SIZES = {\n small: \"small\",\n medium: \"medium\",\n large: \"large\",\n} as const;\n\nexport const PICKER_HEIGHT: Record<string, string> = {\n small: \"100px\",\n medium: \"120px\",\n large: \"140px\",\n};\n","import { useSyncExternalStore } from \"react\";\n\nimport { RECENTLY_USED_STORAGE_KEY } from \"../constants\";\n\ninterface ColorValue {\n hex: string;\n rgb: string | { r: number; g: number; b: number; a?: number };\n}\n\nconst getFromStorage = (key: string, fallback: ColorValue[]): ColorValue[] => {\n try {\n const stored = localStorage.getItem(key);\n\n return stored ? JSON.parse(stored) : fallback;\n } catch {\n return fallback;\n }\n};\n\nconst setToStorage = (key: string, value: ColorValue[]) => {\n try {\n localStorage.setItem(key, JSON.stringify(value));\n } catch {\n // Silently fail if storage is unavailable\n }\n};\n\nconst createSyncedStore = (storageKey: string) => {\n const listeners = new Set<() => void>();\n\n const store = {\n value: getFromStorage(storageKey, []),\n getSnapshot: () => store.value,\n getServerSnapshot: () => [] as ColorValue[],\n setValue: (newValue: ColorValue[]) => {\n store.value = newValue;\n setToStorage(storageKey, newValue);\n listeners.forEach(listener => listener());\n },\n subscribe: (callback: () => void) => {\n listeners.add(callback);\n\n const storageEventHandler = (event: StorageEvent) => {\n if (event.key !== storageKey) return;\n store.value = getFromStorage(storageKey, []);\n listeners.forEach(listener => listener());\n };\n\n if (listeners.size === 1) {\n window.addEventListener(\"storage\", storageEventHandler);\n }\n\n return () => {\n listeners.delete(callback);\n if (listeners.size === 0) {\n window.removeEventListener(\"storage\", storageEventHandler);\n }\n };\n },\n };\n\n return store;\n};\n\nconst store = createSyncedStore(RECENTLY_USED_STORAGE_KEY);\n\nexport const useRecentlyUsedColors = (): [\n ColorValue[],\n (value: ColorValue[]) => void,\n] => [\n useSyncExternalStore(\n store.subscribe,\n store.getSnapshot,\n store.getServerSnapshot\n ),\n store.setValue,\n];\n","/**\n * Validates a hex color string (3, 4, 6, or 8 digits with optional #).\n */\nexport const isValidHex = (hex: string): boolean =>\n /^#?([0-9A-Fa-f]{3}|[0-9A-Fa-f]{4}|[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$/.test(hex);\n\n/**\n * Parses a hex color string into RGBA components.\n * Returns { r: 0, g: 0, b: 0, a: 1 } for invalid inputs.\n */\nexport const hexToRgb = (\n hex: string\n): { r: number; g: number; b: number; a: number } => {\n const raw = hex.replace(/^#/, \"\");\n\n if (\n !/^([0-9A-Fa-f]{3}|[0-9A-Fa-f]{4}|[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$/.test(raw)\n ) {\n return { r: 0, g: 0, b: 0, a: 1 };\n }\n\n let r: number,\n g: number,\n b: number,\n a = 255;\n if (raw.length === 3 || raw.length === 4) {\n r = parseInt(raw[0] + raw[0], 16);\n g = parseInt(raw[1] + raw[1], 16);\n b = parseInt(raw[2] + raw[2], 16);\n if (raw.length === 4) a = parseInt(raw[3] + raw[3], 16);\n } else {\n r = parseInt(raw.slice(0, 2), 16);\n g = parseInt(raw.slice(2, 4), 16);\n b = parseInt(raw.slice(4, 6), 16);\n if (raw.length === 8) a = parseInt(raw.slice(6, 8), 16);\n }\n\n return { r, g, b, a: Math.round((a / 255) * 100) / 100 };\n};\n\n/**\n * Converts a hex color to an 8-digit hex string (#RRGGBBAA).\n */\nexport const hexToHex8 = (hex: string): string => {\n const { r, g, b, a } = hexToRgb(hex);\n const alpha = Math.round(a * 255);\n\n return `#${[r, g, b, alpha].map(v => v.toString(16).padStart(2, \"0\")).join(\"\")}`;\n};\n\n/**\n * Converts a color value to a normalized { hex, rgb } object.\n * Handles transparency and validity checks.\n */\nexport const getColor = (\n colorValue: string,\n showTransparencyControl: boolean\n): { hex: string; rgb: { r: number; g: number; b: number; a: number } } => {\n if (!isValidHex(colorValue)) {\n return { hex: colorValue, rgb: { r: 0, g: 0, b: 0, a: 1 } };\n }\n\n const rgb = hexToRgb(colorValue);\n\n if (rgb.a === 0) {\n return { hex: colorValue, rgb };\n }\n\n const hex = showTransparencyControl\n ? hexToHex8(colorValue)\n : `#${colorValue.replace(/^#/, \"\").slice(0, 6)}`;\n\n return { hex, rgb: hexToRgb(hex) };\n};\n","import React, { forwardRef } from \"react\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\n\nimport { isValidHex } from \"./utils\";\nimport { DEFAULT_PALETTE_COLORS } from \"./constants\";\nimport type { PaletteColor } from \"./types\";\n\nexport interface PaletteProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n \"onChange\"\n> {\n /** Currently selected color. */\n color?: string;\n /** List of colors to render. */\n colorList?: PaletteColor[];\n /** Callback when a color swatch is clicked. */\n onChange?: (color: string) => void;\n}\n\nconst Palette = forwardRef<HTMLDivElement, PaletteProps>(\n (\n {\n color,\n colorList = DEFAULT_PALETTE_COLORS,\n onChange,\n className,\n ...props\n },\n ref\n ) => (\n <div\n ref={ref}\n className={cn(\n \"flex flex-row flex-wrap items-start justify-start gap-1\",\n className\n )}\n {...props}\n >\n {colorList.map(item => {\n const rgbValue =\n \"rgb\" in item && typeof item.rgb === \"string\" ? item.rgb : undefined;\n const value = item.hex ?? rgbValue ?? \"\";\n const isActive =\n !!color && !!value && color.toLowerCase() === value.toLowerCase();\n\n return (\n <button\n type=\"button\"\n key={value}\n data-testid=\"color-palette-item\"\n className={cn(\n \"size-6 rounded-[5px] border cursor-pointer overflow-hidden transition-colors\",\n isActive\n ? \"border-muted-foreground\"\n : \"border-border hover:border-muted-foreground/50\"\n )}\n onClick={() => onChange?.(value)}\n >\n <span\n className={cn(\n \"block size-full\",\n isValidHex(value)\n ? \"\"\n : \"bg-[repeating-conic-gradient(#ccc_0_25%,transparent_0_50%)] bg-[length:8px_8px]\"\n )}\n style={isValidHex(value) ? { backgroundColor: value } : undefined}\n />\n </button>\n );\n })}\n </div>\n )\n);\n\nPalette.displayName = \"ColorPicker.Palette\";\n\nexport { Palette };\n","import React, { forwardRef } from \"react\";\n\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { ChevronDown } from \"lucide-react\";\nimport { cn } from \"src/shadcn/lib/utils\";\n\nconst targetVariants = cva(\n \"inline-flex items-center justify-between rounded-md border border-input bg-background transition-colors hover:border-muted-foreground focus-visible:outline-none focus-visible:border-primary focus-visible:ring-3 focus-visible:ring-primary/15 cursor-pointer\",\n {\n variants: {\n size: {\n small: \"h-7 p-0.5 gap-2\",\n medium: \"h-8 p-1 gap-2\",\n large: \"h-10 p-1.5 gap-3\",\n },\n },\n defaultVariants: {\n size: \"large\",\n },\n }\n);\n\nexport interface TargetProps\n extends\n Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"size\">,\n VariantProps<typeof targetVariants> {\n /** Show hex code text beside the color swatch. */\n showHexValue?: boolean;\n /** The original color prop value. */\n color?: string;\n /** The resolved color value to display. */\n colorValue?: string;\n}\n\nconst Target = forwardRef<HTMLButtonElement, TargetProps>(\n (\n { size = \"large\", showHexValue, color, colorValue, className, ...props },\n ref\n ) => (\n <button\n ref={ref}\n type=\"button\"\n data-testid=\"color-picker-target\"\n className={cn(targetVariants({ size }), className)}\n {...props}\n >\n {showHexValue && (\n <span className=\"text-sm font-medium text-foreground min-w-[4.5rem] ps-1\">\n {color}\n </span>\n )}\n <span className=\"inline-flex items-center gap-2\">\n <span\n className=\"block size-5 rounded-md border border-border\"\n style={{ backgroundColor: colorValue }}\n />\n <ChevronDown className=\"size-4 text-muted-foreground\" />\n </span>\n </button>\n )\n);\n\nTarget.displayName = \"ColorPicker.Target\";\n\nexport { Target };\n","import { forwardRef, useState, useRef } from \"react\";\n\nimport { Pipette } from \"lucide-react\";\nimport { useTranslation } from \"react-i18next\";\nimport {\n HexColorPicker,\n HexColorInput,\n HexAlphaColorPicker,\n} from \"react-colorful\";\nimport { Button } from \"src/primitives/Button\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"src/primitives/Popover\";\nimport { cn } from \"src/shadcn/lib/utils\";\n\nimport { useEyeDropper } from \"./hooks/useEyeDropper\";\nimport { useRecentlyUsedColors } from \"./hooks/useRecentlyUsedColors\";\nimport { Palette } from \"./Palette\";\nimport { Target } from \"./Target\";\nimport { PICKER_HEIGHT } from \"./constants\";\nimport type { ColorPickerProps } from \"./types\";\nimport { getColor } from \"./utils\";\n\nconst ColorPicker = forwardRef<HTMLDivElement, ColorPickerProps>(\n (\n {\n color = \"\",\n size = \"large\",\n onChange,\n dropdownProps,\n showEyeDropper = true,\n showHexValue = false,\n showTransparencyControl = false,\n showPicker = true,\n showHexPicker = true,\n colorPalette,\n showRecentlyUsedColors = showPicker,\n className,\n },\n ref\n ) => {\n const { t } = useTranslation();\n const [colorInternal, setColorInternal] = useState(color);\n const [isColorSelected, setIsColorSelected] = useState(false);\n const [open, setOpen] = useState(false);\n const hexColorInputValue = useRef(\"\");\n const { isSupported: eyeDropperSupported, open: openEyeDropper } =\n useEyeDropper();\n const [recentlyUsedColors, setRecentlyUsedColors] = useRecentlyUsedColors();\n\n const PickerComponent = showTransparencyControl\n ? HexAlphaColorPicker\n : HexColorPicker;\n\n const colorValue = color ?? colorInternal ?? \"\";\n\n const onColorChange = (value: string) => {\n setIsColorSelected(true);\n\n if (onChange) {\n onChange(getColor(value, showTransparencyControl));\n } else {\n setColorInternal(value);\n }\n };\n\n const onColorInputChange = (hex: string) => {\n hexColorInputValue.current = hex;\n const expectedLength = showTransparencyControl ? 9 : 7;\n if (hex.length !== expectedLength) return;\n\n onColorChange(hex);\n hexColorInputValue.current = \"\";\n };\n\n const onBlur = () => {\n if (!hexColorInputValue.current) return;\n\n onColorChange(hexColorInputValue.current);\n hexColorInputValue.current = \"\";\n };\n\n const pickColor = async () => {\n try {\n const hex = await openEyeDropper();\n onColorChange(hex);\n } catch {\n // User cancelled or API unavailable\n }\n };\n\n const onOpenChange = (nextOpen: boolean) => {\n if (!nextOpen && showRecentlyUsedColors && isColorSelected) {\n const newColor = getColor(colorValue, showTransparencyControl);\n const filtered = recentlyUsedColors.filter(\n ({ hex }) => hex !== newColor.hex\n );\n const updated = [newColor, ...filtered];\n if (updated.length > 14) updated.pop();\n\n setRecentlyUsedColors(updated);\n setIsColorSelected(false);\n }\n\n setOpen(nextOpen);\n };\n\n return (\n <Popover open={open} onOpenChange={onOpenChange}>\n <PopoverTrigger asChild>\n <Target\n color={color}\n colorValue={colorValue}\n showHexValue={showHexValue}\n size={size}\n />\n </PopoverTrigger>\n <PopoverContent\n ref={ref}\n align=\"start\"\n side=\"bottom\"\n className={cn(\"w-auto p-3\", className)}\n {...dropdownProps}\n >\n <div className=\"flex flex-col gap-3 w-56\">\n {showPicker && (\n <>\n {showHexPicker && (\n <div\n data-testid=\"neeto-color-picker-section\"\n style={{\n [\"--react-colorful-height\" as string]:\n PICKER_HEIGHT[size] ?? \"140px\",\n }}\n >\n <PickerComponent\n color={colorValue}\n onChange={onColorChange}\n style={{\n width: \"100%\",\n height: PICKER_HEIGHT[size] ?? \"140px\",\n }}\n />\n </div>\n )}\n <div className=\"flex items-center justify-center gap-2\">\n {showEyeDropper && eyeDropperSupported && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={pickColor}\n aria-label={t(\n \"neetoatoms.colorPicker.pickColor\",\n \"Pick color from screen\"\n )}\n >\n <Pipette className=\"size-4\" />\n </Button>\n )}\n <div\n className=\"flex-1\"\n data-testid=\"colorpicker-editable-input\"\n >\n <HexColorInput\n prefixed\n alpha={!!showTransparencyControl}\n color={colorValue}\n data-testid=\"colorpicker-editable-input-textbox\"\n onChange={onColorInputChange}\n onBlur={onBlur}\n className=\"h-8 w-full rounded-lg border border-input bg-transparent px-2.5 text-sm outline-none focus-visible:border-primary focus-visible:ring-3 focus-visible:ring-primary/15\"\n />\n </div>\n </div>\n </>\n )}\n <div\n data-testid=\"color-palette\"\n className={cn(showPicker && \"border-t border-border pt-3\")}\n >\n <Palette\n color={color}\n colorList={colorPalette}\n onChange={onColorChange}\n />\n </div>\n {showRecentlyUsedColors && recentlyUsedColors.length > 0 && (\n <div\n className=\"border-t border-border pt-3\"\n data-testid=\"color-palette-recently-used\"\n >\n <p className=\"text-xs font-medium text-muted-foreground mb-2\">\n {t(\"neetoatoms.colorPicker.recentlyUsed\", \"Recently used\")}\n </p>\n <Palette\n colorList={recentlyUsedColors}\n onChange={onColorChange}\n />\n </div>\n )}\n </div>\n </PopoverContent>\n </Popover>\n );\n }\n);\n\nColorPicker.displayName = \"ColorPicker\";\n\nexport { ColorPicker };\n"],"names":["createLucideIcon","useCallback","useSyncExternalStore","forwardRef","_jsx","cn","cva","_jsxs","ChevronDown","useTranslation","useState","useRef","HexAlphaColorPicker","HexColorPicker","Popover","PopoverTrigger","PopoverContent","_Fragment","Button","HexColorInput"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Input-pkugjUb0.js","sources":["../../../src/components/Input/constants.ts","../../../src/components/Input/utils.ts","../../../src/components/Input/Input.tsx"],"sourcesContent":["export const SIZE_CONFIG = {\n small: { group: \"h-7\", input: \"text-xs px-2\", addon: \"px-1.5\" },\n medium: { group: \"h-8\", input: \"text-sm\", addon: \"px-2\" },\n large: { group: \"h-10\", input: \"text-sm\", addon: \"px-2.5\" },\n};\n","import React from \"react\";\n\nexport function toFixed(numStr: string, prec: number): string {\n const num = Number(numStr);\n if (Number.isNaN(num)) return numStr;\n\n return num.toFixed(prec);\n}\n\nexport function formatWithPrecision(\n value: string | number | undefined,\n precision: number\n): string | undefined {\n if (precision < 0 || !value) return value as string | undefined;\n\n const str = value.toString();\n const trimmed = str.trim();\n if (trimmed !== \"\" && !Number.isNaN(Number(trimmed)))\n return toFixed(str, precision);\n\n return str;\n}\n\nexport function enforceDecimalPrecision(\n value: string,\n precision: number\n): string {\n if (precision < 0 || !value) return value;\n\n const valueStr = value.toString();\n if (precision === 0) return valueStr.split(\".\")[0];\n\n const regex = new RegExp(`^\\\\d*\\\\.?\\\\d{0,${precision}}$`);\n if (regex.test(valueStr)) return value;\n\n const parts = valueStr.split(\".\");\n if (parts.length === 1) return parts[0];\n\n return `${parts[0]}.${parts[1].substring(0, precision)}`;\n}\n\nexport function formatWithRejectCharsRegex(\n value: string,\n rejectCharsRegex?: RegExp\n): string {\n if (!rejectCharsRegex) return value;\n\n const globalRegex = new RegExp(rejectCharsRegex, \"g\");\n\n return value.replace(globalRegex, \"\");\n}\n\nexport function getTrimmedValue(\n value: string | number,\n disableTrimOnBlur: boolean\n): string | number {\n if (disableTrimOnBlur || typeof value !== \"string\") return value;\n\n return value.trim();\n}\n\nexport function preserveCursor(\n e: React.ChangeEvent<HTMLInputElement>,\n updateValueFn: () => React.ChangeEvent<HTMLInputElement>\n) {\n const input = e.target;\n const prevCursor = input.selectionStart;\n const prevValue = input.value;\n\n const updatedEvent = updateValueFn();\n\n const lengthDiff = input.value.length - prevValue.length;\n const newCursor = Math.max(0, (prevCursor ?? 0) + lengthDiff);\n\n requestAnimationFrame(() => {\n if (document.activeElement !== input) return;\n if (input.type === \"number\") return;\n\n input.setSelectionRange(newCursor, newCursor);\n });\n\n return updatedEvent;\n}\n","import React, { forwardRef, useId, useState } from \"react\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\nimport {\n Field,\n FieldLabel,\n FieldContent,\n FieldDescription,\n FieldError,\n} from \"src/primitives/Field\";\nimport {\n InputGroup,\n InputGroupAddon,\n InputGroupText,\n InputGroupInput,\n} from \"src/primitives/InputGroup\";\n\nimport { SIZE_CONFIG } from \"./constants\";\nimport {\n formatWithPrecision,\n enforceDecimalPrecision,\n formatWithRejectCharsRegex,\n getTrimmedValue,\n preserveCursor,\n} from \"./utils\";\n\ntype InputSize = \"small\" | \"medium\" | \"large\";\n\nexport interface InputProps extends Omit<\n React.ComponentProps<\"input\">,\n \"size\" | \"prefix\"\n> {\n /** Size of the input. */\n size?: InputSize;\n /** Input type. */\n type?: string;\n /** Label displayed above the input. */\n label?: string;\n /** Error message displayed below the input. */\n error?: string;\n /** Help text displayed below the input. Accepts string or ReactNode. */\n helpText?: React.ReactNode;\n /** Content rendered before the input. */\n prefix?: React.ReactNode;\n /** Content rendered after the input. */\n suffix?: React.ReactNode;\n /** Removes borders from the input. */\n nakedInput?: boolean;\n /** HTML size attribute for the input element. */\n contentSize?: number;\n /** Maximum character limit. Counter visible at 85%. */\n maxLength?: number;\n /** Allow typing past maxLength, show error styling on count. */\n unlimitedChars?: boolean;\n /** Regex to reject matching characters from input. */\n rejectCharsRegex?: RegExp;\n /** Prevent trimming whitespace on blur. */\n disableTrimOnBlur?: boolean;\n /** Decimal places for number formatting. -1 to disable. */\n precision?: number;\n /** Props forwarded to the Label element. */\n labelProps?: React.ComponentProps<typeof FieldLabel>;\n /** Additional class name for the outermost wrapper. */\n className?: string;\n}\n\nconst Input = forwardRef<HTMLInputElement, InputProps>(\n (\n {\n size = \"medium\",\n type = \"text\",\n label = \"\",\n error = \"\",\n helpText = \"\",\n prefix = null,\n suffix = null,\n disabled = false,\n nakedInput = false,\n contentSize,\n required = false,\n maxLength,\n unlimitedChars = false,\n rejectCharsRegex,\n disableTrimOnBlur = false,\n precision = -1,\n labelProps,\n className = \"\",\n onBlur,\n onChange,\n value: controlledValue,\n ...otherProps\n },\n ref\n ) => {\n const generatedId = useId();\n const id = otherProps.id ?? generatedId;\n const errorId = `error_${id}`;\n const helpTextId = `helpText_${id}`;\n\n // Controlled / uncontrolled value tracking\n const [valueInternal, setValueInternal] = useState(controlledValue);\n const isControlled = controlledValue !== undefined;\n\n const value =\n formatWithPrecision(controlledValue, precision) ?? valueInternal ?? \"\";\n const valueLength = value?.toString().length || 0;\n\n const isMaxLengthPresent = !!maxLength || maxLength === 0;\n const isCharacterLimitVisible =\n isMaxLengthPresent && valueLength >= maxLength! * 0.85;\n const maxLengthError = unlimitedChars && valueLength > maxLength!;\n\n // --- Handlers ---\n\n const onChangeInternal = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) {\n setValueInternal(e.target.value);\n }\n onChange?.(e);\n };\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (type === \"file\") {\n onChangeInternal(e);\n\n return;\n }\n\n let formattedValue = formatWithRejectCharsRegex(\n e.target.value,\n rejectCharsRegex\n );\n formattedValue = enforceDecimalPrecision(formattedValue, precision);\n\n if (formattedValue !== e.target.value) {\n preserveCursor(e, () => {\n const syntheticEvent = Object.create(e, {\n target: { value: { ...e.target, value: formattedValue } },\n });\n e.target.value = formattedValue;\n onChangeInternal(syntheticEvent);\n\n return syntheticEvent;\n });\n } else {\n onChangeInternal(e);\n }\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n if (type === \"file\") {\n onBlur?.(e);\n\n return;\n }\n\n const trimmedValue = getTrimmedValue(value, disableTrimOnBlur);\n const formattedValue = formatWithPrecision(trimmedValue, precision);\n\n if (formattedValue !== undefined && formattedValue !== value) {\n e.target.value = formattedValue.toString();\n handleChange(e as unknown as React.ChangeEvent<HTMLInputElement>);\n }\n\n onBlur?.(e);\n };\n\n const handleWheel = (e: React.WheelEvent<HTMLInputElement>) => {\n if (type === \"number\") (e.target as HTMLInputElement).blur();\n };\n\n // --- aria-describedby ---\n\n const ariaDescribedBy =\n [error ? errorId : null, helpText ? helpTextId : null]\n .filter(Boolean)\n .join(\" \") || undefined;\n\n // --- Render ---\n\n const hasField = !!(label || error || helpText);\n const sizeConfig = SIZE_CONFIG[size];\n\n const inputGroup = (\n <InputGroup\n className={cn(\n sizeConfig.group,\n nakedInput &&\n \"border-0 shadow-none has-[[data-slot=input-group-control]:focus-visible]:ring-0 has-[[data-slot=input-group-control]:focus-visible]:border-transparent\",\n !!error &&\n !nakedInput &&\n \"border-destructive ring-destructive/20 ring-3\",\n !hasField && className\n )}\n >\n {prefix && (\n <InputGroupAddon align=\"inline-start\" className={sizeConfig.addon}>\n <InputGroupText>{prefix}</InputGroupText>\n </InputGroupAddon>\n )}\n <InputGroupInput\n ref={ref}\n id={id}\n type={type}\n disabled={disabled}\n required={required}\n size={contentSize}\n aria-invalid={!!error || undefined}\n aria-describedby={ariaDescribedBy}\n className={cn(sizeConfig.input, nakedInput && \"px-0\")}\n value={value}\n onBlur={handleBlur}\n onChange={handleChange}\n onWheel={handleWheel}\n {...(isMaxLengthPresent && !unlimitedChars ? { maxLength } : {})}\n {...otherProps}\n />\n {suffix && (\n <InputGroupAddon align=\"inline-end\" className={sizeConfig.addon}>\n <InputGroupText>{suffix}</InputGroupText>\n </InputGroupAddon>\n )}\n </InputGroup>\n );\n\n if (!hasField) {\n return inputGroup;\n }\n\n return (\n <Field\n data-disabled={disabled || undefined}\n data-invalid={!!error || undefined}\n className={className}\n >\n {(label || isCharacterLimitVisible) && (\n <div className=\"flex items-center justify-between\">\n {label && (\n <FieldLabel htmlFor={id} {...labelProps}>\n {label}\n {required && (\n <span aria-hidden=\"true\" className=\"text-destructive\">\n *\n </span>\n )}\n </FieldLabel>\n )}\n {isCharacterLimitVisible && (\n <span\n className={cn(\n \"text-xs tabular-nums\",\n maxLengthError ? \"text-destructive\" : \"text-muted-foreground\"\n )}\n >\n {valueLength}/{maxLength}\n </span>\n )}\n </div>\n )}\n <FieldContent>\n {inputGroup}\n {!!error && <FieldError id={errorId}>{error}</FieldError>}\n {helpText && (\n <FieldDescription id={helpTextId}>{helpText}</FieldDescription>\n )}\n </FieldContent>\n </Field>\n );\n }\n);\n\nInput.displayName = \"Input\";\n\nexport { Input };\n"],"names":["forwardRef","useId","useState","_jsxs","InputGroup","cn","_jsx","InputGroupAddon","InputGroupText","InputGroupInput","Field","FieldLabel","FieldContent","FieldError","FieldDescription"],"mappings":";;;;;;;;AAAO,MAAM,WAAW,GAAG;AACzB,IAAA,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,QAAQ,EAAE;AAC/D,IAAA,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE;AACzD,IAAA,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE;CAC5D;;ACFK,SAAU,OAAO,CAAC,MAAc,EAAE,IAAY,EAAA;AAClD,IAAA,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC;AAC1B,IAAA,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;AAAE,QAAA,OAAO,MAAM;AAEpC,IAAA,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;AAC1B;AAEM,SAAU,mBAAmB,CACjC,KAAkC,EAClC,SAAiB,EAAA;AAEjB,IAAA,IAAI,SAAS,GAAG,CAAC,IAAI,CAAC,KAAK;AAAE,QAAA,OAAO,KAA2B;AAE/D,IAAA,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,EAAE;AAC5B,IAAA,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE;AAC1B,IAAA,IAAI,OAAO,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAClD,QAAA,OAAO,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC;AAEhC,IAAA,OAAO,GAAG;AACZ;AAEM,SAAU,uBAAuB,CACrC,KAAa,EACb,SAAiB,EAAA;AAEjB,IAAA,IAAI,SAAS,GAAG,CAAC,IAAI,CAAC,KAAK;AAAE,QAAA,OAAO,KAAK;AAEzC,IAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAAE;IACjC,IAAI,SAAS,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAElD,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,CAAA,eAAA,EAAkB,SAAS,CAAA,EAAA,CAAI,CAAC;AACzD,IAAA,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;AAAE,QAAA,OAAO,KAAK;IAEtC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC;AACjC,IAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;AAAE,QAAA,OAAO,KAAK,CAAC,CAAC,CAAC;AAEvC,IAAA,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA,CAAA,EAAI,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE;AAC1D;AAEM,SAAU,0BAA0B,CACxC,KAAa,EACb,gBAAyB,EAAA;AAEzB,IAAA,IAAI,CAAC,gBAAgB;AAAE,QAAA,OAAO,KAAK;IAEnC,MAAM,WAAW,GAAG,IAAI,MAAM,CAAC,gBAAgB,EAAE,GAAG,CAAC;IAErD,OAAO,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;AACvC;AAEM,SAAU,eAAe,CAC7B,KAAsB,EACtB,iBAA0B,EAAA;AAE1B,IAAA,IAAI,iBAAiB,IAAI,OAAO,KAAK,KAAK,QAAQ;AAAE,QAAA,OAAO,KAAK;AAEhE,IAAA,OAAO,KAAK,CAAC,IAAI,EAAE;AACrB;AAEM,SAAU,cAAc,CAC5B,CAAsC,EACtC,aAAwD,EAAA;AAExD,IAAA,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM;AACtB,IAAA,MAAM,UAAU,GAAG,KAAK,CAAC,cAAc;AACvC,IAAA,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK;AAE7B,IAAA,MAAM,YAAY,GAAG,aAAa,EAAE;IAEpC,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM;AACxD,IAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,UAAU,IAAI,CAAC,IAAI,UAAU,CAAC;IAE7D,qBAAqB,CAAC,MAAK;AACzB,QAAA,IAAI,QAAQ,CAAC,aAAa,KAAK,KAAK;YAAE;AACtC,QAAA,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE;AAE7B,QAAA,KAAK,CAAC,iBAAiB,CAAC,SAAS,EAAE,SAAS,CAAC;AAC/C,IAAA,CAAC,CAAC;AAEF,IAAA,OAAO,YAAY;AACrB;;AChBA,MAAM,KAAK,GAAGA,gBAAU,CACtB,CACE,EACE,IAAI,GAAG,QAAQ,EACf,IAAI,GAAG,MAAM,EACb,KAAK,GAAG,EAAE,EACV,KAAK,GAAG,EAAE,EACV,QAAQ,GAAG,EAAE,EACb,MAAM,GAAG,IAAI,EACb,MAAM,GAAG,IAAI,EACb,QAAQ,GAAG,KAAK,EAChB,UAAU,GAAG,KAAK,EAClB,WAAW,EACX,QAAQ,GAAG,KAAK,EAChB,SAAS,EACT,cAAc,GAAG,KAAK,EACtB,gBAAgB,EAChB,iBAAiB,GAAG,KAAK,EACzB,SAAS,GAAG,EAAE,EACd,UAAU,EACV,SAAS,GAAG,EAAE,EACd,MAAM,EACN,QAAQ,EACR,KAAK,EAAE,eAAe,EACtB,GAAG,UAAU,EACd,EACD,GAAG,KACD;AACF,IAAA,MAAM,WAAW,GAAGC,WAAK,EAAE;AAC3B,IAAA,MAAM,EAAE,GAAG,UAAU,CAAC,EAAE,IAAI,WAAW;AACvC,IAAA,MAAM,OAAO,GAAG,CAAA,MAAA,EAAS,EAAE,EAAE;AAC7B,IAAA,MAAM,UAAU,GAAG,CAAA,SAAA,EAAY,EAAE,EAAE;;IAGnC,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAGC,cAAQ,CAAC,eAAe,CAAC;AACnE,IAAA,MAAM,YAAY,GAAG,eAAe,KAAK,SAAS;AAElD,IAAA,MAAM,KAAK,GACT,mBAAmB,CAAC,eAAe,EAAE,SAAS,CAAC,IAAI,aAAa,IAAI,EAAE;IACxE,MAAM,WAAW,GAAG,KAAK,EAAE,QAAQ,EAAE,CAAC,MAAM,IAAI,CAAC;IAEjD,MAAM,kBAAkB,GAAG,CAAC,CAAC,SAAS,IAAI,SAAS,KAAK,CAAC;IACzD,MAAM,uBAAuB,GAC3B,kBAAkB,IAAI,WAAW,IAAI,SAAU,GAAG,IAAI;AACxD,IAAA,MAAM,cAAc,GAAG,cAAc,IAAI,WAAW,GAAG,SAAU;;AAIjE,IAAA,MAAM,gBAAgB,GAAG,CAAC,CAAsC,KAAI;QAClE,IAAI,CAAC,YAAY,EAAE;AACjB,YAAA,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QAClC;AACA,QAAA,QAAQ,GAAG,CAAC,CAAC;AACf,IAAA,CAAC;AAED,IAAA,MAAM,YAAY,GAAG,CAAC,CAAsC,KAAI;AAC9D,QAAA,IAAI,IAAI,KAAK,MAAM,EAAE;YACnB,gBAAgB,CAAC,CAAC,CAAC;YAEnB;QACF;AAEA,QAAA,IAAI,cAAc,GAAG,0BAA0B,CAC7C,CAAC,CAAC,MAAM,CAAC,KAAK,EACd,gBAAgB,CACjB;AACD,QAAA,cAAc,GAAG,uBAAuB,CAAC,cAAc,EAAE,SAAS,CAAC;QAEnE,IAAI,cAAc,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE;AACrC,YAAA,cAAc,CAAC,CAAC,EAAE,MAAK;AACrB,gBAAA,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE;AACtC,oBAAA,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE;AAC1D,iBAAA,CAAC;AACF,gBAAA,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,cAAc;gBAC/B,gBAAgB,CAAC,cAAc,CAAC;AAEhC,gBAAA,OAAO,cAAc;AACvB,YAAA,CAAC,CAAC;QACJ;aAAO;YACL,gBAAgB,CAAC,CAAC,CAAC;QACrB;AACF,IAAA,CAAC;AAED,IAAA,MAAM,UAAU,GAAG,CAAC,CAAqC,KAAI;AAC3D,QAAA,IAAI,IAAI,KAAK,MAAM,EAAE;AACnB,YAAA,MAAM,GAAG,CAAC,CAAC;YAEX;QACF;QAEA,MAAM,YAAY,GAAG,eAAe,CAAC,KAAK,EAAE,iBAAiB,CAAC;QAC9D,MAAM,cAAc,GAAG,mBAAmB,CAAC,YAAY,EAAE,SAAS,CAAC;QAEnE,IAAI,cAAc,KAAK,SAAS,IAAI,cAAc,KAAK,KAAK,EAAE;YAC5D,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,cAAc,CAAC,QAAQ,EAAE;YAC1C,YAAY,CAAC,CAAmD,CAAC;QACnE;AAEA,QAAA,MAAM,GAAG,CAAC,CAAC;AACb,IAAA,CAAC;AAED,IAAA,MAAM,WAAW,GAAG,CAAC,CAAqC,KAAI;QAC5D,IAAI,IAAI,KAAK,QAAQ;AAAG,YAAA,CAAC,CAAC,MAA2B,CAAC,IAAI,EAAE;AAC9D,IAAA,CAAC;;IAID,MAAM,eAAe,GACnB,CAAC,KAAK,GAAG,OAAO,GAAG,IAAI,EAAE,QAAQ,GAAG,UAAU,GAAG,IAAI;SAClD,MAAM,CAAC,OAAO;AACd,SAAA,IAAI,CAAC,GAAG,CAAC,IAAI,SAAS;;IAI3B,MAAM,QAAQ,GAAG,CAAC,EAAE,KAAK,IAAI,KAAK,IAAI,QAAQ,CAAC;AAC/C,IAAA,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC;AAEpC,IAAA,MAAM,UAAU,IACdC,eAAA,CAACC,gCAAU,EAAA,EACT,SAAS,EAAEC,QAAE,CACX,UAAU,CAAC,KAAK,EAChB,UAAU;YACR,wJAAwJ,EAC1J,CAAC,CAAC,KAAK;AACL,YAAA,CAAC,UAAU;AACX,YAAA,+CAA+C,EACjD,CAAC,QAAQ,IAAI,SAAS,CACvB,EAAA,QAAA,EAAA,CAEA,MAAM,KACLC,cAAA,CAACC,qCAAe,EAAA,EAAC,KAAK,EAAC,cAAc,EAAC,SAAS,EAAE,UAAU,CAAC,KAAK,YAC/DD,cAAA,CAACE,oCAAc,EAAA,EAAA,QAAA,EAAE,MAAM,EAAA,CAAkB,EAAA,CACzB,CACnB,EACDF,eAACG,qCAAe,EAAA,EACd,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,EAAE,EACN,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,WAAW,EAAA,cAAA,EACH,CAAC,CAAC,KAAK,IAAI,SAAS,EAAA,kBAAA,EAChB,eAAe,EACjC,SAAS,EAAEJ,QAAE,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,IAAI,MAAM,CAAC,EACrD,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE,WAAW,MACf,kBAAkB,IAAI,CAAC,cAAc,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,EAAA,GAC5D,UAAU,EAAA,CACd,EACD,MAAM,KACLC,cAAA,CAACC,qCAAe,EAAA,EAAC,KAAK,EAAC,YAAY,EAAC,SAAS,EAAE,UAAU,CAAC,KAAK,YAC7DD,cAAA,CAACE,oCAAc,EAAA,EAAA,QAAA,EAAE,MAAM,EAAA,CAAkB,EAAA,CACzB,CACnB,CAAA,EAAA,CACU,CACd;IAED,IAAI,CAAC,QAAQ,EAAE;AACb,QAAA,OAAO,UAAU;IACnB;IAEA,QACEL,eAAA,CAACO,sBAAK,EAAA,EAAA,eAAA,EACW,QAAQ,IAAI,SAAS,EAAA,cAAA,EACtB,CAAC,CAAC,KAAK,IAAI,SAAS,EAClC,SAAS,EAAE,SAAS,EAAA,QAAA,EAAA,CAEnB,CAAC,KAAK,IAAI,uBAAuB,MAChCP,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,mCAAmC,EAAA,QAAA,EAAA,CAC/C,KAAK,KACJA,eAAA,CAACQ,2BAAU,EAAA,EAAC,OAAO,EAAE,EAAE,EAAA,GAAM,UAAU,EAAA,QAAA,EAAA,CACpC,KAAK,EACL,QAAQ,KACPL,cAAA,CAAA,MAAA,EAAA,EAAA,aAAA,EAAkB,MAAM,EAAC,SAAS,EAAC,kBAAkB,EAAA,QAAA,EAAA,GAAA,EAAA,CAE9C,CACR,CAAA,EAAA,CACU,CACd,EACA,uBAAuB,KACtBH,0BACE,SAAS,EAAEE,QAAE,CACX,sBAAsB,EACtB,cAAc,GAAG,kBAAkB,GAAG,uBAAuB,CAC9D,EAAA,QAAA,EAAA,CAEA,WAAW,EAAA,GAAA,EAAG,SAAS,CAAA,EAAA,CACnB,CACR,CAAA,EAAA,CACG,CACP,EACDF,eAAA,CAACS,6BAAY,EAAA,EAAA,QAAA,EAAA,CACV,UAAU,EACV,CAAC,CAAC,KAAK,IAAIN,cAAA,CAACO,2BAAU,EAAA,EAAC,EAAE,EAAE,OAAO,EAAA,QAAA,EAAG,KAAK,EAAA,CAAc,EACxD,QAAQ,KACPP,cAAA,CAACQ,iCAAgB,EAAA,EAAC,EAAE,EAAE,UAAU,EAAA,QAAA,EAAG,QAAQ,EAAA,CAAoB,CAChE,CAAA,EAAA,CACY,CAAA,EAAA,CACT;AAEZ,CAAC;AAGH,KAAK,CAAC,WAAW,GAAG,OAAO;;;;"}
|
|
1
|
+
{"version":3,"file":"Input-pkugjUb0.js","sources":["../../../src/components/Input/constants.ts","../../../src/components/Input/utils.ts","../../../src/components/Input/Input.tsx"],"sourcesContent":["export const SIZE_CONFIG = {\n small: { group: \"h-7\", input: \"text-xs px-2\", addon: \"px-1.5\" },\n medium: { group: \"h-8\", input: \"text-sm\", addon: \"px-2\" },\n large: { group: \"h-10\", input: \"text-sm\", addon: \"px-2.5\" },\n};\n","import React from \"react\";\n\nexport function toFixed(numStr: string, prec: number): string {\n const num = Number(numStr);\n if (Number.isNaN(num)) return numStr;\n\n return num.toFixed(prec);\n}\n\nexport function formatWithPrecision(\n value: string | number | undefined,\n precision: number\n): string | undefined {\n if (precision < 0 || !value) return value as string | undefined;\n\n const str = value.toString();\n const trimmed = str.trim();\n if (trimmed !== \"\" && !Number.isNaN(Number(trimmed)))\n return toFixed(str, precision);\n\n return str;\n}\n\nexport function enforceDecimalPrecision(\n value: string,\n precision: number\n): string {\n if (precision < 0 || !value) return value;\n\n const valueStr = value.toString();\n if (precision === 0) return valueStr.split(\".\")[0];\n\n const regex = new RegExp(`^\\\\d*\\\\.?\\\\d{0,${precision}}$`);\n if (regex.test(valueStr)) return value;\n\n const parts = valueStr.split(\".\");\n if (parts.length === 1) return parts[0];\n\n return `${parts[0]}.${parts[1].substring(0, precision)}`;\n}\n\nexport function formatWithRejectCharsRegex(\n value: string,\n rejectCharsRegex?: RegExp\n): string {\n if (!rejectCharsRegex) return value;\n\n const globalRegex = new RegExp(rejectCharsRegex, \"g\");\n\n return value.replace(globalRegex, \"\");\n}\n\nexport function getTrimmedValue(\n value: string | number,\n disableTrimOnBlur: boolean\n): string | number {\n if (disableTrimOnBlur || typeof value !== \"string\") return value;\n\n return value.trim();\n}\n\nexport function preserveCursor(\n e: React.ChangeEvent<HTMLInputElement>,\n updateValueFn: () => React.ChangeEvent<HTMLInputElement>\n) {\n const input = e.target;\n const prevCursor = input.selectionStart;\n const prevValue = input.value;\n\n const updatedEvent = updateValueFn();\n\n const lengthDiff = input.value.length - prevValue.length;\n const newCursor = Math.max(0, (prevCursor ?? 0) + lengthDiff);\n\n requestAnimationFrame(() => {\n if (document.activeElement !== input) return;\n if (input.type === \"number\") return;\n\n input.setSelectionRange(newCursor, newCursor);\n });\n\n return updatedEvent;\n}\n","import React, { forwardRef, useId, useState } from \"react\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\nimport {\n Field,\n FieldLabel,\n FieldContent,\n FieldDescription,\n FieldError,\n} from \"src/primitives/Field\";\nimport {\n InputGroup,\n InputGroupAddon,\n InputGroupText,\n InputGroupInput,\n} from \"src/primitives/InputGroup\";\n\nimport { SIZE_CONFIG } from \"./constants\";\nimport {\n formatWithPrecision,\n enforceDecimalPrecision,\n formatWithRejectCharsRegex,\n getTrimmedValue,\n preserveCursor,\n} from \"./utils\";\n\ntype InputSize = \"small\" | \"medium\" | \"large\";\n\nexport interface InputProps extends Omit<\n React.ComponentProps<\"input\">,\n \"size\" | \"prefix\" | \"value\"\n> {\n /** Controlled value. */\n value?: string | number;\n /** Size of the input. */\n size?: InputSize;\n /** Input type. */\n type?: string;\n /** Label displayed above the input. */\n label?: string;\n /** Error message displayed below the input. */\n error?: string;\n /** Help text displayed below the input. Accepts string or ReactNode. */\n helpText?: React.ReactNode;\n /** Content rendered before the input. */\n prefix?: React.ReactNode;\n /** Content rendered after the input. */\n suffix?: React.ReactNode;\n /** Removes borders from the input. */\n nakedInput?: boolean;\n /** HTML size attribute for the input element. */\n contentSize?: number;\n /** Maximum character limit. Counter visible at 85%. */\n maxLength?: number;\n /** Allow typing past maxLength, show error styling on count. */\n unlimitedChars?: boolean;\n /** Regex to reject matching characters from input. */\n rejectCharsRegex?: RegExp;\n /** Prevent trimming whitespace on blur. */\n disableTrimOnBlur?: boolean;\n /** Decimal places for number formatting. -1 to disable. */\n precision?: number;\n /** Props forwarded to the Label element. */\n labelProps?: React.ComponentProps<typeof FieldLabel>;\n /** Additional class name for the outermost wrapper. */\n className?: string;\n}\n\nconst Input = forwardRef<HTMLInputElement, InputProps>(\n (\n {\n size = \"medium\",\n type = \"text\",\n label = \"\",\n error = \"\",\n helpText = \"\",\n prefix = null,\n suffix = null,\n disabled = false,\n nakedInput = false,\n contentSize,\n required = false,\n maxLength,\n unlimitedChars = false,\n rejectCharsRegex,\n disableTrimOnBlur = false,\n precision = -1,\n labelProps,\n className = \"\",\n onBlur,\n onChange,\n value: controlledValue,\n ...otherProps\n },\n ref\n ) => {\n const generatedId = useId();\n const id = otherProps.id ?? generatedId;\n const errorId = `error_${id}`;\n const helpTextId = `helpText_${id}`;\n\n // Controlled / uncontrolled value tracking\n const [valueInternal, setValueInternal] = useState(controlledValue);\n const isControlled = controlledValue !== undefined;\n\n const value =\n formatWithPrecision(controlledValue, precision) ?? valueInternal ?? \"\";\n const valueLength = value?.toString().length || 0;\n\n const isMaxLengthPresent = !!maxLength || maxLength === 0;\n const isCharacterLimitVisible =\n isMaxLengthPresent && valueLength >= maxLength! * 0.85;\n const maxLengthError = unlimitedChars && valueLength > maxLength!;\n\n // --- Handlers ---\n\n const onChangeInternal = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) {\n setValueInternal(e.target.value);\n }\n onChange?.(e);\n };\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (type === \"file\") {\n onChangeInternal(e);\n\n return;\n }\n\n let formattedValue = formatWithRejectCharsRegex(\n e.target.value,\n rejectCharsRegex\n );\n formattedValue = enforceDecimalPrecision(formattedValue, precision);\n\n if (formattedValue !== e.target.value) {\n preserveCursor(e, () => {\n const syntheticEvent = Object.create(e, {\n target: { value: { ...e.target, value: formattedValue } },\n });\n e.target.value = formattedValue;\n onChangeInternal(syntheticEvent);\n\n return syntheticEvent;\n });\n } else {\n onChangeInternal(e);\n }\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n if (type === \"file\") {\n onBlur?.(e);\n\n return;\n }\n\n const trimmedValue = getTrimmedValue(value, disableTrimOnBlur);\n const formattedValue = formatWithPrecision(trimmedValue, precision);\n\n if (formattedValue !== undefined && formattedValue !== value) {\n e.target.value = formattedValue.toString();\n handleChange(e as unknown as React.ChangeEvent<HTMLInputElement>);\n }\n\n onBlur?.(e);\n };\n\n const handleWheel = (e: React.WheelEvent<HTMLInputElement>) => {\n if (type === \"number\") (e.target as HTMLInputElement).blur();\n };\n\n // --- aria-describedby ---\n\n const ariaDescribedBy =\n [error ? errorId : null, helpText ? helpTextId : null]\n .filter(Boolean)\n .join(\" \") || undefined;\n\n // --- Render ---\n\n const hasField = !!(label || error || helpText);\n const sizeConfig = SIZE_CONFIG[size];\n\n const inputGroup = (\n <InputGroup\n className={cn(\n sizeConfig.group,\n nakedInput &&\n \"border-0 shadow-none has-[[data-slot=input-group-control]:focus-visible]:ring-0 has-[[data-slot=input-group-control]:focus-visible]:border-transparent\",\n !!error &&\n !nakedInput &&\n \"border-destructive ring-destructive/20 ring-3\",\n !hasField && className\n )}\n >\n {prefix && (\n <InputGroupAddon align=\"inline-start\" className={sizeConfig.addon}>\n <InputGroupText>{prefix}</InputGroupText>\n </InputGroupAddon>\n )}\n <InputGroupInput\n ref={ref}\n id={id}\n type={type}\n disabled={disabled}\n required={required}\n size={contentSize}\n aria-invalid={!!error || undefined}\n aria-describedby={ariaDescribedBy}\n className={cn(sizeConfig.input, nakedInput && \"px-0\")}\n value={value}\n onBlur={handleBlur}\n onChange={handleChange}\n onWheel={handleWheel}\n {...(isMaxLengthPresent && !unlimitedChars ? { maxLength } : {})}\n {...otherProps}\n />\n {suffix && (\n <InputGroupAddon align=\"inline-end\" className={sizeConfig.addon}>\n <InputGroupText>{suffix}</InputGroupText>\n </InputGroupAddon>\n )}\n </InputGroup>\n );\n\n if (!hasField) {\n return inputGroup;\n }\n\n return (\n <Field\n data-disabled={disabled || undefined}\n data-invalid={!!error || undefined}\n className={className}\n >\n {(label || isCharacterLimitVisible) && (\n <div className=\"flex items-center justify-between\">\n {label && (\n <FieldLabel htmlFor={id} {...labelProps}>\n {label}\n {required && (\n <span aria-hidden=\"true\" className=\"text-destructive\">\n *\n </span>\n )}\n </FieldLabel>\n )}\n {isCharacterLimitVisible && (\n <span\n className={cn(\n \"text-xs tabular-nums\",\n maxLengthError ? \"text-destructive\" : \"text-muted-foreground\"\n )}\n >\n {valueLength}/{maxLength}\n </span>\n )}\n </div>\n )}\n <FieldContent>\n {inputGroup}\n {!!error && <FieldError id={errorId}>{error}</FieldError>}\n {helpText && (\n <FieldDescription id={helpTextId}>{helpText}</FieldDescription>\n )}\n </FieldContent>\n </Field>\n );\n }\n);\n\nInput.displayName = \"Input\";\n\nexport { Input };\n"],"names":["forwardRef","useId","useState","_jsxs","InputGroup","cn","_jsx","InputGroupAddon","InputGroupText","InputGroupInput","Field","FieldLabel","FieldContent","FieldError","FieldDescription"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultiEmailInput-l0_YVjbp.js","sources":["../../../src/components/MultiEmailInput/constants.ts","../../../src/components/MultiEmailInput/utils.ts","../../../src/components/MultiEmailInput/useMultiEmailState.ts","../../../src/components/MultiEmailInput/MultiEmailInput.tsx"],"sourcesContent":["export const EMAIL_REGEX = /^[A-Z0-9._%+-]+@[A-Z0-9-]+(?:\\.[A-Z0-9-]+)*\\.[A-Z]{2,}$/i;\n\nexport const UNSTRICT_EMAIL_REGEX =\n /(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))/g;\n\nexport const EMAIL_SEPARATION_REGEX = /[^\\s,]+/g;\n","import { EMAIL_REGEX } from \"./constants\";\nimport type { EmailValue } from \"./types\";\n\nexport const formatEmailInputOption = (email: string): EmailValue => ({\n label: email,\n value: email,\n valid: EMAIL_REGEX.test(email),\n});\n\nexport const pruneDuplicates = (\n existing: EmailValue[],\n newEmailStrings: string[]\n): { uniqueEmails: EmailValue[]; duplicates: string[] } => {\n const seen = new Set(existing.map(e => e.value.toLowerCase()));\n const duplicates: string[] = [];\n const added: EmailValue[] = [];\n\n for (const emailStr of newEmailStrings) {\n const lower = emailStr.toLowerCase();\n if (seen.has(lower)) {\n duplicates.push(emailStr);\n } else {\n seen.add(lower);\n added.push(formatEmailInputOption(emailStr));\n }\n }\n\n return { uniqueEmails: [...existing, ...added], duplicates };\n};\n\nexport const filterValidEmails = (emails: EmailValue[]): EmailValue[] =>\n emails.filter(email => email.valid);\n\nexport const pluralizeEmail = (count: number): string =>\n count === 1 ? \"email\" : \"emails\";\n\nexport const formatDuplicateWarning = (duplicates: string[]): string => {\n const count = duplicates.length;\n\n return `Removed ${count} duplicate ${pluralizeEmail(count)} from the list: ${duplicates.join(\", \")}`;\n};\n","import { useState, useCallback, useMemo } from \"react\";\n\nimport { UNSTRICT_EMAIL_REGEX, EMAIL_SEPARATION_REGEX } from \"./constants\";\nimport { pruneDuplicates, filterValidEmails } from \"./utils\";\nimport type { MultiEmailInputProps } from \"./types\";\n\nexport function useMultiEmailState(props: MultiEmailInputProps) {\n const {\n value = [],\n onChange,\n onBlur,\n visibleEmailsCount = 3,\n isAlwaysExpanded = false,\n counter,\n filterInvalidEmails,\n } = props;\n\n const [inputValue, setInputValue] = useState(\"\");\n const [isFocused, setIsFocused] = useState(false);\n const [duplicateEmails, setDuplicateEmails] = useState<string[]>([]);\n\n const addEmails = useCallback(\n (input: string) => {\n const trimmed = input.trim();\n if (!trimmed) return;\n UNSTRICT_EMAIL_REGEX.lastIndex = 0;\n EMAIL_SEPARATION_REGEX.lastIndex = 0;\n const emailMatches =\n trimmed.match(UNSTRICT_EMAIL_REGEX) ||\n trimmed.match(EMAIL_SEPARATION_REGEX) ||\n [];\n if (emailMatches.length === 0) return;\n const { uniqueEmails, duplicates } = pruneDuplicates(value, emailMatches);\n onChange?.(uniqueEmails);\n setDuplicateEmails(duplicates);\n setInputValue(\"\");\n },\n [value, onChange]\n );\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (!inputValue && event.key === \"Backspace\" && value.length > 0) {\n onChange?.(value.slice(0, -1));\n return;\n }\n if (!inputValue) return;\n if ([\"Enter\", \"Tab\", \",\", \" \"].includes(event.key)) {\n addEmails(inputValue);\n event.preventDefault();\n event.stopPropagation();\n }\n },\n [inputValue, value, onChange, addEmails]\n );\n\n const handlePaste = useCallback(\n (event: React.ClipboardEvent<HTMLInputElement>) => {\n const text = event.clipboardData.getData(\"text\");\n if (!text) return;\n event.preventDefault();\n addEmails(text);\n },\n [addEmails]\n );\n\n const handleBlur = useCallback(() => {\n if (inputValue) {\n addEmails(inputValue);\n } else {\n onBlur?.();\n }\n setIsFocused(false);\n setDuplicateEmails([]);\n }, [inputValue, addEmails, onBlur]);\n\n const handleFocus = useCallback(() => setIsFocused(true), []);\n\n const handleChipRemove = useCallback(\n (emailValue: string) =>\n onChange?.(value.filter(e => e.value !== emailValue)),\n [value, onChange]\n );\n\n const handleFilterInvalidEmails = useCallback(\n () => onChange?.(filterValidEmails(value)),\n [value, onChange]\n );\n\n const validCount = useMemo(() => value.filter(e => e.valid).length, [value]);\n const isCounterVisible =\n !!counter &&\n (typeof counter === \"boolean\" ||\n !counter.startsFrom ||\n validCount >= counter.startsFrom);\n const shouldCollapse =\n !isAlwaysExpanded && !isFocused && value.length > visibleEmailsCount;\n const visibleEmails = shouldCollapse\n ? value.slice(0, visibleEmailsCount)\n : value;\n const hiddenCount = shouldCollapse ? value.length - visibleEmailsCount : 0;\n const isFilterLinkVisible =\n !!filterInvalidEmails && value.length > validCount;\n\n return {\n inputValue,\n setInputValue,\n isFocused,\n duplicateEmails,\n handleKeyDown,\n handlePaste,\n handleBlur,\n handleFocus,\n handleChipRemove,\n handleFilterInvalidEmails,\n isCounterVisible,\n validCount,\n visibleEmails,\n hiddenCount,\n isFilterLinkVisible,\n };\n}\n","import React, { forwardRef, useId } from \"react\";\nimport { XIcon } from \"lucide-react\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\nimport { Field, FieldLabel, FieldContent } from \"src/primitives/Field\";\nimport { useMultiEmailState } from \"./useMultiEmailState\";\nimport { pluralizeEmail, formatDuplicateWarning } from \"./utils\";\nimport type { MultiEmailInputProps } from \"./types\";\n\nconst CHIP_BASE =\n \"flex h-[calc(--spacing(5.25))] w-fit items-center justify-center gap-1 rounded-sm bg-muted px-1.5 text-xs font-medium whitespace-nowrap text-foreground\";\nconst CHIP_INVALID =\n \"border border-destructive text-destructive bg-destructive/10\";\nconst CHIPS_CONTAINER =\n \"flex min-h-8 flex-wrap items-center gap-1 rounded-lg border border-input bg-transparent bg-clip-padding px-2.5 py-1 text-sm transition-colors focus-within:border-ring focus-within:ring-3 focus-within:ring-ring/50\";\nconst CHIPS_ERROR =\n \"border-destructive ring-3 ring-destructive/20 dark:border-destructive/50 dark:ring-destructive/40\";\n\nexport const MultiEmailInput = forwardRef<\n HTMLInputElement,\n MultiEmailInputProps\n>((props, ref) => {\n const {\n label,\n placeholder = \"\",\n helpText,\n error,\n disabled = false,\n required = false,\n maxHeight = 200,\n counter,\n filterInvalidEmails,\n prefix,\n suffix,\n labelProps,\n className,\n } = props;\n const id = useId();\n const s = useMultiEmailState(props);\n\n return (\n <Field className={cn(\"flex flex-col gap-1.5\", className)}>\n {(label || s.isCounterVisible) && (\n <div className=\"flex items-center justify-between\">\n {label && (\n <FieldLabel htmlFor={id} {...labelProps}>\n {label}\n {required && (\n <span aria-hidden=\"true\" className=\"text-destructive\">\n {\" *\"}\n </span>\n )}\n </FieldLabel>\n )}\n {s.isCounterVisible && (\n <span className=\"text-xs text-muted-foreground\">\n {s.validCount}{\" \"}\n {typeof counter === \"object\" && counter?.label\n ? counter.label\n : pluralizeEmail(s.validCount)}\n </span>\n )}\n </div>\n )}\n <div\n className={cn(\n CHIPS_CONTAINER,\n !!error && CHIPS_ERROR,\n disabled && \"pointer-events-none opacity-50\"\n )}\n style={{ maxHeight: `${maxHeight}px`, overflowY: \"auto\" }}\n >\n {prefix && <div className=\"shrink-0\">{prefix}</div>}\n {s.visibleEmails.map(email => (\n <span\n key={email.value}\n className={cn(CHIP_BASE, !email.valid && CHIP_INVALID)}\n >\n {email.label}\n {!disabled && (\n <button\n type=\"button\"\n tabIndex={-1}\n className=\"-ms-0.5 rounded-xs opacity-50 hover:opacity-100\"\n onMouseDown={e => e.preventDefault()}\n onClick={() => s.handleChipRemove(email.value)}\n aria-label={`Remove ${email.label}`}\n >\n <XIcon className=\"size-3 pointer-events-none\" />\n </button>\n )}\n </span>\n ))}\n {s.hiddenCount > 0 && (\n <span className=\"flex h-[calc(--spacing(5.25))] items-center rounded-sm bg-secondary px-1.5 text-xs font-medium text-secondary-foreground\">\n +{s.hiddenCount} more\n </span>\n )}\n <input\n ref={ref}\n id={id}\n type=\"text\"\n value={s.inputValue}\n onChange={e => s.setInputValue(e.target.value)}\n onKeyDown={s.handleKeyDown}\n onPaste={s.handlePaste}\n onFocus={s.handleFocus}\n onBlur={s.handleBlur}\n placeholder={props.value?.length ? \"\" : placeholder}\n disabled={disabled}\n className=\"min-w-16 flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground\"\n />\n {suffix && <div className=\"shrink-0\">{suffix}</div>}\n </div>\n <FieldContent>\n {!!error && (\n <p className=\"text-[0.8rem] text-destructive\">\n {error}\n {s.isFilterLinkVisible && (\n <button\n type=\"button\"\n className=\"ml-1 cursor-pointer font-semibold underline\"\n onClick={s.handleFilterInvalidEmails}\n >\n {filterInvalidEmails?.label ??\n \"Click here to remove invalid emails.\"}\n </button>\n )}\n </p>\n )}\n {!!helpText && (\n <p className=\"text-[0.8rem] text-muted-foreground\">{helpText}</p>\n )}\n {s.duplicateEmails.length > 0 && (\n <p className=\"text-[0.8rem] text-amber-600 dark:text-amber-400\">\n {formatDuplicateWarning(s.duplicateEmails)}\n </p>\n )}\n </FieldContent>\n </Field>\n );\n});\nMultiEmailInput.displayName = \"MultiEmailInput\";\n"],"names":["useState","useCallback","useMemo","forwardRef","useId","_jsxs","Field","cn","FieldLabel","_jsx","XIcon","FieldContent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MultiEmailInput-l0_YVjbp.js","sources":["../../../src/components/MultiEmailInput/constants.ts","../../../src/components/MultiEmailInput/utils.ts","../../../src/components/MultiEmailInput/useMultiEmailState.ts","../../../src/components/MultiEmailInput/MultiEmailInput.tsx"],"sourcesContent":["export const EMAIL_REGEX = /^[A-Z0-9._%+-]+@[A-Z0-9-]+(?:\\.[A-Z0-9-]+)*\\.[A-Z]{2,}$/i;\n\nexport const UNSTRICT_EMAIL_REGEX =\n /(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))/g;\n\nexport const EMAIL_SEPARATION_REGEX = /[^\\s,]+/g;\n","import { EMAIL_REGEX } from \"./constants\";\nimport type { EmailValue } from \"./types\";\n\nexport const formatEmailInputOption = (email: string): EmailValue => ({\n label: email,\n value: email,\n valid: EMAIL_REGEX.test(email),\n});\n\nexport const pruneDuplicates = (\n existing: EmailValue[],\n newEmailStrings: string[]\n): { uniqueEmails: EmailValue[]; duplicates: string[] } => {\n const seen = new Set(existing.map(e => e.value.toLowerCase()));\n const duplicates: string[] = [];\n const added: EmailValue[] = [];\n\n for (const emailStr of newEmailStrings) {\n const lower = emailStr.toLowerCase();\n if (seen.has(lower)) {\n duplicates.push(emailStr);\n } else {\n seen.add(lower);\n added.push(formatEmailInputOption(emailStr));\n }\n }\n\n return { uniqueEmails: [...existing, ...added], duplicates };\n};\n\nexport const filterValidEmails = (emails: EmailValue[]): EmailValue[] =>\n emails.filter(email => email.valid);\n\nexport const pluralizeEmail = (count: number): string =>\n count === 1 ? \"email\" : \"emails\";\n\nexport const formatDuplicateWarning = (duplicates: string[]): string => {\n const count = duplicates.length;\n\n return `Removed ${count} duplicate ${pluralizeEmail(count)} from the list: ${duplicates.join(\", \")}`;\n};\n","import { useState, useCallback, useMemo } from \"react\";\n\nimport { UNSTRICT_EMAIL_REGEX, EMAIL_SEPARATION_REGEX } from \"./constants\";\nimport { pruneDuplicates, filterValidEmails } from \"./utils\";\nimport type { MultiEmailInputProps } from \"./types\";\n\nexport function useMultiEmailState(props: MultiEmailInputProps) {\n const {\n value = [],\n onChange,\n onBlur,\n visibleEmailsCount = 3,\n isAlwaysExpanded = false,\n counter,\n filterInvalidEmails,\n } = props;\n\n const [inputValue, setInputValue] = useState(\"\");\n const [isFocused, setIsFocused] = useState(false);\n const [duplicateEmails, setDuplicateEmails] = useState<string[]>([]);\n\n const addEmails = useCallback(\n (input: string) => {\n const trimmed = input.trim();\n if (!trimmed) return;\n UNSTRICT_EMAIL_REGEX.lastIndex = 0;\n EMAIL_SEPARATION_REGEX.lastIndex = 0;\n const emailMatches =\n trimmed.match(UNSTRICT_EMAIL_REGEX) ||\n trimmed.match(EMAIL_SEPARATION_REGEX) ||\n [];\n if (emailMatches.length === 0) return;\n const { uniqueEmails, duplicates } = pruneDuplicates(value, emailMatches);\n onChange?.(uniqueEmails);\n setDuplicateEmails(duplicates);\n setInputValue(\"\");\n },\n [value, onChange]\n );\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (!inputValue && event.key === \"Backspace\" && value.length > 0) {\n onChange?.(value.slice(0, -1));\n return;\n }\n if (!inputValue) return;\n if ([\"Enter\", \"Tab\", \",\", \" \"].includes(event.key)) {\n addEmails(inputValue);\n event.preventDefault();\n event.stopPropagation();\n }\n },\n [inputValue, value, onChange, addEmails]\n );\n\n const handlePaste = useCallback(\n (event: React.ClipboardEvent<HTMLInputElement>) => {\n const text = event.clipboardData.getData(\"text\");\n if (!text) return;\n event.preventDefault();\n addEmails(text);\n },\n [addEmails]\n );\n\n const handleBlur = useCallback(() => {\n if (inputValue) {\n addEmails(inputValue);\n } else {\n onBlur?.();\n }\n setIsFocused(false);\n setDuplicateEmails([]);\n }, [inputValue, addEmails, onBlur]);\n\n const handleFocus = useCallback(() => setIsFocused(true), []);\n\n const handleChipRemove = useCallback(\n (emailValue: string) =>\n onChange?.(value.filter(e => e.value !== emailValue)),\n [value, onChange]\n );\n\n const handleFilterInvalidEmails = useCallback(\n () => onChange?.(filterValidEmails(value)),\n [value, onChange]\n );\n\n const validCount = useMemo(() => value.filter(e => e.valid).length, [value]);\n const isCounterVisible =\n !!counter &&\n (typeof counter === \"boolean\" ||\n !counter.startsFrom ||\n validCount >= counter.startsFrom);\n const shouldCollapse =\n !isAlwaysExpanded && !isFocused && value.length > visibleEmailsCount;\n const visibleEmails = shouldCollapse\n ? value.slice(0, visibleEmailsCount)\n : value;\n const hiddenCount = shouldCollapse ? value.length - visibleEmailsCount : 0;\n const isFilterLinkVisible =\n !!filterInvalidEmails && value.length > validCount;\n\n return {\n inputValue,\n setInputValue,\n isFocused,\n duplicateEmails,\n handleKeyDown,\n handlePaste,\n handleBlur,\n handleFocus,\n handleChipRemove,\n handleFilterInvalidEmails,\n isCounterVisible,\n validCount,\n visibleEmails,\n hiddenCount,\n isFilterLinkVisible,\n };\n}\n","import { forwardRef, useId } from \"react\";\nimport { XIcon } from \"lucide-react\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\nimport { Field, FieldLabel, FieldContent } from \"src/primitives/Field\";\nimport { useMultiEmailState } from \"./useMultiEmailState\";\nimport { pluralizeEmail, formatDuplicateWarning } from \"./utils\";\nimport type { MultiEmailInputProps } from \"./types\";\n\nconst CHIP_BASE =\n \"flex h-[calc(--spacing(5.25))] w-fit items-center justify-center gap-1 rounded-sm bg-muted px-1.5 text-xs font-medium whitespace-nowrap text-foreground\";\nconst CHIP_INVALID =\n \"border border-destructive text-destructive bg-destructive/10\";\nconst CHIPS_CONTAINER =\n \"flex min-h-8 flex-wrap items-center gap-1 rounded-lg border border-input bg-transparent bg-clip-padding px-2.5 py-1 text-sm transition-colors focus-within:border-ring focus-within:ring-3 focus-within:ring-ring/50\";\nconst CHIPS_ERROR =\n \"border-destructive ring-3 ring-destructive/20 dark:border-destructive/50 dark:ring-destructive/40\";\n\nexport const MultiEmailInput = forwardRef<\n HTMLInputElement,\n MultiEmailInputProps\n>((props, ref) => {\n const {\n label,\n placeholder = \"\",\n helpText,\n error,\n disabled = false,\n required = false,\n maxHeight = 200,\n counter,\n filterInvalidEmails,\n prefix,\n suffix,\n labelProps,\n className,\n } = props;\n const id = useId();\n const s = useMultiEmailState(props);\n\n return (\n <Field className={cn(\"flex flex-col gap-1.5\", className)}>\n {(label || s.isCounterVisible) && (\n <div className=\"flex items-center justify-between\">\n {label && (\n <FieldLabel htmlFor={id} {...labelProps}>\n {label}\n {required && (\n <span aria-hidden=\"true\" className=\"text-destructive\">\n {\" *\"}\n </span>\n )}\n </FieldLabel>\n )}\n {s.isCounterVisible && (\n <span className=\"text-xs text-muted-foreground\">\n {s.validCount}{\" \"}\n {typeof counter === \"object\" && counter?.label\n ? counter.label\n : pluralizeEmail(s.validCount)}\n </span>\n )}\n </div>\n )}\n <div\n className={cn(\n CHIPS_CONTAINER,\n !!error && CHIPS_ERROR,\n disabled && \"pointer-events-none opacity-50\"\n )}\n style={{ maxHeight: `${maxHeight}px`, overflowY: \"auto\" }}\n >\n {prefix && <div className=\"shrink-0\">{prefix}</div>}\n {s.visibleEmails.map(email => (\n <span\n key={email.value}\n className={cn(CHIP_BASE, !email.valid && CHIP_INVALID)}\n >\n {email.label}\n {!disabled && (\n <button\n type=\"button\"\n tabIndex={-1}\n className=\"-ms-0.5 rounded-xs opacity-50 hover:opacity-100\"\n onMouseDown={e => e.preventDefault()}\n onClick={() => s.handleChipRemove(email.value)}\n aria-label={`Remove ${email.label}`}\n >\n <XIcon className=\"size-3 pointer-events-none\" />\n </button>\n )}\n </span>\n ))}\n {s.hiddenCount > 0 && (\n <span className=\"flex h-[calc(--spacing(5.25))] items-center rounded-sm bg-secondary px-1.5 text-xs font-medium text-secondary-foreground\">\n +{s.hiddenCount} more\n </span>\n )}\n <input\n ref={ref}\n id={id}\n type=\"text\"\n value={s.inputValue}\n onChange={e => s.setInputValue(e.target.value)}\n onKeyDown={s.handleKeyDown}\n onPaste={s.handlePaste}\n onFocus={s.handleFocus}\n onBlur={s.handleBlur}\n placeholder={props.value?.length ? \"\" : placeholder}\n disabled={disabled}\n className=\"min-w-16 flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground\"\n />\n {suffix && <div className=\"shrink-0\">{suffix}</div>}\n </div>\n <FieldContent>\n {!!error && (\n <p className=\"text-[0.8rem] text-destructive\">\n {error}\n {s.isFilterLinkVisible && (\n <button\n type=\"button\"\n className=\"ml-1 cursor-pointer font-semibold underline\"\n onClick={s.handleFilterInvalidEmails}\n >\n {filterInvalidEmails?.label ??\n \"Click here to remove invalid emails.\"}\n </button>\n )}\n </p>\n )}\n {!!helpText && (\n <p className=\"text-[0.8rem] text-muted-foreground\">{helpText}</p>\n )}\n {s.duplicateEmails.length > 0 && (\n <p className=\"text-[0.8rem] text-amber-600 dark:text-amber-400\">\n {formatDuplicateWarning(s.duplicateEmails)}\n </p>\n )}\n </FieldContent>\n </Field>\n );\n});\nMultiEmailInput.displayName = \"MultiEmailInput\";\n"],"names":["useState","useCallback","useMemo","forwardRef","useId","_jsxs","Field","cn","FieldLabel","_jsx","XIcon","FieldContent"],"mappings":";;;;;;;;AAAO,MAAM,WAAW,GAAG,0DAA0D;AAE9E,MAAM,oBAAoB,GAC/B,sJAAsJ;AAEjJ,MAAM,sBAAsB,GAAG,UAAU;;ACFzC,MAAM,sBAAsB,GAAG,CAAC,KAAa,MAAkB;AACpE,IAAA,KAAK,EAAE,KAAK;AACZ,IAAA,KAAK,EAAE,KAAK;AACZ,IAAA,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;AAC/B,CAAA,CAAC;AAEK,MAAM,eAAe,GAAG,CAC7B,QAAsB,EACtB,eAAyB,KAC+B;IACxD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;IAC9D,MAAM,UAAU,GAAa,EAAE;IAC/B,MAAM,KAAK,GAAiB,EAAE;AAE9B,IAAA,KAAK,MAAM,QAAQ,IAAI,eAAe,EAAE;AACtC,QAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE;AACpC,QAAA,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;AACnB,YAAA,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC3B;aAAO;AACL,YAAA,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC;QAC9C;IACF;AAEA,IAAA,OAAO,EAAE,YAAY,EAAE,CAAC,GAAG,QAAQ,EAAE,GAAG,KAAK,CAAC,EAAE,UAAU,EAAE;AAC9D,CAAC;AAEM,MAAM,iBAAiB,GAAG,CAAC,MAAoB,KACpD,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC;AAE9B,MAAM,cAAc,GAAG,CAAC,KAAa,KAC1C,KAAK,KAAK,CAAC,GAAG,OAAO,GAAG,QAAQ;AAE3B,MAAM,sBAAsB,GAAG,CAAC,UAAoB,KAAY;AACrE,IAAA,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM;AAE/B,IAAA,OAAO,CAAA,QAAA,EAAW,KAAK,CAAA,WAAA,EAAc,cAAc,CAAC,KAAK,CAAC,CAAA,gBAAA,EAAmB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AACtG,CAAC;;AClCK,SAAU,kBAAkB,CAAC,KAA2B,EAAA;IAC5D,MAAM,EACJ,KAAK,GAAG,EAAE,EACV,QAAQ,EACR,MAAM,EACN,kBAAkB,GAAG,CAAC,EACtB,gBAAgB,GAAG,KAAK,EACxB,OAAO,EACP,mBAAmB,GACpB,GAAG,KAAK;IAET,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAGA,cAAQ,CAAC,EAAE,CAAC;IAChD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAGA,cAAQ,CAAC,KAAK,CAAC;IACjD,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAGA,cAAQ,CAAW,EAAE,CAAC;AAEpE,IAAA,MAAM,SAAS,GAAGC,iBAAW,CAC3B,CAAC,KAAa,KAAI;AAChB,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE;AAC5B,QAAA,IAAI,CAAC,OAAO;YAAE;AACd,QAAA,oBAAoB,CAAC,SAAS,GAAG,CAAC;AAClC,QAAA,sBAAsB,CAAC,SAAS,GAAG,CAAC;AACpC,QAAA,MAAM,YAAY,GAChB,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC;AACnC,YAAA,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC;AACrC,YAAA,EAAE;AACJ,QAAA,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;YAAE;AAC/B,QAAA,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,eAAe,CAAC,KAAK,EAAE,YAAY,CAAC;AACzE,QAAA,QAAQ,GAAG,YAAY,CAAC;QACxB,kBAAkB,CAAC,UAAU,CAAC;QAC9B,aAAa,CAAC,EAAE,CAAC;AACnB,IAAA,CAAC,EACD,CAAC,KAAK,EAAE,QAAQ,CAAC,CAClB;AAED,IAAA,MAAM,aAAa,GAAGA,iBAAW,CAC/B,CAAC,KAA4C,KAAI;AAC/C,QAAA,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AAChE,YAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC9B;QACF;AACA,QAAA,IAAI,CAAC,UAAU;YAAE;AACjB,QAAA,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;YAClD,SAAS,CAAC,UAAU,CAAC;YACrB,KAAK,CAAC,cAAc,EAAE;YACtB,KAAK,CAAC,eAAe,EAAE;QACzB;IACF,CAAC,EACD,CAAC,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,CACzC;AAED,IAAA,MAAM,WAAW,GAAGA,iBAAW,CAC7B,CAAC,KAA6C,KAAI;QAChD,MAAM,IAAI,GAAG,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC;AAChD,QAAA,IAAI,CAAC,IAAI;YAAE;QACX,KAAK,CAAC,cAAc,EAAE;QACtB,SAAS,CAAC,IAAI,CAAC;AACjB,IAAA,CAAC,EACD,CAAC,SAAS,CAAC,CACZ;AAED,IAAA,MAAM,UAAU,GAAGA,iBAAW,CAAC,MAAK;QAClC,IAAI,UAAU,EAAE;YACd,SAAS,CAAC,UAAU,CAAC;QACvB;aAAO;YACL,MAAM,IAAI;QACZ;QACA,YAAY,CAAC,KAAK,CAAC;QACnB,kBAAkB,CAAC,EAAE,CAAC;IACxB,CAAC,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AAEnC,IAAA,MAAM,WAAW,GAAGA,iBAAW,CAAC,MAAM,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;AAE7D,IAAA,MAAM,gBAAgB,GAAGA,iBAAW,CAClC,CAAC,UAAkB,KACjB,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,EACvD,CAAC,KAAK,EAAE,QAAQ,CAAC,CAClB;IAED,MAAM,yBAAyB,GAAGA,iBAAW,CAC3C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC,EAC1C,CAAC,KAAK,EAAE,QAAQ,CAAC,CAClB;IAED,MAAM,UAAU,GAAGC,aAAO,CAAC,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC;AAC5E,IAAA,MAAM,gBAAgB,GACpB,CAAC,CAAC,OAAO;SACR,OAAO,OAAO,KAAK,SAAS;YAC3B,CAAC,OAAO,CAAC,UAAU;AACnB,YAAA,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC;AACrC,IAAA,MAAM,cAAc,GAClB,CAAC,gBAAgB,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,kBAAkB;IACtE,MAAM,aAAa,GAAG;UAClB,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,kBAAkB;UACjC,KAAK;AACT,IAAA,MAAM,WAAW,GAAG,cAAc,GAAG,KAAK,CAAC,MAAM,GAAG,kBAAkB,GAAG,CAAC;IAC1E,MAAM,mBAAmB,GACvB,CAAC,CAAC,mBAAmB,IAAI,KAAK,CAAC,MAAM,GAAG,UAAU;IAEpD,OAAO;QACL,UAAU;QACV,aAAa;QACb,SAAS;QACT,eAAe;QACf,aAAa;QACb,WAAW;QACX,UAAU;QACV,WAAW;QACX,gBAAgB;QAChB,yBAAyB;QACzB,gBAAgB;QAChB,UAAU;QACV,aAAa;QACb,WAAW;QACX,mBAAmB;KACpB;AACH;;AChHA,MAAM,SAAS,GACb,yJAAyJ;AAC3J,MAAM,YAAY,GAChB,8DAA8D;AAChE,MAAM,eAAe,GACnB,sNAAsN;AACxN,MAAM,WAAW,GACf,mGAAmG;AAE9F,MAAM,eAAe,GAAGC,gBAAU,CAGvC,CAAC,KAAK,EAAE,GAAG,KAAI;AACf,IAAA,MAAM,EACJ,KAAK,EACL,WAAW,GAAG,EAAE,EAChB,QAAQ,EACR,KAAK,EACL,QAAQ,GAAG,KAAK,EAChB,QAAQ,GAAG,KAAK,EAChB,SAAS,GAAG,GAAG,EACf,OAAO,EACP,mBAAmB,EACnB,MAAM,EACN,MAAM,EACN,UAAU,EACV,SAAS,GACV,GAAG,KAAK;AACT,IAAA,MAAM,EAAE,GAAGC,WAAK,EAAE;AAClB,IAAA,MAAM,CAAC,GAAG,kBAAkB,CAAC,KAAK,CAAC;AAEnC,IAAA,QACEC,eAAA,CAACC,sBAAK,EAAA,EAAC,SAAS,EAAEC,QAAE,CAAC,uBAAuB,EAAE,SAAS,CAAC,EAAA,QAAA,EAAA,CACrD,CAAC,KAAK,IAAI,CAAC,CAAC,gBAAgB,MAC3BF,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,mCAAmC,aAC/C,KAAK,KACJA,eAAA,CAACG,2BAAU,EAAA,EAAC,OAAO,EAAE,EAAE,EAAA,GAAM,UAAU,EAAA,QAAA,EAAA,CACpC,KAAK,EACL,QAAQ,KACPC,cAAA,CAAA,MAAA,EAAA,EAAA,aAAA,EAAkB,MAAM,EAAC,SAAS,EAAC,kBAAkB,EAAA,QAAA,EAClD,IAAI,GACA,CACR,CAAA,EAAA,CACU,CACd,EACA,CAAC,CAAC,gBAAgB,KACjBJ,eAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,+BAA+B,EAAA,QAAA,EAAA,CAC5C,CAAC,CAAC,UAAU,EAAE,GAAG,EACjB,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,EAAE;kCACrC,OAAO,CAAC;AACV,kCAAE,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC,CAAA,EAAA,CAC3B,CACR,IACG,CACP,EACDA,eAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAEE,QAAE,CACX,eAAe,EACf,CAAC,CAAC,KAAK,IAAI,WAAW,EACtB,QAAQ,IAAI,gCAAgC,CAC7C,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,CAAA,EAAG,SAAS,CAAA,EAAA,CAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAA,QAAA,EAAA,CAExD,MAAM,IAAIE,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,UAAU,EAAA,QAAA,EAAE,MAAM,GAAO,EAClD,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,KACxBJ,eAAA,CAAA,MAAA,EAAA,EAEE,SAAS,EAAEE,QAAE,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,YAAY,CAAC,EAAA,QAAA,EAAA,CAErD,KAAK,CAAC,KAAK,EACX,CAAC,QAAQ,KACRE,cAAA,CAAA,QAAA,EAAA,EACE,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,EAAE,EACZ,SAAS,EAAC,iDAAiD,EAC3D,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,EACpC,OAAO,EAAE,MAAM,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,EAAA,YAAA,EAClC,CAAA,OAAA,EAAU,KAAK,CAAC,KAAK,CAAA,CAAE,EAAA,QAAA,EAEnCA,cAAA,CAACC,GAAK,EAAA,EAAC,SAAS,EAAC,4BAA4B,EAAA,CAAG,EAAA,CACzC,CACV,KAfI,KAAK,CAAC,KAAK,CAgBX,CACR,CAAC,EACD,CAAC,CAAC,WAAW,GAAG,CAAC,KAChBL,eAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,0HAA0H,kBACtI,CAAC,CAAC,WAAW,EAAA,OAAA,CAAA,EAAA,CACV,CACR,EACDI,cAAA,CAAA,OAAA,EAAA,EACE,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,EAAE,EACN,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,CAAC,CAAC,UAAU,EACnB,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC9C,SAAS,EAAE,CAAC,CAAC,aAAa,EAC1B,OAAO,EAAE,CAAC,CAAC,WAAW,EACtB,OAAO,EAAE,CAAC,CAAC,WAAW,EACtB,MAAM,EAAE,CAAC,CAAC,UAAU,EACpB,WAAW,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,EAAE,GAAG,WAAW,EACnD,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAC,uFAAuF,GACjG,EACD,MAAM,IAAIA,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,UAAU,EAAA,QAAA,EAAE,MAAM,GAAO,CAAA,EAAA,CAC/C,EACNJ,eAAA,CAACM,6BAAY,EAAA,EAAA,QAAA,EAAA,CACV,CAAC,CAAC,KAAK,KACNN,eAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,gCAAgC,EAAA,QAAA,EAAA,CAC1C,KAAK,EACL,CAAC,CAAC,mBAAmB,KACpBI,cAAA,CAAA,QAAA,EAAA,EACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,6CAA6C,EACvD,OAAO,EAAE,CAAC,CAAC,yBAAyB,EAAA,QAAA,EAEnC,mBAAmB,EAAE,KAAK;oCACzB,sCAAsC,EAAA,CACjC,CACV,CAAA,EAAA,CACC,CACL,EACA,CAAC,CAAC,QAAQ,KACTA,sBAAG,SAAS,EAAC,qCAAqC,EAAA,QAAA,EAAE,QAAQ,GAAK,CAClE,EACA,CAAC,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,KAC3BA,sBAAG,SAAS,EAAC,kDAAkD,EAAA,QAAA,EAC5D,sBAAsB,CAAC,CAAC,CAAC,eAAe,CAAC,EAAA,CACxC,CACL,CAAA,EAAA,CACY,CAAA,EAAA,CACT;AAEZ,CAAC;AACD,eAAe,CAAC,WAAW,GAAG,iBAAiB;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RadioGroup-1RAoe38m.js","sources":["../../../src/components/RadioGroup/RadioGroup.tsx"],"sourcesContent":["import React, { forwardRef, useId } from \"react\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\nimport {\n RadioGroup as PrimitiveRadioGroup,\n RadioGroupItem as PrimitiveRadioGroupItem,\n} from \"src/primitives/RadioGroup\";\nimport { Label } from \"src/primitives/Label\";\nimport {\n Field,\n FieldLabel,\n FieldContent,\n FieldDescription,\n FieldError,\n} from \"src/primitives/Field\";\n\nexport interface RadioGroupProps extends Omit<\n React.ComponentProps<typeof PrimitiveRadioGroup>,\n \"children\"\n> {\n /** Group label displayed above the radio items. */\n label?: string;\n /** Error message displayed below the group. */\n error?: string;\n /** Helper text displayed below the group label. Accepts string or ReactNode. */\n helpText?: React.ReactNode;\n /** Layout orientation. Defaults to \"horizontal\". */\n orientation?: \"horizontal\" | \"vertical\";\n /** Additional class name for the outermost wrapper. */\n className?: string;\n /** RadioGroup.Item children. */\n children?: React.ReactNode;\n}\n\
|
|
1
|
+
{"version":3,"file":"RadioGroup-1RAoe38m.js","sources":["../../../src/components/RadioGroup/RadioGroup.tsx"],"sourcesContent":["import React, { forwardRef, useId } from \"react\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\nimport {\n RadioGroup as PrimitiveRadioGroup,\n RadioGroupItem as PrimitiveRadioGroupItem,\n} from \"src/primitives/RadioGroup\";\nimport { Label } from \"src/primitives/Label\";\nimport {\n Field,\n FieldLabel,\n FieldContent,\n FieldDescription,\n FieldError,\n} from \"src/primitives/Field\";\n\nexport interface RadioGroupProps extends Omit<\n React.ComponentProps<typeof PrimitiveRadioGroup>,\n \"children\"\n> {\n /** Group label displayed above the radio items. */\n label?: string;\n /** Error message displayed below the group. */\n error?: string;\n /** Helper text displayed below the group label. Accepts string or ReactNode. */\n helpText?: React.ReactNode;\n /** Layout orientation. Defaults to \"horizontal\". */\n orientation?: \"horizontal\" | \"vertical\";\n /** Additional class name for the outermost wrapper. */\n className?: string;\n /** RadioGroup.Item children. */\n children?: React.ReactNode;\n}\n\nexport interface RadioGroupItemProps extends React.ComponentProps<\n typeof PrimitiveRadioGroupItem\n> {\n /** Label displayed next to the radio. */\n label?: string;\n /** Helper text displayed below the item label. Accepts string or ReactNode. */\n helpText?: React.ReactNode;\n /** Radio value (required). */\n value: string;\n /** Additional class name for the item wrapper. */\n className?: string;\n /** Optional id override; auto-generated if omitted. */\n id?: string;\n}\n\nconst RadioGroupItem = forwardRef<\n React.ComponentRef<typeof PrimitiveRadioGroupItem>,\n RadioGroupItemProps\n>(({ label, helpText, value, className, id: idProp, ...props }, ref) => {\n const generatedId = useId();\n const id = idProp ?? generatedId;\n const helpTextId = `helpText_${id}`;\n\n return (\n <div\n className={cn(\n \"flex gap-2\",\n helpText ? \"items-start\" : \"items-center\",\n className\n )}\n >\n <PrimitiveRadioGroupItem\n ref={ref}\n id={id}\n value={value}\n aria-describedby={helpText ? helpTextId : undefined}\n className={helpText ? \"mt-0.5\" : undefined}\n {...props}\n />\n {(label || helpText) && (\n <div className=\"flex flex-col gap-0.5\">\n {label && (\n <Label htmlFor={id} className=\"cursor-pointer font-normal\">\n {label}\n </Label>\n )}\n {helpText && (\n <FieldDescription id={helpTextId}>{helpText}</FieldDescription>\n )}\n </div>\n )}\n </div>\n );\n});\n\nRadioGroupItem.displayName = \"RadioGroup.Item\";\n\nconst RadioGroupRoot = forwardRef<\n React.ComponentRef<typeof PrimitiveRadioGroup>,\n RadioGroupProps\n>(\n (\n {\n label,\n error,\n helpText,\n orientation = \"horizontal\",\n className,\n disabled,\n required,\n children,\n ...props\n },\n ref\n ) => {\n const generatedId = useId();\n const errorId = `error_${generatedId}`;\n const helpTextId = `helpText_${generatedId}`;\n\n const hasField = !!(label || error || helpText);\n\n const radioGroup = (\n <PrimitiveRadioGroup\n ref={ref}\n disabled={disabled}\n required={required}\n aria-invalid={!!error || undefined}\n aria-describedby={\n [error ? errorId : null, helpText ? helpTextId : null]\n .filter(Boolean)\n .join(\" \") || undefined\n }\n orientation={orientation}\n className={cn(\n \"data-[orientation=vertical]:grid data-[orientation=vertical]:gap-2 data-[orientation=horizontal]:flex data-[orientation=horizontal]:flex-row data-[orientation=horizontal]:flex-wrap data-[orientation=horizontal]:items-center data-[orientation=horizontal]:gap-4\",\n !hasField && className\n )}\n {...props}\n >\n {children}\n </PrimitiveRadioGroup>\n );\n\n if (!hasField) {\n return radioGroup;\n }\n\n return (\n <Field\n data-disabled={disabled || undefined}\n data-invalid={!!error || undefined}\n className={className}\n >\n {(label || helpText) && (\n <div>\n {label && (\n <FieldLabel>\n {label}\n {required && (\n <span aria-hidden=\"true\" className=\"text-destructive\">\n *\n </span>\n )}\n </FieldLabel>\n )}\n {helpText && (\n <FieldDescription id={helpTextId}>{helpText}</FieldDescription>\n )}\n </div>\n )}\n <FieldContent>\n {radioGroup}\n {!!error && <FieldError id={errorId}>{error}</FieldError>}\n </FieldContent>\n </Field>\n );\n }\n);\n\nRadioGroupRoot.displayName = \"RadioGroup\";\n\nconst RadioGroup = Object.assign(RadioGroupRoot, {\n Item: RadioGroupItem,\n});\n\nexport { RadioGroup };\n"],"names":["forwardRef","useId","_jsxs","cn","_jsx","PrimitiveRadioGroupItem","Label","FieldDescription","PrimitiveRadioGroup","Field","FieldLabel","FieldContent","FieldError"],"mappings":"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"}
|
|
@@ -471,7 +471,9 @@ const SelectCombobox = React.forwardRef((p, ref) => {
|
|
|
471
471
|
e.preventDefault();
|
|
472
472
|
p.handleClear();
|
|
473
473
|
}, [p.handleClear]);
|
|
474
|
-
return (
|
|
474
|
+
return (
|
|
475
|
+
// @ts-expect-error — conditional spread creates a union that TS cannot narrow to the Combobox discriminated-union props
|
|
476
|
+
jsxRuntime.jsxs(primitives_Combobox.Combobox, { name: p.name, ...(p.effectiveItems && !p.children
|
|
475
477
|
? {
|
|
476
478
|
items: p.effectiveItems,
|
|
477
479
|
itemToStringLabel: p.labelForValue,
|
|
@@ -497,7 +499,9 @@ SelectCombobox.displayName = "SelectCombobox";
|
|
|
497
499
|
|
|
498
500
|
const MultiSelectCombobox = React.forwardRef((p, ref) => {
|
|
499
501
|
const { anchorEl, setAnchorEl, handleClick } = useComboboxAnchor(p.isSearchable);
|
|
500
|
-
return (
|
|
502
|
+
return (
|
|
503
|
+
// @ts-expect-error — conditional spread creates a union that TS cannot narrow to the Combobox discriminated-union props
|
|
504
|
+
jsxRuntime.jsxs(primitives_Combobox.Combobox, { multiple: true, name: p.name, ...(p.effectiveItems && !p.children
|
|
501
505
|
? {
|
|
502
506
|
items: p.effectiveItems,
|
|
503
507
|
itemToStringLabel: p.labelForValue,
|
|
@@ -564,4 +568,4 @@ const Select = React.forwardRef((props, ref) => {
|
|
|
564
568
|
Select.displayName = "Select";
|
|
565
569
|
|
|
566
570
|
exports.Select = Select;
|
|
567
|
-
//# sourceMappingURL=Select-
|
|
571
|
+
//# sourceMappingURL=Select-Br1AT_wm.js.map
|