@thangnqdev/ui 0.2.1 → 0.2.2
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/LICENSE +21 -21
- package/README.md +144 -142
- package/bin/cli.js +125 -125
- package/dist/bento/index.cjs.map +1 -1
- package/dist/bento/index.js +2 -2
- package/dist/buttons/index.cjs.map +1 -1
- package/dist/buttons/index.js +3 -3
- package/dist/{chunk-77KTYOMQ.js → chunk-2OXZK6IP.js} +3 -3
- package/dist/chunk-2OXZK6IP.js.map +1 -0
- package/dist/{chunk-4CRFNALF.js → chunk-4GNFT2ZJ.js} +7 -7
- package/dist/chunk-4GNFT2ZJ.js.map +1 -0
- package/dist/{chunk-2YJBW4E2.js → chunk-4S6L5V7X.js} +2 -2
- package/dist/chunk-4S6L5V7X.js.map +1 -0
- package/dist/{chunk-I2FQBMVW.js → chunk-66VWUJEI.js} +3 -3
- package/dist/chunk-66VWUJEI.js.map +1 -0
- package/dist/{chunk-YOCGBORV.js → chunk-7NMB2Y64.js} +4 -4
- package/dist/chunk-7NMB2Y64.js.map +1 -0
- package/dist/{chunk-V52JOSDF.js → chunk-A7P3O5Z5.js} +3 -3
- package/dist/chunk-A7P3O5Z5.js.map +1 -0
- package/dist/{chunk-ME4XILG5.js → chunk-ATYGDTMK.js} +5 -5
- package/dist/chunk-ATYGDTMK.js.map +1 -0
- package/dist/{chunk-S6XJMYME.js → chunk-C4SUXMI3.js} +3 -3
- package/dist/chunk-C4SUXMI3.js.map +1 -0
- package/dist/{chunk-EXFR2BFJ.js → chunk-DUPPPGXY.js} +7 -7
- package/dist/chunk-DUPPPGXY.js.map +1 -0
- package/dist/{chunk-I5O2WCGF.js → chunk-EU2LPUYP.js} +3 -3
- package/dist/chunk-EU2LPUYP.js.map +1 -0
- package/dist/{chunk-D7FB3TCA.js → chunk-GXI2H5XA.js} +3 -3
- package/dist/chunk-GXI2H5XA.js.map +1 -0
- package/dist/{chunk-ADO3SVUA.js → chunk-IABPUCAQ.js} +2 -2
- package/dist/chunk-IABPUCAQ.js.map +1 -0
- package/dist/{chunk-PC5SZFZC.js → chunk-JOKEKOP3.js} +8 -8
- package/dist/chunk-JOKEKOP3.js.map +1 -0
- package/dist/{chunk-GXWB6BSY.js → chunk-KUQWUTZA.js} +4 -4
- package/dist/chunk-KUQWUTZA.js.map +1 -0
- package/dist/{chunk-ZEDXARXW.js → chunk-U3J4UPV3.js} +2 -2
- package/dist/chunk-U3J4UPV3.js.map +1 -0
- package/dist/{chunk-DSEL7ELZ.js → chunk-VE2PNSDQ.js} +4 -4
- package/dist/chunk-VE2PNSDQ.js.map +1 -0
- package/dist/{chunk-YJ64RI7J.js → chunk-WAFHC4DQ.js} +3 -3
- package/dist/chunk-WAFHC4DQ.js.map +1 -0
- package/dist/{chunk-W5WNWTQC.js → chunk-YJ67WYVW.js} +5 -5
- package/dist/chunk-YJ67WYVW.js.map +1 -0
- package/dist/{chunk-4MS6ZHFQ.js → chunk-Z427NPMU.js} +7 -7
- package/dist/chunk-Z427NPMU.js.map +1 -0
- package/dist/core/index.cjs +4 -4
- package/dist/core/index.cjs.map +1 -1
- package/dist/core/index.js +2 -2
- package/dist/data-display/index.cjs.map +1 -1
- package/dist/data-display/index.js +5 -5
- package/dist/feedback/index.cjs.map +1 -1
- package/dist/feedback/index.js +2 -2
- package/dist/forms/index.cjs.map +1 -1
- package/dist/forms/index.js +8 -8
- package/dist/glass/index.cjs.map +1 -1
- package/dist/glass/index.js +2 -2
- package/dist/index.cjs +4 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +19 -19
- package/dist/layout/index.cjs.map +1 -1
- package/dist/layout/index.js +2 -2
- package/dist/navigation/index.cjs.map +1 -1
- package/dist/navigation/index.js +6 -6
- package/dist/overlays/index.cjs.map +1 -1
- package/dist/overlays/index.js +7 -7
- package/dist/reset.css +45 -45
- package/dist/tokens.css +11 -11
- package/dist/typography/index.cjs.map +1 -1
- package/dist/typography/index.js +4 -4
- package/llms.txt +3 -3
- package/package.json +165 -165
- package/scripts/postinstall.js +125 -125
- package/src/bento/BentoCard.tsx +140 -140
- package/src/bento/BentoGrid.tsx +50 -50
- package/src/bento/index.ts +2 -2
- package/src/bento/tokens.css +46 -46
- package/src/buttons/Button.tsx +104 -104
- package/src/buttons/ButtonGroup.tsx +43 -43
- package/src/buttons/IconButton.tsx +79 -79
- package/src/buttons/SplitButton.tsx +186 -186
- package/src/buttons/ToggleButton.tsx +157 -157
- package/src/buttons/index.ts +5 -5
- package/src/buttons/tokens.css +6 -6
- package/src/core/ThemeProvider.tsx +133 -133
- package/src/core/index.ts +2 -2
- package/src/core/tokens.css +134 -134
- package/src/data-display/Accordion.tsx +147 -147
- package/src/data-display/Avatar.tsx +134 -134
- package/src/data-display/Card.tsx +112 -112
- package/src/data-display/Chip.tsx +74 -74
- package/src/data-display/DataTablePro.tsx +534 -534
- package/src/data-display/StatCard.tsx +60 -60
- package/src/data-display/Table.tsx +74 -74
- package/src/data-display/Timeline.tsx +62 -62
- package/src/data-display/TreeView.tsx +279 -279
- package/src/data-display/tokens.css +4 -4
- package/src/feedback/Alert.tsx +80 -80
- package/src/feedback/EmptyState.tsx +45 -45
- package/src/feedback/Skeleton.tsx +66 -66
- package/src/feedback/Spinner.tsx +65 -65
- package/src/feedback/index.ts +5 -5
- package/src/feedback/tokens.css +4 -4
- package/src/forms/Checkbox.tsx +149 -149
- package/src/forms/CheckboxGroup.tsx +76 -76
- package/src/forms/Combobox.tsx +512 -512
- package/src/forms/DatePicker.tsx +784 -784
- package/src/forms/FileUpload.tsx +266 -266
- package/src/forms/FormField.tsx +115 -115
- package/src/forms/Input.tsx +151 -151
- package/src/forms/NumberInput.tsx +262 -262
- package/src/forms/PasswordInput.tsx +35 -35
- package/src/forms/PinInput.tsx +139 -139
- package/src/forms/Radio.tsx +142 -142
- package/src/forms/RangeSlider.tsx +237 -237
- package/src/forms/SearchInput.tsx +34 -34
- package/src/forms/Select.tsx +103 -103
- package/src/forms/Slider.tsx +85 -85
- package/src/forms/Textarea.tsx +114 -114
- package/src/forms/tokens.css +6 -6
- package/src/glass/GlassButton.tsx +59 -59
- package/src/glass/GlassCard.tsx +71 -71
- package/src/glass/index.ts +3 -3
- package/src/glass/tokens.css +81 -81
- package/src/index.ts +26 -26
- package/src/layout/AspectRatio.tsx +39 -39
- package/src/layout/Container.tsx +53 -53
- package/src/layout/Divider.tsx +61 -61
- package/src/layout/Flex.tsx +79 -79
- package/src/layout/Grid.tsx +124 -124
- package/src/layout/PageLayout.tsx +59 -59
- package/src/layout/Section.tsx +47 -47
- package/src/layout/Spacer.tsx +30 -30
- package/src/layout/Stack.tsx +88 -88
- package/src/layout/tokens.css +8 -8
- package/src/navigation/Breadcrumb.tsx +73 -73
- package/src/navigation/CommandPalette.tsx +142 -142
- package/src/navigation/DropdownMenu.tsx +244 -244
- package/src/navigation/Pagination.tsx +114 -114
- package/src/navigation/Stepper.tsx +93 -93
- package/src/navigation/Tabs.tsx +265 -265
- package/src/navigation/index.ts +6 -6
- package/src/navigation/tokens.css +4 -4
- package/src/overlays/AlertDialog.tsx +63 -63
- package/src/overlays/BottomSheet.tsx +143 -143
- package/src/overlays/ContextMenu.tsx +161 -161
- package/src/overlays/Drawer.tsx +160 -160
- package/src/overlays/FocusTrap.tsx +122 -122
- package/src/overlays/Modal.tsx +296 -296
- package/src/overlays/Popover.tsx +156 -156
- package/src/overlays/Portal.tsx +23 -23
- package/src/overlays/Toast.tsx +175 -175
- package/src/overlays/Tooltip.tsx +125 -125
- package/src/overlays/tokens.css +8 -8
- package/src/registry/components.ts +1368 -1368
- package/src/styles/components.css +39 -39
- package/src/styles/index.css +5 -5
- package/src/styles/reset.css +45 -45
- package/src/styles/tokens.css +11 -11
- package/src/typography/Blockquote.tsx +32 -32
- package/src/typography/Code.tsx +89 -89
- package/src/typography/Heading.tsx +56 -56
- package/src/typography/Kbd.tsx +25 -25
- package/src/typography/Label.tsx +47 -47
- package/src/typography/Link.tsx +56 -56
- package/src/typography/Text.tsx +62 -62
- package/src/typography/index.ts +7 -7
- package/src/typography/tokens.css +5 -5
- package/src/utils/cn.ts +6 -6
- package/src/utils/scroll-lock.ts +19 -19
- package/src/utils/useControllableState.ts +54 -54
- package/ui-contract.json +1 -1
- package/dist/chunk-2YJBW4E2.js.map +0 -1
- package/dist/chunk-4CRFNALF.js.map +0 -1
- package/dist/chunk-4MS6ZHFQ.js.map +0 -1
- package/dist/chunk-77KTYOMQ.js.map +0 -1
- package/dist/chunk-ADO3SVUA.js.map +0 -1
- package/dist/chunk-D7FB3TCA.js.map +0 -1
- package/dist/chunk-DSEL7ELZ.js.map +0 -1
- package/dist/chunk-EXFR2BFJ.js.map +0 -1
- package/dist/chunk-GXWB6BSY.js.map +0 -1
- package/dist/chunk-I2FQBMVW.js.map +0 -1
- package/dist/chunk-I5O2WCGF.js.map +0 -1
- package/dist/chunk-ME4XILG5.js.map +0 -1
- package/dist/chunk-PC5SZFZC.js.map +0 -1
- package/dist/chunk-S6XJMYME.js.map +0 -1
- package/dist/chunk-V52JOSDF.js.map +0 -1
- package/dist/chunk-W5WNWTQC.js.map +0 -1
- package/dist/chunk-YJ64RI7J.js.map +0 -1
- package/dist/chunk-YOCGBORV.js.map +0 -1
- package/dist/chunk-ZEDXARXW.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/forms/index.ts","../src/forms/Input.tsx","../src/forms/SearchInput.tsx","../src/forms/PasswordInput.tsx","../src/forms/Textarea.tsx","../src/forms/Select.tsx","../src/forms/Radio.tsx","../src/forms/Switch.tsx","../src/forms/Slider.tsx","../src/forms/RangeSlider.tsx","../src/forms/PinInput.tsx","../src/forms/DatePicker.tsx","../src/forms/Combobox.tsx","../src/forms/FileUpload.tsx","../src/forms/NumberInput.tsx","../src/forms/MaskedInput.tsx"],"names":["forwardRef","jsx","jsxs","useState","cva","React","useRef","useEffect","CalendarIcon","X","period","Search","Fragment"],"mappings":"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","file":"chunk-4GNFT2ZJ.js","sourcesContent":["export * from './FormField';\nexport * from './Input';\nexport * from './SearchInput';\nexport * from './PasswordInput';\nexport * from './Textarea';\nexport * from './Select';\nexport * from './Checkbox';\nexport * from './CheckboxGroup';\nexport * from './Radio';\nexport * from './Switch';\nexport * from './Slider';\nexport * from './RangeSlider';\nexport * from './PinInput';\nexport * from './DatePicker';\nexport * from './Combobox';\nexport * from './FileUpload';\nexport * from './NumberInput';\nexport * from './MaskedInput';\n","import React, { forwardRef, useState } from 'react';\r\nimport { cva, type VariantProps } from 'class-variance-authority';\r\nimport { X } from 'lucide-react';\r\nimport { useFormField } from './FormField';\r\nimport { cn } from '../utils/cn';\r\n\r\nexport const inputVariants = cva(\r\n 'w-full rounded-[var(--ui-radius-md)] border bg-[var(--ui-bg-surface)]/70 backdrop-blur-md text-[var(--ui-text-primary)] placeholder:text-[var(--ui-text-muted)] transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ui-primary)]/70 focus-visible:border-[var(--ui-primary)] focus-visible:shadow-[0_0_16px_rgba(99,102,241,0.2)] disabled:cursor-not-allowed disabled:opacity-50 shadow-inner',\r\n {\r\n variants: {\r\n size: {\r\n sm: 'h-8 px-2.5 text-xs',\r\n md: 'h-10 px-3.5 text-sm',\r\n lg: 'h-12 px-4 text-base',\r\n },\r\n variant: {\r\n default: 'border-[var(--ui-border-default)] hover:border-[var(--ui-border-strong)]',\r\n filled: 'bg-[var(--ui-bg-secondary)] border-transparent hover:bg-[var(--ui-bg-tertiary)]',\r\n },\r\n isInvalid: {\r\n true: 'border-[var(--ui-error)] focus-visible:ring-[var(--ui-error)]/70 focus-visible:shadow-[0_0_16px_rgba(244,63,94,0.25)]',\r\n false: '',\r\n },\r\n },\r\n defaultVariants: {\r\n size: 'md',\r\n variant: 'default',\r\n isInvalid: false,\r\n },\r\n }\r\n);\r\n\r\nexport interface InputProps\r\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'>,\r\n VariantProps<typeof inputVariants> {\r\n prefixIcon?: React.ReactNode;\r\n suffixIcon?: React.ReactNode;\r\n clearable?: boolean;\r\n onClear?: () => void;\r\n}\r\n\r\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\r\n (\r\n {\r\n className,\r\n type = 'text',\r\n size,\r\n variant,\r\n isInvalid: customInvalid,\r\n prefixIcon,\r\n suffixIcon,\r\n clearable,\r\n onClear,\r\n value,\r\n onChange,\r\n disabled,\r\n id,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const formField = useFormField();\r\n const isInvalid = customInvalid ?? formField?.isInvalid ?? false;\r\n const isDisabled = disabled ?? formField?.isDisabled ?? false;\r\n const inputId = id || formField?.id;\r\n\r\n const isControlled = value !== undefined;\r\n const [uncontrolledVal, setUncontrolledVal] = useState(\r\n props.defaultValue !== undefined ? String(props.defaultValue) : ''\r\n );\r\n const innerRef = React.useRef<HTMLInputElement | null>(null);\r\n\r\n const handleRef = (node: HTMLInputElement | null) => {\r\n innerRef.current = node;\r\n if (typeof ref === 'function') {\r\n ref(node);\r\n } else if (ref) {\r\n (ref as React.MutableRefObject<HTMLInputElement | null>).current = node;\r\n }\r\n };\r\n\r\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n if (!isControlled) {\r\n setUncontrolledVal(e.target.value);\r\n }\r\n onChange?.(e);\r\n };\r\n\r\n const handleClear = () => {\r\n if (!isControlled && innerRef.current) {\r\n innerRef.current.value = '';\r\n setUncontrolledVal('');\r\n const event = new Event('input', { bubbles: true });\r\n innerRef.current.dispatchEvent(event);\r\n }\r\n onClear?.();\r\n };\r\n\r\n const hasValue = isControlled\r\n ? Boolean(value)\r\n : Boolean(uncontrolledVal || innerRef.current?.value);\r\n\r\n return (\r\n <div className=\"relative w-full flex items-center\">\r\n {prefixIcon && (\r\n <div className=\"absolute left-3 flex items-center pointer-events-none text-[var(--ui-text-muted)]\">\r\n {prefixIcon}\r\n </div>\r\n )}\r\n\r\n <input\r\n ref={handleRef}\r\n id={inputId}\r\n type={type}\r\n disabled={isDisabled}\r\n {...(isControlled ? { value } : {})}\r\n onChange={handleChange}\r\n aria-invalid={isInvalid}\r\n aria-describedby={\r\n isInvalid\r\n ? formField?.errorId\r\n : formField?.descriptionId || undefined\r\n }\r\n className={cn(\r\n inputVariants({ size, variant, isInvalid }),\r\n prefixIcon && 'pl-9',\r\n (suffixIcon || (clearable && hasValue)) && 'pr-9',\r\n className\r\n )}\r\n {...props}\r\n />\r\n\r\n <div className=\"absolute right-3 flex items-center gap-1 text-[var(--ui-text-muted)]\">\r\n {clearable && hasValue && !isDisabled && (\r\n <button\r\n type=\"button\"\r\n onClick={handleClear}\r\n className=\"p-0.5 rounded-full hover:bg-[var(--ui-bg-tertiary)] hover:text-[var(--ui-text-primary)] transition-colors\"\r\n aria-label=\"Clear input\"\r\n >\r\n <X className=\"w-3.5 h-3.5\" />\r\n </button>\r\n )}\r\n {suffixIcon && <span className=\"pointer-events-none flex items-center\">{suffixIcon}</span>}\r\n </div>\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nInput.displayName = 'Input';\r\n","import { forwardRef } from 'react';\r\nimport { Search } from 'lucide-react';\r\nimport { Input, InputProps } from './Input';\r\nimport { Kbd } from '../typography/Kbd';\r\n\r\nexport interface SearchInputProps extends Omit<InputProps, 'type' | 'prefixIcon'> {\r\n shortcut?: string;\r\n}\r\n\r\nexport const SearchInput = forwardRef<HTMLInputElement, SearchInputProps>(\r\n ({ shortcut, clearable = true, suffixIcon, ...props }, ref) => {\r\n return (\r\n <Input\r\n ref={ref}\r\n type=\"search\"\r\n clearable={clearable}\r\n prefixIcon={<Search className=\"w-4 h-4\" />}\r\n suffixIcon={\r\n shortcut ? (\r\n <div className=\"flex items-center gap-1\">\r\n <Kbd>{shortcut}</Kbd>\r\n {suffixIcon}\r\n </div>\r\n ) : (\r\n suffixIcon\r\n )\r\n }\r\n {...props}\r\n />\r\n );\r\n }\r\n);\r\n\r\nSearchInput.displayName = 'SearchInput';\r\n","import React, { forwardRef, useState } from 'react';\r\nimport { Eye, EyeOff } from 'lucide-react';\r\nimport { Input, InputProps } from './Input';\r\n\r\nexport interface PasswordInputProps extends Omit<InputProps, 'type' | 'suffixIcon'> {\r\n showToggle?: boolean;\r\n}\r\n\r\nexport const PasswordInput = forwardRef<HTMLInputElement, PasswordInputProps>(\r\n ({ showToggle = true, ...props }, ref) => {\r\n const [showPassword, setShowPassword] = useState(false);\r\n\r\n return (\r\n <Input\r\n ref={ref}\r\n type={showPassword ? 'text' : 'password'}\r\n suffixIcon={\r\n showToggle ? (\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowPassword(!showPassword)}\r\n className=\"p-1 rounded hover:bg-[var(--ui-bg-tertiary)] text-[var(--ui-text-muted)] hover:text-[var(--ui-text-primary)] pointer-events-auto transition-colors\"\r\n aria-label={showPassword ? 'Hide password' : 'Show password'}\r\n >\r\n {showPassword ? <EyeOff className=\"w-4 h-4\" /> : <Eye className=\"w-4 h-4\" />}\r\n </button>\r\n ) : undefined\r\n }\r\n {...props}\r\n />\r\n );\r\n }\r\n);\r\n\r\nPasswordInput.displayName = 'PasswordInput';\r\n","import React, { forwardRef, useEffect, useRef } from 'react';\r\nimport { cva, type VariantProps } from 'class-variance-authority';\r\nimport { useFormField } from './FormField';\r\nimport { cn } from '../utils/cn';\r\n\r\nexport const textareaVariants = cva(\r\n 'w-full rounded-[var(--ui-radius-md)] border bg-[var(--ui-bg-surface)] p-3 text-sm text-[var(--ui-text-primary)] placeholder:text-[var(--ui-text-muted)] transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ui-primary)] disabled:cursor-not-allowed disabled:opacity-50 min-h-[80px]',\r\n {\r\n variants: {\r\n variant: {\r\n default: 'border-[var(--ui-border-default)] hover:border-[var(--ui-border-strong)]',\r\n filled: 'bg-[var(--ui-bg-secondary)] border-transparent hover:bg-[var(--ui-bg-tertiary)]',\r\n },\r\n isInvalid: {\r\n true: 'border-[var(--ui-error)] focus-visible:ring-[var(--ui-error)]',\r\n false: '',\r\n },\r\n resize: {\r\n none: 'resize-none',\r\n vertical: 'resize-y',\r\n horizontal: 'resize-x',\r\n both: 'resize',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'default',\r\n isInvalid: false,\r\n resize: 'vertical',\r\n },\r\n }\r\n);\r\n\r\nexport interface TextareaProps\r\n extends React.TextareaHTMLAttributes<HTMLTextAreaElement>,\r\n VariantProps<typeof textareaVariants> {\r\n autoResize?: boolean;\r\n}\r\n\r\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\r\n (\r\n {\r\n className,\r\n variant,\r\n isInvalid: customInvalid,\r\n resize,\r\n autoResize = false,\r\n disabled,\r\n value,\r\n onChange,\r\n id,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const formField = useFormField();\r\n const isInvalid = customInvalid ?? formField?.isInvalid ?? false;\r\n const isDisabled = disabled ?? formField?.isDisabled ?? false;\r\n const inputId = id || formField?.id;\r\n\r\n const innerRef = useRef<HTMLTextAreaElement | null>(null);\r\n\r\n const setMergedRef = (element: HTMLTextAreaElement | null) => {\r\n innerRef.current = element;\r\n if (typeof ref === 'function') {\r\n ref(element);\r\n } else if (ref) {\r\n (ref as React.MutableRefObject<HTMLTextAreaElement | null>).current = element;\r\n }\r\n };\r\n\r\n const handleInput = () => {\r\n if (autoResize && innerRef.current) {\r\n innerRef.current.style.height = 'auto';\r\n innerRef.current.style.height = `${innerRef.current.scrollHeight}px`;\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n if (autoResize && innerRef.current) {\r\n handleInput();\r\n }\r\n }, [value, autoResize]);\r\n\r\n return (\r\n <textarea\r\n ref={setMergedRef}\r\n id={inputId}\r\n disabled={isDisabled}\r\n value={value}\r\n onChange={(e) => {\r\n handleInput();\r\n onChange?.(e);\r\n }}\r\n aria-invalid={isInvalid}\r\n aria-describedby={\r\n isInvalid\r\n ? formField?.errorId\r\n : formField?.descriptionId || undefined\r\n }\r\n className={cn(\r\n textareaVariants({\r\n variant,\r\n isInvalid,\r\n resize: autoResize ? 'none' : resize,\r\n }),\r\n className\r\n )}\r\n {...props}\r\n />\r\n );\r\n }\r\n);\r\n\r\nTextarea.displayName = 'Textarea';\r\n","import React, { forwardRef } from 'react';\r\nimport { cva, type VariantProps } from 'class-variance-authority';\r\nimport { ChevronDown } from 'lucide-react';\r\nimport { useFormField } from './FormField';\r\nimport { cn } from '../utils/cn';\r\n\r\nexport const selectVariants = cva(\r\n 'w-full rounded-[var(--ui-radius-md)] border bg-[var(--ui-bg-surface)] text-[var(--ui-text-primary)] transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ui-primary)] disabled:cursor-not-allowed disabled:opacity-50 appearance-none pr-10',\r\n {\r\n variants: {\r\n size: {\r\n sm: 'h-8 px-2.5 text-xs',\r\n md: 'h-10 px-3.5 text-sm',\r\n lg: 'h-12 px-4 text-base',\r\n },\r\n variant: {\r\n default: 'border-[var(--ui-border-default)] hover:border-[var(--ui-border-strong)]',\r\n filled: 'bg-[var(--ui-bg-secondary)] border-transparent hover:bg-[var(--ui-bg-tertiary)]',\r\n },\r\n isInvalid: {\r\n true: 'border-[var(--ui-error)] focus-visible:ring-[var(--ui-error)]',\r\n false: '',\r\n },\r\n },\r\n defaultVariants: {\r\n size: 'md',\r\n variant: 'default',\r\n isInvalid: false,\r\n },\r\n }\r\n);\r\n\r\nexport interface SelectOption {\r\n value: string | number;\r\n label: string;\r\n disabled?: boolean;\r\n}\r\n\r\nexport interface SelectProps\r\n extends Omit<React.SelectHTMLAttributes<HTMLSelectElement>, 'size'>,\r\n VariantProps<typeof selectVariants> {\r\n options?: SelectOption[];\r\n placeholder?: string;\r\n}\r\n\r\nexport const Select = forwardRef<HTMLSelectElement, SelectProps>(\r\n (\r\n {\r\n className,\r\n size,\r\n variant,\r\n isInvalid: customInvalid,\r\n options,\r\n placeholder,\r\n disabled,\r\n children,\r\n id,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const formField = useFormField();\r\n const isInvalid = customInvalid ?? formField?.isInvalid ?? false;\r\n const isDisabled = disabled ?? formField?.isDisabled ?? false;\r\n const inputId = id || formField?.id;\r\n\r\n return (\r\n <div className=\"relative w-full flex items-center\">\r\n <select\r\n ref={ref}\r\n id={inputId}\r\n disabled={isDisabled}\r\n aria-invalid={isInvalid}\r\n aria-describedby={\r\n isInvalid\r\n ? formField?.errorId\r\n : formField?.descriptionId || undefined\r\n }\r\n className={cn(selectVariants({ size, variant, isInvalid }), className)}\r\n {...props}\r\n >\r\n {placeholder && (\r\n <option value=\"\" disabled hidden>\r\n {placeholder}\r\n </option>\r\n )}\r\n {options\r\n ? options.map((opt) => (\r\n <option key={opt.value} value={opt.value} disabled={opt.disabled}>\r\n {opt.label}\r\n </option>\r\n ))\r\n : children}\r\n </select>\r\n <div className=\"absolute right-3 flex items-center pointer-events-none text-[var(--ui-text-muted)]\">\r\n <ChevronDown className=\"w-4 h-4\" />\r\n </div>\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nSelect.displayName = 'Select';\r\n","import React, { forwardRef, createContext, useContext } from 'react';\r\nimport { cva, type VariantProps } from 'class-variance-authority';\r\nimport { cn } from '../utils/cn';\r\n\r\ninterface RadioGroupContextType {\r\n name?: string;\r\n value?: string;\r\n onChange?: (val: string) => void;\r\n disabled?: boolean;\r\n}\r\n\r\nconst RadioGroupContext = createContext<RadioGroupContextType | null>(null);\r\n\r\nexport const radioVariants = cva(\r\n 'peer shrink-0 rounded-full border border-[var(--ui-border-default)] bg-[var(--ui-bg-surface)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ui-primary)] disabled:cursor-not-allowed disabled:opacity-50 transition-all cursor-pointer flex items-center justify-center',\r\n {\r\n variants: {\r\n size: {\r\n sm: 'w-4 h-4',\r\n md: 'w-5 h-5',\r\n lg: 'w-6 h-6',\r\n },\r\n },\r\n defaultVariants: {\r\n size: 'md',\r\n },\r\n }\r\n);\r\n\r\nexport interface RadioProps\r\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'>,\r\n VariantProps<typeof radioVariants> {\r\n label?: React.ReactNode;\r\n value: string;\r\n}\r\n\r\nexport const Radio = forwardRef<HTMLInputElement, RadioProps>(\r\n ({ className, size, label, value, checked, disabled, id, onChange, ...props }, ref) => {\r\n const group = useContext(RadioGroupContext);\r\n const isChecked = checked ?? (group?.value !== undefined ? group.value === value : false);\r\n const isDisabled = disabled ?? group?.disabled ?? false;\r\n const name = props.name || group?.name;\r\n\r\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n onChange?.(e);\r\n if (group?.onChange) {\r\n group.onChange(value);\r\n }\r\n };\r\n\r\n return (\r\n <label className={cn('inline-flex items-center gap-2 select-none cursor-pointer', isDisabled && 'cursor-not-allowed opacity-50')}>\r\n <div className=\"relative flex items-center justify-center\">\r\n <input\r\n ref={ref}\r\n type=\"radio\"\r\n name={name}\r\n value={value}\r\n id={id}\r\n disabled={isDisabled}\r\n checked={isChecked}\r\n onChange={handleChange}\r\n className=\"sr-only peer\"\r\n {...props}\r\n />\r\n <div\r\n className={cn(\r\n radioVariants({ size }),\r\n isChecked && 'border-[var(--ui-primary)]',\r\n className\r\n )}\r\n >\r\n {isChecked && (\r\n <span className=\"w-2.5 h-2.5 rounded-full bg-[var(--ui-primary)] animate-in zoom-in-75 duration-150\" />\r\n )}\r\n </div>\r\n </div>\r\n {label && <span className=\"text-sm font-medium text-[var(--ui-text-primary)]\">{label}</span>}\r\n </label>\r\n );\r\n }\r\n);\r\nRadio.displayName = 'Radio';\r\n\r\nexport interface RadioGroupProps extends React.HTMLAttributes<HTMLDivElement> {\r\n name?: string;\r\n value?: string;\r\n defaultValue?: string;\r\n onValueChange?: (value: string) => void;\r\n orientation?: 'horizontal' | 'vertical';\r\n disabled?: boolean;\r\n}\r\n\r\nexport const RadioGroup = forwardRef<HTMLDivElement, RadioGroupProps>(\r\n (\r\n {\r\n className,\r\n name,\r\n value: controlledValue,\r\n defaultValue,\r\n onValueChange,\r\n orientation = 'vertical',\r\n disabled,\r\n children,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const [val, setVal] = React.useState(defaultValue || '');\r\n const currentValue = controlledValue !== undefined ? controlledValue : val;\r\n\r\n const handleChange = (newValue: string) => {\r\n setVal(newValue);\r\n onValueChange?.(newValue);\r\n };\r\n\r\n return (\r\n <RadioGroupContext.Provider\r\n value={{\r\n name,\r\n value: currentValue,\r\n onChange: handleChange,\r\n disabled,\r\n }}\r\n >\r\n <div\r\n ref={ref}\r\n role=\"radiogroup\"\r\n className={cn(\r\n 'flex gap-2',\r\n orientation === 'vertical' ? 'flex-col' : 'flex-row flex-wrap items-center',\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n </div>\r\n </RadioGroupContext.Provider>\r\n );\r\n }\r\n);\r\nRadioGroup.displayName = 'RadioGroup';\r\n","import React, { forwardRef, useState } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useFormField } from './FormField';\nimport { cn } from '../utils/cn';\n\nexport const switchVariants = cva(\n 'peer inline-flex shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-all duration-200 focus-visible:outline-none focus-visible:ring-4 focus-visible:ring-[#34c759]/30 disabled:cursor-not-allowed disabled:opacity-50 bg-[var(--ui-border-strong)] data-[state=checked]:bg-[#34c759] dark:data-[state=checked]:bg-[#30d158] shadow-inner',\n {\n variants: {\n size: {\n sm: 'h-5 w-9 p-0.5',\n md: 'h-6.5 w-12 p-0.5',\n lg: 'h-8 w-15 p-1',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n }\n);\n\nexport const switchThumbVariants = cva(\n 'pointer-events-none block rounded-full bg-white shadow-[0_2px_4px_rgba(0,0,0,0.25)] ring-0 transition-transform duration-200 ease-out data-[state=unchecked]:translate-x-0',\n {\n variants: {\n size: {\n sm: 'h-4 w-4 data-[state=checked]:translate-x-4',\n md: 'h-5.5 w-5.5 data-[state=checked]:translate-x-5.5',\n lg: 'h-6 w-6 data-[state=checked]:translate-x-7',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n }\n);\n\nexport interface SwitchProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'>,\n VariantProps<typeof switchVariants> {\n label?: React.ReactNode;\n checked?: boolean;\n defaultChecked?: boolean;\n onCheckedChange?: (checked: boolean) => void;\n}\n\nexport const Switch = forwardRef<HTMLInputElement, SwitchProps>(\n ({ className, size, label, checked, defaultChecked, onCheckedChange, disabled, id, onChange, ...props }, ref) => {\n const isControlled = checked !== undefined;\n const [internalChecked, setInternalChecked] = useState(defaultChecked ?? false);\n const isChecked = isControlled ? checked : internalChecked;\n\n const formField = useFormField();\n const isDisabled = disabled ?? formField?.isDisabled ?? false;\n const switchId = id || formField?.id;\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) {\n setInternalChecked(e.target.checked);\n }\n onChange?.(e);\n onCheckedChange?.(e.target.checked);\n };\n\n return (\n <label className={cn('inline-flex items-center gap-3 select-none cursor-pointer', isDisabled && 'cursor-not-allowed opacity-50')}>\n <div className=\"relative flex items-center\">\n <input\n ref={ref}\n type=\"checkbox\"\n role=\"switch\"\n id={switchId}\n disabled={isDisabled}\n checked={isChecked}\n onChange={handleChange}\n className=\"sr-only peer\"\n {...props}\n />\n <div\n data-state={isChecked ? 'checked' : 'unchecked'}\n className={cn(switchVariants({ size }), className)}\n >\n <span\n data-state={isChecked ? 'checked' : 'unchecked'}\n className={cn(switchThumbVariants({ size }))}\n />\n </div>\n </div>\n {label && <span className=\"text-sm font-medium text-[var(--ui-text-primary)]\">{label}</span>}\n </label>\n );\n }\n);\n\nSwitch.displayName = 'Switch';\n","import React, { forwardRef } from 'react';\r\nimport { cn } from '../utils/cn';\r\n\r\nexport interface SliderProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'onChange' | 'value' | 'defaultValue'> {\r\n value?: number;\r\n defaultValue?: number;\r\n min?: number;\r\n max?: number;\r\n step?: number;\r\n showValue?: boolean;\r\n formatValue?: (val: number) => string;\r\n onChange?: (val: number) => void;\r\n}\r\n\r\nexport const Slider = forwardRef<HTMLInputElement, SliderProps>(\r\n (\r\n {\r\n className,\r\n value: controlledValue,\r\n defaultValue = 0,\r\n min = 0,\r\n max = 100,\r\n step = 1,\r\n showValue = false,\r\n formatValue = (v) => `${v}`,\r\n onChange,\r\n disabled,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const [val, setVal] = React.useState<number>(defaultValue);\r\n const currentValue = controlledValue !== undefined ? controlledValue : val;\r\n\r\n const percentage = Math.min(100, Math.max(0, ((currentValue - min) / (max - min)) * 100));\r\n\r\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const num = Number(e.target.value);\r\n setVal(num);\r\n onChange?.(num);\r\n };\r\n\r\n return (\r\n <div className={cn('w-full flex items-center gap-4', className)}>\r\n <div className=\"relative w-full flex items-center h-6 select-none touch-none\">\r\n {/* Rail */}\r\n <div className=\"w-full h-2 rounded-full bg-[var(--ui-border-default)] overflow-hidden relative\">\r\n {/* Fill Track */}\r\n <div\r\n className=\"h-full bg-[var(--ui-primary)] transition-all duration-75\"\r\n style={{ width: `${percentage}%` }}\r\n />\r\n </div>\r\n\r\n <input\r\n ref={ref}\r\n type=\"range\"\r\n min={min}\r\n max={max}\r\n step={step}\r\n value={currentValue}\r\n disabled={disabled}\r\n onChange={handleChange}\r\n className=\"absolute inset-0 w-full h-full opacity-0 cursor-pointer disabled:cursor-not-allowed\"\r\n {...props}\r\n />\r\n\r\n {/* Thumb visual */}\r\n <div\r\n className=\"absolute w-5 h-5 rounded-full bg-white border-2 border-[var(--ui-primary)] shadow-md pointer-events-none transition-transform duration-75 -translate-x-1/2\"\r\n style={{ left: `${percentage}%` }}\r\n />\r\n </div>\r\n\r\n {showValue && (\r\n <span className=\"text-xs font-semibold font-mono text-[var(--ui-text-secondary)] min-w-[2.5rem] text-right\">\r\n {formatValue(currentValue)}\r\n </span>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nSlider.displayName = 'Slider';\r\n","import React, { forwardRef, useState, useRef, useCallback, useEffect } from 'react';\r\nimport { cn } from '../utils/cn';\r\n\r\nexport interface RangeSliderProps {\r\n min?: number;\r\n max?: number;\r\n step?: number;\r\n value?: [number, number];\r\n defaultValue?: [number, number];\r\n onChange?: (val: [number, number]) => void;\r\n showValue?: boolean;\r\n formatValue?: (val: number) => string;\r\n className?: string;\r\n disabled?: boolean;\r\n name?: string;\r\n 'aria-label'?: string;\r\n}\r\n\r\nexport const RangeSlider = forwardRef<HTMLDivElement, RangeSliderProps>(\r\n (\r\n {\r\n min = 0,\r\n max = 100,\r\n step = 1,\r\n value: controlledValue,\r\n defaultValue = [20, 80],\r\n onChange,\r\n showValue = false,\r\n formatValue = (v) => `${v}`,\r\n className,\r\n disabled = false,\r\n name,\r\n 'aria-label': ariaLabel = 'Range slider',\r\n },\r\n ref\r\n ) => {\r\n const isControlled = controlledValue !== undefined;\r\n const [internalValue, setInternalValue] = useState<[number, number]>(defaultValue);\r\n const currentValue = isControlled ? controlledValue : internalValue;\r\n\r\n const [minVal, maxVal] = [\r\n Math.max(min, Math.min(currentValue[0], currentValue[1])),\r\n Math.min(max, Math.max(currentValue[0], currentValue[1])),\r\n ];\r\n\r\n const trackRef = useRef<HTMLDivElement>(null);\r\n const draggingThumbRef = useRef<'min' | 'max' | null>(null);\r\n\r\n const updateValues = useCallback(\r\n (newMin: number, newMax: number) => {\r\n const clampedMin = Math.max(min, Math.min(newMin, newMax));\r\n const clampedMax = Math.min(max, Math.max(clampedMin, newMax));\r\n const next: [number, number] = [clampedMin, clampedMax];\r\n\r\n if (!isControlled) {\r\n setInternalValue(next);\r\n }\r\n onChange?.(next);\r\n },\r\n [min, max, isControlled, onChange]\r\n );\r\n\r\n const getValueFromPointer = useCallback(\r\n (clientX: number): number => {\r\n if (!trackRef.current) return min;\r\n const rect = trackRef.current.getBoundingClientRect();\r\n const percent = Math.min(1, Math.max(0, (clientX - rect.left) / rect.width));\r\n const rawValue = min + percent * (max - min);\r\n const steppedValue = Math.round((rawValue - min) / step) * step + min;\r\n return Math.min(max, Math.max(min, Number(steppedValue.toFixed(4))));\r\n },\r\n [min, max, step]\r\n );\r\n\r\n const handlePointerDown = (e: React.PointerEvent<HTMLDivElement>) => {\r\n if (disabled) return;\r\n const clickedVal = getValueFromPointer(e.clientX);\r\n const distToMin = Math.abs(clickedVal - minVal);\r\n const distToMax = Math.abs(clickedVal - maxVal);\r\n\r\n const targetThumb = distToMin <= distToMax ? 'min' : 'max';\r\n draggingThumbRef.current = targetThumb;\r\n\r\n if (targetThumb === 'min') {\r\n updateValues(Math.min(clickedVal, maxVal), maxVal);\r\n } else {\r\n updateValues(minVal, Math.max(clickedVal, minVal));\r\n }\r\n\r\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\r\n };\r\n\r\n const handlePointerMove = (e: React.PointerEvent<HTMLDivElement>) => {\r\n if (disabled || !draggingThumbRef.current) return;\r\n const moveVal = getValueFromPointer(e.clientX);\r\n\r\n if (draggingThumbRef.current === 'min') {\r\n updateValues(Math.min(moveVal, maxVal), maxVal);\r\n } else {\r\n updateValues(minVal, Math.max(moveVal, minVal));\r\n }\r\n };\r\n\r\n const handlePointerUp = (e: React.PointerEvent<HTMLDivElement>) => {\r\n if (draggingThumbRef.current) {\r\n draggingThumbRef.current = null;\r\n try {\r\n (e.currentTarget as HTMLElement).releasePointerCapture(e.pointerId);\r\n } catch {\r\n // ignore\r\n }\r\n }\r\n };\r\n\r\n const handleKeyDownMin = (e: React.KeyboardEvent) => {\r\n if (disabled) return;\r\n let nextMin = minVal;\r\n if (e.key === 'ArrowRight' || e.key === 'ArrowUp') {\r\n e.preventDefault();\r\n nextMin = Math.min(minVal + step, maxVal);\r\n } else if (e.key === 'ArrowLeft' || e.key === 'ArrowDown') {\r\n e.preventDefault();\r\n nextMin = Math.max(minVal - step, min);\r\n } else if (e.key === 'Home') {\r\n e.preventDefault();\r\n nextMin = min;\r\n } else if (e.key === 'End') {\r\n e.preventDefault();\r\n nextMin = maxVal;\r\n }\r\n if (nextMin !== minVal) {\r\n updateValues(nextMin, maxVal);\r\n }\r\n };\r\n\r\n const handleKeyDownMax = (e: React.KeyboardEvent) => {\r\n if (disabled) return;\r\n let nextMax = maxVal;\r\n if (e.key === 'ArrowRight' || e.key === 'ArrowUp') {\r\n e.preventDefault();\r\n nextMax = Math.min(maxVal + step, max);\r\n } else if (e.key === 'ArrowLeft' || e.key === 'ArrowDown') {\r\n e.preventDefault();\r\n nextMax = Math.max(maxVal - step, minVal);\r\n } else if (e.key === 'Home') {\r\n e.preventDefault();\r\n nextMax = minVal;\r\n } else if (e.key === 'End') {\r\n e.preventDefault();\r\n nextMax = max;\r\n }\r\n if (nextMax !== maxVal) {\r\n updateValues(minVal, nextMax);\r\n }\r\n };\r\n\r\n const minPercentage = Math.min(100, Math.max(0, ((minVal - min) / (max - min || 1)) * 100));\r\n const maxPercentage = Math.min(100, Math.max(0, ((maxVal - min) / (max - min || 1)) * 100));\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={cn('w-full flex items-center gap-4', disabled && 'opacity-50 cursor-not-allowed', className)}\r\n >\r\n <div\r\n ref={trackRef}\r\n onPointerDown={handlePointerDown}\r\n onPointerMove={handlePointerMove}\r\n onPointerUp={handlePointerUp}\r\n className=\"relative w-full flex items-center h-7 select-none touch-none cursor-pointer\"\r\n >\r\n {/* Base rail */}\r\n <div className=\"w-full h-2 rounded-full bg-[var(--ui-border-default)] overflow-hidden relative\">\r\n {/* Active Range Fill */}\r\n <div\r\n className=\"absolute h-full bg-[var(--ui-primary)]\"\r\n style={{\r\n left: `${minPercentage}%`,\r\n width: `${Math.max(0, maxPercentage - minPercentage)}%`,\r\n }}\r\n />\r\n </div>\r\n\r\n {/* Hidden inputs for form submission if name provided */}\r\n {name && (\r\n <>\r\n <input type=\"hidden\" name={`${name}_min`} value={minVal} />\r\n <input type=\"hidden\" name={`${name}_max`} value={maxVal} />\r\n </>\r\n )}\r\n\r\n {/* Min thumb */}\r\n <div\r\n role=\"slider\"\r\n tabIndex={disabled ? -1 : 0}\r\n aria-label={`${ariaLabel} minimum`}\r\n aria-valuemin={min}\r\n aria-valuemax={maxVal}\r\n aria-valuenow={minVal}\r\n aria-disabled={disabled}\r\n onKeyDown={handleKeyDownMin}\r\n className={cn(\r\n 'absolute w-5 h-5 rounded-full bg-white border-2 border-[var(--ui-primary)] shadow-md -translate-x-1/2 z-20 cursor-grab active:cursor-grabbing transition-shadow focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ui-primary)] focus-visible:ring-offset-2',\r\n disabled && 'pointer-events-none'\r\n )}\r\n style={{ left: `${minPercentage}%` }}\r\n />\r\n\r\n {/* Max thumb */}\r\n <div\r\n role=\"slider\"\r\n tabIndex={disabled ? -1 : 0}\r\n aria-label={`${ariaLabel} maximum`}\r\n aria-valuemin={minVal}\r\n aria-valuemax={max}\r\n aria-valuenow={maxVal}\r\n aria-disabled={disabled}\r\n onKeyDown={handleKeyDownMax}\r\n className={cn(\r\n 'absolute w-5 h-5 rounded-full bg-white border-2 border-[var(--ui-primary)] shadow-md -translate-x-1/2 z-20 cursor-grab active:cursor-grabbing transition-shadow focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ui-primary)] focus-visible:ring-offset-2',\r\n disabled && 'pointer-events-none'\r\n )}\r\n style={{ left: `${maxPercentage}%` }}\r\n />\r\n </div>\r\n\r\n {showValue && (\r\n <span className=\"text-xs font-semibold font-mono text-[var(--ui-text-secondary)] min-w-[5rem] text-right\">\r\n {formatValue(minVal)} - {formatValue(maxVal)}\r\n </span>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nRangeSlider.displayName = 'RangeSlider';\r\n","import React, { forwardRef, useRef, useState, useEffect } from 'react';\r\nimport { cn } from '../utils/cn';\r\n\r\nexport interface PinInputProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\r\n length?: number;\r\n value?: string;\r\n defaultValue?: string;\r\n onChange?: (val: string) => void;\r\n onComplete?: (val: string) => void;\r\n mask?: boolean;\r\n disabled?: boolean;\r\n isInvalid?: boolean;\r\n autoFocus?: boolean;\r\n}\r\n\r\nexport const PinInput = forwardRef<HTMLDivElement, PinInputProps>(\r\n (\r\n {\r\n className,\r\n length = 4,\r\n value: controlledValue,\r\n defaultValue = '',\r\n onChange,\r\n onComplete,\r\n mask = false,\r\n disabled = false,\r\n isInvalid = false,\r\n autoFocus = false,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const isControlled = controlledValue !== undefined;\r\n const [internalPins, setInternalPins] = useState<string[]>(() => {\r\n const initial = (controlledValue !== undefined ? controlledValue : defaultValue).slice(0, length);\r\n return Array.from({ length }, (_, i) => initial[i] || '');\r\n });\r\n\r\n const pins = isControlled\r\n ? Array.from({ length }, (_, i) => controlledValue[i] || '')\r\n : internalPins;\r\n\r\n const inputsRef = useRef<(HTMLInputElement | null)[]>([]);\r\n\r\n useEffect(() => {\r\n if (autoFocus && inputsRef.current[0]) {\r\n inputsRef.current[0].focus();\r\n }\r\n }, [autoFocus]);\r\n\r\n const handleDigitChange = (index: number, val: string) => {\r\n const sanitized = val.replace(/[^0-9a-zA-Z]/g, '').slice(-1);\r\n const newPins = [...pins];\r\n newPins[index] = sanitized;\r\n if (!isControlled) {\r\n setInternalPins(newPins);\r\n }\r\n\r\n const combined = newPins.join('');\r\n onChange?.(combined);\r\n\r\n if (sanitized && index < length - 1) {\r\n inputsRef.current[index + 1]?.focus();\r\n }\r\n\r\n if (combined.length === length && !newPins.includes('')) {\r\n onComplete?.(combined);\r\n }\r\n };\r\n\r\n const handleKeyDown = (index: number, e: React.KeyboardEvent<HTMLInputElement>) => {\r\n if (e.key === 'Backspace') {\r\n if (!pins[index] && index > 0) {\r\n const newPins = [...pins];\r\n newPins[index - 1] = '';\r\n if (!isControlled) setInternalPins(newPins);\r\n onChange?.(newPins.join(''));\r\n inputsRef.current[index - 1]?.focus();\r\n }\r\n } else if (e.key === 'ArrowLeft' && index > 0) {\r\n e.preventDefault();\r\n inputsRef.current[index - 1]?.focus();\r\n } else if (e.key === 'ArrowRight' && index < length - 1) {\r\n e.preventDefault();\r\n inputsRef.current[index + 1]?.focus();\r\n }\r\n };\r\n\r\n const handlePaste = (e: React.ClipboardEvent<HTMLInputElement>) => {\r\n e.preventDefault();\r\n const pasted = e.clipboardData.getData('text').replace(/[^0-9a-zA-Z]/g, '').slice(0, length);\r\n if (!pasted) return;\r\n\r\n const newPins = Array.from({ length }, (_, i) => pasted[i] || '');\r\n if (!isControlled) setInternalPins(newPins);\r\n\r\n const combined = newPins.join('');\r\n onChange?.(combined);\r\n\r\n const nextEmptyIndex = newPins.findIndex((p) => !p);\r\n const focusIndex = nextEmptyIndex === -1 ? length - 1 : nextEmptyIndex;\r\n inputsRef.current[focusIndex]?.focus();\r\n\r\n if (combined.length === length && !newPins.includes('')) {\r\n onComplete?.(combined);\r\n }\r\n };\r\n\r\n return (\r\n <div ref={ref} role=\"group\" aria-label=\"PIN Code Input\" className={cn('flex items-center gap-2', className)} {...props}>\r\n {Array.from({ length }).map((_, index) => (\r\n <input\r\n key={index}\r\n ref={(el) => {\r\n inputsRef.current[index] = el;\r\n }}\r\n type={mask ? 'password' : 'text'}\r\n inputMode=\"numeric\"\r\n maxLength={1}\r\n disabled={disabled}\r\n aria-label={`Digit ${index + 1} of ${length}`}\r\n value={pins[index]}\r\n onChange={(e) => handleDigitChange(index, e.target.value)}\r\n onKeyDown={(e) => handleKeyDown(index, e)}\r\n onPaste={handlePaste}\r\n className={cn(\r\n 'w-11 h-12 text-center text-lg font-bold font-mono rounded-[var(--ui-radius-md)] border bg-[var(--ui-bg-surface)] text-[var(--ui-text-primary)] transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ui-primary)] disabled:opacity-50 disabled:cursor-not-allowed',\r\n isInvalid\r\n ? 'border-[var(--ui-error)] focus-visible:ring-[var(--ui-error)]'\r\n : 'border-[var(--ui-border-default)] hover:border-[var(--ui-border-strong)]'\r\n )}\r\n />\r\n ))}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nPinInput.displayName = 'PinInput';\r\n","import React, { forwardRef, useState, useRef, useEffect } from 'react';\r\nimport { Calendar as CalendarIcon, Clock, ChevronLeft, ChevronRight, X } from 'lucide-react';\r\nimport { cn } from '../utils/cn';\r\nimport { Popover } from '../overlays/Popover';\r\nimport { useControllableState } from '../utils/useControllableState';\r\n\r\n// Utility helper to format date as YYYY-MM-DD\r\nexport function formatDate(d: Date | null | undefined): string {\r\n if (!d) return '';\r\n const year = d.getFullYear();\r\n const month = String(d.getMonth() + 1).padStart(2, '0');\r\n const day = String(d.getDate()).padStart(2, '0');\r\n return `${year}-${month}-${day}`;\r\n}\r\n\r\nexport function formatDisplayDate(d: Date | null | undefined): string {\r\n if (!d) return '';\r\n return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' });\r\n}\r\n\r\nexport interface DatePickerProps {\r\n value?: Date | null;\r\n defaultValue?: Date | null;\r\n onChange?: (date: Date | null) => void;\r\n placeholder?: string;\r\n minDate?: Date;\r\n maxDate?: Date;\r\n disabled?: boolean;\r\n clearable?: boolean;\r\n className?: string;\r\n presets?: { label: string; date: Date }[];\r\n}\r\n\r\nexport const DatePicker = forwardRef<HTMLDivElement, DatePickerProps>(\r\n (\r\n {\r\n value: controlledValue,\r\n defaultValue = null,\r\n onChange,\r\n placeholder = 'Select date...',\r\n minDate,\r\n maxDate,\r\n disabled = false,\r\n clearable = true,\r\n className,\r\n presets,\r\n },\r\n ref\r\n ) => {\r\n const [selectedDate, setSelectedDate] = useControllableState<Date | null>({\r\n value: controlledValue,\r\n defaultValue,\r\n onChange,\r\n name: 'DatePicker',\r\n });\r\n\r\n const [viewDate, setViewDate] = useState<Date>(selectedDate || new Date());\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [focusedDate, setFocusedDate] = useState<Date>(selectedDate || new Date());\r\n\r\n useEffect(() => {\r\n if (selectedDate) {\r\n setViewDate(selectedDate);\r\n setFocusedDate(selectedDate);\r\n }\r\n }, [selectedDate]);\r\n\r\n const handleSelectDate = (d: Date) => {\r\n setSelectedDate(d);\r\n setIsOpen(false);\r\n };\r\n\r\n const handleClear = (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n setSelectedDate(null);\r\n };\r\n\r\n const prevMonth = () => {\r\n setViewDate(new Date(viewDate.getFullYear(), viewDate.getMonth() - 1, 1));\r\n };\r\n\r\n const nextMonth = () => {\r\n setViewDate(new Date(viewDate.getFullYear(), viewDate.getMonth() + 1, 1));\r\n };\r\n\r\n // Calendar generation logic\r\n const year = viewDate.getFullYear();\r\n const month = viewDate.getMonth();\r\n const firstDayIndex = new Date(year, month, 1).getDay();\r\n const daysInMonth = new Date(year, month + 1, 0).getDate();\r\n const daysInPrevMonth = new Date(year, month, 0).getDate();\r\n\r\n const days: { date: Date; currentMonth: boolean; disabled: boolean }[] = [];\r\n\r\n // Prev month padding days\r\n for (let i = firstDayIndex - 1; i >= 0; i--) {\r\n const d = new Date(year, month - 1, daysInPrevMonth - i);\r\n const isDis = (minDate && d < minDate) || (maxDate && d > maxDate);\r\n days.push({ date: d, currentMonth: false, disabled: Boolean(isDis) });\r\n }\r\n\r\n // Current month days\r\n for (let i = 1; i <= daysInMonth; i++) {\r\n const d = new Date(year, month, i);\r\n const isDis = (minDate && d < minDate) || (maxDate && d > maxDate);\r\n days.push({ date: d, currentMonth: true, disabled: Boolean(isDis) });\r\n }\r\n\r\n // Next month padding days to complete grid of 35 or 42\r\n const totalSlots = days.length > 35 ? 42 : 35;\r\n const remainingSlots = totalSlots - days.length;\r\n for (let i = 1; i <= remainingSlots; i++) {\r\n const d = new Date(year, month + 1, i);\r\n const isDis = (minDate && d < minDate) || (maxDate && d > maxDate);\r\n days.push({ date: d, currentMonth: false, disabled: Boolean(isDis) });\r\n }\r\n\r\n const todayStr = formatDate(new Date());\r\n const selectedStr = selectedDate ? formatDate(selectedDate) : '';\r\n const focusedStr = formatDate(focusedDate);\r\n\r\n // Keyboard navigation within the calendar grid\r\n const handleGridKeyDown = (e: React.KeyboardEvent) => {\r\n let nextDate = new Date(focusedDate);\r\n let handled = false;\r\n\r\n if (e.key === 'ArrowLeft') {\r\n nextDate.setDate(nextDate.getDate() - 1);\r\n handled = true;\r\n } else if (e.key === 'ArrowRight') {\r\n nextDate.setDate(nextDate.getDate() + 1);\r\n handled = true;\r\n } else if (e.key === 'ArrowUp') {\r\n nextDate.setDate(nextDate.getDate() - 7);\r\n handled = true;\r\n } else if (e.key === 'ArrowDown') {\r\n nextDate.setDate(nextDate.getDate() + 7);\r\n handled = true;\r\n } else if (e.key === 'PageUp') {\r\n nextDate.setMonth(nextDate.getMonth() - 1);\r\n handled = true;\r\n } else if (e.key === 'PageDown') {\r\n nextDate.setMonth(nextDate.getMonth() + 1);\r\n handled = true;\r\n } else if (e.key === 'Home') {\r\n nextDate.setDate(1);\r\n handled = true;\r\n } else if (e.key === 'End') {\r\n const lastDay = new Date(nextDate.getFullYear(), nextDate.getMonth() + 1, 0).getDate();\r\n nextDate.setDate(lastDay);\r\n handled = true;\r\n } else if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n handleSelectDate(focusedDate);\r\n return;\r\n } else if (e.key === 'Escape') {\r\n e.preventDefault();\r\n setIsOpen(false);\r\n return;\r\n }\r\n\r\n if (handled) {\r\n e.preventDefault();\r\n setFocusedDate(nextDate);\r\n if (nextDate.getMonth() !== viewDate.getMonth() || nextDate.getFullYear() !== viewDate.getFullYear()) {\r\n setViewDate(new Date(nextDate.getFullYear(), nextDate.getMonth(), 1));\r\n }\r\n }\r\n };\r\n\r\n return (\r\n <div ref={ref} className={cn('relative inline-block w-full', className)}>\r\n <Popover\r\n open={isOpen}\r\n onOpenChange={setIsOpen}\r\n trigger={\r\n <button\r\n type=\"button\"\r\n disabled={disabled}\r\n aria-haspopup=\"dialog\"\r\n aria-expanded={isOpen}\r\n aria-label={selectedDate ? `Selected date: ${formatDisplayDate(selectedDate)}` : placeholder}\r\n className={cn(\r\n 'w-full h-10 px-3.5 rounded-[var(--ui-radius-md)] border bg-[var(--ui-bg-surface)] text-left flex items-center justify-between text-sm transition-all shadow-inner cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ui-primary)]',\r\n disabled\r\n ? 'opacity-50 cursor-not-allowed border-[var(--ui-border-subtle)]'\r\n : 'border-[var(--ui-border-default)] hover:border-[var(--ui-border-strong)]'\r\n )}\r\n >\r\n <div className=\"flex items-center gap-2.5 truncate\">\r\n <CalendarIcon className=\"w-4 h-4 text-[var(--ui-text-muted)] shrink-0\" />\r\n <span className={selectedDate ? 'text-[var(--ui-text-primary)] font-medium' : 'text-[var(--ui-text-muted)]'}>\r\n {selectedDate ? formatDisplayDate(selectedDate) : placeholder}\r\n </span>\r\n </div>\r\n\r\n <div className=\"flex items-center gap-1 text-[var(--ui-text-muted)]\">\r\n {clearable && selectedDate && !disabled && (\r\n <span\r\n role=\"button\"\r\n tabIndex={0}\r\n aria-label=\"Clear date\"\r\n onClick={handleClear}\r\n onKeyDown={(e) => e.key === 'Enter' && handleClear(e as unknown as React.MouseEvent)}\r\n className=\"p-1 rounded-full hover:bg-[var(--ui-bg-tertiary)] hover:text-[var(--ui-text-primary)] transition-colors\"\r\n >\r\n <X className=\"w-3.5 h-3.5\" />\r\n </span>\r\n )}\r\n </div>\r\n </button>\r\n }\r\n >\r\n <div\r\n role=\"dialog\"\r\n aria-label=\"Choose date\"\r\n className=\"p-4 w-72 rounded-2xl bg-[var(--ui-bg-surface)] backdrop-blur-2xl border border-[var(--ui-border-default)] shadow-2xl space-y-3\"\r\n onKeyDown={handleGridKeyDown}\r\n >\r\n {/* Header: Month Year + Prev/Next */}\r\n <div className=\"flex items-center justify-between\">\r\n <span\r\n id=\"calendar-month-heading\"\r\n className=\"text-xs font-bold text-[var(--ui-text-primary)] font-mono uppercase tracking-wider\"\r\n aria-live=\"polite\"\r\n >\r\n {viewDate.toLocaleString('default', { month: 'long', year: 'numeric' })}\r\n </span>\r\n <div className=\"flex items-center gap-1\">\r\n <button\r\n type=\"button\"\r\n onClick={prevMonth}\r\n aria-label=\"Previous month\"\r\n className=\"p-1 rounded-lg hover:bg-[var(--ui-bg-tertiary)] text-[var(--ui-text-muted)] hover:text-[var(--ui-text-primary)] transition-colors cursor-pointer\"\r\n >\r\n <ChevronLeft className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={nextMonth}\r\n aria-label=\"Next month\"\r\n className=\"p-1 rounded-lg hover:bg-[var(--ui-bg-tertiary)] text-[var(--ui-text-muted)] hover:text-[var(--ui-text-primary)] transition-colors cursor-pointer\"\r\n >\r\n <ChevronRight className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Presets if provided */}\r\n {presets && presets.length > 0 && (\r\n <div className=\"flex flex-wrap gap-1 pb-2 border-b border-[var(--ui-border-subtle)]\">\r\n {presets.map((preset, idx) => (\r\n <button\r\n key={idx}\r\n type=\"button\"\r\n onClick={() => handleSelectDate(preset.date)}\r\n className=\"px-2 py-0.5 rounded-md text-[10px] font-semibold bg-[var(--ui-bg-secondary)] hover:bg-[var(--ui-bg-tertiary)] text-[var(--ui-text-secondary)] transition-colors cursor-pointer\"\r\n >\r\n {preset.label}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* Weekday headers */}\r\n <div\r\n role=\"row\"\r\n className=\"grid grid-cols-7 text-center text-[10px] font-bold text-[var(--ui-text-muted)] font-mono\"\r\n >\r\n {[\r\n { short: 'Su', full: 'Sunday' },\r\n { short: 'Mo', full: 'Monday' },\r\n { short: 'Tu', full: 'Tuesday' },\r\n { short: 'We', full: 'Wednesday' },\r\n { short: 'Th', full: 'Thursday' },\r\n { short: 'Fr', full: 'Friday' },\r\n { short: 'Sa', full: 'Saturday' },\r\n ].map((d) => (\r\n <div key={d.short} role=\"columnheader\" aria-label={d.full} className=\"py-1\">\r\n {d.short}\r\n </div>\r\n ))}\r\n </div>\r\n\r\n {/* Day grid */}\r\n <div\r\n role=\"grid\"\r\n aria-labelledby=\"calendar-month-heading\"\r\n className=\"grid grid-cols-7 gap-1\"\r\n >\r\n {days.map((item, idx) => {\r\n const itemStr = formatDate(item.date);\r\n const isSelected = itemStr === selectedStr;\r\n const isToday = itemStr === todayStr;\r\n const isFocused = itemStr === focusedStr;\r\n\r\n const fullDateLabel = item.date.toLocaleDateString('en-US', {\r\n weekday: 'long',\r\n year: 'numeric',\r\n month: 'long',\r\n day: 'numeric',\r\n });\r\n\r\n return (\r\n <button\r\n key={idx}\r\n type=\"button\"\r\n role=\"gridcell\"\r\n disabled={item.disabled}\r\n aria-selected={isSelected}\r\n aria-current={isToday ? 'date' : undefined}\r\n aria-label={fullDateLabel}\r\n tabIndex={isFocused ? 0 : -1}\r\n onClick={() => handleSelectDate(item.date)}\r\n className={cn(\r\n 'h-8 w-8 rounded-full text-xs font-semibold flex items-center justify-center transition-all cursor-pointer outline-none',\r\n item.disabled && 'opacity-25 cursor-not-allowed pointer-events-none',\r\n !item.currentMonth && 'text-[var(--ui-text-muted)] opacity-50',\r\n isFocused && 'ring-2 ring-[var(--ui-primary)]',\r\n isSelected\r\n ? 'bg-[var(--ui-primary)] text-white font-bold shadow-md shadow-blue-500/30'\r\n : isToday\r\n ? 'border border-[var(--ui-primary)] text-[var(--ui-primary)]'\r\n : 'hover:bg-[var(--ui-bg-tertiary)] text-[var(--ui-text-primary)]'\r\n )}\r\n >\r\n {item.date.getDate()}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n </Popover>\r\n </div>\r\n );\r\n }\r\n);\r\nDatePicker.displayName = 'DatePicker';\r\n\r\n/* -------------------------------------------------------------------------------------------------\r\n * DateRangePicker Component\r\n * -----------------------------------------------------------------------------------------------*/\r\nexport interface DateRange {\r\n from: Date | null;\r\n to: Date | null;\r\n}\r\n\r\nexport interface DateRangePickerProps {\r\n value?: DateRange;\r\n defaultValue?: DateRange;\r\n onChange?: (range: DateRange) => void;\r\n placeholder?: string;\r\n className?: string;\r\n disabled?: boolean;\r\n}\r\n\r\nexport const DateRangePicker = forwardRef<HTMLDivElement, DateRangePickerProps>(\r\n ({ value: controlledVal, defaultValue = { from: null, to: null }, onChange, placeholder = 'Select date range...', className, disabled = false }, ref) => {\r\n const [range, setRange] = useControllableState<DateRange>({\r\n value: controlledVal,\r\n defaultValue,\r\n onChange,\r\n name: 'DateRangePicker',\r\n });\r\n\r\n const [viewDate, setViewDate] = useState<Date>(range.from || new Date());\r\n const [isOpen, setIsOpen] = useState(false);\r\n\r\n const handleDayClick = (d: Date) => {\r\n let next: DateRange;\r\n if (!range.from || (range.from && range.to)) {\r\n next = { from: d, to: null };\r\n } else {\r\n if (d < range.from) {\r\n next = { from: d, to: range.from };\r\n } else {\r\n next = { from: range.from, to: d };\r\n setIsOpen(false);\r\n }\r\n }\r\n setRange(next);\r\n };\r\n\r\n const displayText =\r\n range.from && range.to\r\n ? `${formatDisplayDate(range.from)} – ${formatDisplayDate(range.to)}`\r\n : range.from\r\n ? `${formatDisplayDate(range.from)} – ...`\r\n : placeholder;\r\n\r\n // Calendar generation\r\n const year = viewDate.getFullYear();\r\n const month = viewDate.getMonth();\r\n const firstDayIndex = new Date(year, month, 1).getDay();\r\n const daysInMonth = new Date(year, month + 1, 0).getDate();\r\n\r\n const days: Date[] = [];\r\n for (let i = 1; i <= daysInMonth; i++) {\r\n days.push(new Date(year, month, i));\r\n }\r\n\r\n return (\r\n <div ref={ref} className={cn('relative inline-block w-full', className)}>\r\n <Popover\r\n open={isOpen}\r\n onOpenChange={setIsOpen}\r\n trigger={\r\n <button\r\n type=\"button\"\r\n disabled={disabled}\r\n aria-haspopup=\"dialog\"\r\n aria-expanded={isOpen}\r\n aria-label={displayText}\r\n className=\"w-full h-10 px-3.5 rounded-[var(--ui-radius-md)] border border-[var(--ui-border-default)] hover:border-[var(--ui-border-strong)] bg-[var(--ui-bg-surface)] text-left flex items-center justify-between text-sm shadow-inner cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ui-primary)]\"\r\n >\r\n <div className=\"flex items-center gap-2.5 truncate\">\r\n <CalendarIcon className=\"w-4 h-4 text-[var(--ui-text-muted)] shrink-0\" />\r\n <span className={range.from ? 'text-[var(--ui-text-primary)] font-medium' : 'text-[var(--ui-text-muted)]'}>\r\n {displayText}\r\n </span>\r\n </div>\r\n </button>\r\n }\r\n >\r\n <div\r\n role=\"dialog\"\r\n aria-label=\"Choose date range\"\r\n className=\"p-4 w-76 rounded-2xl bg-[var(--ui-bg-surface)] backdrop-blur-2xl border border-[var(--ui-border-default)] shadow-2xl space-y-3\"\r\n >\r\n <div className=\"flex items-center justify-between\">\r\n <span id=\"range-month-heading\" className=\"text-xs font-bold text-[var(--ui-text-primary)] font-mono uppercase tracking-wider\">\r\n {viewDate.toLocaleString('default', { month: 'long', year: 'numeric' })}\r\n </span>\r\n <div className=\"flex items-center gap-1\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setViewDate(new Date(year, month - 1, 1))}\r\n aria-label=\"Previous month\"\r\n className=\"p-1 rounded-lg hover:bg-[var(--ui-bg-tertiary)] cursor-pointer\"\r\n >\r\n <ChevronLeft className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => setViewDate(new Date(year, month + 1, 1))}\r\n aria-label=\"Next month\"\r\n className=\"p-1 rounded-lg hover:bg-[var(--ui-bg-tertiary)] cursor-pointer\"\r\n >\r\n <ChevronRight className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div\r\n role=\"grid\"\r\n aria-labelledby=\"range-month-heading\"\r\n className=\"grid grid-cols-7 gap-1 text-center\"\r\n >\r\n {Array.from({ length: firstDayIndex }).map((_, i) => (\r\n <div key={`empty-${i}`} />\r\n ))}\r\n {days.map((d, idx) => {\r\n const dStr = formatDate(d);\r\n const fromStr = range.from ? formatDate(range.from) : '';\r\n const toStr = range.to ? formatDate(range.to) : '';\r\n const isFrom = dStr === fromStr;\r\n const isTo = dStr === toStr;\r\n const isInRange =\r\n range.from && range.to && d > range.from && d < range.to;\r\n\r\n return (\r\n <button\r\n key={idx}\r\n type=\"button\"\r\n role=\"gridcell\"\r\n aria-selected={Boolean(isFrom || isTo || isInRange)}\r\n aria-label={d.toLocaleDateString('en-US', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' })}\r\n onClick={() => handleDayClick(d)}\r\n className={cn(\r\n 'h-8 w-8 rounded-full text-xs font-semibold flex items-center justify-center transition-all cursor-pointer',\r\n (isFrom || isTo) && 'bg-[var(--ui-primary)] text-white shadow-md',\r\n isInRange && 'bg-[var(--ui-primary)]/20 text-[var(--ui-primary)] rounded-none',\r\n !isFrom && !isTo && !isInRange && 'hover:bg-[var(--ui-bg-tertiary)] text-[var(--ui-text-primary)]'\r\n )}\r\n >\r\n {d.getDate()}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n </Popover>\r\n </div>\r\n );\r\n }\r\n);\r\nDateRangePicker.displayName = 'DateRangePicker';\r\n\r\n/* -------------------------------------------------------------------------------------------------\r\n * TimePicker Component\r\n * -----------------------------------------------------------------------------------------------*/\r\nexport interface TimePickerProps {\r\n value?: string;\r\n defaultValue?: string;\r\n onChange?: (time: string) => void;\r\n format?: '12h' | '24h';\r\n className?: string;\r\n disabled?: boolean;\r\n placeholder?: string;\r\n}\r\n\r\nexport const TimePicker = forwardRef<HTMLDivElement, TimePickerProps>(\r\n (\r\n {\r\n value: controlledVal,\r\n defaultValue,\r\n onChange,\r\n format = '24h',\r\n className,\r\n disabled = false,\r\n placeholder = 'Select time...',\r\n },\r\n ref\r\n ) => {\r\n const is12h = format === '12h';\r\n const fallbackDefault = defaultValue ?? (is12h ? '12:00 PM' : '12:00');\r\n\r\n const [time, setTime] = useControllableState<string>({\r\n value: controlledVal,\r\n defaultValue: fallbackDefault,\r\n onChange,\r\n name: 'TimePicker',\r\n });\r\n\r\n const [isOpen, setIsOpen] = useState(false);\r\n\r\n // Parsing helper\r\n const parseTime = (str: string, is12: boolean) => {\r\n if (!str) return { hours: is12 ? '12' : '12', minutes: '00', period: 'AM' };\r\n const trimmed = str.trim();\r\n let period = 'AM';\r\n let cleanTime = trimmed;\r\n if (trimmed.toLowerCase().includes('pm')) {\r\n period = 'PM';\r\n cleanTime = trimmed.replace(/pm/i, '').trim();\r\n } else if (trimmed.toLowerCase().includes('am')) {\r\n period = 'AM';\r\n cleanTime = trimmed.replace(/am/i, '').trim();\r\n }\r\n const parts = cleanTime.split(':');\r\n let h = parts[0] ? parts[0].padStart(2, '0') : is12 ? '12' : '00';\r\n const m = parts[1] ? parts[1].padStart(2, '0') : '00';\r\n return { hours: h, minutes: m, period };\r\n };\r\n\r\n const { hours, minutes, period } = parseTime(time, is12h);\r\n\r\n const updateTime = (newH: string, newM: string, newPeriod?: string) => {\r\n let formatted: string;\r\n if (is12h) {\r\n const p = newPeriod ?? period;\r\n formatted = `${newH.padStart(2, '0')}:${newM.padStart(2, '0')} ${p}`;\r\n } else {\r\n formatted = `${newH.padStart(2, '0')}:${newM.padStart(2, '0')}`;\r\n }\r\n setTime(formatted);\r\n };\r\n\r\n const hourOptions = is12h\r\n ? Array.from({ length: 12 }, (_, i) => String(i + 1).padStart(2, '0'))\r\n : Array.from({ length: 24 }, (_, i) => String(i).padStart(2, '0'));\r\n\r\n const minuteOptions = ['00', '05', '10', '15', '20', '25', '30', '35', '40', '45', '50', '55'];\r\n\r\n const hourListRef = useRef<HTMLDivElement>(null);\r\n const minuteListRef = useRef<HTMLDivElement>(null);\r\n const periodListRef = useRef<HTMLDivElement>(null);\r\n\r\n // Auto-focus active option when opened\r\n useEffect(() => {\r\n if (isOpen) {\r\n const timer = setTimeout(() => {\r\n const activeHourEl = hourListRef.current?.querySelector<HTMLElement>('[aria-selected=\"true\"]');\r\n activeHourEl?.focus();\r\n }, 10);\r\n return () => clearTimeout(timer);\r\n }\r\n }, [isOpen]);\r\n\r\n const handleHourKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\r\n const idx = hourOptions.indexOf(hours);\r\n if (e.key === 'ArrowDown') {\r\n e.preventDefault();\r\n const next = hourOptions[(idx + 1) % hourOptions.length];\r\n updateTime(next, minutes, period);\r\n } else if (e.key === 'ArrowUp') {\r\n e.preventDefault();\r\n const prev = hourOptions[(idx - 1 + hourOptions.length) % hourOptions.length];\r\n updateTime(prev, minutes, period);\r\n } else if (e.key === 'ArrowRight') {\r\n e.preventDefault();\r\n const activeMinEl = minuteListRef.current?.querySelector<HTMLElement>('[aria-selected=\"true\"]') || minuteListRef.current?.querySelector<HTMLElement>('[role=\"option\"]');\r\n activeMinEl?.focus();\r\n } else if (e.key === 'Escape') {\r\n e.preventDefault();\r\n setIsOpen(false);\r\n }\r\n };\r\n\r\n const handleMinuteKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\r\n const idx = minuteOptions.indexOf(minutes);\r\n if (e.key === 'ArrowDown') {\r\n e.preventDefault();\r\n const next = minuteOptions[(idx + 1) % minuteOptions.length];\r\n updateTime(hours, next, period);\r\n } else if (e.key === 'ArrowUp') {\r\n e.preventDefault();\r\n const prev = minuteOptions[(idx - 1 + minuteOptions.length) % minuteOptions.length];\r\n updateTime(hours, prev, period);\r\n } else if (e.key === 'ArrowLeft') {\r\n e.preventDefault();\r\n const activeHourEl = hourListRef.current?.querySelector<HTMLElement>('[aria-selected=\"true\"]');\r\n activeHourEl?.focus();\r\n } else if (e.key === 'ArrowRight' && is12h) {\r\n e.preventDefault();\r\n const activePeriodEl = periodListRef.current?.querySelector<HTMLElement>('[aria-selected=\"true\"]');\r\n activePeriodEl?.focus();\r\n } else if (e.key === 'Escape') {\r\n e.preventDefault();\r\n setIsOpen(false);\r\n }\r\n };\r\n\r\n const handlePeriodKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\r\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\r\n e.preventDefault();\r\n const next = period === 'AM' ? 'PM' : 'AM';\r\n updateTime(hours, minutes, next);\r\n } else if (e.key === 'ArrowLeft') {\r\n e.preventDefault();\r\n const activeMinEl = minuteListRef.current?.querySelector<HTMLElement>('[aria-selected=\"true\"]');\r\n activeMinEl?.focus();\r\n } else if (e.key === 'Escape') {\r\n e.preventDefault();\r\n setIsOpen(false);\r\n }\r\n };\r\n\r\n return (\r\n <div ref={ref} className={cn('relative inline-block w-full', className)}>\r\n <Popover\r\n open={isOpen}\r\n onOpenChange={setIsOpen}\r\n trigger={\r\n <button\r\n type=\"button\"\r\n disabled={disabled}\r\n aria-haspopup=\"dialog\"\r\n aria-expanded={isOpen}\r\n aria-label={`Selected time: ${time}`}\r\n className={cn(\r\n 'w-full h-10 px-3.5 rounded-[var(--ui-radius-md)] border border-[var(--ui-border-default)] hover:border-[var(--ui-border-strong)] bg-[var(--ui-bg-surface)] text-left flex items-center justify-between text-sm shadow-inner transition-colors cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ui-primary)]',\r\n disabled && 'opacity-50 cursor-not-allowed'\r\n )}\r\n >\r\n <div className=\"flex items-center gap-2.5\">\r\n <Clock className=\"w-4 h-4 text-[var(--ui-text-muted)] shrink-0\" />\r\n <span className=\"font-mono text-sm font-semibold text-[var(--ui-text-primary)]\">\r\n {time || placeholder}\r\n </span>\r\n </div>\r\n </button>\r\n }\r\n >\r\n <div\r\n role=\"dialog\"\r\n aria-label=\"Choose time\"\r\n className=\"p-4 rounded-2xl bg-[var(--ui-bg-surface)] backdrop-blur-2xl border border-[var(--ui-border-default)] shadow-2xl space-y-3\"\r\n >\r\n <span className=\"text-xs font-bold text-[var(--ui-text-muted)] uppercase tracking-wider font-mono\">\r\n Select Time ({format})\r\n </span>\r\n <div className=\"flex items-center justify-center gap-2\">\r\n {/* Hours */}\r\n <div\r\n ref={hourListRef}\r\n tabIndex={0}\r\n onKeyDown={handleHourKeyDown}\r\n className=\"h-40 overflow-y-auto border border-[var(--ui-border-subtle)] rounded-xl p-1 w-16 text-center space-y-1 focus:outline-none focus:ring-1 focus:ring-[var(--ui-primary)]\"\r\n role=\"listbox\"\r\n aria-label=\"Hour\"\r\n >\r\n {hourOptions.map((h) => {\r\n const isSelected = hours === h;\r\n return (\r\n <div\r\n key={h}\r\n tabIndex={isSelected ? 0 : -1}\r\n role=\"option\"\r\n aria-selected={isSelected}\r\n onClick={() => updateTime(h, minutes, period)}\r\n className={cn(\r\n 'text-xs py-1 rounded-lg font-mono font-semibold cursor-pointer transition-colors select-none outline-none focus-visible:ring-1 focus-visible:ring-[var(--ui-primary)]',\r\n isSelected\r\n ? 'bg-[var(--ui-primary)] text-white'\r\n : 'hover:bg-[var(--ui-bg-tertiary)] text-[var(--ui-text-primary)]'\r\n )}\r\n >\r\n {h}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n <span className=\"text-sm font-bold\">:</span>\r\n {/* Minutes */}\r\n <div\r\n ref={minuteListRef}\r\n tabIndex={0}\r\n onKeyDown={handleMinuteKeyDown}\r\n className=\"h-40 overflow-y-auto border border-[var(--ui-border-subtle)] rounded-xl p-1 w-16 text-center space-y-1 focus:outline-none focus:ring-1 focus:ring-[var(--ui-primary)]\"\r\n role=\"listbox\"\r\n aria-label=\"Minute\"\r\n >\r\n {minuteOptions.map((m) => {\r\n const isSelected = minutes === m;\r\n return (\r\n <div\r\n key={m}\r\n tabIndex={isSelected ? 0 : -1}\r\n role=\"option\"\r\n aria-selected={isSelected}\r\n onClick={() => updateTime(hours, m, period)}\r\n className={cn(\r\n 'text-xs py-1 rounded-lg font-mono font-semibold cursor-pointer transition-colors select-none outline-none focus-visible:ring-1 focus-visible:ring-[var(--ui-primary)]',\r\n isSelected\r\n ? 'bg-[var(--ui-primary)] text-white'\r\n : 'hover:bg-[var(--ui-bg-tertiary)] text-[var(--ui-text-primary)]'\r\n )}\r\n >\r\n {m}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n {/* Period (AM/PM) for 12h */}\r\n {is12h && (\r\n <div\r\n ref={periodListRef}\r\n tabIndex={0}\r\n onKeyDown={handlePeriodKeyDown}\r\n className=\"h-40 border border-[var(--ui-border-subtle)] rounded-xl p-1 w-14 text-center space-y-1 flex flex-col justify-center focus:outline-none focus:ring-1 focus:ring-[var(--ui-primary)]\"\r\n role=\"listbox\"\r\n aria-label=\"Period\"\r\n >\r\n {['AM', 'PM'].map((p) => {\r\n const isSelected = period === p;\r\n return (\r\n <div\r\n key={p}\r\n tabIndex={isSelected ? 0 : -1}\r\n role=\"option\"\r\n aria-selected={isSelected}\r\n onClick={() => updateTime(hours, minutes, p)}\r\n className={cn(\r\n 'text-xs py-2 rounded-lg font-mono font-semibold cursor-pointer transition-colors select-none outline-none focus-visible:ring-1 focus-visible:ring-[var(--ui-primary)]',\r\n isSelected\r\n ? 'bg-[var(--ui-primary)] text-white'\r\n : 'hover:bg-[var(--ui-bg-tertiary)] text-[var(--ui-text-primary)]'\r\n )}\r\n >\r\n {p}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </Popover>\r\n </div>\r\n );\r\n }\r\n);\r\nTimePicker.displayName = 'TimePicker';\r\n","import React, { forwardRef, useState, useRef, useEffect, useId } from 'react';\r\nimport { Check, ChevronsUpDown, Search, X } from 'lucide-react';\r\nimport { cn } from '../utils/cn';\r\nimport { Popover } from '../overlays/Popover';\r\nimport { Chip } from '../data-display/Chip';\r\n\r\nexport interface ComboboxOption {\r\n value: string;\r\n label: string;\r\n description?: string;\r\n icon?: React.ReactNode;\r\n disabled?: boolean;\r\n}\r\n\r\nexport interface ComboboxProps {\r\n options: ComboboxOption[];\r\n value?: string;\r\n defaultValue?: string;\r\n onChange?: (val: string) => void;\r\n placeholder?: string;\r\n searchPlaceholder?: string;\r\n emptyText?: string;\r\n disabled?: boolean;\r\n clearable?: boolean;\r\n className?: string;\r\n name?: string;\r\n id?: string;\r\n 'aria-label'?: string;\r\n}\r\n\r\nexport const Combobox = forwardRef<HTMLDivElement, ComboboxProps>(\r\n (\r\n {\r\n options,\r\n value: controlledVal,\r\n defaultValue = '',\r\n onChange,\r\n placeholder = 'Select option...',\r\n searchPlaceholder = 'Search items...',\r\n emptyText = 'No items found.',\r\n disabled = false,\r\n clearable = true,\r\n className,\r\n name,\r\n id: customId,\r\n 'aria-label': ariaLabel = 'Select option',\r\n },\r\n ref\r\n ) => {\r\n const baseId = useId();\r\n const comboId = customId || `combobox-${baseId}`;\r\n const listboxId = `listbox-${baseId}`;\r\n\r\n const [internalVal, setInternalVal] = useState(defaultValue);\r\n const isControlled = controlledVal !== undefined;\r\n const selectedValue = isControlled ? controlledVal : internalVal;\r\n\r\n const [search, setSearch] = useState('');\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [highlightIndex, setHighlightIndex] = useState(0);\r\n\r\n const searchInputRef = useRef<HTMLInputElement>(null);\r\n const triggerRef = useRef<HTMLButtonElement>(null);\r\n\r\n const filteredOptions = options.filter(\r\n (opt) =>\r\n opt.label.toLowerCase().includes(search.toLowerCase()) ||\r\n opt.value.toLowerCase().includes(search.toLowerCase()) ||\r\n (opt.description && opt.description.toLowerCase().includes(search.toLowerCase()))\r\n );\r\n\r\n const selectedOption = options.find((opt) => opt.value === selectedValue);\r\n\r\n // Keep highlight index valid\r\n useEffect(() => {\r\n if (filteredOptions.length > 0) {\r\n setHighlightIndex((prev) => Math.min(prev, filteredOptions.length - 1));\r\n }\r\n }, [filteredOptions.length]);\r\n\r\n const handleSelect = (val: string) => {\r\n if (!isControlled) {\r\n setInternalVal(val);\r\n }\r\n onChange?.(val);\r\n setIsOpen(false);\r\n setSearch('');\r\n triggerRef.current?.focus();\r\n };\r\n\r\n const handleClear = (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n if (!isControlled) {\r\n setInternalVal('');\r\n }\r\n onChange?.('');\r\n };\r\n\r\n const handleKeyDown = (e: React.KeyboardEvent) => {\r\n if (!isOpen) {\r\n if (e.key === 'ArrowDown' || e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n setIsOpen(true);\r\n }\r\n return;\r\n }\r\n\r\n if (e.key === 'ArrowDown') {\r\n e.preventDefault();\r\n let next = highlightIndex + 1;\r\n while (next < filteredOptions.length && filteredOptions[next]?.disabled) {\r\n next++;\r\n }\r\n if (next < filteredOptions.length) {\r\n setHighlightIndex(next);\r\n }\r\n } else if (e.key === 'ArrowUp') {\r\n e.preventDefault();\r\n let prev = highlightIndex - 1;\r\n while (prev >= 0 && filteredOptions[prev]?.disabled) {\r\n prev--;\r\n }\r\n if (prev >= 0) {\r\n setHighlightIndex(prev);\r\n }\r\n } else if (e.key === 'Home') {\r\n e.preventDefault();\r\n let first = 0;\r\n while (first < filteredOptions.length && filteredOptions[first]?.disabled) {\r\n first++;\r\n }\r\n setHighlightIndex(first);\r\n } else if (e.key === 'End') {\r\n e.preventDefault();\r\n let last = filteredOptions.length - 1;\r\n while (last >= 0 && filteredOptions[last]?.disabled) {\r\n last--;\r\n }\r\n setHighlightIndex(last);\r\n } else if (e.key === 'Enter') {\r\n e.preventDefault();\r\n const highlighted = filteredOptions[highlightIndex];\r\n if (highlighted && !highlighted.disabled) {\r\n handleSelect(highlighted.value);\r\n }\r\n } else if (e.key === 'Escape') {\r\n e.preventDefault();\r\n setIsOpen(false);\r\n triggerRef.current?.focus();\r\n }\r\n };\r\n\r\n const activeDescendantId =\r\n filteredOptions[highlightIndex]\r\n ? `combobox-opt-${baseId}-${filteredOptions[highlightIndex].value}`\r\n : undefined;\r\n\r\n return (\r\n <div ref={ref} className={cn('relative w-full', className)}>\r\n {name && <input type=\"hidden\" name={name} value={selectedValue} />}\r\n <Popover\r\n isOpen={isOpen}\r\n onClose={() => setIsOpen(false)}\r\n trigger={\r\n <button\r\n ref={triggerRef}\r\n id={comboId}\r\n type=\"button\"\r\n disabled={disabled}\r\n role=\"combobox\"\r\n aria-expanded={isOpen}\r\n aria-haspopup=\"listbox\"\r\n aria-controls={isOpen ? listboxId : undefined}\r\n aria-label={ariaLabel}\r\n onClick={() => !disabled && setIsOpen(!isOpen)}\r\n onKeyDown={handleKeyDown}\r\n className={cn(\r\n 'w-full h-10 px-3.5 rounded-[var(--ui-radius-md)] border bg-[var(--ui-bg-surface)] text-left flex items-center justify-between text-sm transition-all shadow-inner cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ui-primary)]',\r\n disabled\r\n ? 'opacity-50 cursor-not-allowed border-[var(--ui-border-subtle)]'\r\n : 'border-[var(--ui-border-default)] hover:border-[var(--ui-border-strong)]'\r\n )}\r\n >\r\n <div className=\"flex items-center gap-2.5 truncate\">\r\n {selectedOption?.icon}\r\n <span className={selectedOption ? 'text-[var(--ui-text-primary)] font-medium' : 'text-[var(--ui-text-muted)]'}>\r\n {selectedOption ? selectedOption.label : placeholder}\r\n </span>\r\n </div>\r\n\r\n <div className=\"flex items-center gap-1 text-[var(--ui-text-muted)]\">\r\n {clearable && selectedValue && !disabled && (\r\n <span\r\n onClick={handleClear}\r\n className=\"p-1 rounded-full hover:bg-[var(--ui-bg-tertiary)] hover:text-[var(--ui-text-primary)] transition-colors cursor-pointer\"\r\n >\r\n <X className=\"w-3.5 h-3.5\" />\r\n </span>\r\n )}\r\n <ChevronsUpDown className=\"w-4 h-4 opacity-50 shrink-0\" />\r\n </div>\r\n </button>\r\n }\r\n >\r\n <div className=\"p-2 w-72 rounded-2xl bg-[var(--ui-bg-surface)] backdrop-blur-2xl border border-[var(--ui-border-default)] shadow-2xl space-y-2\">\r\n <div className=\"relative flex items-center\">\r\n <Search className=\"absolute left-2.5 w-3.5 h-3.5 text-[var(--ui-text-muted)] pointer-events-none\" />\r\n <input\r\n ref={searchInputRef}\r\n type=\"text\"\r\n autoFocus\r\n placeholder={searchPlaceholder}\r\n value={search}\r\n onChange={(e) => {\r\n setSearch(e.target.value);\r\n setHighlightIndex(0);\r\n }}\r\n onKeyDown={handleKeyDown}\r\n role=\"combobox\"\r\n aria-autocomplete=\"list\"\r\n aria-expanded=\"true\"\r\n aria-controls={listboxId}\r\n aria-activedescendant={activeDescendantId}\r\n className=\"w-full h-8 pl-8 pr-3 text-xs rounded-xl bg-[var(--ui-bg-secondary)] border border-[var(--ui-border-subtle)] focus:outline-none focus:border-[var(--ui-primary)] text-[var(--ui-text-primary)] placeholder:text-[var(--ui-text-muted)]\"\r\n />\r\n </div>\r\n\r\n <div id={listboxId} className=\"max-h-56 overflow-y-auto space-y-0.5\" role=\"listbox\">\r\n {filteredOptions.length === 0 ? (\r\n <div className=\"py-4 text-center text-xs text-[var(--ui-text-muted)]\">{emptyText}</div>\r\n ) : (\r\n filteredOptions.map((opt, idx) => {\r\n const isSelected = opt.value === selectedValue;\r\n const isHighlighted = idx === highlightIndex;\r\n const optId = `combobox-opt-${baseId}-${opt.value}`;\r\n\r\n return (\r\n <div\r\n key={opt.value}\r\n id={optId}\r\n role=\"option\"\r\n aria-selected={isSelected}\r\n aria-disabled={opt.disabled}\r\n onClick={() => !opt.disabled && handleSelect(opt.value)}\r\n onMouseEnter={() => !opt.disabled && setHighlightIndex(idx)}\r\n className={cn(\r\n 'flex items-center justify-between px-3 py-2 rounded-xl text-xs font-medium cursor-pointer transition-colors select-none',\r\n opt.disabled && 'opacity-40 cursor-not-allowed pointer-events-none',\r\n isSelected\r\n ? 'bg-[var(--ui-primary)] text-white font-semibold shadow-xs'\r\n : isHighlighted\r\n ? 'bg-[var(--ui-bg-tertiary)] text-[var(--ui-text-primary)]'\r\n : 'text-[var(--ui-text-primary)]'\r\n )}\r\n >\r\n <div className=\"flex items-center gap-2 truncate\">\r\n {opt.icon}\r\n <div>\r\n <span className=\"block truncate\">{opt.label}</span>\r\n {opt.description && (\r\n <span className={cn('text-[10px] block truncate', isSelected ? 'text-white/80' : 'text-[var(--ui-text-muted)]')}>\r\n {opt.description}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {isSelected && <Check className=\"w-3.5 h-3.5 shrink-0\" />}\r\n </div>\r\n );\r\n })\r\n )}\r\n </div>\r\n </div>\r\n </Popover>\r\n </div>\r\n );\r\n }\r\n);\r\nCombobox.displayName = 'Combobox';\r\n\r\n/* -------------------------------------------------------------------------------------------------\r\n * MultiSelect Component\r\n * -----------------------------------------------------------------------------------------------*/\r\nexport interface MultiSelectProps {\r\n options: ComboboxOption[];\r\n value?: string[];\r\n defaultValue?: string[];\r\n onChange?: (val: string[]) => void;\r\n placeholder?: string;\r\n searchPlaceholder?: string;\r\n maxCount?: number;\r\n disabled?: boolean;\r\n className?: string;\r\n}\r\n\r\nexport const MultiSelect = forwardRef<HTMLDivElement, MultiSelectProps>(\r\n (\r\n {\r\n options,\r\n value: controlledVal,\r\n defaultValue = [],\r\n onChange,\r\n placeholder = 'Select items...',\r\n searchPlaceholder = 'Search options...',\r\n maxCount = 3,\r\n disabled = false,\r\n className,\r\n },\r\n ref\r\n ) => {\r\n const [internalVal, setInternalVal] = useState<string[]>(defaultValue);\r\n const isControlled = controlledVal !== undefined;\r\n const selectedValues = isControlled ? controlledVal : internalVal;\r\n\r\n const [search, setSearch] = useState('');\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [highlightedIndex, setHighlightedIndex] = useState(0);\r\n\r\n const filteredOptions = options.filter(\r\n (opt) =>\r\n opt.label.toLowerCase().includes(search.toLowerCase()) ||\r\n opt.value.toLowerCase().includes(search.toLowerCase())\r\n );\r\n\r\n const toggleOption = (val: string) => {\r\n const opt = options.find((o) => o.value === val);\r\n if (opt?.disabled) return;\r\n\r\n const next = selectedValues.includes(val)\r\n ? selectedValues.filter((v) => v !== val)\r\n : [...selectedValues, val];\r\n if (!isControlled) {\r\n setInternalVal(next);\r\n }\r\n onChange?.(next);\r\n };\r\n\r\n const removeTag = (val: string, e?: React.MouseEvent) => {\r\n e?.stopPropagation?.();\r\n const next = selectedValues.filter((v) => v !== val);\r\n if (!isControlled) {\r\n setInternalVal(next);\r\n }\r\n onChange?.(next);\r\n };\r\n\r\n const clearAll = (e?: React.MouseEvent) => {\r\n e?.stopPropagation?.();\r\n if (!isControlled) {\r\n setInternalVal([]);\r\n }\r\n onChange?.([]);\r\n };\r\n\r\n const handleSearchKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\r\n if (filteredOptions.length === 0) return;\r\n\r\n if (e.key === 'ArrowDown') {\r\n e.preventDefault();\r\n setHighlightedIndex((prev) => {\r\n let next = (prev + 1) % filteredOptions.length;\r\n while (filteredOptions[next]?.disabled && next !== prev) {\r\n next = (next + 1) % filteredOptions.length;\r\n }\r\n return next;\r\n });\r\n } else if (e.key === 'ArrowUp') {\r\n e.preventDefault();\r\n setHighlightedIndex((prev) => {\r\n let next = (prev - 1 + filteredOptions.length) % filteredOptions.length;\r\n while (filteredOptions[next]?.disabled && next !== prev) {\r\n next = (next - 1 + filteredOptions.length) % filteredOptions.length;\r\n }\r\n return next;\r\n });\r\n } else if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n const current = filteredOptions[highlightedIndex];\r\n if (current && !current.disabled) {\r\n toggleOption(current.value);\r\n }\r\n } else if (e.key === 'Escape') {\r\n e.preventDefault();\r\n setIsOpen(false);\r\n }\r\n };\r\n\r\n return (\r\n <div ref={ref} className={cn('relative w-full', className)}>\r\n <Popover\r\n isOpen={isOpen}\r\n onClose={() => setIsOpen(false)}\r\n trigger={\r\n <div\r\n tabIndex={disabled ? -1 : 0}\r\n role=\"combobox\"\r\n aria-expanded={isOpen}\r\n aria-haspopup=\"listbox\"\r\n onClick={() => !disabled && setIsOpen(!isOpen)}\r\n onKeyDown={(e) => {\r\n if ((e.key === 'ArrowDown' || e.key === 'Enter' || e.key === ' ') && !disabled) {\r\n e.preventDefault();\r\n setIsOpen(true);\r\n }\r\n }}\r\n className={cn(\r\n 'min-h-10 py-1.5 px-3 rounded-[var(--ui-radius-md)] border bg-[var(--ui-bg-surface)] flex flex-wrap items-center justify-between gap-1.5 text-sm transition-all shadow-inner cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ui-primary)]',\r\n disabled\r\n ? 'opacity-50 cursor-not-allowed border-[var(--ui-border-subtle)]'\r\n : 'border-[var(--ui-border-default)] hover:border-[var(--ui-border-strong)]'\r\n )}\r\n >\r\n <div className=\"flex flex-wrap items-center gap-1.5 flex-1\">\r\n {selectedValues.length === 0 ? (\r\n <span className=\"text-[var(--ui-text-muted)] text-sm\">{placeholder}</span>\r\n ) : (\r\n <>\r\n {selectedValues.slice(0, maxCount).map((val) => {\r\n const opt = options.find((o) => o.value === val);\r\n return (\r\n <Chip\r\n key={val}\r\n size=\"sm\"\r\n variant=\"primary\"\r\n onRemove={() => removeTag(val, {} as any)}\r\n >\r\n {opt?.label || val}\r\n </Chip>\r\n );\r\n })}\r\n {selectedValues.length > maxCount && (\r\n <Chip size=\"sm\" variant=\"secondary\">\r\n +{selectedValues.length - maxCount} more\r\n </Chip>\r\n )}\r\n </>\r\n )}\r\n </div>\r\n\r\n <div className=\"flex items-center gap-1 text-[var(--ui-text-muted)]\">\r\n {selectedValues.length > 0 && !disabled && (\r\n <span\r\n onClick={clearAll}\r\n className=\"p-1 rounded-full hover:bg-[var(--ui-bg-tertiary)] hover:text-[var(--ui-text-primary)] transition-colors cursor-pointer\"\r\n >\r\n <X className=\"w-3.5 h-3.5\" />\r\n </span>\r\n )}\r\n <ChevronsUpDown className=\"w-4 h-4 opacity-50 shrink-0\" />\r\n </div>\r\n </div>\r\n }\r\n >\r\n <div className=\"p-2 w-76 rounded-2xl bg-[var(--ui-bg-surface)] backdrop-blur-2xl border border-[var(--ui-border-default)] shadow-2xl space-y-2\">\r\n <div className=\"relative flex items-center\">\r\n <Search className=\"absolute left-2.5 w-3.5 h-3.5 text-[var(--ui-text-muted)] pointer-events-none\" />\r\n <input\r\n type=\"text\"\r\n autoFocus\r\n placeholder={searchPlaceholder}\r\n value={search}\r\n onChange={(e) => {\r\n setSearch(e.target.value);\r\n setHighlightedIndex(0);\r\n }}\r\n onKeyDown={handleSearchKeyDown}\r\n className=\"w-full h-8 pl-8 pr-3 text-xs rounded-xl bg-[var(--ui-bg-secondary)] border border-[var(--ui-border-subtle)] focus:outline-none focus:border-[var(--ui-primary)] text-[var(--ui-text-primary)]\"\r\n />\r\n </div>\r\n\r\n <div className=\"max-h-56 overflow-y-auto space-y-0.5\" role=\"listbox\">\r\n {filteredOptions.length === 0 ? (\r\n <div className=\"py-4 text-center text-xs text-[var(--ui-text-muted)]\">No options found.</div>\r\n ) : (\r\n filteredOptions.map((opt, index) => {\r\n const isChecked = selectedValues.includes(opt.value);\r\n const isHighlighted = highlightedIndex === index;\r\n\r\n return (\r\n <div\r\n key={opt.value}\r\n role=\"option\"\r\n aria-selected={isChecked}\r\n aria-disabled={opt.disabled}\r\n onClick={() => !opt.disabled && toggleOption(opt.value)}\r\n className={cn(\r\n 'flex items-center justify-between px-3 py-2 rounded-xl text-xs font-medium transition-colors select-none',\r\n opt.disabled\r\n ? 'opacity-40 cursor-not-allowed text-[var(--ui-text-muted)]'\r\n : 'cursor-pointer',\r\n isChecked && 'text-[var(--ui-primary)] font-semibold',\r\n isHighlighted && !opt.disabled && 'bg-[var(--ui-primary)]/15'\r\n )}\r\n >\r\n <div className=\"flex items-center gap-2 truncate\">\r\n {opt.icon}\r\n <span>{opt.label}</span>\r\n </div>\r\n {isChecked && <Check className=\"w-3.5 h-3.5 text-[var(--ui-primary)] shrink-0\" />}\r\n </div>\r\n );\r\n })\r\n )}\r\n </div>\r\n </div>\r\n </Popover>\r\n </div>\r\n );\r\n }\r\n);\r\nMultiSelect.displayName = 'MultiSelect';\r\n","import React, { forwardRef, useState, useRef, useEffect } from 'react';\r\nimport { UploadCloud, File, FileText, Image as ImageIcon, X, CheckCircle2, AlertCircle } from 'lucide-react';\r\nimport { cn } from '../utils/cn';\r\nimport { ProgressBar } from '../feedback/ProgressBar';\r\nimport { Button } from '../buttons/Button';\r\n\r\nexport interface UploadedFile {\r\n id: string;\r\n file: File;\r\n name: string;\r\n size: number;\r\n type: string;\r\n progress?: number;\r\n status?: 'pending' | 'uploading' | 'completed' | 'error';\r\n previewUrl?: string;\r\n errorMessage?: string;\r\n}\r\n\r\nexport interface FileUploadProps {\r\n accept?: string;\r\n maxSizeMB?: number;\r\n multiple?: boolean;\r\n maxFiles?: number;\r\n disabled?: boolean;\r\n onFilesSelected?: (files: File[]) => void;\r\n onFileRemove?: (fileId: string) => void;\r\n className?: string;\r\n label?: string;\r\n description?: string;\r\n}\r\n\r\nexport function formatFileSize(bytes: number): string {\r\n if (bytes === 0) return '0 B';\r\n const k = 1024;\r\n const sizes = ['B', 'KB', 'MB', 'GB'];\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))} ${sizes[i]}`;\r\n}\r\n\r\nexport const FileUpload = forwardRef<HTMLDivElement, FileUploadProps>(\r\n (\r\n {\r\n accept,\r\n maxSizeMB = 10,\r\n multiple = true,\r\n maxFiles = 5,\r\n disabled = false,\r\n onFilesSelected,\r\n onFileRemove,\r\n className,\r\n label = 'Drag & drop files here, or browse',\r\n description = 'Supports images, documents, and media up to 10MB',\r\n },\r\n ref\r\n ) => {\r\n const [isDragOver, setIsDragOver] = useState(false);\r\n const [fileList, setFileList] = useState<UploadedFile[]>([]);\r\n const inputRef = useRef<HTMLInputElement | null>(null);\r\n const fileListRef = useRef<UploadedFile[]>(fileList);\r\n fileListRef.current = fileList;\r\n\r\n // Cleanup object URLs on unmount\r\n useEffect(() => {\r\n return () => {\r\n fileListRef.current.forEach((item) => {\r\n if (item.previewUrl) {\r\n URL.revokeObjectURL(item.previewUrl);\r\n }\r\n });\r\n };\r\n }, []);\r\n\r\n const matchesAccept = (file: File, acceptStr?: string): boolean => {\r\n if (!acceptStr) return true;\r\n const patterns = acceptStr.split(',').map((p) => p.trim().toLowerCase());\r\n const fileName = file.name.toLowerCase();\r\n const fileType = file.type.toLowerCase();\r\n\r\n return patterns.some((p) => {\r\n if (p.startsWith('.')) {\r\n return fileName.endsWith(p);\r\n }\r\n if (p.endsWith('/*')) {\r\n const baseType = p.replace('/*', '');\r\n return fileType.startsWith(baseType);\r\n }\r\n return fileType === p;\r\n });\r\n };\r\n\r\n const processFiles = (incoming: FileList | null) => {\r\n if (!incoming) return;\r\n\r\n const validFiles: File[] = [];\r\n const newUploaded: UploadedFile[] = [];\r\n\r\n Array.from(incoming).forEach((file) => {\r\n if (fileList.length + newUploaded.length >= maxFiles) return;\r\n\r\n const isAccepted = matchesAccept(file, accept);\r\n const isOversized = file.size > maxSizeMB * 1024 * 1024;\r\n const hasError = !isAccepted || isOversized;\r\n\r\n let errorMsg: string | undefined;\r\n if (!isAccepted) errorMsg = `File type not supported (${accept})`;\r\n else if (isOversized) errorMsg = `File exceeds ${maxSizeMB}MB limit`;\r\n\r\n const fileObj: UploadedFile = {\r\n id: `${file.name}-${Date.now()}-${Math.random()}`,\r\n file,\r\n name: file.name,\r\n size: file.size,\r\n type: file.type,\r\n progress: hasError ? 0 : 100,\r\n status: hasError ? 'error' : 'completed',\r\n errorMessage: errorMsg,\r\n previewUrl: file.type.startsWith('image/') && !hasError ? URL.createObjectURL(file) : undefined,\r\n };\r\n\r\n newUploaded.push(fileObj);\r\n if (!hasError) validFiles.push(file);\r\n });\r\n\r\n setFileList((prev) => [...prev, ...newUploaded]);\r\n if (validFiles.length > 0) {\r\n onFilesSelected?.(validFiles);\r\n }\r\n };\r\n\r\n const handleDragOver = (e: React.DragEvent) => {\r\n e.preventDefault();\r\n if (!disabled) setIsDragOver(true);\r\n };\r\n\r\n const handleDragLeave = (e: React.DragEvent) => {\r\n e.preventDefault();\r\n setIsDragOver(false);\r\n };\r\n\r\n const handleDrop = (e: React.DragEvent) => {\r\n e.preventDefault();\r\n setIsDragOver(false);\r\n if (disabled) return;\r\n processFiles(e.dataTransfer.files);\r\n };\r\n\r\n const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n processFiles(e.target.files);\r\n if (inputRef.current) inputRef.current.value = '';\r\n };\r\n\r\n const removeFile = (id: string) => {\r\n setFileList((prev) => {\r\n const item = prev.find((f) => f.id === id);\r\n if (item?.previewUrl) {\r\n URL.revokeObjectURL(item.previewUrl);\r\n }\r\n return prev.filter((f) => f.id !== id);\r\n });\r\n onFileRemove?.(id);\r\n };\r\n\r\n return (\r\n <div ref={ref} className={cn('w-full space-y-4', className)}>\r\n {/* Dropzone Box */}\r\n <div\r\n onDragOver={handleDragOver}\r\n onDragLeave={handleDragLeave}\r\n onDrop={handleDrop}\r\n onClick={() => !disabled && inputRef.current?.click()}\r\n className={cn(\r\n 'relative rounded-2xl p-6 sm:p-8 text-center border-2 border-dashed transition-all cursor-pointer flex flex-col items-center justify-center gap-3 select-none',\r\n disabled\r\n ? 'opacity-50 cursor-not-allowed border-[var(--ui-border-subtle)] bg-[var(--ui-bg-secondary)]/30'\r\n : isDragOver\r\n ? 'border-[var(--ui-primary)] bg-[var(--ui-primary)]/10 shadow-lg shadow-blue-500/20 scale-[0.99]'\r\n : 'border-[var(--ui-border-default)] hover:border-[var(--ui-border-strong)] bg-[var(--ui-bg-surface)]/60 hover:bg-[var(--ui-bg-secondary)]'\r\n )}\r\n >\r\n <input\r\n ref={inputRef}\r\n type=\"file\"\r\n accept={accept}\r\n multiple={multiple}\r\n disabled={disabled}\r\n onChange={handleFileChange}\r\n className=\"hidden\"\r\n />\r\n\r\n <div className=\"w-12 h-12 rounded-2xl bg-[var(--ui-primary)]/15 text-[var(--ui-primary)] flex items-center justify-center shadow-inner\">\r\n <UploadCloud className=\"w-6 h-6\" />\r\n </div>\r\n\r\n <div className=\"space-y-1\">\r\n <h4 className=\"text-sm font-bold text-[var(--ui-text-primary)]\">{label}</h4>\r\n <p className=\"text-xs text-[var(--ui-text-muted)]\">{description}</p>\r\n </div>\r\n\r\n <Button size=\"xs\" variant=\"outline\" className=\"rounded-full px-4 mt-1 pointer-events-none\">\r\n Browse Files\r\n </Button>\r\n </div>\r\n\r\n {/* Uploaded Files List */}\r\n {fileList.length > 0 && (\r\n <div className=\"space-y-2\">\r\n <span className=\"text-xs font-mono font-bold text-[var(--ui-text-muted)] uppercase tracking-wider\">\r\n Files ({fileList.length}/{maxFiles})\r\n </span>\r\n\r\n <div className=\"space-y-2\">\r\n {fileList.map((item) => (\r\n <div\r\n key={item.id}\r\n className=\"p-3 rounded-2xl bg-[var(--ui-bg-surface)] border border-[var(--ui-border-default)] flex items-center justify-between gap-3 shadow-xs animate-in fade-in duration-200\"\r\n >\r\n <div className=\"flex items-center gap-3 truncate\">\r\n {item.previewUrl ? (\r\n <img\r\n src={item.previewUrl}\r\n alt={item.name}\r\n className=\"w-10 h-10 rounded-xl object-cover border border-[var(--ui-border-subtle)] shrink-0\"\r\n />\r\n ) : (\r\n <div className=\"w-10 h-10 rounded-xl bg-[var(--ui-bg-tertiary)] flex items-center justify-center text-[var(--ui-text-muted)] shrink-0\">\r\n {item.type.includes('pdf') ? <FileText className=\"w-5 h-5\" /> : <File className=\"w-5 h-5\" />}\r\n </div>\r\n )}\r\n\r\n <div className=\"truncate space-y-0.5\">\r\n <span className=\"text-xs font-semibold text-[var(--ui-text-primary)] block truncate\">\r\n {item.name}\r\n </span>\r\n <div className=\"flex items-center gap-2 text-[11px] text-[var(--ui-text-muted)] font-mono\">\r\n <span>{formatFileSize(item.size)}</span>\r\n {item.status === 'completed' && (\r\n <span className=\"text-emerald-500 font-semibold flex items-center gap-0.5\">\r\n <CheckCircle2 className=\"w-3 h-3\" /> Ready\r\n </span>\r\n )}\r\n {item.status === 'error' && (\r\n <span className=\"text-rose-500 font-semibold flex items-center gap-0.5\">\r\n <AlertCircle className=\"w-3 h-3\" /> {item.errorMessage}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n onClick={() => removeFile(item.id)}\r\n className=\"p-1.5 rounded-full hover:bg-[var(--ui-bg-tertiary)] text-[var(--ui-text-muted)] hover:text-rose-500 transition-colors\"\r\n >\r\n <X className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\nFileUpload.displayName = 'FileUpload';\r\n","import React, { forwardRef, useState, useEffect } from 'react';\r\nimport { Plus, Minus } from 'lucide-react';\r\nimport { cn } from '../utils/cn';\r\nimport { useControllableState } from '../utils/useControllableState';\r\n\r\nexport interface NumberInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'onChange' | 'value' | 'defaultValue' | 'size'> {\r\n value?: number;\r\n defaultValue?: number;\r\n onChange?: (val: number) => void;\r\n min?: number;\r\n max?: number;\r\n step?: number;\r\n precision?: number;\r\n size?: 'sm' | 'md' | 'lg';\r\n stepperPosition?: 'right' | 'split';\r\n}\r\n\r\nexport const NumberInput = forwardRef<HTMLInputElement, NumberInputProps>(\r\n (\r\n {\r\n value: controlledVal,\r\n defaultValue = 0,\r\n onChange,\r\n min = -Infinity,\r\n max = Infinity,\r\n step = 1,\r\n precision = 0,\r\n size = 'md',\r\n stepperPosition = 'right',\r\n disabled = false,\r\n className,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const [value, setValue] = useControllableState<number>({\r\n value: controlledVal,\r\n defaultValue,\r\n onChange,\r\n name: 'NumberInput',\r\n });\r\n\r\n const clamp = (num: number) => {\r\n let clamped = Math.min(max, Math.max(min, num));\r\n if (precision > 0) {\r\n clamped = parseFloat(clamped.toFixed(precision));\r\n }\r\n return clamped;\r\n };\r\n\r\n const handleIncrement = () => {\r\n if (disabled) return;\r\n const next = clamp(value + step);\r\n setValue(next);\r\n };\r\n\r\n const handleDecrement = () => {\r\n if (disabled) return;\r\n const next = clamp(value - step);\r\n setValue(next);\r\n };\r\n\r\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const val = e.target.value;\r\n if (val === '' || val === '-') {\r\n return;\r\n }\r\n const parsed = parseFloat(val);\r\n if (!isNaN(parsed)) {\r\n const next = clamp(parsed);\r\n setValue(next);\r\n }\r\n };\r\n\r\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\r\n if (e.key === 'ArrowUp') {\r\n e.preventDefault();\r\n handleIncrement();\r\n } else if (e.key === 'ArrowDown') {\r\n e.preventDefault();\r\n handleDecrement();\r\n }\r\n };\r\n\r\n const heightClass = size === 'sm' ? 'h-8 text-xs' : size === 'lg' ? 'h-12 text-base' : 'h-10 text-sm';\r\n\r\n if (stepperPosition === 'split') {\r\n return (\r\n <div className={cn('inline-flex items-center rounded-[var(--ui-radius-md)] border border-[var(--ui-border-default)] bg-[var(--ui-bg-surface)] overflow-hidden shadow-inner', className)}>\r\n <button\r\n type=\"button\"\r\n disabled={disabled || value <= min}\r\n onClick={handleDecrement}\r\n className=\"px-3 h-full flex items-center justify-center hover:bg-[var(--ui-bg-tertiary)] disabled:opacity-30 disabled:pointer-events-none text-[var(--ui-text-muted)] hover:text-[var(--ui-text-primary)] transition-colors border-r border-[var(--ui-border-subtle)] cursor-pointer\"\r\n >\r\n <Minus className=\"w-3.5 h-3.5\" />\r\n </button>\r\n\r\n <input\r\n ref={ref}\r\n type=\"number\"\r\n value={value}\r\n disabled={disabled}\r\n onChange={handleInputChange}\r\n onKeyDown={handleKeyDown}\r\n className={cn('w-20 text-center font-mono font-semibold bg-transparent text-[var(--ui-text-primary)] focus:outline-none [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none', heightClass)}\r\n {...props}\r\n />\r\n\r\n <button\r\n type=\"button\"\r\n disabled={disabled || value >= max}\r\n onClick={handleIncrement}\r\n className=\"px-3 h-full flex items-center justify-center hover:bg-[var(--ui-bg-tertiary)] disabled:opacity-30 disabled:pointer-events-none text-[var(--ui-text-muted)] hover:text-[var(--ui-text-primary)] transition-colors border-l border-[var(--ui-border-subtle)] cursor-pointer\"\r\n >\r\n <Plus className=\"w-3.5 h-3.5\" />\r\n </button>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className={cn('relative w-full inline-flex items-center', className)}>\r\n <input\r\n ref={ref}\r\n type=\"number\"\r\n value={value}\r\n disabled={disabled}\r\n onChange={handleInputChange}\r\n onKeyDown={handleKeyDown}\r\n className={cn(\r\n 'w-full rounded-[var(--ui-radius-md)] border border-[var(--ui-border-default)] hover:border-[var(--ui-border-strong)] bg-[var(--ui-bg-surface)] px-3.5 pr-10 font-mono font-semibold text-[var(--ui-text-primary)] transition-all shadow-inner focus:outline-none focus:ring-2 focus:ring-[var(--ui-primary)]/50 [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none',\r\n heightClass,\r\n disabled && 'opacity-50 cursor-not-allowed'\r\n )}\r\n {...props}\r\n />\r\n\r\n <div className=\"absolute right-1 top-1 bottom-1 flex flex-col justify-center border-l border-[var(--ui-border-subtle)] pl-1 pr-1\">\r\n <button\r\n type=\"button\"\r\n disabled={disabled || value >= max}\r\n onClick={handleIncrement}\r\n className=\"px-1.5 h-1/2 flex items-center justify-center hover:bg-[var(--ui-bg-tertiary)] rounded-t text-[var(--ui-text-muted)] hover:text-[var(--ui-text-primary)] disabled:opacity-30 transition-colors cursor-pointer\"\r\n >\r\n <Plus className=\"w-3 h-3\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n disabled={disabled || value <= min}\r\n onClick={handleDecrement}\r\n className=\"px-1.5 h-1/2 flex items-center justify-center hover:bg-[var(--ui-bg-tertiary)] rounded-b text-[var(--ui-text-muted)] hover:text-[var(--ui-text-primary)] disabled:opacity-30 transition-colors cursor-pointer\"\r\n >\r\n <Minus className=\"w-3 h-3\" />\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n }\r\n);\r\nNumberInput.displayName = 'NumberInput';\r\n\r\n/* -------------------------------------------------------------------------------------------------\r\n * CurrencyInput Component\r\n * -----------------------------------------------------------------------------------------------*/\r\nexport interface CurrencyInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'onChange' | 'value' | 'defaultValue'> {\r\n value?: number;\r\n defaultValue?: number;\r\n onChange?: (val: number) => void;\r\n currency?: 'USD' | 'VND' | 'EUR' | string;\r\n currencySymbol?: string;\r\n position?: 'prefix' | 'suffix';\r\n}\r\n\r\nexport function formatCurrencyString(val: number, separator = ','): string {\r\n if (isNaN(val)) return '0';\r\n const parts = val.toString().split('.');\r\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, separator);\r\n return parts.join('.');\r\n}\r\n\r\nexport const CurrencyInput = forwardRef<HTMLInputElement, CurrencyInputProps>(\r\n (\r\n {\r\n value: controlledVal,\r\n defaultValue = 0,\r\n onChange,\r\n currency = 'USD',\r\n currencySymbol,\r\n position = 'prefix',\r\n disabled = false,\r\n className,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const symbol = currencySymbol || (currency === 'VND' ? '₫' : currency === 'EUR' ? '€' : '$');\r\n const isSuffix = position === 'suffix' || currency === 'VND';\r\n\r\n const [value, setValue, isControlled] = useControllableState<number>({\r\n value: controlledVal,\r\n defaultValue,\r\n onChange,\r\n name: 'CurrencyInput',\r\n });\r\n\r\n const [internalInputString, setInternalInputString] = useState<string>(formatCurrencyString(value));\r\n\r\n // When value changes, update internal display for uncontrolled mode\r\n useEffect(() => {\r\n if (!isControlled) {\r\n setInternalInputString(formatCurrencyString(value));\r\n }\r\n }, [value, isControlled]);\r\n\r\n // For controlled inputs, display value is ALWAYS pure derived from the source-of-truth prop\r\n const displayVal = isControlled ? formatCurrencyString(value) : internalInputString;\r\n\r\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const raw = e.target.value.replace(/[^0-9.]/g, '');\r\n const parsed = parseFloat(raw);\r\n const num = isNaN(parsed) ? 0 : parsed;\r\n\r\n if (!isControlled) {\r\n setInternalInputString(raw ? formatCurrencyString(num) : '');\r\n }\r\n setValue(num);\r\n };\r\n\r\n return (\r\n <div className={cn('relative w-full flex items-center', className)}>\r\n {!isSuffix && (\r\n <span className=\"absolute left-3.5 text-sm font-bold text-[var(--ui-text-muted)] pointer-events-none font-mono\">\r\n {symbol}\r\n </span>\r\n )}\r\n\r\n <input\r\n ref={ref}\r\n type=\"text\"\r\n value={displayVal}\r\n disabled={disabled}\r\n onChange={handleInputChange}\r\n className={cn(\r\n 'w-full h-10 rounded-[var(--ui-radius-md)] border border-[var(--ui-border-default)] hover:border-[var(--ui-border-strong)] bg-[var(--ui-bg-surface)] px-3.5 font-mono font-bold text-sm text-[var(--ui-text-primary)] transition-all shadow-inner focus:outline-none focus:ring-2 focus:ring-[var(--ui-primary)]/50',\r\n !isSuffix && 'pl-8',\r\n isSuffix && 'pr-12',\r\n disabled && 'opacity-50 cursor-not-allowed'\r\n )}\r\n {...props}\r\n />\r\n\r\n {isSuffix && (\r\n <span className=\"absolute right-3.5 text-xs font-bold text-[var(--ui-text-muted)] pointer-events-none font-mono uppercase\">\r\n {currency}\r\n </span>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\nCurrencyInput.displayName = 'CurrencyInput';\r\n","import React, { forwardRef, useState, useEffect } from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface MaskedInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'onChange' | 'value' | 'defaultValue'> {\n mask: string; // e.g. '(###) ###-####' or '#### #### #### ####'\n maskChar?: string; // default '#'\n value?: string;\n defaultValue?: string;\n onValueChange?: (unmasked: string, formatted: string) => void;\n prefixIcon?: React.ReactNode;\n suffixIcon?: React.ReactNode;\n}\n\nexport function applyMask(rawVal: string, mask: string, maskChar = '#'): { formatted: string; unmasked: string } {\n const digitsOnly = rawVal.replace(/\\D/g, '');\n if (!digitsOnly) return { formatted: '', unmasked: '' };\n let formatted = '';\n let digitIndex = 0;\n\n for (let i = 0; i < mask.length; i++) {\n const char = mask[i];\n if (char === maskChar) {\n if (digitIndex < digitsOnly.length) {\n formatted += digitsOnly[digitIndex++];\n } else {\n break;\n }\n } else {\n if (digitIndex < digitsOnly.length) {\n formatted += char;\n }\n }\n }\n\n return { formatted, unmasked: digitsOnly };\n}\n\nexport const MaskedInput = forwardRef<HTMLInputElement, MaskedInputProps>(\n (\n {\n mask,\n maskChar = '#',\n value: controlledVal,\n defaultValue = '',\n onValueChange,\n prefixIcon,\n suffixIcon,\n disabled = false,\n className,\n ...props\n },\n ref\n ) => {\n const [internalVal, setInternalVal] = useState<string>(\n applyMask(defaultValue, mask, maskChar).formatted\n );\n const displayValue = controlledVal !== undefined ? applyMask(controlledVal, mask, maskChar).formatted : internalVal;\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const { formatted, unmasked } = applyMask(e.target.value, mask, maskChar);\n setInternalVal(formatted);\n onValueChange?.(unmasked, formatted);\n };\n\n return (\n <div className={cn('relative w-full flex items-center', className)}>\n {prefixIcon && (\n <div className=\"absolute left-3.5 flex items-center pointer-events-none text-[var(--ui-text-muted)]\">\n {prefixIcon}\n </div>\n )}\n\n <input\n ref={ref}\n type=\"text\"\n value={displayValue}\n disabled={disabled}\n onChange={handleInputChange}\n className={cn(\n 'w-full h-10 rounded-[var(--ui-radius-md)] border border-[var(--ui-border-default)] hover:border-[var(--ui-border-strong)] bg-[var(--ui-bg-surface)] px-3.5 font-mono text-sm text-[var(--ui-text-primary)] transition-all shadow-inner focus:outline-none focus:ring-2 focus:ring-[var(--ui-primary)]/50',\n prefixIcon && 'pl-9',\n suffixIcon && 'pr-9',\n disabled && 'opacity-50 cursor-not-allowed'\n )}\n {...props}\n />\n\n {suffixIcon && (\n <div className=\"absolute right-3.5 flex items-center pointer-events-none text-[var(--ui-text-muted)]\">\n {suffixIcon}\n </div>\n )}\n </div>\n );\n }\n);\nMaskedInput.displayName = 'MaskedInput';\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/cn.ts"],"names":[],"mappings":";;;;;;;;AAGO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B","file":"chunk-4S6L5V7X.js","sourcesContent":["import { clsx, type ClassValue } from 'clsx';\r\nimport { twMerge } from 'tailwind-merge';\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { cn } from './chunk-
|
|
1
|
+
import { cn } from './chunk-4S6L5V7X.js';
|
|
2
2
|
import { forwardRef } from 'react';
|
|
3
3
|
import { cva } from 'class-variance-authority';
|
|
4
4
|
import { Loader2 } from 'lucide-react';
|
|
@@ -82,5 +82,5 @@ var Button = forwardRef(
|
|
|
82
82
|
Button.displayName = "Button";
|
|
83
83
|
|
|
84
84
|
export { Button, buttonVariants };
|
|
85
|
-
//# sourceMappingURL=chunk-
|
|
86
|
-
//# sourceMappingURL=chunk-
|
|
85
|
+
//# sourceMappingURL=chunk-66VWUJEI.js.map
|
|
86
|
+
//# sourceMappingURL=chunk-66VWUJEI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/buttons/Button.tsx"],"names":[],"mappings":";;;;;;AAKO,IAAM,cAAA,GAAiB,GAAA;AAAA,EAC5B,oSAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,OAAA,EACE,sJAAA;AAAA,QACF,SAAA,EACE,4IAAA;AAAA,QACF,OAAA,EACE,wMAAA;AAAA,QACF,KAAA,EACE,kFAAA;AAAA,QACF,MAAA,EACE,+IAAA;AAAA,QACF,IAAA,EACE,oHAAA;AAAA,QACF,KAAA,EACE;AAAA,OACJ;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,EAAA,EAAI,wDAAA;AAAA,QACJ,EAAA,EAAI,4DAAA;AAAA,QACJ,EAAA,EAAI,uEAAA;AAAA,QACJ,EAAA,EAAI,yEAAA;AAAA,QACJ,EAAA,EAAI;AAAA,OACN;AAAA,MACA,SAAA,EAAW;AAAA,QACT,IAAA,EAAM,QAAA;AAAA,QACN,KAAA,EAAO;AAAA;AACT,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS,SAAA;AAAA,MACT,IAAA,EAAM,IAAA;AAAA,MACN,SAAA,EAAW;AAAA;AACb;AAEJ;AAWO,IAAM,MAAA,GAAS,UAAA;AAAA,EACpB,CACE;AAAA,IACE,SAAA;AAAA,IACA,OAAA;AAAA,IACA,IAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA,GAAU,KAAA;AAAA,IACV,WAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,aAAa,QAAA,IAAY,OAAA;AAE/B,IAAA,uBACE,IAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,QAAA,EAAU,UAAA;AAAA,QACV,SAAA,EAAW,GAAG,cAAA,CAAe,EAAE,SAAS,IAAA,EAAM,SAAA,EAAW,CAAA,EAAG,SAAS,CAAA;AAAA,QACpE,GAAG,KAAA;AAAA,QAGJ,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,aAAA,EAAY,MAAA;AAAA,cACZ,SAAA,EAAU;AAAA;AAAA,WACZ;AAAA,UAEC,0BACC,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,OAAA,EAAA,EAAQ,WAAU,sBAAA,EAAuB,CAAA;AAAA,4BAC1C,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,WAAA,IAAe,QAAA,EAAS;AAAA,WAAA,EACjC,oBAEA,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,YAAA,QAAA,oBAAY,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EAA0C,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,4BAChF,GAAA,CAAC,UAAM,QAAA,EAAS,CAAA;AAAA,YACf,SAAA,oBAAa,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0CAA0C,QAAA,EAAA,SAAA,EAAU;AAAA,WAAA,EACpF;AAAA;AAAA;AAAA,KAEJ;AAAA,EAEJ;AACF;AAEA,MAAA,CAAO,WAAA,GAAc,QAAA","file":"chunk-66VWUJEI.js","sourcesContent":["import React, { forwardRef } from 'react';\r\nimport { cva, type VariantProps } from 'class-variance-authority';\r\nimport { Loader2 } from 'lucide-react';\r\nimport { cn } from '../utils/cn';\r\n\r\nexport const buttonVariants = cva(\r\n 'relative inline-flex items-center justify-center font-medium transition-all duration-200 select-none cursor-pointer disabled:pointer-events-none disabled:opacity-40 focus-visible:outline-none focus-visible:ring-4 focus-visible:ring-[var(--ui-primary)]/30 active:scale-[0.97] overflow-hidden',\r\n {\r\n variants: {\r\n variant: {\r\n primary:\r\n 'bg-[var(--ui-primary)] hover:bg-[var(--ui-primary-hover)] text-white shadow-sm hover:shadow-[0_4px_16px_rgba(0,113,227,0.35)] border border-white/20',\r\n secondary:\r\n 'bg-[var(--ui-bg-tertiary)] hover:bg-[var(--ui-bg-surface)] text-[var(--ui-text-primary)] border border-[var(--ui-border-subtle)] shadow-sm',\r\n outline:\r\n 'border border-[var(--ui-border-default)] bg-[var(--ui-bg-surface)]/60 backdrop-blur-xl text-[var(--ui-text-primary)] hover:bg-[var(--ui-bg-tertiary)] hover:border-[var(--ui-border-strong)] shadow-sm',\r\n ghost:\r\n 'bg-transparent text-[var(--ui-text-primary)] hover:bg-[var(--ui-bg-tertiary)]/70',\r\n danger:\r\n 'bg-[var(--ui-error)] hover:bg-[var(--ui-error)]/90 text-white shadow-sm hover:shadow-[0_4px_16px_rgba(255,59,48,0.35)] border border-white/15',\r\n link:\r\n 'bg-transparent text-[var(--ui-primary)] underline-offset-4 hover:underline p-0 h-auto active:scale-100 font-normal',\r\n glass:\r\n 'bg-white/10 dark:bg-white/10 backdrop-blur-2xl border border-white/20 dark:border-white/15 text-[var(--ui-text-primary)] hover:bg-white/20 dark:hover:bg-white/15 shadow-[0_8px_32px_rgba(0,0,0,0.12)] hover:shadow-[0_8px_32px_rgba(0,113,227,0.25)]',\r\n },\r\n size: {\r\n xs: 'h-7 px-2.5 text-xs rounded-[var(--ui-radius-sm)] gap-1',\r\n sm: 'h-8.5 px-3.5 text-xs rounded-[var(--ui-radius-md)] gap-1.5',\r\n md: 'h-10 px-4.5 text-sm rounded-[var(--ui-radius-md)] gap-2 font-semibold',\r\n lg: 'h-12 px-6 text-base rounded-[var(--ui-radius-lg)] gap-2.5 font-semibold',\r\n xl: 'h-14 px-8 text-lg rounded-[var(--ui-radius-xl)] gap-3 font-bold',\r\n },\r\n fullWidth: {\r\n true: 'w-full',\r\n false: '',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'primary',\r\n size: 'md',\r\n fullWidth: false,\r\n },\r\n }\r\n);\r\n\r\nexport interface ButtonProps\r\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\r\n VariantProps<typeof buttonVariants> {\r\n loading?: boolean;\r\n loadingText?: string;\r\n leftIcon?: React.ReactNode;\r\n rightIcon?: React.ReactNode;\r\n}\r\n\r\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\r\n (\r\n {\r\n className,\r\n variant,\r\n size,\r\n fullWidth,\r\n loading = false,\r\n loadingText,\r\n leftIcon,\r\n rightIcon,\r\n disabled,\r\n children,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const isDisabled = disabled || loading;\r\n\r\n return (\r\n <button\r\n ref={ref}\r\n disabled={isDisabled}\r\n className={cn(buttonVariants({ variant, size, fullWidth }), className)}\r\n {...props}\r\n >\r\n {/* Apple subtle top specular highlight */}\r\n <span\r\n aria-hidden=\"true\"\r\n className=\"absolute inset-x-0 top-0 h-[1px] bg-gradient-to-r from-transparent via-white/35 to-transparent pointer-events-none\"\r\n />\r\n\r\n {loading ? (\r\n <>\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n <span>{loadingText || children}</span>\r\n </>\r\n ) : (\r\n <>\r\n {leftIcon && <span className=\"flex-shrink-0 inline-flex items-center\">{leftIcon}</span>}\r\n <span>{children}</span>\r\n {rightIcon && <span className=\"flex-shrink-0 inline-flex items-center\">{rightIcon}</span>}\r\n </>\r\n )}\r\n </button>\r\n );\r\n }\r\n);\r\n\r\nButton.displayName = 'Button';\r\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Portal } from './chunk-
|
|
2
|
-
import { cn } from './chunk-
|
|
1
|
+
import { Portal } from './chunk-IABPUCAQ.js';
|
|
2
|
+
import { cn } from './chunk-4S6L5V7X.js';
|
|
3
3
|
import { useRef, useEffect, useState, useCallback } from 'react';
|
|
4
4
|
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
5
5
|
|
|
@@ -151,5 +151,5 @@ var Popover = ({
|
|
|
151
151
|
};
|
|
152
152
|
|
|
153
153
|
export { Popover, useControllableState };
|
|
154
|
-
//# sourceMappingURL=chunk-
|
|
155
|
-
//# sourceMappingURL=chunk-
|
|
154
|
+
//# sourceMappingURL=chunk-7NMB2Y64.js.map
|
|
155
|
+
//# sourceMappingURL=chunk-7NMB2Y64.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/useControllableState.ts","../src/overlays/Popover.tsx"],"names":["useCallback","useState","useRef","useEffect"],"mappings":"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","file":"chunk-7NMB2Y64.js","sourcesContent":["import { useState, useCallback, useRef, useEffect } from 'react';\r\n\r\nexport interface UseControllableStateProps<T> {\r\n value?: T;\r\n defaultValue?: T | (() => T);\r\n onChange?: (value: T) => void;\r\n name?: string;\r\n}\r\n\r\n/**\r\n * Standard controllable state hook for managing controlled & uncontrolled component states.\r\n * Guarantees strict single source-of-truth:\r\n * - When `value !== undefined`, state is controlled by parent.\r\n * - When `value === undefined`, state is maintained internally starting from `defaultValue`.\r\n * - Prevents UI desync when parent rejects an update.\r\n */\r\nexport function useControllableState<T>({\r\n value: controlledValue,\r\n defaultValue,\r\n onChange,\r\n name,\r\n}: UseControllableStateProps<T>): [T, (next: T | ((prev: T) => T)) => void, boolean] {\r\n const isControlled = controlledValue !== undefined;\r\n const isControlledRef = useRef(isControlled);\r\n\r\n // Warn against uncontrolled <-> controlled flips in development\r\n useEffect(() => {\r\n if (typeof process !== 'undefined' && process.env?.NODE_ENV !== 'production' && isControlledRef.current !== isControlled) {\r\n console.warn(\r\n `[${name || 'Component'}] is changing from ${\r\n isControlledRef.current ? 'controlled' : 'uncontrolled'\r\n } to ${isControlled ? 'controlled' : 'uncontrolled'}. Check the value/defaultValue props.`\r\n );\r\n }\r\n isControlledRef.current = isControlled;\r\n }, [isControlled, name]);\r\n\r\n const [internalState, setInternalState] = useState<T>(defaultValue as T);\r\n\r\n const value = isControlled ? (controlledValue as T) : internalState;\r\n\r\n const setValue = useCallback(\r\n (next: T | ((prev: T) => T)) => {\r\n const nextValue = typeof next === 'function' ? (next as (prev: T) => T)(value) : next;\r\n if (!isControlled) {\r\n setInternalState(nextValue);\r\n }\r\n onChange?.(nextValue);\r\n },\r\n [isControlled, value, onChange]\r\n );\r\n\r\n return [value, setValue, isControlled];\r\n}\r\n","import React, { useRef, useEffect, useState, useCallback } from 'react';\r\nimport { Portal } from './Portal';\r\nimport { cn } from '../utils/cn';\r\nimport { useControllableState } from '../utils/useControllableState';\r\n\r\nexport interface PopoverProps {\r\n trigger: React.ReactNode;\r\n children: React.ReactNode;\r\n open?: boolean;\r\n isOpen?: boolean; // Legacy alias\r\n defaultOpen?: boolean;\r\n onOpenChange?: (open: boolean) => void;\r\n onClose?: () => void;\r\n placement?: 'top' | 'bottom' | 'left' | 'right';\r\n className?: string;\r\n}\r\n\r\nexport const Popover = ({\r\n trigger,\r\n children,\r\n open: controlledOpen,\r\n isOpen: legacyIsOpen,\r\n defaultOpen = false,\r\n onOpenChange,\r\n onClose,\r\n placement = 'bottom',\r\n className,\r\n}: PopoverProps) => {\r\n // Resolve controlled open state with legacy support\r\n const activeControlled = controlledOpen !== undefined ? controlledOpen : legacyIsOpen;\r\n\r\n const handleStateChange = useCallback(\r\n (nextOpen: boolean) => {\r\n onOpenChange?.(nextOpen);\r\n if (!nextOpen) {\r\n onClose?.();\r\n }\r\n },\r\n [onOpenChange, onClose]\r\n );\r\n\r\n const [isOpen, setIsOpen] = useControllableState<boolean>({\r\n value: activeControlled,\r\n defaultValue: defaultOpen,\r\n onChange: handleStateChange,\r\n name: 'Popover',\r\n });\r\n\r\n const [coords, setCoords] = useState<{ top: number; left: number }>({ top: 0, left: 0 });\r\n const triggerRef = useRef<HTMLDivElement | null>(null);\r\n const popoverRef = useRef<HTMLDivElement | null>(null);\r\n\r\n const calculatePosition = useCallback(() => {\r\n if (triggerRef.current) {\r\n const rect = triggerRef.current.getBoundingClientRect();\r\n let top = 0;\r\n let left = 0;\r\n\r\n if (placement === 'bottom') {\r\n top = rect.bottom + window.scrollY + 8;\r\n left = rect.left + window.scrollX;\r\n } else if (placement === 'top') {\r\n top = rect.top + window.scrollY - 8;\r\n left = rect.left + window.scrollX;\r\n } else if (placement === 'right') {\r\n top = rect.top + window.scrollY;\r\n left = rect.right + window.scrollX + 8;\r\n } else if (placement === 'left') {\r\n top = rect.top + window.scrollY;\r\n left = rect.left + window.scrollX - 8;\r\n }\r\n\r\n setCoords({ top, left });\r\n }\r\n }, [placement]);\r\n\r\n const handleToggle = () => {\r\n if (!isOpen) {\r\n calculatePosition();\r\n }\r\n setIsOpen(!isOpen);\r\n };\r\n\r\n useEffect(() => {\r\n if (isOpen) {\r\n calculatePosition();\r\n }\r\n }, [isOpen, calculatePosition]);\r\n\r\n useEffect(() => {\r\n if (!isOpen) return;\r\n\r\n const handleOutside = (e: MouseEvent) => {\r\n if (\r\n popoverRef.current &&\r\n !popoverRef.current.contains(e.target as Node) &&\r\n triggerRef.current &&\r\n !triggerRef.current.contains(e.target as Node)\r\n ) {\r\n setIsOpen(false);\r\n }\r\n };\r\n\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape') {\r\n setIsOpen(false);\r\n }\r\n };\r\n\r\n document.addEventListener('mousedown', handleOutside);\r\n document.addEventListener('keydown', handleKeyDown);\r\n window.addEventListener('resize', calculatePosition);\r\n window.addEventListener('scroll', calculatePosition);\r\n\r\n return () => {\r\n document.removeEventListener('mousedown', handleOutside);\r\n document.removeEventListener('keydown', handleKeyDown);\r\n window.removeEventListener('resize', calculatePosition);\r\n window.removeEventListener('scroll', calculatePosition);\r\n };\r\n }, [isOpen, setIsOpen, calculatePosition]);\r\n\r\n return (\r\n <>\r\n <div\r\n ref={triggerRef}\r\n onClick={handleToggle}\r\n className=\"w-full inline-block cursor-pointer\"\r\n aria-expanded={isOpen}\r\n >\r\n {trigger}\r\n </div>\r\n\r\n {isOpen && (\r\n <Portal>\r\n <div\r\n ref={popoverRef}\r\n style={{\r\n top: `${coords.top}px`,\r\n left: `${coords.left}px`,\r\n position: 'absolute',\r\n }}\r\n className={cn(\r\n 'z-50 min-w-[12rem] rounded-[var(--ui-radius-lg)] bg-[var(--ui-bg-surface)] border border-[var(--ui-border-default)] p-4 text-[var(--ui-text-primary)] shadow-xl animate-in fade-in zoom-in-95',\r\n placement === 'top' && '-translate-y-full',\r\n placement === 'left' && '-translate-x-full',\r\n className\r\n )}\r\n >\r\n {children}\r\n </div>\r\n </Portal>\r\n )}\r\n </>\r\n );\r\n};\r\n"]}
|