inconel 0.1.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/components/FieldFeedback/FieldFeedback.tsx","../src/components/Input/constants.ts","../src/components/Input/utils.ts","../src/components/Input/Input.tsx","../src/components/Select/Select.tsx","../src/components/Textarea/Textarea.tsx"],"sourcesContent":["import type { ReactNode } from 'react'\n\nexport interface FieldFeedbackContentProps {\n hint?: ReactNode\n errorMessage?: ReactNode\n}\n\nexport interface FieldFeedbackProps extends FieldFeedbackContentProps {\n hintId: string\n errorId: string\n className?: string\n}\n\nfunction FieldFeedback({\n hint,\n errorMessage,\n hintId,\n errorId,\n className,\n}: FieldFeedbackProps) {\n if (errorMessage) {\n return (\n <p\n id={errorId}\n className={['inconel-field-feedback', 'is-error', className ?? ''].join(\n ' ',\n )}\n role=\"alert\"\n >\n {errorMessage}\n </p>\n )\n }\n\n if (hint) {\n return (\n <p\n id={hintId}\n className={['inconel-field-feedback', 'is-hint', className ?? ''].join(\n ' ',\n )}\n >\n {hint}\n </p>\n )\n }\n\n return null\n}\n\nexport default FieldFeedback\n","export const FORMATTED_INPUT_TYPES = [\n 'number',\n 'currency',\n 'percent',\n] as const\n\nexport const LENGTH_VALIDATED_INPUT_TYPES = [\n 'text',\n 'email',\n 'password',\n] as const\n","import {\n FORMATTED_INPUT_TYPES,\n LENGTH_VALIDATED_INPUT_TYPES,\n} from './constants'\nimport type {\n InputRoundMode,\n InputType,\n InputValidationMessages,\n InputValue,\n} from './Input'\n\nexport interface InputValidationOptions {\n required: boolean\n type: InputType\n min?: number\n max?: number\n mask?: string\n messages: InputValidationMessages\n}\n\nexport function isFormattedInputType(type: InputType) {\n return FORMATTED_INPUT_TYPES.some((candidate) => candidate === type)\n}\n\nexport function isLengthValidatedInputType(type: InputType) {\n return LENGTH_VALIDATED_INPUT_TYPES.some((candidate) => candidate === type)\n}\n\nexport function getInputSeparators(locale: string) {\n const parts = new Intl.NumberFormat(locale).formatToParts(1000.1)\n return {\n group: parts.find((part) => part.type === 'group')?.value ?? '.',\n decimal: parts.find((part) => part.type === 'decimal')?.value ?? ',',\n }\n}\n\nexport function parseInputNumber(value: string, locale: string): number | null {\n if (!value || value === '-') return null\n const { group, decimal } = getInputSeparators(locale)\n const normalized = value.split(group).join('').replace(decimal, '.')\n const result = Number(normalized)\n return Number.isNaN(result) ? null : result\n}\n\nexport function roundInputNumber(\n value: number,\n scale: number,\n mode: InputRoundMode,\n) {\n const factor = 10 ** scale\n if (mode === 'ceil') return Math.ceil(value * factor) / factor\n if (mode === 'round') return Math.round(value * factor) / factor\n return value >= 0\n ? Math.floor(value * factor) / factor\n : Math.ceil(value * factor) / factor\n}\n\nexport function applyInputMask(value: InputValue, mask: string) {\n const digits = String(value ?? '').replace(/\\D/g, '')\n let index = 0\n let result = ''\n\n for (const character of mask) {\n if (character === 'X') {\n if (index >= digits.length) break\n result += digits[index++]\n } else if (index < digits.length) {\n result += character\n }\n }\n\n return result\n}\n\nexport function formatInputValue(\n value: InputValue,\n type: InputType,\n locale: string,\n decimalScale: number,\n currency: string,\n mask?: string,\n) {\n if (value === null || value === undefined || value === '') return ''\n if (type === 'phone' && mask) return applyInputMask(value, mask)\n if (!isFormattedInputType(type)) return String(value)\n if (typeof value !== 'number' || Number.isNaN(value)) return String(value)\n\n return new Intl.NumberFormat(locale, {\n style:\n type === 'currency'\n ? 'currency'\n : type === 'percent'\n ? 'percent'\n : 'decimal',\n currency: type === 'currency' ? currency : undefined,\n minimumFractionDigits: decimalScale,\n maximumFractionDigits: decimalScale,\n }).format(value)\n}\n\nexport function validateInputValue(\n candidate: InputValue,\n {\n required,\n type,\n min,\n max,\n mask,\n messages,\n }: InputValidationOptions,\n) {\n if (\n required &&\n (candidate === null || candidate === undefined || candidate === '')\n ) {\n return messages.required ?? null\n }\n if (candidate === null || candidate === undefined || candidate === '') {\n return null\n }\n if (\n type === 'email' &&\n !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(String(candidate))\n ) {\n return messages.invalidEmail ?? null\n }\n if (type === 'phone') {\n const digits = String(candidate).replace(/\\D/g, '')\n const expected = mask\n ? (mask.match(/X/g) ?? []).length\n : digits.startsWith('0')\n ? 11\n : 10\n if (digits.length !== expected) return messages.invalidPhone ?? null\n }\n if (isLengthValidatedInputType(type)) {\n if (typeof min === 'number' && String(candidate).length < min) {\n return messages.minLength?.replace('{min}', String(min)) ?? null\n }\n if (typeof max === 'number' && String(candidate).length > max) {\n return messages.maxLength?.replace('{max}', String(max)) ?? null\n }\n }\n if (isFormattedInputType(type)) {\n if (typeof candidate !== 'number' || Number.isNaN(candidate)) {\n return messages.invalidNumber ?? null\n }\n if (typeof min === 'number' && candidate < min) {\n return messages.minNumber?.replace('{min}', String(min)) ?? null\n }\n if (typeof max === 'number' && candidate > max) {\n return messages.maxNumber?.replace('{max}', String(max)) ?? null\n }\n }\n return null\n}\n","import {\n forwardRef,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type FocusEvent,\n type InputHTMLAttributes,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n} from 'react'\n\nimport FieldFeedback from '../FieldFeedback/FieldFeedback'\nimport type { FieldFeedbackContentProps } from '../FieldFeedback/FieldFeedback'\nimport {\n applyInputMask,\n formatInputValue,\n getInputSeparators,\n isFormattedInputType,\n isLengthValidatedInputType,\n parseInputNumber,\n roundInputNumber,\n validateInputValue,\n} from './utils'\n\nexport type InputType =\n | 'text'\n | 'number'\n | 'currency'\n | 'percent'\n | 'phone'\n | 'email'\n | 'password'\n\nexport type InputRoundMode = 'ceil' | 'floor' | 'round'\nexport type InputValue = string | number | null\nexport type InputEventType =\n | 'change'\n | 'blur'\n | 'focus'\n | 'keydown'\n | 'mouseenter'\n | 'mouseleave'\n | 'clear'\n\nexport interface InputPayload {\n rawValue: InputValue\n formattedValue: string\n error: boolean\n char: string | null\n eventType: InputEventType\n}\n\nexport interface InputValidationMessages {\n required?: string\n invalidNumber?: string\n minNumber?: string\n maxNumber?: string\n minLength?: string\n maxLength?: string\n invalidPhone?: string\n invalidEmail?: string\n}\n\ntype NativeInputProps = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n | 'type'\n | 'value'\n | 'defaultValue'\n | 'onChange'\n | 'onBlur'\n | 'onFocus'\n | 'onKeyDown'\n | 'onMouseEnter'\n | 'onMouseLeave'\n | 'min'\n | 'max'\n | 'size'\n | 'readOnly'\n>\n\nexport interface InputProps extends NativeInputProps, FieldFeedbackContentProps {\n label?: string\n startAdornment?: ReactNode\n endAdornment?: ReactNode\n fullWidth?: boolean\n inputClassName?: string\n labelClassName?: string\n value?: InputValue\n defaultValue?: InputValue\n onChange?: (payload: InputPayload) => void\n onBlur?: (payload: InputPayload, event: FocusEvent<HTMLInputElement>) => void\n onFocus?: (payload: InputPayload, event: FocusEvent<HTMLInputElement>) => void\n onKeyDown?: (\n payload: InputPayload,\n event: KeyboardEvent<HTMLInputElement>,\n ) => void\n onMouseEnter?: (\n payload: InputPayload,\n event: MouseEvent<HTMLInputElement>,\n ) => void\n onMouseLeave?: (\n payload: InputPayload,\n event: MouseEvent<HTMLInputElement>,\n ) => void\n type?: InputType\n locale?: string\n currency?: string\n decimalScale?: number\n roundMode?: InputRoundMode\n roundOnBlur?: boolean\n min?: number\n max?: number\n allowNegative?: boolean\n debounceMs?: number\n validateOnSubmit?: boolean\n validationMessages?: InputValidationMessages\n mask?: string\n limit?: number\n isClearable?: boolean\n readOnly?: boolean\n clearButtonLabel?: string\n readOnlyEmptyValue?: ReactNode\n}\n\nconst Input = forwardRef<HTMLInputElement, InputProps>(function Input(\n {\n id,\n label,\n hint,\n errorMessage,\n startAdornment,\n endAdornment,\n fullWidth = false,\n inputClassName,\n labelClassName,\n className,\n required,\n disabled,\n value,\n defaultValue = '',\n onChange,\n onBlur,\n onFocus,\n onKeyDown,\n onMouseEnter,\n onMouseLeave,\n type = 'text',\n locale = 'tr-TR',\n currency = 'TRY',\n decimalScale = 0,\n roundMode = 'floor',\n roundOnBlur = false,\n min,\n max,\n allowNegative = false,\n debounceMs = 0,\n validateOnSubmit = false,\n validationMessages,\n mask,\n limit,\n isClearable = false,\n readOnly = false,\n clearButtonLabel,\n readOnlyEmptyValue = null,\n autoComplete = 'off',\n 'aria-describedby': ariaDescribedBy,\n ...inputProps\n },\n ref,\n) {\n const generatedId = useId()\n const inputId = id ?? `inconel-input-${generatedId.replace(/:/g, '')}`\n const hintId = `${inputId}-hint`\n const errorId = `${inputId}-error`\n const controlled = value !== undefined\n const [localValue, setLocalValue] = useState<InputValue>(defaultValue)\n const currentValue = controlled ? value : localValue\n const [editingValue, setEditingValue] = useState('')\n const [focused, setFocused] = useState(false)\n const [validationError, setValidationError] = useState<string | null>(null)\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n const messages = validationMessages ?? {}\n const visibleError = errorMessage ?? validationError\n\n const validate = (candidate: InputValue) =>\n validateInputValue(candidate, {\n required: Boolean(required),\n type,\n min,\n max,\n mask,\n messages,\n })\n\n const formattedValue = useMemo(\n () =>\n formatInputValue(\n currentValue,\n type,\n locale,\n decimalScale,\n currency,\n mask,\n ),\n [currentValue, currency, decimalScale, locale, mask, type],\n )\n\n const buildPayload = (\n rawValue: InputValue,\n eventType: InputEventType,\n char: string | null = null,\n ): InputPayload => ({\n rawValue,\n formattedValue: formatInputValue(\n rawValue,\n type,\n locale,\n decimalScale,\n currency,\n mask,\n ),\n error: Boolean(validate(rawValue)),\n char,\n eventType,\n })\n\n const emitChange = (payload: InputPayload, immediate = false) => {\n if (!controlled) setLocalValue(payload.rawValue)\n if (debounceRef.current) clearTimeout(debounceRef.current)\n if (!onChange) return\n if (immediate || debounceMs <= 0) onChange(payload)\n else debounceRef.current = setTimeout(() => onChange(payload), debounceMs)\n }\n\n useEffect(() => () => {\n if (debounceRef.current) clearTimeout(debounceRef.current)\n }, [])\n\n useEffect(() => {\n if (validateOnSubmit) setValidationError(validate(currentValue))\n // Validation intentionally runs when submit state changes.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [validateOnSubmit])\n\n const normalize = (text: string): InputValue => {\n if (type === 'phone' && mask) return text.replace(/\\D/g, '')\n if (isFormattedInputType(type)) {\n const parsed = parseInputNumber(text, locale)\n if (parsed === null) return text === '' ? null : text\n return allowNegative ? parsed : Math.abs(parsed)\n }\n return text\n }\n\n const handleChange = (text: string) => {\n const digits = text.replace(/\\D/g, '')\n if (\n limit &&\n (isFormattedInputType(type) || type === 'phone') &&\n digits.length > limit\n ) return\n if (limit && isLengthValidatedInputType(type) && text.length > limit) return\n const rawValue = normalize(text)\n if (typeof rawValue === 'number') {\n if (typeof min === 'number' && rawValue < min) return\n if (typeof max === 'number' && rawValue > max) return\n }\n setEditingValue(\n type === 'phone' && mask ? applyInputMask(rawValue, mask) : text,\n )\n emitChange(buildPayload(rawValue, 'change', text.slice(-1) || null))\n }\n\n const describedBy = [\n ariaDescribedBy,\n hint && !visibleError ? hintId : undefined,\n visibleError ? errorId : undefined,\n ].filter(Boolean).join(' ') || undefined\n\n if (readOnly) {\n return (\n <div className={['inconel-field', fullWidth ? 'inconel-field--full-width' : '', className ?? ''].join(' ')}>\n {label && <span className={['inconel-field__label', labelClassName ?? ''].join(' ')}>{label}</span>}\n <div className=\"inconel-input-readonly\" aria-label={label}>\n {formattedValue || readOnlyEmptyValue}\n </div>\n </div>\n )\n }\n\n return (\n <div className={['inconel-field', fullWidth ? 'inconel-field--full-width' : '', className ?? ''].join(' ')}>\n {label && (\n <label className={['inconel-field__label', labelClassName ?? ''].join(' ')} htmlFor={inputId}>\n {label}{required && <span className=\"inconel-field__required\" aria-hidden=\"true\"> *</span>}\n </label>\n )}\n <div className={['inconel-input-control', visibleError ? 'is-invalid' : '', disabled ? 'is-disabled' : ''].join(' ')}>\n {startAdornment && <span className=\"inconel-input-adornment\" aria-hidden=\"true\">{startAdornment}</span>}\n <input\n {...inputProps}\n ref={ref}\n id={inputId}\n type={type === 'password' || type === 'email' ? type : 'text'}\n inputMode={isFormattedInputType(type) ? 'decimal' : type === 'phone' ? 'tel' : undefined}\n value={focused ? editingValue : formattedValue}\n required={required}\n disabled={disabled}\n autoComplete={autoComplete}\n aria-invalid={Boolean(visibleError)}\n aria-describedby={describedBy}\n className={['inconel-input', inputClassName ?? ''].join(' ')}\n onChange={(event) => handleChange(event.target.value)}\n onFocus={(event) => {\n if (disabled) return\n setFocused(true)\n const editValue = type === 'phone' && mask\n ? applyInputMask(currentValue, mask)\n : isFormattedInputType(type)\n ? String(currentValue ?? '').replace('.', getInputSeparators(locale).decimal)\n : String(currentValue ?? '')\n setEditingValue(editValue)\n onFocus?.(buildPayload(currentValue, 'focus'), event)\n }}\n onBlur={(event) => {\n setFocused(false)\n if (debounceRef.current) clearTimeout(debounceRef.current)\n let rawValue = normalize(editingValue)\n if (typeof rawValue === 'number') {\n rawValue = roundInputNumber(rawValue, decimalScale, roundOnBlur ? roundMode : 'floor')\n }\n setValidationError(validate(rawValue))\n const payload = buildPayload(rawValue, 'blur')\n emitChange(payload, true)\n onBlur?.(payload, event)\n }}\n onKeyDown={(event) => {\n if (!allowNegative && (event.key === '-' || event.key === 'Subtract')) event.preventDefault()\n onKeyDown?.(buildPayload(currentValue, 'keydown', event.key), event)\n }}\n onMouseEnter={(event) => onMouseEnter?.(buildPayload(currentValue, 'mouseenter'), event)}\n onMouseLeave={(event) => onMouseLeave?.(buildPayload(currentValue, 'mouseleave'), event)}\n />\n {isClearable && !disabled && formattedValue && clearButtonLabel && (\n <button\n type=\"button\"\n className=\"inconel-input-clear\"\n aria-label={clearButtonLabel}\n onClick={() => {\n setEditingValue('')\n setValidationError(validate(null))\n emitChange(buildPayload(null, 'clear'), true)\n }}\n >\n ×\n </button>\n )}\n {endAdornment && <span className=\"inconel-input-adornment\" aria-hidden=\"true\">{endAdornment}</span>}\n </div>\n <FieldFeedback\n hint={hint}\n errorMessage={visibleError}\n hintId={hintId}\n errorId={errorId}\n />\n </div>\n )\n})\n\nexport default Input\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type ForwardedRef,\n type KeyboardEvent,\n type ReactNode,\n} from 'react'\nimport {\n autoUpdate,\n flip,\n offset,\n shift,\n size,\n useFloating,\n} from '@floating-ui/react'\nimport { useVirtualizer } from '@tanstack/react-virtual'\nimport { createPortal } from 'react-dom'\n\nimport FieldFeedback from '../FieldFeedback/FieldFeedback'\nimport type { FieldFeedbackContentProps } from '../FieldFeedback/FieldFeedback'\n\nexport type OptionValue = string | number\n\nexport interface SelectHandle {\n focus: () => void\n blur: () => void\n clear: () => void\n}\n\ntype SelectPart =\n | 'root'\n | 'label'\n | 'control'\n | 'input'\n | 'clearButton'\n | 'toggleButton'\n | 'menu'\n | 'option'\n | 'message'\n\nexport type SelectClassNames = Partial<Record<SelectPart, string>>\nexport type SelectStyles = Partial<Record<SelectPart, CSSProperties>>\n\nexport interface SelectProps<T extends object> extends FieldFeedbackContentProps {\n id?: string\n name?: string\n label: string\n options: T[]\n value: OptionValue | null\n onChange: (value: OptionValue | null, option: T | null) => void\n optionLabel: keyof T | ((option: T) => ReactNode)\n optionValue: keyof T | ((option: T) => OptionValue)\n getOptionSearchText?: (option: T) => string\n isOptionDisabled?: (option: T) => boolean\n placeholder?: string\n isClearable?: boolean\n isDisabled?: boolean\n isReadOnly?: boolean\n isRequired?: boolean\n isLoading?: boolean\n loadOptions?: (inputValue: string, signal: AbortSignal) => Promise<T[]>\n loadOptionsDebounceMs?: number\n asyncErrorMessage?: ReactNode\n loadingMessage?: ReactNode\n noOptionsMessage?: ReactNode\n clearButtonLabel?: string\n openMenuButtonLabel?: string\n closeMenuButtonLabel?: string\n searchLocale?: string\n menuPortalTarget?: HTMLElement | null\n virtualize?: boolean\n virtualizationThreshold?: number\n optionHeight?: number\n className?: string\n classNames?: SelectClassNames\n styles?: SelectStyles\n onInputChange?: (value: string) => void\n onMenuOpen?: () => void\n onMenuClose?: () => void\n}\n\nfunction cx(...values: Array<string | null | undefined | false>) {\n return values.filter(Boolean).join(' ')\n}\n\nfunction SelectInner<T extends object>(\n {\n id,\n name,\n label,\n options,\n value,\n onChange,\n optionLabel,\n optionValue,\n getOptionSearchText,\n isOptionDisabled = () => false,\n placeholder,\n isClearable = false,\n isDisabled = false,\n isReadOnly = false,\n isRequired = false,\n isLoading = false,\n loadOptions,\n loadOptionsDebounceMs = 250,\n hint,\n errorMessage,\n asyncErrorMessage,\n loadingMessage,\n noOptionsMessage,\n clearButtonLabel,\n openMenuButtonLabel,\n closeMenuButtonLabel,\n searchLocale,\n menuPortalTarget,\n virtualize = false,\n virtualizationThreshold = 100,\n optionHeight = 44,\n className,\n classNames = {},\n styles = {},\n onInputChange,\n onMenuOpen,\n onMenuClose,\n }: SelectProps<T>,\n forwardedRef: ForwardedRef<SelectHandle>,\n) {\n const generatedId = useId()\n const inputId = id ?? `inconel-select-${generatedId.replace(/:/g, '')}`\n const labelId = `${inputId}-label`\n const listboxId = `${inputId}-listbox`\n const messageId = `${inputId}-message`\n const hintId = `${inputId}-hint`\n const rootRef = useRef<HTMLDivElement>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n const menuRef = useRef<HTMLDivElement>(null)\n const [isOpen, setIsOpen] = useState(false)\n const [inputValue, setInputValue] = useState('')\n const [activeIndex, setActiveIndex] = useState(0)\n const [asyncOptions, setAsyncOptions] = useState<T[] | null>(null)\n const [isAsyncLoading, setIsAsyncLoading] = useState(false)\n const [hasAsyncError, setHasAsyncError] = useState(false)\n\n useEffect(() => {\n if (!loadOptions) return\n const controller = new AbortController()\n const timeout = window.setTimeout(async () => {\n setIsAsyncLoading(true)\n setHasAsyncError(false)\n try {\n const loadedOptions = await loadOptions(\n inputValue,\n controller.signal,\n )\n if (!controller.signal.aborted) setAsyncOptions(loadedOptions)\n } catch {\n if (!controller.signal.aborted) setHasAsyncError(true)\n } finally {\n if (!controller.signal.aborted) setIsAsyncLoading(false)\n }\n }, loadOptionsDebounceMs)\n\n return () => {\n window.clearTimeout(timeout)\n controller.abort()\n }\n }, [inputValue, loadOptions, loadOptionsDebounceMs])\n\n const availableOptions = loadOptions\n ? (asyncOptions ?? options)\n : options\n const loading = isLoading || isAsyncLoading\n\n const getLabel = useCallback(\n (option: T): ReactNode =>\n typeof optionLabel === 'function'\n ? optionLabel(option)\n : String(option[optionLabel]),\n [optionLabel],\n )\n\n const getSearchLabel = useCallback(\n (option: T) => {\n if (getOptionSearchText) return getOptionSearchText(option)\n const renderedLabel = getLabel(option)\n return typeof renderedLabel === 'string' ||\n typeof renderedLabel === 'number'\n ? String(renderedLabel)\n : ''\n },\n [getLabel, getOptionSearchText],\n )\n\n const getValue = useCallback(\n (option: T): OptionValue => {\n const resolvedValue =\n typeof optionValue === 'function'\n ? optionValue(option)\n : option[optionValue]\n\n if (\n typeof resolvedValue !== 'string' &&\n typeof resolvedValue !== 'number'\n ) {\n throw new TypeError('optionValue must resolve to a string or number.')\n }\n return resolvedValue\n },\n [optionValue],\n )\n\n const duplicateValues = useMemo(() => {\n const seen = new Set<OptionValue>()\n return availableOptions\n .map(getValue)\n .filter((optionId) => {\n if (seen.has(optionId)) return true\n seen.add(optionId)\n return false\n })\n }, [availableOptions, getValue])\n\n useEffect(() => {\n if (duplicateValues.length) {\n console.warn(\n `Duplicate optionValue found in Select \"${label}\":`,\n duplicateValues,\n )\n }\n }, [duplicateValues, label])\n\n const selectedOption = [...options, ...availableOptions].find(\n (option) => getValue(option) === value,\n )\n const selectedLabel = selectedOption ? getSearchLabel(selectedOption) : ''\n\n const filteredOptions = useMemo(() => {\n const query = inputValue.trim().toLocaleLowerCase(searchLocale)\n if (!query || loadOptions) return availableOptions\n return availableOptions.filter((option) =>\n getSearchLabel(option).toLocaleLowerCase(searchLocale).includes(query),\n )\n }, [availableOptions, getSearchLabel, inputValue, loadOptions, searchLocale])\n\n const { refs, floatingStyles } = useFloating({\n open: isOpen,\n placement: 'bottom-start',\n strategy: menuPortalTarget ? 'fixed' : 'absolute',\n whileElementsMounted: autoUpdate,\n middleware: [\n offset(8),\n flip({ padding: 12 }),\n shift({ padding: 12 }),\n size({\n padding: 12,\n apply({ availableHeight, rects, elements }) {\n Object.assign(elements.floating.style, {\n maxHeight: `${Math.min(230, availableHeight)}px`,\n width: `${rects.reference.width}px`,\n })\n },\n }),\n ],\n })\n\n const shouldVirtualize =\n virtualize || filteredOptions.length >= virtualizationThreshold\n const virtualizer = useVirtualizer({\n count: filteredOptions.length,\n getScrollElement: () => menuRef.current,\n estimateSize: () => optionHeight,\n overscan: 5,\n enabled: shouldVirtualize && isOpen,\n })\n\n const closeMenu = useCallback(() => {\n setIsOpen(false)\n setInputValue('')\n onInputChange?.('')\n onMenuClose?.()\n }, [onInputChange, onMenuClose])\n\n const openMenu = () => {\n if (isDisabled || isReadOnly) return\n if (!isOpen) onMenuOpen?.()\n setIsOpen(true)\n }\n\n const clearSelection = useCallback(() => {\n if (isDisabled || isReadOnly) return\n onChange(null, null)\n setInputValue('')\n setActiveIndex(0)\n onInputChange?.('')\n inputRef.current?.focus()\n }, [isDisabled, isReadOnly, onChange, onInputChange])\n\n useImperativeHandle(\n forwardedRef,\n () => ({\n focus: () => inputRef.current?.focus(),\n blur: () => inputRef.current?.blur(),\n clear: clearSelection,\n }),\n [clearSelection],\n )\n\n useEffect(() => {\n const closeOnOutsideClick = (event: MouseEvent) => {\n const target = event.target as Node\n if (\n !rootRef.current?.contains(target) &&\n !menuRef.current?.contains(target)\n ) {\n closeMenu()\n }\n }\n\n document.addEventListener('mousedown', closeOnOutsideClick)\n return () => document.removeEventListener('mousedown', closeOnOutsideClick)\n }, [closeMenu])\n\n useEffect(() => {\n if (activeIndex >= filteredOptions.length) setActiveIndex(0)\n }, [activeIndex, filteredOptions.length])\n\n useEffect(() => {\n if (shouldVirtualize && isOpen && filteredOptions[activeIndex]) {\n virtualizer.scrollToIndex(activeIndex, { align: 'auto' })\n }\n }, [\n activeIndex,\n filteredOptions,\n isOpen,\n shouldVirtualize,\n virtualizer,\n ])\n\n const selectOption = (option: T) => {\n if (isOptionDisabled(option)) return\n onChange(getValue(option), option)\n closeMenu()\n inputRef.current?.focus()\n }\n\n const moveActiveOption = (direction: 1 | -1) => {\n if (!filteredOptions.length) return\n let nextIndex = activeIndex\n do {\n nextIndex =\n (nextIndex + direction + filteredOptions.length) %\n filteredOptions.length\n } while (\n isOptionDisabled(filteredOptions[nextIndex]) &&\n nextIndex !== activeIndex\n )\n setActiveIndex(nextIndex)\n }\n\n const findEnabledIndex = (fromEnd = false) => {\n const entries = filteredOptions.map((option, index) => ({ option, index }))\n if (fromEnd) entries.reverse()\n return entries.find(({ option }) => !isOptionDisabled(option))?.index ?? 0\n }\n\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (\n event.key === 'Backspace' &&\n !inputValue &&\n value !== null &&\n isClearable\n ) {\n event.preventDefault()\n clearSelection()\n return\n }\n\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault()\n if (!isOpen) {\n openMenu()\n setActiveIndex(findEnabledIndex(event.key === 'ArrowUp'))\n } else {\n moveActiveOption(event.key === 'ArrowDown' ? 1 : -1)\n }\n } else if (event.key === 'Home' && isOpen) {\n event.preventDefault()\n setActiveIndex(findEnabledIndex())\n } else if (event.key === 'End' && isOpen) {\n event.preventDefault()\n setActiveIndex(findEnabledIndex(true))\n } else if (event.key === 'Enter' && isOpen) {\n event.preventDefault()\n const activeOption = filteredOptions[activeIndex]\n if (activeOption) selectOption(activeOption)\n } else if (event.key === 'Escape' && isOpen) {\n event.preventDefault()\n closeMenu()\n } else if (event.key === 'Tab') {\n closeMenu()\n }\n }\n\n const renderOption = (option: T, index: number, style?: CSSProperties) => {\n const optionId = getValue(option)\n const disabled = isOptionDisabled(option)\n return (\n <div\n id={`${inputId}-option-${index}`}\n key={optionId}\n role=\"option\"\n aria-selected={optionId === value}\n aria-disabled={disabled}\n aria-posinset={index + 1}\n aria-setsize={filteredOptions.length}\n className={cx(\n 'inconel-select-option',\n index === activeIndex && 'is-active',\n optionId === value && 'is-selected',\n disabled && 'is-disabled',\n classNames.option,\n )}\n style={{ ...style, ...styles.option }}\n onMouseEnter={() => setActiveIndex(index)}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => selectOption(option)}\n >\n <span>{getLabel(option)}</span>\n {optionId === value && <span aria-hidden=\"true\">✓</span>}\n </div>\n )\n }\n\n const menuContent = loading ? (\n <div\n role=\"status\"\n className={cx('inconel-select-message', classNames.message)}\n style={styles.message}\n >\n <span className=\"inconel-select-spinner\" aria-hidden=\"true\" />\n {loadingMessage}\n </div>\n ) : hasAsyncError ? (\n <div\n role=\"alert\"\n className={cx('inconel-select-message inconel-select-message-error', classNames.message)}\n style={styles.message}\n >\n {asyncErrorMessage}\n </div>\n ) : filteredOptions.length === 0 ? (\n <div\n className={cx('inconel-select-message', classNames.message)}\n style={styles.message}\n >\n {noOptionsMessage}\n </div>\n ) : shouldVirtualize ? (\n <div\n role=\"presentation\"\n className=\"inconel-select-virtual-content\"\n style={{ height: virtualizer.getTotalSize() }}\n >\n {virtualizer.getVirtualItems().map((virtualRow) =>\n renderOption(filteredOptions[virtualRow.index], virtualRow.index, {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: virtualRow.size,\n transform: `translateY(${virtualRow.start}px)`,\n }),\n )}\n </div>\n ) : (\n filteredOptions.map((option, index) => renderOption(option, index))\n )\n\n const menu = isOpen ? (\n <div\n ref={(node) => {\n menuRef.current = node\n refs.setFloating(node)\n }}\n id={listboxId}\n role=\"listbox\"\n aria-labelledby={labelId}\n className={cx(\n 'inconel-select-menu',\n menuPortalTarget && 'inconel-select-menu-portal',\n classNames.menu,\n )}\n style={{ ...floatingStyles, ...styles.menu }}\n >\n {menuContent}\n </div>\n ) : null\n\n const describedBy = errorMessage ? messageId : hint ? hintId : undefined\n\n return (\n <div\n ref={rootRef}\n className={cx('inconel-select-field', className, classNames.root)}\n style={styles.root}\n >\n <label\n id={labelId}\n htmlFor={inputId}\n className={classNames.label}\n style={styles.label}\n >\n {label}\n {isRequired && <span aria-hidden=\"true\"> *</span>}\n </label>\n <div\n ref={refs.setReference}\n className={cx(\n 'inconel-select-control',\n isOpen && 'is-open',\n isDisabled && 'is-disabled',\n Boolean(errorMessage) && 'has-error',\n classNames.control,\n )}\n style={styles.control}\n >\n <input\n ref={inputRef}\n id={inputId}\n role=\"combobox\"\n aria-expanded={isOpen}\n aria-controls={listboxId}\n aria-autocomplete=\"list\"\n aria-activedescendant={\n isOpen && filteredOptions[activeIndex]\n ? `${inputId}-option-${activeIndex}`\n : undefined\n }\n aria-describedby={describedBy}\n aria-invalid={Boolean(errorMessage)}\n aria-required={isRequired}\n aria-busy={loading}\n required={isRequired}\n disabled={isDisabled}\n readOnly={isReadOnly}\n autoComplete=\"off\"\n placeholder={placeholder}\n value={inputValue || selectedLabel}\n className={classNames.input}\n style={styles.input}\n onChange={(event) => {\n setInputValue(event.target.value)\n setActiveIndex(0)\n onInputChange?.(event.target.value)\n openMenu()\n }}\n onClick={openMenu}\n onFocus={(event) => {\n openMenu()\n if (selectedOption && !inputValue) event.currentTarget.select()\n }}\n onKeyDown={handleKeyDown}\n />\n {loading && <span className=\"inconel-select-spinner\" aria-hidden=\"true\" />}\n {isClearable && value !== null && !isDisabled && !isReadOnly && clearButtonLabel && (\n <button\n type=\"button\"\n className={cx('inconel-select-clear', classNames.clearButton)}\n style={styles.clearButton}\n aria-label={clearButtonLabel}\n onClick={clearSelection}\n >\n ×\n </button>\n )}\n <button\n type=\"button\"\n className={cx('inconel-select-toggle', classNames.toggleButton)}\n style={styles.toggleButton}\n aria-label={isOpen ? closeMenuButtonLabel : openMenuButtonLabel}\n aria-expanded={isOpen}\n disabled={isDisabled}\n tabIndex={-1}\n onClick={() => (isOpen ? closeMenu() : openMenu())}\n >\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n height=\"20\"\n fill=\"none\"\n >\n <path\n d=\"m5 7.5 5 5 5-5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n </div>\n\n {name && (\n <input\n type=\"hidden\"\n name={name}\n value={value ?? ''}\n required={isRequired}\n />\n )}\n <FieldFeedback\n hint={hint}\n errorMessage={errorMessage}\n hintId={hintId}\n errorId={messageId}\n />\n\n {menuPortalTarget && menu\n ? createPortal(menu, menuPortalTarget)\n : menu}\n </div>\n )\n}\n\nconst Select = forwardRef(SelectInner) as <T extends object>(\n props: SelectProps<T> & { ref?: ForwardedRef<SelectHandle> },\n) => ReactNode\n\nexport default Select\n","import {\n forwardRef,\n useId,\n type TextareaHTMLAttributes,\n} from 'react'\n\nimport FieldFeedback from '../FieldFeedback/FieldFeedback'\nimport type { FieldFeedbackContentProps } from '../FieldFeedback/FieldFeedback'\n\nexport interface TextareaProps\n extends TextareaHTMLAttributes<HTMLTextAreaElement>,\n FieldFeedbackContentProps {\n label?: string\n fullWidth?: boolean\n resize?: 'none' | 'vertical' | 'horizontal' | 'both'\n}\n\nconst Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n function Textarea(\n {\n id,\n label,\n hint,\n errorMessage,\n fullWidth = false,\n resize = 'vertical',\n className,\n required,\n disabled,\n 'aria-describedby': ariaDescribedBy,\n style,\n ...textareaProps\n },\n ref,\n ) {\n const generatedId = useId()\n const textareaId =\n id ?? `inconel-textarea-${generatedId.replace(/:/g, '')}`\n const hintId = `${textareaId}-hint`\n const errorId = `${textareaId}-error`\n const describedBy =\n [\n ariaDescribedBy,\n hint && !errorMessage ? hintId : undefined,\n errorMessage ? errorId : undefined,\n ]\n .filter(Boolean)\n .join(' ') || undefined\n\n return (\n <div\n className={[\n 'inconel-field',\n fullWidth ? 'inconel-field--full-width' : '',\n className ?? '',\n ].join(' ')}\n >\n {label && (\n <label className=\"inconel-field__label\" htmlFor={textareaId}>\n {label}\n {required && <span aria-hidden=\"true\"> *</span>}\n </label>\n )}\n <textarea\n {...textareaProps}\n ref={ref}\n id={textareaId}\n required={required}\n disabled={disabled}\n aria-invalid={Boolean(errorMessage)}\n aria-describedby={describedBy}\n className={[\n 'inconel-textarea',\n errorMessage ? 'is-invalid' : '',\n ].join(' ')}\n style={{ ...style, resize }}\n />\n <FieldFeedback\n hint={hint}\n errorMessage={errorMessage}\n hintId={hintId}\n errorId={errorId}\n />\n </div>\n )\n },\n)\n\nexport default Textarea\n"],"names":["FieldFeedback","hint","errorMessage","hintId","errorId","className","jsx","FORMATTED_INPUT_TYPES","LENGTH_VALIDATED_INPUT_TYPES","isFormattedInputType","type","candidate","isLengthValidatedInputType","getInputSeparators","locale","parts","part","parseInputNumber","value","group","decimal","normalized","result","roundInputNumber","scale","mode","factor","applyInputMask","mask","digits","index","character","formatInputValue","decimalScale","currency","validateInputValue","required","min","max","messages","expected","Input","forwardRef","id","label","startAdornment","endAdornment","fullWidth","inputClassName","labelClassName","disabled","defaultValue","onChange","onBlur","onFocus","onKeyDown","onMouseEnter","onMouseLeave","roundMode","roundOnBlur","allowNegative","debounceMs","validateOnSubmit","validationMessages","limit","isClearable","readOnly","clearButtonLabel","readOnlyEmptyValue","autoComplete","ariaDescribedBy","inputProps","ref","generatedId","useId","inputId","controlled","localValue","setLocalValue","useState","currentValue","editingValue","setEditingValue","focused","setFocused","validationError","setValidationError","debounceRef","useRef","visibleError","validate","formattedValue","useMemo","buildPayload","rawValue","eventType","char","emitChange","payload","immediate","useEffect","normalize","text","parsed","handleChange","describedBy","jsxs","event","editValue","cx","values","SelectInner","name","options","optionLabel","optionValue","getOptionSearchText","isOptionDisabled","placeholder","isDisabled","isReadOnly","isRequired","isLoading","loadOptions","loadOptionsDebounceMs","asyncErrorMessage","loadingMessage","noOptionsMessage","openMenuButtonLabel","closeMenuButtonLabel","searchLocale","menuPortalTarget","virtualize","virtualizationThreshold","optionHeight","classNames","styles","onInputChange","onMenuOpen","onMenuClose","forwardedRef","labelId","listboxId","messageId","rootRef","inputRef","menuRef","isOpen","setIsOpen","inputValue","setInputValue","activeIndex","setActiveIndex","asyncOptions","setAsyncOptions","isAsyncLoading","setIsAsyncLoading","hasAsyncError","setHasAsyncError","controller","timeout","loadedOptions","availableOptions","loading","getLabel","useCallback","option","getSearchLabel","renderedLabel","getValue","resolvedValue","duplicateValues","seen","optionId","selectedOption","selectedLabel","filteredOptions","query","refs","floatingStyles","useFloating","autoUpdate","offset","flip","shift","size","availableHeight","rects","elements","shouldVirtualize","virtualizer","useVirtualizer","closeMenu","openMenu","clearSelection","useImperativeHandle","closeOnOutsideClick","target","selectOption","moveActiveOption","direction","nextIndex","findEnabledIndex","fromEnd","entries","handleKeyDown","activeOption","renderOption","style","menuContent","virtualRow","menu","node","createPortal","Select","Textarea","resize","textareaProps","textareaId"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ :root{--inconel-font-family: Inter, ui-sans-serif, system-ui, -apple-system, sans-serif;--inconel-color-primary: #6366f1;--inconel-color-primary-hover: #4f46e5;--inconel-color-text: #101828;--inconel-color-text-muted: #667085;--inconel-color-placeholder: #98a2b3;--inconel-color-border: #d0d5dd;--inconel-color-border-subtle: #eaecf0;--inconel-color-surface: #ffffff;--inconel-color-surface-muted: #f8fafc;--inconel-color-danger: #d92d20;--inconel-radius-sm: 8px;--inconel-radius-md: 12px;--inconel-shadow-focus: 0 0 0 4px rgb(99 102 241 / 12%);--inconel-shadow-menu: 0 16px 32px rgb(16 24 40 / 14%)}.inconel-field,.inconel-select-field{position:relative;color:var(--inconel-color-text);font-family:var(--inconel-font-family)}.inconel-field--full-width{width:100%}.inconel-field__label,.inconel-select-field>label{display:block;margin-bottom:8px;color:#344054;font-size:.9rem;font-weight:600}.inconel-field-feedback{margin:7px 0 0;font-size:.82rem}.inconel-field-feedback.is-hint{color:var(--inconel-color-text-muted)}.inconel-field-feedback.is-error,.inconel-field__required{color:var(--inconel-color-danger)}.inconel-input-control,.inconel-select-control{display:flex;overflow:hidden;width:100%;border:1px solid var(--inconel-color-border);border-radius:var(--inconel-radius-md);background:var(--inconel-color-surface);box-shadow:0 1px 2px #1018280d;transition:border-color .16s ease,box-shadow .16s ease}.inconel-input-control:focus-within,.inconel-select-control:focus-within,.inconel-select-control.is-open{border-color:var(--inconel-color-primary);box-shadow:var(--inconel-shadow-focus)}.inconel-input-control.is-invalid,.inconel-select-control.has-error,.inconel-textarea.is-invalid{border-color:var(--inconel-color-danger)}.inconel-input-control.is-disabled,.inconel-select-control.is-disabled{color:var(--inconel-color-placeholder);background:#f2f4f7;cursor:not-allowed}.inconel-input,.inconel-select-control input{width:100%;min-width:0;padding:12px 14px;border:0;outline:0;color:var(--inconel-color-text);background:transparent;font:inherit}.inconel-input::placeholder,.inconel-textarea::placeholder,.inconel-select-control input::placeholder{color:var(--inconel-color-placeholder);opacity:1}.inconel-input-adornment{display:grid;flex:0 0 auto;place-items:center;padding:0 12px;color:var(--inconel-color-text-muted)}.inconel-input-clear{display:grid;width:36px;flex:0 0 auto;place-items:center;border:0;color:var(--inconel-color-placeholder);background:transparent;font-size:1.35rem;cursor:pointer}.inconel-input-clear:hover{color:var(--inconel-color-text)}.inconel-input-clear:focus-visible{outline:2px solid var(--inconel-color-primary);outline-offset:-4px}.inconel-input-readonly{min-height:46px;padding:12px 14px;border:1px solid var(--inconel-color-border);border-radius:var(--inconel-radius-md);background:var(--inconel-color-surface-muted);font-weight:600}.inconel-textarea{display:block;width:100%;min-height:96px;padding:12px 14px;border:1px solid var(--inconel-color-border);border-radius:var(--inconel-radius-md);outline:0;color:var(--inconel-color-text);background:var(--inconel-color-surface);box-shadow:0 1px 2px #1018280d;font:inherit;line-height:1.5;transition:border-color .16s ease,box-shadow .16s ease}.inconel-textarea:focus{border-color:var(--inconel-color-primary);box-shadow:var(--inconel-shadow-focus)}.inconel-select-clear,.inconel-select-toggle{display:grid;width:42px;flex:0 0 auto;place-items:center;border:0;color:var(--inconel-color-text-muted);background:transparent;cursor:pointer}.inconel-select-clear{width:34px;color:var(--inconel-color-placeholder);font-size:1.35rem}.inconel-select-clear:hover{color:#344054}.inconel-select-toggle svg{display:block;transition:transform .16s ease}.is-open .inconel-select-toggle svg{transform:rotate(180deg)}.inconel-select-menu{z-index:50;overflow-y:auto;margin:0;padding:6px;border:1px solid var(--inconel-color-border-subtle);border-radius:var(--inconel-radius-md);background:var(--inconel-color-surface);box-shadow:var(--inconel-shadow-menu);font-family:var(--inconel-font-family)}.inconel-select-menu-portal{z-index:9999}.inconel-select-virtual-content{position:relative;width:100%}.inconel-select-option{display:flex;align-items:center;justify-content:space-between;padding:11px 12px;border-radius:var(--inconel-radius-sm);color:var(--inconel-color-text);cursor:pointer}.inconel-select-option.is-active{background:#f2f4ff}.inconel-select-option.is-selected{color:var(--inconel-color-primary-hover);font-weight:600}.inconel-select-option.is-disabled{color:var(--inconel-color-placeholder);cursor:not-allowed}.inconel-select-message{display:flex;align-items:center;justify-content:center;gap:8px;padding:16px 12px;color:var(--inconel-color-text-muted);text-align:center}.inconel-select-message-error{color:var(--inconel-color-danger)}.inconel-select-spinner{width:16px;height:16px;flex:0 0 auto;border:2px solid var(--inconel-color-border);border-top-color:var(--inconel-color-primary);border-radius:50%;animation:inconel-spin .7s linear infinite}@keyframes inconel-spin{to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){.inconel-select-spinner,.inconel-select-toggle svg{animation-duration:1ms;transition-duration:1ms}}
package/package.json ADDED
@@ -0,0 +1,85 @@
1
+ {
2
+ "name": "inconel",
3
+ "version": "0.1.0",
4
+ "description": "Accessible, type-safe React UI components for modern applications.",
5
+ "keywords": [
6
+ "react",
7
+ "ui",
8
+ "components",
9
+ "design-system",
10
+ "select",
11
+ "input",
12
+ "textarea",
13
+ "typescript",
14
+ "accessible"
15
+ ],
16
+ "author": "Ayhan Yanbul",
17
+ "license": "MIT",
18
+ "type": "module",
19
+ "sideEffects": [
20
+ "**/*.css"
21
+ ],
22
+ "files": [
23
+ "dist",
24
+ "README.md",
25
+ "LICENSE"
26
+ ],
27
+ "main": "./dist/index.cjs",
28
+ "module": "./dist/index.js",
29
+ "types": "./dist/index.d.ts",
30
+ "exports": {
31
+ ".": {
32
+ "types": "./dist/index.d.ts",
33
+ "import": "./dist/index.js",
34
+ "require": "./dist/index.cjs"
35
+ },
36
+ "./styles.css": "./dist/styles.css",
37
+ "./package.json": "./package.json"
38
+ },
39
+ "publishConfig": {
40
+ "access": "public"
41
+ },
42
+ "engines": {
43
+ "node": ">=20"
44
+ },
45
+ "scripts": {
46
+ "dev": "vite",
47
+ "build": "tsc -p tsconfig.lib.json --noEmit && vite build",
48
+ "build:playground": "vite build --mode playground",
49
+ "lint": "eslint .",
50
+ "test": "vitest run",
51
+ "test:watch": "vitest",
52
+ "preview": "vite preview --outDir playground-dist",
53
+ "prepublishOnly": "npm run lint && npm test && npm run build",
54
+ "pack:check": "npm pack --dry-run --cache .npm-cache"
55
+ },
56
+ "peerDependencies": {
57
+ "react": ">=18.2.0",
58
+ "react-dom": ">=18.2.0"
59
+ },
60
+ "dependencies": {
61
+ "@floating-ui/react": "^0.27.20",
62
+ "@tanstack/react-virtual": "^3.14.8"
63
+ },
64
+ "devDependencies": {
65
+ "@eslint/js": "^9.36.0",
66
+ "@testing-library/jest-dom": "^7.0.0",
67
+ "@testing-library/react": "^16.3.2",
68
+ "@testing-library/user-event": "^14.6.1",
69
+ "@types/react": "^19.1.16",
70
+ "@types/react-dom": "^19.1.9",
71
+ "@vitejs/plugin-react": "^5.0.4",
72
+ "eslint": "^9.36.0",
73
+ "eslint-plugin-react-hooks": "^5.2.0",
74
+ "eslint-plugin-react-refresh": "^0.4.22",
75
+ "globals": "^16.4.0",
76
+ "jsdom": "^29.1.1",
77
+ "react": "^19.1.1",
78
+ "react-dom": "^19.1.1",
79
+ "typescript": "~5.9.3",
80
+ "typescript-eslint": "^8.45.0",
81
+ "vite": "^7.1.7",
82
+ "vite-plugin-dts": "^4.5.4",
83
+ "vitest": "^4.1.10"
84
+ }
85
+ }