@matthiaskrijgsman/mat-ui 0.0.42 → 0.0.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/util/classnames.util.ts","../src/spinner/Spinner.tsx","../src/control-size/control-size.util.ts","../src/components/button/Button.tsx","../src/components/button-icon-square/ButtonIconSquare.tsx","../src/components/button-icon-round/ButtonIconRound.tsx","../src/components/inputs/InputLabel.tsx","../src/components/inputs/InputErrorIcon.tsx","../src/control-size/use-control-size.ts","../src/components/inputs/InputIconButtonTray.tsx","../src/components/inputs/InputDescription.tsx","../src/components/inputs/InputError.tsx","../src/components/inputs/Input.tsx","../src/util/color.util.ts","../src/hooks/use-pointer-drag.ts","../src/components/dropdown-menu/DropdownPanel.tsx","../src/popover/PopoverBase.tsx","../src/popover/use-popover.tsx","../src/hooks/use-dismiss.ts","../src/components/inputs/InputColor.tsx","../src/components/inputs/InputIconButton.tsx","../src/components/inputs/InputPassword.tsx","../src/components/inputs/InputTextArea.tsx","../src/components/inputs/InputRadio.tsx","../src/components/inputs/InputToggle.tsx","../src/components/inputs/InputCheck.tsx","../src/components/inputs/input-file/InputFileSingle.tsx","../src/components/inputs/input-file/UploadFileTile.tsx","../src/components/inputs/input-file/InputFileMultiple.tsx","../src/components/inputs/input-lexical/lexical-theme.ts","../src/components/inputs/input-lexical/use-lexical-toolbar.ts","../src/components/dropdown-menu/use-dropdown-dismiss.ts","../src/components/dropdown-menu/DropdownMenu.tsx","../src/components/dropdown-menu/DropdownButton.tsx","../src/components/inputs/input-lexical/LexicalBlockTypeSelect.tsx","../src/components/inputs/input-lexical/LexicalToolbarButton.tsx","../src/components/inputs/input-lexical/LexicalFormatButtons.tsx","../src/components/inputs/input-lexical/LexicalListButtons.tsx","../src/components/inputs/input-lexical/LexicalLinkButton.tsx","../src/components/inputs/input-lexical/LexicalHistoryButtons.tsx","../src/components/inputs/input-lexical/LexicalToolbarDivider.tsx","../src/components/inputs/input-lexical/LexicalToolbarItems.tsx","../src/components/inputs/input-lexical/LexicalToolbar.tsx","../src/components/inputs/input-lexical/LexicalFloatingToolbar.tsx","../src/components/inputs/input-lexical/InputLexical.tsx","../src/components/inputs/InputSelectNative.tsx","../src/components/inputs/InputSelectOption.tsx","../src/components/inputs/InputSelectGroupHeader.tsx","../src/components/inputs/InputSelectDivider.tsx","../src/components/inputs/select-item.ts","../src/popover/use-select-popover.tsx","../src/components/inputs/InputSelect.tsx","../src/components/inputs/InputSelectSearchable.tsx","../src/hooks/use-debounce.ts","../src/components/inputs/InputSelectSearchableAsync.tsx","../src/components/BadgeColors.tsx","../src/components/Badge.tsx","../src/hooks/use-overflow-fit.ts","../src/components/inputs/InputSelectMultiple.tsx","../src/components/panel/Panel.tsx","../src/components/panel/PanelStack.tsx","../src/components/panel/PanelField.tsx","../src/components/panel/PanelLink.tsx","../src/components/Divider.tsx","../src/components/Tooltip.tsx","../src/components/Modal.tsx","../src/components/SidebarModal.tsx","../src/components/TabButtons.tsx","../src/components/AutoScroll.tsx","../src/hooks/use-drag-x.ts","../src/table/TableColumnHead.tsx","../src/table/Table.tsx","../src/table/TableEmpty.tsx","../src/components/dropdown-menu/DropdownButtonGroup.tsx","../src/components/ScrollbarTest.tsx","../src/components/Test.tsx"],"sourcesContent":["export const classNames = (...classes: any[]) => {\n return classes.filter(Boolean).join(' ')\n}","import { AnimatePresence, motion } from \"motion/react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\n\nexport type SpinnerProps = {\n speed?: number;\n className?: string;\n};\n\nconst clipKeyframes = [\n \"polygon(50% 50%,0 0,0 0,0 0,0 0,0 0)\",\n \"polygon(50% 50%,0 0,100% 0,100% 0,100% 0,100% 0)\",\n \"polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)\",\n \"polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)\",\n \"polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0)\",\n];\n\nexport const Spinner = (props: SpinnerProps) => {\n const {\n speed = 1,\n className\n } = props;\n\n const rotateDuration = 1 / speed;\n const clipDuration = 2 / speed;\n\n return (\n <AnimatePresence>\n <motion.div\n role={ 'status' }\n className={ classNames('relative rounded-full', className) }\n animate={ { rotate: 360 } }\n transition={ { repeat: Infinity, ease: 'linear', duration: rotateDuration } }\n >\n <motion.div\n className={ 'absolute inset-0 rounded-full' }\n style={ {\n boxSizing: 'border-box',\n borderStyle: 'solid',\n borderWidth: 2,\n } }\n animate={ { clipPath: clipKeyframes } }\n transition={ {\n repeat: Infinity,\n ease: 'linear',\n duration: clipDuration,\n times: [ 0, 0.25, 0.5, 0.75, 1 ],\n } }\n />\n </motion.div>\n </AnimatePresence>\n );\n}","export type ControlSize = 'sm' | 'md' | 'lg';\n\nexport const sizeHeightClasses: Record<ControlSize, string> = {\n sm: 'h-[var(--control-size-sm-height)]',\n md: 'h-[var(--control-size-md-height)]',\n lg: 'h-[var(--control-size-lg-height)]',\n};\n\nexport const sizeMinHeightClasses: Record<ControlSize, string> = {\n sm: 'min-h-[var(--control-size-sm-height)]',\n md: 'min-h-[var(--control-size-md-height)]',\n lg: 'min-h-[var(--control-size-lg-height)]',\n};\n\nexport const sizeFontClasses: Record<ControlSize, string> = {\n sm: 'text-[length:var(--control-size-sm-font-size)]',\n md: 'text-[length:var(--control-size-md-font-size)]',\n lg: 'text-[length:var(--control-size-lg-font-size)]',\n};\n\nexport const sizeGapClasses: Record<ControlSize, string> = {\n sm: 'gap-[var(--control-size-sm-gap)]',\n md: 'gap-[var(--control-size-md-gap)]',\n lg: 'gap-[var(--control-size-lg-gap)]',\n};\n\nexport const sizePaddingXClasses: Record<ControlSize, string> = {\n sm: 'px-[var(--control-size-sm-px)]',\n md: 'px-[var(--control-size-md-px)]',\n lg: 'px-[var(--control-size-lg-px)]',\n};\n\nexport const sizePaddingLeftClasses: Record<ControlSize, string> = {\n sm: 'pl-[var(--control-size-sm-px)]',\n md: 'pl-[var(--control-size-md-px)]',\n lg: 'pl-[var(--control-size-lg-px)]',\n};\n\nexport const sizePaddingRightClasses: Record<ControlSize, string> = {\n sm: 'pr-[var(--control-size-sm-px)]',\n md: 'pr-[var(--control-size-md-px)]',\n lg: 'pr-[var(--control-size-lg-px)]',\n};\n\n/* Right padding when an icon-button tray sits inside the input.\n * Layout reserves: base px + 24px (fixed icon button width) + 8px gap. */\nexport const sizePaddingRightWithTrayClasses: Record<ControlSize, string> = {\n sm: 'pr-[calc(var(--control-size-sm-px)+2rem)]',\n md: 'pr-[calc(var(--control-size-md-px)+2rem)]',\n lg: 'pr-[calc(var(--control-size-lg-px)+2rem)]',\n};\n\n/* Right padding when the icon-button tray holds two buttons.\n * Layout reserves: base px + 24px + 4px gap + 24px + 8px gap. */\nexport const sizePaddingRightWithTrayTwoClasses: Record<ControlSize, string> = {\n sm: 'pr-[calc(var(--control-size-sm-px)+3.75rem)]',\n md: 'pr-[calc(var(--control-size-md-px)+3.75rem)]',\n lg: 'pr-[calc(var(--control-size-lg-px)+3.75rem)]',\n};\n\n/* Left padding when an icon sits absolutely inside the input.\n * Layout reserves: icon-offset + icon size + 0.75rem gap. */\nexport const sizePaddingLeftWithIconClasses: Record<ControlSize, string> = {\n sm: 'pl-[calc(var(--control-size-sm-icon-offset)+var(--control-size-sm-icon)+0.75rem)]',\n md: 'pl-[calc(var(--control-size-md-icon-offset)+var(--control-size-md-icon)+0.75rem)]',\n lg: 'pl-[calc(var(--control-size-lg-icon-offset)+var(--control-size-lg-icon)+0.75rem)]',\n};\n\n/* Absolute left position of a leading icon, using the dedicated icon-offset\n * token (tighter than the input's overall px). */\nexport const sizeIconLeftPositionClasses: Record<ControlSize, string> = {\n sm: 'left-[var(--control-size-sm-icon-offset)]',\n md: 'left-[var(--control-size-md-icon-offset)]',\n lg: 'left-[var(--control-size-lg-icon-offset)]',\n};\n\n/* Absolute right position of an icon-button tray, aligned with the input's px. */\nexport const sizeTrayRightPositionClasses: Record<ControlSize, string> = {\n sm: 'right-[var(--control-size-sm-px)]',\n md: 'right-[var(--control-size-md-px)]',\n lg: 'right-[var(--control-size-lg-px)]',\n};\n\n/* Glyph sizing for icons that should scale with the control. */\nexport const sizeIconClasses: Record<ControlSize, string> = {\n sm: 'h-[var(--control-size-sm-icon)] w-[var(--control-size-sm-icon)]',\n md: 'h-[var(--control-size-md-icon)] w-[var(--control-size-md-icon)]',\n lg: 'h-[var(--control-size-lg-icon)] w-[var(--control-size-lg-icon)]',\n};\n\n/* Square/round icon-button: width = height. */\nexport const sizeSquareClasses: Record<ControlSize, string> = {\n sm: 'h-[var(--control-size-sm-height)] w-[var(--control-size-sm-height)]',\n md: 'h-[var(--control-size-md-height)] w-[var(--control-size-md-height)]',\n lg: 'h-[var(--control-size-lg-height)] w-[var(--control-size-lg-height)]',\n};\n","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { Spinner } from \"@/spinner/Spinner.tsx\";\nimport type { TablerIcon } from \"@tabler/icons-react\";\nimport {\n sizeFontClasses,\n sizeGapClasses,\n sizeHeightClasses,\n sizeIconClasses,\n sizePaddingXClasses,\n} from \"@/control-size/control-size.util.ts\";\n\nexport type Variant = 'primary' | 'secondary' | 'tertiary' | 'white' | 'black' | 'transparent';\nexport type Size = 'sm' | 'md' | 'lg';\n\nexport type ButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {\n variant?: Variant;\n size?: Size;\n loading?: boolean;\n children?: React.ReactNode;\n Icon?: TablerIcon;\n IconRight?: TablerIcon;\n}\n\nconst base: string = `\n inline-flex flex-row items-center justify-center\n button-ring font-[number:var(--font-weight-button)] font-[family-name:var(--font-family-base)] ring-0 disabled:hover:ring-0 hover:ring-[length:var(--control-ring-width)] active:ring-[length:var(--control-ring-width-active)]\n rounded-[var(--border-radius-button)]\n cursor-pointer transition-all duration-[var(--control-transition-duration)] select-none focus:outline-none focus:ring-[length:var(--control-ring-width)]\n disabled:cursor-default\n `;\n\nconst variantClasses: Record<Variant, string> = {\n primary: 'border-[length:var(--border-width-input)] button-primary shadow-[var(--shadow-control)]',\n secondary: 'border-[length:var(--border-width-input)] button-secondary shadow-[var(--shadow-control)]',\n tertiary: 'border-[length:var(--border-width-input)] button-tertiary',\n white: 'border-[length:var(--border-width-input)] button-white shadow-[var(--shadow-control)]',\n black: 'border-[length:var(--border-width-input)] button-black shadow-[var(--shadow-control)]',\n transparent: 'border-[length:var(--border-width-input)] button-transparent'\n}\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>((props, ref) => {\n\n const {\n variant = 'white',\n size = 'md',\n className,\n children,\n loading = false,\n Icon,\n IconRight,\n ...rest\n } = props;\n\n return (\n <button\n ref={ ref }\n className={ classNames(\n base,\n variantClasses[variant],\n sizeHeightClasses[size],\n sizePaddingXClasses[size],\n sizeFontClasses[size],\n sizeGapClasses[size],\n className\n ) }\n { ...rest }\n >\n { loading && <Spinner className={ classNames(sizeIconClasses[size]) } /> }\n { !loading && (<>\n { Icon && <Icon className={ classNames(sizeIconClasses[size], '-ml-1') }/> }\n { children }\n { IconRight && <IconRight className={ classNames(sizeIconClasses[size], '-mr-1') }/> }\n </>) }\n </button>\n );\n});\n","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport type { TablerIcon } from '@tabler/icons-react';\nimport { sizeIconClasses, sizeSquareClasses } from \"@/control-size/control-size.util.ts\";\n\nexport type Variant = 'primary' | 'secondary' | 'tertiary' | 'white' | 'black' | 'transparent';\nexport type Size = 'sm' | 'md' | 'lg';\n\nexport type ButtonIconSquareProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {\n variant?: Variant;\n size?: Size;\n loading?: boolean;\n Icon: TablerIcon;\n}\n\nconst base: string = `\n inline-flex flex-row items-center justify-center\n button-ring font-[number:var(--font-weight-button)] font-[family-name:var(--font-family-base)] ring-0 disabled:hover:ring-0 hover:ring-[length:var(--control-ring-width)] active:ring-[length:var(--control-ring-width-active)]\n rounded-[var(--border-radius-button)]\n cursor-pointer transition-all duration-[var(--control-transition-duration)] select-none focus:outline-none focus:ring-[length:var(--control-ring-width)]\n disabled:cursor-default\n`;\n\nconst variantClasses: Record<Variant, string> = {\n primary: 'border-[length:var(--border-width-input)] button-primary shadow-[var(--shadow-control)]',\n secondary: 'border-[length:var(--border-width-input)] button-secondary shadow-[var(--shadow-control)]',\n tertiary: 'border-[length:var(--border-width-input)] button-tertiary',\n white: 'border-[length:var(--border-width-input)] button-white shadow-[var(--shadow-control)]',\n black: 'border-[length:var(--border-width-input)] button-black shadow-[var(--shadow-control)]',\n transparent: 'border-[length:var(--border-width-input)] button-transparent'\n}\n\nexport const ButtonIconSquare = React.forwardRef<HTMLButtonElement, ButtonIconSquareProps>((props, ref) => {\n\n const {\n variant = 'white',\n size = 'md',\n className,\n Icon,\n ...rest\n } = props;\n\n return (\n <button\n ref={ ref }\n className={ classNames(\n base,\n variantClasses[variant],\n sizeSquareClasses[size],\n className\n ) }\n { ...rest }\n >\n { <Icon className={ sizeIconClasses[size] } /> }\n </button>\n );\n});\n","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport type { TablerIcon } from '@tabler/icons-react';\nimport { sizeIconClasses, sizeSquareClasses } from \"@/control-size/control-size.util.ts\";\n\nexport type Variant = 'primary' | 'secondary' | 'tertiary' | 'white' | 'black' | 'transparent';\nexport type Size = 'sm' | 'md' | 'lg';\n\nexport type ButtonIconRoundProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {\n variant?: Variant;\n size?: Size;\n loading?: boolean;\n Icon: TablerIcon;\n}\n\nconst base: string = `\n inline-flex flex-row items-center justify-center\n button-ring font-[number:var(--font-weight-button)] font-[family-name:var(--font-family-base)] ring-0 disabled:hover:ring-0 hover:ring-[length:var(--control-ring-width)] active:ring-[length:var(--control-ring-width-active)] rounded-full cursor-pointer transition-all duration-[var(--control-transition-duration)] select-none focus:outline-none focus:ring-[length:var(--control-ring-width)]\n disabled:cursor-default\n`;\n\nconst variantClasses: Record<Variant, string> = {\n primary: 'border-[length:var(--border-width-input)] button-primary shadow-[var(--shadow-control)]',\n secondary: 'border-[length:var(--border-width-input)] button-secondary shadow-[var(--shadow-control)]',\n tertiary: 'border-[length:var(--border-width-input)] button-tertiary',\n white: 'border-[length:var(--border-width-input)] button-white shadow-[var(--shadow-control)]',\n black: 'border-[length:var(--border-width-input)] button-black shadow-[var(--shadow-control)]',\n transparent: 'border-[length:var(--border-width-input)] button-transparent'\n}\n\nexport const ButtonIconRound = React.forwardRef<HTMLButtonElement, ButtonIconRoundProps>((props, ref) => {\n\n const {\n variant = 'white',\n size = 'md',\n className,\n Icon,\n ...rest\n } = props;\n\n return (\n <button\n ref={ ref }\n className={ classNames(\n base,\n variantClasses[variant],\n sizeSquareClasses[size],\n className\n ) }\n { ...rest }\n >\n { <Icon className={ sizeIconClasses[size] } /> }\n </button>\n );\n});\n","import * as React from \"react\";\n\nexport type InputLabelProps = {\n children?: React.ReactNode;\n}\n\nexport const InputLabel = (props: InputLabelProps) => {\n const {\n children\n } = props;\n\n if (!children) {\n return null;\n }\n\n return (\n <label className={ 'input-label font-[number:var(--font-weight-input-label)] mb-1' }>{ children }</label>\n );\n};","import { IconExclamationCircleFilled } from \"@tabler/icons-react\";\n\nexport const InputErrorIcon = () => {\n return (\n <div className={ 'h-5 w-5' }>\n <IconExclamationCircleFilled className={ 'h-5 w-5 input-error-icon' }/>\n </div>\n );\n};","import { createContext, useContext } from \"react\";\nimport type { ControlSize } from \"@/control-size/control-size.util.ts\";\n\nexport const ControlSizeContext = createContext<ControlSize>('md');\n\nexport const useControlSize = (): ControlSize => useContext(ControlSizeContext);\n","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { useControlSize } from \"@/control-size/use-control-size.ts\";\nimport { sizeTrayRightPositionClasses } from \"@/control-size/control-size.util.ts\";\n\nexport type InputIconButtonTrayProps = {\n children?: React.ReactNode;\n className?: string;\n}\n\nexport const InputIconButtonTray = React.forwardRef<HTMLDivElement, InputIconButtonTrayProps>((props, ref) => {\n const {\n children,\n className\n } = props;\n const size = useControlSize();\n return (\n <div\n ref={ ref }\n className={ classNames(\n 'absolute top-1/2 -translate-y-1/2 flex flex-row items-center gap-1 pointer-events-none',\n sizeTrayRightPositionClasses[size],\n className\n ) }>\n { children }\n </div>\n );\n});\n","import * as React from \"react\";\n\nexport type InputDescriptionProps = {\n children?: React.ReactNode;\n}\n\nexport const InputDescription = (props: InputDescriptionProps) => {\n const {\n children\n } = props;\n\n if (!children) {\n return null;\n }\n\n return (\n <div className={ 'input-description text-[length:var(--font-size-description)] font-[number:var(--font-weight-input-description)] mt-2' }>{ children }</div>\n );\n};","import * as React from \"react\";\n\nexport type InputErrorProps = {\n children?: React.ReactNode;\n}\n\nexport const InputError = (props: InputErrorProps) => {\n const {\n children\n } = props;\n\n if (!children) {\n return null;\n }\n\n return (\n <div className={ 'input-error-text text-[length:var(--font-size-error)] font-[number:var(--font-weight-input-error)] mt-2' }>{ children }</div>\n );\n};","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { type TablerIcon } from \"@tabler/icons-react\";\nimport { InputLabel } from \"@/components/inputs/InputLabel.tsx\";\nimport { InputErrorIcon } from \"@/components/inputs/InputErrorIcon.tsx\";\nimport { InputIconButtonTray } from \"@/components/inputs/InputIconButtonTray.tsx\";\nimport { InputDescription } from \"@/components/inputs/InputDescription.tsx\";\nimport { InputError } from \"@/components/inputs/InputError.tsx\";\nimport { ControlSizeContext } from \"@/control-size/use-control-size.ts\";\nimport {\n sizeFontClasses,\n sizeHeightClasses,\n sizeIconClasses,\n sizeIconLeftPositionClasses,\n sizePaddingLeftClasses,\n sizePaddingLeftWithIconClasses,\n sizePaddingRightClasses,\n sizePaddingRightWithTrayClasses,\n} from \"@/control-size/control-size.util.ts\";\n\n\nexport type Size = 'sm' | 'md' | 'lg';\n\nexport type InputProps = Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> & {\n label?: string | React.ReactNode;\n description?: string | React.ReactNode;\n error?: string | React.ReactNode;\n Icon?: TablerIcon;\n buttonTray?: React.ReactNode;\n size?: Size;\n}\n\n\nexport const Input = (props: InputProps) => {\n\n const {\n className,\n label,\n description,\n Icon,\n error,\n buttonTray,\n size = 'md',\n ...rest\n } = props;\n\n const hasTray = !!error || !!buttonTray;\n\n //TODO: set htmlfor on label if id is provided in props\n\n return (\n <ControlSizeContext.Provider value={ size }>\n <div\n className={ classNames(\n 'flex flex-col',\n className\n ) }>\n <InputLabel>{ label }</InputLabel>\n <div className={ 'flex flex-col relative' }>\n { Icon && (\n <Icon className={ classNames(\n 'input-icon absolute top-1/2 -translate-y-1/2',\n sizeIconClasses[size],\n sizeIconLeftPositionClasses[size],\n ) }/>\n ) }\n <input\n className={ classNames(\n 'border-[length:var(--border-width-input)] input-base transition-all duration-[var(--control-transition-duration)] rounded-[var(--border-radius-input)] shadow-[var(--shadow-control)] ring-0 focus:ring-[length:var(--control-ring-width)] focus:outline-none font-[number:var(--font-weight-input-text)] font-[family-name:var(--font-family-base)]',\n sizeHeightClasses[size],\n sizeFontClasses[size],\n Icon ? sizePaddingLeftWithIconClasses[size] : sizePaddingLeftClasses[size],\n hasTray ? sizePaddingRightWithTrayClasses[size] : sizePaddingRightClasses[size],\n error && 'input-error',\n ) }\n { ...rest }\n />\n <InputIconButtonTray>\n { error && (\n <InputErrorIcon/>\n ) }\n { buttonTray }\n </InputIconButtonTray>\n </div>\n <InputDescription>{ description }</InputDescription>\n <InputError>{ error }</InputError>\n </div>\n </ControlSizeContext.Provider>\n );\n};\n","export type HSV = [number, number, number];\n\nexport const hexToRgb = (hex: string): [number, number, number] | null => {\n const m = hex.match(/^#?([0-9a-fA-F]{6})$/);\n if (!m) return null;\n const n = parseInt(m[1], 16);\n return [((n >> 16) & 0xff) / 255, ((n >> 8) & 0xff) / 255, (n & 0xff) / 255];\n};\n\nexport const rgbToHex = (r: number, g: number, b: number): string => {\n const c = (v: number) => Math.round(v * 255).toString(16).padStart(2, '0').toUpperCase();\n return '#' + c(r) + c(g) + c(b);\n};\n\nexport const rgbToHsv = (r: number, g: number, b: number): HSV => {\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const d = max - min;\n let h = 0;\n if (d !== 0) {\n if (max === r) h = ((g - b) / d + 6) % 6;\n else if (max === g) h = (b - r) / d + 2;\n else h = (r - g) / d + 4;\n h *= 60;\n }\n return [h, max === 0 ? 0 : d / max, max];\n};\n\nexport const hsvToRgb = (h: number, s: number, v: number): [number, number, number] => {\n const c = v * s;\n const hh = h / 60;\n const x = c * (1 - Math.abs((hh % 2) - 1));\n let r = 0, g = 0, b = 0;\n if (hh < 1) { r = c; g = x; }\n else if (hh < 2) { r = x; g = c; }\n else if (hh < 3) { g = c; b = x; }\n else if (hh < 4) { g = x; b = c; }\n else if (hh < 5) { r = x; b = c; }\n else { r = c; b = x; }\n const m = v - c;\n return [r + m, g + m, b + m];\n};\n\nexport const hsvToHex = (h: number, s: number, v: number): string => {\n const [r, g, b] = hsvToRgb(h, s, v);\n return rgbToHex(r, g, b);\n};\n\nexport const hexToHsv = (hex: string): HSV | null => {\n const rgb = hexToRgb(hex);\n if (!rgb) return null;\n return rgbToHsv(rgb[0], rgb[1], rgb[2]);\n};\n\n// Normalizes hex shorthand and named/rgb() colors to canonical #RRGGBB uppercase.\n// Returns null when the input can't be resolved to a color.\nexport const formatHex = (input: string): string | null => {\n const trimmed = input.trim();\n if (!trimmed) return null;\n\n const hexMatch = trimmed.match(/^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/);\n if (hexMatch) {\n let hex = hexMatch[1];\n if (hex.length === 3) hex = hex.split('').map(c => c + c).join('');\n return '#' + hex.toUpperCase();\n }\n\n if (typeof document === 'undefined') return null;\n const probe = document.createElement('div');\n probe.style.color = trimmed;\n if (!probe.style.color) return null;\n document.body.appendChild(probe);\n const computed = getComputedStyle(probe).color;\n document.body.removeChild(probe);\n\n const rgb = computed.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/);\n if (!rgb) return null;\n return '#' + [rgb[1], rgb[2], rgb[3]]\n .map(n => parseInt(n, 10).toString(16).padStart(2, '0'))\n .join('')\n .toUpperCase();\n};\n","import * as React from \"react\";\n\n// Captures the element's rect on pointer-down so subsequent moves can compute\n// ratios without forcing layout each frame. Uses pointer capture so events\n// continue routing to the source element even when the pointer leaves it.\nexport const usePointerDrag = (\n onPosition: (clientX: number, clientY: number, rect: DOMRect) => void,\n) => {\n const rectRef = React.useRef<DOMRect | null>(null);\n const [isDragging, setIsDragging] = React.useState(false);\n\n const release = (e: React.PointerEvent) => {\n rectRef.current = null;\n setIsDragging(false);\n (e.currentTarget as HTMLElement).releasePointerCapture?.(e.pointerId);\n };\n\n return {\n isDragging,\n bind: {\n onPointerDown: (e: React.PointerEvent) => {\n const el = e.currentTarget as HTMLElement;\n rectRef.current = el.getBoundingClientRect();\n el.setPointerCapture?.(e.pointerId);\n setIsDragging(true);\n onPosition(e.clientX, e.clientY, rectRef.current);\n },\n onPointerMove: (e: React.PointerEvent) => {\n if (rectRef.current) onPosition(e.clientX, e.clientY, rectRef.current);\n },\n onPointerUp: release,\n onPointerCancel: release,\n },\n };\n};\n","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport type { Size } from \"@/components/button/Button.tsx\";\n\nexport type DropdownPanelProps = React.HTMLProps<HTMLDivElement> & {\n children?: React.ReactNode;\n className?: string;\n padding?: Size;\n}\n\nconst baseClassName: string = 'flex flex-col dropdown-panel border-[length:var(--border-width-input)] mt-1 rounded-[var(--border-radius-dropdown)] shadow-[var(--shadow-dropdown)] overflow-y-auto relative space-y-1';\n\nconst paddingClasses: Record<Size, string> = {\n sm: 'p-2',\n md: 'p-3',\n lg: 'p-4'\n}\n\nexport const DropdownPanel = (props: DropdownPanelProps) => {\n const {\n className,\n children,\n padding = 'md',\n ...rest\n } = props;\n return (\n <div\n className={ classNames(baseClassName, paddingClasses[padding], className) }\n { ...rest }\n >\n { children }\n </div>\n );\n};","import * as React from \"react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { FloatingPortal, type Placement } from \"@floating-ui/react\";\nimport type { PopoverBaseRefProps, PopoverRendererProps } from \"@/popover/use-popover.tsx\";\n\nconst placementOriginMap: Record<Placement, string> = {\n 'top': 'bottom center',\n 'top-start': 'bottom left',\n 'top-end': 'bottom right',\n 'right': 'left center',\n 'right-start': 'top left',\n 'right-end': 'bottom left',\n 'bottom': 'top center',\n 'bottom-start': 'top left',\n 'bottom-end': 'top right',\n 'left': 'right center',\n 'left-start': 'top right',\n 'left-end': 'bottom right',\n};\n\nexport type PopoverBaseProps = PopoverRendererProps & PopoverBaseRefProps & {\n floatingProps?: React.HTMLProps<HTMLDivElement>;\n};\n\nexport const PopoverBase: React.FC<PopoverBaseProps> = React.memo(\n ({ open, children, className, floatingStyles, setFloating, placement, floatingProps }) => {\n return (\n <FloatingPortal>\n <AnimatePresence>\n { open && (\n <div ref={ setFloating } style={ floatingStyles } className={ 'z-50' } { ...floatingProps }>\n <motion.div\n className={ className }\n style={ { transformOrigin: placementOriginMap[placement] } }\n initial={ { opacity: 0, scale: 0.95 } }\n animate={ { opacity: 1, scale: 1 } }\n exit={ { opacity: 0, scale: 0.95 } }\n transition={ { duration: 0.1, ease: \"easeInOut\" } }\n >\n { children }\n </motion.div>\n </div>\n ) }\n </AnimatePresence>\n </FloatingPortal>\n );\n }\n);\n\n","import * as React from \"react\";\nimport { autoUpdate, flip, type Placement, shift, size, useDismiss, useFloating, useInteractions } from \"@floating-ui/react\";\nimport { PopoverBase } from \"@/popover/PopoverBase.tsx\";\n\n\nexport type UsePopoverProps = {\n placement?: Placement;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n fullWidth?: boolean;\n minWidth?: number;\n maxWidth?: number;\n};\n\nexport type PopoverRendererProps = {\n open: boolean;\n children: React.ReactNode;\n className?: string\n}\n\nexport type PopoverBaseRefProps = {\n floatingStyles: React.CSSProperties;\n setFloating: React.RefCallback<HTMLDivElement>;\n placement: Placement;\n}\n\ntype PopoverLatestProps = PopoverBaseRefProps & {\n getFloatingProps: (userProps?: React.HTMLProps<HTMLElement>) => Record<string, unknown>;\n}\n\nexport type UsePopoverResult = {\n anchorRef: React.RefCallback<HTMLDivElement | null>;\n Popover: React.ComponentType<PopoverRendererProps>;\n}\n\nexport const usePopover = (props: UsePopoverProps): UsePopoverResult => {\n const { placement = \"bottom\", open, onOpenChange, fullWidth, minWidth, maxWidth } = props;\n\n const middleware = React.useMemo(() => {\n return [\n flip({ padding: 8 }),\n shift({ padding: 8 }),\n size({\n apply({ rects, elements }) {\n if (fullWidth) {\n elements.floating.style.width = `${ rects.reference.width }px`;\n }\n if (minWidth) {\n elements.floating.style.minWidth = `${ minWidth }px`;\n }\n if (maxWidth) {\n elements.floating.style.maxWidth = `${ maxWidth }px`;\n }\n },\n })\n ];\n }, [fullWidth, maxWidth, minWidth]);\n\n const { refs, floatingStyles, context, placement: resolvedPlacement } = useFloating({\n placement,\n open,\n onOpenChange,\n middleware,\n whileElementsMounted: autoUpdate,\n });\n\n const dismiss = useDismiss(context, {\n enabled: !!onOpenChange,\n outsidePress: true,\n escapeKey: false,\n });\n\n const { getFloatingProps } = useInteractions([dismiss]);\n\n const latest = React.useRef<PopoverLatestProps>({\n floatingStyles,\n setFloating: refs.setFloating,\n placement,\n getFloatingProps,\n });\n latest.current = {\n floatingStyles,\n setFloating: refs.setFloating,\n placement: resolvedPlacement,\n getFloatingProps,\n };\n\n const Popover = React.useMemo<React.ComponentType<PopoverRendererProps>>(() => {\n const Renderer = (rendererProps: PopoverRendererProps) => {\n const { floatingStyles, setFloating, placement, getFloatingProps } = latest.current;\n const { className, open, children } = rendererProps;\n return (\n <PopoverBase\n open={ open }\n className={ className }\n floatingStyles={ floatingStyles }\n setFloating={ setFloating }\n placement={ placement }\n floatingProps={ getFloatingProps() as React.HTMLProps<HTMLDivElement> }\n >\n { children }\n </PopoverBase>\n );\n };\n return React.memo(Renderer);\n }, []);\n\n return {\n anchorRef: refs.setReference,\n Popover: Popover,\n };\n};\n","import { useEffect } from \"react\";\n\nexport const useDismiss = (active: boolean, onDismiss: () => void) => {\n useEffect(() => {\n if (!active) return;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n onDismiss();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [active, onDismiss]);\n}","import * as React from \"react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { motion } from \"motion/react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { formatHex, hexToHsv, hsvToHex, type HSV } from \"@/util/color.util.ts\";\nimport { usePointerDrag } from \"@/hooks/use-pointer-drag.ts\";\nimport { InputLabel } from \"@/components/inputs/InputLabel.tsx\";\nimport { InputErrorIcon } from \"@/components/inputs/InputErrorIcon.tsx\";\nimport { InputIconButtonTray } from \"@/components/inputs/InputIconButtonTray.tsx\";\nimport { InputDescription } from \"@/components/inputs/InputDescription.tsx\";\nimport { InputError } from \"@/components/inputs/InputError.tsx\";\nimport { DropdownPanel } from \"@/components/dropdown-menu/DropdownPanel.tsx\";\nimport { usePopover } from \"@/popover/use-popover.tsx\";\nimport { useDismiss } from \"@/hooks/use-dismiss.ts\";\nimport { ControlSizeContext } from \"@/control-size/use-control-size.ts\";\nimport {\n sizeFontClasses,\n sizeHeightClasses,\n sizeIconClasses,\n sizeIconLeftPositionClasses,\n sizePaddingLeftWithIconClasses,\n sizePaddingRightClasses,\n sizePaddingRightWithTrayClasses,\n} from \"@/control-size/control-size.util.ts\";\n\n\nexport type Size = 'sm' | 'md' | 'lg';\n\nexport type InputColorProps = Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> & {\n label?: string | React.ReactNode;\n description?: string | React.ReactNode;\n error?: string | React.ReactNode;\n buttonTray?: React.ReactNode;\n size?: Size;\n}\n\n\nconst HUE_GRADIENT = 'linear-gradient(to right, #f00 0%, #ff0 16.66%, #0f0 33.33%, #0ff 50%, #00f 66.66%, #f0f 83.33%, #f00 100%)';\nconst SV_SATURATION_GRADIENT = 'linear-gradient(to right, #fff, rgba(255,255,255,0))';\nconst SV_VALUE_GRADIENT = 'linear-gradient(to top, #000, rgba(0,0,0,0))';\nconst THUMB_SHADOW = '0 0 0 1px rgba(0,0,0,0.15)';\nconst THUMB_SIZE = 14;\nconst THUMB_SIZE_ACTIVE = 28;\nconst THUMB_RADIUS = 6;\nconst THUMB_RADIUS_ACTIVE = 8;\nconst THUMB_SPRING = { type: 'spring', stiffness: 500, damping: 18, mass: 0.6 } as const;\n\nconst thumbAnimate = (active: boolean) => {\n const size = active ? THUMB_SIZE_ACTIVE : THUMB_SIZE;\n const half = size / 2;\n return {\n width: size,\n height: size,\n marginLeft: -half,\n marginTop: -half,\n borderRadius: active ? THUMB_RADIUS_ACTIVE : THUMB_RADIUS,\n };\n};\n\nconst clamp01 = (n: number) => Math.max(0, Math.min(1, n));\n\nconst setInputValueAndNotify = (input: HTMLInputElement, value: string) => {\n const setter = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value')?.set;\n setter?.call(input, value);\n input.dispatchEvent(new Event('input', { bubbles: true }));\n};\n\n\ntype ColorPickerProps = {\n value: string;\n onChange: (hex: string) => void;\n};\n\nconst ColorPicker = ({ value, onChange }: ColorPickerProps) => {\n const [hsv, setHsv] = useState<HSV>(() => hexToHsv(value) ?? [0, 0, 1]);\n const lastEmittedRef = useRef<string>(hsvToHex(hsv[0], hsv[1], hsv[2]));\n\n useEffect(() => {\n if ((value || '').toUpperCase() === lastEmittedRef.current) return;\n const parsed = hexToHsv(value);\n if (parsed) setHsv(parsed);\n }, [value]);\n\n const updateHsv = (next: HSV) => {\n setHsv(next);\n const hex = hsvToHex(next[0], next[1], next[2]);\n lastEmittedRef.current = hex;\n onChange(hex);\n };\n\n const [h, s, v] = hsv;\n const hueOnly = hsvToHex(h, 1, 1);\n const brightnessMax = hsvToHex(h, s, 1);\n const currentColor = hsvToHex(h, s, v);\n\n const svDrag = usePointerDrag((cx, cy, rect) => {\n updateHsv([h, clamp01((cx - rect.left) / rect.width), 1 - clamp01((cy - rect.top) / rect.height)]);\n });\n const hueDrag = usePointerDrag((cx, _cy, rect) => {\n updateHsv([clamp01((cx - rect.left) / rect.width) * 360, s, v]);\n });\n const brightnessDrag = usePointerDrag((cx, _cy, rect) => {\n updateHsv([h, s, clamp01((cx - rect.left) / rect.width)]);\n });\n\n return (\n <div\n className={ 'flex flex-col gap-3' }\n style={ { width: 220, userSelect: 'none' } }\n onMouseDown={ (e) => e.preventDefault() }\n >\n <div\n className={ 'relative w-full' }\n style={ {\n height: 160,\n touchAction: 'none',\n cursor: 'crosshair',\n } }\n { ...svDrag.bind }\n >\n <div\n className={ 'absolute inset-0 rounded-[var(--border-radius-control-inner)] overflow-hidden border-[length:var(--border-width-input)] color-picker-surface' }\n style={ { backgroundColor: hueOnly } }\n >\n <div\n className={ 'absolute inset-0 pointer-events-none' }\n style={ { background: SV_SATURATION_GRADIENT } }\n />\n <div\n className={ 'absolute inset-0 pointer-events-none' }\n style={ { background: SV_VALUE_GRADIENT } }\n />\n </div>\n <motion.div\n className={ 'absolute pointer-events-none border-1 border-white' }\n style={ {\n left: `${ s * 100 }%`,\n top: `${ (1 - v) * 100 }%`,\n boxShadow: THUMB_SHADOW,\n backgroundColor: currentColor,\n } }\n initial={ thumbAnimate(false) }\n animate={ thumbAnimate(svDrag.isDragging) }\n transition={ THUMB_SPRING }\n />\n </div>\n\n <div\n className={ 'relative w-full rounded-[var(--border-radius-control-inner)]' }\n style={ {\n height: 12,\n background: HUE_GRADIENT,\n touchAction: 'none',\n cursor: 'ew-resize',\n } }\n { ...hueDrag.bind }\n >\n <motion.div\n className={ 'absolute pointer-events-none border-1 border-white' }\n style={ {\n top: '50%',\n left: `${ (h / 360) * 100 }%`,\n backgroundColor: hueOnly,\n boxShadow: THUMB_SHADOW,\n } }\n initial={ thumbAnimate(false) }\n animate={ thumbAnimate(hueDrag.isDragging) }\n transition={ THUMB_SPRING }\n />\n </div>\n\n <div\n className={ 'relative w-full rounded-[var(--border-radius-control-inner)]' }\n style={ {\n height: 12,\n background: `linear-gradient(to right, #000, ${ brightnessMax })`,\n touchAction: 'none',\n cursor: 'ew-resize',\n } }\n { ...brightnessDrag.bind }\n >\n <motion.div\n className={ 'absolute pointer-events-none border-1 border-white' }\n style={ {\n top: '50%',\n left: `${ v * 100 }%`,\n backgroundColor: currentColor,\n boxShadow: THUMB_SHADOW,\n } }\n initial={ thumbAnimate(false) }\n animate={ thumbAnimate(brightnessDrag.isDragging) }\n transition={ THUMB_SPRING }\n />\n </div>\n </div>\n );\n};\n\n\nexport const InputColor = (props: InputColorProps) => {\n\n const {\n className,\n label,\n description,\n error,\n buttonTray,\n size = 'md',\n value,\n defaultValue,\n onChange,\n onBlur,\n onFocus,\n ...rest\n } = props;\n\n const [internalValue, setInternalValue] = useState<string>(\n value != null ? String(value) : defaultValue != null ? String(defaultValue) : ''\n );\n const [open, setOpen] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const currentValue = value != null ? String(value) : internalValue;\n const swatchColor = currentValue || 'white';\n\n useDismiss(open, () => setOpen(false));\n\n const { anchorRef, Popover } = usePopover({\n placement: 'bottom-start',\n open,\n onOpenChange: setOpen,\n });\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n setInternalValue(event.target.value);\n onChange?.(event);\n };\n\n const handleFocus = (event: React.FocusEvent<HTMLInputElement>) => {\n setOpen(true);\n onFocus?.(event);\n };\n\n const handleBlur = (event: React.FocusEvent<HTMLInputElement>) => {\n const raw = event.target.value;\n const formatted = formatHex(raw);\n if (formatted && formatted !== raw && inputRef.current) {\n setInputValueAndNotify(inputRef.current, formatted);\n }\n setOpen(false);\n onBlur?.(event);\n };\n\n const handlePickerChange = (hex: string) => {\n if (inputRef.current) setInputValueAndNotify(inputRef.current, hex);\n };\n\n const hasTray = !!error || !!buttonTray;\n\n return (\n <ControlSizeContext.Provider value={ size }>\n <div\n className={ classNames(\n 'flex flex-col',\n className\n ) }>\n <InputLabel>{ label }</InputLabel>\n <div className={ 'flex flex-col relative' } ref={ anchorRef }>\n <div\n className={ classNames(\n 'absolute top-1/2 -translate-y-1/2 rounded-[var(--border-radius-control-inner)] border-[length:var(--border-width-input)] color-swatch',\n sizeIconClasses[size],\n sizeIconLeftPositionClasses[size],\n ) }\n style={ { backgroundColor: swatchColor } }\n />\n <input\n ref={ inputRef }\n className={ classNames(\n 'border-[length:var(--border-width-input)] input-base transition-all duration-[var(--control-transition-duration)] rounded-[var(--border-radius-input)] shadow-[var(--shadow-control)] ring-0 focus:ring-[length:var(--control-ring-width)] focus:outline-none font-[number:var(--font-weight-input-text)] font-[family-name:var(--font-family-base)]',\n sizeHeightClasses[size],\n sizeFontClasses[size],\n sizePaddingLeftWithIconClasses[size],\n hasTray ? sizePaddingRightWithTrayClasses[size] : sizePaddingRightClasses[size],\n error && 'input-error',\n ) }\n value={ value != null ? value : internalValue }\n onChange={ handleChange }\n onFocus={ handleFocus }\n onBlur={ handleBlur }\n onClick={ () => setOpen(true) }\n { ...rest }\n />\n <InputIconButtonTray>\n { error && (\n <InputErrorIcon/>\n ) }\n { buttonTray }\n </InputIconButtonTray>\n <Popover open={ open }>\n <DropdownPanel padding={ 'md' }>\n <ColorPicker value={ currentValue } onChange={ handlePickerChange }/>\n </DropdownPanel>\n </Popover>\n </div>\n <InputDescription>{ description }</InputDescription>\n <InputError>{ error }</InputError>\n </div>\n </ControlSizeContext.Provider>\n );\n};\n","import { type TablerIcon } from \"@tabler/icons-react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\n\nexport type InputIconButtonProps = {\n onClick?: () => void;\n Icon: TablerIcon\n}\n\nexport const InputIconButton = (props: InputIconButtonProps) => {\n const {\n onClick,\n Icon\n } = props;\n return (\n <div\n onClick={ onClick }\n className={ classNames(\n 'h-6 w-6 select-none rounded-full p-0.5',\n onClick && 'ring-0 transition-all duration-[var(--control-transition-duration)] input-icon-button-interactive active:ring-[length:var(--control-ring-width-active)] cursor-pointer hover:ring-[length:var(--control-ring-width)] group pointer-events-auto'\n ) }\n >\n <Icon className={ classNames('h-5 w-5 input-icon-button-icon', onClick && 'group-active:scale-[0.8] transition-transform duration-[var(--control-transition-duration)] origin-center') }/>\n </div>\n );\n};","import { useState } from \"react\";\nimport { Input, type InputProps } from \"@/components/inputs/Input.tsx\";\nimport { IconEye, IconEyeOff } from \"@tabler/icons-react\";\nimport { InputIconButton } from \"@/components/inputs/InputIconButton.tsx\";\n\n\nexport type InputPasswordProps = InputProps & {\n enableShowPasswordToggle?: boolean;\n}\n\n\nexport const InputPassword = (props: InputPasswordProps) => {\n\n const {\n type = 'password',\n enableShowPasswordToggle = true,\n ...rest\n } = props;\n\n const [ showPassword, setShowPassword ] = useState<boolean>(false);\n\n const handleToggleShowPassword = () => {\n setShowPassword(!showPassword);\n }\n\n return (\n <Input\n type={ showPassword ? 'text' : type }\n buttonTray={\n enableShowPasswordToggle ? (\n <InputIconButton Icon={ showPassword ? IconEyeOff : IconEye } onClick={ handleToggleShowPassword }/>\n ) : undefined\n }\n { ...rest }\n />\n );\n};","import * as React from \"react\";\nimport { mergeRefs } from \"react-merge-refs\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { InputLabel } from \"@/components/inputs/InputLabel.tsx\";\nimport { InputErrorIcon } from \"@/components/inputs/InputErrorIcon.tsx\";\nimport { InputIconButtonTray } from \"@/components/inputs/InputIconButtonTray.tsx\";\nimport { InputDescription } from \"@/components/inputs/InputDescription.tsx\";\nimport { InputError } from \"@/components/inputs/InputError.tsx\";\nimport { ControlSizeContext } from \"@/control-size/use-control-size.ts\";\nimport {\n sizeFontClasses,\n sizeMinHeightClasses,\n sizePaddingLeftClasses,\n sizePaddingRightClasses,\n sizePaddingRightWithTrayClasses,\n} from \"@/control-size/control-size.util.ts\";\n\n\nexport type Size = 'sm' | 'md' | 'lg';\n\nexport type InputTextAreaProps = React.TextareaHTMLAttributes<HTMLTextAreaElement> & {\n label?: string | React.ReactNode;\n description?: string | React.ReactNode;\n error?: string | React.ReactNode;\n size?: Size;\n autogrow?: boolean;\n maxRows?: number;\n ref?: React.Ref<HTMLTextAreaElement>;\n}\n\n\nexport const InputTextArea = (props: InputTextAreaProps) => {\n\n const {\n className,\n label,\n description,\n error,\n size = 'md',\n autogrow = false,\n maxRows,\n ref,\n onChange,\n ...rest\n } = props;\n\n const internalRef = React.useRef<HTMLTextAreaElement>(null);\n\n const resize = React.useCallback(() => {\n const el = internalRef.current;\n if (!el) return;\n el.style.height = 'auto';\n\n let targetHeight = el.scrollHeight;\n\n if (maxRows) {\n const styles = window.getComputedStyle(el);\n const lineHeight = parseFloat(styles.lineHeight);\n const paddingTop = parseFloat(styles.paddingTop);\n const paddingBottom = parseFloat(styles.paddingBottom);\n const borderTop = parseFloat(styles.borderTopWidth);\n const borderBottom = parseFloat(styles.borderBottomWidth);\n const maxHeight = lineHeight * maxRows + paddingTop + paddingBottom + borderTop + borderBottom;\n targetHeight = Math.min(el.scrollHeight, maxHeight);\n }\n\n el.style.height = `${ targetHeight }px`;\n }, [ maxRows ]);\n\n React.useLayoutEffect(() => {\n if (!autogrow) {\n if (internalRef.current) {\n internalRef.current.style.height = '';\n }\n return;\n }\n resize();\n }, [ autogrow, resize, props.value, props.defaultValue, size ]);\n\n const handleChange = (event: React.ChangeEvent<HTMLTextAreaElement>) => {\n onChange?.(event);\n if (autogrow) resize();\n };\n\n return (\n <ControlSizeContext.Provider value={ size }>\n <div\n className={ classNames(\n 'flex flex-col',\n className\n ) }>\n <InputLabel>{ label }</InputLabel>\n <div className={ 'flex flex-col relative' }>\n <textarea\n ref={ ref ? mergeRefs([ ref, internalRef ]) : internalRef }\n onChange={ handleChange }\n className={ classNames(\n 'py-2.5 border-[length:var(--border-width-input)] input-base transition-all duration-[var(--control-transition-duration)] rounded-[var(--border-radius-input)] shadow-[var(--shadow-control)] ring-0 focus:ring-[length:var(--control-ring-width)] focus:outline-none font-[number:var(--font-weight-input-text)] font-[family-name:var(--font-family-base)]',\n sizeMinHeightClasses[size],\n sizeFontClasses[size],\n sizePaddingLeftClasses[size],\n error ? sizePaddingRightWithTrayClasses[size] : sizePaddingRightClasses[size],\n error && 'input-error',\n autogrow && (maxRows\n ? 'resize-none overflow-y-auto [scrollbar-width:none] [&::-webkit-scrollbar]:hidden'\n : 'resize-none overflow-hidden'),\n ) }\n { ...rest }\n />\n <InputIconButtonTray className={ 'top-3.5 translate-y-0' }>\n { error && (\n <InputErrorIcon/>\n ) }\n </InputIconButtonTray>\n </div>\n <InputDescription>{ description }</InputDescription>\n <InputError>{ error }</InputError>\n </div>\n </ControlSizeContext.Provider>\n );\n};\n","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { InputDescription } from \"@/components/inputs/InputDescription.tsx\";\nimport { InputError } from \"@/components/inputs/InputError.tsx\";\n\nexport type InputRadioProps = Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> & {\n name?: string;\n label?: string | React.ReactNode;\n description?: string | React.ReactNode;\n error?: string | React.ReactNode;\n}\n\nexport const InputRadio = (props: InputRadioProps) => {\n const {\n className,\n label,\n description,\n error,\n ...rest\n } = props;\n return (\n <div\n className={ classNames(\n 'flex flex-col',\n className\n ) }\n >\n <div className={ 'flex flex-row gap-3' }>\n <input\n type={ 'radio' }\n className={ 'h-6 w-6 shrink-0 rounded-full border-[length:var(--border-width-input)] check-base shadow-[var(--shadow-control)] ring-0 hover:ring-[length:var(--control-ring-width)] focus:ring-[length:var(--control-ring-width)] ring-offset-0 focus:outline-0 transition-all duration-[var(--control-transition-duration)]' }\n { ...rest }\n />\n { label && (\n <label htmlFor={ props.id } className={ classNames(\n 'input-label font-[number:var(--font-weight-input-option-label)] mb-1',\n props.id && 'cursor-pointer'\n ) }>{ label }</label>\n ) }\n </div>\n <InputDescription>{ description }</InputDescription>\n <InputError>{ error }</InputError>\n </div>\n );\n};","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { InputDescription } from \"@/components/inputs/InputDescription.tsx\";\nimport { InputError } from \"@/components/inputs/InputError.tsx\";\n\nexport type InputToggleProps = Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> & {\n label?: string | React.ReactNode;\n description?: string | React.ReactNode;\n error?: string | React.ReactNode;\n}\n\nexport const InputToggle = (props: InputToggleProps) => {\n const {\n className,\n label,\n description,\n error,\n ...rest\n } = props;\n return (\n <div\n className={ classNames(\n 'flex flex-col',\n className\n ) }\n >\n <div className={ 'flex flex-row gap-3' }>\n <div className={'relative shrink-0 h-6 w-10'}>\n <input\n type={ 'checkbox' }\n className={ 'appearance-none absolute inset-0 h-6 w-10 rounded-full checked:bg-transparent border-0 toggle-input ring-0 hover:ring-[length:var(--control-ring-width)] focus:ring-[length:var(--control-ring-width)] ring-offset-0 focus:outline-0 transition-all duration-[var(--control-transition-duration)]' }\n { ...rest }\n />\n <div className={classNames(\n 'rounded-full absolute border inset-0 pointer-events-none transition-colors duration-[var(--control-transition-duration)] ',\n props.checked ? 'toggle-track-on' : 'toggle-track-off'\n )}>\n <div className={classNames(\n 'absolute top-1/2 -translate-y-1/2 left-1 h-4 w-4 rounded-full toggle-thumb shadow-md transition-all duration-[var(--control-transition-duration)]',\n props.checked && 'translate-x-3.5 '\n )}/>\n </div>\n </div>\n { label && (\n <label htmlFor={ props.id } className={ classNames(\n 'input-label font-[number:var(--font-weight-input-option-label)] mb-1',\n props.id && 'cursor-pointer'\n ) }>{ label }</label>\n ) }\n </div>\n <InputDescription>{ description }</InputDescription>\n <InputError>{ error }</InputError>\n </div>\n );\n};","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { InputDescription } from \"@/components/inputs/InputDescription.tsx\";\nimport { InputError } from \"@/components/inputs/InputError.tsx\";\n\nexport type InputCheckProps = Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> & {\n label?: string | React.ReactNode;\n description?: string | React.ReactNode;\n error?: string | React.ReactNode;\n}\n\nexport const InputCheck = (props: InputCheckProps) => {\n const {\n className,\n label,\n description,\n error,\n ...rest\n } = props;\n return (\n <div\n className={ classNames(\n 'flex flex-col',\n className\n ) }\n >\n <div className={ 'flex flex-row gap-3' }>\n <input\n type={ 'checkbox' }\n className={ 'h-6 w-6 shrink-0 rounded-[var(--border-radius-checkbox)] border-[length:var(--border-width-input)] check-base shadow-[var(--shadow-control)] ring-0 hover:ring-[length:var(--control-ring-width)] focus:ring-[length:var(--control-ring-width)] ring-offset-0 focus:outline-0 transition-all duration-[var(--control-transition-duration)]' }\n { ...rest }\n />\n { label && (\n <label htmlFor={ props.id } className={ classNames(\n 'input-label font-[number:var(--font-weight-input-option-label)] mb-1',\n props.id && 'cursor-pointer'\n ) }>{ label }</label>\n ) }\n </div>\n <InputDescription>{ description }</InputDescription>\n <InputError>{ error }</InputError>\n </div>\n );\n};\n","import * as React from \"react\";\nimport { useDropzone, type Accept, type FileRejection } from \"react-dropzone\";\nimport { IconCircleCheckFilled, IconPaperclip, type TablerIcon } from \"@tabler/icons-react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { InputLabel } from \"@/components/inputs/InputLabel.tsx\";\nimport { InputDescription } from \"@/components/inputs/InputDescription.tsx\";\nimport { InputError } from \"@/components/inputs/InputError.tsx\";\nimport { InputErrorIcon } from \"@/components/inputs/InputErrorIcon.tsx\";\nimport { Spinner } from \"@/spinner/Spinner.tsx\";\nimport { ControlSizeContext } from \"@/control-size/use-control-size.ts\";\nimport {\n sizeFontClasses,\n sizeHeightClasses,\n sizeIconClasses,\n sizePaddingLeftClasses,\n} from \"@/control-size/control-size.util.ts\";\n\n\nexport type Size = 'sm' | 'md' | 'lg';\n\nconst chooseButtonHeightClasses: Record<Size, string> = {\n sm: 'h-7',\n md: 'h-8',\n lg: 'h-10',\n};\n\nconst chooseButtonPaddingClasses: Record<Size, string> = {\n sm: 'px-2.5',\n md: 'px-3',\n lg: 'px-4',\n};\n\nconst chooseButtonFontClasses: Record<Size, string> = {\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-sm',\n};\n\nexport type InputFileSingleProps = {\n label?: string | React.ReactNode;\n description?: string | React.ReactNode;\n error?: string | React.ReactNode;\n placeholder?: string;\n buttonText?: string;\n Icon?: TablerIcon;\n size?: Size;\n value?: File | null;\n isUploaded?: boolean;\n isUploading?: boolean;\n onChange?: (file: File | null) => void | Promise<void>;\n onDropRejected?: (fileRejections: FileRejection[]) => void;\n accept?: Accept;\n maxSize?: number;\n minSize?: number;\n disabled?: boolean;\n className?: string;\n}\n\n\nexport const InputFileSingle = (props: InputFileSingleProps) => {\n\n const {\n label,\n description,\n error,\n placeholder = 'No file chosen',\n buttonText = 'Choose',\n Icon = IconPaperclip,\n size = 'md',\n value,\n isUploaded = false,\n isUploading = false,\n onChange,\n onDropRejected,\n accept,\n maxSize,\n minSize,\n disabled = false,\n className,\n } = props;\n\n const handleDrop = async (acceptedFiles: File[]) => {\n const [ file ] = acceptedFiles;\n if (file) {\n await onChange?.(file);\n }\n };\n\n const {\n getRootProps,\n getInputProps,\n open,\n isDragActive,\n isFocused,\n } = useDropzone({\n multiple: false,\n accept,\n maxSize,\n minSize,\n disabled,\n onDrop: handleDrop,\n onDropRejected,\n });\n\n const fileName = value?.name;\n\n return (\n <ControlSizeContext.Provider value={ size }>\n <div className={ classNames('flex flex-col', className) }>\n <InputLabel>{ label }</InputLabel>\n <div\n { ...getRootProps({\n className: classNames(\n 'flex flex-row items-center',\n 'border-[length:var(--border-width-input)] input-base rounded-[var(--border-radius-input)] shadow-[var(--shadow-control)] transition-all duration-[var(--control-transition-duration)]',\n 'ring-0 focus:outline-none',\n (isFocused || isDragActive) && 'ring-[length:var(--control-ring-width)]',\n error && 'input-error',\n disabled && 'opacity-60 cursor-not-allowed',\n sizeHeightClasses[size],\n sizePaddingLeftClasses[size],\n 'gap-3',\n ),\n }) }\n >\n <input { ...getInputProps() } />\n <Icon className={ classNames('input-icon shrink-0', sizeIconClasses[size]) }/>\n <span\n className={ classNames(\n 'flex-1 truncate',\n sizeFontClasses[size],\n !fileName && 'text-[var(--color-input-placeholder)]',\n ) }\n >\n { fileName ?? placeholder }\n </span>\n { error && (\n <InputErrorIcon/>\n ) }\n { isUploading && !error && (\n <div className={ 'h-5 w-5 flex items-center justify-center' }>\n <Spinner className={ 'h-4 w-4 text-[var(--color-input-icon)]' }/>\n </div>\n ) }\n { isUploaded && !isUploading && !error && (\n <div className={ 'h-5 w-5' }>\n <IconCircleCheckFilled className={ 'h-5 w-5 text-[var(--color-status-success)]' }/>\n </div>\n ) }\n <button\n type={ 'button' }\n disabled={ disabled }\n onClick={ (e) => {\n e.stopPropagation();\n open();\n } }\n className={ classNames(\n 'inline-flex flex-row items-center justify-center shrink-0',\n 'border-[length:var(--border-width-input)] button-white shadow-[var(--shadow-control)] rounded-[calc(var(--border-radius-button)-0.25rem)]',\n 'font-[number:var(--font-weight-button)] font-[family-name:var(--font-family-base)] cursor-pointer select-none transition-all duration-[var(--control-transition-duration)]',\n 'button-ring ring-0 hover:ring-[length:var(--control-ring-width)] active:ring-[length:var(--control-ring-width-active)] focus:outline-none focus:ring-[length:var(--control-ring-width)]',\n 'disabled:cursor-default',\n 'mr-1.5',\n chooseButtonHeightClasses[size],\n chooseButtonPaddingClasses[size],\n chooseButtonFontClasses[size],\n ) }\n >\n { buttonText }\n </button>\n </div>\n <InputDescription>{ description }</InputDescription>\n <InputError>{ error }</InputError>\n </div>\n </ControlSizeContext.Provider>\n );\n};\n","import * as React from \"react\";\nimport { IconCircleCheckFilled, IconExclamationCircleFilled, IconX } from \"@tabler/icons-react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { Spinner } from \"@/spinner/Spinner.tsx\";\nimport { ButtonIconSquare } from \"@/components/button-icon-square/ButtonIconSquare.tsx\";\n\n\nexport type UploadFileTileProps = {\n file: File;\n isUploaded?: boolean;\n isUploading?: boolean;\n error?: string | React.ReactNode;\n onRemove?: () => void;\n className?: string;\n}\n\n\nconst formatBytes = (bytes: number): string => {\n if (bytes < 1024) return `${ bytes } B`;\n if (bytes < 1024 * 1024) return `${ (bytes / 1024).toFixed(1) } KB`;\n if (bytes < 1024 * 1024 * 1024) return `${ (bytes / (1024 * 1024)).toFixed(1) } MB`;\n return `${ (bytes / (1024 * 1024 * 1024)).toFixed(1) } GB`;\n};\n\n\nexport const UploadFileTile = (props: UploadFileTileProps) => {\n\n const {\n file,\n isUploaded = false,\n isUploading = false,\n error,\n onRemove,\n className,\n } = props;\n\n const showStatus = isUploading || isUploaded || !!error;\n\n return (\n <div\n className={ classNames(\n 'flex flex-row items-center gap-3',\n 'border-[length:var(--border-width-input)] input-base rounded-[var(--border-radius-input)] shadow-[var(--shadow-control)]',\n 'pl-4 pr-1 py-1',\n error && 'input-error',\n className,\n ) }\n >\n { showStatus && (\n <div className={ 'shrink-0 h-5 w-5 flex items-center justify-center' }>\n { error ? (\n <IconExclamationCircleFilled className={ 'h-5 w-5 input-error-icon' }/>\n ) : isUploading ? (\n <Spinner className={ 'h-4 w-4 text-[var(--color-input-icon)]' }/>\n ) : (\n <IconCircleCheckFilled className={ 'h-5 w-5 text-[var(--color-status-success)]' }/>\n ) }\n </div>\n ) }\n\n <div className={ 'flex-1 min-w-0 font-[number:var(--font-weight-input-option-label)] truncate' }>\n { file.name }\n </div>\n\n <div className={ 'shrink-0 text-sm text-[var(--color-input-description-text)]' }>\n { formatBytes(file.size) }\n </div>\n\n { onRemove && (\n <ButtonIconSquare\n variant={ 'transparent' }\n size={ 'sm' }\n Icon={ IconX }\n onClick={ onRemove }\n aria-label={ 'Remove file' }\n className={ 'shrink-0' }\n />\n ) }\n </div>\n );\n};\n","import * as React from \"react\";\nimport { useRef, useState } from \"react\";\nimport { useDropzone, type Accept, type FileRejection } from \"react-dropzone\";\nimport { IconCloudUpload, type TablerIcon } from \"@tabler/icons-react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { InputLabel } from \"@/components/inputs/InputLabel.tsx\";\nimport { InputDescription } from \"@/components/inputs/InputDescription.tsx\";\nimport { InputError } from \"@/components/inputs/InputError.tsx\";\nimport { UploadFileTile, type UploadFileTileProps } from \"@/components/inputs/input-file/UploadFileTile.tsx\";\n\n\ntype UploadStatus = 'idle' | 'uploading' | 'uploaded' | 'error';\n\ntype UploadEntry = {\n id: string;\n file: File;\n status: UploadStatus;\n error?: Error;\n}\n\n\nexport type InputFileMultipleProps = {\n label?: string | React.ReactNode;\n description?: string | React.ReactNode;\n error?: string | React.ReactNode;\n title?: string;\n hint?: React.ReactNode;\n Icon?: TablerIcon;\n onUpload?: (file: File) => Promise<void> | void;\n onFileRemoved?: (file: File) => void;\n onDropRejected?: (fileRejections: FileRejection[]) => void;\n renderFileTile?: (file: File, defaultProps: UploadFileTileProps) => React.ReactNode;\n accept?: Accept;\n maxSize?: number;\n minSize?: number;\n maxFiles?: number;\n disabled?: boolean;\n className?: string;\n}\n\n\nexport const InputFileMultiple = (props: InputFileMultipleProps) => {\n\n const {\n label,\n description,\n error,\n title = 'Drop files here',\n hint,\n Icon = IconCloudUpload,\n onUpload,\n onFileRemoved,\n onDropRejected,\n renderFileTile,\n accept,\n maxSize,\n minSize,\n maxFiles,\n disabled = false,\n className,\n } = props;\n\n const [ entries, setEntries ] = useState<UploadEntry[]>([]);\n const idCounter = useRef(0);\n\n const updateEntry = (id: string, patch: Partial<UploadEntry>) => {\n setEntries((prev) => prev.map((e) => (e.id === id ? { ...e, ...patch } : e)));\n };\n\n const handleDrop = (acceptedFiles: File[]) => {\n if (acceptedFiles.length === 0) return;\n\n const newEntries: UploadEntry[] = acceptedFiles.map((file) => ({\n id: String(++idCounter.current),\n file,\n status: onUpload ? 'uploading' : 'idle',\n }));\n\n setEntries((prev) => [ ...prev, ...newEntries ]);\n\n if (!onUpload) return;\n\n for (const entry of newEntries) {\n Promise.resolve()\n .then(() => onUpload(entry.file))\n .then(() => updateEntry(entry.id, { status: 'uploaded' }))\n .catch((err: unknown) => {\n updateEntry(entry.id, {\n status: 'error',\n error: err instanceof Error ? err : new Error(String(err)),\n });\n });\n }\n };\n\n const handleRemove = (id: string) => {\n const removed = entries.find((e) => e.id === id);\n setEntries((prev) => prev.filter((e) => e.id !== id));\n if (removed) {\n onFileRemoved?.(removed.file);\n }\n };\n\n const {\n getRootProps,\n getInputProps,\n isDragActive,\n isFocused,\n } = useDropzone({\n multiple: true,\n accept,\n maxSize,\n minSize,\n maxFiles,\n disabled,\n onDrop: handleDrop,\n onDropRejected,\n });\n\n return (\n <div className={ classNames('flex flex-col', className) }>\n <InputLabel>{ label }</InputLabel>\n\n <div\n { ...getRootProps({\n className: classNames(\n 'flex flex-col items-center justify-center gap-1',\n 'border-2 border-dashed input-base rounded-[var(--border-radius-input)] bg-transparent!',\n 'py-10 px-6 cursor-pointer transition-all duration-[var(--control-transition-duration)]',\n 'ring-0 focus:outline-none',\n (isFocused || isDragActive) && 'ring-[length:var(--control-ring-width)]',\n error && 'input-error',\n disabled && 'opacity-60 cursor-not-allowed',\n ),\n }) }\n >\n <input { ...getInputProps() } />\n <div className={ 'h-14 w-14 rounded-[var(--border-radius-input)] flex items-center justify-center bg-[var(--color-input-file-icon-bg)] mb-2' }>\n <Icon className={ 'h-7 w-7 input-icon' }/>\n </div>\n <div className={ 'text-base font-[number:var(--font-weight-button)]' }>\n { title }\n </div>\n { hint && (\n <div className={ 'text-sm text-[var(--color-input-description-text)] ' }>{ hint }</div>\n ) }\n </div>\n\n { entries.length > 0 && (\n <div className={ 'flex flex-col gap-2 mt-3' }>\n { entries.map((entry) => {\n const defaultProps: UploadFileTileProps = {\n file: entry.file,\n isUploading: entry.status === 'uploading',\n isUploaded: entry.status === 'uploaded',\n error: entry.status === 'error' ? entry.error?.message : undefined,\n onRemove: () => handleRemove(entry.id),\n };\n return (\n <React.Fragment key={ entry.id }>\n { renderFileTile\n ? renderFileTile(entry.file, defaultProps)\n : <UploadFileTile { ...defaultProps }/>\n }\n </React.Fragment>\n );\n }) }\n </div>\n ) }\n\n <InputDescription>{ description }</InputDescription>\n <InputError>{ error }</InputError>\n </div>\n );\n};\n","import type { Klass, LexicalNode } from \"lexical\";\nimport { HeadingNode, QuoteNode } from \"@lexical/rich-text\";\nimport { ListNode, ListItemNode } from \"@lexical/list\";\nimport { LinkNode } from \"@lexical/link\";\n\n/* Node types the editor is allowed to produce. A command for a node that is not\n * registered here silently does nothing, so keep this in sync with the toolbar. */\nexport const LEXICAL_NODES: Array<Klass<LexicalNode>> = [\n HeadingNode,\n QuoteNode,\n ListNode,\n ListItemNode,\n LinkNode,\n];\n\n/* Maps Lexical node kinds to CSS class names. Keep aligned with InputLexical.css. */\nexport const lexicalTheme = {\n paragraph: \"lexical-paragraph\",\n heading: {\n h1: \"lexical-h1\",\n h2: \"lexical-h2\",\n h3: \"lexical-h3\",\n h4: \"lexical-h4\",\n },\n quote: \"lexical-quote\",\n list: {\n ul: \"lexical-ul\",\n ol: \"lexical-ol\",\n listitem: \"lexical-listitem\",\n nested: {\n listitem: \"lexical-listitem-nested\",\n },\n },\n link: \"lexical-link\",\n text: {\n bold: \"lexical-bold\",\n italic: \"lexical-italic\",\n underline: \"lexical-underline\",\n },\n};\n","import * as React from \"react\";\nimport { createContext, useContext, useEffect, useState } from \"react\";\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport {\n $getSelection,\n $isRangeSelection,\n CAN_REDO_COMMAND,\n CAN_UNDO_COMMAND,\n COMMAND_PRIORITY_LOW,\n type LexicalEditor,\n} from \"lexical\";\nimport { $isHeadingNode } from \"@lexical/rich-text\";\nimport { $isListNode, ListNode } from \"@lexical/list\";\nimport { $isLinkNode } from \"@lexical/link\";\nimport { $getNearestNodeOfType, mergeRegister } from \"@lexical/utils\";\n\nexport type LexicalBlockType = \"paragraph\" | \"h1\" | \"h2\" | \"h3\" | \"h4\";\n\nexport type LexicalToolbarState = {\n isBold: boolean;\n isItalic: boolean;\n isUnderline: boolean;\n isLink: boolean;\n isUnorderedList: boolean;\n isOrderedList: boolean;\n blockType: LexicalBlockType;\n canUndo: boolean;\n canRedo: boolean;\n};\n\nexport const DEFAULT_LEXICAL_TOOLBAR_STATE: LexicalToolbarState = {\n isBold: false,\n isItalic: false,\n isUnderline: false,\n isLink: false,\n isUnorderedList: false,\n isOrderedList: false,\n blockType: \"paragraph\",\n canUndo: false,\n canRedo: false,\n};\n\nexport type LexicalToolbarTone = \"light\" | \"dark\";\nexport type LexicalToolbarOrientation = \"horizontal\" | \"vertical\";\n\nexport type LexicalToolbarContextValue = {\n state: LexicalToolbarState;\n tone: LexicalToolbarTone;\n orientation?: LexicalToolbarOrientation;\n};\n\nexport const LexicalToolbarContext = createContext<LexicalToolbarContextValue>({\n state: DEFAULT_LEXICAL_TOOLBAR_STATE,\n tone: \"light\",\n orientation: \"horizontal\",\n});\n\n/* Consumed by toolbar building blocks to read active state + tone. */\nexport const useLexicalToolbar = (): LexicalToolbarContextValue =>\n useContext(LexicalToolbarContext);\n\n/* Subscribes to the editor and derives the active formatting state on every\n * update. Used by the toolbar wrappers to drive button highlighting. */\nexport const useLexicalToolbarState = (): LexicalToolbarState => {\n const [editor] = useLexicalComposerContext();\n const [state, setState] = useState<LexicalToolbarState>(DEFAULT_LEXICAL_TOOLBAR_STATE);\n\n useEffect(() => {\n const readSelection = () => {\n editor.getEditorState().read(() => {\n const selection = $getSelection();\n if (!$isRangeSelection(selection)) {\n return;\n }\n\n const anchorNode = selection.anchor.getNode();\n const listNode = $getNearestNodeOfType<ListNode>(anchorNode, ListNode);\n const listType = listNode && $isListNode(listNode) ? listNode.getListType() : null;\n\n let blockType: LexicalBlockType = \"paragraph\";\n if (!listType) {\n const element =\n anchorNode.getKey() === \"root\" ? anchorNode : anchorNode.getTopLevelElementOrThrow();\n if ($isHeadingNode(element)) {\n blockType = element.getTag() as LexicalBlockType;\n }\n }\n\n // Read every node value here, inside the editor.read() context. Passing\n // these accessors into the setState updater would run them later (during\n // React render) outside the read, throwing Lexical error #195.\n const isBold = selection.hasFormat(\"bold\");\n const isItalic = selection.hasFormat(\"italic\");\n const isUnderline = selection.hasFormat(\"underline\");\n const isLink = $isLinkNode(anchorNode.getParent()) || $isLinkNode(anchorNode);\n\n setState((prev) => ({\n ...prev,\n isBold,\n isItalic,\n isUnderline,\n isLink,\n isUnorderedList: listType === \"bullet\",\n isOrderedList: listType === \"number\",\n blockType,\n }));\n });\n };\n\n return mergeRegister(\n editor.registerUpdateListener(() => readSelection()),\n editor.registerCommand(\n CAN_UNDO_COMMAND,\n (payload: boolean) => {\n setState((prev) => ({ ...prev, canUndo: payload }));\n return false;\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand(\n CAN_REDO_COMMAND,\n (payload: boolean) => {\n setState((prev) => ({ ...prev, canRedo: payload }));\n return false;\n },\n COMMAND_PRIORITY_LOW,\n ),\n );\n }, [editor]);\n\n return state;\n};\n\nexport type LexicalToolbarRenderContext = {\n editor: LexicalEditor;\n state: LexicalToolbarState;\n tone: LexicalToolbarTone;\n};\n\nexport type LexicalToolbarRender = (ctx: LexicalToolbarRenderContext) => React.ReactNode;\n","import { createContext, useContext } from \"react\";\n\nexport type DropdownDismissContextType = () => void;\n\nexport const DropdownDismissContext = createContext<DropdownDismissContextType | undefined>(undefined);\n\nexport const useDropdownDismiss = () => {\n const dropdownDismissContext = useContext(DropdownDismissContext)\n return {\n dismiss: dropdownDismissContext || (() => {})\n }\n}","import * as React from \"react\";\nimport { useState } from \"react\";\nimport { usePopover } from \"@/popover/use-popover.tsx\";\nimport type { Placement } from \"@floating-ui/react\";\nimport { DropdownPanel } from \"@/components/dropdown-menu/DropdownPanel.tsx\";\nimport { DropdownDismissContext } from \"@/components/dropdown-menu/use-dropdown-dismiss.ts\";\n\nexport type DropdownMenuProps = {\n trigger: React.ReactNode;\n children?: React.ReactNode;\n placement?: Placement\n minWidth?: number;\n className?: string;\n}\n\n\nexport const DropdownMenu = (props: DropdownMenuProps) => {\n const { trigger, children, placement = 'bottom-end', minWidth = 200, className } = props;\n const [ show, setShow ] = useState<boolean>(false);\n\n const { Popover, anchorRef } = usePopover({\n placement: placement,\n open: show,\n onOpenChange: setShow,\n minWidth: minWidth,\n })\n\n return (\n <>\n <div ref={ anchorRef } className={ className } onClick={ () => setShow(!show) }>\n { trigger }\n </div>\n\n <Popover open={ show }>\n <DropdownPanel padding={ 'sm' }>\n <DropdownDismissContext.Provider value={ () => setShow(false) }>\n { children }\n </DropdownDismissContext.Provider>\n </DropdownPanel>\n </Popover>\n </>\n );\n};","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport type { TablerIcon } from \"@tabler/icons-react\";\nimport { useDropdownDismiss } from \"@/components/dropdown-menu/use-dropdown-dismiss.ts\";\n\n\nexport type DropdownButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {\n loading?: boolean;\n children?: React.ReactNode;\n Icon?: TablerIcon;\n dismissOnClick?: boolean;\n}\n\nconst base: string = `inline-flex flex-row items-center gap-3 h-10 px-3 font-[number:var(--font-weight-dropdown-item)] font-[family-name:var(--font-family-base)] ring-0 dropdown-item rounded-[var(--border-radius-menu-item)] cursor-pointer transition-all duration-[var(--control-transition-duration)] select-none focus:outline-none focus:ring-0 border border-transparent bg-transparent`;\n\nexport const DropdownButton = React.forwardRef<HTMLButtonElement, DropdownButtonProps>((props, ref) => {\n const {\n className,\n children,\n Icon,\n onClick,\n dismissOnClick = true,\n ...rest\n } = props;\n\n const { dismiss } = useDropdownDismiss();\n\n const handleOnClick = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n if (onClick) onClick(e);\n if (dismissOnClick) dismiss();\n }\n\n return (\n <button\n ref={ ref }\n className={ classNames(\n base,\n className\n ) }\n onClick={ handleOnClick }\n { ...rest }\n >\n { Icon && <Icon className={ 'h-5 w-5' }/> }\n { children }\n </button>\n );\n});","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { $getSelection, $isRangeSelection, $createParagraphNode } from \"lexical\";\nimport { $createHeadingNode } from \"@lexical/rich-text\";\nimport { $setBlocksType } from \"@lexical/selection\";\nimport { IconCheck, IconChevronDown } from \"@tabler/icons-react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { DropdownMenu } from \"@/components/dropdown-menu/DropdownMenu.tsx\";\nimport { DropdownButton } from \"@/components/dropdown-menu/DropdownButton.tsx\";\nimport {\n type LexicalBlockType,\n useLexicalToolbar,\n} from \"@/components/inputs/input-lexical/use-lexical-toolbar.ts\";\n\nconst OPTIONS: { value: LexicalBlockType; label: string }[] = [\n { value: \"paragraph\", label: \"Paragraph\" },\n { value: \"h1\", label: \"Heading 1\" },\n { value: \"h2\", label: \"Heading 2\" },\n { value: \"h3\", label: \"Heading 3\" },\n { value: \"h4\", label: \"Heading 4\" },\n];\n\nexport const LexicalBlockTypeSelect = () => {\n const [ editor ] = useLexicalComposerContext();\n const { state, tone } = useLexicalToolbar();\n\n const applyBlockType = (blockType: LexicalBlockType) => {\n editor.update(() => {\n const selection = $getSelection();\n if (!$isRangeSelection(selection)) {\n return;\n }\n if (blockType === \"paragraph\") {\n $setBlocksType(selection, () => $createParagraphNode());\n } else {\n $setBlocksType(selection, () => $createHeadingNode(blockType));\n }\n });\n };\n\n const current = OPTIONS.find((option) => option.value === state.blockType) ?? OPTIONS[0];\n\n return (\n <DropdownMenu\n placement={ \"bottom-start\" }\n minWidth={ 180 }\n trigger={\n <button\n type={ \"button\" }\n onMouseDown={ (event) => event.preventDefault() }\n className={ classNames(\n \"lexical-tb-btn h-8 px-2 gap-1 text-sm font-[number:var(--font-weight-input-option-label)]\",\n tone === \"dark\" ? \"lexical-tb-btn-dark\" : \"lexical-tb-btn-light\",\n ) }\n >\n { current.label }\n <IconChevronDown className={ \"h-4 w-4\" }/>\n </button>\n }\n >\n { OPTIONS.map((option) => (\n <DropdownButton\n key={ option.value }\n Icon={ option.value === state.blockType ? IconCheck : undefined }\n onClick={ () => applyBlockType(option.value) }\n className={ option.value === state.blockType ? undefined : \"pl-11\" }\n >\n { option.label }\n </DropdownButton>\n )) }\n </DropdownMenu>\n );\n};\n","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport type { TablerIcon } from \"@tabler/icons-react\";\nimport type { LexicalToolbarTone } from \"@/components/inputs/input-lexical/use-lexical-toolbar.ts\";\n\nexport type LexicalToolbarButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {\n Icon: TablerIcon;\n active?: boolean;\n tone?: LexicalToolbarTone;\n};\n\nconst toneClasses: Record<LexicalToolbarTone, string> = {\n light: \"lexical-tb-btn-light\",\n dark: \"lexical-tb-btn-dark\",\n};\n\nexport const LexicalToolbarButton = React.forwardRef<HTMLButtonElement, LexicalToolbarButtonProps>(\n (props, ref) => {\n const { Icon, active = false, tone = \"light\", className, onMouseDown, ...rest } = props;\n\n // Keep the editor selection intact when a toolbar control is pressed.\n const handleMouseDown = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n onMouseDown?.(event);\n };\n\n return (\n <button\n ref={ ref }\n type={ \"button\" }\n onMouseDown={ handleMouseDown }\n className={ classNames(\n \"lexical-tb-btn h-8 w-8\",\n toneClasses[tone],\n active && \"lexical-tb-btn-active\",\n className,\n ) }\n { ...rest }\n >\n <Icon className={ \"h-[18px] w-[18px]\" }/>\n </button>\n );\n },\n);\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { FORMAT_TEXT_COMMAND } from \"lexical\";\nimport { IconBold, IconItalic, IconUnderline } from \"@tabler/icons-react\";\nimport { LexicalToolbarButton } from \"@/components/inputs/input-lexical/LexicalToolbarButton.tsx\";\nimport { useLexicalToolbar } from \"@/components/inputs/input-lexical/use-lexical-toolbar.ts\";\n\nexport const LexicalFormatButtons = () => {\n const [ editor ] = useLexicalComposerContext();\n const { state, tone } = useLexicalToolbar();\n\n return (\n <>\n <LexicalToolbarButton\n Icon={ IconBold }\n tone={ tone }\n active={ state.isBold }\n aria-label={ \"Bold\" }\n onClick={ () => editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"bold\") }\n />\n <LexicalToolbarButton\n Icon={ IconItalic }\n tone={ tone }\n active={ state.isItalic }\n aria-label={ \"Italic\" }\n onClick={ () => editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"italic\") }\n />\n <LexicalToolbarButton\n Icon={ IconUnderline }\n tone={ tone }\n active={ state.isUnderline }\n aria-label={ \"Underline\" }\n onClick={ () => editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"underline\") }\n />\n </>\n );\n};\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport {\n INSERT_ORDERED_LIST_COMMAND,\n INSERT_UNORDERED_LIST_COMMAND,\n REMOVE_LIST_COMMAND,\n} from \"@lexical/list\";\nimport { IconList, IconListNumbers } from \"@tabler/icons-react\";\nimport { LexicalToolbarButton } from \"@/components/inputs/input-lexical/LexicalToolbarButton.tsx\";\nimport { useLexicalToolbar } from \"@/components/inputs/input-lexical/use-lexical-toolbar.ts\";\n\nexport const LexicalListButtons = () => {\n const [ editor ] = useLexicalComposerContext();\n const { state, tone } = useLexicalToolbar();\n\n const toggleUnordered = () => {\n editor.dispatchCommand(\n state.isUnorderedList ? REMOVE_LIST_COMMAND : INSERT_UNORDERED_LIST_COMMAND,\n undefined,\n );\n };\n\n const toggleOrdered = () => {\n editor.dispatchCommand(\n state.isOrderedList ? REMOVE_LIST_COMMAND : INSERT_ORDERED_LIST_COMMAND,\n undefined,\n );\n };\n\n return (\n <>\n <LexicalToolbarButton\n Icon={ IconList }\n tone={ tone }\n active={ state.isUnorderedList }\n aria-label={ \"Bullet list\" }\n onClick={ toggleUnordered }\n />\n <LexicalToolbarButton\n Icon={ IconListNumbers }\n tone={ tone }\n active={ state.isOrderedList }\n aria-label={ \"Numbered list\" }\n onClick={ toggleOrdered }\n />\n </>\n );\n};\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { TOGGLE_LINK_COMMAND } from \"@lexical/link\";\nimport { IconLink } from \"@tabler/icons-react\";\nimport { LexicalToolbarButton } from \"@/components/inputs/input-lexical/LexicalToolbarButton.tsx\";\nimport { useLexicalToolbar } from \"@/components/inputs/input-lexical/use-lexical-toolbar.ts\";\n\nexport const LexicalLinkButton = () => {\n const [ editor ] = useLexicalComposerContext();\n const { state, tone } = useLexicalToolbar();\n\n const toggleLink = () => {\n if (state.isLink) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\n return;\n }\n const url = window.prompt(\"Enter URL\");\n if (url) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, url);\n }\n };\n\n return (\n <LexicalToolbarButton\n Icon={ IconLink }\n tone={ tone }\n active={ state.isLink }\n aria-label={ \"Link\" }\n onClick={ toggleLink }\n />\n );\n};\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { REDO_COMMAND, UNDO_COMMAND } from \"lexical\";\nimport { IconArrowBackUp, IconArrowForwardUp } from \"@tabler/icons-react\";\nimport { LexicalToolbarButton } from \"@/components/inputs/input-lexical/LexicalToolbarButton.tsx\";\nimport { useLexicalToolbar } from \"@/components/inputs/input-lexical/use-lexical-toolbar.ts\";\n\nexport const LexicalHistoryButtons = () => {\n const [ editor ] = useLexicalComposerContext();\n const { state, tone } = useLexicalToolbar();\n\n return (\n <>\n <LexicalToolbarButton\n Icon={ IconArrowBackUp }\n tone={ tone }\n disabled={ !state.canUndo }\n aria-label={ \"Undo\" }\n onClick={ () => editor.dispatchCommand(UNDO_COMMAND, undefined) }\n />\n <LexicalToolbarButton\n Icon={ IconArrowForwardUp }\n tone={ tone }\n disabled={ !state.canRedo }\n aria-label={ \"Redo\" }\n onClick={ () => editor.dispatchCommand(REDO_COMMAND, undefined) }\n />\n </>\n );\n};\n","import { classNames } from \"@/util/classnames.util.ts\";\nimport {\n type LexicalToolbarTone,\n useLexicalToolbar,\n} from \"@/components/inputs/input-lexical/use-lexical-toolbar.ts\";\n\nexport type LexicalToolbarDividerProps = {\n tone?: LexicalToolbarTone;\n className?: string;\n};\n\nconst toneClasses: Record<LexicalToolbarTone, string> = {\n light: \"lexical-tb-divider-light\",\n dark: \"lexical-tb-divider-dark\",\n};\n\nexport const LexicalToolbarDivider = (props: LexicalToolbarDividerProps) => {\n const { tone: toneOverride, className } = props;\n const { tone: contextTone, orientation } = useLexicalToolbar();\n const tone = toneOverride ?? contextTone;\n const vertical = orientation === \"vertical\";\n return (\n <div\n className={ classNames(\n vertical ? \"h-px w-full my-1\" : \"w-px h-5 my-auto mx-1\",\n \"shrink-0\",\n toneClasses[tone],\n className,\n ) }\n />\n );\n};\n","import * as React from \"react\";\nimport { useCallback, useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport { IconDots } from \"@tabler/icons-react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { DropdownMenu } from \"@/components/dropdown-menu/DropdownMenu.tsx\";\nimport {\n LexicalToolbarContext,\n useLexicalToolbar,\n} from \"@/components/inputs/input-lexical/use-lexical-toolbar.ts\";\n\nexport type LexicalToolbarItemsProps = {\n children: React.ReactNode;\n};\n\nconst GAP = 4; // gap-1 = 0.25rem\nconst MORE_WIDTH = 36; // 32px button + gap reserved for the overflow trigger\n\n/* Flatten one or more levels of fragments so each building block becomes an\n * individually measurable unit (a wrapping component/fragment would otherwise\n * collapse the whole toolbar as a single item). */\nconst flattenItems = (nodes: React.ReactNode): React.ReactNode[] => {\n const out: React.ReactNode[] = [];\n React.Children.forEach(nodes, (child) => {\n if (React.isValidElement(child) && child.type === React.Fragment) {\n out.push(...flattenItems((child.props as { children?: React.ReactNode }).children));\n } else {\n out.push(child);\n }\n });\n return out;\n};\n\n/* Lays out toolbar building blocks in a single row and, when they no longer\n * fit, collapses the trailing items into a \"⋮\" vertical dropdown. A hidden\n * mirror row provides stable intrinsic widths so growth/shrink decisions stay\n * consistent. */\nexport const LexicalToolbarItems = (props: LexicalToolbarItemsProps) => {\n const { children } = props;\n const { state, tone } = useLexicalToolbar();\n const items = flattenItems(children);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const mirrorRef = useRef<HTMLDivElement>(null);\n const [ visibleCount, setVisibleCount ] = useState(items.length);\n\n const recompute = useCallback(() => {\n const container = containerRef.current;\n const mirror = mirrorRef.current;\n if (!container || !mirror) return;\n\n const available = container.clientWidth;\n const widths = Array.from(mirror.children).map((node) => (node as HTMLElement).offsetWidth);\n const total = widths.reduce((sum, w, i) => sum + w + (i > 0 ? GAP : 0), 0);\n\n if (total <= available) {\n setVisibleCount(widths.length);\n return;\n }\n\n let used = 0;\n let count = 0;\n for (let i = 0; i < widths.length; i++) {\n const add = widths[i] + (i > 0 ? GAP : 0);\n if (used + add + MORE_WIDTH > available) break;\n used += add;\n count++;\n }\n setVisibleCount(count);\n }, []);\n\n useLayoutEffect(() => {\n recompute();\n });\n\n useEffect(() => {\n const container = containerRef.current;\n const mirror = mirrorRef.current;\n if (!container) return;\n const observer = new ResizeObserver(() => recompute());\n observer.observe(container);\n if (mirror) observer.observe(mirror);\n return () => observer.disconnect();\n }, [ recompute ]);\n\n const visible = items.slice(0, visibleCount);\n const overflow = items.slice(visibleCount);\n\n return (\n <div\n ref={ containerRef }\n className={ \"relative flex flex-row items-center gap-1 min-w-0 flex-1\" }\n >\n <div\n ref={ mirrorRef }\n aria-hidden={ true }\n className={ \"pointer-events-none invisible absolute left-0 top-0 flex flex-row items-center gap-1 w-max\" }\n >\n { items.map((item, index) => (\n <div key={ index } className={ \"flex flex-row items-center\" }>\n { item }\n </div>\n )) }\n </div>\n\n { visible.map((item, index) => (\n <React.Fragment key={ index }>{ item }</React.Fragment>\n )) }\n\n { overflow.length > 0 && (\n <DropdownMenu\n placement={ \"bottom-end\" }\n minWidth={ 0 }\n trigger={\n <button\n type={ \"button\" }\n aria-label={ \"More\" }\n onMouseDown={ (event) => event.preventDefault() }\n className={ classNames(\n \"lexical-tb-btn h-8 w-8 shrink-0\",\n tone === \"dark\" ? \"lexical-tb-btn-dark\" : \"lexical-tb-btn-light\",\n ) }\n >\n <IconDots className={ \"h-[18px] w-[18px]\" }/>\n </button>\n }\n >\n <LexicalToolbarContext.Provider value={ { state, tone: \"light\", orientation: \"vertical\" } }>\n <div\n className={ \"flex flex-col items-stretch gap-1\" }\n onMouseDown={ (event) => event.preventDefault() }\n >\n { overflow.map((item, index) => (\n <React.Fragment key={ index }>{ item }</React.Fragment>\n )) }\n </div>\n </LexicalToolbarContext.Provider>\n </DropdownMenu>\n ) }\n </div>\n );\n};\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport {\n LexicalToolbarContext,\n type LexicalToolbarRender,\n useLexicalToolbarState,\n} from \"@/components/inputs/input-lexical/use-lexical-toolbar.ts\";\nimport { LexicalBlockTypeSelect } from \"@/components/inputs/input-lexical/LexicalBlockTypeSelect.tsx\";\nimport { LexicalFormatButtons } from \"@/components/inputs/input-lexical/LexicalFormatButtons.tsx\";\nimport { LexicalListButtons } from \"@/components/inputs/input-lexical/LexicalListButtons.tsx\";\nimport { LexicalLinkButton } from \"@/components/inputs/input-lexical/LexicalLinkButton.tsx\";\nimport { LexicalHistoryButtons } from \"@/components/inputs/input-lexical/LexicalHistoryButtons.tsx\";\nimport { LexicalToolbarDivider } from \"@/components/inputs/input-lexical/LexicalToolbarDivider.tsx\";\nimport { LexicalToolbarItems } from \"@/components/inputs/input-lexical/LexicalToolbarItems.tsx\";\n\n/* The default set of toolbar building blocks as a flat fragment. Passed\n * straight into LexicalToolbarItems so each block stays individually\n * measurable for the overflow-collapse logic. */\n// eslint-disable-next-line react-refresh/only-export-components\nexport const lexicalDefaultToolbarItems = () => (\n <>\n <LexicalBlockTypeSelect/>\n <LexicalToolbarDivider/>\n <LexicalFormatButtons/>\n <LexicalToolbarDivider/>\n <LexicalListButtons/>\n <LexicalLinkButton/>\n <LexicalToolbarDivider/>\n <LexicalHistoryButtons/>\n </>\n);\n\nexport const LexicalDefaultToolbarContent = () => lexicalDefaultToolbarItems();\n\nexport type LexicalToolbarProps = {\n render?: LexicalToolbarRender;\n className?: string;\n};\n\nexport const LexicalToolbar = (props: LexicalToolbarProps) => {\n const { render, className } = props;\n const [ editor ] = useLexicalComposerContext();\n const state = useLexicalToolbarState();\n\n return (\n <LexicalToolbarContext.Provider value={ { state, tone: \"light\" } }>\n <div\n className={ classNames(\n \"lexical-toolbar flex flex-row items-center p-1.5\",\n className,\n ) }\n >\n <LexicalToolbarItems>\n { render ? render({ editor, state, tone: \"light\" }) : lexicalDefaultToolbarItems() }\n </LexicalToolbarItems>\n </div>\n </LexicalToolbarContext.Provider>\n );\n};\n","import { useEffect, useState } from \"react\";\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { BLUR_COMMAND, COMMAND_PRIORITY_LOW, FOCUS_COMMAND } from \"lexical\";\nimport { mergeRegister } from \"@lexical/utils\";\nimport {\n autoUpdate,\n flip,\n FloatingPortal,\n offset,\n shift,\n size,\n useFloating,\n} from \"@floating-ui/react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport {\n LexicalToolbarContext,\n type LexicalToolbarRender,\n useLexicalToolbarState,\n} from \"@/components/inputs/input-lexical/use-lexical-toolbar.ts\";\nimport { LexicalToolbarItems } from \"@/components/inputs/input-lexical/LexicalToolbarItems.tsx\";\nimport { lexicalDefaultToolbarItems } from \"@/components/inputs/input-lexical/LexicalToolbar.tsx\";\n\nexport type LexicalFloatingToolbarProps = {\n render?: LexicalToolbarRender;\n};\n\nexport const LexicalFloatingToolbar = (props: LexicalFloatingToolbarProps) => {\n const { render } = props;\n const [ editor ] = useLexicalComposerContext();\n const state = useLexicalToolbarState();\n const [ open, setOpen ] = useState(false);\n\n const { refs, floatingStyles } = useFloating({\n placement: \"top-start\",\n strategy: \"fixed\",\n middleware: [\n offset(8),\n flip(),\n shift({ padding: 8 }),\n size({\n apply({ rects, elements }) {\n // Match the editor row width so the bar starts at the row and shares\n // the same max width (driving the overflow-collapse behaviour).\n elements.floating.style.width = `${ rects.reference.width }px`;\n },\n }),\n ],\n whileElementsMounted: autoUpdate,\n });\n\n useEffect(() => {\n // registerRootListener fires immediately with the current root, so this\n // also covers the initial reference.\n return editor.registerRootListener((root) => refs.setReference(root ?? null));\n }, [ editor, refs ]);\n\n useEffect(() => {\n return mergeRegister(\n editor.registerCommand(\n FOCUS_COMMAND,\n () => {\n setOpen(true);\n return false;\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand(\n BLUR_COMMAND,\n () => {\n setOpen(false);\n return false;\n },\n COMMAND_PRIORITY_LOW,\n ),\n );\n }, [ editor ]);\n\n return (\n <LexicalToolbarContext.Provider value={ { state, tone: \"dark\" } }>\n <FloatingPortal>\n <AnimatePresence>\n { open && (\n <div ref={ refs.setFloating } style={ floatingStyles } className={ \"z-50\" }>\n <motion.div\n className={ \"lexical-floating-toolbar flex w-full flex-row items-center p-1 rounded-[var(--border-radius-dropdown)]\" }\n initial={ { opacity: 0, y: 4 } }\n animate={ { opacity: 1, y: 0 } }\n exit={ { opacity: 0, y: 4 } }\n transition={ { duration: 0.1, ease: \"easeInOut\" } }\n >\n <LexicalToolbarItems>\n { render\n ? render({ editor, state, tone: \"dark\" })\n : lexicalDefaultToolbarItems() }\n </LexicalToolbarItems>\n </motion.div>\n </div>\n ) }\n </AnimatePresence>\n </FloatingPortal>\n </LexicalToolbarContext.Provider>\n );\n};\n","import * as React from \"react\";\nimport { useCallback, useMemo } from \"react\";\nimport { LexicalComposer } from \"@lexical/react/LexicalComposer\";\nimport { RichTextPlugin } from \"@lexical/react/LexicalRichTextPlugin\";\nimport { ContentEditable } from \"@lexical/react/LexicalContentEditable\";\nimport { HistoryPlugin } from \"@lexical/react/LexicalHistoryPlugin\";\nimport { ListPlugin } from \"@lexical/react/LexicalListPlugin\";\nimport { LinkPlugin } from \"@lexical/react/LexicalLinkPlugin\";\nimport { OnChangePlugin } from \"@lexical/react/LexicalOnChangePlugin\";\nimport { AutoFocusPlugin } from \"@lexical/react/LexicalAutoFocusPlugin\";\nimport { LexicalErrorBoundary } from \"@lexical/react/LexicalErrorBoundary\";\nimport type { EditorState, EditorThemeClasses, Klass, LexicalNode } from \"lexical\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { InputLabel } from \"@/components/inputs/InputLabel.tsx\";\nimport { InputDescription } from \"@/components/inputs/InputDescription.tsx\";\nimport { InputError } from \"@/components/inputs/InputError.tsx\";\nimport { ControlSizeContext } from \"@/control-size/use-control-size.ts\";\nimport { sizeFontClasses } from \"@/control-size/control-size.util.ts\";\nimport { LEXICAL_NODES, lexicalTheme } from \"@/components/inputs/input-lexical/lexical-theme.ts\";\nimport { LexicalToolbar } from \"@/components/inputs/input-lexical/LexicalToolbar.tsx\";\nimport { LexicalFloatingToolbar } from \"@/components/inputs/input-lexical/LexicalFloatingToolbar.tsx\";\nimport type { LexicalToolbarRender } from \"@/components/inputs/input-lexical/use-lexical-toolbar.ts\";\n\nexport type Size = \"sm\" | \"md\" | \"lg\";\nexport type LexicalToolbarVariant = \"static\" | \"floating\";\n\nexport type InputLexicalProps = {\n label?: string | React.ReactNode;\n description?: string | React.ReactNode;\n error?: string | React.ReactNode;\n placeholder?: string;\n /** Serialized editor state (JSON string from a previous onChange), or undefined for empty. */\n value?: string;\n onChange?: (value: string) => void;\n size?: Size;\n toolbar?: LexicalToolbarVariant;\n /** Override the default toolbar content. Drop in the exported building blocks. */\n renderToolbar?: LexicalToolbarRender;\n /** Minimum visible rows — sets a height floor for the editable area. */\n minRows?: number;\n /** Maximum visible rows. Content beyond this scrolls. */\n maxRows?: number;\n /** Grow the editor with its content (between minRows and maxRows). */\n autogrow?: boolean;\n namespace?: string;\n /** Extra Lexical nodes to register alongside the built-in set. */\n nodes?: Array<Klass<LexicalNode>>;\n /** Theme classes merged over the defaults (e.g. to style custom nodes). */\n theme?: EditorThemeClasses;\n autoFocus?: boolean;\n /** Extra Lexical plugins, mounted inside the editor alongside the built-ins. */\n children?: React.ReactNode;\n className?: string;\n};\n\nexport const InputLexical = (props: InputLexicalProps) => {\n const {\n label,\n description,\n error,\n placeholder,\n value,\n onChange,\n size = \"md\",\n toolbar = \"static\",\n renderToolbar,\n minRows = 4,\n maxRows,\n autogrow = false,\n namespace = \"InputLexical\",\n nodes,\n theme,\n autoFocus = false,\n children,\n className,\n } = props;\n\n const initialConfig = useMemo(\n () => ({\n namespace,\n theme: theme ? { ...lexicalTheme, ...theme } : lexicalTheme,\n nodes: [ ...LEXICAL_NODES, ...(nodes ?? []) ],\n editorState: value ?? null,\n onError: (e: Error) => {\n throw e;\n },\n }),\n // Lexical reads initialConfig once on mount; later prop changes are ignored by design.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n\n const handleChange = useCallback(\n (editorState: EditorState) => {\n onChange?.(JSON.stringify(editorState.toJSON()));\n },\n [ onChange ],\n );\n\n const fontClass = sizeFontClasses[size];\n const hasError = !!error;\n\n // py-3 (top + bottom) = 1.5rem; `1lh` resolves to the content line-height.\n const rowsToHeight = (rows: number) => `calc(${ rows } * 1lh + 1.5rem)`;\n const contentStyle: React.CSSProperties = autogrow\n ? { minHeight: rowsToHeight(minRows), maxHeight: maxRows ? rowsToHeight(maxRows) : undefined }\n : { height: rowsToHeight(minRows) };\n\n return (\n <ControlSizeContext.Provider value={ size }>\n <div className={ classNames(\"flex flex-col\", className) }>\n <InputLabel>{ label }</InputLabel>\n <LexicalComposer initialConfig={ initialConfig }>\n <div\n className={ classNames(\n \"relative flex flex-col border-[length:var(--border-width-input)] input-base rounded-[var(--border-radius-input)] shadow-[var(--shadow-control)] overflow-hidden transition-all duration-[var(--control-transition-duration)] ring-0 focus-within:ring-[length:var(--control-ring-width)] focus-within:outline-none font-[family-name:var(--font-family-base)]\",\n hasError && \"input-error\",\n ) }\n >\n { toolbar === \"static\" && <LexicalToolbar render={ renderToolbar }/> }\n\n <div className={ \"relative flex-1 min-h-0\" }>\n <RichTextPlugin\n contentEditable={\n <ContentEditable\n className={ classNames(\n \"lexical-content w-full outline-none px-3 py-3 leading-[1.55] overflow-y-auto mat-ui-hide-scrollbars\",\n fontClass,\n ) }\n style={ contentStyle }\n aria-placeholder={ placeholder ?? \"\" }\n placeholder={\n <div\n className={ classNames(\n \"lexical-placeholder pointer-events-none absolute left-3 top-3\",\n fontClass,\n ) }\n >\n { placeholder ?? \"\" }\n </div>\n }\n />\n }\n ErrorBoundary={ LexicalErrorBoundary }\n />\n </div>\n\n <HistoryPlugin/>\n <ListPlugin/>\n <LinkPlugin/>\n { autoFocus && <AutoFocusPlugin/> }\n { onChange && <OnChangePlugin onChange={ handleChange }/> }\n { children }\n { toolbar === \"floating\" && <LexicalFloatingToolbar render={ renderToolbar }/> }\n </div>\n </LexicalComposer>\n <InputDescription>{ description }</InputDescription>\n <InputError>{ error }</InputError>\n </div>\n </ControlSizeContext.Provider>\n );\n};\n","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { IconChevronDown } from \"@tabler/icons-react\";\nimport { InputLabel } from \"@/components/inputs/InputLabel.tsx\";\nimport { InputDescription } from \"@/components/inputs/InputDescription.tsx\";\nimport { InputError } from \"@/components/inputs/InputError.tsx\";\nimport { InputErrorIcon } from \"@/components/inputs/InputErrorIcon.tsx\";\nimport { InputIconButton } from \"@/components/inputs/InputIconButton.tsx\";\nimport { InputIconButtonTray } from \"@/components/inputs/InputIconButtonTray.tsx\";\nimport { ControlSizeContext } from \"@/control-size/use-control-size.ts\";\nimport {\n sizeFontClasses,\n sizeHeightClasses,\n sizePaddingLeftClasses,\n sizePaddingRightWithTrayClasses,\n} from \"@/control-size/control-size.util.ts\";\n\n\nexport type Size = 'sm' | 'md' | 'lg';\n\nexport type InputSelectNativeProps = Omit<React.InputHTMLAttributes<HTMLSelectElement>, 'size'> & {\n label?: string | React.ReactNode;\n description?: string | React.ReactNode;\n options?: OptionNative[];\n error?: string | React.ReactNode;\n size?: Size;\n}\n\nexport type OptionNative = {\n label: string;\n value: string;\n disabled?: boolean;\n}\n\n\nexport const InputSelectNative = (props: InputSelectNativeProps) => {\n\n const {\n className,\n label,\n description,\n options,\n error,\n size = 'md',\n ...rest\n } = props;\n\n return (\n <ControlSizeContext.Provider value={ size }>\n <div\n className={ classNames(\n 'flex flex-col',\n className\n ) }>\n <InputLabel>{ label }</InputLabel>\n <div className={ 'relative flex w-full flex-col' }>\n <select\n className={ classNames(\n 'appearance-none border-[length:var(--border-width-input)] input-base bg-none transition-all duration-[var(--control-transition-duration)] rounded-[var(--border-radius-input)] shadow-[var(--shadow-control)] ring-0 focus:ring-[length:var(--control-ring-width)] focus:outline-none font-[number:var(--font-weight-input-text)] font-[family-name:var(--font-family-base)]',\n sizeHeightClasses[size],\n sizeFontClasses[size],\n sizePaddingLeftClasses[size],\n sizePaddingRightWithTrayClasses[size],\n ) }\n { ...rest }\n >\n { options && options.map((option, index) => (\n <option\n key={ index }\n value={ option.value }\n disabled={ option.disabled }\n >{ option.label }</option>\n )) }\n </select>\n <InputIconButtonTray>\n { error && (\n <InputErrorIcon/>\n ) }\n <InputIconButton Icon={ IconChevronDown }/>\n </InputIconButtonTray>\n </div>\n <InputDescription>{ description }</InputDescription>\n <InputError>{ error }</InputError>\n </div>\n </ControlSizeContext.Provider>\n );\n};\n","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { IconCheck } from \"@tabler/icons-react\";\n\nexport interface InputSelectOptionProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onClick'> {\n children: React.ReactNode;\n selected: boolean;\n disabled?: boolean;\n active?: boolean;\n onClick?: () => void;\n}\n\nexport const InputSelectOption = React.forwardRef<HTMLDivElement, InputSelectOptionProps>((props, ref) => {\n const {\n children,\n onClick,\n selected,\n disabled = false,\n active = false,\n className,\n ...rest\n } = props;\n\n return (\n <div\n ref={ ref }\n { ...rest }\n onClick={ () => !disabled && onClick && onClick() }\n className={ classNames(\n 'option-base px-4 py-2 rounded-[var(--border-radius-option)] cursor-pointer transition-all duration-[var(--control-transition-duration)] select-none flex flex-row gap-3 items-center',\n (selected && !disabled) && 'option-selected',\n (active && !disabled) && 'option-active',\n disabled && 'option-disabled cursor-not-allowed hover:bg-transparent active:bg-transparent',\n className,\n ) }\n >\n <div className={ 'flex-1 min-w-0 break-all line-clamp-1' }>{ children }</div>\n { (selected && !disabled) && (\n <div className={ 'shrink-0' }>\n <IconCheck className={ 'h-5 w-5' }/>\n </div>\n ) }\n </div>\n );\n});\n","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\n\nexport interface InputSelectGroupHeaderProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\nexport const InputSelectGroupHeader = React.forwardRef<HTMLDivElement, InputSelectGroupHeaderProps>((props, ref) => {\n const { children, className, ...rest } = props;\n return (\n <div\n ref={ ref }\n { ...rest }\n className={ classNames(\n 'option-group-header px-4 pt-3 pb-1 text-xs font-[number:var(--font-weight-group-header)] uppercase tracking-wide select-none',\n className,\n ) }\n >\n { children }\n </div>\n );\n});\n","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\n\nexport type InputSelectDividerProps = React.HTMLAttributes<HTMLDivElement>;\n\nexport const InputSelectDivider = React.forwardRef<HTMLDivElement, InputSelectDividerProps>((props, ref) => {\n const { className, ...rest } = props;\n return (\n <div\n ref={ ref }\n { ...rest }\n className={ classNames(\n 'option-divider my-1 h-px',\n className,\n ) }\n />\n );\n});\n","import * as React from \"react\";\n\nexport type Option<T> = {\n label: string | React.ReactNode;\n value: T;\n disabled?: boolean;\n}\n\nexport type SelectGroupHeader = {\n kind: 'header';\n label: string | React.ReactNode;\n}\n\nexport type SelectDivider = {\n kind: 'divider';\n}\n\nexport type SelectItem<T> = Option<T> | SelectGroupHeader | SelectDivider;\n\nexport const isSelectOption = <T, >(item: SelectItem<T>): item is Option<T> => !('kind' in item);\n\n/**\n * Compares two option values for selection/membership purposes.\n *\n * Primitives (string, number, boolean, …) are compared by strict equality, so\n * behaviour is identical to `===` for the common case. Object-valued options\n * fall back to a structural (JSON) comparison, so a value rehydrated from\n * persisted state — a fresh object instance that is structurally equal — still\n * matches its option instead of silently falling back to the placeholder.\n *\n * Note: the structural comparison is order-sensitive on object keys.\n */\nexport const selectValueEquals = <T, >(a: T | null | undefined, b: T | null | undefined): boolean => {\n if (a === b) return true;\n if (a == null || b == null) return false;\n if (typeof a !== 'object' || typeof b !== 'object') return false;\n return JSON.stringify(a) === JSON.stringify(b);\n};\n","import * as React from \"react\";\nimport {\n autoUpdate,\n flip,\n type Placement,\n shift,\n size,\n useDismiss,\n useFloating,\n useInteractions,\n useListNavigation,\n} from \"@floating-ui/react\";\nimport { PopoverBase } from \"@/popover/PopoverBase.tsx\";\n\n\nexport type UseSelectPopoverProps = {\n placement?: Placement;\n fullWidth?: boolean;\n minWidth?: number;\n maxWidth?: number;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n listRef: React.MutableRefObject<Array<HTMLElement | null>>;\n activeIndex: number | null;\n onNavigate: (index: number | null) => void;\n loop?: boolean;\n disabledIndices?: number[];\n};\n\nexport type SelectPopoverRendererProps = {\n open: boolean;\n children: React.ReactNode;\n className?: string;\n}\n\ntype SelectPopoverBaseRefProps = {\n floatingStyles: React.CSSProperties;\n setFloating: React.RefCallback<HTMLDivElement>;\n placement: Placement;\n getFloatingProps: (userProps?: React.HTMLProps<HTMLElement>) => Record<string, unknown>;\n}\n\nexport type UseSelectPopoverResult = {\n anchorRef: React.RefCallback<HTMLDivElement | null>;\n Popover: React.ComponentType<SelectPopoverRendererProps>;\n getReferenceProps: (userProps?: React.HTMLProps<Element>) => Record<string, unknown>;\n getItemProps: (userProps?: React.HTMLProps<HTMLElement>) => Record<string, unknown>;\n}\n\nexport const useSelectPopover = (props: UseSelectPopoverProps): UseSelectPopoverResult => {\n const {\n placement = \"bottom\",\n fullWidth,\n minWidth,\n maxWidth,\n open,\n onOpenChange,\n listRef,\n activeIndex,\n onNavigate,\n loop = true,\n disabledIndices,\n } = props;\n\n const middleware = React.useMemo(() => {\n return [\n flip({ padding: 8 }),\n shift({ padding: 8 }),\n size({\n apply({ rects, elements }) {\n if (fullWidth) {\n elements.floating.style.width = `${ rects.reference.width }px`;\n }\n if (minWidth) {\n elements.floating.style.minWidth = `${ minWidth }px`;\n }\n if (maxWidth) {\n elements.floating.style.maxWidth = `${ maxWidth }px`;\n }\n },\n })\n ];\n }, [fullWidth, maxWidth, minWidth]);\n\n const { refs, floatingStyles, context, placement: resolvedPlacement } = useFloating({\n placement,\n open,\n onOpenChange,\n middleware,\n whileElementsMounted: autoUpdate,\n });\n\n const listNavigation = useListNavigation(context, {\n listRef,\n activeIndex,\n onNavigate,\n loop,\n virtual: true,\n focusItemOnOpen: false,\n disabledIndices,\n });\n\n const dismiss = useDismiss(context, {\n outsidePress: true,\n escapeKey: false,\n });\n\n const { getReferenceProps, getFloatingProps, getItemProps } = useInteractions([listNavigation, dismiss]);\n\n const latest = React.useRef<SelectPopoverBaseRefProps>({\n floatingStyles,\n setFloating: refs.setFloating,\n placement,\n getFloatingProps,\n });\n latest.current = {\n floatingStyles,\n setFloating: refs.setFloating,\n placement: resolvedPlacement,\n getFloatingProps,\n };\n\n const Popover = React.useMemo<React.ComponentType<SelectPopoverRendererProps>>(() => {\n const Renderer = (rendererProps: SelectPopoverRendererProps) => {\n const { floatingStyles, setFloating, placement, getFloatingProps } = latest.current;\n const { className, open, children } = rendererProps;\n return (\n <PopoverBase\n open={ open }\n className={ className }\n floatingStyles={ floatingStyles }\n setFloating={ setFloating }\n placement={ placement }\n floatingProps={ getFloatingProps() as React.HTMLProps<HTMLDivElement> }\n >\n { children }\n </PopoverBase>\n );\n };\n return React.memo(Renderer);\n }, []);\n\n return {\n anchorRef: refs.setReference,\n Popover,\n getReferenceProps,\n getItemProps,\n };\n};\n","import * as React from \"react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { IconChevronDown, IconX } from \"@tabler/icons-react\";\nimport { InputSelectOption } from \"@/components/inputs/InputSelectOption.tsx\";\nimport { InputSelectGroupHeader } from \"@/components/inputs/InputSelectGroupHeader.tsx\";\nimport { InputSelectDivider } from \"@/components/inputs/InputSelectDivider.tsx\";\nimport { isSelectOption, selectValueEquals, type Option, type SelectItem } from \"@/components/inputs/select-item.ts\";\nimport { useSelectPopover } from \"@/popover/use-select-popover.tsx\";\nimport { DropdownPanel } from \"@/components/dropdown-menu/DropdownPanel.tsx\";\nimport { InputLabel } from \"@/components/inputs/InputLabel.tsx\";\nimport { InputErrorIcon } from \"@/components/inputs/InputErrorIcon.tsx\";\nimport { InputIconButton } from \"@/components/inputs/InputIconButton.tsx\";\nimport { InputIconButtonTray } from \"@/components/inputs/InputIconButtonTray.tsx\";\nimport { InputDescription } from \"@/components/inputs/InputDescription.tsx\";\nimport { InputError } from \"@/components/inputs/InputError.tsx\";\nimport { useDismiss } from \"@/hooks/use-dismiss.ts\";\nimport { ControlSizeContext } from \"@/control-size/use-control-size.ts\";\nimport {\n sizeFontClasses,\n sizeHeightClasses,\n sizePaddingLeftClasses,\n sizePaddingRightWithTrayClasses,\n sizePaddingRightWithTrayTwoClasses,\n} from \"@/control-size/control-size.util.ts\";\n\n\nexport type Size = 'sm' | 'md' | 'lg';\n\nexport type InputSelectProps<T> = {\n name?: string;\n id?: string;\n className?: string;\n label?: string | React.ReactNode;\n description?: string | React.ReactNode;\n options: SelectItem<T>[];\n value: T | null;\n onChange: (value: T | null) => void;\n placeholder?: string;\n maxHeight?: number;\n error?: string | React.ReactNode;\n size?: Size;\n disabled?: boolean;\n clearable?: boolean;\n}\n\nexport type { Option, SelectGroupHeader, SelectDivider, SelectItem } from \"@/components/inputs/select-item.ts\";\n\n\nexport const InputSelect = <T, >(props: InputSelectProps<T>) => {\n\n const {\n className,\n label,\n description,\n options,\n onChange,\n value,\n placeholder,\n maxHeight = 300,\n error,\n size = 'md',\n disabled = false,\n clearable = false,\n } = props;\n\n const [ open, setOpen ] = useState(false);\n const [ activeIndex, setActiveIndex ] = useState<number | null>(null);\n const ref = React.useRef<HTMLDivElement>(null);\n const listRef = React.useRef<Array<HTMLElement | null>>([]);\n const selectedOption = options?.find((item): item is Option<T> => isSelectOption(item) && selectValueEquals(item.value, value));\n\n const disabledIndices = useMemo(\n () => options\n .map((item, i) => (!isSelectOption(item) || item.disabled) ? i : -1)\n .filter(i => i !== -1),\n [options],\n );\n\n useDismiss(open, () => setOpen(false));\n\n useEffect(() => {\n if (open) {\n ref.current?.focus({ preventScroll: true });\n const selectedIdx = options.findIndex(item => isSelectOption(item) && selectValueEquals(item.value, value));\n if (selectedIdx >= 0) {\n setActiveIndex(selectedIdx);\n } else {\n const firstSelectable = options.findIndex(item => isSelectOption(item) && !item.disabled);\n setActiveIndex(firstSelectable >= 0 ? firstSelectable : null);\n }\n } else {\n setActiveIndex(null);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ open ])\n\n const { anchorRef, Popover, getReferenceProps, getItemProps } = useSelectPopover({\n placement: 'bottom',\n fullWidth: true,\n minWidth: 200,\n open,\n onOpenChange: setOpen,\n listRef,\n activeIndex,\n onNavigate: setActiveIndex,\n disabledIndices,\n })\n\n const handleSelect = (idx: number) => {\n const item = options[idx];\n if (item && isSelectOption(item) && !item.disabled) {\n onChange(item.value);\n setOpen(false);\n }\n };\n\n return (\n <ControlSizeContext.Provider value={ size }>\n <div\n className={ classNames(\n 'flex flex-col',\n className\n ) }>\n <InputLabel>{ label }</InputLabel>\n\n <div className={ 'relative flex w-full flex-col' } ref={ anchorRef }>\n <div\n { ...getReferenceProps({\n ref,\n role: 'button',\n tabIndex: disabled ? -1 : 0,\n 'aria-disabled': disabled,\n onClick: () => { if (!disabled) setOpen(!open); },\n onKeyDown: (e) => {\n if (disabled) return;\n if (e.key === ' ') {\n e.preventDefault();\n setOpen(o => !o);\n } else if (e.key === 'Enter') {\n e.preventDefault();\n if (open && activeIndex != null) {\n handleSelect(activeIndex);\n } else {\n setOpen(true);\n }\n }\n },\n }) }\n className={ classNames(\n 'flex flex-row items-center border-[length:var(--border-width-input)] select-trigger transition-all duration-[var(--control-transition-duration)] rounded-[var(--border-radius-input)] shadow-[var(--shadow-control)] ring-0 focus:ring-[length:var(--control-ring-width)] focus:outline-none select-none font-[number:var(--font-weight-input-text)] font-[family-name:var(--font-family-base)]',\n sizeHeightClasses[size],\n sizeFontClasses[size],\n sizePaddingLeftClasses[size],\n clearable && value ? sizePaddingRightWithTrayTwoClasses[size] : sizePaddingRightWithTrayClasses[size],\n disabled ? 'select-trigger-disabled' : error && 'select-trigger-error',\n !disabled && open && 'ring-[length:var(--control-ring-width)]',\n ) }\n >\n { selectedOption && (\n <span className={ 'flex-1 min-w-0 break-all line-clamp-1 text-left' }>{ selectedOption.label }</span>\n ) }\n { !selectedOption && placeholder && (\n <span className={ 'flex-1 min-w-0 break-all line-clamp-1 text-left select-placeholder' }>{ placeholder }</span>\n ) }\n </div>\n <InputIconButtonTray>\n { !disabled && error && (\n <InputErrorIcon/>\n ) }\n { clearable && !!value && !disabled && (\n <InputIconButton Icon={ IconX } onClick={ () => onChange(null) }/>\n ) }\n <InputIconButton Icon={ IconChevronDown }/>\n </InputIconButtonTray>\n <Popover open={ open }>\n <DropdownPanel className={ '!p-0' } style={ { maxHeight: maxHeight } }>\n <div className={ 'flex flex-col p-2 gap-1' }>\n { options.map((item, i) => {\n if (!isSelectOption(item)) {\n if (item.kind === 'header') {\n return (\n <InputSelectGroupHeader\n key={ `header-${ i }` }\n ref={ (el) => { listRef.current[i] = el; } }\n >\n { item.label }\n </InputSelectGroupHeader>\n );\n }\n return (\n <InputSelectDivider\n key={ `divider-${ i }` }\n ref={ (el) => { listRef.current[i] = el; } }\n />\n );\n }\n const isSelected = selectValueEquals(item.value, value);\n return (\n <InputSelectOption\n key={ `option-${ i }` }\n { ...getItemProps({\n ref(el: HTMLElement | null) {\n listRef.current[i] = el;\n },\n }) }\n onClick={ () => handleSelect(i) }\n selected={ isSelected }\n active={ activeIndex === i }\n disabled={ item.disabled }\n >\n { item.label }\n </InputSelectOption>\n )\n }) }\n </div>\n </DropdownPanel>\n </Popover>\n </div>\n <InputDescription>{ description }</InputDescription>\n <InputError>{ error }</InputError>\n </div>\n </ControlSizeContext.Provider>\n );\n};\n","import * as React from \"react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { IconChevronDown, IconSearch, IconSearchOff, IconX } from \"@tabler/icons-react\";\nimport { InputSelectOption } from \"@/components/inputs/InputSelectOption.tsx\";\nimport { InputSelectGroupHeader } from \"@/components/inputs/InputSelectGroupHeader.tsx\";\nimport { InputSelectDivider } from \"@/components/inputs/InputSelectDivider.tsx\";\nimport { useSelectPopover } from \"@/popover/use-select-popover.tsx\";\nimport { DropdownPanel } from \"@/components/dropdown-menu/DropdownPanel.tsx\";\nimport { InputLabel } from \"@/components/inputs/InputLabel.tsx\";\nimport { InputErrorIcon } from \"@/components/inputs/InputErrorIcon.tsx\";\nimport { InputIconButton } from \"@/components/inputs/InputIconButton.tsx\";\nimport { InputIconButtonTray } from \"@/components/inputs/InputIconButtonTray.tsx\";\nimport { InputDescription } from \"@/components/inputs/InputDescription.tsx\";\nimport { InputError } from \"@/components/inputs/InputError.tsx\";\nimport { useDismiss } from \"@/hooks/use-dismiss.ts\";\nimport { ControlSizeContext } from \"@/control-size/use-control-size.ts\";\nimport { isSelectOption, selectValueEquals, type Option, type SelectItem } from \"@/components/inputs/select-item.ts\";\nexport type { Option } from \"@/components/inputs/select-item.ts\";\nimport {\n sizeFontClasses,\n sizeHeightClasses,\n sizePaddingLeftClasses,\n sizePaddingRightWithTrayClasses,\n sizePaddingRightWithTrayTwoClasses,\n} from \"@/control-size/control-size.util.ts\";\n\n\nexport type Size = 'sm' | 'md' | 'lg';\n\nexport type InputSelectSearchableProps<T> = {\n name?: string;\n id?: string;\n className?: string;\n label?: string | React.ReactNode;\n description?: string | React.ReactNode;\n options: SelectItem<T>[];\n onSearch: (search: string) => SelectItem<T>[];\n value: T | null;\n onChange: (value: T | null) => void;\n placeholder?: string;\n maxHeight?: number;\n error?: string | React.ReactNode;\n size?: Size;\n disabled?: boolean;\n clearable?: boolean;\n}\n\nexport const InputSelectSearchable = <T, >(props: InputSelectSearchableProps<T>) => {\n\n const {\n className,\n label,\n description,\n options,\n onChange,\n onSearch,\n value,\n placeholder,\n maxHeight = 300,\n error,\n size = 'md',\n disabled = false,\n clearable = false,\n } = props;\n\n const [ open, setOpen ] = useState(false);\n const [ filteredOptions, setFilteredOptions ] = useState<SelectItem<T>[]>(options);\n const [ search, setSearch ] = useState('');\n const [ activeIndex, setActiveIndex ] = useState<number | null>(null);\n\n const ref = React.useRef<HTMLDivElement>(null);\n const inputSearchRef = React.useRef<HTMLInputElement>(null);\n const listRef = React.useRef<Array<HTMLElement | null>>([]);\n\n const selectedOption = options?.find((item): item is Option<T> => isSelectOption(item) && selectValueEquals(item.value, value));\n const visibleOptions = useMemo(() => search !== '' ? filteredOptions : options, [search, filteredOptions, options]);\n\n const disabledIndices = useMemo(\n () => visibleOptions\n .map((item, i) => (!isSelectOption(item) || item.disabled) ? i : -1)\n .filter(i => i !== -1),\n [visibleOptions],\n );\n\n useDismiss(open, () => setOpen(false));\n\n useEffect(() => {\n setFilteredOptions(onSearch(search));\n }, [ search, options, onSearch ]);\n\n useEffect(() => {\n if (open) {\n setTimeout(() => inputSearchRef.current?.focus(), 100);\n const selectedIdx = options.findIndex(item => isSelectOption(item) && selectValueEquals(item.value, value));\n if (selectedIdx >= 0) {\n setActiveIndex(selectedIdx);\n } else {\n const firstSelectable = options.findIndex(item => isSelectOption(item) && !item.disabled);\n setActiveIndex(firstSelectable >= 0 ? firstSelectable : null);\n }\n } else {\n setActiveIndex(null);\n setSearch('');\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ open ])\n\n useEffect(() => {\n if (!open) return;\n const firstSelectable = visibleOptions.findIndex(item => isSelectOption(item) && !item.disabled);\n setActiveIndex(firstSelectable >= 0 ? firstSelectable : null);\n }, [ search, open, visibleOptions ]);\n\n const { anchorRef, Popover, getReferenceProps, getItemProps } = useSelectPopover({\n placement: 'bottom',\n fullWidth: true,\n minWidth: 200,\n open,\n onOpenChange: setOpen,\n listRef,\n activeIndex,\n onNavigate: setActiveIndex,\n disabledIndices,\n })\n\n const handleSelect = (idx: number) => {\n const item = visibleOptions[idx];\n if (item && isSelectOption(item) && !item.disabled) {\n onChange(item.value);\n setOpen(false);\n }\n };\n\n const hasSelectableVisible = visibleOptions.some(item => isSelectOption(item));\n\n return (\n <ControlSizeContext.Provider value={ size }>\n <div\n className={ classNames(\n 'flex flex-col',\n className\n ) }>\n <InputLabel>{ label }</InputLabel>\n\n <div className={ 'relative flex w-full flex-col' } ref={ anchorRef }>\n <div\n { ...getReferenceProps({\n ref,\n role: 'button',\n tabIndex: disabled ? -1 : 0,\n 'aria-disabled': disabled,\n onClick: () => { if (!disabled) setOpen(!open); },\n onKeyDown: (e) => {\n if (disabled) return;\n if (e.key === ' ') {\n e.preventDefault();\n setOpen(o => !o);\n } else if (e.key === 'Enter' && !open) {\n e.preventDefault();\n setOpen(true);\n }\n },\n }) }\n className={ classNames(\n 'flex flex-row items-center border-[length:var(--border-width-input)] select-trigger transition-all duration-[var(--control-transition-duration)] rounded-[var(--border-radius-input)] shadow-[var(--shadow-control)] ring-0 focus:ring-[length:var(--control-ring-width)] focus:outline-none select-none font-[number:var(--font-weight-input-text)] font-[family-name:var(--font-family-base)]',\n sizeHeightClasses[size],\n sizeFontClasses[size],\n sizePaddingLeftClasses[size],\n clearable && value ? sizePaddingRightWithTrayTwoClasses[size] : sizePaddingRightWithTrayClasses[size],\n disabled ? 'select-trigger-disabled' : error && 'select-trigger-error',\n !disabled && open && 'ring-[length:var(--control-ring-width)]',\n ) }\n >\n { selectedOption && (\n <span className={ 'flex-1 min-w-0 break-all line-clamp-1 text-left' }>{ selectedOption.label }</span>\n ) }\n { !selectedOption && placeholder && (\n <span className={ 'flex-1 min-w-0 break-all line-clamp-1 text-left select-placeholder' }>{ placeholder }</span>\n ) }\n </div>\n <InputIconButtonTray>\n { !disabled && error && (\n <InputErrorIcon/>\n ) }\n { clearable && !!value && !disabled && (\n <InputIconButton Icon={ IconX } onClick={ () => onChange(null) }/>\n ) }\n <InputIconButton Icon={ IconChevronDown }/>\n </InputIconButtonTray>\n <Popover open={ open }>\n <DropdownPanel className={ 'gap-0 !p-0' } style={ { maxHeight: maxHeight } }>\n <div className={ 'sticky top-0 border-b select-search-bar py-1 backdrop-blur-sm' }>\n <input\n ref={ inputSearchRef }\n type={ 'text' }\n placeholder={ 'Search' }\n value={ search }\n className={ 'appearance-none border-none w-full bg-transparent rounded- pl-10 transition-all duration-[var(--control-transition-duration)] focus:outline-none ring-0 placeholder:text-[var(--color-input-placeholder)]' }\n onChange={ (e) => setSearch(e.target.value) }\n onKeyDown={ (e) => {\n if (e.key === 'Enter' && activeIndex != null) {\n e.preventDefault();\n handleSelect(activeIndex);\n }\n } }\n />\n <IconSearch className={ 'absolute select-search-icon left-4 top-4 h-4 w-4' }/>\n </div>\n <div className={ 'flex flex-col gap-1 p-2' }>\n { search !== '' && !hasSelectableVisible && (\n <div className={ 'flex flex-col items-center justify-center py-6' }>\n <IconSearchOff className={ 'h-6 w-6 text-[var(--color-input-text)]' }/>\n </div>\n ) }\n { visibleOptions.map((item, i) => {\n if (!isSelectOption(item)) {\n if (item.kind === 'header') {\n return (\n <InputSelectGroupHeader\n key={ `header-${ i }` }\n ref={ (el) => { listRef.current[i] = el; } }\n >\n { item.label }\n </InputSelectGroupHeader>\n );\n }\n return (\n <InputSelectDivider\n key={ `divider-${ i }` }\n ref={ (el) => { listRef.current[i] = el; } }\n />\n );\n }\n const isSelected = selectValueEquals(item.value, value);\n return (\n <InputSelectOption\n key={ `option-${ i }` }\n { ...getItemProps({\n ref(el: HTMLElement | null) {\n listRef.current[i] = el;\n },\n }) }\n onClick={ () => handleSelect(i) }\n selected={ isSelected }\n active={ activeIndex === i }\n disabled={ item.disabled }\n >\n { item.label }\n </InputSelectOption>\n )\n }) }\n </div>\n </DropdownPanel>\n </Popover>\n </div>\n <InputDescription>{ description }</InputDescription>\n <InputError>{ error }</InputError>\n </div>\n </ControlSizeContext.Provider>\n );\n};\n","import { useState, useEffect } from \"react\";\n\nexport const useDebounce = <T>(value: T, delay: number): T => {\n const [debouncedValue, setDebouncedValue] = useState(value);\n\n useEffect(() => {\n const handler = setTimeout(() => {\n setDebouncedValue(value);\n }, delay);\n\n return () => {\n clearTimeout(handler);\n };\n }, [value, delay]);\n\n return debouncedValue;\n}","import * as React from \"react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { IconChevronDown, IconSearch, IconSearchOff, IconX } from \"@tabler/icons-react\";\nimport { InputSelectOption } from \"@/components/inputs/InputSelectOption.tsx\";\nimport { InputSelectGroupHeader } from \"@/components/inputs/InputSelectGroupHeader.tsx\";\nimport { InputSelectDivider } from \"@/components/inputs/InputSelectDivider.tsx\";\nimport { useSelectPopover } from \"@/popover/use-select-popover.tsx\";\nimport { DropdownPanel } from \"@/components/dropdown-menu/DropdownPanel.tsx\";\nimport { Spinner } from \"@/spinner/Spinner.tsx\";\nimport { useDebounce } from \"@/hooks/use-debounce.ts\";\nimport { InputIconButtonTray } from \"@/components/inputs/InputIconButtonTray.tsx\";\nimport { InputIconButton } from \"@/components/inputs/InputIconButton.tsx\";\nimport { InputDescription } from \"@/components/inputs/InputDescription.tsx\";\nimport { InputLabel } from \"@/components/inputs/InputLabel.tsx\";\nimport { InputErrorIcon } from \"@/components/inputs/InputErrorIcon.tsx\";\nimport { InputError } from \"@/components/inputs/InputError.tsx\";\nimport { useDismiss } from \"@/hooks/use-dismiss.ts\";\nimport { ControlSizeContext } from \"@/control-size/use-control-size.ts\";\nimport { isSelectOption, selectValueEquals, type Option, type SelectItem } from \"@/components/inputs/select-item.ts\";\nexport type { Option } from \"@/components/inputs/select-item.ts\";\nimport {\n sizeFontClasses,\n sizeHeightClasses,\n sizePaddingLeftClasses,\n sizePaddingRightWithTrayClasses,\n sizePaddingRightWithTrayTwoClasses,\n} from \"@/control-size/control-size.util.ts\";\n\n\nexport type Size = 'sm' | 'md' | 'lg';\n\nexport type InputSelectSearchableAsyncProps<T> = {\n name?: string;\n id?: string;\n className?: string;\n label?: string | React.ReactNode;\n description?: string | React.ReactNode;\n fetchOptionsByQuery: (search: string) => Promise<SelectItem<T>[]>;\n fetchOptionByValue: (value: T) => Promise<Option<T>>;\n onSearchDebounceMs?: number;\n value: T | null;\n onChange: (value: T | null) => void;\n placeholder?: string;\n maxHeight?: number;\n error?: string | React.ReactNode;\n size?: Size;\n disabled?: boolean;\n clearable?: boolean;\n}\n\nexport const InputSelectSearchableAsync = <T, >(props: InputSelectSearchableAsyncProps<T>) => {\n\n const {\n className,\n label,\n description,\n onChange,\n fetchOptionsByQuery,\n fetchOptionByValue,\n onSearchDebounceMs = 300,\n value,\n placeholder,\n maxHeight = 300,\n error,\n size = 'md',\n disabled = false,\n clearable = false,\n } = props;\n\n const [ open, setOpen ] = useState(false);\n const ref = React.useRef<HTMLDivElement>(null);\n const [ search, setSearch ] = useState('');\n const [ options, setOptions ] = useState<SelectItem<T>[]>([]);\n const [ selectedOption, setSelectedOption ] = useState<Option<T> | null>(null);\n const inputSearchRef = React.useRef<HTMLInputElement>(null);\n const [ isFetching, setIsFetching ] = useState(false);\n const [ isFetchingSelectedOption, setIsFetchingSelectedOption ] = useState(false);\n const [ activeIndex, setActiveIndex ] = useState<number | null>(null);\n const listRef = React.useRef<Array<HTMLElement | null>>([]);\n\n const disabledIndices = useMemo(\n () => options\n .map((item, i) => (!isSelectOption(item) || item.disabled) ? i : -1)\n .filter(i => i !== -1),\n [options],\n );\n\n useDismiss(open, () => setOpen(false));\n\n const debouncedQuery = useDebounce(search, onSearchDebounceMs); // wait 500ms\n\n useEffect(() => {\n const handleFetchOptionsByQuery = async () => {\n setIsFetching(true);\n const results = await fetchOptionsByQuery(debouncedQuery);\n setOptions(results);\n setIsFetching(false);\n };\n\n handleFetchOptionsByQuery();\n }, [debouncedQuery, fetchOptionsByQuery]);\n\n useEffect(() => {\n if (value === null || value === undefined) {\n setSelectedOption(null);\n return;\n }\n\n const selectedFromOptions = options?.find((item): item is Option<T> => isSelectOption(item) && selectValueEquals(item.value, value));\n\n if (!selectedFromOptions) {\n const handleFetchOptionByValue = async () => {\n setIsFetchingSelectedOption(true);\n const result = await fetchOptionByValue(value);\n setSelectedOption(result);\n setIsFetchingSelectedOption(false);\n }\n handleFetchOptionByValue();\n } else {\n setSelectedOption(selectedFromOptions);\n }\n }, [fetchOptionByValue, options, value]);\n\n useEffect(() => {\n if (open) {\n setTimeout(() => inputSearchRef.current?.focus(), 100);\n } else {\n setActiveIndex(null);\n setSearch('');\n }\n }, [ open ])\n\n useEffect(() => {\n if (!open) return;\n const firstSelectable = options.findIndex(item => isSelectOption(item) && !item.disabled);\n setActiveIndex(firstSelectable >= 0 ? firstSelectable : null);\n }, [ options, open ]);\n\n const { anchorRef, Popover, getReferenceProps, getItemProps } = useSelectPopover({\n placement: 'bottom',\n fullWidth: true,\n minWidth: 200,\n open,\n onOpenChange: setOpen,\n listRef,\n activeIndex,\n onNavigate: setActiveIndex,\n disabledIndices,\n })\n\n const handleSelect = (idx: number) => {\n const item = options[idx];\n if (item && isSelectOption(item) && !item.disabled) {\n onChange(item.value);\n setOpen(false);\n }\n };\n\n const hasSelectableVisible = options.some(item => isSelectOption(item));\n\n return (\n <ControlSizeContext.Provider value={ size }>\n <div\n className={ classNames(\n 'flex flex-col',\n className\n ) }>\n <InputLabel>{ label }</InputLabel>\n\n <div className={ 'relative flex w-full flex-col' } ref={ anchorRef }>\n <div\n { ...getReferenceProps({\n ref,\n role: 'button',\n tabIndex: disabled ? -1 : 0,\n 'aria-disabled': disabled,\n onClick: () => { if (!disabled) setOpen(!open); },\n onKeyDown: (e) => {\n if (disabled) return;\n if (e.key === ' ') {\n e.preventDefault();\n setOpen(o => !o);\n } else if (e.key === 'Enter' && !open) {\n e.preventDefault();\n setOpen(true);\n }\n },\n }) }\n className={ classNames(\n 'flex flex-row items-center border-[length:var(--border-width-input)] select-trigger transition-all duration-[var(--control-transition-duration)] rounded-[var(--border-radius-input)] shadow-[var(--shadow-control)] ring-0 focus:ring-[length:var(--control-ring-width)] focus:outline-none select-none font-[number:var(--font-weight-input-text)] font-[family-name:var(--font-family-base)]',\n sizeHeightClasses[size],\n sizeFontClasses[size],\n sizePaddingLeftClasses[size],\n clearable && value ? sizePaddingRightWithTrayTwoClasses[size] : sizePaddingRightWithTrayClasses[size],\n disabled ? 'select-trigger-disabled' : error && 'select-trigger-error',\n !disabled && open && 'ring-[length:var(--control-ring-width)]',\n ) }\n >\n { !isFetchingSelectedOption && selectedOption && (\n <span className={ 'flex-1 min-w-0 break-all line-clamp-1 text-left' }>{ selectedOption.label }</span>\n ) }\n { !isFetchingSelectedOption && !selectedOption && placeholder && (\n <span className={ 'flex-1 min-w-0 break-all line-clamp-1 text-left select-placeholder' }>{ placeholder }</span>\n ) }\n { isFetchingSelectedOption && (\n <Spinner className={ 'h-4 w-4 text-[var(--color-input-text)]' }/>\n ) }\n </div>\n <InputIconButtonTray>\n { !disabled && error && (\n <InputErrorIcon/>\n ) }\n { clearable && !!value && !disabled && (\n <InputIconButton Icon={ IconX } onClick={ () => onChange(null) }/>\n ) }\n <InputIconButton Icon={ IconChevronDown }/>\n </InputIconButtonTray>\n <Popover open={ open }>\n <DropdownPanel className={ 'gap-0 !p-0' } style={ { maxHeight: maxHeight } }>\n <div className={ 'sticky top-0 border-b select-search-bar py-1 backdrop-blur-sm' }>\n <input\n ref={ inputSearchRef }\n type={ 'text' }\n placeholder={ 'Search' }\n value={ search }\n className={ 'appearance-none border-none w-full bg-transparent rounded- pl-10 transition-all duration-[var(--control-transition-duration)] focus:outline-none ring-0 placeholder:text-[var(--color-input-placeholder)]' }\n onChange={ (e) => setSearch(e.target.value) }\n onKeyDown={ (e) => {\n if (e.key === 'Enter' && activeIndex != null) {\n e.preventDefault();\n handleSelect(activeIndex);\n }\n } }\n />\n <IconSearch className={ 'absolute select-search-icon left-4 top-4 h-4 w-4' }/>\n </div>\n <div className={ 'flex flex-col gap-1 p-2' }>\n { !isFetching && !hasSelectableVisible && (\n <div className={ 'flex flex-col items-center justify-center py-6' }>\n <IconSearchOff className={ 'h-6 w-6 text-[var(--color-input-text)]' }/>\n </div>\n ) }\n { isFetching && (\n <div className={ 'flex flex-col items-center justify-center py-6' }>\n <Spinner className={ 'h-6 w-6 text-[var(--color-input-text)]' }/>\n </div>\n ) }\n { !isFetching && options.map((item, i) => {\n if (!isSelectOption(item)) {\n if (item.kind === 'header') {\n return (\n <InputSelectGroupHeader\n key={ `header-${ i }` }\n ref={ (el) => { listRef.current[i] = el; } }\n >\n { item.label }\n </InputSelectGroupHeader>\n );\n }\n return (\n <InputSelectDivider\n key={ `divider-${ i }` }\n ref={ (el) => { listRef.current[i] = el; } }\n />\n );\n }\n const isSelected = selectValueEquals(item.value, value);\n return (\n <InputSelectOption\n key={ `option-${ i }` }\n { ...getItemProps({\n ref(el: HTMLElement | null) {\n listRef.current[i] = el;\n },\n }) }\n onClick={ () => handleSelect(i) }\n selected={ isSelected }\n active={ activeIndex === i }\n disabled={ item.disabled }\n >\n { item.label }\n </InputSelectOption>\n )\n }) }\n </div>\n </DropdownPanel>\n </Popover>\n </div>\n <InputDescription>{ description }</InputDescription>\n <InputError>{ error }</InputError>\n </div>\n </ControlSizeContext.Provider>\n );\n};\n","export const BadgeColor = {\n red: 'bg-red-100 text-red-700 ring-red-200 dark:bg-red-950 dark:text-red-300 dark:ring-red-800',\n orange: 'bg-orange-100 text-orange-700 ring-orange-200 dark:bg-orange-950 dark:text-orange-300 dark:ring-orange-800',\n amber: 'bg-amber-100 text-amber-700 ring-amber-200 dark:bg-amber-950 dark:text-amber-300 dark:ring-amber-800',\n yellow: 'bg-yellow-100 text-yellow-700 ring-yellow-200 dark:bg-yellow-950 dark:text-yellow-300 dark:ring-yellow-800',\n lime: 'bg-lime-100 text-lime-700 ring-lime-200 dark:bg-lime-950 dark:text-lime-300 dark:ring-lime-800',\n green: 'bg-green-100 text-green-700 ring-green-200 dark:bg-green-950 dark:text-green-300 dark:ring-green-800',\n emerald: 'bg-emerald-100 text-emerald-700 ring-emerald-200 dark:bg-emerald-950 dark:text-emerald-300 dark:ring-emerald-800',\n teal: 'bg-teal-100 text-teal-700 ring-teal-200 dark:bg-teal-950 dark:text-teal-300 dark:ring-teal-800',\n cyan: 'bg-cyan-100 text-cyan-700 ring-cyan-200 dark:bg-cyan-950 dark:text-cyan-300 dark:ring-cyan-800',\n sky: 'bg-sky-100 text-sky-700 ring-sky-200 dark:bg-sky-950 dark:text-sky-300 dark:ring-sky-800',\n blue: 'bg-blue-100 text-blue-700 ring-blue-200 dark:bg-blue-950 dark:text-blue-300 dark:ring-blue-800',\n indigo: 'bg-indigo-100 text-indigo-700 ring-indigo-200 dark:bg-indigo-950 dark:text-indigo-300 dark:ring-indigo-800',\n violet: 'bg-violet-100 text-violet-700 ring-violet-200 dark:bg-violet-950 dark:text-violet-300 dark:ring-violet-800',\n purple: 'bg-purple-100 text-purple-700 ring-purple-200 dark:bg-purple-950 dark:text-purple-300 dark:ring-purple-800',\n fuchsia: 'bg-fuchsia-100 text-fuchsia-700 ring-fuchsia-200 dark:bg-fuchsia-950 dark:text-fuchsia-300 dark:ring-fuchsia-800',\n pink: 'bg-pink-100 text-pink-700 ring-pink-200 dark:bg-pink-950 dark:text-pink-300 dark:ring-pink-800',\n rose: 'bg-rose-100 text-rose-700 ring-rose-200 dark:bg-rose-950 dark:text-rose-300 dark:ring-rose-800',\n slate: 'bg-slate-100 text-slate-700 ring-slate-200 dark:bg-slate-950 dark:text-slate-300 dark:ring-slate-800',\n gray: 'bg-gray-100 text-gray-700 ring-gray-200 dark:bg-gray-950 dark:text-gray-300 dark:ring-gray-800',\n zinc: 'bg-zinc-100 text-zinc-700 ring-zinc-200 dark:bg-zinc-950 dark:text-zinc-300 dark:ring-zinc-800',\n neutral: 'bg-neutral-100 text-neutral-700 ring-neutral-200 dark:bg-neutral-950 dark:text-neutral-300 dark:ring-neutral-800',\n stone: 'bg-stone-100 text-stone-700 ring-stone-200 dark:bg-stone-950 dark:text-stone-300 dark:ring-stone-800',\n white: 'bg-[var(--color-badge-white-bg)] text-[var(--color-badge-white-text)] ring-[var(--color-badge-white-ring)]',\n black: 'bg-[var(--color-badge-black-bg)] text-[var(--color-badge-black-text)] ring-[var(--color-badge-black-ring)]',\n} as const;\n\nexport type BadgeColorKey = keyof typeof BadgeColor;\n","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { BadgeColor, type BadgeColorKey } from \"./BadgeColors.tsx\";\nimport { IconX, type TablerIcon } from \"@tabler/icons-react\";\n\nexport type BadgeProps = {\n className?: string;\n children?: React.ReactNode;\n color?: BadgeColorKey;\n onClick?: () => void;\n showCloseIcon?: boolean;\n Icon?: TablerIcon;\n}\n\nexport const Badge = React.forwardRef<HTMLDivElement, BadgeProps>((props: BadgeProps, ref) => {\n const {\n className,\n children,\n onClick,\n showCloseIcon,\n Icon,\n color = 'gray',\n } = props;\n const classes = classNames(\n 'inline-flex align-top items-center gap-2 px-3 h-7 rounded-[var(--border-radius-badge)] font-[number:var(--font-weight-badge)] font-[family-name:var(--font-family-base)]',\n BadgeColor[color],\n className\n )\n if (onClick) {\n return (\n <div ref={ ref }>\n <button\n className={ classNames('cursor-pointer ring-0 hover:ring-[length:var(--control-ring-width)] active:ring-[length:var(--control-ring-width-active)] transition-all duration-[var(--control-transition-duration-fast)] select-none focus:outline-none focus:ring-[length:var(--control-ring-width)]', classes) }\n onClick={ onClick }\n >\n { Icon && <Icon className={ 'h-4 w-4 shrink-0' }/> }\n <div className={ 'break-all line-clamp-1 text-left' }>{ children }</div>\n { showCloseIcon && (\n <IconX\n className={ 'h-4 w-4 shrink-0' }\n />\n ) }\n </button>\n </div>\n );\n }\n return (\n <div className={ classes } ref={ ref }>\n { Icon && <Icon className={ 'h-4 w-4 shrink-0' }/> }\n <div className={ 'break-all line-clamp-1 text-left' }>{ children }</div>\n </div>\n );\n});","import { type RefObject, useLayoutEffect, useState } from \"react\";\n\ntype UseOverflowFitOptions = {\n enabled: boolean;\n triggerRef: RefObject<HTMLElement | null>;\n measureRef: RefObject<HTMLElement | null>;\n trayRef?: RefObject<HTMLElement | null>;\n itemCount: number;\n deps?: ReadonlyArray<unknown>;\n gap?: number;\n};\n\n/* Computes how many of `itemCount` items fit on a single line inside the\n * trigger element, reserving room for a trailing \"+N more\" indicator.\n *\n * The measure layer must render the items in order, followed by the\n * worst-case \"+N more\" element as its last child. The hook reads each\n * child's width via offsetWidth and ignores layout outside the measure\n * subtree, so the measure layer can be visibility:hidden.\n */\nexport function useOverflowFit(options: UseOverflowFitOptions): number {\n const {\n enabled,\n triggerRef,\n measureRef,\n trayRef,\n itemCount,\n deps = [],\n gap = 4,\n } = options;\n\n const [ visibleCount, setVisibleCount ] = useState(0);\n\n useLayoutEffect(() => {\n if (!enabled) return;\n const trigger = triggerRef.current;\n const measure = measureRef.current;\n if (!trigger || !measure) return;\n\n const compute = () => {\n if (itemCount === 0) {\n setVisibleCount(0);\n return;\n }\n if (itemCount === 1) {\n setVisibleCount(1);\n return;\n }\n\n const cs = window.getComputedStyle(trigger);\n const paddingLeft = parseFloat(cs.paddingLeft || '0');\n const triggerRect = trigger.getBoundingClientRect();\n const contentLeft = triggerRect.left + paddingLeft;\n\n let contentRight = triggerRect.right - parseFloat(cs.paddingRight || '0');\n const trayEl = trayRef?.current;\n if (trayEl) {\n const trayRect = trayEl.getBoundingClientRect();\n if (trayRect.width > 0) {\n contentRight = Math.min(contentRight, trayRect.left - gap);\n }\n }\n const available = Math.max(0, contentRight - contentLeft);\n\n const children = Array.from(measure.children) as HTMLElement[];\n if (children.length < itemCount + 1) return;\n\n let totalAll = 0;\n for (let i = 0; i < itemCount; i++) {\n totalAll += children[i].offsetWidth + (i > 0 ? gap : 0);\n }\n if (totalAll <= available) {\n setVisibleCount(itemCount);\n return;\n }\n\n const moreWidth = children[itemCount].offsetWidth;\n let used = 0;\n let count = 0;\n for (let i = 0; i < itemCount; i++) {\n const w = children[i].offsetWidth;\n const next = used + w + (i > 0 ? gap : 0);\n if (next + moreWidth + gap > available) break;\n used = next;\n count++;\n }\n setVisibleCount(Math.max(1, count));\n };\n\n const ro = new ResizeObserver(compute);\n ro.observe(trigger);\n if (trayRef?.current) ro.observe(trayRef.current);\n compute();\n return () => ro.disconnect();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ enabled, itemCount, ...deps ]);\n\n return visibleCount;\n}\n","import * as React from \"react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { IconChevronDown, IconSearch, IconSearchOff, IconX } from \"@tabler/icons-react\";\nimport { Badge } from \"@/components/Badge.tsx\";\nimport { type BadgeColorKey } from \"@/components/BadgeColors.tsx\";\nimport { InputSelectOption } from \"@/components/inputs/InputSelectOption.tsx\";\nimport { InputSelectGroupHeader } from \"@/components/inputs/InputSelectGroupHeader.tsx\";\nimport { InputSelectDivider } from \"@/components/inputs/InputSelectDivider.tsx\";\nimport { useSelectPopover } from \"@/popover/use-select-popover.tsx\";\nimport { DropdownPanel } from \"@/components/dropdown-menu/DropdownPanel.tsx\";\nimport { InputLabel } from \"@/components/inputs/InputLabel.tsx\";\nimport { InputErrorIcon } from \"@/components/inputs/InputErrorIcon.tsx\";\nimport { InputIconButton } from \"@/components/inputs/InputIconButton.tsx\";\nimport { InputIconButtonTray } from \"@/components/inputs/InputIconButtonTray.tsx\";\nimport { InputDescription } from \"@/components/inputs/InputDescription.tsx\";\nimport { InputError } from \"@/components/inputs/InputError.tsx\";\nimport { useDismiss } from \"@/hooks/use-dismiss.ts\";\nimport { useOverflowFit } from \"@/hooks/use-overflow-fit.ts\";\nimport { ControlSizeContext } from \"@/control-size/use-control-size.ts\";\nimport { isSelectOption, selectValueEquals, type Option, type SelectItem } from \"@/components/inputs/select-item.ts\";\nimport {\n sizeFontClasses,\n sizeHeightClasses,\n sizeMinHeightClasses,\n sizePaddingLeftClasses,\n sizePaddingRightWithTrayClasses,\n sizePaddingRightWithTrayTwoClasses,\n} from \"@/control-size/control-size.util.ts\";\n\n\nexport type Size = 'sm' | 'md' | 'lg';\n\nexport type InputSelectMultipleProps<T> = {\n name?: string;\n id?: string;\n className?: string;\n label?: string | React.ReactNode;\n description?: string | React.ReactNode;\n options: SelectItem<T>[];\n onSearch?: (search: string) => SelectItem<T>[];\n value: T[];\n onChange: (value: T[]) => void;\n placeholder?: string;\n maxHeight?: number;\n error?: string | React.ReactNode;\n size?: Size;\n singleLine?: boolean;\n color?: BadgeColorKey;\n disabled?: boolean;\n clearable?: boolean;\n}\n\nexport const InputSelectMultiple = <T, >(props: InputSelectMultipleProps<T>) => {\n\n const {\n className,\n label,\n description,\n options,\n onChange,\n onSearch,\n value,\n placeholder,\n maxHeight = 300,\n error,\n size = 'md',\n singleLine = false,\n color = 'blue',\n disabled = false,\n clearable = false,\n } = props;\n\n const [ open, setOpen ] = useState(false);\n const [ filteredOptions, setFilteredOptions ] = useState<SelectItem<T>[]>(options);\n const [ search, setSearch ] = useState('');\n const [ activeIndex, setActiveIndex ] = useState<number | null>(null);\n\n const ref = React.useRef<HTMLDivElement>(null);\n const inputSearchRef = React.useRef<HTMLInputElement>(null);\n const listRef = React.useRef<Array<HTMLElement | null>>([]);\n const measureRef = React.useRef<HTMLDivElement>(null);\n const trayRef = React.useRef<HTMLDivElement>(null);\n\n const selectedOptions = useMemo(\n () => value\n .map(v => options.find((item): item is Option<T> => isSelectOption(item) && selectValueEquals(item.value, v)))\n .filter((item): item is Option<T> => item !== undefined),\n [ value, options ],\n );\n\n const defaultSearch = (q: string): SelectItem<T>[] => {\n if (q === '') return options;\n const lower = q.toLowerCase();\n return options.filter(item => {\n if (!isSelectOption(item)) return true;\n if (typeof item.label === 'string') {\n return item.label.toLowerCase().includes(lower);\n }\n return true;\n });\n };\n\n const visibleOptions = useMemo(\n () => search !== '' ? filteredOptions : options,\n [ search, filteredOptions, options ],\n );\n\n const disabledIndices = useMemo(\n () => visibleOptions\n .map((item, i) => (!isSelectOption(item) || item.disabled) ? i : -1)\n .filter(i => i !== -1),\n [ visibleOptions ],\n );\n\n useDismiss(open, () => setOpen(false));\n\n useEffect(() => {\n const fn = onSearch ?? defaultSearch;\n setFilteredOptions(fn(search));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ search, options, onSearch ]);\n\n useEffect(() => {\n if (open) {\n setTimeout(() => inputSearchRef.current?.focus(), 100);\n const firstSelectable = options.findIndex(item => isSelectOption(item) && !item.disabled);\n setActiveIndex(firstSelectable >= 0 ? firstSelectable : null);\n } else {\n setActiveIndex(null);\n setSearch('');\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ open ]);\n\n useEffect(() => {\n if (!open) return;\n const firstSelectable = visibleOptions.findIndex(item => isSelectOption(item) && !item.disabled);\n setActiveIndex(firstSelectable >= 0 ? firstSelectable : null);\n }, [ search, open, visibleOptions ]);\n\n const visibleCount = useOverflowFit({\n enabled: singleLine,\n triggerRef: ref,\n measureRef,\n trayRef,\n itemCount: selectedOptions.length,\n deps: [ selectedOptions, error ],\n });\n\n const { anchorRef, Popover, getReferenceProps, getItemProps } = useSelectPopover({\n placement: 'bottom',\n fullWidth: true,\n minWidth: 200,\n open,\n onOpenChange: setOpen,\n listRef,\n activeIndex,\n onNavigate: setActiveIndex,\n disabledIndices,\n });\n\n const toggleValue = (v: T) => {\n if (value.some(item => selectValueEquals(item, v))) {\n onChange(value.filter(item => !selectValueEquals(item, v)));\n } else {\n onChange([ ...value, v ]);\n }\n };\n\n const handleSelect = (idx: number) => {\n const item = visibleOptions[idx];\n if (item && isSelectOption(item) && !item.disabled) {\n toggleValue(item.value);\n }\n };\n\n const hasSelectableVisible = visibleOptions.some(item => isSelectOption(item));\n const hasSelection = value.length > 0;\n\n const displayedCount = singleLine ? visibleCount : selectedOptions.length;\n const visibleBadges = selectedOptions.slice(0, displayedCount);\n const hiddenCount = selectedOptions.length - displayedCount;\n\n return (\n <ControlSizeContext.Provider value={ size }>\n <div\n className={ classNames(\n 'flex flex-col',\n className\n ) }>\n <InputLabel>{ label }</InputLabel>\n\n <div className={ 'relative flex w-full flex-col' } ref={ anchorRef }>\n <div\n { ...getReferenceProps({\n ref,\n role: 'button',\n tabIndex: disabled ? -1 : 0,\n 'aria-disabled': disabled,\n onClick: () => { if (!disabled) setOpen(!open); },\n onKeyDown: (e) => {\n if (disabled) return;\n if (e.key === ' ') {\n e.preventDefault();\n setOpen(o => !o);\n } else if (e.key === 'Enter' && !open) {\n e.preventDefault();\n setOpen(true);\n } else if (e.key === 'Backspace' && !open && hasSelection) {\n e.preventDefault();\n onChange(value.slice(0, -1));\n }\n },\n }) }\n className={ classNames(\n 'flex flex-row items-center gap-1 border-[length:var(--border-width-input)] select-trigger transition-all duration-[var(--control-transition-duration)] rounded-[var(--border-radius-input)] shadow-[var(--shadow-control)] ring-0 focus:ring-[length:var(--control-ring-width)] focus:outline-none select-none font-[number:var(--font-weight-input-text)] font-[family-name:var(--font-family-base)]',\n singleLine && classNames('flex-nowrap overflow-hidden', sizeHeightClasses[size]),\n !singleLine && classNames('flex-wrap py-1.5', sizeMinHeightClasses[size]),\n sizeFontClasses[size],\n sizePaddingLeftClasses[size],\n clearable && hasSelection ? sizePaddingRightWithTrayTwoClasses[size] : sizePaddingRightWithTrayClasses[size],\n disabled ? 'select-trigger-disabled' : error && 'select-trigger-error',\n !disabled && open && 'ring-[length:var(--control-ring-width)]',\n ) }\n >\n { hasSelection && visibleBadges.map((opt, i) => (\n <Badge\n key={ `badge-${ i }` }\n color={ color }\n className={ classNames(\n singleLine && displayedCount > 1 && 'shrink-0',\n (!singleLine || displayedCount === 1) && 'max-w-full min-w-0',\n ) }\n >\n { opt.label }\n </Badge>\n )) }\n { hasSelection && hiddenCount > 0 && (\n <span className={ 'shrink-0 text-sm font-[number:var(--font-weight-input-option-label)] select-placeholder px-1' }>\n +{ hiddenCount } more\n </span>\n ) }\n { !hasSelection && placeholder && (\n <span className={ 'select-placeholder' }>{ placeholder }</span>\n ) }\n </div>\n { singleLine && (\n <div\n ref={ measureRef }\n aria-hidden\n className={ 'absolute top-0 left-0 invisible pointer-events-none flex flex-row flex-nowrap items-center gap-1 w-max' }\n >\n { selectedOptions.map((opt, i) => (\n <Badge key={ `measure-${ i }` } color={ color }>\n { opt.label }\n </Badge>\n )) }\n { selectedOptions.length > 0 && (\n <span className={ 'text-sm font-[number:var(--font-weight-input-option-label)] px-1' }>\n +{ selectedOptions.length } more\n </span>\n ) }\n </div>\n ) }\n <InputIconButtonTray ref={ trayRef }>\n { !disabled && error && (\n <InputErrorIcon/>\n ) }\n { clearable && hasSelection && !disabled && (\n <InputIconButton Icon={ IconX } onClick={ () => onChange([]) }/>\n ) }\n <InputIconButton Icon={ IconChevronDown }/>\n </InputIconButtonTray>\n <Popover open={ open }>\n <DropdownPanel className={ 'gap-0 !p-0' } style={ { maxHeight: maxHeight } }>\n <div className={ 'sticky top-0 border-b select-search-bar py-1 backdrop-blur-sm' }>\n <input\n ref={ inputSearchRef }\n type={ 'text' }\n placeholder={ 'Search' }\n value={ search }\n className={ 'appearance-none border-none w-full bg-transparent rounded- pl-10 transition-all duration-[var(--control-transition-duration)] focus:outline-none ring-0 placeholder:text-[var(--color-input-placeholder)]' }\n onChange={ (e) => setSearch(e.target.value) }\n onKeyDown={ (e) => {\n if (e.key === 'Enter' && activeIndex != null) {\n e.preventDefault();\n handleSelect(activeIndex);\n } else if (e.key === 'Backspace' && search === '' && hasSelection) {\n e.preventDefault();\n onChange(value.slice(0, -1));\n }\n } }\n />\n <IconSearch className={ 'absolute select-search-icon left-4 top-4 h-4 w-4' }/>\n </div>\n <div className={ 'flex flex-col gap-1 p-2' }>\n { search !== '' && !hasSelectableVisible && (\n <div className={ 'flex flex-col items-center justify-center py-6' }>\n <IconSearchOff className={ 'h-6 w-6 text-[var(--color-input-text)]' }/>\n </div>\n ) }\n { visibleOptions.map((item, i) => {\n if (!isSelectOption(item)) {\n if (item.kind === 'header') {\n return (\n <InputSelectGroupHeader\n key={ `header-${ i }` }\n ref={ (el) => { listRef.current[i] = el; } }\n >\n { item.label }\n </InputSelectGroupHeader>\n );\n }\n return (\n <InputSelectDivider\n key={ `divider-${ i }` }\n ref={ (el) => { listRef.current[i] = el; } }\n />\n );\n }\n const isSelected = value.some(v => selectValueEquals(v, item.value));\n return (\n <InputSelectOption\n key={ `option-${ i }` }\n { ...getItemProps({\n ref(el: HTMLElement | null) {\n listRef.current[i] = el;\n },\n }) }\n onClick={ () => handleSelect(i) }\n selected={ isSelected }\n active={ activeIndex === i }\n disabled={ item.disabled }\n >\n { item.label }\n </InputSelectOption>\n );\n }) }\n </div>\n </DropdownPanel>\n </Popover>\n </div>\n <InputDescription>{ description }</InputDescription>\n <InputError>{ error }</InputError>\n </div>\n </ControlSizeContext.Provider>\n );\n};\n","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\n\n\nexport type PanelProps = React.HTMLAttributes<HTMLDivElement> & {\n children?: React.ReactNode;\n}\n\nexport const Panel = React.forwardRef<HTMLDivElement, PanelProps>((props, ref) => {\n\n const {\n className,\n children,\n ...rest\n } = props;\n\n return (\n <div\n ref={ ref }\n className={ classNames(\n 'flex flex-col gap-6 border-[length:var(--border-width-input)] panel-base rounded-[var(--border-radius-panel)] shadow-[var(--shadow-control)] px-6 py-6',\n className\n ) }\n { ...rest }\n >\n { children }\n </div>\n );\n});","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\n\n\nexport type PanelStackProps = React.HTMLAttributes<HTMLDivElement> & {\n children?: React.ReactNode;\n}\n\nexport const PanelStack = React.forwardRef<HTMLDivElement, PanelStackProps>((props, ref) => {\n\n const {\n className,\n children,\n ...rest\n } = props;\n\n return (\n <div\n ref={ ref }\n className={ classNames(\n 'flex flex-col gap-1 border-[length:var(--border-width-input)] panel-base rounded-[var(--border-radius-panel)] shadow-[var(--shadow-control)] p-2',\n className\n ) }\n { ...rest }\n >\n { children }\n </div>\n );\n});\n","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\n\n\nexport type PanelFieldOrientation = 'vertical' | 'horizontal';\n\nexport type PanelFieldProps = React.HTMLAttributes<HTMLDivElement> & {\n label?: string | React.ReactNode;\n children?: React.ReactNode;\n orientation?: PanelFieldOrientation;\n}\n\nconst labelClasses: string = 'input-description text-[length:var(--font-size-description)] font-[number:var(--font-weight-panel-field)]';\n\nexport const PanelField = (props: PanelFieldProps) => {\n\n const {\n className,\n label,\n children,\n orientation = 'vertical',\n ...rest\n } = props;\n\n if (orientation === 'horizontal') {\n return (\n <div\n className={ classNames(\n 'flex flex-row items-center gap-3 px-3 py-2',\n className\n ) }\n { ...rest }\n >\n <div className={ classNames(labelClasses, 'w-1/2 line-clamp-1 break-all') }>{ label }</div>\n <div className={ 'w-1/2 line-clamp-1 break-all' }>{ children }</div>\n </div>\n );\n }\n\n return (\n <div\n className={ classNames(\n 'flex flex-col gap-1 px-3 py-2',\n className\n ) }\n { ...rest }\n >\n { label && <div className={ labelClasses }>{ label }</div> }\n <div>{ children }</div>\n </div>\n );\n};\n","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport {\n IconAlertTriangleFilled,\n IconChevronRight,\n IconCircleCheckFilled,\n IconExclamationCircleFilled,\n IconInfoCircleFilled,\n type TablerIcon,\n} from \"@tabler/icons-react\";\n\n\nexport type PanelLinkStatus = 'error' | 'warning' | 'success' | 'info';\n\nconst statusIcons: Record<PanelLinkStatus, TablerIcon> = {\n error: IconExclamationCircleFilled,\n warning: IconAlertTriangleFilled,\n success: IconCircleCheckFilled,\n info: IconInfoCircleFilled,\n};\n\nconst statusColorClasses: Record<PanelLinkStatus, string> = {\n error: 'text-[var(--color-status-error)]',\n warning: 'text-[var(--color-status-warning)]',\n success: 'text-[var(--color-status-success)]',\n info: 'text-[var(--color-status-info)]',\n};\n\ntype PanelLinkBaseProps = {\n Icon?: TablerIcon;\n children?: React.ReactNode;\n status?: PanelLinkStatus;\n}\n\ntype PanelLinkAnchorProps = PanelLinkBaseProps\n & Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, keyof PanelLinkBaseProps>\n & { href: string };\n\ntype PanelLinkButtonProps = PanelLinkBaseProps\n & Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, keyof PanelLinkBaseProps>\n & { href?: undefined };\n\nexport type PanelLinkProps = PanelLinkAnchorProps | PanelLinkButtonProps;\n\nconst base: string = `inline-flex flex-row gap-3 items-center justify-between h-10 px-3 font-[number:var(--font-weight-panel-link)] font-[family-name:var(--font-family-base)] ring-0 dropdown-item rounded-[var(--border-radius-menu-item)] cursor-pointer transition-all duration-[var(--control-transition-duration)] select-none focus:outline-none focus:ring-0 border border-transparent bg-transparent`;\n\nexport const PanelLink = (props: PanelLinkProps) => {\n\n const {\n className,\n children,\n Icon,\n status,\n ...rest\n } = props;\n\n const StatusIcon = status ? statusIcons[status] : null;\n\n const content = (\n <>\n <span className={ 'inline-flex flex-row items-center gap-3 min-w-0' }>\n { Icon && <Icon className={ 'h-5 w-5 shrink-0' }/> }\n <span className={ 'truncate' }>{ children }</span>\n </span>\n <span className={ 'inline-flex flex-row items-center gap-2 shrink-0' }>\n { StatusIcon && status && (\n <StatusIcon className={ classNames('h-5 w-5', statusColorClasses[status]) }/>\n ) }\n <IconChevronRight className={ 'h-5 w-5 text-[var(--color-input-icon-button-icon)]' }/>\n </span>\n </>\n );\n\n if (rest.href !== undefined) {\n const { href, ...anchorRest } = rest as PanelLinkAnchorProps;\n return (\n <a\n href={ href }\n className={ classNames(base, className) }\n { ...anchorRest }\n >\n { content }\n </a>\n );\n }\n\n return (\n <button\n className={ classNames(base, className) }\n { ...(rest as PanelLinkButtonProps) }\n >\n { content }\n </button>\n );\n};\n","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\n\nexport type DividerProps = {\n vertical?: boolean;\n} & React.HTMLAttributes<HTMLHRElement>\n\nexport const Divider = (props: DividerProps) => {\n const {\n className,\n vertical = false,\n ...rest\n } = props;\n return (\n <div\n className={ classNames(\n vertical ? 'w-px h-full bg-[var(--color-divider)]' : 'w-full h-px bg-[var(--color-divider)]',\n className\n ) }\n { ...rest }\n />\n );\n};","import * as React from \"react\";\nimport { useState } from \"react\";\nimport { usePopover } from \"@/popover/use-popover.tsx\";\nimport { DropdownPanel } from \"@/components/dropdown-menu/DropdownPanel.tsx\";\nimport type { Placement } from \"@floating-ui/react\";\n\nexport type TooltipProps = {\n children?: React.ReactNode;\n content: React.ReactNode;\n className?: string;\n placement?: Placement;\n minWidth?: number;\n maxWidth?: number;\n}\n\nexport const Tooltip = (props: TooltipProps) => {\n const {\n children,\n content,\n className,\n placement = 'top',\n minWidth = 100,\n maxWidth = 200\n } = props;\n //TODO params above\n const [ open, setOpen ] = useState(false);\n const { anchorRef, Popover } = usePopover({\n placement: placement,\n minWidth: minWidth,\n maxWidth: maxWidth,\n })\n return (\n <span\n ref={ anchorRef }\n className={ className }\n onMouseEnter={ () => setOpen(true) }\n onMouseLeave={ () => setOpen(false) }\n >\n { children }\n <Popover open={ open }>\n <DropdownPanel>\n { content }\n </DropdownPanel>\n </Popover>\n </span>\n );\n};","import * as React from \"react\";\nimport { FloatingOverlay, FloatingPortal } from '@floating-ui/react';\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { ButtonIconRound } from \"@/components/button-icon-round/ButtonIconRound.tsx\";\nimport { IconX } from \"@tabler/icons-react\";\nimport { useDismiss } from \"@/hooks/use-dismiss.ts\";\n\nexport type ModalProps = {\n open: boolean;\n className?: string;\n onDismiss?: () => void;\n enableDismissOnOutsideClick?: boolean,\n enableDismissOnEscKey?: boolean,\n enableDismissButton?: boolean,\n children?: React.ReactNode;\n maxWidth?: number;\n}\n\nexport const Modal = (props: ModalProps) => {\n const {\n open,\n onDismiss,\n enableDismissOnOutsideClick,\n enableDismissOnEscKey,\n enableDismissButton,\n className,\n children,\n maxWidth = 600\n } = props;\n\n useDismiss(!!enableDismissOnEscKey && open, onDismiss ? onDismiss : () => {});\n\n return (\n <AnimatePresence>\n { open && (\n <FloatingPortal>\n <motion.div\n className={ 'z-40' }\n style={ { transformOrigin: 'center' } }\n initial={ { opacity: 0 } }\n animate={ { opacity: 1 } }\n exit={ { opacity: 0 } }\n transition={ { duration: 0.15, ease: \"easeInOut\" } }\n >\n <FloatingOverlay\n className={ 'modal-overlay backdrop-blur-[1px]' }\n onClick={ enableDismissOnOutsideClick ? onDismiss : undefined }\n lockScroll={ true }\n />\n </motion.div>\n\n <div className={ 'fixed inset-0 flex flex-col items-center pointer-events-none p-4 lg:p-12 overflow-y-auto z-50' }>\n <motion.div\n className={ classNames(\n 'flex flex-col modal-content rounded-[var(--border-radius-panel)] shadow-[var(--shadow-overlay)] p-6 lg:p-12 pointer-events-auto w-full relative',\n className\n ) }\n style={ { transformOrigin: 'bottom', maxWidth: maxWidth } }\n initial={ { opacity: 0, scale: 0.98, translateY: 10 } }\n animate={ { opacity: 1, scale: 1, translateY: 0 } }\n exit={ { opacity: 0, scale: 0.98, translateY: 10 } }\n transition={ { duration: 0.15, ease: 'easeInOut' } }\n >\n { enableDismissButton && (\n <ButtonIconRound\n Icon={ IconX }\n className={ 'absolute top-4 right-4' }\n variant={ 'transparent' }\n size={ 'sm' }\n onClick={ onDismiss }\n />\n ) }\n { children }\n </motion.div>\n </div>\n </FloatingPortal>\n ) }\n </AnimatePresence>\n );\n};","import * as React from \"react\";\nimport { FloatingOverlay, FloatingPortal } from '@floating-ui/react';\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { ButtonIconRound } from \"@/components/button-icon-round/ButtonIconRound.tsx\";\nimport { IconX } from \"@tabler/icons-react\";\nimport { useDismiss } from \"@/hooks/use-dismiss.ts\";\n\nexport type SidebarModalProps = {\n open: boolean;\n className?: string;\n onDismiss?: () => void;\n enableDismissOnOutsideClick?: boolean,\n enableDismissOnEscKey?: boolean,\n enableDismissButton?: boolean,\n children?: React.ReactNode;\n maxWidth?: number;\n}\n\nexport const SidebarModal = (props: SidebarModalProps) => {\n const {\n open,\n onDismiss,\n enableDismissOnOutsideClick,\n enableDismissOnEscKey,\n enableDismissButton,\n className,\n children,\n maxWidth = 480\n } = props;\n\n useDismiss(!!enableDismissOnEscKey && open, onDismiss ? onDismiss : () => {});\n\n return (\n <AnimatePresence>\n { open && (\n <FloatingPortal>\n <motion.div\n className={ 'z-40' }\n style={ { transformOrigin: 'center' } }\n initial={ { opacity: 0 } }\n animate={ { opacity: 1 } }\n exit={ { opacity: 0 } }\n transition={ { duration: 0.15, ease: \"easeInOut\" } }\n >\n <FloatingOverlay\n className={ 'modal-overlay backdrop-blur-[1px]' }\n onClick={ enableDismissOnOutsideClick ? onDismiss : undefined }\n lockScroll={ true }\n />\n </motion.div>\n\n <div className={ 'fixed inset-0 flex flex-row justify-end pointer-events-none z-50' }>\n <motion.div\n className={ classNames(\n 'flex flex-col modal-content shadow-[var(--shadow-overlay)] p-6 lg:p-12 pointer-events-auto h-full w-full overflow-y-auto relative',\n className\n ) }\n style={ { maxWidth: maxWidth } }\n initial={ { translateX: '100%' } }\n animate={ { translateX: 0 } }\n exit={ { translateX: '100%' } }\n transition={ { duration: 0.25, ease: [0.32, 0.72, 0, 1] } }\n >\n { enableDismissButton && (\n <ButtonIconRound\n Icon={ IconX }\n className={ 'absolute top-4 right-4' }\n variant={ 'transparent' }\n size={ 'sm' }\n onClick={ onDismiss }\n />\n ) }\n { children }\n </motion.div>\n </div>\n </FloatingPortal>\n ) }\n </AnimatePresence>\n );\n};\n","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport type { TablerIcon } from \"@tabler/icons-react\";\n\nexport type TabButton = {\n label: string | React.ReactNode;\n active?: boolean;\n onClick?: () => void;\n href?: string;\n Icon?: TablerIcon;\n}\n\nexport type TabButtonsProps = {\n className?: string;\n tabs: TabButton[];\n}\n\nexport const TabButtons = (props: TabButtonsProps) => {\n const {\n className,\n tabs\n } = props;\n //TODO Implement scroll to active tab if overflow\n //TODO Add support for icons\n //TODO Add sizing\n return (\n <div className={ classNames(\n 'h-12 tab-container p-1 rounded-[var(--border-radius-tab)] inline-flex flex-row space-x-1 overflow-x-auto mat-ui-hide-scrollbars',\n className\n ) }>\n { tabs.map((tab, i) => {\n const tabClasses = classNames(\n 'shrink-0 px-4 h-full inline-flex flex-row items-center font-[number:var(--font-weight-tab)] font-[family-name:var(--font-family-base)] rounded-[var(--border-radius-tab)] cursor-pointer border border-transparent ing-0 tab-button transition-all duration-[var(--control-transition-duration)] select-none focus:outline-none focus:ring-0',\n tab.active && 'tab-button-active shadow-[var(--shadow-control)]'\n )\n if (tab.href) {\n return (\n <a\n key={ i }\n href={ tab.href }\n className={ tabClasses }\n >\n { tab.Icon && (\n <tab.Icon className={'h-5 w-5 shrink-0 mr-2 -ml-1'} />\n ) }\n { tab.label }\n </a>\n )\n }\n return (\n <button\n key={ i }\n className={ tabClasses }\n onClick={ tab.onClick }\n >\n { tab.Icon && (\n <tab.Icon className={'h-5 w-5 shrink-0 mr-2 -ml-1'} />\n ) }\n { tab.label }\n </button>\n )\n }) }\n </div>\n );\n};","import * as React from \"react\";\nimport { animate } from \"motion/react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\n\nexport type AutoScrollProps = {\n duration?: number;\n ease?: \"linear\" | \"easeIn\" | \"easeOut\" | \"easeInOut\";\n horizontal?: boolean;\n /** Pause auto-scrolling when the user scrolls away from the end; resume when they scroll back. */\n pauseOnScroll?: boolean;\n /** Distance (px) from the end still treated as \"pinned\" to the end. Defaults to 32. */\n threshold?: number;\n /** Called when the pinned-to-end state changes — e.g. to toggle a \"scroll to bottom\" affordance. */\n onPinnedChange?: (pinned: boolean) => void;\n} & React.HTMLAttributes<HTMLDivElement>;\n\nexport const AutoScroll = (props: AutoScrollProps) => {\n const {\n duration = 0.3,\n ease = \"easeInOut\",\n horizontal = false,\n pauseOnScroll = false,\n threshold = 1,\n onPinnedChange,\n children,\n className,\n ...rest\n } = props;\n\n const containerRef = React.useRef<HTMLDivElement | null>(null);\n const contentRef = React.useRef<HTMLDivElement | null>(null);\n const animationRef = React.useRef<ReturnType<typeof animate> | null>(null);\n\n // Whether the view is currently stuck to the end. Source of truth; a ref so the\n // ResizeObserver / scroll handlers always read the latest value without re-running.\n const pinnedRef = React.useRef(true);\n // True while we are driving the scroll ourselves, so our own motion is not mistaken\n // for the user scrolling away from the end.\n const programmaticRef = React.useRef(false);\n\n // Keep the latest callback without re-running the effect when an inline fn changes identity.\n const onPinnedChangeRef = React.useRef(onPinnedChange);\n onPinnedChangeRef.current = onPinnedChange;\n\n React.useEffect(() => {\n const container = containerRef.current;\n const content = contentRef.current;\n if (!container || !content) return;\n\n let firstObservation = true;\n\n const getMax = () => horizontal\n ? container.scrollWidth - container.clientWidth\n : container.scrollHeight - container.clientHeight;\n const getCurrent = () => horizontal ? container.scrollLeft : container.scrollTop;\n const setScroll = (value: number) => {\n if (horizontal) {\n container.scrollLeft = value;\n } else {\n container.scrollTop = value;\n }\n };\n\n const setPinned = (next: boolean) => {\n if (pinnedRef.current === next) return;\n pinnedRef.current = next;\n onPinnedChangeRef.current?.(next);\n };\n\n const scrollToEnd = () => {\n if (pauseOnScroll && !pinnedRef.current) return;\n\n const target = getMax();\n const current = getCurrent();\n\n if (target <= 0 || Math.abs(target - current) < 1) return;\n\n if (firstObservation) {\n firstObservation = false;\n programmaticRef.current = true;\n setScroll(target);\n requestAnimationFrame(() => { programmaticRef.current = false; });\n return;\n }\n\n animationRef.current?.stop();\n programmaticRef.current = true;\n animationRef.current = animate(current, target, {\n duration,\n ease,\n onUpdate: setScroll,\n onComplete: () => {\n requestAnimationFrame(() => { programmaticRef.current = false; });\n },\n });\n };\n\n const observer = new ResizeObserver(scrollToEnd);\n observer.observe(content);\n\n // User-scroll tracking — opt-in via `pauseOnScroll`.\n const handleScroll = () => {\n // Ignore scroll events caused by our own animation, otherwise the transient\n // mid-animation position would read as \"scrolled away\" and pause us.\n if (programmaticRef.current) return;\n setPinned(getMax() - getCurrent() <= threshold);\n };\n const handleUserInput = () => {\n // A genuine user gesture: stop fighting them and let scroll position decide.\n animationRef.current?.stop();\n programmaticRef.current = false;\n };\n\n if (pauseOnScroll) {\n container.addEventListener(\"scroll\", handleScroll, { passive: true });\n container.addEventListener(\"wheel\", handleUserInput, { passive: true });\n container.addEventListener(\"touchstart\", handleUserInput, { passive: true });\n }\n\n return () => {\n observer.disconnect();\n animationRef.current?.stop();\n if (pauseOnScroll) {\n container.removeEventListener(\"scroll\", handleScroll);\n container.removeEventListener(\"wheel\", handleUserInput);\n container.removeEventListener(\"touchstart\", handleUserInput);\n }\n };\n }, [ duration, ease, horizontal, pauseOnScroll, threshold ]);\n\n return (\n <div\n ref={ containerRef }\n className={ classNames(\n 'min-h-0 min-w-0',\n horizontal ? 'overflow-x-auto' : 'overflow-y-auto',\n className\n ) }\n { ...rest }\n >\n <div ref={ contentRef }>\n { children }\n </div>\n </div>\n );\n};\n","import * as React from \"react\";\n\ntype DragXEvent = {\n /** Current pointer X (client) */\n clientX: number;\n /** X where the drag started */\n startX: number;\n /** Total horizontal movement since drag start */\n totalDeltaX: number;\n /** The original pointerdown event target */\n target: EventTarget | null;\n};\n\ntype UseDragXOptions = {\n /** Called on every move with the incremental dx since the previous event */\n onDelta: (dx: number, meta: DragXEvent) => void;\n /** Called once when drag starts */\n onDragStart?: (meta: DragXEvent) => void;\n /** Called once when drag ends */\n onDragEnd?: (meta: DragXEvent) => void;\n /** Disable the hook */\n disabled?: boolean;\n /** Restrict to primary button drags (left click); default true */\n primaryButtonOnly?: boolean;\n /** If true, preventDefault on move to avoid scrolling during touch drags */\n preventScrollOnMove?: boolean;\n};\n\ntype DragBind = {\n onPointerDown: (e: React.PointerEvent) => void;\n /** Recommended for the handle to avoid accidental scroll during touch drags */\n style?: React.CSSProperties;\n /** You can also put `touchAction: \"none\"` in your CSS */\n role?: string;\n};\n\nexport function useDragX(options: UseDragXOptions): {\n isDragging: boolean;\n bind: DragBind;\n} {\n const {\n onDelta,\n onDragStart,\n onDragEnd,\n disabled = false,\n primaryButtonOnly = true,\n preventScrollOnMove = true,\n } = options;\n\n const [isDragging, setIsDragging] = React.useState(false);\n\n // The active flag must be readable by listeners attached during pointerdown,\n // before React has flushed the corresponding state update — so we mirror it\n // into a ref. The state value is kept around for consumers that want to\n // re-render based on drag status.\n const isDraggingRef = React.useRef(false);\n const startXRef = React.useRef(0);\n const prevXRef = React.useRef(0);\n const totalRef = React.useRef(0);\n const targetRef = React.useRef<EventTarget | null>(null);\n const rafRef = React.useRef<number | null>(null);\n\n // Keep the latest callbacks in a ref so the listeners (attached once per\n // drag) always see fresh handlers without re-attaching on every render.\n const callbacksRef = React.useRef({ onDelta, onDragStart, onDragEnd, preventScrollOnMove });\n React.useEffect(() => {\n callbacksRef.current = { onDelta, onDragStart, onDragEnd, preventScrollOnMove };\n });\n\n // Live references to the per-drag listeners so cleanup can detach them by\n // identity even if the component re-renders mid-drag.\n const handlersRef = React.useRef<{\n move?: (e: PointerEvent) => void;\n up?: (e: PointerEvent) => void;\n keydown?: (e: KeyboardEvent) => void;\n }>({});\n\n const cleanup = React.useCallback((clientX?: number) => {\n if (!isDraggingRef.current) return;\n\n const meta: DragXEvent = {\n clientX: clientX ?? prevXRef.current,\n startX: startXRef.current,\n totalDeltaX: totalRef.current,\n target: targetRef.current,\n };\n\n isDraggingRef.current = false;\n setIsDragging(false);\n\n const { move, up, keydown } = handlersRef.current;\n if (move) {\n window.removeEventListener(\"pointermove\", move, true);\n }\n if (up) {\n window.removeEventListener(\"pointerup\", up, true);\n window.removeEventListener(\"pointercancel\", up, true);\n }\n if (keydown) {\n window.removeEventListener(\"keydown\", keydown, true);\n }\n handlersRef.current = {};\n\n if (rafRef.current != null) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n\n callbacksRef.current.onDragEnd?.(meta);\n targetRef.current = null;\n totalRef.current = 0;\n }, []);\n\n const onPointerDown = React.useCallback((e: React.PointerEvent) => {\n if (disabled) return;\n if (primaryButtonOnly && e.button !== 0) return;\n\n // Capture the pointer to keep receiving moves even when the cursor leaves the handle.\n (e.target as Element).setPointerCapture?.(e.pointerId);\n\n startXRef.current = e.clientX;\n prevXRef.current = e.clientX;\n totalRef.current = 0;\n targetRef.current = e.target;\n\n isDraggingRef.current = true;\n setIsDragging(true);\n\n const startMeta: DragXEvent = {\n clientX: e.clientX,\n startX: e.clientX,\n totalDeltaX: 0,\n target: e.target,\n };\n callbacksRef.current.onDragStart?.(startMeta);\n\n const move = (ev: PointerEvent) => {\n if (!isDraggingRef.current) return;\n if (rafRef.current != null) return;\n rafRef.current = requestAnimationFrame(() => {\n rafRef.current = null;\n const x = ev.clientX;\n const dx = x - prevXRef.current;\n if (dx === 0) return;\n prevXRef.current = x;\n totalRef.current += dx;\n\n const meta: DragXEvent = {\n clientX: x,\n startX: startXRef.current,\n totalDeltaX: totalRef.current,\n target: targetRef.current,\n };\n\n if (callbacksRef.current.preventScrollOnMove) {\n ev.preventDefault();\n }\n callbacksRef.current.onDelta(dx, meta);\n });\n };\n\n const up = (ev: PointerEvent) => {\n cleanup(ev.clientX);\n };\n\n const keydown = (ev: KeyboardEvent) => {\n if (ev.key === \"Escape\") {\n ev.preventDefault();\n cleanup();\n }\n };\n\n handlersRef.current = { move, up, keydown };\n\n window.addEventListener(\"pointermove\", move, {\n passive: !preventScrollOnMove,\n capture: true,\n });\n window.addEventListener(\"pointerup\", up, { capture: true });\n window.addEventListener(\"pointercancel\", up, { capture: true });\n window.addEventListener(\"keydown\", keydown, true);\n }, [cleanup, disabled, preventScrollOnMove, primaryButtonOnly]);\n\n // Ensure listeners are removed if the component unmounts mid-drag.\n React.useEffect(() => {\n return () => {\n if (isDraggingRef.current) cleanup();\n };\n }, [cleanup]);\n\n return {\n isDragging,\n bind: {\n onPointerDown,\n role: \"separator\",\n style: { touchAction: \"none\", cursor: \"col-resize\", userSelect: \"none\" },\n },\n };\n}\n","import type { TableColumnDef, TableSortDirection } from \"@/table/Table.tsx\";\nimport { useDragX } from \"@/hooks/use-drag-x.ts\";\nimport { IconChevronDown, IconChevronUp } from \"@tabler/icons-react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\n\nexport type TableColumnHeadProps<T> = {\n column: TableColumnDef<T>;\n width: number;\n height: number;\n onResize: (dx: number) => void;\n /** Direction the column is currently sorted, or null when it is not the active sort. */\n sortDirection: TableSortDirection | null;\n onSortClick: () => void;\n}\n\nexport const TableColumnHead = <T, >(props: TableColumnHeadProps<T>) => {\n const {\n column,\n width,\n height,\n onResize,\n sortDirection,\n onSortClick,\n } = props;\n\n const sortable = !!column.sortable;\n\n const { bind } = useDragX({\n onDelta: (dx) => onResize(dx),\n });\n\n return (\n <div\n style={ { width, height } }\n className={ 'flex flex-row items-stretch select-none shrink-0' }\n >\n <div\n className={ classNames(\n 'flex-1 min-w-0 px-4 table-header-cell transition-colors duration-[var(--control-transition-duration-fast)] flex flex-row items-center gap-2',\n sortable && 'cursor-pointer',\n ) }\n onClick={ sortable ? onSortClick : undefined }\n >\n <span className={ 'truncate' }>{ column.header }</span>\n { sortable && sortDirection === 'asc' && (\n <IconChevronUp className={ 'h-4 w-4 shrink-0' }/>\n ) }\n { sortable && sortDirection === 'desc' && (\n <IconChevronDown className={ 'h-4 w-4 shrink-0' }/>\n ) }\n </div>\n <div\n { ...bind }\n className={ 'cursor-ew-resize group py-4 table-resize-handle w-[8px]' }\n >\n <div\n className={ 'w-0.5 h-full mx-auto table-resize-divider table-resize-divider-hover pointer-events-none' }/>\n </div>\n </div>\n );\n};\n","import * as React from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { TableColumnHead } from \"@/table/TableColumnHead.tsx\";\nimport { classNames } from \"@/util/classnames.util.ts\";\n\nexport type TableSortDirection = 'asc' | 'desc';\n\nexport type TableSortState = {\n columnId: string;\n direction: TableSortDirection;\n}\n\nexport type TableColumnDef<T> = {\n id: string;\n header: React.ReactNode;\n renderCell: (row: T, rowIndex: number) => React.ReactNode;\n defaultWidth?: number;\n minWidth?: number;\n /** When true, the column header is clickable and participates in sorting. */\n sortable?: boolean;\n}\n\nexport type TableProps<T> = {\n columns: TableColumnDef<T>[];\n rows: T[];\n /** Stable identifier for each row. Used as the React key. */\n getRowId: (row: T, rowIndex: number) => string | number;\n /** Fires when a row is clicked. Setting this also makes rows look interactive (pointer cursor). */\n onRowClick?: (row: T, rowIndex: number) => void;\n /** Active sort. Controlled — the consumer is responsible for sorting `rows`. */\n sort?: TableSortState | null;\n /** Fires when the user clicks a sortable column. Cycles null → asc → desc → null. */\n onSortChange?: (sort: TableSortState | null) => void;\n className?: string;\n rowHeight?: number;\n headerHeight?: number;\n /** Rendered in the scroll body (with the header still visible) when `rows` is empty. */\n emptyState?: React.ReactNode;\n}\n\nconst DEFAULT_COLUMN_WIDTH = 200;\nconst DEFAULT_MIN_COLUMN_WIDTH = 60;\n\nconst buildInitialWidths = <T,>(columns: TableColumnDef<T>[]): Record<string, number> => {\n const widths: Record<string, number> = {};\n for (const col of columns) {\n widths[col.id] = col.defaultWidth ?? DEFAULT_COLUMN_WIDTH;\n }\n return widths;\n};\n\nexport const Table = <T, >(props: TableProps<T>) => {\n const {\n columns,\n rows,\n getRowId,\n onRowClick,\n sort,\n onSortChange,\n className,\n rowHeight = 44,\n headerHeight = 44,\n emptyState,\n } = props;\n\n // Lazy init — runs once on the server and once on hydration with the same\n // input, so the rendered HTML matches.\n const [widths, setWidths] = useState<Record<string, number>>(() => buildInitialWidths(columns));\n\n // If a column is added/removed/renamed, sync the widths map. Resized widths\n // are preserved for columns that still exist by id.\n useEffect(() => {\n setWidths(prev => {\n const next: Record<string, number> = {};\n let changed = Object.keys(prev).length !== columns.length;\n for (const col of columns) {\n if (col.id in prev) {\n next[col.id] = prev[col.id];\n } else {\n next[col.id] = col.defaultWidth ?? DEFAULT_COLUMN_WIDTH;\n changed = true;\n }\n }\n return changed ? next : prev;\n });\n }, [columns]);\n\n const handleResize = useCallback((columnId: string, dx: number, minWidth: number) => {\n setWidths(prev => {\n const current = prev[columnId] ?? DEFAULT_COLUMN_WIDTH;\n const next = Math.max(minWidth, current + dx);\n if (next === current) return prev;\n return { ...prev, [columnId]: next };\n });\n }, []);\n\n const handleSortClick = useCallback((columnId: string) => {\n if (!onSortChange) return;\n if (!sort || sort.columnId !== columnId) {\n onSortChange({ columnId, direction: 'asc' });\n return;\n }\n if (sort.direction === 'asc') {\n onSortChange({ columnId, direction: 'desc' });\n return;\n }\n onSortChange(null);\n }, [sort, onSortChange]);\n\n const totalWidth = columns.reduce(\n (sum, c) => sum + (widths[c.id] ?? c.defaultWidth ?? DEFAULT_COLUMN_WIDTH),\n 0,\n );\n\n const headerScrollRef = useRef<HTMLDivElement>(null);\n\n const handleBodyScroll = (e: React.UIEvent<HTMLDivElement>) => {\n if (headerScrollRef.current) {\n headerScrollRef.current.scrollLeft = e.currentTarget.scrollLeft;\n }\n };\n\n return (\n <div className={ classNames('flex flex-col h-full w-full', className) }>\n {/* Header strip — overflow-hidden, scroll-synced with body via JS so\n users only scroll one container. */}\n <div\n ref={ headerScrollRef }\n className={ 'overflow-hidden shrink-0 table-header-strip' }\n style={ { height: headerHeight } }\n >\n <div\n className={ 'flex flex-row table-header font-[number:var(--font-weight-table-header)]' }\n style={ { width: totalWidth, minWidth: '100%' } }\n >\n { columns.map((col) => (\n <TableColumnHead\n key={ col.id }\n column={ col }\n width={ widths[col.id] ?? col.defaultWidth ?? DEFAULT_COLUMN_WIDTH }\n height={ headerHeight }\n onResize={ (dx) => handleResize(col.id, dx, col.minWidth ?? DEFAULT_MIN_COLUMN_WIDTH) }\n sortDirection={ sort?.columnId === col.id ? sort.direction : null }\n onSortClick={ () => handleSortClick(col.id) }\n />\n )) }\n </div>\n </div>\n {/* Body — the only scrolling container. */}\n <div\n className={ 'flex-1 overflow-auto' }\n onScroll={ handleBodyScroll }\n >\n { rows.length === 0 && emptyState ? (\n <div className={ 'flex h-full min-w-full items-center justify-center p-8' }>\n { emptyState }\n </div>\n ) : (\n <div\n className={ 'flex flex-col' }\n style={ { width: totalWidth, minWidth: '100%' } }\n >\n { rows.map((row, rowIndex) => (\n <div\n key={ getRowId(row, rowIndex) }\n className={ classNames(\n 'flex flex-row table-body-row transition-colors duration-[var(--control-transition-duration-fast)]',\n onRowClick && 'cursor-pointer',\n ) }\n onClick={ onRowClick ? () => onRowClick(row, rowIndex) : undefined }\n >\n { columns.map((col) => (\n <div\n key={ col.id }\n className={ 'shrink-0 content-center px-4 relative' }\n style={ {\n width: widths[col.id] ?? col.defaultWidth ?? DEFAULT_COLUMN_WIDTH,\n height: rowHeight,\n } }\n >\n <div className={'break-all line-clamp-1 font-[number:var(--font-weight-table-cell)]'}>\n { col.renderCell(row, rowIndex) }\n </div>\n </div>\n )) }\n </div>\n )) }\n </div>\n ) }\n </div>\n </div>\n );\n};\n","import * as React from \"react\";\nimport { type TablerIcon } from \"@tabler/icons-react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\n\n\nexport type TableEmptyProps = {\n Icon?: TablerIcon;\n title?: React.ReactNode;\n description?: React.ReactNode;\n /** Optional action(s) rendered below the text, e.g. a button. */\n children?: React.ReactNode;\n className?: string;\n}\n\nexport const TableEmpty = (props: TableEmptyProps) => {\n const { Icon, title, description, children, className } = props;\n\n return (\n <div className={ classNames('flex flex-col items-center gap-3 text-center', className) }>\n { Icon && (\n <div className={ 'flex h-14 w-14 items-center justify-center rounded-[var(--border-radius-panel)] bg-[var(--color-table-header-bg)]' }>\n <Icon className={ 'h-6 w-6 text-[var(--color-input-icon)]' }/>\n </div>\n ) }\n { (title || description) && (\n <div className={ 'flex flex-col gap-1' }>\n { title && (\n <div className={ 'font-[number:var(--font-weight-table-header)] text-[var(--color-input-text)]' }>{ title }</div>\n ) }\n { description && (\n <div className={ 'text-sm text-[var(--color-input-description-text)]' }>{ description }</div>\n ) }\n </div>\n ) }\n { children }\n </div>\n );\n};\n","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\n\nexport type DropdownButtonGroupProps = {\n label?: string;\n children: React.ReactNode;\n className?: string;\n}\n\nexport const DropdownButtonGroup = (props: DropdownButtonGroupProps) => {\n const { label, children, className } = props;\n return (\n <div className={ classNames('flex flex-col dropdown-button-group', className) }>\n { label && <div className={ 'mb-2 text-[length:var(--font-size-label)] dropdown-group-label font-[number:var(--font-weight-group-header)] px-3' }>{ label }</div> }\n { children }\n </div>\n );\n};","export const ScrollbarTest = () => {\n\n // const { ref: containerRef, height: containerHeight } = useResizeObserver<HTMLDivElement>();\n // const { ref: contentRef, height: contentHeight } = useResizeObserver<HTMLDivElement>();\n //\n // const [ scrollTop, setScrollTop ] = useState(0);\n //\n // const handleScroll = (e) => {\n // const target = e.currentTarget;\n // setScrollTop(target.scrollTop);\n // };\n //\n // const thumbTop = containerHeight && contentHeight ? (scrollTop / contentHeight) * containerHeight : 0;\n // const thumbHeight = containerHeight && contentHeight ? Math.max((containerHeight / contentHeight) * containerHeight, 20) : 20;\n\n\n return (\n <div></div>\n // <div\n // className={ 'relative' }\n // style={ { height: 200 } }\n // >\n // <div\n // className={ 'relative overflow-scroll mat-ui-hide-scrollbars border h-full w-full border-red-500' }\n // ref={ containerRef }\n // onScroll={ handleScroll }\n // >\n //\n // {/* Content */ }\n // <div ref={ contentRef } className={ 'absolute flex flex-col gap-3' } style={ { height: 600, width: 1000 } }>\n // <div className={ 'bg-amber-100 flex-1' }></div>\n // <div className={ 'bg-amber-100 flex-1' }></div>\n // <div className={ 'bg-amber-100 flex-1' }></div>\n // <div className={ 'bg-amber-100 flex-1' }></div>\n // <div className={ 'bg-amber-100 flex-1' }></div>\n // </div>\n //\n // </div>\n // {/*Track*/ }\n // <div className={ 'absolute top-px right-px bottom-px w-5 bg-blue-100' }>\n // {/*Thumb*/ }\n // <div\n // onMouseDown={ e => {\n // console.log('start drag')\n // } }\n // style={ { top: thumbTop, height: thumbHeight } }\n // className={ 'absolute top-0 bg-blue-600 w-3 right-px' }\n // />\n // </div>\n // </div>\n );\n};","import { Table } from \"@/table/Table.tsx\";\nimport { ButtonIconSquare } from \"@/components/button-icon-square/ButtonIconSquare.tsx\";\nimport { IconList, IconMailFilled, IconPlus, IconSearch, IconSettings, IconTrash } from \"@tabler/icons-react\";\nimport { Input } from \"@/components/inputs/Input.tsx\";\nimport { Badge } from \"@/components/Badge.tsx\";\nimport { InputSelect } from \"@/components/inputs/InputSelect.tsx\";\nimport { DropdownButton } from \"@/components/dropdown-menu/DropdownButton.tsx\";\nimport { Button } from \"@/components/button/Button.tsx\";\nimport { DropdownMenu } from \"@/components/dropdown-menu/DropdownMenu.tsx\";\nimport { ScrollbarTest } from \"@/components/ScrollbarTest.tsx\";\nimport { TabButtons } from \"@/components/TabButtons.tsx\";\nimport { DropdownButtonGroup } from \"@/components/dropdown-menu/DropdownButtonGroup.tsx\";\n\ntype SampleRowType = {\n id: number;\n email: string;\n firstname: string;\n lastname: string;\n status: 'active' | 'inactive';\n}\n\nconst sampleData: SampleRowType[] = [\n { id: 1, email: 'sarah.jennings@example.com', firstname: 'Sarah', lastname: 'Jennings', status: 'active' },\n { id: 2, email: 'liam.patel@outlook.com', firstname: 'Liam', lastname: 'Patel', status: 'inactive' },\n { id: 3, email: 'emily.wong@gmail.com', firstname: 'Emily', lastname: 'Wong', status: 'active' },\n { id: 4, email: 'noah.thompson@yahoo.com', firstname: 'Noah', lastname: 'Thompson', status: 'active' },\n { id: 5, email: 'isabella.martin@protonmail.com', firstname: 'Isabella', lastname: 'Martin', status: 'active' },\n { id: 6, email: 'ethan.ross@company.io', firstname: 'Ethan', lastname: 'Ross', status: 'inactive' },\n { id: 7, email: 'olivia.nguyen@example.org', firstname: 'Olivia', lastname: 'Nguyen', status: 'active' },\n { id: 8, email: 'lucas.henderson@gmail.com', firstname: 'Lucas', lastname: 'Henderson', status: 'inactive' },\n { id: 9, email: 'mia.johnson@workmail.com', firstname: 'Mia', lastname: 'Johnson', status: 'active' },\n { id: 10, email: 'jackson.rivera@outlook.com', firstname: 'Jackson', lastname: 'Rivera', status: 'active' },\n { id: 11, email: 'ava.sanders@example.com', firstname: 'Ava', lastname: 'Sanders', status: 'active' },\n { id: 12, email: 'logan.bennett@company.io', firstname: 'Logan', lastname: 'Bennett', status: 'inactive' },\n];\n\nconst sampleColumns = [\n { id: 'id', header: 'ID', renderCell: (row: SampleRowType) => row.id },\n {\n id: 'email', header: 'Email', renderCell: (row: SampleRowType) => {\n return <Badge Icon={ IconMailFilled } onClick={ () => {\n } }>{ row.email }</Badge>\n }\n },\n { id: 'firstname', header: 'First Name', renderCell: (row: SampleRowType) => row.firstname },\n { id: 'lastname', header: 'Last Name', renderCell: (row: SampleRowType) => row.lastname },\n {\n id: 'status', header: 'Status', renderCell: () => <BadgePopover/>\n },\n];\n\n\nexport const Test = () => {\n return (\n <div className={ 'flex flex-col gap-6' }>\n <div className={ 'flex flex-row items-center justify-start gap-3' }>\n <Input Icon={ IconSearch } placeholder={ 'Search...' }/>\n <ButtonIconSquare Icon={ IconSettings }/>\n <Button Icon={ IconPlus }>New</Button>\n <DropdownMenu\n trigger={ <ButtonIconSquare Icon={ IconSettings }/> }\n >\n <DropdownButton dismissOnClick={ false } Icon={ IconPlus }>Add new</DropdownButton>\n <DropdownButton Icon={ IconTrash }>Remove</DropdownButton>\n <DropdownButtonGroup label={ 'Test' } className={ 'mt-2' }>\n <DropdownButton>Item 1</DropdownButton>\n <DropdownButton>Item 2</DropdownButton>\n <DropdownButton>Item 3</DropdownButton>\n <DropdownButton>Item 4</DropdownButton>\n </DropdownButtonGroup>\n <DropdownButtonGroup label={ 'Test' } className={ 'mt-2' }>\n <DropdownButton>Item 1</DropdownButton>\n <DropdownButton>Item 2</DropdownButton>\n <DropdownButton>Item 3</DropdownButton>\n <DropdownButton>Item 4</DropdownButton>\n </DropdownButtonGroup>\n </DropdownMenu>\n <TabButtons tabs={ [\n {\n label: 'Tab 1', Icon: IconList, active: true, onClick: () => {\n }\n },\n {\n label: 'Tab 2', active: false, onClick: () => {\n }\n },\n {\n label: 'Tab 3', Icon: IconList, active: false, onClick: () => {\n }\n }\n ] }/>\n </div>\n\n <InputSelect options={ [\n { label: 'Option 1', value: 1 },\n { label: 'Option 2', value: 2 },\n { label: 'Option 3', value: 3 }\n ] } value={ null } onChange={ () => {\n } }/>\n\n <Table\n className={ 'h-[300px] w-[300px]' }\n columns={ sampleColumns }\n rows={ sampleData }\n getRowId={ (row) => row.id }\n />\n\n <ScrollbarTest/>\n </div>\n );\n};\n\nconst BadgePopover = () => {\n return (<>\n\n <DropdownMenu\n placement={ 'bottom-end' }\n className={ 'inline-block' }\n trigger={\n <Badge onClick={ () => {\n } }>Test</Badge>\n }\n >\n <DropdownButton>Option 1</DropdownButton>\n <DropdownButton>Option 2</DropdownButton>\n <DropdownButton>Option 3</DropdownButton>\n </DropdownMenu>\n </>)\n}"],"names":["classNames","classes","clipKeyframes","Spinner","props","speed","className","rotateDuration","clipDuration","AnimatePresence","jsx","motion","sizeHeightClasses","sizeMinHeightClasses","sizeFontClasses","sizeGapClasses","sizePaddingXClasses","sizePaddingLeftClasses","sizePaddingRightClasses","sizePaddingRightWithTrayClasses","sizePaddingRightWithTrayTwoClasses","sizePaddingLeftWithIconClasses","sizeIconLeftPositionClasses","sizeTrayRightPositionClasses","sizeIconClasses","sizeSquareClasses","base","variantClasses","Button","React","ref","variant","size","children","loading","Icon","IconRight","rest","jsxs","Fragment","ButtonIconSquare","ButtonIconRound","InputLabel","InputErrorIcon","IconExclamationCircleFilled","ControlSizeContext","createContext","useControlSize","useContext","InputIconButtonTray","InputDescription","InputError","Input","label","description","error","buttonTray","hasTray","hexToRgb","hex","m","n","rgbToHex","r","g","b","c","v","rgbToHsv","max","min","d","h","hsvToRgb","s","hh","x","hsvToHex","hexToHsv","rgb","formatHex","input","trimmed","hexMatch","probe","computed","usePointerDrag","onPosition","rectRef","isDragging","setIsDragging","release","e","el","baseClassName","paddingClasses","DropdownPanel","padding","placementOriginMap","PopoverBase","open","floatingStyles","setFloating","placement","floatingProps","FloatingPortal","usePopover","onOpenChange","fullWidth","minWidth","maxWidth","middleware","flip","shift","rects","elements","refs","context","resolvedPlacement","useFloating","autoUpdate","dismiss","useDismiss","getFloatingProps","useInteractions","latest","Popover","Renderer","rendererProps","active","onDismiss","useEffect","handleKeyDown","event","HUE_GRADIENT","SV_SATURATION_GRADIENT","SV_VALUE_GRADIENT","THUMB_SHADOW","THUMB_SIZE","THUMB_SIZE_ACTIVE","THUMB_RADIUS","THUMB_RADIUS_ACTIVE","THUMB_SPRING","thumbAnimate","half","clamp01","setInputValueAndNotify","value","ColorPicker","onChange","hsv","setHsv","useState","lastEmittedRef","useRef","parsed","updateHsv","next","hueOnly","brightnessMax","currentColor","svDrag","cx","cy","rect","hueDrag","_cy","brightnessDrag","InputColor","defaultValue","onBlur","onFocus","internalValue","setInternalValue","setOpen","inputRef","currentValue","swatchColor","anchorRef","handleChange","handleFocus","handleBlur","raw","formatted","handlePickerChange","InputIconButton","onClick","InputPassword","type","enableShowPasswordToggle","showPassword","setShowPassword","IconEyeOff","IconEye","InputTextArea","autogrow","maxRows","internalRef","resize","targetHeight","styles","lineHeight","paddingTop","paddingBottom","borderTop","borderBottom","maxHeight","mergeRefs","InputRadio","InputToggle","InputCheck","chooseButtonHeightClasses","chooseButtonPaddingClasses","chooseButtonFontClasses","InputFileSingle","placeholder","buttonText","IconPaperclip","isUploaded","isUploading","onDropRejected","accept","maxSize","minSize","disabled","handleDrop","acceptedFiles","file","getRootProps","getInputProps","isDragActive","isFocused","useDropzone","fileName","IconCircleCheckFilled","formatBytes","bytes","UploadFileTile","onRemove","showStatus","IconX","InputFileMultiple","title","hint","IconCloudUpload","onUpload","onFileRemoved","renderFileTile","maxFiles","entries","setEntries","idCounter","updateEntry","id","patch","prev","newEntries","entry","err","handleRemove","removed","defaultProps","LEXICAL_NODES","HeadingNode","QuoteNode","ListNode","ListItemNode","LinkNode","lexicalTheme","DEFAULT_LEXICAL_TOOLBAR_STATE","LexicalToolbarContext","useLexicalToolbar","useLexicalToolbarState","editor","useLexicalComposerContext","state","setState","readSelection","selection","$getSelection","$isRangeSelection","anchorNode","listNode","$getNearestNodeOfType","listType","$isListNode","blockType","element","$isHeadingNode","isBold","isItalic","isUnderline","isLink","$isLinkNode","mergeRegister","CAN_UNDO_COMMAND","payload","COMMAND_PRIORITY_LOW","CAN_REDO_COMMAND","DropdownDismissContext","useDropdownDismiss","DropdownMenu","trigger","show","setShow","DropdownButton","dismissOnClick","handleOnClick","OPTIONS","LexicalBlockTypeSelect","tone","applyBlockType","$setBlocksType","$createParagraphNode","$createHeadingNode","current","option","IconChevronDown","IconCheck","toneClasses","LexicalToolbarButton","onMouseDown","LexicalFormatButtons","IconBold","FORMAT_TEXT_COMMAND","IconItalic","IconUnderline","LexicalListButtons","toggleUnordered","REMOVE_LIST_COMMAND","INSERT_UNORDERED_LIST_COMMAND","toggleOrdered","INSERT_ORDERED_LIST_COMMAND","IconList","IconListNumbers","LexicalLinkButton","toggleLink","TOGGLE_LINK_COMMAND","url","IconLink","LexicalHistoryButtons","IconArrowBackUp","UNDO_COMMAND","IconArrowForwardUp","REDO_COMMAND","LexicalToolbarDivider","toneOverride","contextTone","orientation","GAP","MORE_WIDTH","flattenItems","nodes","out","child","LexicalToolbarItems","items","containerRef","mirrorRef","visibleCount","setVisibleCount","recompute","useCallback","container","mirror","available","widths","node","sum","w","i","used","count","add","useLayoutEffect","observer","visible","overflow","item","index","IconDots","lexicalDefaultToolbarItems","LexicalDefaultToolbarContent","LexicalToolbar","render","LexicalFloatingToolbar","offset","root","FOCUS_COMMAND","BLUR_COMMAND","InputLexical","toolbar","renderToolbar","minRows","namespace","theme","autoFocus","initialConfig","useMemo","editorState","fontClass","hasError","rowsToHeight","rows","contentStyle","LexicalComposer","RichTextPlugin","ContentEditable","LexicalErrorBoundary","HistoryPlugin","ListPlugin","LinkPlugin","AutoFocusPlugin","OnChangePlugin","InputSelectNative","options","InputSelectOption","selected","InputSelectGroupHeader","InputSelectDivider","isSelectOption","selectValueEquals","a","useSelectPopover","listRef","activeIndex","onNavigate","loop","disabledIndices","listNavigation","useListNavigation","getReferenceProps","getItemProps","InputSelect","clearable","setActiveIndex","selectedOption","selectedIdx","firstSelectable","handleSelect","idx","o","isSelected","InputSelectSearchable","onSearch","filteredOptions","setFilteredOptions","search","setSearch","inputSearchRef","visibleOptions","hasSelectableVisible","IconSearch","IconSearchOff","useDebounce","delay","debouncedValue","setDebouncedValue","handler","InputSelectSearchableAsync","fetchOptionsByQuery","fetchOptionByValue","onSearchDebounceMs","setOptions","setSelectedOption","isFetching","setIsFetching","isFetchingSelectedOption","setIsFetchingSelectedOption","debouncedQuery","results","selectedFromOptions","result","BadgeColor","Badge","showCloseIcon","color","useOverflowFit","enabled","triggerRef","measureRef","trayRef","itemCount","deps","gap","measure","compute","cs","paddingLeft","triggerRect","contentLeft","contentRight","trayEl","trayRect","totalAll","moreWidth","ro","InputSelectMultiple","singleLine","selectedOptions","defaultSearch","q","lower","toggleValue","hasSelection","displayedCount","visibleBadges","hiddenCount","opt","Panel","PanelStack","labelClasses","PanelField","statusIcons","IconAlertTriangleFilled","IconInfoCircleFilled","statusColorClasses","PanelLink","status","StatusIcon","content","IconChevronRight","href","anchorRest","Divider","vertical","Tooltip","Modal","enableDismissOnOutsideClick","enableDismissOnEscKey","enableDismissButton","FloatingOverlay","SidebarModal","TabButtons","tabs","tab","tabClasses","AutoScroll","duration","ease","horizontal","pauseOnScroll","threshold","onPinnedChange","contentRef","animationRef","pinnedRef","programmaticRef","onPinnedChangeRef","firstObservation","getMax","getCurrent","setScroll","setPinned","scrollToEnd","target","animate","handleScroll","handleUserInput","useDragX","onDelta","onDragStart","onDragEnd","primaryButtonOnly","preventScrollOnMove","isDraggingRef","startXRef","prevXRef","totalRef","targetRef","rafRef","callbacksRef","handlersRef","cleanup","clientX","meta","move","up","keydown","onPointerDown","startMeta","ev","dx","TableColumnHead","column","width","height","onResize","sortDirection","onSortClick","sortable","bind","IconChevronUp","DEFAULT_COLUMN_WIDTH","DEFAULT_MIN_COLUMN_WIDTH","buildInitialWidths","columns","col","Table","getRowId","onRowClick","sort","onSortChange","rowHeight","headerHeight","emptyState","setWidths","changed","handleResize","columnId","handleSortClick","totalWidth","headerScrollRef","handleBodyScroll","row","rowIndex","TableEmpty","DropdownButtonGroup","ScrollbarTest","sampleData","sampleColumns","IconMailFilled","BadgePopover","Test","IconSettings","IconPlus","IconTrash"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/util/classnames.util.ts","../src/spinner/Spinner.tsx","../src/control-size/control-size.util.ts","../src/components/button/Button.tsx","../src/components/button-icon-square/ButtonIconSquare.tsx","../src/components/button-icon-round/ButtonIconRound.tsx","../src/components/inputs/InputLabel.tsx","../src/components/inputs/InputErrorIcon.tsx","../src/control-size/use-control-size.ts","../src/components/inputs/InputIconButtonTray.tsx","../src/components/inputs/InputDescription.tsx","../src/components/inputs/InputError.tsx","../src/components/inputs/Input.tsx","../src/util/color.util.ts","../src/hooks/use-pointer-drag.ts","../src/components/dropdown-menu/DropdownPanel.tsx","../src/popover/PopoverBase.tsx","../src/popover/use-popover.tsx","../src/hooks/use-dismiss.ts","../src/components/inputs/InputColor.tsx","../src/components/inputs/InputIconButton.tsx","../src/components/inputs/InputPassword.tsx","../src/components/inputs/InputTextArea.tsx","../src/components/inputs/InputRadio.tsx","../src/components/inputs/InputToggle.tsx","../src/components/inputs/InputCheck.tsx","../src/components/inputs/input-file/InputFileSingle.tsx","../src/components/inputs/input-file/UploadFileTile.tsx","../src/components/inputs/input-file/InputFileMultiple.tsx","../src/components/inputs/input-lexical/lexical-theme.ts","../src/components/inputs/input-lexical/use-lexical-toolbar.ts","../src/components/dropdown-menu/use-dropdown-dismiss.ts","../src/components/dropdown-menu/DropdownMenu.tsx","../src/components/dropdown-menu/DropdownButton.tsx","../src/components/inputs/input-lexical/LexicalBlockTypeSelect.tsx","../src/components/inputs/input-lexical/LexicalToolbarButton.tsx","../src/components/inputs/input-lexical/LexicalFormatButtons.tsx","../src/components/inputs/input-lexical/LexicalListButtons.tsx","../src/components/inputs/input-lexical/LexicalLinkButton.tsx","../src/components/inputs/input-lexical/LexicalHistoryButtons.tsx","../src/components/inputs/input-lexical/LexicalToolbarDivider.tsx","../src/components/inputs/input-lexical/LexicalToolbarItems.tsx","../src/components/inputs/input-lexical/LexicalToolbar.tsx","../src/components/inputs/input-lexical/LexicalFloatingToolbar.tsx","../src/components/inputs/input-lexical/InputLexical.tsx","../src/components/inputs/InputSelectNative.tsx","../src/components/inputs/InputSelectOption.tsx","../src/components/inputs/InputSelectGroupHeader.tsx","../src/components/inputs/InputSelectDivider.tsx","../src/components/inputs/select-item.ts","../src/popover/use-select-popover.tsx","../src/components/inputs/InputSelect.tsx","../src/components/inputs/InputSelectSearchable.tsx","../src/hooks/use-debounce.ts","../src/components/inputs/InputSelectSearchableAsync.tsx","../src/components/BadgeColors.tsx","../src/components/Badge.tsx","../src/hooks/use-overflow-fit.ts","../src/components/inputs/InputSelectMultiple.tsx","../src/components/panel/Panel.tsx","../src/components/panel/PanelStack.tsx","../src/components/panel/PanelField.tsx","../src/components/panel/PanelLink.tsx","../src/components/Divider.tsx","../src/components/Tooltip.tsx","../src/components/Modal.tsx","../src/components/SidebarModal.tsx","../src/components/TabButtons.tsx","../src/components/AutoScroll.tsx","../src/hooks/use-drag-x.ts","../src/table/TableColumnHead.tsx","../src/table/Table.tsx","../src/table/TableEmpty.tsx","../src/components/dropdown-menu/DropdownButtonGroup.tsx","../src/components/ScrollbarTest.tsx","../src/components/Test.tsx"],"sourcesContent":["export const classNames = (...classes: any[]) => {\n return classes.filter(Boolean).join(' ')\n}","import { AnimatePresence, motion } from \"motion/react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\n\nexport type SpinnerProps = {\n speed?: number;\n className?: string;\n};\n\nconst clipKeyframes = [\n \"polygon(50% 50%,0 0,0 0,0 0,0 0,0 0)\",\n \"polygon(50% 50%,0 0,100% 0,100% 0,100% 0,100% 0)\",\n \"polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)\",\n \"polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)\",\n \"polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0)\",\n];\n\nexport const Spinner = (props: SpinnerProps) => {\n const {\n speed = 1,\n className\n } = props;\n\n const rotateDuration = 1 / speed;\n const clipDuration = 2 / speed;\n\n return (\n <AnimatePresence>\n <motion.div\n role={ 'status' }\n className={ classNames('relative rounded-full', className) }\n animate={ { rotate: 360 } }\n transition={ { repeat: Infinity, ease: 'linear', duration: rotateDuration } }\n >\n <motion.div\n className={ 'absolute inset-0 rounded-full' }\n style={ {\n boxSizing: 'border-box',\n borderStyle: 'solid',\n borderWidth: 2,\n } }\n animate={ { clipPath: clipKeyframes } }\n transition={ {\n repeat: Infinity,\n ease: 'linear',\n duration: clipDuration,\n times: [ 0, 0.25, 0.5, 0.75, 1 ],\n } }\n />\n </motion.div>\n </AnimatePresence>\n );\n}","export type ControlSize = 'sm' | 'md' | 'lg';\n\nexport const sizeHeightClasses: Record<ControlSize, string> = {\n sm: 'h-[var(--control-size-sm-height)]',\n md: 'h-[var(--control-size-md-height)]',\n lg: 'h-[var(--control-size-lg-height)]',\n};\n\nexport const sizeMinHeightClasses: Record<ControlSize, string> = {\n sm: 'min-h-[var(--control-size-sm-height)]',\n md: 'min-h-[var(--control-size-md-height)]',\n lg: 'min-h-[var(--control-size-lg-height)]',\n};\n\nexport const sizeFontClasses: Record<ControlSize, string> = {\n sm: 'text-[length:var(--control-size-sm-font-size)]',\n md: 'text-[length:var(--control-size-md-font-size)]',\n lg: 'text-[length:var(--control-size-lg-font-size)]',\n};\n\nexport const sizeGapClasses: Record<ControlSize, string> = {\n sm: 'gap-[var(--control-size-sm-gap)]',\n md: 'gap-[var(--control-size-md-gap)]',\n lg: 'gap-[var(--control-size-lg-gap)]',\n};\n\nexport const sizePaddingXClasses: Record<ControlSize, string> = {\n sm: 'px-[var(--control-size-sm-px)]',\n md: 'px-[var(--control-size-md-px)]',\n lg: 'px-[var(--control-size-lg-px)]',\n};\n\nexport const sizePaddingLeftClasses: Record<ControlSize, string> = {\n sm: 'pl-[var(--control-size-sm-px)]',\n md: 'pl-[var(--control-size-md-px)]',\n lg: 'pl-[var(--control-size-lg-px)]',\n};\n\nexport const sizePaddingRightClasses: Record<ControlSize, string> = {\n sm: 'pr-[var(--control-size-sm-px)]',\n md: 'pr-[var(--control-size-md-px)]',\n lg: 'pr-[var(--control-size-lg-px)]',\n};\n\n/* Right padding when an icon-button tray sits inside the input.\n * Layout reserves: base px + 24px (fixed icon button width) + 8px gap. */\nexport const sizePaddingRightWithTrayClasses: Record<ControlSize, string> = {\n sm: 'pr-[calc(var(--control-size-sm-px)+2rem)]',\n md: 'pr-[calc(var(--control-size-md-px)+2rem)]',\n lg: 'pr-[calc(var(--control-size-lg-px)+2rem)]',\n};\n\n/* Right padding when the icon-button tray holds two buttons.\n * Layout reserves: base px + 24px + 4px gap + 24px + 8px gap. */\nexport const sizePaddingRightWithTrayTwoClasses: Record<ControlSize, string> = {\n sm: 'pr-[calc(var(--control-size-sm-px)+3.75rem)]',\n md: 'pr-[calc(var(--control-size-md-px)+3.75rem)]',\n lg: 'pr-[calc(var(--control-size-lg-px)+3.75rem)]',\n};\n\n/* Left padding when an icon sits absolutely inside the input.\n * Layout reserves: icon-offset + icon size + 0.75rem gap. */\nexport const sizePaddingLeftWithIconClasses: Record<ControlSize, string> = {\n sm: 'pl-[calc(var(--control-size-sm-icon-offset)+var(--control-size-sm-icon)+0.75rem)]',\n md: 'pl-[calc(var(--control-size-md-icon-offset)+var(--control-size-md-icon)+0.75rem)]',\n lg: 'pl-[calc(var(--control-size-lg-icon-offset)+var(--control-size-lg-icon)+0.75rem)]',\n};\n\n/* Absolute left position of a leading icon, using the dedicated icon-offset\n * token (tighter than the input's overall px). */\nexport const sizeIconLeftPositionClasses: Record<ControlSize, string> = {\n sm: 'left-[var(--control-size-sm-icon-offset)]',\n md: 'left-[var(--control-size-md-icon-offset)]',\n lg: 'left-[var(--control-size-lg-icon-offset)]',\n};\n\n/* Absolute right position of an icon-button tray, aligned with the input's px. */\nexport const sizeTrayRightPositionClasses: Record<ControlSize, string> = {\n sm: 'right-[var(--control-size-sm-px)]',\n md: 'right-[var(--control-size-md-px)]',\n lg: 'right-[var(--control-size-lg-px)]',\n};\n\n/* Glyph sizing for icons that should scale with the control. */\nexport const sizeIconClasses: Record<ControlSize, string> = {\n sm: 'h-[var(--control-size-sm-icon)] w-[var(--control-size-sm-icon)]',\n md: 'h-[var(--control-size-md-icon)] w-[var(--control-size-md-icon)]',\n lg: 'h-[var(--control-size-lg-icon)] w-[var(--control-size-lg-icon)]',\n};\n\n/* Square/round icon-button: width = height. */\nexport const sizeSquareClasses: Record<ControlSize, string> = {\n sm: 'h-[var(--control-size-sm-height)] w-[var(--control-size-sm-height)]',\n md: 'h-[var(--control-size-md-height)] w-[var(--control-size-md-height)]',\n lg: 'h-[var(--control-size-lg-height)] w-[var(--control-size-lg-height)]',\n};\n","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { Spinner } from \"@/spinner/Spinner.tsx\";\nimport type { TablerIcon } from \"@tabler/icons-react\";\nimport {\n sizeFontClasses,\n sizeGapClasses,\n sizeHeightClasses,\n sizeIconClasses,\n sizePaddingXClasses,\n} from \"@/control-size/control-size.util.ts\";\n\nexport type Variant = 'primary' | 'secondary' | 'tertiary' | 'white' | 'black' | 'transparent';\nexport type Size = 'sm' | 'md' | 'lg';\n\nexport type ButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {\n variant?: Variant;\n size?: Size;\n loading?: boolean;\n children?: React.ReactNode;\n Icon?: TablerIcon;\n IconRight?: TablerIcon;\n}\n\nconst base: string = `\n inline-flex flex-row items-center justify-center\n button-ring font-[number:var(--font-weight-button)] font-[family-name:var(--font-family-base)] ring-0 disabled:hover:ring-0 hover:ring-[length:var(--control-ring-width)] active:ring-[length:var(--control-ring-width-active)]\n rounded-[var(--border-radius-button)]\n cursor-pointer transition-all duration-[var(--control-transition-duration)] select-none focus:outline-none focus:ring-[length:var(--control-ring-width)]\n disabled:cursor-default\n `;\n\nconst variantClasses: Record<Variant, string> = {\n primary: 'border-[length:var(--border-width-input)] button-primary shadow-[var(--shadow-control)]',\n secondary: 'border-[length:var(--border-width-input)] button-secondary shadow-[var(--shadow-control)]',\n tertiary: 'border-[length:var(--border-width-input)] button-tertiary',\n white: 'border-[length:var(--border-width-input)] button-white shadow-[var(--shadow-control)]',\n black: 'border-[length:var(--border-width-input)] button-black shadow-[var(--shadow-control)]',\n transparent: 'border-[length:var(--border-width-input)] button-transparent'\n}\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>((props, ref) => {\n\n const {\n variant = 'white',\n size = 'md',\n className,\n children,\n loading = false,\n Icon,\n IconRight,\n ...rest\n } = props;\n\n return (\n <button\n ref={ ref }\n className={ classNames(\n base,\n variantClasses[variant],\n sizeHeightClasses[size],\n sizePaddingXClasses[size],\n sizeFontClasses[size],\n sizeGapClasses[size],\n className\n ) }\n { ...rest }\n >\n { loading && <Spinner className={ classNames(sizeIconClasses[size]) } /> }\n { !loading && (<>\n { Icon && <Icon className={ classNames(sizeIconClasses[size], '-ml-1') }/> }\n { children }\n { IconRight && <IconRight className={ classNames(sizeIconClasses[size], '-mr-1') }/> }\n </>) }\n </button>\n );\n});\n","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport type { TablerIcon } from '@tabler/icons-react';\nimport { sizeIconClasses, sizeSquareClasses } from \"@/control-size/control-size.util.ts\";\n\nexport type Variant = 'primary' | 'secondary' | 'tertiary' | 'white' | 'black' | 'transparent';\nexport type Size = 'sm' | 'md' | 'lg';\n\nexport type ButtonIconSquareProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {\n variant?: Variant;\n size?: Size;\n loading?: boolean;\n Icon: TablerIcon;\n}\n\nconst base: string = `\n inline-flex flex-row items-center justify-center\n button-ring font-[number:var(--font-weight-button)] font-[family-name:var(--font-family-base)] ring-0 disabled:hover:ring-0 hover:ring-[length:var(--control-ring-width)] active:ring-[length:var(--control-ring-width-active)]\n rounded-[var(--border-radius-button)]\n cursor-pointer transition-all duration-[var(--control-transition-duration)] select-none focus:outline-none focus:ring-[length:var(--control-ring-width)]\n disabled:cursor-default\n`;\n\nconst variantClasses: Record<Variant, string> = {\n primary: 'border-[length:var(--border-width-input)] button-primary shadow-[var(--shadow-control)]',\n secondary: 'border-[length:var(--border-width-input)] button-secondary shadow-[var(--shadow-control)]',\n tertiary: 'border-[length:var(--border-width-input)] button-tertiary',\n white: 'border-[length:var(--border-width-input)] button-white shadow-[var(--shadow-control)]',\n black: 'border-[length:var(--border-width-input)] button-black shadow-[var(--shadow-control)]',\n transparent: 'border-[length:var(--border-width-input)] button-transparent'\n}\n\nexport const ButtonIconSquare = React.forwardRef<HTMLButtonElement, ButtonIconSquareProps>((props, ref) => {\n\n const {\n variant = 'white',\n size = 'md',\n className,\n Icon,\n ...rest\n } = props;\n\n return (\n <button\n ref={ ref }\n className={ classNames(\n base,\n variantClasses[variant],\n sizeSquareClasses[size],\n className\n ) }\n { ...rest }\n >\n { <Icon className={ sizeIconClasses[size] } /> }\n </button>\n );\n});\n","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport type { TablerIcon } from '@tabler/icons-react';\nimport { sizeIconClasses, sizeSquareClasses } from \"@/control-size/control-size.util.ts\";\n\nexport type Variant = 'primary' | 'secondary' | 'tertiary' | 'white' | 'black' | 'transparent';\nexport type Size = 'sm' | 'md' | 'lg';\n\nexport type ButtonIconRoundProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {\n variant?: Variant;\n size?: Size;\n loading?: boolean;\n Icon: TablerIcon;\n}\n\nconst base: string = `\n inline-flex flex-row items-center justify-center\n button-ring font-[number:var(--font-weight-button)] font-[family-name:var(--font-family-base)] ring-0 disabled:hover:ring-0 hover:ring-[length:var(--control-ring-width)] active:ring-[length:var(--control-ring-width-active)] rounded-full cursor-pointer transition-all duration-[var(--control-transition-duration)] select-none focus:outline-none focus:ring-[length:var(--control-ring-width)]\n disabled:cursor-default\n`;\n\nconst variantClasses: Record<Variant, string> = {\n primary: 'border-[length:var(--border-width-input)] button-primary shadow-[var(--shadow-control)]',\n secondary: 'border-[length:var(--border-width-input)] button-secondary shadow-[var(--shadow-control)]',\n tertiary: 'border-[length:var(--border-width-input)] button-tertiary',\n white: 'border-[length:var(--border-width-input)] button-white shadow-[var(--shadow-control)]',\n black: 'border-[length:var(--border-width-input)] button-black shadow-[var(--shadow-control)]',\n transparent: 'border-[length:var(--border-width-input)] button-transparent'\n}\n\nexport const ButtonIconRound = React.forwardRef<HTMLButtonElement, ButtonIconRoundProps>((props, ref) => {\n\n const {\n variant = 'white',\n size = 'md',\n className,\n Icon,\n ...rest\n } = props;\n\n return (\n <button\n ref={ ref }\n className={ classNames(\n base,\n variantClasses[variant],\n sizeSquareClasses[size],\n className\n ) }\n { ...rest }\n >\n { <Icon className={ sizeIconClasses[size] } /> }\n </button>\n );\n});\n","import * as React from \"react\";\n\nexport type InputLabelProps = {\n children?: React.ReactNode;\n}\n\nexport const InputLabel = (props: InputLabelProps) => {\n const {\n children\n } = props;\n\n if (!children) {\n return null;\n }\n\n return (\n <label className={ 'input-label font-[number:var(--font-weight-input-label)] mb-1' }>{ children }</label>\n );\n};","import { IconExclamationCircleFilled } from \"@tabler/icons-react\";\n\nexport const InputErrorIcon = () => {\n return (\n <div className={ 'h-5 w-5' }>\n <IconExclamationCircleFilled className={ 'h-5 w-5 input-error-icon' }/>\n </div>\n );\n};","import { createContext, useContext } from \"react\";\nimport type { ControlSize } from \"@/control-size/control-size.util.ts\";\n\nexport const ControlSizeContext = createContext<ControlSize>('md');\n\nexport const useControlSize = (): ControlSize => useContext(ControlSizeContext);\n","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { useControlSize } from \"@/control-size/use-control-size.ts\";\nimport { sizeTrayRightPositionClasses } from \"@/control-size/control-size.util.ts\";\n\nexport type InputIconButtonTrayProps = {\n children?: React.ReactNode;\n className?: string;\n}\n\nexport const InputIconButtonTray = React.forwardRef<HTMLDivElement, InputIconButtonTrayProps>((props, ref) => {\n const {\n children,\n className\n } = props;\n const size = useControlSize();\n return (\n <div\n ref={ ref }\n className={ classNames(\n 'absolute top-1/2 -translate-y-1/2 flex flex-row items-center gap-1 pointer-events-none',\n sizeTrayRightPositionClasses[size],\n className\n ) }>\n { children }\n </div>\n );\n});\n","import * as React from \"react\";\n\nexport type InputDescriptionProps = {\n children?: React.ReactNode;\n}\n\nexport const InputDescription = (props: InputDescriptionProps) => {\n const {\n children\n } = props;\n\n if (!children) {\n return null;\n }\n\n return (\n <div className={ 'input-description text-[length:var(--font-size-description)] font-[number:var(--font-weight-input-description)] mt-2' }>{ children }</div>\n );\n};","import * as React from \"react\";\n\nexport type InputErrorProps = {\n children?: React.ReactNode;\n}\n\nexport const InputError = (props: InputErrorProps) => {\n const {\n children\n } = props;\n\n if (!children) {\n return null;\n }\n\n return (\n <div className={ 'input-error-text text-[length:var(--font-size-error)] font-[number:var(--font-weight-input-error)] mt-2' }>{ children }</div>\n );\n};","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { type TablerIcon } from \"@tabler/icons-react\";\nimport { InputLabel } from \"@/components/inputs/InputLabel.tsx\";\nimport { InputErrorIcon } from \"@/components/inputs/InputErrorIcon.tsx\";\nimport { InputIconButtonTray } from \"@/components/inputs/InputIconButtonTray.tsx\";\nimport { InputDescription } from \"@/components/inputs/InputDescription.tsx\";\nimport { InputError } from \"@/components/inputs/InputError.tsx\";\nimport { ControlSizeContext } from \"@/control-size/use-control-size.ts\";\nimport {\n sizeFontClasses,\n sizeHeightClasses,\n sizeIconClasses,\n sizeIconLeftPositionClasses,\n sizePaddingLeftClasses,\n sizePaddingLeftWithIconClasses,\n sizePaddingRightClasses,\n sizePaddingRightWithTrayClasses,\n} from \"@/control-size/control-size.util.ts\";\n\n\nexport type Size = 'sm' | 'md' | 'lg';\n\nexport type InputProps = Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> & {\n label?: string | React.ReactNode;\n description?: string | React.ReactNode;\n error?: string | React.ReactNode;\n Icon?: TablerIcon;\n buttonTray?: React.ReactNode;\n size?: Size;\n}\n\n\nexport const Input = (props: InputProps) => {\n\n const {\n className,\n label,\n description,\n Icon,\n error,\n buttonTray,\n size = 'md',\n ...rest\n } = props;\n\n const hasTray = !!error || !!buttonTray;\n\n //TODO: set htmlfor on label if id is provided in props\n\n return (\n <ControlSizeContext.Provider value={ size }>\n <div\n className={ classNames(\n 'flex flex-col',\n className\n ) }>\n <InputLabel>{ label }</InputLabel>\n <div className={ 'flex flex-col relative' }>\n { Icon && (\n <Icon className={ classNames(\n 'input-icon absolute top-1/2 -translate-y-1/2',\n sizeIconClasses[size],\n sizeIconLeftPositionClasses[size],\n ) }/>\n ) }\n <input\n className={ classNames(\n 'border-[length:var(--border-width-input)] input-base transition-all duration-[var(--control-transition-duration)] rounded-[var(--border-radius-input)] shadow-[var(--shadow-control)] ring-0 focus:ring-[length:var(--control-ring-width)] focus:outline-none font-[number:var(--font-weight-input-text)] font-[family-name:var(--font-family-base)]',\n sizeHeightClasses[size],\n sizeFontClasses[size],\n Icon ? sizePaddingLeftWithIconClasses[size] : sizePaddingLeftClasses[size],\n hasTray ? sizePaddingRightWithTrayClasses[size] : sizePaddingRightClasses[size],\n error && 'input-error',\n ) }\n { ...rest }\n />\n <InputIconButtonTray>\n { error && (\n <InputErrorIcon/>\n ) }\n { buttonTray }\n </InputIconButtonTray>\n </div>\n <InputDescription>{ description }</InputDescription>\n <InputError>{ error }</InputError>\n </div>\n </ControlSizeContext.Provider>\n );\n};\n","export type HSV = [number, number, number];\n\nexport const hexToRgb = (hex: string): [number, number, number] | null => {\n const m = hex.match(/^#?([0-9a-fA-F]{6})$/);\n if (!m) return null;\n const n = parseInt(m[1], 16);\n return [((n >> 16) & 0xff) / 255, ((n >> 8) & 0xff) / 255, (n & 0xff) / 255];\n};\n\nexport const rgbToHex = (r: number, g: number, b: number): string => {\n const c = (v: number) => Math.round(v * 255).toString(16).padStart(2, '0').toUpperCase();\n return '#' + c(r) + c(g) + c(b);\n};\n\nexport const rgbToHsv = (r: number, g: number, b: number): HSV => {\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const d = max - min;\n let h = 0;\n if (d !== 0) {\n if (max === r) h = ((g - b) / d + 6) % 6;\n else if (max === g) h = (b - r) / d + 2;\n else h = (r - g) / d + 4;\n h *= 60;\n }\n return [h, max === 0 ? 0 : d / max, max];\n};\n\nexport const hsvToRgb = (h: number, s: number, v: number): [number, number, number] => {\n const c = v * s;\n const hh = h / 60;\n const x = c * (1 - Math.abs((hh % 2) - 1));\n let r = 0, g = 0, b = 0;\n if (hh < 1) { r = c; g = x; }\n else if (hh < 2) { r = x; g = c; }\n else if (hh < 3) { g = c; b = x; }\n else if (hh < 4) { g = x; b = c; }\n else if (hh < 5) { r = x; b = c; }\n else { r = c; b = x; }\n const m = v - c;\n return [r + m, g + m, b + m];\n};\n\nexport const hsvToHex = (h: number, s: number, v: number): string => {\n const [r, g, b] = hsvToRgb(h, s, v);\n return rgbToHex(r, g, b);\n};\n\nexport const hexToHsv = (hex: string): HSV | null => {\n const rgb = hexToRgb(hex);\n if (!rgb) return null;\n return rgbToHsv(rgb[0], rgb[1], rgb[2]);\n};\n\n// Normalizes hex shorthand and named/rgb() colors to canonical #RRGGBB uppercase.\n// Returns null when the input can't be resolved to a color.\nexport const formatHex = (input: string): string | null => {\n const trimmed = input.trim();\n if (!trimmed) return null;\n\n const hexMatch = trimmed.match(/^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/);\n if (hexMatch) {\n let hex = hexMatch[1];\n if (hex.length === 3) hex = hex.split('').map(c => c + c).join('');\n return '#' + hex.toUpperCase();\n }\n\n if (typeof document === 'undefined') return null;\n const probe = document.createElement('div');\n probe.style.color = trimmed;\n if (!probe.style.color) return null;\n document.body.appendChild(probe);\n const computed = getComputedStyle(probe).color;\n document.body.removeChild(probe);\n\n const rgb = computed.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/);\n if (!rgb) return null;\n return '#' + [rgb[1], rgb[2], rgb[3]]\n .map(n => parseInt(n, 10).toString(16).padStart(2, '0'))\n .join('')\n .toUpperCase();\n};\n","import * as React from \"react\";\n\n// Captures the element's rect on pointer-down so subsequent moves can compute\n// ratios without forcing layout each frame. Uses pointer capture so events\n// continue routing to the source element even when the pointer leaves it.\nexport const usePointerDrag = (\n onPosition: (clientX: number, clientY: number, rect: DOMRect) => void,\n) => {\n const rectRef = React.useRef<DOMRect | null>(null);\n const [isDragging, setIsDragging] = React.useState(false);\n\n const release = (e: React.PointerEvent) => {\n rectRef.current = null;\n setIsDragging(false);\n (e.currentTarget as HTMLElement).releasePointerCapture?.(e.pointerId);\n };\n\n return {\n isDragging,\n bind: {\n onPointerDown: (e: React.PointerEvent) => {\n const el = e.currentTarget as HTMLElement;\n rectRef.current = el.getBoundingClientRect();\n el.setPointerCapture?.(e.pointerId);\n setIsDragging(true);\n onPosition(e.clientX, e.clientY, rectRef.current);\n },\n onPointerMove: (e: React.PointerEvent) => {\n if (rectRef.current) onPosition(e.clientX, e.clientY, rectRef.current);\n },\n onPointerUp: release,\n onPointerCancel: release,\n },\n };\n};\n","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport type { Size } from \"@/components/button/Button.tsx\";\n\nexport type DropdownPanelProps = React.HTMLProps<HTMLDivElement> & {\n children?: React.ReactNode;\n className?: string;\n padding?: Size;\n}\n\nconst baseClassName: string = 'flex flex-col dropdown-panel border-[length:var(--border-width-input)] mt-1 rounded-[var(--border-radius-dropdown)] shadow-[var(--shadow-dropdown)] overflow-y-auto relative space-y-1';\n\nconst paddingClasses: Record<Size, string> = {\n sm: 'p-2',\n md: 'p-3',\n lg: 'p-4'\n}\n\nexport const DropdownPanel = (props: DropdownPanelProps) => {\n const {\n className,\n children,\n padding = 'md',\n ...rest\n } = props;\n return (\n <div\n className={ classNames(baseClassName, paddingClasses[padding], className) }\n { ...rest }\n >\n { children }\n </div>\n );\n};","import * as React from \"react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { FloatingPortal, type Placement } from \"@floating-ui/react\";\nimport type { PopoverBaseRefProps, PopoverRendererProps } from \"@/popover/use-popover.tsx\";\n\nconst placementOriginMap: Record<Placement, string> = {\n 'top': 'bottom center',\n 'top-start': 'bottom left',\n 'top-end': 'bottom right',\n 'right': 'left center',\n 'right-start': 'top left',\n 'right-end': 'bottom left',\n 'bottom': 'top center',\n 'bottom-start': 'top left',\n 'bottom-end': 'top right',\n 'left': 'right center',\n 'left-start': 'top right',\n 'left-end': 'bottom right',\n};\n\nexport type PopoverBaseProps = PopoverRendererProps & PopoverBaseRefProps & {\n floatingProps?: React.HTMLProps<HTMLDivElement>;\n};\n\nexport const PopoverBase: React.FC<PopoverBaseProps> = React.memo(\n ({ open, children, className, floatingStyles, setFloating, placement, floatingProps }) => {\n return (\n <FloatingPortal>\n <AnimatePresence>\n { open && (\n <div ref={ setFloating } style={ floatingStyles } className={ 'z-50' } { ...floatingProps }>\n <motion.div\n className={ className }\n style={ { transformOrigin: placementOriginMap[placement] } }\n initial={ { opacity: 0, scale: 0.95 } }\n animate={ { opacity: 1, scale: 1 } }\n exit={ { opacity: 0, scale: 0.95 } }\n transition={ { duration: 0.1, ease: \"easeInOut\" } }\n >\n { children }\n </motion.div>\n </div>\n ) }\n </AnimatePresence>\n </FloatingPortal>\n );\n }\n);\n\n","import * as React from \"react\";\nimport { autoUpdate, flip, type Placement, shift, size, useDismiss, useFloating, useInteractions } from \"@floating-ui/react\";\nimport { PopoverBase } from \"@/popover/PopoverBase.tsx\";\n\n\nexport type UsePopoverProps = {\n placement?: Placement;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n fullWidth?: boolean;\n minWidth?: number;\n maxWidth?: number;\n};\n\nexport type PopoverRendererProps = {\n open: boolean;\n children: React.ReactNode;\n className?: string\n}\n\nexport type PopoverBaseRefProps = {\n floatingStyles: React.CSSProperties;\n setFloating: React.RefCallback<HTMLDivElement>;\n placement: Placement;\n}\n\ntype PopoverLatestProps = PopoverBaseRefProps & {\n getFloatingProps: (userProps?: React.HTMLProps<HTMLElement>) => Record<string, unknown>;\n}\n\nexport type UsePopoverResult = {\n anchorRef: React.RefCallback<HTMLDivElement | null>;\n Popover: React.ComponentType<PopoverRendererProps>;\n}\n\nexport const usePopover = (props: UsePopoverProps): UsePopoverResult => {\n const { placement = \"bottom\", open, onOpenChange, fullWidth, minWidth, maxWidth } = props;\n\n const middleware = React.useMemo(() => {\n return [\n flip({ padding: 8 }),\n shift({ padding: 8 }),\n size({\n apply({ rects, elements }) {\n if (fullWidth) {\n elements.floating.style.width = `${ rects.reference.width }px`;\n }\n if (minWidth) {\n elements.floating.style.minWidth = `${ minWidth }px`;\n }\n if (maxWidth) {\n elements.floating.style.maxWidth = `${ maxWidth }px`;\n }\n },\n })\n ];\n }, [fullWidth, maxWidth, minWidth]);\n\n const { refs, floatingStyles, context, placement: resolvedPlacement } = useFloating({\n placement,\n open,\n onOpenChange,\n middleware,\n whileElementsMounted: autoUpdate,\n });\n\n const dismiss = useDismiss(context, {\n enabled: !!onOpenChange,\n outsidePress: true,\n escapeKey: false,\n });\n\n const { getFloatingProps } = useInteractions([dismiss]);\n\n const latest = React.useRef<PopoverLatestProps>({\n floatingStyles,\n setFloating: refs.setFloating,\n placement,\n getFloatingProps,\n });\n latest.current = {\n floatingStyles,\n setFloating: refs.setFloating,\n placement: resolvedPlacement,\n getFloatingProps,\n };\n\n const Popover = React.useMemo<React.ComponentType<PopoverRendererProps>>(() => {\n const Renderer = (rendererProps: PopoverRendererProps) => {\n const { floatingStyles, setFloating, placement, getFloatingProps } = latest.current;\n const { className, open, children } = rendererProps;\n return (\n <PopoverBase\n open={ open }\n className={ className }\n floatingStyles={ floatingStyles }\n setFloating={ setFloating }\n placement={ placement }\n floatingProps={ getFloatingProps() as React.HTMLProps<HTMLDivElement> }\n >\n { children }\n </PopoverBase>\n );\n };\n return React.memo(Renderer);\n }, []);\n\n return {\n anchorRef: refs.setReference,\n Popover: Popover,\n };\n};\n","import { useEffect } from \"react\";\n\nexport const useDismiss = (active: boolean, onDismiss: () => void) => {\n useEffect(() => {\n if (!active) return;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n onDismiss();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [active, onDismiss]);\n}","import * as React from \"react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { motion } from \"motion/react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { formatHex, hexToHsv, hsvToHex, type HSV } from \"@/util/color.util.ts\";\nimport { usePointerDrag } from \"@/hooks/use-pointer-drag.ts\";\nimport { InputLabel } from \"@/components/inputs/InputLabel.tsx\";\nimport { InputErrorIcon } from \"@/components/inputs/InputErrorIcon.tsx\";\nimport { InputIconButtonTray } from \"@/components/inputs/InputIconButtonTray.tsx\";\nimport { InputDescription } from \"@/components/inputs/InputDescription.tsx\";\nimport { InputError } from \"@/components/inputs/InputError.tsx\";\nimport { DropdownPanel } from \"@/components/dropdown-menu/DropdownPanel.tsx\";\nimport { usePopover } from \"@/popover/use-popover.tsx\";\nimport { useDismiss } from \"@/hooks/use-dismiss.ts\";\nimport { ControlSizeContext } from \"@/control-size/use-control-size.ts\";\nimport {\n sizeFontClasses,\n sizeHeightClasses,\n sizeIconClasses,\n sizeIconLeftPositionClasses,\n sizePaddingLeftWithIconClasses,\n sizePaddingRightClasses,\n sizePaddingRightWithTrayClasses,\n} from \"@/control-size/control-size.util.ts\";\n\n\nexport type Size = 'sm' | 'md' | 'lg';\n\nexport type InputColorProps = Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> & {\n label?: string | React.ReactNode;\n description?: string | React.ReactNode;\n error?: string | React.ReactNode;\n buttonTray?: React.ReactNode;\n size?: Size;\n}\n\n\nconst HUE_GRADIENT = 'linear-gradient(to right, #f00 0%, #ff0 16.66%, #0f0 33.33%, #0ff 50%, #00f 66.66%, #f0f 83.33%, #f00 100%)';\nconst SV_SATURATION_GRADIENT = 'linear-gradient(to right, #fff, rgba(255,255,255,0))';\nconst SV_VALUE_GRADIENT = 'linear-gradient(to top, #000, rgba(0,0,0,0))';\nconst THUMB_SHADOW = '0 0 0 1px rgba(0,0,0,0.15)';\nconst THUMB_SIZE = 14;\nconst THUMB_SIZE_ACTIVE = 28;\nconst THUMB_RADIUS = 6;\nconst THUMB_RADIUS_ACTIVE = 8;\nconst THUMB_SPRING = { type: 'spring', stiffness: 500, damping: 18, mass: 0.6 } as const;\n\nconst thumbAnimate = (active: boolean) => {\n const size = active ? THUMB_SIZE_ACTIVE : THUMB_SIZE;\n const half = size / 2;\n return {\n width: size,\n height: size,\n marginLeft: -half,\n marginTop: -half,\n borderRadius: active ? THUMB_RADIUS_ACTIVE : THUMB_RADIUS,\n };\n};\n\nconst clamp01 = (n: number) => Math.max(0, Math.min(1, n));\n\nconst setInputValueAndNotify = (input: HTMLInputElement, value: string) => {\n const setter = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value')?.set;\n setter?.call(input, value);\n input.dispatchEvent(new Event('input', { bubbles: true }));\n};\n\n\ntype ColorPickerProps = {\n value: string;\n onChange: (hex: string) => void;\n};\n\nconst ColorPicker = ({ value, onChange }: ColorPickerProps) => {\n const [hsv, setHsv] = useState<HSV>(() => hexToHsv(value) ?? [0, 0, 1]);\n const lastEmittedRef = useRef<string>(hsvToHex(hsv[0], hsv[1], hsv[2]));\n\n useEffect(() => {\n if ((value || '').toUpperCase() === lastEmittedRef.current) return;\n const parsed = hexToHsv(value);\n if (parsed) setHsv(parsed);\n }, [value]);\n\n const updateHsv = (next: HSV) => {\n setHsv(next);\n const hex = hsvToHex(next[0], next[1], next[2]);\n lastEmittedRef.current = hex;\n onChange(hex);\n };\n\n const [h, s, v] = hsv;\n const hueOnly = hsvToHex(h, 1, 1);\n const brightnessMax = hsvToHex(h, s, 1);\n const currentColor = hsvToHex(h, s, v);\n\n const svDrag = usePointerDrag((cx, cy, rect) => {\n updateHsv([h, clamp01((cx - rect.left) / rect.width), 1 - clamp01((cy - rect.top) / rect.height)]);\n });\n const hueDrag = usePointerDrag((cx, _cy, rect) => {\n updateHsv([clamp01((cx - rect.left) / rect.width) * 360, s, v]);\n });\n const brightnessDrag = usePointerDrag((cx, _cy, rect) => {\n updateHsv([h, s, clamp01((cx - rect.left) / rect.width)]);\n });\n\n return (\n <div\n className={ 'flex flex-col gap-3' }\n style={ { width: 220, userSelect: 'none' } }\n onMouseDown={ (e) => e.preventDefault() }\n >\n <div\n className={ 'relative w-full' }\n style={ {\n height: 160,\n touchAction: 'none',\n cursor: 'crosshair',\n } }\n { ...svDrag.bind }\n >\n <div\n className={ 'absolute inset-0 rounded-[var(--border-radius-control-inner)] overflow-hidden border-[length:var(--border-width-input)] color-picker-surface' }\n style={ { backgroundColor: hueOnly } }\n >\n <div\n className={ 'absolute inset-0 pointer-events-none' }\n style={ { background: SV_SATURATION_GRADIENT } }\n />\n <div\n className={ 'absolute inset-0 pointer-events-none' }\n style={ { background: SV_VALUE_GRADIENT } }\n />\n </div>\n <motion.div\n className={ 'absolute pointer-events-none border-1 border-white' }\n style={ {\n left: `${ s * 100 }%`,\n top: `${ (1 - v) * 100 }%`,\n boxShadow: THUMB_SHADOW,\n backgroundColor: currentColor,\n } }\n initial={ thumbAnimate(false) }\n animate={ thumbAnimate(svDrag.isDragging) }\n transition={ THUMB_SPRING }\n />\n </div>\n\n <div\n className={ 'relative w-full rounded-[var(--border-radius-control-inner)]' }\n style={ {\n height: 12,\n background: HUE_GRADIENT,\n touchAction: 'none',\n cursor: 'ew-resize',\n } }\n { ...hueDrag.bind }\n >\n <motion.div\n className={ 'absolute pointer-events-none border-1 border-white' }\n style={ {\n top: '50%',\n left: `${ (h / 360) * 100 }%`,\n backgroundColor: hueOnly,\n boxShadow: THUMB_SHADOW,\n } }\n initial={ thumbAnimate(false) }\n animate={ thumbAnimate(hueDrag.isDragging) }\n transition={ THUMB_SPRING }\n />\n </div>\n\n <div\n className={ 'relative w-full rounded-[var(--border-radius-control-inner)]' }\n style={ {\n height: 12,\n background: `linear-gradient(to right, #000, ${ brightnessMax })`,\n touchAction: 'none',\n cursor: 'ew-resize',\n } }\n { ...brightnessDrag.bind }\n >\n <motion.div\n className={ 'absolute pointer-events-none border-1 border-white' }\n style={ {\n top: '50%',\n left: `${ v * 100 }%`,\n backgroundColor: currentColor,\n boxShadow: THUMB_SHADOW,\n } }\n initial={ thumbAnimate(false) }\n animate={ thumbAnimate(brightnessDrag.isDragging) }\n transition={ THUMB_SPRING }\n />\n </div>\n </div>\n );\n};\n\n\nexport const InputColor = (props: InputColorProps) => {\n\n const {\n className,\n label,\n description,\n error,\n buttonTray,\n size = 'md',\n value,\n defaultValue,\n onChange,\n onBlur,\n onFocus,\n ...rest\n } = props;\n\n const [internalValue, setInternalValue] = useState<string>(\n value != null ? String(value) : defaultValue != null ? String(defaultValue) : ''\n );\n const [open, setOpen] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const currentValue = value != null ? String(value) : internalValue;\n const swatchColor = currentValue || 'white';\n\n useDismiss(open, () => setOpen(false));\n\n const { anchorRef, Popover } = usePopover({\n placement: 'bottom-start',\n open,\n onOpenChange: setOpen,\n });\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n setInternalValue(event.target.value);\n onChange?.(event);\n };\n\n const handleFocus = (event: React.FocusEvent<HTMLInputElement>) => {\n setOpen(true);\n onFocus?.(event);\n };\n\n const handleBlur = (event: React.FocusEvent<HTMLInputElement>) => {\n const raw = event.target.value;\n const formatted = formatHex(raw);\n if (formatted && formatted !== raw && inputRef.current) {\n setInputValueAndNotify(inputRef.current, formatted);\n }\n setOpen(false);\n onBlur?.(event);\n };\n\n const handlePickerChange = (hex: string) => {\n if (inputRef.current) setInputValueAndNotify(inputRef.current, hex);\n };\n\n const hasTray = !!error || !!buttonTray;\n\n return (\n <ControlSizeContext.Provider value={ size }>\n <div\n className={ classNames(\n 'flex flex-col',\n className\n ) }>\n <InputLabel>{ label }</InputLabel>\n <div className={ 'flex flex-col relative' } ref={ anchorRef }>\n <div\n className={ classNames(\n 'absolute top-1/2 -translate-y-1/2 rounded-[var(--border-radius-control-inner)] border-[length:var(--border-width-input)] color-swatch',\n sizeIconClasses[size],\n sizeIconLeftPositionClasses[size],\n ) }\n style={ { backgroundColor: swatchColor } }\n />\n <input\n ref={ inputRef }\n className={ classNames(\n 'border-[length:var(--border-width-input)] input-base transition-all duration-[var(--control-transition-duration)] rounded-[var(--border-radius-input)] shadow-[var(--shadow-control)] ring-0 focus:ring-[length:var(--control-ring-width)] focus:outline-none font-[number:var(--font-weight-input-text)] font-[family-name:var(--font-family-base)]',\n sizeHeightClasses[size],\n sizeFontClasses[size],\n sizePaddingLeftWithIconClasses[size],\n hasTray ? sizePaddingRightWithTrayClasses[size] : sizePaddingRightClasses[size],\n error && 'input-error',\n ) }\n value={ value != null ? value : internalValue }\n onChange={ handleChange }\n onFocus={ handleFocus }\n onBlur={ handleBlur }\n onClick={ () => setOpen(true) }\n { ...rest }\n />\n <InputIconButtonTray>\n { error && (\n <InputErrorIcon/>\n ) }\n { buttonTray }\n </InputIconButtonTray>\n <Popover open={ open }>\n <DropdownPanel padding={ 'md' }>\n <ColorPicker value={ currentValue } onChange={ handlePickerChange }/>\n </DropdownPanel>\n </Popover>\n </div>\n <InputDescription>{ description }</InputDescription>\n <InputError>{ error }</InputError>\n </div>\n </ControlSizeContext.Provider>\n );\n};\n","import { type TablerIcon } from \"@tabler/icons-react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\n\nexport type InputIconButtonProps = {\n onClick?: () => void;\n Icon: TablerIcon\n}\n\nexport const InputIconButton = (props: InputIconButtonProps) => {\n const {\n onClick,\n Icon\n } = props;\n return (\n <div\n onClick={ onClick }\n className={ classNames(\n 'h-6 w-6 select-none rounded-full p-0.5',\n onClick && 'ring-0 transition-all duration-[var(--control-transition-duration)] input-icon-button-interactive active:ring-[length:var(--control-ring-width-active)] cursor-pointer hover:ring-[length:var(--control-ring-width)] group pointer-events-auto'\n ) }\n >\n <Icon className={ classNames('h-5 w-5 input-icon-button-icon', onClick && 'group-active:scale-[0.8] transition-transform duration-[var(--control-transition-duration)] origin-center') }/>\n </div>\n );\n};","import { useState } from \"react\";\nimport { Input, type InputProps } from \"@/components/inputs/Input.tsx\";\nimport { IconEye, IconEyeOff } from \"@tabler/icons-react\";\nimport { InputIconButton } from \"@/components/inputs/InputIconButton.tsx\";\n\n\nexport type InputPasswordProps = InputProps & {\n enableShowPasswordToggle?: boolean;\n}\n\n\nexport const InputPassword = (props: InputPasswordProps) => {\n\n const {\n type = 'password',\n enableShowPasswordToggle = true,\n ...rest\n } = props;\n\n const [ showPassword, setShowPassword ] = useState<boolean>(false);\n\n const handleToggleShowPassword = () => {\n setShowPassword(!showPassword);\n }\n\n return (\n <Input\n type={ showPassword ? 'text' : type }\n buttonTray={\n enableShowPasswordToggle ? (\n <InputIconButton Icon={ showPassword ? IconEyeOff : IconEye } onClick={ handleToggleShowPassword }/>\n ) : undefined\n }\n { ...rest }\n />\n );\n};","import * as React from \"react\";\nimport { mergeRefs } from \"react-merge-refs\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { InputLabel } from \"@/components/inputs/InputLabel.tsx\";\nimport { InputErrorIcon } from \"@/components/inputs/InputErrorIcon.tsx\";\nimport { InputIconButtonTray } from \"@/components/inputs/InputIconButtonTray.tsx\";\nimport { InputDescription } from \"@/components/inputs/InputDescription.tsx\";\nimport { InputError } from \"@/components/inputs/InputError.tsx\";\nimport { ControlSizeContext } from \"@/control-size/use-control-size.ts\";\nimport {\n sizeFontClasses,\n sizeMinHeightClasses,\n sizePaddingLeftClasses,\n sizePaddingRightClasses,\n sizePaddingRightWithTrayClasses,\n} from \"@/control-size/control-size.util.ts\";\n\n\nexport type Size = 'sm' | 'md' | 'lg';\n\nexport type InputTextAreaProps = React.TextareaHTMLAttributes<HTMLTextAreaElement> & {\n label?: string | React.ReactNode;\n description?: string | React.ReactNode;\n error?: string | React.ReactNode;\n size?: Size;\n autogrow?: boolean;\n maxRows?: number;\n ref?: React.Ref<HTMLTextAreaElement>;\n}\n\n\nexport const InputTextArea = (props: InputTextAreaProps) => {\n\n const {\n className,\n label,\n description,\n error,\n size = 'md',\n autogrow = false,\n maxRows,\n ref,\n onChange,\n ...rest\n } = props;\n\n const internalRef = React.useRef<HTMLTextAreaElement>(null);\n\n const resize = React.useCallback(() => {\n const el = internalRef.current;\n if (!el) return;\n el.style.height = 'auto';\n\n let targetHeight = el.scrollHeight;\n\n if (maxRows) {\n const styles = window.getComputedStyle(el);\n const lineHeight = parseFloat(styles.lineHeight);\n const paddingTop = parseFloat(styles.paddingTop);\n const paddingBottom = parseFloat(styles.paddingBottom);\n const borderTop = parseFloat(styles.borderTopWidth);\n const borderBottom = parseFloat(styles.borderBottomWidth);\n const maxHeight = lineHeight * maxRows + paddingTop + paddingBottom + borderTop + borderBottom;\n targetHeight = Math.min(el.scrollHeight, maxHeight);\n }\n\n el.style.height = `${ targetHeight }px`;\n }, [ maxRows ]);\n\n React.useLayoutEffect(() => {\n if (!autogrow) {\n if (internalRef.current) {\n internalRef.current.style.height = '';\n }\n return;\n }\n resize();\n }, [ autogrow, resize, props.value, props.defaultValue, size ]);\n\n const handleChange = (event: React.ChangeEvent<HTMLTextAreaElement>) => {\n onChange?.(event);\n if (autogrow) resize();\n };\n\n return (\n <ControlSizeContext.Provider value={ size }>\n <div\n className={ classNames(\n 'flex flex-col',\n className\n ) }>\n <InputLabel>{ label }</InputLabel>\n <div className={ 'flex flex-col relative' }>\n <textarea\n ref={ ref ? mergeRefs([ ref, internalRef ]) : internalRef }\n onChange={ handleChange }\n className={ classNames(\n 'py-2.5 border-[length:var(--border-width-input)] input-base transition-all duration-[var(--control-transition-duration)] rounded-[var(--border-radius-input)] shadow-[var(--shadow-control)] ring-0 focus:ring-[length:var(--control-ring-width)] focus:outline-none font-[number:var(--font-weight-input-text)] font-[family-name:var(--font-family-base)]',\n sizeMinHeightClasses[size],\n sizeFontClasses[size],\n sizePaddingLeftClasses[size],\n error ? sizePaddingRightWithTrayClasses[size] : sizePaddingRightClasses[size],\n error && 'input-error',\n autogrow && (maxRows\n ? 'resize-none overflow-y-auto [scrollbar-width:none] [&::-webkit-scrollbar]:hidden'\n : 'resize-none overflow-hidden'),\n ) }\n { ...rest }\n />\n <InputIconButtonTray className={ 'top-3.5 translate-y-0' }>\n { error && (\n <InputErrorIcon/>\n ) }\n </InputIconButtonTray>\n </div>\n <InputDescription>{ description }</InputDescription>\n <InputError>{ error }</InputError>\n </div>\n </ControlSizeContext.Provider>\n );\n};\n","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { InputDescription } from \"@/components/inputs/InputDescription.tsx\";\nimport { InputError } from \"@/components/inputs/InputError.tsx\";\n\nexport type InputRadioProps = Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> & {\n name?: string;\n label?: string | React.ReactNode;\n description?: string | React.ReactNode;\n error?: string | React.ReactNode;\n}\n\nexport const InputRadio = (props: InputRadioProps) => {\n const {\n className,\n label,\n description,\n error,\n ...rest\n } = props;\n return (\n <div\n className={ classNames(\n 'flex flex-col',\n className\n ) }\n >\n <div className={ 'flex flex-row gap-3' }>\n <input\n type={ 'radio' }\n className={ 'h-6 w-6 shrink-0 rounded-full border-[length:var(--border-width-input)] check-base shadow-[var(--shadow-control)] ring-0 hover:ring-[length:var(--control-ring-width)] focus:ring-[length:var(--control-ring-width)] ring-offset-0 focus:outline-0 transition-all duration-[var(--control-transition-duration)]' }\n { ...rest }\n />\n { label && (\n <label htmlFor={ props.id } className={ classNames(\n 'input-label font-[number:var(--font-weight-input-option-label)] mb-1',\n props.id && 'cursor-pointer'\n ) }>{ label }</label>\n ) }\n </div>\n <InputDescription>{ description }</InputDescription>\n <InputError>{ error }</InputError>\n </div>\n );\n};","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { InputDescription } from \"@/components/inputs/InputDescription.tsx\";\nimport { InputError } from \"@/components/inputs/InputError.tsx\";\n\nexport type InputToggleProps = Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> & {\n label?: string | React.ReactNode;\n description?: string | React.ReactNode;\n error?: string | React.ReactNode;\n}\n\nexport const InputToggle = (props: InputToggleProps) => {\n const {\n className,\n label,\n description,\n error,\n ...rest\n } = props;\n return (\n <div\n className={ classNames(\n 'flex flex-col',\n className\n ) }\n >\n <div className={ 'flex flex-row gap-3' }>\n <div className={'relative shrink-0 h-6 w-10'}>\n <input\n type={ 'checkbox' }\n className={ 'appearance-none absolute inset-0 h-6 w-10 rounded-full checked:bg-transparent border-0 toggle-input ring-0 hover:ring-[length:var(--control-ring-width)] focus:ring-[length:var(--control-ring-width)] ring-offset-0 focus:outline-0 transition-all duration-[var(--control-transition-duration)]' }\n { ...rest }\n />\n <div className={classNames(\n 'rounded-full absolute border inset-0 pointer-events-none transition-colors duration-[var(--control-transition-duration)] ',\n props.checked ? 'toggle-track-on' : 'toggle-track-off'\n )}>\n <div className={classNames(\n 'absolute top-1/2 -translate-y-1/2 left-1 h-4 w-4 rounded-full toggle-thumb shadow-md transition-all duration-[var(--control-transition-duration)]',\n props.checked && 'translate-x-3.5 '\n )}/>\n </div>\n </div>\n { label && (\n <label htmlFor={ props.id } className={ classNames(\n 'input-label font-[number:var(--font-weight-input-option-label)] mb-1',\n props.id && 'cursor-pointer'\n ) }>{ label }</label>\n ) }\n </div>\n <InputDescription>{ description }</InputDescription>\n <InputError>{ error }</InputError>\n </div>\n );\n};","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { InputDescription } from \"@/components/inputs/InputDescription.tsx\";\nimport { InputError } from \"@/components/inputs/InputError.tsx\";\n\nexport type InputCheckProps = Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> & {\n label?: string | React.ReactNode;\n description?: string | React.ReactNode;\n error?: string | React.ReactNode;\n}\n\nexport const InputCheck = (props: InputCheckProps) => {\n const {\n className,\n label,\n description,\n error,\n ...rest\n } = props;\n return (\n <div\n className={ classNames(\n 'flex flex-col',\n className\n ) }\n >\n <div className={ 'flex flex-row gap-3' }>\n <input\n type={ 'checkbox' }\n className={ 'h-6 w-6 shrink-0 rounded-[var(--border-radius-checkbox)] border-[length:var(--border-width-input)] check-base shadow-[var(--shadow-control)] ring-0 hover:ring-[length:var(--control-ring-width)] focus:ring-[length:var(--control-ring-width)] ring-offset-0 focus:outline-0 transition-all duration-[var(--control-transition-duration)]' }\n { ...rest }\n />\n { label && (\n <label htmlFor={ props.id } className={ classNames(\n 'input-label font-[number:var(--font-weight-input-option-label)] mb-1',\n props.id && 'cursor-pointer'\n ) }>{ label }</label>\n ) }\n </div>\n <InputDescription>{ description }</InputDescription>\n <InputError>{ error }</InputError>\n </div>\n );\n};\n","import * as React from \"react\";\nimport { useDropzone, type Accept, type FileRejection } from \"react-dropzone\";\nimport { IconCircleCheckFilled, IconPaperclip, type TablerIcon } from \"@tabler/icons-react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { InputLabel } from \"@/components/inputs/InputLabel.tsx\";\nimport { InputDescription } from \"@/components/inputs/InputDescription.tsx\";\nimport { InputError } from \"@/components/inputs/InputError.tsx\";\nimport { InputErrorIcon } from \"@/components/inputs/InputErrorIcon.tsx\";\nimport { Spinner } from \"@/spinner/Spinner.tsx\";\nimport { ControlSizeContext } from \"@/control-size/use-control-size.ts\";\nimport {\n sizeFontClasses,\n sizeHeightClasses,\n sizeIconClasses,\n sizePaddingLeftClasses,\n} from \"@/control-size/control-size.util.ts\";\n\n\nexport type Size = 'sm' | 'md' | 'lg';\n\nconst chooseButtonHeightClasses: Record<Size, string> = {\n sm: 'h-7',\n md: 'h-8',\n lg: 'h-10',\n};\n\nconst chooseButtonPaddingClasses: Record<Size, string> = {\n sm: 'px-2.5',\n md: 'px-3',\n lg: 'px-4',\n};\n\nconst chooseButtonFontClasses: Record<Size, string> = {\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-sm',\n};\n\nexport type InputFileSingleProps = {\n label?: string | React.ReactNode;\n description?: string | React.ReactNode;\n error?: string | React.ReactNode;\n placeholder?: string;\n buttonText?: string;\n Icon?: TablerIcon;\n size?: Size;\n value?: File | null;\n isUploaded?: boolean;\n isUploading?: boolean;\n onChange?: (file: File | null) => void | Promise<void>;\n onDropRejected?: (fileRejections: FileRejection[]) => void;\n accept?: Accept;\n maxSize?: number;\n minSize?: number;\n disabled?: boolean;\n className?: string;\n}\n\n\nexport const InputFileSingle = (props: InputFileSingleProps) => {\n\n const {\n label,\n description,\n error,\n placeholder = 'No file chosen',\n buttonText = 'Choose',\n Icon = IconPaperclip,\n size = 'md',\n value,\n isUploaded = false,\n isUploading = false,\n onChange,\n onDropRejected,\n accept,\n maxSize,\n minSize,\n disabled = false,\n className,\n } = props;\n\n const handleDrop = async (acceptedFiles: File[]) => {\n const [ file ] = acceptedFiles;\n if (file) {\n await onChange?.(file);\n }\n };\n\n const {\n getRootProps,\n getInputProps,\n open,\n isDragActive,\n isFocused,\n } = useDropzone({\n multiple: false,\n accept,\n maxSize,\n minSize,\n disabled,\n onDrop: handleDrop,\n onDropRejected,\n });\n\n const fileName = value?.name;\n\n return (\n <ControlSizeContext.Provider value={ size }>\n <div className={ classNames('flex flex-col', className) }>\n <InputLabel>{ label }</InputLabel>\n <div\n { ...getRootProps({\n className: classNames(\n 'flex flex-row items-center',\n 'border-[length:var(--border-width-input)] input-base rounded-[var(--border-radius-input)] shadow-[var(--shadow-control)] transition-all duration-[var(--control-transition-duration)]',\n 'ring-0 focus:outline-none',\n (isFocused || isDragActive) && 'ring-[length:var(--control-ring-width)]',\n error && 'input-error',\n disabled && 'opacity-60 cursor-not-allowed',\n sizeHeightClasses[size],\n sizePaddingLeftClasses[size],\n 'gap-3',\n ),\n }) }\n >\n <input { ...getInputProps() } />\n <Icon className={ classNames('input-icon shrink-0', sizeIconClasses[size]) }/>\n <span\n className={ classNames(\n 'flex-1 truncate',\n sizeFontClasses[size],\n !fileName && 'text-[var(--color-input-placeholder)]',\n ) }\n >\n { fileName ?? placeholder }\n </span>\n { error && (\n <InputErrorIcon/>\n ) }\n { isUploading && !error && (\n <div className={ 'h-5 w-5 flex items-center justify-center' }>\n <Spinner className={ 'h-4 w-4 text-[var(--color-input-icon)]' }/>\n </div>\n ) }\n { isUploaded && !isUploading && !error && (\n <div className={ 'h-5 w-5' }>\n <IconCircleCheckFilled className={ 'h-5 w-5 text-[var(--color-status-success)]' }/>\n </div>\n ) }\n <button\n type={ 'button' }\n disabled={ disabled }\n onClick={ (e) => {\n e.stopPropagation();\n open();\n } }\n className={ classNames(\n 'inline-flex flex-row items-center justify-center shrink-0',\n 'border-[length:var(--border-width-input)] button-white shadow-[var(--shadow-control)] rounded-[calc(var(--border-radius-button)-0.25rem)]',\n 'font-[number:var(--font-weight-button)] font-[family-name:var(--font-family-base)] cursor-pointer select-none transition-all duration-[var(--control-transition-duration)]',\n 'button-ring ring-0 hover:ring-[length:var(--control-ring-width)] active:ring-[length:var(--control-ring-width-active)] focus:outline-none focus:ring-[length:var(--control-ring-width)]',\n 'disabled:cursor-default',\n 'mr-1.5',\n chooseButtonHeightClasses[size],\n chooseButtonPaddingClasses[size],\n chooseButtonFontClasses[size],\n ) }\n >\n { buttonText }\n </button>\n </div>\n <InputDescription>{ description }</InputDescription>\n <InputError>{ error }</InputError>\n </div>\n </ControlSizeContext.Provider>\n );\n};\n","import * as React from \"react\";\nimport { IconCircleCheckFilled, IconExclamationCircleFilled, IconX } from \"@tabler/icons-react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { Spinner } from \"@/spinner/Spinner.tsx\";\nimport { ButtonIconSquare } from \"@/components/button-icon-square/ButtonIconSquare.tsx\";\n\n\nexport type UploadFileTileProps = {\n file: File;\n isUploaded?: boolean;\n isUploading?: boolean;\n error?: string | React.ReactNode;\n onRemove?: () => void;\n className?: string;\n}\n\n\nconst formatBytes = (bytes: number): string => {\n if (bytes < 1024) return `${ bytes } B`;\n if (bytes < 1024 * 1024) return `${ (bytes / 1024).toFixed(1) } KB`;\n if (bytes < 1024 * 1024 * 1024) return `${ (bytes / (1024 * 1024)).toFixed(1) } MB`;\n return `${ (bytes / (1024 * 1024 * 1024)).toFixed(1) } GB`;\n};\n\n\nexport const UploadFileTile = (props: UploadFileTileProps) => {\n\n const {\n file,\n isUploaded = false,\n isUploading = false,\n error,\n onRemove,\n className,\n } = props;\n\n const showStatus = isUploading || isUploaded || !!error;\n\n return (\n <div\n className={ classNames(\n 'flex flex-row items-center gap-3',\n 'border-[length:var(--border-width-input)] input-base rounded-[var(--border-radius-input)] shadow-[var(--shadow-control)]',\n 'pl-4 pr-1 py-1',\n error && 'input-error',\n className,\n ) }\n >\n { showStatus && (\n <div className={ 'shrink-0 h-5 w-5 flex items-center justify-center' }>\n { error ? (\n <IconExclamationCircleFilled className={ 'h-5 w-5 input-error-icon' }/>\n ) : isUploading ? (\n <Spinner className={ 'h-4 w-4 text-[var(--color-input-icon)]' }/>\n ) : (\n <IconCircleCheckFilled className={ 'h-5 w-5 text-[var(--color-status-success)]' }/>\n ) }\n </div>\n ) }\n\n <div className={ 'flex-1 min-w-0 font-[number:var(--font-weight-input-option-label)] truncate' }>\n { file.name }\n </div>\n\n <div className={ 'shrink-0 text-sm text-[var(--color-input-description-text)]' }>\n { formatBytes(file.size) }\n </div>\n\n { onRemove && (\n <ButtonIconSquare\n variant={ 'transparent' }\n size={ 'sm' }\n Icon={ IconX }\n onClick={ onRemove }\n aria-label={ 'Remove file' }\n className={ 'shrink-0' }\n />\n ) }\n </div>\n );\n};\n","import * as React from \"react\";\nimport { useRef, useState } from \"react\";\nimport { useDropzone, type Accept, type FileRejection } from \"react-dropzone\";\nimport { IconCloudUpload, type TablerIcon } from \"@tabler/icons-react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { InputLabel } from \"@/components/inputs/InputLabel.tsx\";\nimport { InputDescription } from \"@/components/inputs/InputDescription.tsx\";\nimport { InputError } from \"@/components/inputs/InputError.tsx\";\nimport { UploadFileTile, type UploadFileTileProps } from \"@/components/inputs/input-file/UploadFileTile.tsx\";\n\n\ntype UploadStatus = 'idle' | 'uploading' | 'uploaded' | 'error';\n\ntype UploadEntry = {\n id: string;\n file: File;\n status: UploadStatus;\n error?: Error;\n}\n\n\nexport type InputFileMultipleProps = {\n label?: string | React.ReactNode;\n description?: string | React.ReactNode;\n error?: string | React.ReactNode;\n title?: string;\n hint?: React.ReactNode;\n Icon?: TablerIcon;\n onUpload?: (file: File) => Promise<void> | void;\n onFileRemoved?: (file: File) => void;\n onDropRejected?: (fileRejections: FileRejection[]) => void;\n renderFileTile?: (file: File, defaultProps: UploadFileTileProps) => React.ReactNode;\n accept?: Accept;\n maxSize?: number;\n minSize?: number;\n maxFiles?: number;\n disabled?: boolean;\n className?: string;\n}\n\n\nexport const InputFileMultiple = (props: InputFileMultipleProps) => {\n\n const {\n label,\n description,\n error,\n title = 'Drop files here',\n hint,\n Icon = IconCloudUpload,\n onUpload,\n onFileRemoved,\n onDropRejected,\n renderFileTile,\n accept,\n maxSize,\n minSize,\n maxFiles,\n disabled = false,\n className,\n } = props;\n\n const [ entries, setEntries ] = useState<UploadEntry[]>([]);\n const idCounter = useRef(0);\n\n const updateEntry = (id: string, patch: Partial<UploadEntry>) => {\n setEntries((prev) => prev.map((e) => (e.id === id ? { ...e, ...patch } : e)));\n };\n\n const handleDrop = (acceptedFiles: File[]) => {\n if (acceptedFiles.length === 0) return;\n\n const newEntries: UploadEntry[] = acceptedFiles.map((file) => ({\n id: String(++idCounter.current),\n file,\n status: onUpload ? 'uploading' : 'idle',\n }));\n\n setEntries((prev) => [ ...prev, ...newEntries ]);\n\n if (!onUpload) return;\n\n for (const entry of newEntries) {\n Promise.resolve()\n .then(() => onUpload(entry.file))\n .then(() => updateEntry(entry.id, { status: 'uploaded' }))\n .catch((err: unknown) => {\n updateEntry(entry.id, {\n status: 'error',\n error: err instanceof Error ? err : new Error(String(err)),\n });\n });\n }\n };\n\n const handleRemove = (id: string) => {\n const removed = entries.find((e) => e.id === id);\n setEntries((prev) => prev.filter((e) => e.id !== id));\n if (removed) {\n onFileRemoved?.(removed.file);\n }\n };\n\n const {\n getRootProps,\n getInputProps,\n isDragActive,\n isFocused,\n } = useDropzone({\n multiple: true,\n accept,\n maxSize,\n minSize,\n maxFiles,\n disabled,\n onDrop: handleDrop,\n onDropRejected,\n });\n\n return (\n <div className={ classNames('flex flex-col', className) }>\n <InputLabel>{ label }</InputLabel>\n\n <div\n { ...getRootProps({\n className: classNames(\n 'flex flex-col items-center justify-center gap-1',\n 'border-2 border-dashed input-base rounded-[var(--border-radius-input)] bg-transparent!',\n 'py-10 px-6 cursor-pointer transition-all duration-[var(--control-transition-duration)]',\n 'ring-0 focus:outline-none',\n (isFocused || isDragActive) && 'ring-[length:var(--control-ring-width)]',\n error && 'input-error',\n disabled && 'opacity-60 cursor-not-allowed',\n ),\n }) }\n >\n <input { ...getInputProps() } />\n <div className={ 'h-14 w-14 rounded-[var(--border-radius-input)] flex items-center justify-center bg-[var(--color-input-file-icon-bg)] mb-2' }>\n <Icon className={ 'h-7 w-7 input-icon' }/>\n </div>\n <div className={ 'text-base font-[number:var(--font-weight-button)]' }>\n { title }\n </div>\n { hint && (\n <div className={ 'text-sm text-[var(--color-input-description-text)] ' }>{ hint }</div>\n ) }\n </div>\n\n { entries.length > 0 && (\n <div className={ 'flex flex-col gap-2 mt-3' }>\n { entries.map((entry) => {\n const defaultProps: UploadFileTileProps = {\n file: entry.file,\n isUploading: entry.status === 'uploading',\n isUploaded: entry.status === 'uploaded',\n error: entry.status === 'error' ? entry.error?.message : undefined,\n onRemove: () => handleRemove(entry.id),\n };\n return (\n <React.Fragment key={ entry.id }>\n { renderFileTile\n ? renderFileTile(entry.file, defaultProps)\n : <UploadFileTile { ...defaultProps }/>\n }\n </React.Fragment>\n );\n }) }\n </div>\n ) }\n\n <InputDescription>{ description }</InputDescription>\n <InputError>{ error }</InputError>\n </div>\n );\n};\n","import type { Klass, LexicalNode } from \"lexical\";\nimport { HeadingNode, QuoteNode } from \"@lexical/rich-text\";\nimport { ListNode, ListItemNode } from \"@lexical/list\";\nimport { LinkNode } from \"@lexical/link\";\n\n/* Node types the editor is allowed to produce. A command for a node that is not\n * registered here silently does nothing, so keep this in sync with the toolbar. */\nexport const LEXICAL_NODES: Array<Klass<LexicalNode>> = [\n HeadingNode,\n QuoteNode,\n ListNode,\n ListItemNode,\n LinkNode,\n];\n\n/* Maps Lexical node kinds to CSS class names. Keep aligned with InputLexical.css. */\nexport const lexicalTheme = {\n paragraph: \"lexical-paragraph\",\n heading: {\n h1: \"lexical-h1\",\n h2: \"lexical-h2\",\n h3: \"lexical-h3\",\n h4: \"lexical-h4\",\n },\n quote: \"lexical-quote\",\n list: {\n ul: \"lexical-ul\",\n ol: \"lexical-ol\",\n listitem: \"lexical-listitem\",\n nested: {\n listitem: \"lexical-listitem-nested\",\n },\n },\n link: \"lexical-link\",\n text: {\n bold: \"lexical-bold\",\n italic: \"lexical-italic\",\n underline: \"lexical-underline\",\n },\n};\n","import * as React from \"react\";\nimport { createContext, useContext, useEffect, useState } from \"react\";\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport {\n $getSelection,\n $isRangeSelection,\n CAN_REDO_COMMAND,\n CAN_UNDO_COMMAND,\n COMMAND_PRIORITY_LOW,\n type LexicalEditor,\n} from \"lexical\";\nimport { $isHeadingNode } from \"@lexical/rich-text\";\nimport { $isListNode, ListNode } from \"@lexical/list\";\nimport { $isLinkNode } from \"@lexical/link\";\nimport { $getNearestNodeOfType, mergeRegister } from \"@lexical/utils\";\n\nexport type LexicalBlockType = \"paragraph\" | \"h1\" | \"h2\" | \"h3\" | \"h4\";\n\nexport type LexicalToolbarState = {\n isBold: boolean;\n isItalic: boolean;\n isUnderline: boolean;\n isLink: boolean;\n isUnorderedList: boolean;\n isOrderedList: boolean;\n blockType: LexicalBlockType;\n canUndo: boolean;\n canRedo: boolean;\n};\n\nexport const DEFAULT_LEXICAL_TOOLBAR_STATE: LexicalToolbarState = {\n isBold: false,\n isItalic: false,\n isUnderline: false,\n isLink: false,\n isUnorderedList: false,\n isOrderedList: false,\n blockType: \"paragraph\",\n canUndo: false,\n canRedo: false,\n};\n\nexport type LexicalToolbarTone = \"light\" | \"dark\";\nexport type LexicalToolbarOrientation = \"horizontal\" | \"vertical\";\n\nexport type LexicalToolbarContextValue = {\n state: LexicalToolbarState;\n tone: LexicalToolbarTone;\n orientation?: LexicalToolbarOrientation;\n};\n\nexport const LexicalToolbarContext = createContext<LexicalToolbarContextValue>({\n state: DEFAULT_LEXICAL_TOOLBAR_STATE,\n tone: \"light\",\n orientation: \"horizontal\",\n});\n\n/* Consumed by toolbar building blocks to read active state + tone. */\nexport const useLexicalToolbar = (): LexicalToolbarContextValue =>\n useContext(LexicalToolbarContext);\n\n/* Subscribes to the editor and derives the active formatting state on every\n * update. Used by the toolbar wrappers to drive button highlighting. */\nexport const useLexicalToolbarState = (): LexicalToolbarState => {\n const [editor] = useLexicalComposerContext();\n const [state, setState] = useState<LexicalToolbarState>(DEFAULT_LEXICAL_TOOLBAR_STATE);\n\n useEffect(() => {\n const readSelection = () => {\n editor.getEditorState().read(() => {\n const selection = $getSelection();\n if (!$isRangeSelection(selection)) {\n return;\n }\n\n const anchorNode = selection.anchor.getNode();\n const listNode = $getNearestNodeOfType<ListNode>(anchorNode, ListNode);\n const listType = listNode && $isListNode(listNode) ? listNode.getListType() : null;\n\n let blockType: LexicalBlockType = \"paragraph\";\n if (!listType) {\n const element =\n anchorNode.getKey() === \"root\" ? anchorNode : anchorNode.getTopLevelElementOrThrow();\n if ($isHeadingNode(element)) {\n blockType = element.getTag() as LexicalBlockType;\n }\n }\n\n // Read every node value here, inside the editor.read() context. Passing\n // these accessors into the setState updater would run them later (during\n // React render) outside the read, throwing Lexical error #195.\n const isBold = selection.hasFormat(\"bold\");\n const isItalic = selection.hasFormat(\"italic\");\n const isUnderline = selection.hasFormat(\"underline\");\n const isLink = $isLinkNode(anchorNode.getParent()) || $isLinkNode(anchorNode);\n\n setState((prev) => ({\n ...prev,\n isBold,\n isItalic,\n isUnderline,\n isLink,\n isUnorderedList: listType === \"bullet\",\n isOrderedList: listType === \"number\",\n blockType,\n }));\n });\n };\n\n return mergeRegister(\n editor.registerUpdateListener(() => readSelection()),\n editor.registerCommand(\n CAN_UNDO_COMMAND,\n (payload: boolean) => {\n setState((prev) => ({ ...prev, canUndo: payload }));\n return false;\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand(\n CAN_REDO_COMMAND,\n (payload: boolean) => {\n setState((prev) => ({ ...prev, canRedo: payload }));\n return false;\n },\n COMMAND_PRIORITY_LOW,\n ),\n );\n }, [editor]);\n\n return state;\n};\n\nexport type LexicalToolbarRenderContext = {\n editor: LexicalEditor;\n state: LexicalToolbarState;\n tone: LexicalToolbarTone;\n};\n\nexport type LexicalToolbarRender = (ctx: LexicalToolbarRenderContext) => React.ReactNode;\n","import { createContext, useContext } from \"react\";\n\nexport type DropdownDismissContextType = () => void;\n\nexport const DropdownDismissContext = createContext<DropdownDismissContextType | undefined>(undefined);\n\nexport const useDropdownDismiss = () => {\n const dropdownDismissContext = useContext(DropdownDismissContext)\n return {\n dismiss: dropdownDismissContext || (() => {})\n }\n}","import * as React from \"react\";\nimport { useState } from \"react\";\nimport { usePopover } from \"@/popover/use-popover.tsx\";\nimport type { Placement } from \"@floating-ui/react\";\nimport { DropdownPanel } from \"@/components/dropdown-menu/DropdownPanel.tsx\";\nimport { DropdownDismissContext } from \"@/components/dropdown-menu/use-dropdown-dismiss.ts\";\n\nexport type DropdownMenuProps = {\n trigger: React.ReactNode;\n children?: React.ReactNode;\n placement?: Placement\n minWidth?: number;\n className?: string;\n}\n\n\nexport const DropdownMenu = (props: DropdownMenuProps) => {\n const { trigger, children, placement = 'bottom-end', minWidth = 200, className } = props;\n const [ show, setShow ] = useState<boolean>(false);\n\n const { Popover, anchorRef } = usePopover({\n placement: placement,\n open: show,\n onOpenChange: setShow,\n minWidth: minWidth,\n })\n\n return (\n <>\n <div ref={ anchorRef } className={ className } onClick={ () => setShow(!show) }>\n { trigger }\n </div>\n\n <Popover open={ show }>\n <DropdownPanel padding={ 'sm' }>\n <DropdownDismissContext.Provider value={ () => setShow(false) }>\n { children }\n </DropdownDismissContext.Provider>\n </DropdownPanel>\n </Popover>\n </>\n );\n};","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport type { TablerIcon } from \"@tabler/icons-react\";\nimport { useDropdownDismiss } from \"@/components/dropdown-menu/use-dropdown-dismiss.ts\";\n\n\nexport type DropdownButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {\n loading?: boolean;\n children?: React.ReactNode;\n Icon?: TablerIcon;\n dismissOnClick?: boolean;\n}\n\nconst base: string = `inline-flex flex-row items-center gap-3 h-10 px-3 font-[number:var(--font-weight-dropdown-item)] font-[family-name:var(--font-family-base)] ring-0 dropdown-item rounded-[var(--border-radius-menu-item)] cursor-pointer transition-all duration-[var(--control-transition-duration)] select-none focus:outline-none focus:ring-0 border border-transparent bg-transparent`;\n\nexport const DropdownButton = React.forwardRef<HTMLButtonElement, DropdownButtonProps>((props, ref) => {\n const {\n className,\n children,\n Icon,\n onClick,\n dismissOnClick = true,\n ...rest\n } = props;\n\n const { dismiss } = useDropdownDismiss();\n\n const handleOnClick = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n if (onClick) onClick(e);\n if (dismissOnClick) dismiss();\n }\n\n return (\n <button\n ref={ ref }\n className={ classNames(\n base,\n className\n ) }\n onClick={ handleOnClick }\n { ...rest }\n >\n { Icon && <Icon className={ 'h-5 w-5' }/> }\n { children }\n </button>\n );\n});","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { $getSelection, $isRangeSelection, $createParagraphNode } from \"lexical\";\nimport { $createHeadingNode } from \"@lexical/rich-text\";\nimport { $setBlocksType } from \"@lexical/selection\";\nimport { IconCheck, IconChevronDown } from \"@tabler/icons-react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { DropdownMenu } from \"@/components/dropdown-menu/DropdownMenu.tsx\";\nimport { DropdownButton } from \"@/components/dropdown-menu/DropdownButton.tsx\";\nimport {\n type LexicalBlockType,\n useLexicalToolbar,\n} from \"@/components/inputs/input-lexical/use-lexical-toolbar.ts\";\n\nconst OPTIONS: { value: LexicalBlockType; label: string }[] = [\n { value: \"paragraph\", label: \"Paragraph\" },\n { value: \"h1\", label: \"Heading 1\" },\n { value: \"h2\", label: \"Heading 2\" },\n { value: \"h3\", label: \"Heading 3\" },\n { value: \"h4\", label: \"Heading 4\" },\n];\n\nexport const LexicalBlockTypeSelect = () => {\n const [ editor ] = useLexicalComposerContext();\n const { state, tone } = useLexicalToolbar();\n\n const applyBlockType = (blockType: LexicalBlockType) => {\n editor.update(() => {\n const selection = $getSelection();\n if (!$isRangeSelection(selection)) {\n return;\n }\n if (blockType === \"paragraph\") {\n $setBlocksType(selection, () => $createParagraphNode());\n } else {\n $setBlocksType(selection, () => $createHeadingNode(blockType));\n }\n });\n };\n\n const current = OPTIONS.find((option) => option.value === state.blockType) ?? OPTIONS[0];\n\n return (\n <DropdownMenu\n placement={ \"bottom-start\" }\n minWidth={ 180 }\n trigger={\n <button\n type={ \"button\" }\n onMouseDown={ (event) => event.preventDefault() }\n className={ classNames(\n \"lexical-tb-btn h-8 px-2 gap-1 text-sm font-[number:var(--font-weight-input-option-label)]\",\n tone === \"dark\" ? \"lexical-tb-btn-dark\" : \"lexical-tb-btn-light\",\n ) }\n >\n { current.label }\n <IconChevronDown className={ \"h-4 w-4\" }/>\n </button>\n }\n >\n { OPTIONS.map((option) => (\n <DropdownButton\n key={ option.value }\n Icon={ option.value === state.blockType ? IconCheck : undefined }\n onClick={ () => applyBlockType(option.value) }\n className={ option.value === state.blockType ? undefined : \"pl-11\" }\n >\n { option.label }\n </DropdownButton>\n )) }\n </DropdownMenu>\n );\n};\n","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport type { TablerIcon } from \"@tabler/icons-react\";\nimport type { LexicalToolbarTone } from \"@/components/inputs/input-lexical/use-lexical-toolbar.ts\";\n\nexport type LexicalToolbarButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {\n Icon: TablerIcon;\n active?: boolean;\n tone?: LexicalToolbarTone;\n};\n\nconst toneClasses: Record<LexicalToolbarTone, string> = {\n light: \"lexical-tb-btn-light\",\n dark: \"lexical-tb-btn-dark\",\n};\n\nexport const LexicalToolbarButton = React.forwardRef<HTMLButtonElement, LexicalToolbarButtonProps>(\n (props, ref) => {\n const { Icon, active = false, tone = \"light\", className, onMouseDown, ...rest } = props;\n\n // Keep the editor selection intact when a toolbar control is pressed.\n const handleMouseDown = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n onMouseDown?.(event);\n };\n\n return (\n <button\n ref={ ref }\n type={ \"button\" }\n onMouseDown={ handleMouseDown }\n className={ classNames(\n \"lexical-tb-btn h-8 w-8\",\n toneClasses[tone],\n active && \"lexical-tb-btn-active\",\n className,\n ) }\n { ...rest }\n >\n <Icon className={ \"h-[18px] w-[18px]\" }/>\n </button>\n );\n },\n);\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { FORMAT_TEXT_COMMAND } from \"lexical\";\nimport { IconBold, IconItalic, IconUnderline } from \"@tabler/icons-react\";\nimport { LexicalToolbarButton } from \"@/components/inputs/input-lexical/LexicalToolbarButton.tsx\";\nimport { useLexicalToolbar } from \"@/components/inputs/input-lexical/use-lexical-toolbar.ts\";\n\nexport const LexicalFormatButtons = () => {\n const [ editor ] = useLexicalComposerContext();\n const { state, tone } = useLexicalToolbar();\n\n return (\n <>\n <LexicalToolbarButton\n Icon={ IconBold }\n tone={ tone }\n active={ state.isBold }\n aria-label={ \"Bold\" }\n onClick={ () => editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"bold\") }\n />\n <LexicalToolbarButton\n Icon={ IconItalic }\n tone={ tone }\n active={ state.isItalic }\n aria-label={ \"Italic\" }\n onClick={ () => editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"italic\") }\n />\n <LexicalToolbarButton\n Icon={ IconUnderline }\n tone={ tone }\n active={ state.isUnderline }\n aria-label={ \"Underline\" }\n onClick={ () => editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"underline\") }\n />\n </>\n );\n};\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport {\n INSERT_ORDERED_LIST_COMMAND,\n INSERT_UNORDERED_LIST_COMMAND,\n REMOVE_LIST_COMMAND,\n} from \"@lexical/list\";\nimport { IconList, IconListNumbers } from \"@tabler/icons-react\";\nimport { LexicalToolbarButton } from \"@/components/inputs/input-lexical/LexicalToolbarButton.tsx\";\nimport { useLexicalToolbar } from \"@/components/inputs/input-lexical/use-lexical-toolbar.ts\";\n\nexport const LexicalListButtons = () => {\n const [ editor ] = useLexicalComposerContext();\n const { state, tone } = useLexicalToolbar();\n\n const toggleUnordered = () => {\n editor.dispatchCommand(\n state.isUnorderedList ? REMOVE_LIST_COMMAND : INSERT_UNORDERED_LIST_COMMAND,\n undefined,\n );\n };\n\n const toggleOrdered = () => {\n editor.dispatchCommand(\n state.isOrderedList ? REMOVE_LIST_COMMAND : INSERT_ORDERED_LIST_COMMAND,\n undefined,\n );\n };\n\n return (\n <>\n <LexicalToolbarButton\n Icon={ IconList }\n tone={ tone }\n active={ state.isUnorderedList }\n aria-label={ \"Bullet list\" }\n onClick={ toggleUnordered }\n />\n <LexicalToolbarButton\n Icon={ IconListNumbers }\n tone={ tone }\n active={ state.isOrderedList }\n aria-label={ \"Numbered list\" }\n onClick={ toggleOrdered }\n />\n </>\n );\n};\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { TOGGLE_LINK_COMMAND } from \"@lexical/link\";\nimport { IconLink } from \"@tabler/icons-react\";\nimport { LexicalToolbarButton } from \"@/components/inputs/input-lexical/LexicalToolbarButton.tsx\";\nimport { useLexicalToolbar } from \"@/components/inputs/input-lexical/use-lexical-toolbar.ts\";\n\nexport const LexicalLinkButton = () => {\n const [ editor ] = useLexicalComposerContext();\n const { state, tone } = useLexicalToolbar();\n\n const toggleLink = () => {\n if (state.isLink) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\n return;\n }\n const url = window.prompt(\"Enter URL\");\n if (url) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, url);\n }\n };\n\n return (\n <LexicalToolbarButton\n Icon={ IconLink }\n tone={ tone }\n active={ state.isLink }\n aria-label={ \"Link\" }\n onClick={ toggleLink }\n />\n );\n};\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { REDO_COMMAND, UNDO_COMMAND } from \"lexical\";\nimport { IconArrowBackUp, IconArrowForwardUp } from \"@tabler/icons-react\";\nimport { LexicalToolbarButton } from \"@/components/inputs/input-lexical/LexicalToolbarButton.tsx\";\nimport { useLexicalToolbar } from \"@/components/inputs/input-lexical/use-lexical-toolbar.ts\";\n\nexport const LexicalHistoryButtons = () => {\n const [ editor ] = useLexicalComposerContext();\n const { state, tone } = useLexicalToolbar();\n\n return (\n <>\n <LexicalToolbarButton\n Icon={ IconArrowBackUp }\n tone={ tone }\n disabled={ !state.canUndo }\n aria-label={ \"Undo\" }\n onClick={ () => editor.dispatchCommand(UNDO_COMMAND, undefined) }\n />\n <LexicalToolbarButton\n Icon={ IconArrowForwardUp }\n tone={ tone }\n disabled={ !state.canRedo }\n aria-label={ \"Redo\" }\n onClick={ () => editor.dispatchCommand(REDO_COMMAND, undefined) }\n />\n </>\n );\n};\n","import { classNames } from \"@/util/classnames.util.ts\";\nimport {\n type LexicalToolbarTone,\n useLexicalToolbar,\n} from \"@/components/inputs/input-lexical/use-lexical-toolbar.ts\";\n\nexport type LexicalToolbarDividerProps = {\n tone?: LexicalToolbarTone;\n className?: string;\n};\n\nconst toneClasses: Record<LexicalToolbarTone, string> = {\n light: \"lexical-tb-divider-light\",\n dark: \"lexical-tb-divider-dark\",\n};\n\nexport const LexicalToolbarDivider = (props: LexicalToolbarDividerProps) => {\n const { tone: toneOverride, className } = props;\n const { tone: contextTone, orientation } = useLexicalToolbar();\n const tone = toneOverride ?? contextTone;\n const vertical = orientation === \"vertical\";\n return (\n <div\n className={ classNames(\n vertical ? \"h-px w-full my-1\" : \"w-px h-5 my-auto mx-1\",\n \"shrink-0\",\n toneClasses[tone],\n className,\n ) }\n />\n );\n};\n","import * as React from \"react\";\nimport { useCallback, useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport { IconDots } from \"@tabler/icons-react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { DropdownMenu } from \"@/components/dropdown-menu/DropdownMenu.tsx\";\nimport {\n LexicalToolbarContext,\n useLexicalToolbar,\n} from \"@/components/inputs/input-lexical/use-lexical-toolbar.ts\";\n\nexport type LexicalToolbarItemsProps = {\n children: React.ReactNode;\n};\n\nconst GAP = 4; // gap-1 = 0.25rem\nconst MORE_WIDTH = 36; // 32px button + gap reserved for the overflow trigger\n\n/* Flatten one or more levels of fragments so each building block becomes an\n * individually measurable unit (a wrapping component/fragment would otherwise\n * collapse the whole toolbar as a single item). */\nconst flattenItems = (nodes: React.ReactNode): React.ReactNode[] => {\n const out: React.ReactNode[] = [];\n React.Children.forEach(nodes, (child) => {\n if (React.isValidElement(child) && child.type === React.Fragment) {\n out.push(...flattenItems((child.props as { children?: React.ReactNode }).children));\n } else {\n out.push(child);\n }\n });\n return out;\n};\n\n/* Lays out toolbar building blocks in a single row and, when they no longer\n * fit, collapses the trailing items into a \"⋮\" vertical dropdown. A hidden\n * mirror row provides stable intrinsic widths so growth/shrink decisions stay\n * consistent. */\nexport const LexicalToolbarItems = (props: LexicalToolbarItemsProps) => {\n const { children } = props;\n const { state, tone } = useLexicalToolbar();\n const items = flattenItems(children);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const mirrorRef = useRef<HTMLDivElement>(null);\n const [ visibleCount, setVisibleCount ] = useState(items.length);\n\n const recompute = useCallback(() => {\n const container = containerRef.current;\n const mirror = mirrorRef.current;\n if (!container || !mirror) return;\n\n const available = container.clientWidth;\n const widths = Array.from(mirror.children).map((node) => (node as HTMLElement).offsetWidth);\n const total = widths.reduce((sum, w, i) => sum + w + (i > 0 ? GAP : 0), 0);\n\n if (total <= available) {\n setVisibleCount(widths.length);\n return;\n }\n\n let used = 0;\n let count = 0;\n for (let i = 0; i < widths.length; i++) {\n const add = widths[i] + (i > 0 ? GAP : 0);\n if (used + add + MORE_WIDTH > available) break;\n used += add;\n count++;\n }\n setVisibleCount(count);\n }, []);\n\n useLayoutEffect(() => {\n recompute();\n });\n\n useEffect(() => {\n const container = containerRef.current;\n const mirror = mirrorRef.current;\n if (!container) return;\n const observer = new ResizeObserver(() => recompute());\n observer.observe(container);\n if (mirror) observer.observe(mirror);\n return () => observer.disconnect();\n }, [ recompute ]);\n\n const visible = items.slice(0, visibleCount);\n const overflow = items.slice(visibleCount);\n\n return (\n <div\n ref={ containerRef }\n className={ \"relative flex flex-row items-center gap-1 min-w-0 flex-1\" }\n >\n <div\n ref={ mirrorRef }\n aria-hidden={ true }\n className={ \"pointer-events-none invisible absolute left-0 top-0 flex flex-row items-center gap-1 w-max\" }\n >\n { items.map((item, index) => (\n <div key={ index } className={ \"flex flex-row items-center\" }>\n { item }\n </div>\n )) }\n </div>\n\n { visible.map((item, index) => (\n <React.Fragment key={ index }>{ item }</React.Fragment>\n )) }\n\n { overflow.length > 0 && (\n <DropdownMenu\n placement={ \"bottom-end\" }\n minWidth={ 0 }\n trigger={\n <button\n type={ \"button\" }\n aria-label={ \"More\" }\n onMouseDown={ (event) => event.preventDefault() }\n className={ classNames(\n \"lexical-tb-btn h-8 w-8 shrink-0\",\n tone === \"dark\" ? \"lexical-tb-btn-dark\" : \"lexical-tb-btn-light\",\n ) }\n >\n <IconDots className={ \"h-[18px] w-[18px]\" }/>\n </button>\n }\n >\n <LexicalToolbarContext.Provider value={ { state, tone: \"light\", orientation: \"vertical\" } }>\n <div\n className={ \"flex flex-col items-stretch gap-1\" }\n onMouseDown={ (event) => event.preventDefault() }\n >\n { overflow.map((item, index) => (\n <React.Fragment key={ index }>{ item }</React.Fragment>\n )) }\n </div>\n </LexicalToolbarContext.Provider>\n </DropdownMenu>\n ) }\n </div>\n );\n};\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport {\n LexicalToolbarContext,\n type LexicalToolbarRender,\n useLexicalToolbarState,\n} from \"@/components/inputs/input-lexical/use-lexical-toolbar.ts\";\nimport { LexicalBlockTypeSelect } from \"@/components/inputs/input-lexical/LexicalBlockTypeSelect.tsx\";\nimport { LexicalFormatButtons } from \"@/components/inputs/input-lexical/LexicalFormatButtons.tsx\";\nimport { LexicalListButtons } from \"@/components/inputs/input-lexical/LexicalListButtons.tsx\";\nimport { LexicalLinkButton } from \"@/components/inputs/input-lexical/LexicalLinkButton.tsx\";\nimport { LexicalHistoryButtons } from \"@/components/inputs/input-lexical/LexicalHistoryButtons.tsx\";\nimport { LexicalToolbarDivider } from \"@/components/inputs/input-lexical/LexicalToolbarDivider.tsx\";\nimport { LexicalToolbarItems } from \"@/components/inputs/input-lexical/LexicalToolbarItems.tsx\";\n\n/* The default set of toolbar building blocks as a flat fragment. Passed\n * straight into LexicalToolbarItems so each block stays individually\n * measurable for the overflow-collapse logic. */\n// eslint-disable-next-line react-refresh/only-export-components\nexport const lexicalDefaultToolbarItems = () => (\n <>\n <LexicalBlockTypeSelect/>\n <LexicalToolbarDivider/>\n <LexicalFormatButtons/>\n <LexicalToolbarDivider/>\n <LexicalListButtons/>\n <LexicalLinkButton/>\n <LexicalToolbarDivider/>\n <LexicalHistoryButtons/>\n </>\n);\n\nexport const LexicalDefaultToolbarContent = () => lexicalDefaultToolbarItems();\n\nexport type LexicalToolbarProps = {\n render?: LexicalToolbarRender;\n className?: string;\n};\n\nexport const LexicalToolbar = (props: LexicalToolbarProps) => {\n const { render, className } = props;\n const [ editor ] = useLexicalComposerContext();\n const state = useLexicalToolbarState();\n\n return (\n <LexicalToolbarContext.Provider value={ { state, tone: \"light\" } }>\n <div\n className={ classNames(\n \"lexical-toolbar flex flex-row items-center p-1.5\",\n className,\n ) }\n >\n <LexicalToolbarItems>\n { render ? render({ editor, state, tone: \"light\" }) : lexicalDefaultToolbarItems() }\n </LexicalToolbarItems>\n </div>\n </LexicalToolbarContext.Provider>\n );\n};\n","import { useEffect, useState } from \"react\";\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { BLUR_COMMAND, COMMAND_PRIORITY_LOW, FOCUS_COMMAND } from \"lexical\";\nimport { mergeRegister } from \"@lexical/utils\";\nimport {\n autoUpdate,\n flip,\n FloatingPortal,\n offset,\n shift,\n size,\n useFloating,\n} from \"@floating-ui/react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport {\n LexicalToolbarContext,\n type LexicalToolbarRender,\n useLexicalToolbarState,\n} from \"@/components/inputs/input-lexical/use-lexical-toolbar.ts\";\nimport { LexicalToolbarItems } from \"@/components/inputs/input-lexical/LexicalToolbarItems.tsx\";\nimport { lexicalDefaultToolbarItems } from \"@/components/inputs/input-lexical/LexicalToolbar.tsx\";\n\nexport type LexicalFloatingToolbarProps = {\n render?: LexicalToolbarRender;\n};\n\nexport const LexicalFloatingToolbar = (props: LexicalFloatingToolbarProps) => {\n const { render } = props;\n const [ editor ] = useLexicalComposerContext();\n const state = useLexicalToolbarState();\n const [ open, setOpen ] = useState(false);\n\n const { refs, floatingStyles } = useFloating({\n placement: \"top-start\",\n strategy: \"fixed\",\n middleware: [\n offset(8),\n flip(),\n shift({ padding: 8 }),\n size({\n apply({ rects, elements }) {\n // Match the editor row width so the bar starts at the row and shares\n // the same max width (driving the overflow-collapse behaviour).\n elements.floating.style.width = `${ rects.reference.width }px`;\n },\n }),\n ],\n whileElementsMounted: autoUpdate,\n });\n\n useEffect(() => {\n // registerRootListener fires immediately with the current root, so this\n // also covers the initial reference.\n return editor.registerRootListener((root) => refs.setReference(root ?? null));\n }, [ editor, refs ]);\n\n useEffect(() => {\n return mergeRegister(\n editor.registerCommand(\n FOCUS_COMMAND,\n () => {\n setOpen(true);\n return false;\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand(\n BLUR_COMMAND,\n () => {\n setOpen(false);\n return false;\n },\n COMMAND_PRIORITY_LOW,\n ),\n );\n }, [ editor ]);\n\n return (\n <LexicalToolbarContext.Provider value={ { state, tone: \"dark\" } }>\n <FloatingPortal>\n <AnimatePresence>\n { open && (\n <div ref={ refs.setFloating } style={ floatingStyles } className={ \"z-50\" }>\n <motion.div\n className={ \"lexical-floating-toolbar flex w-full flex-row items-center p-1 rounded-[var(--border-radius-dropdown)]\" }\n initial={ { opacity: 0, y: 4 } }\n animate={ { opacity: 1, y: 0 } }\n exit={ { opacity: 0, y: 4 } }\n transition={ { duration: 0.1, ease: \"easeInOut\" } }\n >\n <LexicalToolbarItems>\n { render\n ? render({ editor, state, tone: \"dark\" })\n : lexicalDefaultToolbarItems() }\n </LexicalToolbarItems>\n </motion.div>\n </div>\n ) }\n </AnimatePresence>\n </FloatingPortal>\n </LexicalToolbarContext.Provider>\n );\n};\n","import * as React from \"react\";\nimport { useCallback, useMemo } from \"react\";\nimport { LexicalComposer } from \"@lexical/react/LexicalComposer\";\nimport { RichTextPlugin } from \"@lexical/react/LexicalRichTextPlugin\";\nimport { ContentEditable } from \"@lexical/react/LexicalContentEditable\";\nimport { HistoryPlugin } from \"@lexical/react/LexicalHistoryPlugin\";\nimport { ListPlugin } from \"@lexical/react/LexicalListPlugin\";\nimport { LinkPlugin } from \"@lexical/react/LexicalLinkPlugin\";\nimport { OnChangePlugin } from \"@lexical/react/LexicalOnChangePlugin\";\nimport { AutoFocusPlugin } from \"@lexical/react/LexicalAutoFocusPlugin\";\nimport { LexicalErrorBoundary } from \"@lexical/react/LexicalErrorBoundary\";\nimport type { EditorState, EditorThemeClasses, Klass, LexicalNode } from \"lexical\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { InputLabel } from \"@/components/inputs/InputLabel.tsx\";\nimport { InputDescription } from \"@/components/inputs/InputDescription.tsx\";\nimport { InputError } from \"@/components/inputs/InputError.tsx\";\nimport { ControlSizeContext } from \"@/control-size/use-control-size.ts\";\nimport { sizeFontClasses } from \"@/control-size/control-size.util.ts\";\nimport { LEXICAL_NODES, lexicalTheme } from \"@/components/inputs/input-lexical/lexical-theme.ts\";\nimport { LexicalToolbar } from \"@/components/inputs/input-lexical/LexicalToolbar.tsx\";\nimport { LexicalFloatingToolbar } from \"@/components/inputs/input-lexical/LexicalFloatingToolbar.tsx\";\nimport type { LexicalToolbarRender } from \"@/components/inputs/input-lexical/use-lexical-toolbar.ts\";\n\nexport type Size = \"sm\" | \"md\" | \"lg\";\nexport type LexicalToolbarVariant = \"static\" | \"floating\";\n\nexport type InputLexicalProps = {\n label?: string | React.ReactNode;\n description?: string | React.ReactNode;\n error?: string | React.ReactNode;\n placeholder?: string;\n /** Serialized editor state (JSON string from a previous onChange), or undefined for empty. */\n value?: string;\n onChange?: (value: string) => void;\n size?: Size;\n toolbar?: LexicalToolbarVariant;\n /** Override the default toolbar content. Drop in the exported building blocks. */\n renderToolbar?: LexicalToolbarRender;\n /** Minimum visible rows — sets a height floor for the editable area. */\n minRows?: number;\n /** Maximum visible rows. Content beyond this scrolls. */\n maxRows?: number;\n /** Grow the editor with its content (between minRows and maxRows). */\n autogrow?: boolean;\n namespace?: string;\n /** Extra Lexical nodes to register alongside the built-in set. */\n nodes?: Array<Klass<LexicalNode>>;\n /** Theme classes merged over the defaults (e.g. to style custom nodes). */\n theme?: EditorThemeClasses;\n autoFocus?: boolean;\n /** Extra Lexical plugins, mounted inside the editor alongside the built-ins. */\n children?: React.ReactNode;\n className?: string;\n};\n\nexport const InputLexical = (props: InputLexicalProps) => {\n const {\n label,\n description,\n error,\n placeholder,\n value,\n onChange,\n size = \"md\",\n toolbar = \"static\",\n renderToolbar,\n minRows = 4,\n maxRows,\n autogrow = false,\n namespace = \"InputLexical\",\n nodes,\n theme,\n autoFocus = false,\n children,\n className,\n } = props;\n\n const initialConfig = useMemo(\n () => ({\n namespace,\n theme: theme ? { ...lexicalTheme, ...theme } : lexicalTheme,\n nodes: [ ...LEXICAL_NODES, ...(nodes ?? []) ],\n editorState: value ?? null,\n onError: (e: Error) => {\n throw e;\n },\n }),\n // Lexical reads initialConfig once on mount; later prop changes are ignored by design.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n\n const handleChange = useCallback(\n (editorState: EditorState) => {\n onChange?.(JSON.stringify(editorState.toJSON()));\n },\n [ onChange ],\n );\n\n const fontClass = sizeFontClasses[size];\n const hasError = !!error;\n\n // py-3 (top + bottom) = 1.5rem; `1lh` resolves to the content line-height.\n const rowsToHeight = (rows: number) => `calc(${ rows } * 1lh + 1.5rem)`;\n const contentStyle: React.CSSProperties = autogrow\n ? { minHeight: rowsToHeight(minRows), maxHeight: maxRows ? rowsToHeight(maxRows) : undefined }\n : { height: rowsToHeight(minRows) };\n\n return (\n <ControlSizeContext.Provider value={ size }>\n <div className={ classNames(\"flex flex-col\", className) }>\n <InputLabel>{ label }</InputLabel>\n <LexicalComposer initialConfig={ initialConfig }>\n <div\n className={ classNames(\n \"relative flex flex-col border-[length:var(--border-width-input)] input-base rounded-[var(--border-radius-input)] shadow-[var(--shadow-control)] overflow-hidden transition-all duration-[var(--control-transition-duration)] ring-0 focus-within:ring-[length:var(--control-ring-width)] focus-within:outline-none font-[family-name:var(--font-family-base)]\",\n hasError && \"input-error\",\n ) }\n >\n { toolbar === \"static\" && <LexicalToolbar render={ renderToolbar }/> }\n\n <div className={ \"relative flex-1 min-h-0\" }>\n <RichTextPlugin\n contentEditable={\n <ContentEditable\n className={ classNames(\n \"lexical-content w-full outline-none px-3 py-3 leading-[1.55] overflow-y-auto mat-ui-hide-scrollbars\",\n fontClass,\n ) }\n style={ contentStyle }\n aria-placeholder={ placeholder ?? \"\" }\n placeholder={\n <div\n className={ classNames(\n \"lexical-placeholder pointer-events-none absolute left-3 top-3\",\n fontClass,\n ) }\n >\n { placeholder ?? \"\" }\n </div>\n }\n />\n }\n ErrorBoundary={ LexicalErrorBoundary }\n />\n </div>\n\n <HistoryPlugin/>\n <ListPlugin/>\n <LinkPlugin/>\n { autoFocus && <AutoFocusPlugin/> }\n { onChange && <OnChangePlugin onChange={ handleChange }/> }\n { children }\n { toolbar === \"floating\" && <LexicalFloatingToolbar render={ renderToolbar }/> }\n </div>\n </LexicalComposer>\n <InputDescription>{ description }</InputDescription>\n <InputError>{ error }</InputError>\n </div>\n </ControlSizeContext.Provider>\n );\n};\n","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { IconChevronDown } from \"@tabler/icons-react\";\nimport { InputLabel } from \"@/components/inputs/InputLabel.tsx\";\nimport { InputDescription } from \"@/components/inputs/InputDescription.tsx\";\nimport { InputError } from \"@/components/inputs/InputError.tsx\";\nimport { InputErrorIcon } from \"@/components/inputs/InputErrorIcon.tsx\";\nimport { InputIconButton } from \"@/components/inputs/InputIconButton.tsx\";\nimport { InputIconButtonTray } from \"@/components/inputs/InputIconButtonTray.tsx\";\nimport { ControlSizeContext } from \"@/control-size/use-control-size.ts\";\nimport {\n sizeFontClasses,\n sizeHeightClasses,\n sizePaddingLeftClasses,\n sizePaddingRightWithTrayClasses,\n} from \"@/control-size/control-size.util.ts\";\n\n\nexport type Size = 'sm' | 'md' | 'lg';\n\nexport type InputSelectNativeProps = Omit<React.InputHTMLAttributes<HTMLSelectElement>, 'size'> & {\n label?: string | React.ReactNode;\n description?: string | React.ReactNode;\n options?: OptionNative[];\n error?: string | React.ReactNode;\n size?: Size;\n}\n\nexport type OptionNative = {\n label: string;\n value: string;\n disabled?: boolean;\n}\n\n\nexport const InputSelectNative = (props: InputSelectNativeProps) => {\n\n const {\n className,\n label,\n description,\n options,\n error,\n size = 'md',\n ...rest\n } = props;\n\n return (\n <ControlSizeContext.Provider value={ size }>\n <div\n className={ classNames(\n 'flex flex-col',\n className\n ) }>\n <InputLabel>{ label }</InputLabel>\n <div className={ 'relative flex w-full flex-col' }>\n <select\n className={ classNames(\n 'appearance-none border-[length:var(--border-width-input)] input-base bg-none transition-all duration-[var(--control-transition-duration)] rounded-[var(--border-radius-input)] shadow-[var(--shadow-control)] ring-0 focus:ring-[length:var(--control-ring-width)] focus:outline-none font-[number:var(--font-weight-input-text)] font-[family-name:var(--font-family-base)]',\n sizeHeightClasses[size],\n sizeFontClasses[size],\n sizePaddingLeftClasses[size],\n sizePaddingRightWithTrayClasses[size],\n ) }\n { ...rest }\n >\n { options && options.map((option, index) => (\n <option\n key={ index }\n value={ option.value }\n disabled={ option.disabled }\n >{ option.label }</option>\n )) }\n </select>\n <InputIconButtonTray>\n { error && (\n <InputErrorIcon/>\n ) }\n <InputIconButton Icon={ IconChevronDown }/>\n </InputIconButtonTray>\n </div>\n <InputDescription>{ description }</InputDescription>\n <InputError>{ error }</InputError>\n </div>\n </ControlSizeContext.Provider>\n );\n};\n","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { IconCheck } from \"@tabler/icons-react\";\n\nexport interface InputSelectOptionProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onClick'> {\n children: React.ReactNode;\n selected: boolean;\n disabled?: boolean;\n active?: boolean;\n onClick?: () => void;\n}\n\nexport const InputSelectOption = React.forwardRef<HTMLDivElement, InputSelectOptionProps>((props, ref) => {\n const {\n children,\n onClick,\n selected,\n disabled = false,\n active = false,\n className,\n ...rest\n } = props;\n\n return (\n <div\n ref={ ref }\n { ...rest }\n onClick={ () => !disabled && onClick && onClick() }\n className={ classNames(\n 'option-base px-4 py-2 rounded-[var(--border-radius-option)] cursor-pointer transition-all duration-[var(--control-transition-duration)] select-none flex flex-row gap-3 items-center',\n (selected && !disabled) && 'option-selected',\n (active && !disabled) && 'option-active',\n disabled && 'option-disabled cursor-not-allowed hover:bg-transparent active:bg-transparent',\n className,\n ) }\n >\n <div className={ 'flex-1 min-w-0 break-all line-clamp-1' }>{ children }</div>\n { (selected && !disabled) && (\n <div className={ 'shrink-0' }>\n <IconCheck className={ 'h-5 w-5' }/>\n </div>\n ) }\n </div>\n );\n});\n","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\n\nexport interface InputSelectGroupHeaderProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\nexport const InputSelectGroupHeader = React.forwardRef<HTMLDivElement, InputSelectGroupHeaderProps>((props, ref) => {\n const { children, className, ...rest } = props;\n return (\n <div\n ref={ ref }\n { ...rest }\n className={ classNames(\n 'option-group-header px-4 pt-3 pb-1 text-xs font-[number:var(--font-weight-group-header)] uppercase tracking-wide select-none',\n className,\n ) }\n >\n { children }\n </div>\n );\n});\n","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\n\nexport type InputSelectDividerProps = React.HTMLAttributes<HTMLDivElement>;\n\nexport const InputSelectDivider = React.forwardRef<HTMLDivElement, InputSelectDividerProps>((props, ref) => {\n const { className, ...rest } = props;\n return (\n <div\n ref={ ref }\n { ...rest }\n className={ classNames(\n 'option-divider my-1 h-px',\n className,\n ) }\n />\n );\n});\n","import * as React from \"react\";\n\nexport type Option<T> = {\n label: string | React.ReactNode;\n value: T;\n disabled?: boolean;\n}\n\nexport type SelectGroupHeader = {\n kind: 'header';\n label: string | React.ReactNode;\n}\n\nexport type SelectDivider = {\n kind: 'divider';\n}\n\nexport type SelectItem<T> = Option<T> | SelectGroupHeader | SelectDivider;\n\nexport const isSelectOption = <T, >(item: SelectItem<T>): item is Option<T> => !('kind' in item);\n\n/**\n * Compares two option values for selection/membership purposes.\n *\n * Primitives (string, number, boolean, …) are compared by strict equality, so\n * behaviour is identical to `===` for the common case. Object-valued options\n * fall back to a structural (JSON) comparison, so a value rehydrated from\n * persisted state — a fresh object instance that is structurally equal — still\n * matches its option instead of silently falling back to the placeholder.\n *\n * Note: the structural comparison is order-sensitive on object keys.\n */\nexport const selectValueEquals = <T, >(a: T | null | undefined, b: T | null | undefined): boolean => {\n if (a === b) return true;\n if (a == null || b == null) return false;\n if (typeof a !== 'object' || typeof b !== 'object') return false;\n return JSON.stringify(a) === JSON.stringify(b);\n};\n","import * as React from \"react\";\nimport {\n autoUpdate,\n flip,\n type Placement,\n shift,\n size,\n useDismiss,\n useFloating,\n useInteractions,\n useListNavigation,\n} from \"@floating-ui/react\";\nimport { PopoverBase } from \"@/popover/PopoverBase.tsx\";\n\n\nexport type UseSelectPopoverProps = {\n placement?: Placement;\n fullWidth?: boolean;\n minWidth?: number;\n maxWidth?: number;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n listRef: React.MutableRefObject<Array<HTMLElement | null>>;\n activeIndex: number | null;\n onNavigate: (index: number | null) => void;\n loop?: boolean;\n disabledIndices?: number[];\n};\n\nexport type SelectPopoverRendererProps = {\n open: boolean;\n children: React.ReactNode;\n className?: string;\n}\n\ntype SelectPopoverBaseRefProps = {\n floatingStyles: React.CSSProperties;\n setFloating: React.RefCallback<HTMLDivElement>;\n placement: Placement;\n getFloatingProps: (userProps?: React.HTMLProps<HTMLElement>) => Record<string, unknown>;\n}\n\nexport type UseSelectPopoverResult = {\n anchorRef: React.RefCallback<HTMLDivElement | null>;\n Popover: React.ComponentType<SelectPopoverRendererProps>;\n getReferenceProps: (userProps?: React.HTMLProps<Element>) => Record<string, unknown>;\n getItemProps: (userProps?: React.HTMLProps<HTMLElement>) => Record<string, unknown>;\n}\n\nexport const useSelectPopover = (props: UseSelectPopoverProps): UseSelectPopoverResult => {\n const {\n placement = \"bottom\",\n fullWidth,\n minWidth,\n maxWidth,\n open,\n onOpenChange,\n listRef,\n activeIndex,\n onNavigate,\n loop = true,\n disabledIndices,\n } = props;\n\n const middleware = React.useMemo(() => {\n return [\n flip({ padding: 8 }),\n shift({ padding: 8 }),\n size({\n apply({ rects, elements }) {\n if (fullWidth) {\n elements.floating.style.width = `${ rects.reference.width }px`;\n }\n if (minWidth) {\n elements.floating.style.minWidth = `${ minWidth }px`;\n }\n if (maxWidth) {\n elements.floating.style.maxWidth = `${ maxWidth }px`;\n }\n },\n })\n ];\n }, [fullWidth, maxWidth, minWidth]);\n\n const { refs, floatingStyles, context, placement: resolvedPlacement } = useFloating({\n placement,\n open,\n onOpenChange,\n middleware,\n whileElementsMounted: autoUpdate,\n });\n\n const listNavigation = useListNavigation(context, {\n listRef,\n activeIndex,\n onNavigate,\n loop,\n virtual: true,\n focusItemOnOpen: false,\n disabledIndices,\n });\n\n const dismiss = useDismiss(context, {\n outsidePress: true,\n escapeKey: false,\n });\n\n const { getReferenceProps, getFloatingProps, getItemProps } = useInteractions([listNavigation, dismiss]);\n\n const latest = React.useRef<SelectPopoverBaseRefProps>({\n floatingStyles,\n setFloating: refs.setFloating,\n placement,\n getFloatingProps,\n });\n latest.current = {\n floatingStyles,\n setFloating: refs.setFloating,\n placement: resolvedPlacement,\n getFloatingProps,\n };\n\n const Popover = React.useMemo<React.ComponentType<SelectPopoverRendererProps>>(() => {\n const Renderer = (rendererProps: SelectPopoverRendererProps) => {\n const { floatingStyles, setFloating, placement, getFloatingProps } = latest.current;\n const { className, open, children } = rendererProps;\n return (\n <PopoverBase\n open={ open }\n className={ className }\n floatingStyles={ floatingStyles }\n setFloating={ setFloating }\n placement={ placement }\n floatingProps={ getFloatingProps() as React.HTMLProps<HTMLDivElement> }\n >\n { children }\n </PopoverBase>\n );\n };\n return React.memo(Renderer);\n }, []);\n\n return {\n anchorRef: refs.setReference,\n Popover,\n getReferenceProps,\n getItemProps,\n };\n};\n","import * as React from \"react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { IconChevronDown, IconX } from \"@tabler/icons-react\";\nimport { InputSelectOption } from \"@/components/inputs/InputSelectOption.tsx\";\nimport { InputSelectGroupHeader } from \"@/components/inputs/InputSelectGroupHeader.tsx\";\nimport { InputSelectDivider } from \"@/components/inputs/InputSelectDivider.tsx\";\nimport { isSelectOption, selectValueEquals, type Option, type SelectItem } from \"@/components/inputs/select-item.ts\";\nimport { useSelectPopover } from \"@/popover/use-select-popover.tsx\";\nimport { DropdownPanel } from \"@/components/dropdown-menu/DropdownPanel.tsx\";\nimport { InputLabel } from \"@/components/inputs/InputLabel.tsx\";\nimport { InputErrorIcon } from \"@/components/inputs/InputErrorIcon.tsx\";\nimport { InputIconButton } from \"@/components/inputs/InputIconButton.tsx\";\nimport { InputIconButtonTray } from \"@/components/inputs/InputIconButtonTray.tsx\";\nimport { InputDescription } from \"@/components/inputs/InputDescription.tsx\";\nimport { InputError } from \"@/components/inputs/InputError.tsx\";\nimport { useDismiss } from \"@/hooks/use-dismiss.ts\";\nimport { ControlSizeContext } from \"@/control-size/use-control-size.ts\";\nimport {\n sizeFontClasses,\n sizeHeightClasses,\n sizePaddingLeftClasses,\n sizePaddingRightWithTrayClasses,\n sizePaddingRightWithTrayTwoClasses,\n} from \"@/control-size/control-size.util.ts\";\n\n\nexport type Size = 'sm' | 'md' | 'lg';\n\nexport type InputSelectProps<T> = {\n name?: string;\n id?: string;\n className?: string;\n label?: string | React.ReactNode;\n description?: string | React.ReactNode;\n options: SelectItem<T>[];\n value: T | null;\n onChange: (value: T | null) => void;\n placeholder?: string;\n maxHeight?: number;\n error?: string | React.ReactNode;\n size?: Size;\n disabled?: boolean;\n clearable?: boolean;\n}\n\nexport type { Option, SelectGroupHeader, SelectDivider, SelectItem } from \"@/components/inputs/select-item.ts\";\n\n\nexport const InputSelect = <T, >(props: InputSelectProps<T>) => {\n\n const {\n className,\n label,\n description,\n options,\n onChange,\n value,\n placeholder,\n maxHeight = 300,\n error,\n size = 'md',\n disabled = false,\n clearable = false,\n } = props;\n\n const [ open, setOpen ] = useState(false);\n const [ activeIndex, setActiveIndex ] = useState<number | null>(null);\n const ref = React.useRef<HTMLDivElement>(null);\n const listRef = React.useRef<Array<HTMLElement | null>>([]);\n const selectedOption = options?.find((item): item is Option<T> => isSelectOption(item) && selectValueEquals(item.value, value));\n\n const disabledIndices = useMemo(\n () => options\n .map((item, i) => (!isSelectOption(item) || item.disabled) ? i : -1)\n .filter(i => i !== -1),\n [options],\n );\n\n useDismiss(open, () => setOpen(false));\n\n useEffect(() => {\n if (open) {\n ref.current?.focus({ preventScroll: true });\n const selectedIdx = options.findIndex(item => isSelectOption(item) && selectValueEquals(item.value, value));\n if (selectedIdx >= 0) {\n setActiveIndex(selectedIdx);\n } else {\n const firstSelectable = options.findIndex(item => isSelectOption(item) && !item.disabled);\n setActiveIndex(firstSelectable >= 0 ? firstSelectable : null);\n }\n } else {\n setActiveIndex(null);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ open ])\n\n const { anchorRef, Popover, getReferenceProps, getItemProps } = useSelectPopover({\n placement: 'bottom',\n fullWidth: true,\n minWidth: 200,\n open,\n onOpenChange: setOpen,\n listRef,\n activeIndex,\n onNavigate: setActiveIndex,\n disabledIndices,\n })\n\n const handleSelect = (idx: number) => {\n const item = options[idx];\n if (item && isSelectOption(item) && !item.disabled) {\n onChange(item.value);\n setOpen(false);\n }\n };\n\n return (\n <ControlSizeContext.Provider value={ size }>\n <div\n className={ classNames(\n 'flex flex-col',\n className\n ) }>\n <InputLabel>{ label }</InputLabel>\n\n <div className={ 'relative flex w-full flex-col' } ref={ anchorRef }>\n <div\n { ...getReferenceProps({\n ref,\n role: 'button',\n tabIndex: disabled ? -1 : 0,\n 'aria-disabled': disabled,\n onClick: () => { if (!disabled) setOpen(!open); },\n onKeyDown: (e) => {\n if (disabled) return;\n if (e.key === ' ') {\n e.preventDefault();\n setOpen(o => !o);\n } else if (e.key === 'Enter') {\n e.preventDefault();\n if (open && activeIndex != null) {\n handleSelect(activeIndex);\n } else {\n setOpen(true);\n }\n }\n },\n }) }\n className={ classNames(\n 'flex flex-row items-center border-[length:var(--border-width-input)] select-trigger transition-all duration-[var(--control-transition-duration)] rounded-[var(--border-radius-input)] shadow-[var(--shadow-control)] ring-0 focus:ring-[length:var(--control-ring-width)] focus:outline-none select-none font-[number:var(--font-weight-input-text)] font-[family-name:var(--font-family-base)]',\n sizeHeightClasses[size],\n sizeFontClasses[size],\n sizePaddingLeftClasses[size],\n clearable && value ? sizePaddingRightWithTrayTwoClasses[size] : sizePaddingRightWithTrayClasses[size],\n disabled ? 'select-trigger-disabled' : error && 'select-trigger-error',\n !disabled && open && 'ring-[length:var(--control-ring-width)]',\n ) }\n >\n { selectedOption && (\n <span className={ 'flex-1 min-w-0 break-all line-clamp-1 text-left' }>{ selectedOption.label }</span>\n ) }\n { !selectedOption && placeholder && (\n <span className={ 'flex-1 min-w-0 break-all line-clamp-1 text-left select-placeholder' }>{ placeholder }</span>\n ) }\n </div>\n <InputIconButtonTray>\n { !disabled && error && (\n <InputErrorIcon/>\n ) }\n { clearable && !!value && !disabled && (\n <InputIconButton Icon={ IconX } onClick={ () => onChange(null) }/>\n ) }\n <InputIconButton Icon={ IconChevronDown }/>\n </InputIconButtonTray>\n <Popover open={ open }>\n <DropdownPanel className={ '!p-0' } style={ { maxHeight: maxHeight } }>\n <div className={ 'flex flex-col p-2 gap-1' }>\n { options.map((item, i) => {\n if (!isSelectOption(item)) {\n if (item.kind === 'header') {\n return (\n <InputSelectGroupHeader\n key={ `header-${ i }` }\n ref={ (el) => { listRef.current[i] = el; } }\n >\n { item.label }\n </InputSelectGroupHeader>\n );\n }\n return (\n <InputSelectDivider\n key={ `divider-${ i }` }\n ref={ (el) => { listRef.current[i] = el; } }\n />\n );\n }\n const isSelected = selectValueEquals(item.value, value);\n return (\n <InputSelectOption\n key={ `option-${ i }` }\n { ...getItemProps({\n ref(el: HTMLElement | null) {\n listRef.current[i] = el;\n },\n }) }\n onClick={ () => handleSelect(i) }\n selected={ isSelected }\n active={ activeIndex === i }\n disabled={ item.disabled }\n >\n { item.label }\n </InputSelectOption>\n )\n }) }\n </div>\n </DropdownPanel>\n </Popover>\n </div>\n <InputDescription>{ description }</InputDescription>\n <InputError>{ error }</InputError>\n </div>\n </ControlSizeContext.Provider>\n );\n};\n","import * as React from \"react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { IconChevronDown, IconSearch, IconSearchOff, IconX } from \"@tabler/icons-react\";\nimport { InputSelectOption } from \"@/components/inputs/InputSelectOption.tsx\";\nimport { InputSelectGroupHeader } from \"@/components/inputs/InputSelectGroupHeader.tsx\";\nimport { InputSelectDivider } from \"@/components/inputs/InputSelectDivider.tsx\";\nimport { useSelectPopover } from \"@/popover/use-select-popover.tsx\";\nimport { DropdownPanel } from \"@/components/dropdown-menu/DropdownPanel.tsx\";\nimport { InputLabel } from \"@/components/inputs/InputLabel.tsx\";\nimport { InputErrorIcon } from \"@/components/inputs/InputErrorIcon.tsx\";\nimport { InputIconButton } from \"@/components/inputs/InputIconButton.tsx\";\nimport { InputIconButtonTray } from \"@/components/inputs/InputIconButtonTray.tsx\";\nimport { InputDescription } from \"@/components/inputs/InputDescription.tsx\";\nimport { InputError } from \"@/components/inputs/InputError.tsx\";\nimport { useDismiss } from \"@/hooks/use-dismiss.ts\";\nimport { ControlSizeContext } from \"@/control-size/use-control-size.ts\";\nimport { isSelectOption, selectValueEquals, type Option, type SelectItem } from \"@/components/inputs/select-item.ts\";\nexport type { Option } from \"@/components/inputs/select-item.ts\";\nimport {\n sizeFontClasses,\n sizeHeightClasses,\n sizePaddingLeftClasses,\n sizePaddingRightWithTrayClasses,\n sizePaddingRightWithTrayTwoClasses,\n} from \"@/control-size/control-size.util.ts\";\n\n\nexport type Size = 'sm' | 'md' | 'lg';\n\nexport type InputSelectSearchableProps<T> = {\n name?: string;\n id?: string;\n className?: string;\n label?: string | React.ReactNode;\n description?: string | React.ReactNode;\n options: SelectItem<T>[];\n onSearch: (search: string) => SelectItem<T>[];\n value: T | null;\n onChange: (value: T | null) => void;\n placeholder?: string;\n maxHeight?: number;\n error?: string | React.ReactNode;\n size?: Size;\n disabled?: boolean;\n clearable?: boolean;\n}\n\nexport const InputSelectSearchable = <T, >(props: InputSelectSearchableProps<T>) => {\n\n const {\n className,\n label,\n description,\n options,\n onChange,\n onSearch,\n value,\n placeholder,\n maxHeight = 300,\n error,\n size = 'md',\n disabled = false,\n clearable = false,\n } = props;\n\n const [ open, setOpen ] = useState(false);\n const [ filteredOptions, setFilteredOptions ] = useState<SelectItem<T>[]>(options);\n const [ search, setSearch ] = useState('');\n const [ activeIndex, setActiveIndex ] = useState<number | null>(null);\n\n const ref = React.useRef<HTMLDivElement>(null);\n const inputSearchRef = React.useRef<HTMLInputElement>(null);\n const listRef = React.useRef<Array<HTMLElement | null>>([]);\n\n const selectedOption = options?.find((item): item is Option<T> => isSelectOption(item) && selectValueEquals(item.value, value));\n const visibleOptions = useMemo(() => search !== '' ? filteredOptions : options, [search, filteredOptions, options]);\n\n const disabledIndices = useMemo(\n () => visibleOptions\n .map((item, i) => (!isSelectOption(item) || item.disabled) ? i : -1)\n .filter(i => i !== -1),\n [visibleOptions],\n );\n\n useDismiss(open, () => setOpen(false));\n\n useEffect(() => {\n setFilteredOptions(onSearch(search));\n }, [ search, options, onSearch ]);\n\n useEffect(() => {\n if (open) {\n setTimeout(() => inputSearchRef.current?.focus(), 100);\n const selectedIdx = options.findIndex(item => isSelectOption(item) && selectValueEquals(item.value, value));\n if (selectedIdx >= 0) {\n setActiveIndex(selectedIdx);\n } else {\n const firstSelectable = options.findIndex(item => isSelectOption(item) && !item.disabled);\n setActiveIndex(firstSelectable >= 0 ? firstSelectable : null);\n }\n } else {\n setActiveIndex(null);\n setSearch('');\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ open ])\n\n useEffect(() => {\n if (!open) return;\n const firstSelectable = visibleOptions.findIndex(item => isSelectOption(item) && !item.disabled);\n setActiveIndex(firstSelectable >= 0 ? firstSelectable : null);\n }, [ search, open, visibleOptions ]);\n\n const { anchorRef, Popover, getReferenceProps, getItemProps } = useSelectPopover({\n placement: 'bottom',\n fullWidth: true,\n minWidth: 200,\n open,\n onOpenChange: setOpen,\n listRef,\n activeIndex,\n onNavigate: setActiveIndex,\n disabledIndices,\n })\n\n const handleSelect = (idx: number) => {\n const item = visibleOptions[idx];\n if (item && isSelectOption(item) && !item.disabled) {\n onChange(item.value);\n setOpen(false);\n }\n };\n\n const hasSelectableVisible = visibleOptions.some(item => isSelectOption(item));\n\n return (\n <ControlSizeContext.Provider value={ size }>\n <div\n className={ classNames(\n 'flex flex-col',\n className\n ) }>\n <InputLabel>{ label }</InputLabel>\n\n <div className={ 'relative flex w-full flex-col' } ref={ anchorRef }>\n <div\n { ...getReferenceProps({\n ref,\n role: 'button',\n tabIndex: disabled ? -1 : 0,\n 'aria-disabled': disabled,\n onClick: () => { if (!disabled) setOpen(!open); },\n onKeyDown: (e) => {\n if (disabled) return;\n if (e.key === ' ') {\n e.preventDefault();\n setOpen(o => !o);\n } else if (e.key === 'Enter' && !open) {\n e.preventDefault();\n setOpen(true);\n }\n },\n }) }\n className={ classNames(\n 'flex flex-row items-center border-[length:var(--border-width-input)] select-trigger transition-all duration-[var(--control-transition-duration)] rounded-[var(--border-radius-input)] shadow-[var(--shadow-control)] ring-0 focus:ring-[length:var(--control-ring-width)] focus:outline-none select-none font-[number:var(--font-weight-input-text)] font-[family-name:var(--font-family-base)]',\n sizeHeightClasses[size],\n sizeFontClasses[size],\n sizePaddingLeftClasses[size],\n clearable && value ? sizePaddingRightWithTrayTwoClasses[size] : sizePaddingRightWithTrayClasses[size],\n disabled ? 'select-trigger-disabled' : error && 'select-trigger-error',\n !disabled && open && 'ring-[length:var(--control-ring-width)]',\n ) }\n >\n { selectedOption && (\n <span className={ 'flex-1 min-w-0 break-all line-clamp-1 text-left' }>{ selectedOption.label }</span>\n ) }\n { !selectedOption && placeholder && (\n <span className={ 'flex-1 min-w-0 break-all line-clamp-1 text-left select-placeholder' }>{ placeholder }</span>\n ) }\n </div>\n <InputIconButtonTray>\n { !disabled && error && (\n <InputErrorIcon/>\n ) }\n { clearable && !!value && !disabled && (\n <InputIconButton Icon={ IconX } onClick={ () => onChange(null) }/>\n ) }\n <InputIconButton Icon={ IconChevronDown }/>\n </InputIconButtonTray>\n <Popover open={ open }>\n <DropdownPanel className={ 'gap-0 !p-0' } style={ { maxHeight: maxHeight } }>\n <div className={ 'sticky top-0 border-b select-search-bar py-1 backdrop-blur-sm' }>\n <input\n ref={ inputSearchRef }\n type={ 'text' }\n placeholder={ 'Search' }\n value={ search }\n className={ 'appearance-none border-none w-full bg-transparent rounded- pl-10 transition-all duration-[var(--control-transition-duration)] focus:outline-none ring-0 placeholder:text-[var(--color-input-placeholder)]' }\n onChange={ (e) => setSearch(e.target.value) }\n onKeyDown={ (e) => {\n if (e.key === 'Enter' && activeIndex != null) {\n e.preventDefault();\n handleSelect(activeIndex);\n }\n } }\n />\n <IconSearch className={ 'absolute select-search-icon left-4 top-4 h-4 w-4' }/>\n </div>\n <div className={ 'flex flex-col gap-1 p-2' }>\n { search !== '' && !hasSelectableVisible && (\n <div className={ 'flex flex-col items-center justify-center py-6' }>\n <IconSearchOff className={ 'h-6 w-6 text-[var(--color-input-text)]' }/>\n </div>\n ) }\n { visibleOptions.map((item, i) => {\n if (!isSelectOption(item)) {\n if (item.kind === 'header') {\n return (\n <InputSelectGroupHeader\n key={ `header-${ i }` }\n ref={ (el) => { listRef.current[i] = el; } }\n >\n { item.label }\n </InputSelectGroupHeader>\n );\n }\n return (\n <InputSelectDivider\n key={ `divider-${ i }` }\n ref={ (el) => { listRef.current[i] = el; } }\n />\n );\n }\n const isSelected = selectValueEquals(item.value, value);\n return (\n <InputSelectOption\n key={ `option-${ i }` }\n { ...getItemProps({\n ref(el: HTMLElement | null) {\n listRef.current[i] = el;\n },\n }) }\n onClick={ () => handleSelect(i) }\n selected={ isSelected }\n active={ activeIndex === i }\n disabled={ item.disabled }\n >\n { item.label }\n </InputSelectOption>\n )\n }) }\n </div>\n </DropdownPanel>\n </Popover>\n </div>\n <InputDescription>{ description }</InputDescription>\n <InputError>{ error }</InputError>\n </div>\n </ControlSizeContext.Provider>\n );\n};\n","import { useState, useEffect } from \"react\";\n\nexport const useDebounce = <T>(value: T, delay: number): T => {\n const [debouncedValue, setDebouncedValue] = useState(value);\n\n useEffect(() => {\n const handler = setTimeout(() => {\n setDebouncedValue(value);\n }, delay);\n\n return () => {\n clearTimeout(handler);\n };\n }, [value, delay]);\n\n return debouncedValue;\n}","import * as React from \"react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { IconChevronDown, IconSearch, IconSearchOff, IconX } from \"@tabler/icons-react\";\nimport { InputSelectOption } from \"@/components/inputs/InputSelectOption.tsx\";\nimport { InputSelectGroupHeader } from \"@/components/inputs/InputSelectGroupHeader.tsx\";\nimport { InputSelectDivider } from \"@/components/inputs/InputSelectDivider.tsx\";\nimport { useSelectPopover } from \"@/popover/use-select-popover.tsx\";\nimport { DropdownPanel } from \"@/components/dropdown-menu/DropdownPanel.tsx\";\nimport { Spinner } from \"@/spinner/Spinner.tsx\";\nimport { useDebounce } from \"@/hooks/use-debounce.ts\";\nimport { InputIconButtonTray } from \"@/components/inputs/InputIconButtonTray.tsx\";\nimport { InputIconButton } from \"@/components/inputs/InputIconButton.tsx\";\nimport { InputDescription } from \"@/components/inputs/InputDescription.tsx\";\nimport { InputLabel } from \"@/components/inputs/InputLabel.tsx\";\nimport { InputErrorIcon } from \"@/components/inputs/InputErrorIcon.tsx\";\nimport { InputError } from \"@/components/inputs/InputError.tsx\";\nimport { useDismiss } from \"@/hooks/use-dismiss.ts\";\nimport { ControlSizeContext } from \"@/control-size/use-control-size.ts\";\nimport { isSelectOption, selectValueEquals, type Option, type SelectItem } from \"@/components/inputs/select-item.ts\";\nexport type { Option } from \"@/components/inputs/select-item.ts\";\nimport {\n sizeFontClasses,\n sizeHeightClasses,\n sizePaddingLeftClasses,\n sizePaddingRightWithTrayClasses,\n sizePaddingRightWithTrayTwoClasses,\n} from \"@/control-size/control-size.util.ts\";\n\n\nexport type Size = 'sm' | 'md' | 'lg';\n\nexport type InputSelectSearchableAsyncProps<T> = {\n name?: string;\n id?: string;\n className?: string;\n label?: string | React.ReactNode;\n description?: string | React.ReactNode;\n fetchOptionsByQuery: (search: string) => Promise<SelectItem<T>[]>;\n fetchOptionByValue: (value: T) => Promise<Option<T>>;\n onSearchDebounceMs?: number;\n value: T | null;\n onChange: (value: T | null) => void;\n placeholder?: string;\n maxHeight?: number;\n error?: string | React.ReactNode;\n size?: Size;\n disabled?: boolean;\n clearable?: boolean;\n}\n\nexport const InputSelectSearchableAsync = <T, >(props: InputSelectSearchableAsyncProps<T>) => {\n\n const {\n className,\n label,\n description,\n onChange,\n fetchOptionsByQuery,\n fetchOptionByValue,\n onSearchDebounceMs = 300,\n value,\n placeholder,\n maxHeight = 300,\n error,\n size = 'md',\n disabled = false,\n clearable = false,\n } = props;\n\n const [ open, setOpen ] = useState(false);\n const ref = React.useRef<HTMLDivElement>(null);\n const [ search, setSearch ] = useState('');\n const [ options, setOptions ] = useState<SelectItem<T>[]>([]);\n const [ selectedOption, setSelectedOption ] = useState<Option<T> | null>(null);\n const inputSearchRef = React.useRef<HTMLInputElement>(null);\n const [ isFetching, setIsFetching ] = useState(false);\n const [ isFetchingSelectedOption, setIsFetchingSelectedOption ] = useState(false);\n const [ activeIndex, setActiveIndex ] = useState<number | null>(null);\n const listRef = React.useRef<Array<HTMLElement | null>>([]);\n\n const disabledIndices = useMemo(\n () => options\n .map((item, i) => (!isSelectOption(item) || item.disabled) ? i : -1)\n .filter(i => i !== -1),\n [options],\n );\n\n useDismiss(open, () => setOpen(false));\n\n const debouncedQuery = useDebounce(search, onSearchDebounceMs); // wait 500ms\n\n useEffect(() => {\n const handleFetchOptionsByQuery = async () => {\n setIsFetching(true);\n const results = await fetchOptionsByQuery(debouncedQuery);\n setOptions(results);\n setIsFetching(false);\n };\n\n handleFetchOptionsByQuery();\n }, [debouncedQuery, fetchOptionsByQuery]);\n\n useEffect(() => {\n if (value === null || value === undefined) {\n setSelectedOption(null);\n return;\n }\n\n const selectedFromOptions = options?.find((item): item is Option<T> => isSelectOption(item) && selectValueEquals(item.value, value));\n\n if (!selectedFromOptions) {\n const handleFetchOptionByValue = async () => {\n setIsFetchingSelectedOption(true);\n const result = await fetchOptionByValue(value);\n setSelectedOption(result);\n setIsFetchingSelectedOption(false);\n }\n handleFetchOptionByValue();\n } else {\n setSelectedOption(selectedFromOptions);\n }\n }, [fetchOptionByValue, options, value]);\n\n useEffect(() => {\n if (open) {\n setTimeout(() => inputSearchRef.current?.focus(), 100);\n } else {\n setActiveIndex(null);\n setSearch('');\n }\n }, [ open ])\n\n useEffect(() => {\n if (!open) return;\n const firstSelectable = options.findIndex(item => isSelectOption(item) && !item.disabled);\n setActiveIndex(firstSelectable >= 0 ? firstSelectable : null);\n }, [ options, open ]);\n\n const { anchorRef, Popover, getReferenceProps, getItemProps } = useSelectPopover({\n placement: 'bottom',\n fullWidth: true,\n minWidth: 200,\n open,\n onOpenChange: setOpen,\n listRef,\n activeIndex,\n onNavigate: setActiveIndex,\n disabledIndices,\n })\n\n const handleSelect = (idx: number) => {\n const item = options[idx];\n if (item && isSelectOption(item) && !item.disabled) {\n onChange(item.value);\n setOpen(false);\n }\n };\n\n const hasSelectableVisible = options.some(item => isSelectOption(item));\n\n return (\n <ControlSizeContext.Provider value={ size }>\n <div\n className={ classNames(\n 'flex flex-col',\n className\n ) }>\n <InputLabel>{ label }</InputLabel>\n\n <div className={ 'relative flex w-full flex-col' } ref={ anchorRef }>\n <div\n { ...getReferenceProps({\n ref,\n role: 'button',\n tabIndex: disabled ? -1 : 0,\n 'aria-disabled': disabled,\n onClick: () => { if (!disabled) setOpen(!open); },\n onKeyDown: (e) => {\n if (disabled) return;\n if (e.key === ' ') {\n e.preventDefault();\n setOpen(o => !o);\n } else if (e.key === 'Enter' && !open) {\n e.preventDefault();\n setOpen(true);\n }\n },\n }) }\n className={ classNames(\n 'flex flex-row items-center border-[length:var(--border-width-input)] select-trigger transition-all duration-[var(--control-transition-duration)] rounded-[var(--border-radius-input)] shadow-[var(--shadow-control)] ring-0 focus:ring-[length:var(--control-ring-width)] focus:outline-none select-none font-[number:var(--font-weight-input-text)] font-[family-name:var(--font-family-base)]',\n sizeHeightClasses[size],\n sizeFontClasses[size],\n sizePaddingLeftClasses[size],\n clearable && value ? sizePaddingRightWithTrayTwoClasses[size] : sizePaddingRightWithTrayClasses[size],\n disabled ? 'select-trigger-disabled' : error && 'select-trigger-error',\n !disabled && open && 'ring-[length:var(--control-ring-width)]',\n ) }\n >\n { !isFetchingSelectedOption && selectedOption && (\n <span className={ 'flex-1 min-w-0 break-all line-clamp-1 text-left' }>{ selectedOption.label }</span>\n ) }\n { !isFetchingSelectedOption && !selectedOption && placeholder && (\n <span className={ 'flex-1 min-w-0 break-all line-clamp-1 text-left select-placeholder' }>{ placeholder }</span>\n ) }\n { isFetchingSelectedOption && (\n <Spinner className={ 'h-4 w-4 text-[var(--color-input-text)]' }/>\n ) }\n </div>\n <InputIconButtonTray>\n { !disabled && error && (\n <InputErrorIcon/>\n ) }\n { clearable && !!value && !disabled && (\n <InputIconButton Icon={ IconX } onClick={ () => onChange(null) }/>\n ) }\n <InputIconButton Icon={ IconChevronDown }/>\n </InputIconButtonTray>\n <Popover open={ open }>\n <DropdownPanel className={ 'gap-0 !p-0' } style={ { maxHeight: maxHeight } }>\n <div className={ 'sticky top-0 border-b select-search-bar py-1 backdrop-blur-sm' }>\n <input\n ref={ inputSearchRef }\n type={ 'text' }\n placeholder={ 'Search' }\n value={ search }\n className={ 'appearance-none border-none w-full bg-transparent rounded- pl-10 transition-all duration-[var(--control-transition-duration)] focus:outline-none ring-0 placeholder:text-[var(--color-input-placeholder)]' }\n onChange={ (e) => setSearch(e.target.value) }\n onKeyDown={ (e) => {\n if (e.key === 'Enter' && activeIndex != null) {\n e.preventDefault();\n handleSelect(activeIndex);\n }\n } }\n />\n <IconSearch className={ 'absolute select-search-icon left-4 top-4 h-4 w-4' }/>\n </div>\n <div className={ 'flex flex-col gap-1 p-2' }>\n { !isFetching && !hasSelectableVisible && (\n <div className={ 'flex flex-col items-center justify-center py-6' }>\n <IconSearchOff className={ 'h-6 w-6 text-[var(--color-input-text)]' }/>\n </div>\n ) }\n { isFetching && (\n <div className={ 'flex flex-col items-center justify-center py-6' }>\n <Spinner className={ 'h-6 w-6 text-[var(--color-input-text)]' }/>\n </div>\n ) }\n { !isFetching && options.map((item, i) => {\n if (!isSelectOption(item)) {\n if (item.kind === 'header') {\n return (\n <InputSelectGroupHeader\n key={ `header-${ i }` }\n ref={ (el) => { listRef.current[i] = el; } }\n >\n { item.label }\n </InputSelectGroupHeader>\n );\n }\n return (\n <InputSelectDivider\n key={ `divider-${ i }` }\n ref={ (el) => { listRef.current[i] = el; } }\n />\n );\n }\n const isSelected = selectValueEquals(item.value, value);\n return (\n <InputSelectOption\n key={ `option-${ i }` }\n { ...getItemProps({\n ref(el: HTMLElement | null) {\n listRef.current[i] = el;\n },\n }) }\n onClick={ () => handleSelect(i) }\n selected={ isSelected }\n active={ activeIndex === i }\n disabled={ item.disabled }\n >\n { item.label }\n </InputSelectOption>\n )\n }) }\n </div>\n </DropdownPanel>\n </Popover>\n </div>\n <InputDescription>{ description }</InputDescription>\n <InputError>{ error }</InputError>\n </div>\n </ControlSizeContext.Provider>\n );\n};\n","export const BadgeColor = {\n red: 'bg-red-100 text-red-700 ring-red-200 dark:bg-red-950 dark:text-red-300 dark:ring-red-800',\n orange: 'bg-orange-100 text-orange-700 ring-orange-200 dark:bg-orange-950 dark:text-orange-300 dark:ring-orange-800',\n amber: 'bg-amber-100 text-amber-700 ring-amber-200 dark:bg-amber-950 dark:text-amber-300 dark:ring-amber-800',\n yellow: 'bg-yellow-100 text-yellow-700 ring-yellow-200 dark:bg-yellow-950 dark:text-yellow-300 dark:ring-yellow-800',\n lime: 'bg-lime-100 text-lime-700 ring-lime-200 dark:bg-lime-950 dark:text-lime-300 dark:ring-lime-800',\n green: 'bg-green-100 text-green-700 ring-green-200 dark:bg-green-950 dark:text-green-300 dark:ring-green-800',\n emerald: 'bg-emerald-100 text-emerald-700 ring-emerald-200 dark:bg-emerald-950 dark:text-emerald-300 dark:ring-emerald-800',\n teal: 'bg-teal-100 text-teal-700 ring-teal-200 dark:bg-teal-950 dark:text-teal-300 dark:ring-teal-800',\n cyan: 'bg-cyan-100 text-cyan-700 ring-cyan-200 dark:bg-cyan-950 dark:text-cyan-300 dark:ring-cyan-800',\n sky: 'bg-sky-100 text-sky-700 ring-sky-200 dark:bg-sky-950 dark:text-sky-300 dark:ring-sky-800',\n blue: 'bg-blue-100 text-blue-700 ring-blue-200 dark:bg-blue-950 dark:text-blue-300 dark:ring-blue-800',\n indigo: 'bg-indigo-100 text-indigo-700 ring-indigo-200 dark:bg-indigo-950 dark:text-indigo-300 dark:ring-indigo-800',\n violet: 'bg-violet-100 text-violet-700 ring-violet-200 dark:bg-violet-950 dark:text-violet-300 dark:ring-violet-800',\n purple: 'bg-purple-100 text-purple-700 ring-purple-200 dark:bg-purple-950 dark:text-purple-300 dark:ring-purple-800',\n fuchsia: 'bg-fuchsia-100 text-fuchsia-700 ring-fuchsia-200 dark:bg-fuchsia-950 dark:text-fuchsia-300 dark:ring-fuchsia-800',\n pink: 'bg-pink-100 text-pink-700 ring-pink-200 dark:bg-pink-950 dark:text-pink-300 dark:ring-pink-800',\n rose: 'bg-rose-100 text-rose-700 ring-rose-200 dark:bg-rose-950 dark:text-rose-300 dark:ring-rose-800',\n slate: 'bg-slate-100 text-slate-700 ring-slate-200 dark:bg-slate-950 dark:text-slate-300 dark:ring-slate-800',\n gray: 'bg-gray-100 text-gray-700 ring-gray-200 dark:bg-gray-950 dark:text-gray-300 dark:ring-gray-800',\n zinc: 'bg-zinc-100 text-zinc-700 ring-zinc-200 dark:bg-zinc-950 dark:text-zinc-300 dark:ring-zinc-800',\n neutral: 'bg-neutral-100 text-neutral-700 ring-neutral-200 dark:bg-neutral-950 dark:text-neutral-300 dark:ring-neutral-800',\n stone: 'bg-stone-100 text-stone-700 ring-stone-200 dark:bg-stone-950 dark:text-stone-300 dark:ring-stone-800',\n white: 'bg-[var(--color-badge-white-bg)] text-[var(--color-badge-white-text)] ring-[var(--color-badge-white-ring)]',\n black: 'bg-[var(--color-badge-black-bg)] text-[var(--color-badge-black-text)] ring-[var(--color-badge-black-ring)]',\n} as const;\n\nexport type BadgeColorKey = keyof typeof BadgeColor;\n","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { BadgeColor, type BadgeColorKey } from \"./BadgeColors.tsx\";\nimport { IconX, type TablerIcon } from \"@tabler/icons-react\";\n\nexport type BadgeProps = {\n className?: string;\n children?: React.ReactNode;\n color?: BadgeColorKey;\n onClick?: () => void;\n showCloseIcon?: boolean;\n Icon?: TablerIcon;\n}\n\nexport const Badge = React.forwardRef<HTMLDivElement, BadgeProps>((props: BadgeProps, ref) => {\n const {\n className,\n children,\n onClick,\n showCloseIcon,\n Icon,\n color = 'gray',\n } = props;\n const classes = classNames(\n 'inline-flex align-top items-center gap-2 px-3 h-7 rounded-[var(--border-radius-badge)] font-[number:var(--font-weight-badge)] font-[family-name:var(--font-family-base)]',\n BadgeColor[color],\n className\n )\n if (onClick) {\n return (\n <div ref={ ref }>\n <button\n className={ classNames('cursor-pointer ring-0 hover:ring-[length:var(--control-ring-width)] active:ring-[length:var(--control-ring-width-active)] transition-all duration-[var(--control-transition-duration-fast)] select-none focus:outline-none focus:ring-[length:var(--control-ring-width)]', classes) }\n onClick={ onClick }\n >\n { Icon && <Icon className={ 'h-4 w-4 shrink-0' }/> }\n <div className={ 'break-all line-clamp-1 text-left' }>{ children }</div>\n { showCloseIcon && (\n <IconX\n className={ 'h-4 w-4 shrink-0' }\n />\n ) }\n </button>\n </div>\n );\n }\n return (\n <div className={ classes } ref={ ref }>\n { Icon && <Icon className={ 'h-4 w-4 shrink-0' }/> }\n <div className={ 'break-all line-clamp-1 text-left' }>{ children }</div>\n </div>\n );\n});","import { type RefObject, useLayoutEffect, useState } from \"react\";\n\ntype UseOverflowFitOptions = {\n enabled: boolean;\n triggerRef: RefObject<HTMLElement | null>;\n measureRef: RefObject<HTMLElement | null>;\n trayRef?: RefObject<HTMLElement | null>;\n itemCount: number;\n deps?: ReadonlyArray<unknown>;\n gap?: number;\n};\n\n/* Computes how many of `itemCount` items fit on a single line inside the\n * trigger element, reserving room for a trailing \"+N more\" indicator.\n *\n * The measure layer must render the items in order, followed by the\n * worst-case \"+N more\" element as its last child. The hook reads each\n * child's width via offsetWidth and ignores layout outside the measure\n * subtree, so the measure layer can be visibility:hidden.\n */\nexport function useOverflowFit(options: UseOverflowFitOptions): number {\n const {\n enabled,\n triggerRef,\n measureRef,\n trayRef,\n itemCount,\n deps = [],\n gap = 4,\n } = options;\n\n const [ visibleCount, setVisibleCount ] = useState(0);\n\n useLayoutEffect(() => {\n if (!enabled) return;\n const trigger = triggerRef.current;\n const measure = measureRef.current;\n if (!trigger || !measure) return;\n\n const compute = () => {\n if (itemCount === 0) {\n setVisibleCount(0);\n return;\n }\n if (itemCount === 1) {\n setVisibleCount(1);\n return;\n }\n\n const cs = window.getComputedStyle(trigger);\n const paddingLeft = parseFloat(cs.paddingLeft || '0');\n const triggerRect = trigger.getBoundingClientRect();\n const contentLeft = triggerRect.left + paddingLeft;\n\n let contentRight = triggerRect.right - parseFloat(cs.paddingRight || '0');\n const trayEl = trayRef?.current;\n if (trayEl) {\n const trayRect = trayEl.getBoundingClientRect();\n if (trayRect.width > 0) {\n contentRight = Math.min(contentRight, trayRect.left - gap);\n }\n }\n const available = Math.max(0, contentRight - contentLeft);\n\n const children = Array.from(measure.children) as HTMLElement[];\n if (children.length < itemCount + 1) return;\n\n let totalAll = 0;\n for (let i = 0; i < itemCount; i++) {\n totalAll += children[i].offsetWidth + (i > 0 ? gap : 0);\n }\n if (totalAll <= available) {\n setVisibleCount(itemCount);\n return;\n }\n\n const moreWidth = children[itemCount].offsetWidth;\n let used = 0;\n let count = 0;\n for (let i = 0; i < itemCount; i++) {\n const w = children[i].offsetWidth;\n const next = used + w + (i > 0 ? gap : 0);\n if (next + moreWidth + gap > available) break;\n used = next;\n count++;\n }\n setVisibleCount(Math.max(1, count));\n };\n\n const ro = new ResizeObserver(compute);\n ro.observe(trigger);\n if (trayRef?.current) ro.observe(trayRef.current);\n compute();\n return () => ro.disconnect();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ enabled, itemCount, ...deps ]);\n\n return visibleCount;\n}\n","import * as React from \"react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { IconChevronDown, IconSearch, IconSearchOff, IconX } from \"@tabler/icons-react\";\nimport { Badge } from \"@/components/Badge.tsx\";\nimport { type BadgeColorKey } from \"@/components/BadgeColors.tsx\";\nimport { InputSelectOption } from \"@/components/inputs/InputSelectOption.tsx\";\nimport { InputSelectGroupHeader } from \"@/components/inputs/InputSelectGroupHeader.tsx\";\nimport { InputSelectDivider } from \"@/components/inputs/InputSelectDivider.tsx\";\nimport { useSelectPopover } from \"@/popover/use-select-popover.tsx\";\nimport { DropdownPanel } from \"@/components/dropdown-menu/DropdownPanel.tsx\";\nimport { InputLabel } from \"@/components/inputs/InputLabel.tsx\";\nimport { InputErrorIcon } from \"@/components/inputs/InputErrorIcon.tsx\";\nimport { InputIconButton } from \"@/components/inputs/InputIconButton.tsx\";\nimport { InputIconButtonTray } from \"@/components/inputs/InputIconButtonTray.tsx\";\nimport { InputDescription } from \"@/components/inputs/InputDescription.tsx\";\nimport { InputError } from \"@/components/inputs/InputError.tsx\";\nimport { useDismiss } from \"@/hooks/use-dismiss.ts\";\nimport { useOverflowFit } from \"@/hooks/use-overflow-fit.ts\";\nimport { ControlSizeContext } from \"@/control-size/use-control-size.ts\";\nimport { isSelectOption, selectValueEquals, type Option, type SelectItem } from \"@/components/inputs/select-item.ts\";\nimport {\n sizeFontClasses,\n sizeHeightClasses,\n sizeMinHeightClasses,\n sizePaddingLeftClasses,\n sizePaddingRightWithTrayClasses,\n sizePaddingRightWithTrayTwoClasses,\n} from \"@/control-size/control-size.util.ts\";\n\n\nexport type Size = 'sm' | 'md' | 'lg';\n\nexport type InputSelectMultipleProps<T> = {\n name?: string;\n id?: string;\n className?: string;\n label?: string | React.ReactNode;\n description?: string | React.ReactNode;\n options: SelectItem<T>[];\n onSearch?: (search: string) => SelectItem<T>[];\n value: T[];\n onChange: (value: T[]) => void;\n placeholder?: string;\n maxHeight?: number;\n error?: string | React.ReactNode;\n size?: Size;\n singleLine?: boolean;\n color?: BadgeColorKey;\n disabled?: boolean;\n clearable?: boolean;\n}\n\nexport const InputSelectMultiple = <T, >(props: InputSelectMultipleProps<T>) => {\n\n const {\n className,\n label,\n description,\n options,\n onChange,\n onSearch,\n value,\n placeholder,\n maxHeight = 300,\n error,\n size = 'md',\n singleLine = false,\n color = 'blue',\n disabled = false,\n clearable = false,\n } = props;\n\n const [ open, setOpen ] = useState(false);\n const [ filteredOptions, setFilteredOptions ] = useState<SelectItem<T>[]>(options);\n const [ search, setSearch ] = useState('');\n const [ activeIndex, setActiveIndex ] = useState<number | null>(null);\n\n const ref = React.useRef<HTMLDivElement>(null);\n const inputSearchRef = React.useRef<HTMLInputElement>(null);\n const listRef = React.useRef<Array<HTMLElement | null>>([]);\n const measureRef = React.useRef<HTMLDivElement>(null);\n const trayRef = React.useRef<HTMLDivElement>(null);\n\n const selectedOptions = useMemo(\n () => value\n .map(v => options.find((item): item is Option<T> => isSelectOption(item) && selectValueEquals(item.value, v)))\n .filter((item): item is Option<T> => item !== undefined),\n [ value, options ],\n );\n\n const defaultSearch = (q: string): SelectItem<T>[] => {\n if (q === '') return options;\n const lower = q.toLowerCase();\n return options.filter(item => {\n if (!isSelectOption(item)) return true;\n if (typeof item.label === 'string') {\n return item.label.toLowerCase().includes(lower);\n }\n return true;\n });\n };\n\n const visibleOptions = useMemo(\n () => search !== '' ? filteredOptions : options,\n [ search, filteredOptions, options ],\n );\n\n const disabledIndices = useMemo(\n () => visibleOptions\n .map((item, i) => (!isSelectOption(item) || item.disabled) ? i : -1)\n .filter(i => i !== -1),\n [ visibleOptions ],\n );\n\n useDismiss(open, () => setOpen(false));\n\n useEffect(() => {\n const fn = onSearch ?? defaultSearch;\n setFilteredOptions(fn(search));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ search, options, onSearch ]);\n\n useEffect(() => {\n if (open) {\n setTimeout(() => inputSearchRef.current?.focus(), 100);\n const firstSelectable = options.findIndex(item => isSelectOption(item) && !item.disabled);\n setActiveIndex(firstSelectable >= 0 ? firstSelectable : null);\n } else {\n setActiveIndex(null);\n setSearch('');\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ open ]);\n\n useEffect(() => {\n if (!open) return;\n const firstSelectable = visibleOptions.findIndex(item => isSelectOption(item) && !item.disabled);\n setActiveIndex(firstSelectable >= 0 ? firstSelectable : null);\n }, [ search, open, visibleOptions ]);\n\n const visibleCount = useOverflowFit({\n enabled: singleLine,\n triggerRef: ref,\n measureRef,\n trayRef,\n itemCount: selectedOptions.length,\n deps: [ selectedOptions, error ],\n });\n\n const { anchorRef, Popover, getReferenceProps, getItemProps } = useSelectPopover({\n placement: 'bottom',\n fullWidth: true,\n minWidth: 200,\n open,\n onOpenChange: setOpen,\n listRef,\n activeIndex,\n onNavigate: setActiveIndex,\n disabledIndices,\n });\n\n const toggleValue = (v: T) => {\n if (value.some(item => selectValueEquals(item, v))) {\n onChange(value.filter(item => !selectValueEquals(item, v)));\n } else {\n onChange([ ...value, v ]);\n }\n };\n\n const handleSelect = (idx: number) => {\n const item = visibleOptions[idx];\n if (item && isSelectOption(item) && !item.disabled) {\n toggleValue(item.value);\n }\n };\n\n const hasSelectableVisible = visibleOptions.some(item => isSelectOption(item));\n const hasSelection = value.length > 0;\n\n const displayedCount = singleLine ? visibleCount : selectedOptions.length;\n const visibleBadges = selectedOptions.slice(0, displayedCount);\n const hiddenCount = selectedOptions.length - displayedCount;\n\n return (\n <ControlSizeContext.Provider value={ size }>\n <div\n className={ classNames(\n 'flex flex-col',\n className\n ) }>\n <InputLabel>{ label }</InputLabel>\n\n <div className={ 'relative flex w-full flex-col' } ref={ anchorRef }>\n <div\n { ...getReferenceProps({\n ref,\n role: 'button',\n tabIndex: disabled ? -1 : 0,\n 'aria-disabled': disabled,\n onClick: () => { if (!disabled) setOpen(!open); },\n onKeyDown: (e) => {\n if (disabled) return;\n if (e.key === ' ') {\n e.preventDefault();\n setOpen(o => !o);\n } else if (e.key === 'Enter' && !open) {\n e.preventDefault();\n setOpen(true);\n } else if (e.key === 'Backspace' && !open && hasSelection) {\n e.preventDefault();\n onChange(value.slice(0, -1));\n }\n },\n }) }\n className={ classNames(\n 'flex flex-row items-center gap-1 border-[length:var(--border-width-input)] select-trigger transition-all duration-[var(--control-transition-duration)] rounded-[var(--border-radius-input)] shadow-[var(--shadow-control)] ring-0 focus:ring-[length:var(--control-ring-width)] focus:outline-none select-none font-[number:var(--font-weight-input-text)] font-[family-name:var(--font-family-base)]',\n singleLine && classNames('flex-nowrap overflow-hidden', sizeHeightClasses[size]),\n !singleLine && classNames('flex-wrap py-1.5', sizeMinHeightClasses[size]),\n sizeFontClasses[size],\n sizePaddingLeftClasses[size],\n clearable && hasSelection ? sizePaddingRightWithTrayTwoClasses[size] : sizePaddingRightWithTrayClasses[size],\n disabled ? 'select-trigger-disabled' : error && 'select-trigger-error',\n !disabled && open && 'ring-[length:var(--control-ring-width)]',\n ) }\n >\n { hasSelection && visibleBadges.map((opt, i) => (\n <Badge\n key={ `badge-${ i }` }\n color={ color }\n className={ classNames(\n singleLine && displayedCount > 1 && 'shrink-0',\n (!singleLine || displayedCount === 1) && 'max-w-full min-w-0',\n ) }\n >\n { opt.label }\n </Badge>\n )) }\n { hasSelection && hiddenCount > 0 && (\n <span className={ 'shrink-0 text-sm font-[number:var(--font-weight-input-option-label)] select-placeholder px-1' }>\n +{ hiddenCount } more\n </span>\n ) }\n { !hasSelection && placeholder && (\n <span className={ 'select-placeholder' }>{ placeholder }</span>\n ) }\n </div>\n { singleLine && (\n <div\n ref={ measureRef }\n aria-hidden\n className={ 'absolute top-0 left-0 invisible pointer-events-none flex flex-row flex-nowrap items-center gap-1 w-max' }\n >\n { selectedOptions.map((opt, i) => (\n <Badge key={ `measure-${ i }` } color={ color }>\n { opt.label }\n </Badge>\n )) }\n { selectedOptions.length > 0 && (\n <span className={ 'text-sm font-[number:var(--font-weight-input-option-label)] px-1' }>\n +{ selectedOptions.length } more\n </span>\n ) }\n </div>\n ) }\n <InputIconButtonTray ref={ trayRef }>\n { !disabled && error && (\n <InputErrorIcon/>\n ) }\n { clearable && hasSelection && !disabled && (\n <InputIconButton Icon={ IconX } onClick={ () => onChange([]) }/>\n ) }\n <InputIconButton Icon={ IconChevronDown }/>\n </InputIconButtonTray>\n <Popover open={ open }>\n <DropdownPanel className={ 'gap-0 !p-0' } style={ { maxHeight: maxHeight } }>\n <div className={ 'sticky top-0 border-b select-search-bar py-1 backdrop-blur-sm' }>\n <input\n ref={ inputSearchRef }\n type={ 'text' }\n placeholder={ 'Search' }\n value={ search }\n className={ 'appearance-none border-none w-full bg-transparent rounded- pl-10 transition-all duration-[var(--control-transition-duration)] focus:outline-none ring-0 placeholder:text-[var(--color-input-placeholder)]' }\n onChange={ (e) => setSearch(e.target.value) }\n onKeyDown={ (e) => {\n if (e.key === 'Enter' && activeIndex != null) {\n e.preventDefault();\n handleSelect(activeIndex);\n } else if (e.key === 'Backspace' && search === '' && hasSelection) {\n e.preventDefault();\n onChange(value.slice(0, -1));\n }\n } }\n />\n <IconSearch className={ 'absolute select-search-icon left-4 top-4 h-4 w-4' }/>\n </div>\n <div className={ 'flex flex-col gap-1 p-2' }>\n { search !== '' && !hasSelectableVisible && (\n <div className={ 'flex flex-col items-center justify-center py-6' }>\n <IconSearchOff className={ 'h-6 w-6 text-[var(--color-input-text)]' }/>\n </div>\n ) }\n { visibleOptions.map((item, i) => {\n if (!isSelectOption(item)) {\n if (item.kind === 'header') {\n return (\n <InputSelectGroupHeader\n key={ `header-${ i }` }\n ref={ (el) => { listRef.current[i] = el; } }\n >\n { item.label }\n </InputSelectGroupHeader>\n );\n }\n return (\n <InputSelectDivider\n key={ `divider-${ i }` }\n ref={ (el) => { listRef.current[i] = el; } }\n />\n );\n }\n const isSelected = value.some(v => selectValueEquals(v, item.value));\n return (\n <InputSelectOption\n key={ `option-${ i }` }\n { ...getItemProps({\n ref(el: HTMLElement | null) {\n listRef.current[i] = el;\n },\n }) }\n onClick={ () => handleSelect(i) }\n selected={ isSelected }\n active={ activeIndex === i }\n disabled={ item.disabled }\n >\n { item.label }\n </InputSelectOption>\n );\n }) }\n </div>\n </DropdownPanel>\n </Popover>\n </div>\n <InputDescription>{ description }</InputDescription>\n <InputError>{ error }</InputError>\n </div>\n </ControlSizeContext.Provider>\n );\n};\n","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\n\n\nexport type PanelProps = React.HTMLAttributes<HTMLDivElement> & {\n children?: React.ReactNode;\n}\n\nexport const Panel = React.forwardRef<HTMLDivElement, PanelProps>((props, ref) => {\n\n const {\n className,\n children,\n ...rest\n } = props;\n\n return (\n <div\n ref={ ref }\n className={ classNames(\n 'flex flex-col gap-6 border-[length:var(--border-width-input)] panel-base rounded-[var(--border-radius-panel)] shadow-[var(--shadow-control)] px-6 py-6',\n className\n ) }\n { ...rest }\n >\n { children }\n </div>\n );\n});","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\n\n\nexport type PanelStackProps = React.HTMLAttributes<HTMLDivElement> & {\n children?: React.ReactNode;\n}\n\nexport const PanelStack = React.forwardRef<HTMLDivElement, PanelStackProps>((props, ref) => {\n\n const {\n className,\n children,\n ...rest\n } = props;\n\n return (\n <div\n ref={ ref }\n className={ classNames(\n 'flex flex-col gap-1 border-[length:var(--border-width-input)] panel-base rounded-[var(--border-radius-panel)] shadow-[var(--shadow-control)] p-2',\n className\n ) }\n { ...rest }\n >\n { children }\n </div>\n );\n});\n","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\n\n\nexport type PanelFieldOrientation = 'vertical' | 'horizontal';\n\nexport type PanelFieldProps = React.HTMLAttributes<HTMLDivElement> & {\n label?: string | React.ReactNode;\n children?: React.ReactNode;\n orientation?: PanelFieldOrientation;\n}\n\nconst labelClasses: string = 'input-description text-[length:var(--font-size-description)] font-[number:var(--font-weight-panel-field)]';\n\nexport const PanelField = (props: PanelFieldProps) => {\n\n const {\n className,\n label,\n children,\n orientation = 'vertical',\n ...rest\n } = props;\n\n if (orientation === 'horizontal') {\n return (\n <div\n className={ classNames(\n 'flex flex-row items-center gap-3 px-3 py-2',\n className\n ) }\n { ...rest }\n >\n <div className={ classNames(labelClasses, 'w-1/2 line-clamp-1 break-all') }>{ label }</div>\n <div className={ 'w-1/2 line-clamp-1 break-all' }>{ children }</div>\n </div>\n );\n }\n\n return (\n <div\n className={ classNames(\n 'flex flex-col gap-1 px-3 py-2',\n className\n ) }\n { ...rest }\n >\n { label && <div className={ labelClasses }>{ label }</div> }\n <div>{ children }</div>\n </div>\n );\n};\n","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport {\n IconAlertTriangleFilled,\n IconChevronRight,\n IconCircleCheckFilled,\n IconExclamationCircleFilled,\n IconInfoCircleFilled,\n type TablerIcon,\n} from \"@tabler/icons-react\";\n\n\nexport type PanelLinkStatus = 'error' | 'warning' | 'success' | 'info';\n\nconst statusIcons: Record<PanelLinkStatus, TablerIcon> = {\n error: IconExclamationCircleFilled,\n warning: IconAlertTriangleFilled,\n success: IconCircleCheckFilled,\n info: IconInfoCircleFilled,\n};\n\nconst statusColorClasses: Record<PanelLinkStatus, string> = {\n error: 'text-[var(--color-status-error)]',\n warning: 'text-[var(--color-status-warning)]',\n success: 'text-[var(--color-status-success)]',\n info: 'text-[var(--color-status-info)]',\n};\n\ntype PanelLinkBaseProps = {\n Icon?: TablerIcon;\n children?: React.ReactNode;\n status?: PanelLinkStatus;\n}\n\ntype PanelLinkAnchorProps = PanelLinkBaseProps\n & Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, keyof PanelLinkBaseProps>\n & { href: string };\n\ntype PanelLinkButtonProps = PanelLinkBaseProps\n & Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, keyof PanelLinkBaseProps>\n & { href?: undefined };\n\nexport type PanelLinkProps = PanelLinkAnchorProps | PanelLinkButtonProps;\n\nconst base: string = `inline-flex flex-row gap-3 items-center justify-between h-10 px-3 font-[number:var(--font-weight-panel-link)] font-[family-name:var(--font-family-base)] ring-0 dropdown-item rounded-[var(--border-radius-menu-item)] cursor-pointer transition-all duration-[var(--control-transition-duration)] select-none focus:outline-none focus:ring-0 border border-transparent bg-transparent`;\n\nexport const PanelLink = (props: PanelLinkProps) => {\n\n const {\n className,\n children,\n Icon,\n status,\n ...rest\n } = props;\n\n const StatusIcon = status ? statusIcons[status] : null;\n\n const content = (\n <>\n <span className={ 'inline-flex flex-row items-center gap-3 min-w-0' }>\n { Icon && <Icon className={ 'h-5 w-5 shrink-0' }/> }\n <span className={ 'truncate' }>{ children }</span>\n </span>\n <span className={ 'inline-flex flex-row items-center gap-2 shrink-0' }>\n { StatusIcon && status && (\n <StatusIcon className={ classNames('h-5 w-5', statusColorClasses[status]) }/>\n ) }\n <IconChevronRight className={ 'h-5 w-5 text-[var(--color-input-icon-button-icon)]' }/>\n </span>\n </>\n );\n\n if (rest.href !== undefined) {\n const { href, ...anchorRest } = rest as PanelLinkAnchorProps;\n return (\n <a\n href={ href }\n className={ classNames(base, className) }\n { ...anchorRest }\n >\n { content }\n </a>\n );\n }\n\n return (\n <button\n className={ classNames(base, className) }\n { ...(rest as PanelLinkButtonProps) }\n >\n { content }\n </button>\n );\n};\n","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\n\nexport type DividerProps = {\n vertical?: boolean;\n} & React.HTMLAttributes<HTMLHRElement>\n\nexport const Divider = (props: DividerProps) => {\n const {\n className,\n vertical = false,\n ...rest\n } = props;\n return (\n <div\n className={ classNames(\n vertical ? 'w-px h-full bg-[var(--color-divider)]' : 'w-full h-px bg-[var(--color-divider)]',\n className\n ) }\n { ...rest }\n />\n );\n};","import * as React from \"react\";\nimport { useState } from \"react\";\nimport { usePopover } from \"@/popover/use-popover.tsx\";\nimport { DropdownPanel } from \"@/components/dropdown-menu/DropdownPanel.tsx\";\nimport type { Placement } from \"@floating-ui/react\";\n\nexport type TooltipProps = {\n children?: React.ReactNode;\n content: React.ReactNode;\n className?: string;\n placement?: Placement;\n minWidth?: number;\n maxWidth?: number;\n}\n\nexport const Tooltip = (props: TooltipProps) => {\n const {\n children,\n content,\n className,\n placement = 'top',\n minWidth = 100,\n maxWidth = 200\n } = props;\n //TODO params above\n const [ open, setOpen ] = useState(false);\n const { anchorRef, Popover } = usePopover({\n placement: placement,\n minWidth: minWidth,\n maxWidth: maxWidth,\n })\n return (\n <span\n ref={ anchorRef }\n className={ className }\n onMouseEnter={ () => setOpen(true) }\n onMouseLeave={ () => setOpen(false) }\n >\n { children }\n <Popover open={ open }>\n <DropdownPanel>\n { content }\n </DropdownPanel>\n </Popover>\n </span>\n );\n};","import * as React from \"react\";\nimport { FloatingOverlay, FloatingPortal } from '@floating-ui/react';\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { ButtonIconRound } from \"@/components/button-icon-round/ButtonIconRound.tsx\";\nimport { IconX } from \"@tabler/icons-react\";\nimport { useDismiss } from \"@/hooks/use-dismiss.ts\";\n\nexport type ModalProps = {\n open: boolean;\n className?: string;\n onDismiss?: () => void;\n enableDismissOnOutsideClick?: boolean,\n enableDismissOnEscKey?: boolean,\n enableDismissButton?: boolean,\n children?: React.ReactNode;\n maxWidth?: number;\n}\n\nexport const Modal = (props: ModalProps) => {\n const {\n open,\n onDismiss,\n enableDismissOnOutsideClick,\n enableDismissOnEscKey,\n enableDismissButton,\n className,\n children,\n maxWidth = 600\n } = props;\n\n useDismiss(!!enableDismissOnEscKey && open, onDismiss ? onDismiss : () => {});\n\n return (\n <AnimatePresence>\n { open && (\n <FloatingPortal>\n <motion.div\n className={ 'z-40' }\n style={ { transformOrigin: 'center' } }\n initial={ { opacity: 0 } }\n animate={ { opacity: 1 } }\n exit={ { opacity: 0 } }\n transition={ { duration: 0.15, ease: \"easeInOut\" } }\n >\n <FloatingOverlay\n className={ 'modal-overlay backdrop-blur-[1px]' }\n onClick={ enableDismissOnOutsideClick ? onDismiss : undefined }\n lockScroll={ true }\n />\n </motion.div>\n\n <div className={ 'fixed inset-0 flex flex-col items-center pointer-events-none p-4 lg:p-12 overflow-y-auto z-50' }>\n <motion.div\n className={ classNames(\n 'flex flex-col modal-content rounded-[var(--border-radius-panel)] shadow-[var(--shadow-overlay)] p-6 lg:p-12 pointer-events-auto w-full relative',\n className\n ) }\n style={ { transformOrigin: 'bottom', maxWidth: maxWidth } }\n initial={ { opacity: 0, scale: 0.98, translateY: 10 } }\n animate={ { opacity: 1, scale: 1, translateY: 0 } }\n exit={ { opacity: 0, scale: 0.98, translateY: 10 } }\n transition={ { duration: 0.15, ease: 'easeInOut' } }\n >\n { enableDismissButton && (\n <ButtonIconRound\n Icon={ IconX }\n className={ 'absolute top-4 right-4' }\n variant={ 'transparent' }\n size={ 'sm' }\n onClick={ onDismiss }\n />\n ) }\n { children }\n </motion.div>\n </div>\n </FloatingPortal>\n ) }\n </AnimatePresence>\n );\n};","import * as React from \"react\";\nimport { FloatingOverlay, FloatingPortal } from '@floating-ui/react';\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport { ButtonIconRound } from \"@/components/button-icon-round/ButtonIconRound.tsx\";\nimport { IconX } from \"@tabler/icons-react\";\nimport { useDismiss } from \"@/hooks/use-dismiss.ts\";\n\nexport type SidebarModalProps = {\n open: boolean;\n className?: string;\n onDismiss?: () => void;\n enableDismissOnOutsideClick?: boolean,\n enableDismissOnEscKey?: boolean,\n enableDismissButton?: boolean,\n children?: React.ReactNode;\n maxWidth?: number;\n}\n\nexport const SidebarModal = (props: SidebarModalProps) => {\n const {\n open,\n onDismiss,\n enableDismissOnOutsideClick,\n enableDismissOnEscKey,\n enableDismissButton,\n className,\n children,\n maxWidth = 480\n } = props;\n\n useDismiss(!!enableDismissOnEscKey && open, onDismiss ? onDismiss : () => {});\n\n return (\n <AnimatePresence>\n { open && (\n <FloatingPortal>\n <motion.div\n className={ 'z-40' }\n style={ { transformOrigin: 'center' } }\n initial={ { opacity: 0 } }\n animate={ { opacity: 1 } }\n exit={ { opacity: 0 } }\n transition={ { duration: 0.15, ease: \"easeInOut\" } }\n >\n <FloatingOverlay\n className={ 'modal-overlay backdrop-blur-[1px]' }\n onClick={ enableDismissOnOutsideClick ? onDismiss : undefined }\n lockScroll={ true }\n />\n </motion.div>\n\n <div className={ 'fixed inset-0 flex flex-row justify-end pointer-events-none z-50' }>\n <motion.div\n className={ classNames(\n 'flex flex-col modal-content shadow-[var(--shadow-overlay)] p-6 lg:p-12 pointer-events-auto h-full w-full overflow-y-auto relative',\n className\n ) }\n style={ { maxWidth: maxWidth } }\n initial={ { translateX: '100%' } }\n animate={ { translateX: 0 } }\n exit={ { translateX: '100%' } }\n transition={ { duration: 0.25, ease: [0.32, 0.72, 0, 1] } }\n >\n { enableDismissButton && (\n <ButtonIconRound\n Icon={ IconX }\n className={ 'absolute top-4 right-4' }\n variant={ 'transparent' }\n size={ 'sm' }\n onClick={ onDismiss }\n />\n ) }\n { children }\n </motion.div>\n </div>\n </FloatingPortal>\n ) }\n </AnimatePresence>\n );\n};\n","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\nimport type { TablerIcon } from \"@tabler/icons-react\";\nimport { ControlSizeContext } from \"@/control-size/use-control-size.ts\";\nimport {\n sizeFontClasses,\n sizeGapClasses,\n sizeHeightClasses,\n sizeIconClasses,\n sizePaddingXClasses,\n} from \"@/control-size/control-size.util.ts\";\n\nexport type Size = 'sm' | 'md' | 'lg';\n\nexport type TabButton = {\n label: string | React.ReactNode;\n active?: boolean;\n onClick?: () => void;\n href?: string;\n Icon?: TablerIcon;\n count?: React.ReactNode;\n}\n\nexport type TabButtonsProps = {\n className?: string;\n tabs: TabButton[];\n size?: Size;\n}\n\nexport const TabButtons = (props: TabButtonsProps) => {\n const {\n className,\n tabs,\n size = 'md',\n } = props;\n //TODO Implement scroll to active tab if overflow\n return (\n <ControlSizeContext.Provider value={ size }>\n <div className={ classNames(\n 'tab-container p-1 rounded-[var(--border-radius-tab)] inline-flex flex-row space-x-1 overflow-x-auto mat-ui-hide-scrollbars',\n sizeHeightClasses[size],\n className\n ) }>\n { tabs.map((tab, i) => {\n const tabClasses = classNames(\n 'shrink-0 h-full inline-flex flex-row items-center font-[number:var(--font-weight-tab)] font-[family-name:var(--font-family-base)] rounded-[var(--border-radius-tab)] cursor-pointer border border-transparent ring-0 tab-button transition-all duration-[var(--control-transition-duration)] select-none focus:outline-none focus:ring-0',\n sizePaddingXClasses[size],\n sizeFontClasses[size],\n sizeGapClasses[size],\n tab.active && 'tab-button-active shadow-[var(--shadow-control)]'\n )\n const content = (\n <>\n { tab.Icon && (\n <tab.Icon className={ classNames(sizeIconClasses[size], 'shrink-0 -ml-1') } />\n ) }\n { tab.label }\n { tab.count != null && (\n <span className={ classNames(\n 'shrink-0 inline-flex items-center justify-center h-5 min-w-5 px-1.5 rounded-full font-[number:var(--font-weight-tab-count)] font-[family-name:var(--font-family-base)] text-[length:var(--font-size-tab-count)]',\n tab.active ? 'tab-button-count-active' : 'tab-button-count'\n ) }>\n { tab.count }\n </span>\n ) }\n </>\n )\n if (tab.href) {\n return (\n <a\n key={ i }\n href={ tab.href }\n className={ tabClasses }\n >\n { content }\n </a>\n )\n }\n return (\n <button\n key={ i }\n className={ tabClasses }\n onClick={ tab.onClick }\n >\n { content }\n </button>\n )\n }) }\n </div>\n </ControlSizeContext.Provider>\n );\n};\n","import * as React from \"react\";\nimport { animate } from \"motion/react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\n\nexport type AutoScrollProps = {\n duration?: number;\n ease?: \"linear\" | \"easeIn\" | \"easeOut\" | \"easeInOut\";\n horizontal?: boolean;\n /** Pause auto-scrolling when the user scrolls away from the end; resume when they scroll back. */\n pauseOnScroll?: boolean;\n /** Distance (px) from the end still treated as \"pinned\" to the end. Defaults to 32. */\n threshold?: number;\n /** Called when the pinned-to-end state changes — e.g. to toggle a \"scroll to bottom\" affordance. */\n onPinnedChange?: (pinned: boolean) => void;\n} & React.HTMLAttributes<HTMLDivElement>;\n\nexport const AutoScroll = (props: AutoScrollProps) => {\n const {\n duration = 0.3,\n ease = \"easeInOut\",\n horizontal = false,\n pauseOnScroll = false,\n threshold = 1,\n onPinnedChange,\n children,\n className,\n ...rest\n } = props;\n\n const containerRef = React.useRef<HTMLDivElement | null>(null);\n const contentRef = React.useRef<HTMLDivElement | null>(null);\n const animationRef = React.useRef<ReturnType<typeof animate> | null>(null);\n\n // Whether the view is currently stuck to the end. Source of truth; a ref so the\n // ResizeObserver / scroll handlers always read the latest value without re-running.\n const pinnedRef = React.useRef(true);\n // True while we are driving the scroll ourselves, so our own motion is not mistaken\n // for the user scrolling away from the end.\n const programmaticRef = React.useRef(false);\n\n // Keep the latest callback without re-running the effect when an inline fn changes identity.\n const onPinnedChangeRef = React.useRef(onPinnedChange);\n onPinnedChangeRef.current = onPinnedChange;\n\n React.useEffect(() => {\n const container = containerRef.current;\n const content = contentRef.current;\n if (!container || !content) return;\n\n let firstObservation = true;\n\n const getMax = () => horizontal\n ? container.scrollWidth - container.clientWidth\n : container.scrollHeight - container.clientHeight;\n const getCurrent = () => horizontal ? container.scrollLeft : container.scrollTop;\n const setScroll = (value: number) => {\n if (horizontal) {\n container.scrollLeft = value;\n } else {\n container.scrollTop = value;\n }\n };\n\n const setPinned = (next: boolean) => {\n if (pinnedRef.current === next) return;\n pinnedRef.current = next;\n onPinnedChangeRef.current?.(next);\n };\n\n const scrollToEnd = () => {\n if (pauseOnScroll && !pinnedRef.current) return;\n\n const target = getMax();\n const current = getCurrent();\n\n if (target <= 0 || Math.abs(target - current) < 1) return;\n\n if (firstObservation) {\n firstObservation = false;\n programmaticRef.current = true;\n setScroll(target);\n requestAnimationFrame(() => { programmaticRef.current = false; });\n return;\n }\n\n animationRef.current?.stop();\n programmaticRef.current = true;\n animationRef.current = animate(current, target, {\n duration,\n ease,\n onUpdate: setScroll,\n onComplete: () => {\n requestAnimationFrame(() => { programmaticRef.current = false; });\n },\n });\n };\n\n const observer = new ResizeObserver(scrollToEnd);\n observer.observe(content);\n\n // User-scroll tracking — opt-in via `pauseOnScroll`.\n const handleScroll = () => {\n // Ignore scroll events caused by our own animation, otherwise the transient\n // mid-animation position would read as \"scrolled away\" and pause us.\n if (programmaticRef.current) return;\n setPinned(getMax() - getCurrent() <= threshold);\n };\n const handleUserInput = () => {\n // A genuine user gesture: stop fighting them and let scroll position decide.\n animationRef.current?.stop();\n programmaticRef.current = false;\n };\n\n if (pauseOnScroll) {\n container.addEventListener(\"scroll\", handleScroll, { passive: true });\n container.addEventListener(\"wheel\", handleUserInput, { passive: true });\n container.addEventListener(\"touchstart\", handleUserInput, { passive: true });\n }\n\n return () => {\n observer.disconnect();\n animationRef.current?.stop();\n if (pauseOnScroll) {\n container.removeEventListener(\"scroll\", handleScroll);\n container.removeEventListener(\"wheel\", handleUserInput);\n container.removeEventListener(\"touchstart\", handleUserInput);\n }\n };\n }, [ duration, ease, horizontal, pauseOnScroll, threshold ]);\n\n return (\n <div\n ref={ containerRef }\n className={ classNames(\n 'min-h-0 min-w-0',\n horizontal ? 'overflow-x-auto' : 'overflow-y-auto',\n className\n ) }\n { ...rest }\n >\n <div ref={ contentRef }>\n { children }\n </div>\n </div>\n );\n};\n","import * as React from \"react\";\n\ntype DragXEvent = {\n /** Current pointer X (client) */\n clientX: number;\n /** X where the drag started */\n startX: number;\n /** Total horizontal movement since drag start */\n totalDeltaX: number;\n /** The original pointerdown event target */\n target: EventTarget | null;\n};\n\ntype UseDragXOptions = {\n /** Called on every move with the incremental dx since the previous event */\n onDelta: (dx: number, meta: DragXEvent) => void;\n /** Called once when drag starts */\n onDragStart?: (meta: DragXEvent) => void;\n /** Called once when drag ends */\n onDragEnd?: (meta: DragXEvent) => void;\n /** Disable the hook */\n disabled?: boolean;\n /** Restrict to primary button drags (left click); default true */\n primaryButtonOnly?: boolean;\n /** If true, preventDefault on move to avoid scrolling during touch drags */\n preventScrollOnMove?: boolean;\n};\n\ntype DragBind = {\n onPointerDown: (e: React.PointerEvent) => void;\n /** Recommended for the handle to avoid accidental scroll during touch drags */\n style?: React.CSSProperties;\n /** You can also put `touchAction: \"none\"` in your CSS */\n role?: string;\n};\n\nexport function useDragX(options: UseDragXOptions): {\n isDragging: boolean;\n bind: DragBind;\n} {\n const {\n onDelta,\n onDragStart,\n onDragEnd,\n disabled = false,\n primaryButtonOnly = true,\n preventScrollOnMove = true,\n } = options;\n\n const [isDragging, setIsDragging] = React.useState(false);\n\n // The active flag must be readable by listeners attached during pointerdown,\n // before React has flushed the corresponding state update — so we mirror it\n // into a ref. The state value is kept around for consumers that want to\n // re-render based on drag status.\n const isDraggingRef = React.useRef(false);\n const startXRef = React.useRef(0);\n const prevXRef = React.useRef(0);\n const totalRef = React.useRef(0);\n const targetRef = React.useRef<EventTarget | null>(null);\n const rafRef = React.useRef<number | null>(null);\n\n // Keep the latest callbacks in a ref so the listeners (attached once per\n // drag) always see fresh handlers without re-attaching on every render.\n const callbacksRef = React.useRef({ onDelta, onDragStart, onDragEnd, preventScrollOnMove });\n React.useEffect(() => {\n callbacksRef.current = { onDelta, onDragStart, onDragEnd, preventScrollOnMove };\n });\n\n // Live references to the per-drag listeners so cleanup can detach them by\n // identity even if the component re-renders mid-drag.\n const handlersRef = React.useRef<{\n move?: (e: PointerEvent) => void;\n up?: (e: PointerEvent) => void;\n keydown?: (e: KeyboardEvent) => void;\n }>({});\n\n const cleanup = React.useCallback((clientX?: number) => {\n if (!isDraggingRef.current) return;\n\n const meta: DragXEvent = {\n clientX: clientX ?? prevXRef.current,\n startX: startXRef.current,\n totalDeltaX: totalRef.current,\n target: targetRef.current,\n };\n\n isDraggingRef.current = false;\n setIsDragging(false);\n\n const { move, up, keydown } = handlersRef.current;\n if (move) {\n window.removeEventListener(\"pointermove\", move, true);\n }\n if (up) {\n window.removeEventListener(\"pointerup\", up, true);\n window.removeEventListener(\"pointercancel\", up, true);\n }\n if (keydown) {\n window.removeEventListener(\"keydown\", keydown, true);\n }\n handlersRef.current = {};\n\n if (rafRef.current != null) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n\n callbacksRef.current.onDragEnd?.(meta);\n targetRef.current = null;\n totalRef.current = 0;\n }, []);\n\n const onPointerDown = React.useCallback((e: React.PointerEvent) => {\n if (disabled) return;\n if (primaryButtonOnly && e.button !== 0) return;\n\n // Capture the pointer to keep receiving moves even when the cursor leaves the handle.\n (e.target as Element).setPointerCapture?.(e.pointerId);\n\n startXRef.current = e.clientX;\n prevXRef.current = e.clientX;\n totalRef.current = 0;\n targetRef.current = e.target;\n\n isDraggingRef.current = true;\n setIsDragging(true);\n\n const startMeta: DragXEvent = {\n clientX: e.clientX,\n startX: e.clientX,\n totalDeltaX: 0,\n target: e.target,\n };\n callbacksRef.current.onDragStart?.(startMeta);\n\n const move = (ev: PointerEvent) => {\n if (!isDraggingRef.current) return;\n if (rafRef.current != null) return;\n rafRef.current = requestAnimationFrame(() => {\n rafRef.current = null;\n const x = ev.clientX;\n const dx = x - prevXRef.current;\n if (dx === 0) return;\n prevXRef.current = x;\n totalRef.current += dx;\n\n const meta: DragXEvent = {\n clientX: x,\n startX: startXRef.current,\n totalDeltaX: totalRef.current,\n target: targetRef.current,\n };\n\n if (callbacksRef.current.preventScrollOnMove) {\n ev.preventDefault();\n }\n callbacksRef.current.onDelta(dx, meta);\n });\n };\n\n const up = (ev: PointerEvent) => {\n cleanup(ev.clientX);\n };\n\n const keydown = (ev: KeyboardEvent) => {\n if (ev.key === \"Escape\") {\n ev.preventDefault();\n cleanup();\n }\n };\n\n handlersRef.current = { move, up, keydown };\n\n window.addEventListener(\"pointermove\", move, {\n passive: !preventScrollOnMove,\n capture: true,\n });\n window.addEventListener(\"pointerup\", up, { capture: true });\n window.addEventListener(\"pointercancel\", up, { capture: true });\n window.addEventListener(\"keydown\", keydown, true);\n }, [cleanup, disabled, preventScrollOnMove, primaryButtonOnly]);\n\n // Ensure listeners are removed if the component unmounts mid-drag.\n React.useEffect(() => {\n return () => {\n if (isDraggingRef.current) cleanup();\n };\n }, [cleanup]);\n\n return {\n isDragging,\n bind: {\n onPointerDown,\n role: \"separator\",\n style: { touchAction: \"none\", cursor: \"col-resize\", userSelect: \"none\" },\n },\n };\n}\n","import type { TableColumnDef, TableSortDirection } from \"@/table/Table.tsx\";\nimport { useDragX } from \"@/hooks/use-drag-x.ts\";\nimport { IconChevronDown, IconChevronUp } from \"@tabler/icons-react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\n\nexport type TableColumnHeadProps<T> = {\n column: TableColumnDef<T>;\n width: number;\n height: number;\n onResize: (dx: number) => void;\n /** Direction the column is currently sorted, or null when it is not the active sort. */\n sortDirection: TableSortDirection | null;\n onSortClick: () => void;\n}\n\nexport const TableColumnHead = <T, >(props: TableColumnHeadProps<T>) => {\n const {\n column,\n width,\n height,\n onResize,\n sortDirection,\n onSortClick,\n } = props;\n\n const sortable = !!column.sortable;\n\n const { bind } = useDragX({\n onDelta: (dx) => onResize(dx),\n });\n\n return (\n <div\n style={ { width, height } }\n className={ 'flex flex-row items-stretch select-none shrink-0' }\n >\n <div\n className={ classNames(\n 'flex-1 min-w-0 px-4 table-header-cell transition-colors duration-[var(--control-transition-duration-fast)] flex flex-row items-center gap-2',\n sortable && 'cursor-pointer',\n ) }\n onClick={ sortable ? onSortClick : undefined }\n >\n <span className={ 'truncate' }>{ column.header }</span>\n { sortable && sortDirection === 'asc' && (\n <IconChevronUp className={ 'h-4 w-4 shrink-0' }/>\n ) }\n { sortable && sortDirection === 'desc' && (\n <IconChevronDown className={ 'h-4 w-4 shrink-0' }/>\n ) }\n </div>\n <div\n { ...bind }\n className={ 'cursor-ew-resize group py-4 table-resize-handle w-[8px]' }\n >\n <div\n className={ 'w-0.5 h-full mx-auto table-resize-divider table-resize-divider-hover pointer-events-none' }/>\n </div>\n </div>\n );\n};\n","import * as React from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { TableColumnHead } from \"@/table/TableColumnHead.tsx\";\nimport { classNames } from \"@/util/classnames.util.ts\";\n\nexport type TableSortDirection = 'asc' | 'desc';\n\nexport type TableSortState = {\n columnId: string;\n direction: TableSortDirection;\n}\n\nexport type TableColumnDef<T> = {\n id: string;\n header: React.ReactNode;\n renderCell: (row: T, rowIndex: number) => React.ReactNode;\n defaultWidth?: number;\n minWidth?: number;\n /** When true, the column header is clickable and participates in sorting. */\n sortable?: boolean;\n}\n\nexport type TableProps<T> = {\n columns: TableColumnDef<T>[];\n rows: T[];\n /** Stable identifier for each row. Used as the React key. */\n getRowId: (row: T, rowIndex: number) => string | number;\n /** Fires when a row is clicked. Setting this also makes rows look interactive (pointer cursor). */\n onRowClick?: (row: T, rowIndex: number) => void;\n /** Active sort. Controlled — the consumer is responsible for sorting `rows`. */\n sort?: TableSortState | null;\n /** Fires when the user clicks a sortable column. Cycles null → asc → desc → null. */\n onSortChange?: (sort: TableSortState | null) => void;\n className?: string;\n rowHeight?: number;\n headerHeight?: number;\n /** Rendered in the scroll body (with the header still visible) when `rows` is empty. */\n emptyState?: React.ReactNode;\n}\n\nconst DEFAULT_COLUMN_WIDTH = 200;\nconst DEFAULT_MIN_COLUMN_WIDTH = 60;\n\nconst buildInitialWidths = <T,>(columns: TableColumnDef<T>[]): Record<string, number> => {\n const widths: Record<string, number> = {};\n for (const col of columns) {\n widths[col.id] = col.defaultWidth ?? DEFAULT_COLUMN_WIDTH;\n }\n return widths;\n};\n\nexport const Table = <T, >(props: TableProps<T>) => {\n const {\n columns,\n rows,\n getRowId,\n onRowClick,\n sort,\n onSortChange,\n className,\n rowHeight = 44,\n headerHeight = 44,\n emptyState,\n } = props;\n\n // Lazy init — runs once on the server and once on hydration with the same\n // input, so the rendered HTML matches.\n const [widths, setWidths] = useState<Record<string, number>>(() => buildInitialWidths(columns));\n\n // If a column is added/removed/renamed, sync the widths map. Resized widths\n // are preserved for columns that still exist by id.\n useEffect(() => {\n setWidths(prev => {\n const next: Record<string, number> = {};\n let changed = Object.keys(prev).length !== columns.length;\n for (const col of columns) {\n if (col.id in prev) {\n next[col.id] = prev[col.id];\n } else {\n next[col.id] = col.defaultWidth ?? DEFAULT_COLUMN_WIDTH;\n changed = true;\n }\n }\n return changed ? next : prev;\n });\n }, [columns]);\n\n const handleResize = useCallback((columnId: string, dx: number, minWidth: number) => {\n setWidths(prev => {\n const current = prev[columnId] ?? DEFAULT_COLUMN_WIDTH;\n const next = Math.max(minWidth, current + dx);\n if (next === current) return prev;\n return { ...prev, [columnId]: next };\n });\n }, []);\n\n const handleSortClick = useCallback((columnId: string) => {\n if (!onSortChange) return;\n if (!sort || sort.columnId !== columnId) {\n onSortChange({ columnId, direction: 'asc' });\n return;\n }\n if (sort.direction === 'asc') {\n onSortChange({ columnId, direction: 'desc' });\n return;\n }\n onSortChange(null);\n }, [sort, onSortChange]);\n\n const totalWidth = columns.reduce(\n (sum, c) => sum + (widths[c.id] ?? c.defaultWidth ?? DEFAULT_COLUMN_WIDTH),\n 0,\n );\n\n const headerScrollRef = useRef<HTMLDivElement>(null);\n\n const handleBodyScroll = (e: React.UIEvent<HTMLDivElement>) => {\n if (headerScrollRef.current) {\n headerScrollRef.current.scrollLeft = e.currentTarget.scrollLeft;\n }\n };\n\n return (\n <div className={ classNames('flex flex-col h-full w-full', className) }>\n {/* Header strip — overflow-hidden, scroll-synced with body via JS so\n users only scroll one container. */}\n <div\n ref={ headerScrollRef }\n className={ 'overflow-hidden shrink-0 table-header-strip' }\n style={ { height: headerHeight } }\n >\n <div\n className={ 'flex flex-row table-header font-[number:var(--font-weight-table-header)]' }\n style={ { width: totalWidth, minWidth: '100%' } }\n >\n { columns.map((col) => (\n <TableColumnHead\n key={ col.id }\n column={ col }\n width={ widths[col.id] ?? col.defaultWidth ?? DEFAULT_COLUMN_WIDTH }\n height={ headerHeight }\n onResize={ (dx) => handleResize(col.id, dx, col.minWidth ?? DEFAULT_MIN_COLUMN_WIDTH) }\n sortDirection={ sort?.columnId === col.id ? sort.direction : null }\n onSortClick={ () => handleSortClick(col.id) }\n />\n )) }\n </div>\n </div>\n {/* Body — the only scrolling container. */}\n <div\n className={ 'flex-1 overflow-auto' }\n onScroll={ handleBodyScroll }\n >\n { rows.length === 0 && emptyState ? (\n <div className={ 'flex h-full min-w-full items-center justify-center p-8' }>\n { emptyState }\n </div>\n ) : (\n <div\n className={ 'flex flex-col' }\n style={ { width: totalWidth, minWidth: '100%' } }\n >\n { rows.map((row, rowIndex) => (\n <div\n key={ getRowId(row, rowIndex) }\n className={ classNames(\n 'flex flex-row table-body-row transition-colors duration-[var(--control-transition-duration-fast)]',\n onRowClick && 'cursor-pointer',\n ) }\n onClick={ onRowClick ? () => onRowClick(row, rowIndex) : undefined }\n >\n { columns.map((col) => (\n <div\n key={ col.id }\n className={ 'shrink-0 content-center px-4 relative' }\n style={ {\n width: widths[col.id] ?? col.defaultWidth ?? DEFAULT_COLUMN_WIDTH,\n height: rowHeight,\n } }\n >\n <div className={'break-all line-clamp-1 font-[number:var(--font-weight-table-cell)]'}>\n { col.renderCell(row, rowIndex) }\n </div>\n </div>\n )) }\n </div>\n )) }\n </div>\n ) }\n </div>\n </div>\n );\n};\n","import * as React from \"react\";\nimport { type TablerIcon } from \"@tabler/icons-react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\n\n\nexport type TableEmptyProps = {\n Icon?: TablerIcon;\n title?: React.ReactNode;\n description?: React.ReactNode;\n /** Optional action(s) rendered below the text, e.g. a button. */\n children?: React.ReactNode;\n className?: string;\n}\n\nexport const TableEmpty = (props: TableEmptyProps) => {\n const { Icon, title, description, children, className } = props;\n\n return (\n <div className={ classNames('flex flex-col items-center gap-3 text-center', className) }>\n { Icon && (\n <div className={ 'flex h-14 w-14 items-center justify-center rounded-[var(--border-radius-panel)] bg-[var(--color-table-header-bg)]' }>\n <Icon className={ 'h-6 w-6 text-[var(--color-input-icon)]' }/>\n </div>\n ) }\n { (title || description) && (\n <div className={ 'flex flex-col gap-1' }>\n { title && (\n <div className={ 'font-[number:var(--font-weight-table-header)] text-[var(--color-input-text)]' }>{ title }</div>\n ) }\n { description && (\n <div className={ 'text-sm text-[var(--color-input-description-text)]' }>{ description }</div>\n ) }\n </div>\n ) }\n { children }\n </div>\n );\n};\n","import * as React from \"react\";\nimport { classNames } from \"@/util/classnames.util.ts\";\n\nexport type DropdownButtonGroupProps = {\n label?: string;\n children: React.ReactNode;\n className?: string;\n}\n\nexport const DropdownButtonGroup = (props: DropdownButtonGroupProps) => {\n const { label, children, className } = props;\n return (\n <div className={ classNames('flex flex-col dropdown-button-group', className) }>\n { label && <div className={ 'mb-2 text-[length:var(--font-size-label)] dropdown-group-label font-[number:var(--font-weight-group-header)] px-3' }>{ label }</div> }\n { children }\n </div>\n );\n};","export const ScrollbarTest = () => {\n\n // const { ref: containerRef, height: containerHeight } = useResizeObserver<HTMLDivElement>();\n // const { ref: contentRef, height: contentHeight } = useResizeObserver<HTMLDivElement>();\n //\n // const [ scrollTop, setScrollTop ] = useState(0);\n //\n // const handleScroll = (e) => {\n // const target = e.currentTarget;\n // setScrollTop(target.scrollTop);\n // };\n //\n // const thumbTop = containerHeight && contentHeight ? (scrollTop / contentHeight) * containerHeight : 0;\n // const thumbHeight = containerHeight && contentHeight ? Math.max((containerHeight / contentHeight) * containerHeight, 20) : 20;\n\n\n return (\n <div></div>\n // <div\n // className={ 'relative' }\n // style={ { height: 200 } }\n // >\n // <div\n // className={ 'relative overflow-scroll mat-ui-hide-scrollbars border h-full w-full border-red-500' }\n // ref={ containerRef }\n // onScroll={ handleScroll }\n // >\n //\n // {/* Content */ }\n // <div ref={ contentRef } className={ 'absolute flex flex-col gap-3' } style={ { height: 600, width: 1000 } }>\n // <div className={ 'bg-amber-100 flex-1' }></div>\n // <div className={ 'bg-amber-100 flex-1' }></div>\n // <div className={ 'bg-amber-100 flex-1' }></div>\n // <div className={ 'bg-amber-100 flex-1' }></div>\n // <div className={ 'bg-amber-100 flex-1' }></div>\n // </div>\n //\n // </div>\n // {/*Track*/ }\n // <div className={ 'absolute top-px right-px bottom-px w-5 bg-blue-100' }>\n // {/*Thumb*/ }\n // <div\n // onMouseDown={ e => {\n // console.log('start drag')\n // } }\n // style={ { top: thumbTop, height: thumbHeight } }\n // className={ 'absolute top-0 bg-blue-600 w-3 right-px' }\n // />\n // </div>\n // </div>\n );\n};","import { Table } from \"@/table/Table.tsx\";\nimport { ButtonIconSquare } from \"@/components/button-icon-square/ButtonIconSquare.tsx\";\nimport { IconList, IconMailFilled, IconPlus, IconSearch, IconSettings, IconTrash } from \"@tabler/icons-react\";\nimport { Input } from \"@/components/inputs/Input.tsx\";\nimport { Badge } from \"@/components/Badge.tsx\";\nimport { InputSelect } from \"@/components/inputs/InputSelect.tsx\";\nimport { DropdownButton } from \"@/components/dropdown-menu/DropdownButton.tsx\";\nimport { Button } from \"@/components/button/Button.tsx\";\nimport { DropdownMenu } from \"@/components/dropdown-menu/DropdownMenu.tsx\";\nimport { ScrollbarTest } from \"@/components/ScrollbarTest.tsx\";\nimport { TabButtons } from \"@/components/TabButtons.tsx\";\nimport { DropdownButtonGroup } from \"@/components/dropdown-menu/DropdownButtonGroup.tsx\";\n\ntype SampleRowType = {\n id: number;\n email: string;\n firstname: string;\n lastname: string;\n status: 'active' | 'inactive';\n}\n\nconst sampleData: SampleRowType[] = [\n { id: 1, email: 'sarah.jennings@example.com', firstname: 'Sarah', lastname: 'Jennings', status: 'active' },\n { id: 2, email: 'liam.patel@outlook.com', firstname: 'Liam', lastname: 'Patel', status: 'inactive' },\n { id: 3, email: 'emily.wong@gmail.com', firstname: 'Emily', lastname: 'Wong', status: 'active' },\n { id: 4, email: 'noah.thompson@yahoo.com', firstname: 'Noah', lastname: 'Thompson', status: 'active' },\n { id: 5, email: 'isabella.martin@protonmail.com', firstname: 'Isabella', lastname: 'Martin', status: 'active' },\n { id: 6, email: 'ethan.ross@company.io', firstname: 'Ethan', lastname: 'Ross', status: 'inactive' },\n { id: 7, email: 'olivia.nguyen@example.org', firstname: 'Olivia', lastname: 'Nguyen', status: 'active' },\n { id: 8, email: 'lucas.henderson@gmail.com', firstname: 'Lucas', lastname: 'Henderson', status: 'inactive' },\n { id: 9, email: 'mia.johnson@workmail.com', firstname: 'Mia', lastname: 'Johnson', status: 'active' },\n { id: 10, email: 'jackson.rivera@outlook.com', firstname: 'Jackson', lastname: 'Rivera', status: 'active' },\n { id: 11, email: 'ava.sanders@example.com', firstname: 'Ava', lastname: 'Sanders', status: 'active' },\n { id: 12, email: 'logan.bennett@company.io', firstname: 'Logan', lastname: 'Bennett', status: 'inactive' },\n];\n\nconst sampleColumns = [\n { id: 'id', header: 'ID', renderCell: (row: SampleRowType) => row.id },\n {\n id: 'email', header: 'Email', renderCell: (row: SampleRowType) => {\n return <Badge Icon={ IconMailFilled } onClick={ () => {\n } }>{ row.email }</Badge>\n }\n },\n { id: 'firstname', header: 'First Name', renderCell: (row: SampleRowType) => row.firstname },\n { id: 'lastname', header: 'Last Name', renderCell: (row: SampleRowType) => row.lastname },\n {\n id: 'status', header: 'Status', renderCell: () => <BadgePopover/>\n },\n];\n\n\nexport const Test = () => {\n return (\n <div className={ 'flex flex-col gap-6' }>\n <div className={ 'flex flex-row items-center justify-start gap-3' }>\n <Input Icon={ IconSearch } placeholder={ 'Search...' }/>\n <ButtonIconSquare Icon={ IconSettings }/>\n <Button Icon={ IconPlus }>New</Button>\n <DropdownMenu\n trigger={ <ButtonIconSquare Icon={ IconSettings }/> }\n >\n <DropdownButton dismissOnClick={ false } Icon={ IconPlus }>Add new</DropdownButton>\n <DropdownButton Icon={ IconTrash }>Remove</DropdownButton>\n <DropdownButtonGroup label={ 'Test' } className={ 'mt-2' }>\n <DropdownButton>Item 1</DropdownButton>\n <DropdownButton>Item 2</DropdownButton>\n <DropdownButton>Item 3</DropdownButton>\n <DropdownButton>Item 4</DropdownButton>\n </DropdownButtonGroup>\n <DropdownButtonGroup label={ 'Test' } className={ 'mt-2' }>\n <DropdownButton>Item 1</DropdownButton>\n <DropdownButton>Item 2</DropdownButton>\n <DropdownButton>Item 3</DropdownButton>\n <DropdownButton>Item 4</DropdownButton>\n </DropdownButtonGroup>\n </DropdownMenu>\n <TabButtons tabs={ [\n {\n label: 'Tab 1', Icon: IconList, active: true, onClick: () => {\n }\n },\n {\n label: 'Tab 2', active: false, onClick: () => {\n }\n },\n {\n label: 'Tab 3', Icon: IconList, active: false, onClick: () => {\n }\n }\n ] }/>\n </div>\n\n <InputSelect options={ [\n { label: 'Option 1', value: 1 },\n { label: 'Option 2', value: 2 },\n { label: 'Option 3', value: 3 }\n ] } value={ null } onChange={ () => {\n } }/>\n\n <Table\n className={ 'h-[300px] w-[300px]' }\n columns={ sampleColumns }\n rows={ sampleData }\n getRowId={ (row) => row.id }\n />\n\n <ScrollbarTest/>\n </div>\n );\n};\n\nconst BadgePopover = () => {\n return (<>\n\n <DropdownMenu\n placement={ 'bottom-end' }\n className={ 'inline-block' }\n trigger={\n <Badge onClick={ () => {\n } }>Test</Badge>\n }\n >\n <DropdownButton>Option 1</DropdownButton>\n <DropdownButton>Option 2</DropdownButton>\n <DropdownButton>Option 3</DropdownButton>\n </DropdownMenu>\n </>)\n}"],"names":["classNames","classes","clipKeyframes","Spinner","props","speed","className","rotateDuration","clipDuration","AnimatePresence","jsx","motion","sizeHeightClasses","sizeMinHeightClasses","sizeFontClasses","sizeGapClasses","sizePaddingXClasses","sizePaddingLeftClasses","sizePaddingRightClasses","sizePaddingRightWithTrayClasses","sizePaddingRightWithTrayTwoClasses","sizePaddingLeftWithIconClasses","sizeIconLeftPositionClasses","sizeTrayRightPositionClasses","sizeIconClasses","sizeSquareClasses","base","variantClasses","Button","React","ref","variant","size","children","loading","Icon","IconRight","rest","jsxs","Fragment","ButtonIconSquare","ButtonIconRound","InputLabel","InputErrorIcon","IconExclamationCircleFilled","ControlSizeContext","createContext","useControlSize","useContext","InputIconButtonTray","InputDescription","InputError","Input","label","description","error","buttonTray","hasTray","hexToRgb","hex","m","n","rgbToHex","r","g","b","c","v","rgbToHsv","max","min","d","h","hsvToRgb","s","hh","x","hsvToHex","hexToHsv","rgb","formatHex","input","trimmed","hexMatch","probe","computed","usePointerDrag","onPosition","rectRef","isDragging","setIsDragging","release","e","el","baseClassName","paddingClasses","DropdownPanel","padding","placementOriginMap","PopoverBase","open","floatingStyles","setFloating","placement","floatingProps","FloatingPortal","usePopover","onOpenChange","fullWidth","minWidth","maxWidth","middleware","flip","shift","rects","elements","refs","context","resolvedPlacement","useFloating","autoUpdate","dismiss","useDismiss","getFloatingProps","useInteractions","latest","Popover","Renderer","rendererProps","active","onDismiss","useEffect","handleKeyDown","event","HUE_GRADIENT","SV_SATURATION_GRADIENT","SV_VALUE_GRADIENT","THUMB_SHADOW","THUMB_SIZE","THUMB_SIZE_ACTIVE","THUMB_RADIUS","THUMB_RADIUS_ACTIVE","THUMB_SPRING","thumbAnimate","half","clamp01","setInputValueAndNotify","value","ColorPicker","onChange","hsv","setHsv","useState","lastEmittedRef","useRef","parsed","updateHsv","next","hueOnly","brightnessMax","currentColor","svDrag","cx","cy","rect","hueDrag","_cy","brightnessDrag","InputColor","defaultValue","onBlur","onFocus","internalValue","setInternalValue","setOpen","inputRef","currentValue","swatchColor","anchorRef","handleChange","handleFocus","handleBlur","raw","formatted","handlePickerChange","InputIconButton","onClick","InputPassword","type","enableShowPasswordToggle","showPassword","setShowPassword","IconEyeOff","IconEye","InputTextArea","autogrow","maxRows","internalRef","resize","targetHeight","styles","lineHeight","paddingTop","paddingBottom","borderTop","borderBottom","maxHeight","mergeRefs","InputRadio","InputToggle","InputCheck","chooseButtonHeightClasses","chooseButtonPaddingClasses","chooseButtonFontClasses","InputFileSingle","placeholder","buttonText","IconPaperclip","isUploaded","isUploading","onDropRejected","accept","maxSize","minSize","disabled","handleDrop","acceptedFiles","file","getRootProps","getInputProps","isDragActive","isFocused","useDropzone","fileName","IconCircleCheckFilled","formatBytes","bytes","UploadFileTile","onRemove","showStatus","IconX","InputFileMultiple","title","hint","IconCloudUpload","onUpload","onFileRemoved","renderFileTile","maxFiles","entries","setEntries","idCounter","updateEntry","id","patch","prev","newEntries","entry","err","handleRemove","removed","defaultProps","LEXICAL_NODES","HeadingNode","QuoteNode","ListNode","ListItemNode","LinkNode","lexicalTheme","DEFAULT_LEXICAL_TOOLBAR_STATE","LexicalToolbarContext","useLexicalToolbar","useLexicalToolbarState","editor","useLexicalComposerContext","state","setState","readSelection","selection","$getSelection","$isRangeSelection","anchorNode","listNode","$getNearestNodeOfType","listType","$isListNode","blockType","element","$isHeadingNode","isBold","isItalic","isUnderline","isLink","$isLinkNode","mergeRegister","CAN_UNDO_COMMAND","payload","COMMAND_PRIORITY_LOW","CAN_REDO_COMMAND","DropdownDismissContext","useDropdownDismiss","DropdownMenu","trigger","show","setShow","DropdownButton","dismissOnClick","handleOnClick","OPTIONS","LexicalBlockTypeSelect","tone","applyBlockType","$setBlocksType","$createParagraphNode","$createHeadingNode","current","option","IconChevronDown","IconCheck","toneClasses","LexicalToolbarButton","onMouseDown","LexicalFormatButtons","IconBold","FORMAT_TEXT_COMMAND","IconItalic","IconUnderline","LexicalListButtons","toggleUnordered","REMOVE_LIST_COMMAND","INSERT_UNORDERED_LIST_COMMAND","toggleOrdered","INSERT_ORDERED_LIST_COMMAND","IconList","IconListNumbers","LexicalLinkButton","toggleLink","TOGGLE_LINK_COMMAND","url","IconLink","LexicalHistoryButtons","IconArrowBackUp","UNDO_COMMAND","IconArrowForwardUp","REDO_COMMAND","LexicalToolbarDivider","toneOverride","contextTone","orientation","GAP","MORE_WIDTH","flattenItems","nodes","out","child","LexicalToolbarItems","items","containerRef","mirrorRef","visibleCount","setVisibleCount","recompute","useCallback","container","mirror","available","widths","node","sum","w","i","used","count","add","useLayoutEffect","observer","visible","overflow","item","index","IconDots","lexicalDefaultToolbarItems","LexicalDefaultToolbarContent","LexicalToolbar","render","LexicalFloatingToolbar","offset","root","FOCUS_COMMAND","BLUR_COMMAND","InputLexical","toolbar","renderToolbar","minRows","namespace","theme","autoFocus","initialConfig","useMemo","editorState","fontClass","hasError","rowsToHeight","rows","contentStyle","LexicalComposer","RichTextPlugin","ContentEditable","LexicalErrorBoundary","HistoryPlugin","ListPlugin","LinkPlugin","AutoFocusPlugin","OnChangePlugin","InputSelectNative","options","InputSelectOption","selected","InputSelectGroupHeader","InputSelectDivider","isSelectOption","selectValueEquals","a","useSelectPopover","listRef","activeIndex","onNavigate","loop","disabledIndices","listNavigation","useListNavigation","getReferenceProps","getItemProps","InputSelect","clearable","setActiveIndex","selectedOption","selectedIdx","firstSelectable","handleSelect","idx","o","isSelected","InputSelectSearchable","onSearch","filteredOptions","setFilteredOptions","search","setSearch","inputSearchRef","visibleOptions","hasSelectableVisible","IconSearch","IconSearchOff","useDebounce","delay","debouncedValue","setDebouncedValue","handler","InputSelectSearchableAsync","fetchOptionsByQuery","fetchOptionByValue","onSearchDebounceMs","setOptions","setSelectedOption","isFetching","setIsFetching","isFetchingSelectedOption","setIsFetchingSelectedOption","debouncedQuery","results","selectedFromOptions","result","BadgeColor","Badge","showCloseIcon","color","useOverflowFit","enabled","triggerRef","measureRef","trayRef","itemCount","deps","gap","measure","compute","cs","paddingLeft","triggerRect","contentLeft","contentRight","trayEl","trayRect","totalAll","moreWidth","ro","InputSelectMultiple","singleLine","selectedOptions","defaultSearch","q","lower","toggleValue","hasSelection","displayedCount","visibleBadges","hiddenCount","opt","Panel","PanelStack","labelClasses","PanelField","statusIcons","IconAlertTriangleFilled","IconInfoCircleFilled","statusColorClasses","PanelLink","status","StatusIcon","content","IconChevronRight","href","anchorRest","Divider","vertical","Tooltip","Modal","enableDismissOnOutsideClick","enableDismissOnEscKey","enableDismissButton","FloatingOverlay","SidebarModal","TabButtons","tabs","tab","tabClasses","AutoScroll","duration","ease","horizontal","pauseOnScroll","threshold","onPinnedChange","contentRef","animationRef","pinnedRef","programmaticRef","onPinnedChangeRef","firstObservation","getMax","getCurrent","setScroll","setPinned","scrollToEnd","target","animate","handleScroll","handleUserInput","useDragX","onDelta","onDragStart","onDragEnd","primaryButtonOnly","preventScrollOnMove","isDraggingRef","startXRef","prevXRef","totalRef","targetRef","rafRef","callbacksRef","handlersRef","cleanup","clientX","meta","move","up","keydown","onPointerDown","startMeta","ev","dx","TableColumnHead","column","width","height","onResize","sortDirection","onSortClick","sortable","bind","IconChevronUp","DEFAULT_COLUMN_WIDTH","DEFAULT_MIN_COLUMN_WIDTH","buildInitialWidths","columns","col","Table","getRowId","onRowClick","sort","onSortChange","rowHeight","headerHeight","emptyState","setWidths","changed","handleResize","columnId","handleSortClick","totalWidth","headerScrollRef","handleBodyScroll","row","rowIndex","TableEmpty","DropdownButtonGroup","ScrollbarTest","sampleData","sampleColumns","IconMailFilled","BadgePopover","Test","IconSettings","IconPlus","IconTrash"],"mappings":"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"}