cuenti-dna 0.1.0-beta.1
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/README.md +133 -0
- package/dist/index.cjs +1346 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +491 -0
- package/dist/index.d.ts +491 -0
- package/dist/index.js +1295 -0
- package/dist/index.js.map +1 -0
- package/dist/styles.css +2035 -0
- package/package.json +76 -0
- package/scripts/postinstall.cjs +569 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/index.ts","../src/components/inputs/button.tsx","../src/utils/cn.ts","../src/components/inputs/checkbox.tsx","../src/components/icons/interface/check.tsx","../src/components/icons/interface/minus.tsx","../src/components/inputs/input/input.tsx","../src/components/inputs/input/money-input.tsx","../src/hooks/use-formatted-numeric-input.ts","../src/utils/input/keyboard.ts","../src/utils/input/money.ts","../src/utils/input/number.ts","../src/components/inputs/input/number-input.tsx","../src/components/inputs/input/password-input.tsx","../src/types/atoms/inputs/input/input.ts","../src/components/inputs/radio.tsx","../src/hooks/use-radio.ts","../src/hooks/context/radio-group.ts","../src/hooks/use-radio-group.ts","../src/providers/radio-group-provider.tsx","../src/components/inputs/switch.tsx","../src/components/surfaces/card.tsx","../src/components/icons/menu/closeX.tsx"],"sourcesContent":["/** biome-ignore-all lint/performance/noBarrelFile: <This is the entry point for the library> */\nexport { Button } from '@/components/inputs/button'\nexport { Checkbox } from '@/components/inputs/checkbox'\nexport { Input } from '@/components/inputs/input/input'\nexport { MoneyInput } from '@/components/inputs/input/money-input'\nexport { NumberInput } from '@/components/inputs/input/number-input'\nexport { PasswordInput } from '@/components/inputs/input/password-input'\nexport { Radio, RadioGroup, RadioItem } from '@/components/inputs/radio'\nexport { Switch } from '@/components/inputs/switch'\nexport {\n Card,\n CardAction,\n CardContent,\n CardDescription,\n CardFooter,\n CardHeader,\n CardTitle\n} from '@/components/surfaces/card'\nexport { useFormattedNumericInput } from '@/hooks/use-formatted-numeric-input'\nexport { useRadio } from '@/hooks/use-radio'\nexport { useRadioGroup } from '@/hooks/use-radio-group'\nexport { Check } from '@/icons/interface/check'\nexport { Minus } from '@/icons/interface/minus'\nexport { CloseX } from '@/icons/menu/closeX'\nexport type {\n ButtonProps,\n ButtonSizes,\n ButtonVariants\n} from '@/types/atoms/inputs/button'\nexport type {\n CheckboxProps,\n CheckboxSizes,\n CheckboxVariants\n} from '@/types/atoms/inputs/checkbox'\nexport type {\n InputProps,\n InputSizes,\n InputTypes,\n InputVariants\n} from '@/types/atoms/inputs/input/input'\nexport { inputTypes } from '@/types/atoms/inputs/input/input'\nexport type {\n NormalizableValue,\n UseFormattedNumericInputParams,\n UseFormattedNumericInputReturn\n} from '@/types/atoms/inputs/input/use-formatted-numeric-inputs'\nexport type {\n RadioGroupContextValue,\n RadioGroupItemClassNames,\n RadioGroupItemProps,\n RadioGroupProps,\n RadioVariants\n} from '@/types/atoms/inputs/radio'\nexport type {\n SwitchClassNames,\n SwitchProps,\n SwitchVariants\n} from '@/types/atoms/inputs/switch'\nexport type {\n CardActionProps,\n CardContentProps,\n CardDescriptionProps,\n CardFooterProps,\n CardHeaderProps,\n CardProps,\n CardTitleProps\n} from '@/types/atoms/surfaces/card'\nexport { cn } from '@/utils/cn'\n","import { cva } from 'class-variance-authority'\nimport type { ButtonProps } from '@/types/atoms/inputs/button'\nimport { cn } from '@/utils/cn'\n\nconst baseStyles =\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap text-base transition-all duration-300 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] cursor-pointer disabled:bg-neutral-600 disabled:text-neutral-700 font-bold disabled:cursor-not-allowed\"\n\n/**\n * Variantes visuales disponibles para el componente Button.\n */\nexport const variants = {\n primary:\n 'bg-primary text-primary-foreground hover:bg-primary-600 active:bg-primary-400 aria-pressed:bg-primary-400',\n alt: 'bg-primary-400 text-primary-foreground hover:bg-primary-500 active:bg-primary-300 aria-pressed:bg-primary-300',\n secondary:\n 'bg-secondary text-secondary-foreground hover:bg-secondary-600 active:bg-secondary-400 aria-pressed:bg-secondary-400',\n ghost:\n 'bg-transparent hover:bg-neutral-400 active:bg-neutral-500 aria-pressed:bg-neutral-500 text-muted-foreground hover:text-neutral-800',\n 'primary-ghost':\n 'bg-transparent hover:bg-primary-50 active:bg-primary-100 aria-pressed:bg-primary-100 text-primary hover:text-primary-600',\n link: 'bg-transparent underline-offset-4 hover:underline text-neutral-700 hover:text-info active:text-info-400 aria-pressed:text-info-400',\n destructive:\n 'bg-destructive text-destructive-foreground hover:bg-destructive-600 active:bg-destructive-400 aria-pressed:bg-destructive-400',\n success:\n 'bg-success text-success-foreground hover:bg-success-600 active:bg-success-400 aria-pressed:bg-success-400',\n accent:\n 'bg-accent text-accent-foreground hover:bg-accent-600 active:bg-accent-400 aria-pressed:bg-accent-400 font-bold',\n outline:\n 'border-2 border-neutral-500 bg-transparent text-neutral-700 hover:border-neutral-600 hover:bg-neutral-300 active:bg-neutral-300 active:border-neutral-600 aria-pressed:bg-neutral-300 aria-pressed:border-neutral-600 disabled:bg-transparent disabled:border-neutral-400 disabled:text-neutral-600',\n 'secondary-outline':\n 'border-2 border-neutral-500 bg-transparent text-neutral-700 hover:border-secondary-300 hover:bg-secondary-25 hover:text-secondary-300 active:bg-secondary-50 active:border-secondary-200 active:text-secondary-300 aria-pressed:bg-secondary-50 aria-pressed:border-secondary-200 aria-pressed:text-secondary-300 disabled:bg-transparent disabled:border-neutral-400 disabled:text-neutral-600'\n}\n\n/**\n * Tamanos visuales disponibles para el componente Button.\n */\nexport const sizes = {\n md: 'h-12 px-5 has-[>svg]:px-3 rounded-md',\n sm: 'h-10 gap-1.5 px-5 has-[>svg]:px-3 rounded-sm',\n lg: 'h-13 px-5 has-[>svg]:px-5 rounded-lg',\n icon: 'size-12 aspect-square rounded-md',\n 'icon-sm': 'size-10 aspect-square rounded-sm',\n 'icon-lg': 'size-13 aspect-square rounded-lg'\n}\n\nconst buttonVariants = cva(baseStyles, {\n variants: {\n variant: variants,\n size: sizes\n },\n defaultVariants: {\n variant: 'primary',\n size: 'md'\n }\n} as const)\n\n/**\n * Componente Button.\n *\n * Renderiza un boton reutilizable con variantes y tamanos predefinidos.\n * El tipo por defecto es `button` para evitar submits accidentales en formularios.\n *\n * @see {@link ButtonProps}\n */\nexport function Button({\n variant,\n size,\n className,\n children,\n type = 'button',\n ...props\n}: ButtonProps) {\n const classes = cn(buttonVariants({ variant, size }), className)\n\n return (\n <button className={classes} type={type} {...props}>\n {children}\n </button>\n )\n}\n","import type { ClassValue } from 'clsx'\nimport { clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\n/**\n * Combina clases condicionales y resuelve conflictos de Tailwind.\n *\n * Usa `clsx` para componer entradas heterogeneas y `tailwind-merge`\n * para priorizar la ultima clase utilitaria en conflicto.\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import { cva } from 'class-variance-authority'\nimport { useEffect, useId, useRef } from 'react'\nimport { Check } from '@/icons/interface/check'\nimport { Minus } from '@/icons/interface/minus'\nimport type { CheckboxProps } from '@/types/atoms/inputs/checkbox'\nimport { cn } from '@/utils/cn'\n\nconst baseStyles =\n 'size-6 shrink-0 appearance-none border-2 border-neutral-600 bg-transparent transition-all duration-200 outline-none disabled:border-neutral-400 disabled:bg-transparent focus-visible:ring-2 focus-visible:bg-neutral-400 focus-visible:ring-offset-1 cursor-pointer disabled:cursor-not-allowed group-data-[readonly=true]/checkbox:cursor-default'\n\n/**\n * Variantes visuales disponibles para Checkbox.\n */\nexport const variants = {\n default:\n 'hover:border-info-500 hover:bg-info-50 focus-visible:border-info-500 focus-visible:ring-info-500/20 focus-visible:checked:border-info-500 focus-visible:checked:bg-info-500 checked:border-info-500 checked:bg-info-500 checked:hover:border-info-600 checked:hover:bg-info-600 indeterminate:border-info-500 indeterminate:bg-info-500 indeterminate:hover:border-info-600 indeterminate:hover:bg-info-600 disabled:hover:border-neutral-400 disabled:hover:bg-transparent',\n success:\n 'hover:border-success-500 hover:bg-success-50 focus-visible:border-success-500 focus-visible:ring-success-500/20 focus-visible:checked:border-success-500 focus-visible:checked:bg-success-500 checked:border-success-500 checked:bg-success-500 checked:hover:border-success-600 checked:hover:bg-success-600 indeterminate:border-success-500 indeterminate:bg-success-500 indeterminate:hover:border-success-600 indeterminate:hover:bg-success-600 disabled:hover:border-neutral-400 disabled:hover:bg-transparent'\n}\n\n/**\n * Formas disponibles para el control de Checkbox.\n */\nexport const sizes = {\n square: 'rounded-[8px]',\n rounded: 'rounded-full'\n}\n\nconst checkboxVariants = cva(baseStyles, {\n variants: {\n variant: variants,\n size: sizes\n },\n defaultVariants: {\n variant: 'default',\n size: 'square'\n }\n} as const)\n\n/**\n * Componente Checkbox.\n *\n * Renderiza un control de seleccion con soporte para estados\n * marcado, desmarcado e indeterminado.\n * Incluye protecciones de interaccion para readOnly y disabled, ademas de variantes y tamanos visuales.\n *\n * @see {@link CheckboxProps}\n */\nexport function Checkbox({\n variant,\n size,\n indeterminate = false,\n children,\n className,\n classNames,\n readOnly,\n onClick,\n onChange,\n disabled,\n ...props\n}: CheckboxProps) {\n const inputRef = useRef<HTMLInputElement>(null)\n const generatedId = useId()\n const id = props.id || generatedId\n\n const isReadOnly = Boolean(readOnly)\n\n useEffect(() => {\n if (inputRef.current) {\n inputRef.current.indeterminate = indeterminate\n }\n }, [indeterminate])\n\n const classes = cn(\n checkboxVariants({ variant, size }),\n className,\n classNames?.input\n )\n\n const handleClick: React.MouseEventHandler<HTMLInputElement> = (event) => {\n if (isReadOnly || disabled) {\n event.preventDefault()\n return\n }\n\n onClick?.(event)\n }\n\n const handleChange: React.ChangeEventHandler<HTMLInputElement> = (event) => {\n if (isReadOnly || disabled) {\n event.preventDefault()\n return\n }\n\n onChange?.(event)\n }\n\n return (\n <div\n data-slot=\"checkbox\"\n data-disabled={disabled ? 'true' : undefined}\n data-readonly={isReadOnly ? 'true' : undefined}\n className={cn(\n 'group/checkbox inline-flex cursor-pointer items-center gap-3 data-[disabled=true]:cursor-not-allowed data-[readonly=true]:cursor-default',\n classNames?.root\n )}\n >\n <span className=\"group/control relative flex size-6 shrink-0 items-center justify-center text-white\">\n <input\n ref={inputRef}\n id={id}\n type=\"checkbox\"\n aria-checked={indeterminate ? 'mixed' : undefined}\n aria-readonly={isReadOnly || undefined}\n className={classes}\n readOnly={isReadOnly}\n disabled={disabled}\n onClick={handleClick}\n onChange={handleChange}\n {...props}\n />\n <Check\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute z-10 size-5 opacity-0 transition-opacity group-has-checked/control:opacity-100 group-has-indeterminate/control:opacity-0\"\n />\n <Minus\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute z-10 size-5 opacity-0 transition-opacity group-has-indeterminate/control:opacity-100\"\n />\n </span>\n {children ? (\n <label\n data-slot=\"checkbox-label\"\n htmlFor={id}\n className={cn(\n 'cursor-pointer transition-colors group-data-[disabled=true]/checkbox:cursor-not-allowed group-data-[readonly=true]/checkbox:cursor-default group-data-[disabled=true]/checkbox:text-neutral-600',\n classNames?.label\n )}\n >\n {children}\n </label>\n ) : null}\n </div>\n )\n}\n","/**\n * Icono de check para estados seleccionados o exitosos.\n */\nexport function Check({ className, ...props }: React.SVGProps<SVGSVGElement>) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 20 20\"\n className={className}\n {...props}\n >\n <path\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"m5 10 3.54 3.54 7.07-7.08\"\n />\n </svg>\n )\n}\n","/**\n * Icono de menos para estados indeterminados o acciones de resta.\n */\nexport function Minus({ ...props }: React.SVGProps<SVGSVGElement>) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n {...props}\n >\n <path\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M6 12h12\"\n />\n </svg>\n )\n}\n","import { cva } from 'class-variance-authority'\nimport { MoneyInput } from '@/components/inputs/input/money-input'\nimport { NumberInput } from '@/components/inputs/input/number-input'\nimport { PasswordInput } from '@/components/inputs/input/password-input'\nimport type { InputProps, InputTypes } from '@/types/atoms/inputs/input/input'\nimport { inputTypes } from '@/types/atoms/inputs/input/input'\nimport { cn } from '@/utils/cn'\n\nconst baseStyles = [\n 'bg-transparent transition-colors duration-200 ease-in-out disabled:bg-neutral-200 disabled:text-neutral-600 disabled:border-neutral-400 disabled:cursor-not-allowed'\n]\n\nconst variants = {\n default: [\n 'border border-neutral-500 text-foreground',\n 'placeholder:text-neutral-500',\n 'hover:border-neutral-700',\n 'focus:border-info-500 focus:ring-0 focus:outline-none'\n ],\n error: [\n 'border border-destructive text-foreground',\n 'placeholder:text-destructive-400/70',\n 'hover:border-destructive-600',\n 'focus:border-destructive-400 focus:ring-0 focus:outline-none'\n ],\n success: [\n 'border border-success text-foreground',\n 'placeholder:text-success/60',\n 'hover:border-success-600',\n 'focus:border-success-400 focus:ring-0 focus:outline-none'\n ]\n}\n\nconst sizes = {\n sm: ['h-10 rounded-[14px] px-3 py-2.5 font-normal text-sm'],\n md: ['h-12 rounded-md px-3 pt-3 pb-3.5 text-base'],\n lg: ['h-13 rounded-lg px-3 py-[15px] text-base']\n}\n\nconst switchVariants = cva(baseStyles, {\n variants: {\n variant: variants,\n size: sizes\n },\n defaultVariants: {\n variant: 'default',\n size: 'md'\n }\n})\n\n/**\n * Componente Input.\n *\n * Punto de entrada para todos los campos de texto del sistema.\n * Segun el `type`, delega en implementaciones especializadas para password,\n * number y money, o renderiza un input nativo para tipos simples.\n *\n * @see {@link InputProps}\n */\nexport function Input({\n variant,\n size,\n classNames,\n moneySymbol,\n type,\n ...props\n}: InputProps) {\n const inputClasses = cn(switchVariants({ variant, size }), props.className)\n const specializedClassNames = {\n input: cn(inputClasses, classNames?.input),\n root: classNames?.root\n }\n\n if (type && !inputTypes.includes(type as InputTypes)) {\n throw new Error(\n `Invalid input type: ${type}. Allowed types are: ${inputTypes.join(', ')}`\n )\n }\n\n if (type !== 'password' && type !== 'number' && type !== 'money') {\n return (\n <div className={cn('w-fit', classNames?.root)}>\n <input\n {...props}\n type={type}\n className={cn(inputClasses, classNames?.input)}\n />\n </div>\n )\n }\n\n if (type === 'password') {\n return (\n <PasswordInput\n size={size}\n classNames={specializedClassNames}\n {...props}\n />\n )\n }\n\n if (type === 'number') {\n return (\n <NumberInput size={size} classNames={specializedClassNames} {...props} />\n )\n }\n\n if (type === 'money') {\n return (\n <MoneyInput\n size={size}\n moneySymbol={moneySymbol}\n classNames={specializedClassNames}\n {...props}\n />\n )\n }\n}\n","import { useCallback } from 'react'\nimport { useFormattedNumericInput } from '@/hooks/use-formatted-numeric-input'\nimport { cn } from '@/utils/cn'\nimport { isControlShortcut, isNavigationKey } from '@/utils/input/keyboard'\nimport {\n DEFAULT_MONEY_SYMBOL,\n editableMoneyToRawValue,\n formatMoneyValue,\n isAllowedMoneyCharacter,\n isValidMoneyPaste,\n MONEY_INPUT_PATTERN,\n normalizeMoneyRawValue,\n rawMoneyToEditableValue,\n sanitizeMoneyEditableValue\n} from '@/utils/input/money'\nimport type { SpecializedMoneyInputProps } from '@/utils/input/props'\n\n/**\n * Propiedades internas para `MoneyInput`.\n */\ntype MoneyInputProps = SpecializedMoneyInputProps & {\n reset?: boolean\n}\n\n/**\n * Campo especializado para montos monetarios.\n *\n * Mantiene un valor editable mientras el input esta en foco y un valor\n * formateado al perder foco, emitiendo siempre el valor crudo al exterior.\n * En formularios, envia el valor crudo (sin simbolos ni separadores visuales).\n */\nexport function MoneyInput({\n size: _size,\n classNames,\n moneySymbol,\n reset,\n ...props\n}: MoneyInputProps) {\n const {\n value,\n defaultValue,\n onChange,\n onKeyDown,\n onBlur,\n onFocus,\n onPaste,\n className,\n inputMode,\n pattern,\n name,\n disabled,\n ...restProps\n } = props\n\n const symbol = moneySymbol ?? DEFAULT_MONEY_SYMBOL\n const rawToDisplayValue = useCallback(\n (rawValue: string) => formatMoneyValue(rawValue, symbol),\n [symbol]\n )\n const {\n rawValue,\n displayValue,\n isFocused,\n handleFocus,\n handleChange,\n handleBlur\n } = useFormattedNumericInput({\n value,\n defaultValue,\n onChange,\n onBlur,\n onFocus,\n normalizeRawValue: normalizeMoneyRawValue,\n rawToEditableValue: rawMoneyToEditableValue,\n rawToDisplayValue,\n editableToRawValue: editableMoneyToRawValue,\n sanitizeEditableValue: sanitizeMoneyEditableValue\n })\n\n const resolvedPattern =\n pattern ?? (isFocused ? MONEY_INPUT_PATTERN : undefined)\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (!isControlShortcut(event) && !isNavigationKey(event.key)) {\n const isAllowed = isAllowedMoneyCharacter(event.key)\n\n if (!isAllowed) {\n event.preventDefault()\n }\n }\n\n onKeyDown?.(event)\n }\n\n const handlePaste: React.ClipboardEventHandler<HTMLInputElement> = (\n event\n ) => {\n const pastedText = event.clipboardData.getData('text')\n\n if (!isValidMoneyPaste(pastedText)) {\n event.preventDefault()\n }\n\n onPaste?.(event)\n }\n\n if (reset) {\n return (\n <div className={cn('w-fit', classNames?.root)}>\n <input {...props} className={cn(classNames?.input, className)} />\n </div>\n )\n }\n\n return (\n <div className={cn('w-fit', classNames?.root)}>\n <input\n {...restProps}\n type=\"text\"\n name={undefined}\n value={displayValue}\n disabled={disabled}\n inputMode={inputMode ?? 'decimal'}\n pattern={resolvedPattern}\n onFocus={handleFocus}\n onChange={handleChange}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n className={cn(classNames?.input, className)}\n />\n {name ? (\n <input type=\"hidden\" name={name} value={rawValue} disabled={disabled} />\n ) : null}\n </div>\n )\n}\n","import type {\n ChangeEvent,\n ChangeEventHandler,\n FocusEvent,\n FocusEventHandler\n} from 'react'\nimport { useEffect, useState } from 'react'\nimport type {\n UseFormattedNumericInputParams,\n UseFormattedNumericInputReturn\n} from '@/types/atoms/inputs/input/use-formatted-numeric-inputs'\n\n/**\n * Hook compartido para inputs numericos con valor crudo y valor de presentacion.\n *\n * Mantiene:\n * - Valor crudo: usado para formularios y eventos.\n * - Valor visible: usado para mostrar formato amigable al usuario.\n */\nexport function useFormattedNumericInput({\n value,\n defaultValue,\n onChange,\n onBlur,\n onFocus,\n normalizeRawValue,\n rawToEditableValue,\n rawToDisplayValue,\n editableToRawValue,\n sanitizeEditableValue\n}: UseFormattedNumericInputParams): UseFormattedNumericInputReturn {\n const initialRawValue = normalizeRawValue(value ?? defaultValue)\n const [isFocused, setIsFocused] = useState(false)\n const [rawValue, setRawValue] = useState(initialRawValue)\n const [displayValue, setDisplayValue] = useState(() =>\n rawToDisplayValue(initialRawValue)\n )\n\n useEffect(() => {\n if (value === undefined) {\n return\n }\n\n const nextRawValue = normalizeRawValue(value)\n\n setRawValue(nextRawValue)\n setDisplayValue(\n isFocused\n ? rawToEditableValue(nextRawValue)\n : rawToDisplayValue(nextRawValue)\n )\n }, [\n value,\n isFocused,\n normalizeRawValue,\n rawToEditableValue,\n rawToDisplayValue\n ])\n\n useEffect(() => {\n if (value !== undefined) {\n return\n }\n\n setDisplayValue(\n isFocused ? rawToEditableValue(rawValue) : rawToDisplayValue(rawValue)\n )\n }, [value, isFocused, rawValue, rawToEditableValue, rawToDisplayValue])\n\n const normalizeEditableValue = (editableValue: string) =>\n sanitizeEditableValue ? sanitizeEditableValue(editableValue) : editableValue\n\n const emitRawValue = (\n event:\n | ChangeEvent<HTMLInputElement>\n | FocusEvent<HTMLInputElement, Element>,\n nextRawValue: string\n ) => {\n event.currentTarget.value = nextRawValue\n }\n\n const handleFocus: FocusEventHandler<HTMLInputElement> = (event) => {\n setIsFocused(true)\n setDisplayValue(rawToEditableValue(rawValue))\n onFocus?.(event)\n }\n\n const handleChange: ChangeEventHandler<HTMLInputElement> = (event) => {\n const editableValue = normalizeEditableValue(event.currentTarget.value)\n const nextRawValue = editableToRawValue(editableValue)\n\n setRawValue(nextRawValue)\n setDisplayValue(editableValue)\n emitRawValue(event, nextRawValue)\n onChange?.(event)\n }\n\n const handleBlur: FocusEventHandler<HTMLInputElement> = (event) => {\n const editableValue = normalizeEditableValue(displayValue)\n const nextRawValue = editableToRawValue(editableValue)\n\n setRawValue(nextRawValue)\n setIsFocused(false)\n setDisplayValue(rawToDisplayValue(nextRawValue))\n emitRawValue(event, nextRawValue)\n onBlur?.(event)\n }\n\n return {\n rawValue,\n displayValue,\n isFocused,\n handleFocus,\n handleChange,\n handleBlur\n }\n}\n","import type { KeyboardEvent } from 'react'\n\n/**\n * Teclas de navegacion/edicion permitidas en inputs restringidos.\n */\nconst NAVIGATION_KEYS = new Set([\n 'Backspace',\n 'Delete',\n 'ArrowLeft',\n 'ArrowRight',\n 'Home',\n 'End',\n 'Tab'\n])\n\n/**\n * Indica si el evento corresponde a un atajo de sistema (Ctrl/Cmd).\n */\nexport const isControlShortcut = (event: KeyboardEvent<HTMLInputElement>) =>\n event.ctrlKey || event.metaKey\n\n/**\n * Verifica si la tecla debe considerarse de navegacion/edicion segura.\n */\nexport const isNavigationKey = (key: string) => NAVIGATION_KEYS.has(key)\n\n/**\n * Construye el valor resultante de un input tras insertar texto en una seleccion.\n */\nexport const buildNextValue = (\n currentValue: string,\n selectionStart: number,\n selectionEnd: number,\n nextText: string\n) =>\n `${currentValue.slice(0, selectionStart)}${nextText}${currentValue.slice(selectionEnd)}`\n","/**\n * Simbolo monetario por defecto cuando no se provee uno explicito.\n */\nexport const DEFAULT_MONEY_SYMBOL = '$'\n\n/**\n * Cantidad maxima de decimales permitidos en entradas monetarias.\n */\nexport const MONEY_MAX_DECIMALS = 4\n\n/**\n * Patron HTML para validar montos en formato editable local (`123,45`).\n */\nexport const MONEY_INPUT_PATTERN = '^([0-9]+)(,[0-9]{0,4})?$'\n\nconst MONEY_ALLOWED_CHAR_REGEX = /[0-9,]/\nconst MONEY_PASTE_REGEX = /^[0-9,]+$/\n\n/**\n * Indica si un caracter individual es valido para escritura monetaria.\n */\nexport const isAllowedMoneyCharacter = (key: string) =>\n MONEY_ALLOWED_CHAR_REGEX.test(key)\n\n/**\n * Valida texto pegado para evitar caracteres no permitidos.\n */\nexport const isValidMoneyPaste = (value: string) =>\n MONEY_PASTE_REGEX.test(value)\n\n/**\n * Limpia y normaliza una entrada editable de dinero.\n *\n * Reglas:\n * - Elimina caracteres no numericos salvo `,`.\n * - Conserva una unica seccion decimal.\n * - Limita la parte decimal a `MONEY_MAX_DECIMALS`.\n * - Evita ceros iniciales innecesarios en la parte entera.\n */\nexport const sanitizeMoneyEditableValue = (value: string) => {\n const cleaned = value.replace(/[^\\d,]/g, '')\n const [integerPart = '', ...decimalParts] = cleaned.split(',')\n const mergedDecimals = decimalParts.join('').slice(0, MONEY_MAX_DECIMALS)\n const normalizedInteger = integerPart.replace(/^0+(?=\\d)/, '')\n\n if (decimalParts.length > 0) {\n return `${normalizedInteger},${mergedDecimals}`\n }\n\n return normalizedInteger\n}\n\n/**\n * Convierte valor editable local (`123,45`) a valor crudo (`123.45`).\n */\nexport const editableMoneyToRawValue = (editableValue: string) => {\n if (!editableValue) {\n return ''\n }\n\n const [integerPart = '', decimalPart] = editableValue.split(',')\n const normalizedInteger = integerPart || '0'\n\n if (decimalPart === undefined || decimalPart.length === 0) {\n return normalizedInteger\n }\n\n return `${normalizedInteger}.${decimalPart}`\n}\n\n/**\n * Convierte valor crudo (`123.45`) a valor editable local (`123,45`).\n */\nexport const rawMoneyToEditableValue = (rawValue: string) => {\n if (!rawValue) {\n return ''\n }\n\n const [integerPart = '', decimalPart] = rawValue.split('.')\n\n if (decimalPart === undefined || decimalPart.length === 0) {\n return integerPart\n }\n\n return `${integerPart},${decimalPart.slice(0, MONEY_MAX_DECIMALS)}`\n}\n\n/**\n * Normaliza cualquier entrada compatible al formato crudo monetario.\n *\n * Acepta numeros, strings en formato local o crudo, y arreglos provenientes\n * de controles HTML, retornando siempre una representacion estable.\n */\nexport const normalizeMoneyRawValue = (\n value: string | number | readonly string[] | undefined\n) => {\n const normalized = Array.isArray(value) ? value[0] : value\n\n if (normalized === undefined || normalized === null) {\n return ''\n }\n\n const asString = String(normalized).trim()\n\n if (!asString) {\n return ''\n }\n\n const fromRaw = asString.match(/^(\\d+)(?:[.,](\\d{0,4}))?$/)\n\n if (fromRaw) {\n const integerPart = fromRaw[1] ?? ''\n const decimalPart = fromRaw[2] ?? ''\n\n if (!decimalPart) {\n return integerPart\n }\n\n return `${integerPart}.${decimalPart}`\n }\n\n return editableMoneyToRawValue(sanitizeMoneyEditableValue(asString))\n}\n\n/**\n * Formatea un valor crudo para visualizacion con miles y simbolo monetario.\n *\n * Ejemplo: `1234.56` + `COP` -> `COP 1.234,56`.\n */\nexport const formatMoneyValue = (rawValue: string, moneySymbol: string) => {\n if (!rawValue) {\n return ''\n }\n\n const [integerPart = '0', decimalPart = ''] = rawValue.split('.')\n const integerWithGrouping = integerPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.')\n const decimalSection = decimalPart ? `,${decimalPart}` : ''\n const prefix = moneySymbol.trim()\n\n if (!prefix) {\n return `${integerWithGrouping}${decimalSection}`\n }\n\n return `${prefix} ${integerWithGrouping}${decimalSection}`\n}\n","/**\n * Patron HTML para valores numericos con miles opcionales y decimal con coma.\n */\nexport const NUMBER_INPUT_PATTERN =\n '^([0-9]{1,3}(\\\\.[0-9]{3})*|[0-9]+)?(,[0-9]*)?$'\n\nconst NUMBER_ALLOWED_CHAR_REGEX = /[0-9.,]/\nconst NUMBER_INPUT_REGEX = /^(\\d{1,3}(\\.\\d{3})*|\\d+)?(,\\d*)?$/\nconst NUMBER_RAW_REGEX = /^\\d+(?:\\.\\d+)?$/\n\n/**\n * Indica si un caracter es valido para escribir en campos numericos.\n */\nexport const isAllowedNumberCharacter = (key: string) =>\n NUMBER_ALLOWED_CHAR_REGEX.test(key)\n\n/**\n * Valida si el valor editable cumple el formato numerico esperado.\n */\nexport const isValidNumberInput = (value: string) =>\n NUMBER_INPUT_REGEX.test(value)\n\n/**\n * Convierte un valor de presentacion de numero a su forma cruda.\n *\n * Ejemplo:\n * - `1.234,56` -> `1234.56`\n */\nexport const displayNumberToRawValue = (displayValue: string) => {\n if (!displayValue) {\n return ''\n }\n\n const cleaned = displayValue.replace(/[^\\d.,]/g, '')\n const [integerPart = '', ...decimalParts] = cleaned.split(',')\n const integerWithoutGrouping = integerPart.replace(/\\./g, '')\n const decimalPart = decimalParts.join('')\n\n if (!integerWithoutGrouping && !decimalPart) {\n return ''\n }\n\n if (!decimalPart) {\n return integerWithoutGrouping\n }\n\n return `${integerWithoutGrouping || '0'}.${decimalPart}`\n}\n\n/**\n * Convierte un valor crudo a representacion visual amigable para UI.\n *\n * Ejemplo:\n * - `1234.56` -> `1.234,56`\n */\nexport const rawNumberToDisplayValue = (rawValue: string) => {\n if (!rawValue) {\n return ''\n }\n\n const [integerPart = '0', decimalPart = ''] = rawValue.split('.')\n const integerWithGrouping = integerPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.')\n\n if (!decimalPart) {\n return integerWithGrouping\n }\n\n return `${integerWithGrouping},${decimalPart}`\n}\n\n/**\n * Convierte un valor crudo a representacion editable sin separadores de miles.\n *\n * Ejemplo:\n * - `1234.56` -> `1234,56`\n */\nexport const rawNumberToEditableValue = (rawValue: string) => {\n if (!rawValue) {\n return ''\n }\n\n const [integerPart = '', decimalPart] = rawValue.split('.')\n\n if (decimalPart === undefined || decimalPart.length === 0) {\n return integerPart\n }\n\n return `${integerPart},${decimalPart}`\n}\n\n/**\n * Normaliza cualquier forma de entrada (cruda o de presentacion) al formato crudo.\n *\n * Acepta entradas provenientes de `value`, `defaultValue` o `FormData`\n * para unificar el flujo de datos en los inputs numericos.\n */\nexport const normalizeNumberRawValue = (\n value: string | number | readonly string[] | undefined\n) => {\n const normalized = Array.isArray(value) ? value[0] : value\n\n if (normalized === undefined || normalized === null) {\n return ''\n }\n\n const asString = String(normalized).trim()\n\n if (!asString) {\n return ''\n }\n\n if (NUMBER_RAW_REGEX.test(asString)) {\n return asString\n }\n\n if (NUMBER_INPUT_REGEX.test(asString)) {\n return displayNumberToRawValue(asString)\n }\n\n return displayNumberToRawValue(asString)\n}\n","import { useFormattedNumericInput } from '@/hooks/use-formatted-numeric-input'\nimport { cn } from '@/utils/cn'\nimport {\n buildNextValue,\n isControlShortcut,\n isNavigationKey\n} from '@/utils/input/keyboard'\nimport {\n displayNumberToRawValue,\n isAllowedNumberCharacter,\n isValidNumberInput,\n NUMBER_INPUT_PATTERN,\n normalizeNumberRawValue,\n rawNumberToDisplayValue,\n rawNumberToEditableValue\n} from '@/utils/input/number'\nimport type { SpecializedInputProps } from '@/utils/input/props'\n\n/**\n * Propiedades internas para `NumberInput`.\n */\ntype NumberInputProps = SpecializedInputProps & {\n reset?: boolean\n}\n\n/**\n * Campo especializado para valores numericos.\n *\n * Filtra teclas y pegado para garantizar que el valor ingresado\n * respete el patron definido para numeros del sistema.\n * En formularios, envia el valor crudo (sin formato visual) mediante un campo oculto.\n */\nexport function NumberInput({\n size: _size,\n classNames,\n reset,\n ...props\n}: NumberInputProps) {\n const {\n value,\n defaultValue,\n onChange,\n onBlur,\n onFocus,\n onKeyDown,\n onPaste,\n inputMode,\n pattern,\n className,\n name,\n disabled,\n ...restProps\n } = props\n\n const { rawValue, displayValue, handleFocus, handleChange, handleBlur } =\n useFormattedNumericInput({\n value,\n defaultValue,\n onChange,\n onBlur,\n onFocus,\n normalizeRawValue: normalizeNumberRawValue,\n rawToEditableValue: rawNumberToEditableValue,\n rawToDisplayValue: rawNumberToDisplayValue,\n editableToRawValue: displayNumberToRawValue\n })\n\n const handleKeyDown: React.KeyboardEventHandler<HTMLInputElement> = (\n event\n ) => {\n if (!isControlShortcut(event) && !isNavigationKey(event.key)) {\n const isAllowedChar = isAllowedNumberCharacter(event.key)\n\n if (!isAllowedChar) {\n event.preventDefault()\n } else {\n const inputElement = event.currentTarget\n const selectionStart = inputElement.selectionStart ?? 0\n const selectionEnd = inputElement.selectionEnd ?? selectionStart\n const nextValue = buildNextValue(\n inputElement.value,\n selectionStart,\n selectionEnd,\n event.key\n )\n\n if (!isValidNumberInput(nextValue)) {\n event.preventDefault()\n }\n }\n }\n\n onKeyDown?.(event)\n }\n\n const handlePaste: React.ClipboardEventHandler<HTMLInputElement> = (\n event\n ) => {\n const pastedText = event.clipboardData.getData('text')\n const inputElement = event.currentTarget\n const selectionStart = inputElement.selectionStart ?? 0\n const selectionEnd = inputElement.selectionEnd ?? selectionStart\n const nextValue = buildNextValue(\n inputElement.value,\n selectionStart,\n selectionEnd,\n pastedText\n )\n\n if (!isValidNumberInput(nextValue)) {\n event.preventDefault()\n }\n\n onPaste?.(event)\n }\n\n if (reset) {\n return (\n <div className={cn('w-fit', classNames?.root)}>\n <input\n {...props}\n type=\"number\"\n className={cn(classNames?.input, className)}\n />\n </div>\n )\n }\n\n return (\n <div className={cn('w-fit', classNames?.root)}>\n <input\n {...restProps}\n type=\"text\"\n name={undefined}\n value={displayValue}\n disabled={disabled}\n inputMode={inputMode ?? 'decimal'}\n pattern={pattern ?? NUMBER_INPUT_PATTERN}\n onFocus={handleFocus}\n onChange={handleChange}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n className={cn(classNames?.input, className)}\n />\n {name ? (\n <input type=\"hidden\" name={name} value={rawValue} disabled={disabled} />\n ) : null}\n </div>\n )\n}\n","import { Eye, EyeOff } from 'lucide-react'\nimport { useState } from 'react'\nimport { Button } from '@/components/inputs/button'\nimport type { InputSizes } from '@/types/atoms/inputs/input/input'\nimport { cn } from '@/utils/cn'\nimport type { SpecializedInputProps } from '@/utils/input/props'\n\n/**\n * Propiedades internas para `PasswordInput`.\n */\ntype PasswordInputProps = SpecializedInputProps\n\nconst buttonSizeClasses: Record<InputSizes, string> = {\n sm: 'size-8 rounded-sm',\n md: 'size-10 rounded-sm',\n lg: 'size-11 rounded-md'\n}\n\nconst iconSizeClasses: Record<InputSizes, string> = {\n sm: 'size-4',\n md: 'size-5',\n lg: 'size-6'\n}\n\n/**\n * Campo especializado para contrasenas.\n *\n * Permite alternar visibilidad entre texto plano y password,\n * manteniendo nombre accesible para el boton de alternancia.\n */\nexport function PasswordInput({\n size,\n classNames,\n ...props\n}: PasswordInputProps) {\n const [viewPassword, setViewPassword] = useState(false)\n const EyeIcon = viewPassword ? Eye : EyeOff\n const { className, ...restProps } = props\n const currentSize = size ?? 'md'\n\n return (\n <div className={cn('relative w-fit', classNames?.root)}>\n <input\n {...restProps}\n type={viewPassword ? 'text' : 'password'}\n className={cn(\n \"placeholder:tracking-normal [[type='password']]:tracking-[0.16em]\",\n classNames?.input,\n className\n )}\n />\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className={cn(\n 'absolute top-1/2 right-1 -translate-y-1/2',\n buttonSizeClasses[currentSize]\n )}\n type=\"button\"\n aria-label={viewPassword ? 'Hide password' : 'Show password'}\n title={viewPassword ? 'Ocultar contraseña' : 'Mostrar contraseña'}\n onClick={() => setViewPassword((prev) => !prev)}\n >\n <EyeIcon\n aria-hidden=\"true\"\n className={cn(iconSizeClasses[currentSize])}\n />\n </Button>\n </div>\n )\n}\n","/**\n * Propiedades publicas del componente `Input`.\n */\ntype InputProps = {\n /**\n * Tipo de campo a renderizar.\n */\n type?: InputTypes\n /**\n * Variante visual del campo.\n */\n variant?: InputVariants\n /**\n * Tamano visual del campo.\n */\n size?: InputSizes\n /**\n * Prefijo de moneda cuando el tipo es `money`.\n */\n moneySymbol?: string\n /**\n * Clases opcionales para contenedor e input interno.\n */\n classNames?: {\n /**\n * Clase para el contenedor raiz.\n */\n root?: string\n /**\n * Clase para el elemento input.\n */\n input?: string\n }\n /**\n * Elimina validaciones y formatos especiales, renderizando un input basico, sin los comportamientos por defecto de cada tipo especializado.\n *\n * Útil para los tipos 'number' y 'money' cuando se desea un campo con formato libre, sin restricciones de caracteres ni formato visual, pero manteniendo la consistencia visual con los campos especializados.\n */\n reset?: boolean\n} & Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type' | 'size'>\n\n/** Tipos de input soportados por el componente base. */\ntype InputTypes = 'text' | 'password' | 'email' | 'number' | 'money'\n/** Variantes visuales disponibles para Input. */\ntype InputVariants = 'default' | 'error' | 'success'\n/** Tamanos visuales disponibles para Input. */\ntype InputSizes = 'sm' | 'md' | 'lg'\n\n/** Lista utilitaria de tipos permitidos para controles de UI y validacion. */\nexport const inputTypes = [\n 'text',\n 'password',\n 'email',\n 'number',\n 'money'\n] as InputTypes[]\n\nexport type { InputTypes, InputVariants, InputSizes, InputProps }\n","import { cva } from 'class-variance-authority'\nimport { useRadio } from '@/hooks/use-radio'\nimport { useRadioGroup } from '@/hooks/use-radio-group'\nimport { RadioGroupProvider } from '@/providers/radio-group-provider'\nimport type {\n RadioGroupItemProps,\n RadioGroupProps\n} from '@/types/atoms/inputs/radio'\nimport { cn } from '@/utils/cn'\n\nconst baseStyles =\n 'size-6 shrink-0 appearance-none rounded-full border-2 border-neutral-600 bg-transparent transition-all duration-200 outline-none disabled:border-neutral-400 disabled:bg-transparent focus-visible:ring-2 focus-visible:ring-offset-1 cursor-pointer disabled:cursor-not-allowed group-data-[readonly=true]/radio:cursor-default'\n\n/**\n * Variantes visuales disponibles para RadioGroup y RadioItem.\n */\nexport const variants = {\n default:\n 'hover:border-info-500 hover:bg-info-50 focus-visible:border-info-500 focus-visible:ring-info-500/20 checked:border-info-500 checked:hover:border-info-600 disabled:hover:border-neutral-400 disabled:hover:bg-transparent',\n success:\n 'hover:border-success-500 hover:bg-success-50 focus-visible:border-success-500 focus-visible:ring-success-500/20 checked:border-success-500 checked:hover:border-success-600 disabled:hover:border-neutral-400 disabled:hover:bg-transparent'\n}\n\nconst indicatorVariants = cva(\n 'pointer-events-none absolute z-10 size-3 rounded-full opacity-0 transition-opacity group-has-checked/control:opacity-100',\n {\n variants: {\n variant: {\n default: 'bg-info-500',\n success: 'bg-success-500'\n }\n },\n defaultVariants: {\n variant: 'default'\n }\n }\n)\n\nconst radioVariants = cva(baseStyles, {\n variants: {\n variant: variants\n },\n defaultVariants: {\n variant: 'default'\n }\n} as const)\n\n/**\n * Componente RadioGroup.\n *\n * Contenedor de radios con contexto interno compartido.\n * Permite uso controlado y no controlado del valor seleccionado.\n *\n * @see {@link RadioGroupProps}\n */\nfunction RadioGroup({\n value,\n defaultValue,\n onValueChange,\n name,\n variant = 'default',\n disabled = false,\n readOnly = false,\n className,\n children,\n ...props\n}: RadioGroupProps) {\n const { contextValue } = useRadioGroup({\n value,\n defaultValue,\n onValueChange,\n name,\n variant,\n disabled,\n readOnly\n })\n\n return (\n <RadioGroupProvider value={contextValue}>\n <div\n role=\"radiogroup\"\n aria-disabled={contextValue.disabled || undefined}\n aria-readonly={contextValue.readOnly || undefined}\n data-slot=\"radio-group\"\n data-disabled={contextValue.disabled ? 'true' : undefined}\n data-readonly={contextValue.readOnly ? 'true' : undefined}\n className={cn('flex flex-col gap-4', className)}\n {...props}\n >\n {children}\n </div>\n </RadioGroupProvider>\n )\n}\n\n/**\n * Componente RadioItem.\n *\n * Item de radio integrado con etiqueta interna, preparado para trabajar con RadioGroup.\n *\n * @see {@link RadioGroupItemProps}\n */\nfunction RadioItem({\n variant,\n children,\n className,\n classNames,\n readOnly,\n onClick,\n onChange,\n disabled,\n value,\n id: propId,\n ...props\n}: RadioGroupItemProps) {\n const {\n handleChange,\n handleClick,\n id,\n isChecked,\n isDisabled,\n isReadOnly,\n resolvedVariant,\n name\n } = useRadio({\n variant,\n readOnly,\n disabled,\n value,\n onClick,\n onChange,\n id: propId\n })\n\n const classes = cn(\n radioVariants({ variant: resolvedVariant }),\n className,\n classNames?.input\n )\n\n return (\n <label\n data-slot=\"radio\"\n data-state={isChecked ? 'checked' : 'unchecked'}\n data-disabled={isDisabled ? 'true' : undefined}\n data-readonly={isReadOnly ? 'true' : undefined}\n className={cn(\n 'group/radio inline-flex w-fit cursor-pointer items-center gap-3 data-[disabled=true]:cursor-not-allowed data-[readonly=true]:cursor-default',\n classNames?.root\n )}\n >\n <span\n role=\"presentation\"\n className=\"group/control relative flex size-6 shrink-0 items-center justify-center\"\n >\n <input\n id={id}\n type=\"radio\"\n name={name}\n value={value}\n checked={isChecked}\n className={classes}\n readOnly={isReadOnly}\n disabled={isDisabled}\n onClick={handleClick}\n onChange={handleChange}\n {...props}\n />\n <span\n aria-hidden=\"true\"\n role=\"presentation\"\n className={cn(\n indicatorVariants({ variant: resolvedVariant }),\n classNames?.indicator\n )}\n />\n </span>\n {children ? (\n <span\n data-slot=\"radio-label\"\n className={cn(\n 'cursor-pointer transition-colors group-data-[disabled=true]/radio:cursor-not-allowed group-data-[readonly=true]/radio:cursor-default group-data-[disabled=true]/radio:text-neutral-600',\n classNames?.label\n )}\n >\n {children}\n </span>\n ) : null}\n </label>\n )\n}\n\nexport { RadioGroup, RadioItem }\n/**\n * Alias ergonomico para usar un item de radio sin renombrar en imports.\n */\nexport { RadioItem as Radio }\n","import { useId } from 'react'\nimport { useRadioGroupContext } from '@/hooks/context/radio-group'\nimport type { RadioGroupItemProps } from '@/types/atoms/inputs/radio'\n\ntype UseRadioProps = Pick<\n RadioGroupItemProps,\n 'variant' | 'readOnly' | 'disabled' | 'value' | 'onClick' | 'onChange' | 'id'\n>\n\n/**\n * Resuelve estado y manejadores de un `RadioItem` conectado al contexto.\n *\n * Fusiona configuracion local con la heredada desde `RadioGroup` y entrega\n * un contrato listo para renderizar el input nativo sin duplicar logica.\n */\nfunction useRadio({\n variant,\n readOnly,\n disabled,\n value,\n onClick,\n onChange,\n id\n}: UseRadioProps) {\n const context = useRadioGroupContext()\n const generatedId = useId()\n const finalId = id || generatedId\n\n const resolvedVariant = variant || context.variant\n const isReadOnly = Boolean(readOnly || context.readOnly)\n const isDisabled = Boolean(disabled || context.disabled)\n const isChecked = context.value === value\n const name = context.name\n\n const handleClick: React.MouseEventHandler<HTMLInputElement> = (event) => {\n if (isReadOnly || isDisabled) {\n event.preventDefault()\n return\n }\n\n onClick?.(event)\n }\n\n const handleChange: React.ChangeEventHandler<HTMLInputElement> = (event) => {\n if (isReadOnly || isDisabled) {\n event.preventDefault()\n return\n }\n\n context.onValueChange(value)\n\n onChange?.(event)\n }\n\n return {\n id: finalId,\n name,\n resolvedVariant,\n isReadOnly,\n isDisabled,\n isChecked,\n handleClick,\n handleChange\n }\n}\n\nexport { useRadio }\n","import { createContext, useContext } from 'react'\nimport type { RadioGroupContextValue } from '@/types/atoms/inputs/radio'\n\nconst RadioGroupContext = createContext<RadioGroupContextValue | null>(null)\n\n/**\n * Obtiene el contexto compartido por `RadioGroup`.\n *\n * Centraliza la validacion de uso para garantizar que cada `RadioItem`\n * se renderice dentro de un proveedor valido.\n *\n * @throws Error si se invoca fuera de `RadioGroupProvider`.\n */\nfunction useRadioGroupContext() {\n const context = useContext(RadioGroupContext)\n\n if (!context) {\n throw new Error('RadioItem must be used within a RadioGroup')\n }\n\n return context\n}\n\nexport { RadioGroupContext, useRadioGroupContext }\n","import { useCallback, useId, useMemo, useState } from 'react'\nimport type {\n RadioGroupContextValue,\n RadioGroupProps\n} from '@/types/atoms/inputs/radio'\n\ntype UseRadioGroupParams = Pick<\n RadioGroupProps,\n | 'value'\n | 'defaultValue'\n | 'onValueChange'\n | 'name'\n | 'variant'\n | 'disabled'\n | 'readOnly'\n>\n\ntype UseRadioGroupReturn = {\n contextValue: RadioGroupContextValue\n}\n\n/**\n * Encapsula la logica de estado y eventos de `RadioGroup`.\n *\n * Resuelve:\n * - Modo controlado (`value`) y no controlado (`defaultValue`).\n * - Nombre final del grupo para atributos `name`.\n * - Bloqueo de cambios cuando el grupo esta en `disabled` o `readOnly`.\n * - Objeto de contexto memoizado para evitar renders innecesarios.\n */\nfunction useRadioGroup({\n value,\n defaultValue,\n onValueChange,\n name,\n variant = 'default',\n disabled = false,\n readOnly = false\n}: UseRadioGroupParams): UseRadioGroupReturn {\n const generatedName = useId()\n const groupName = name || generatedName\n const [internalValue, setInternalValue] = useState(defaultValue)\n const isControlled = value !== undefined\n const selectedValue = isControlled ? value : internalValue\n\n const handleValueChange = useCallback(\n (nextValue: string) => {\n if (disabled || readOnly) {\n return\n }\n\n if (!isControlled) {\n setInternalValue(nextValue)\n }\n\n onValueChange?.(nextValue)\n },\n [disabled, readOnly, isControlled, onValueChange]\n )\n\n const contextValue = useMemo<RadioGroupContextValue>(\n () => ({\n name: groupName,\n value: selectedValue,\n variant,\n disabled,\n readOnly,\n onValueChange: handleValueChange\n }),\n [groupName, selectedValue, variant, disabled, readOnly, handleValueChange]\n )\n\n return {\n contextValue\n }\n}\n\nexport { useRadioGroup }\n","import type { PropsWithChildren } from 'react'\nimport { RadioGroupContext } from '@/hooks/context/radio-group'\nimport type { RadioGroupContextValue } from '@/types/atoms/inputs/radio'\n\ntype RadioGroupProviderProps = PropsWithChildren<{\n value: RadioGroupContextValue\n}>\n\n/**\n * Proveedor de contexto para `RadioGroup`.\n *\n * Se mantiene en un componente dedicado para separar preocupaciones entre\n * logica de composicion de contexto y renderizado de UI.\n */\nfunction RadioGroupProvider({ value, children }: RadioGroupProviderProps) {\n return (\n <RadioGroupContext.Provider value={value}>\n {children}\n </RadioGroupContext.Provider>\n )\n}\n\nexport { RadioGroupProvider }\n","import { cva } from 'class-variance-authority'\nimport { useId } from 'react'\nimport type { SwitchProps } from '@/types/atoms/inputs/switch'\nimport { cn } from '@/utils/cn'\n\nconst baseStyles = [\n 'group relative inline-flex h-6 w-11 items-center rounded-sm p-0.5 transition-colors duration-300',\n '[&_>span]:block [&_>span]:size-5 [&_>span]:rounded-full [&_>span]:transition-all [&_>span]:duration-300 [&_>span]:group-has-checked:translate-x-full',\n 'bg-neutral-300 group-hover:bg-neutral-400',\n '[&_>span]:bg-neutral-500 group-hover:[&_>span]:bg-neutral-600',\n 'group-has-checked:[&_>span]:bg-neutral-300 group-has-checked:group-hover:[&_>span]:bg-neutral-300',\n 'outline-info-500/20 group-has-focus-visible:outline-3 group-has-focus-visible:ring-0',\n 'group-has-disabled:bg-neutral-200 group-has-disabled:cursor-not-allowed',\n 'group-has-disabled:group-hover:bg-neutral-200 group-has-disabled:[&_>span]:bg-neutral-400 group-has-disabled:group-hover:[&_>span]:bg-neutral-400',\n 'group-has-disabled:group-has-checked:[&_>span]:bg-neutral-200 group-has-disabled:group-has-checked:group-hover:[&_>span]:bg-neutral-200'\n]\n\n/**\n * Variantes visuales disponibles para el estado activo del Switch.\n */\nconst variants = {\n default: [\n 'group-has-checked:bg-info-500 group-has-checked:group-hover:bg-info-700',\n 'group-has-disabled:group-has-checked:bg-info-50 group-has-disabled:group-has-checked:group-hover:bg-info-50'\n ],\n alt: [\n 'group-has-checked:bg-alt2-500 group-has-checked:group-hover:bg-alt2-700',\n 'group-has-disabled:group-has-checked:bg-alt2-50 group-has-disabled:group-has-checked:group-hover:bg-alt2-50'\n ]\n}\n\nconst switchVariants = cva(baseStyles, {\n variants: {\n variant: variants\n },\n defaultVariants: {\n variant: 'default'\n }\n})\n\n/**\n * Componente Switch.\n *\n * Renderiza un interruptor accesible basado en un input de tipo checkbox.\n * Soporta variantes visuales, estado deshabilitado y personalizacion por classNames.\n *\n * @see {@link SwitchProps}\n */\nfunction Switch({\n variant,\n classNames,\n id: propsId,\n children,\n className,\n ...props\n}: SwitchProps) {\n const generatedId = useId()\n const id = propsId || generatedId\n const classes = cn(switchVariants({ variant }), classNames?.input)\n\n return (\n <label\n htmlFor={id}\n className={cn(\n 'group inline-flex items-center gap-2',\n props.disabled\n ? 'cursor-not-allowed text-neutral-700'\n : 'cursor-pointer',\n className,\n classNames?.root\n )}\n >\n <span className={classes}>\n <input {...props} id={id} type=\"checkbox\" className=\"sr-only\" />\n <span aria-hidden=\"true\" className={cn(classNames?.indicator)} />\n </span>\n {children}\n </label>\n )\n}\n\nexport { Switch }\n","import type {\n CardActionProps,\n CardContentProps,\n CardDescriptionProps,\n CardFooterProps,\n CardHeaderProps,\n CardProps,\n CardTitleProps\n} from '@/types/atoms/surfaces/card'\nimport { cn } from '@/utils/cn'\n\n/**\n * Componente contenedor principal para superficies Card.\n *\n * Permite cambiar la etiqueta semantica mediante `as` y habilitar\n * un estado visual interactivo.\n */\nfunction Card({ as = 'div', className, interactive, ...props }: CardProps) {\n const cardClassName = cn(\n 'flex flex-col gap-5 rounded-lg bg-card p-4 text-card-foreground',\n interactive &&\n 'cursor-pointer transition-shadow focus-within:ring-2 focus-within:ring-ring/40 hover:shadow-lg',\n className\n )\n\n if (as === 'article') {\n return <article data-slot=\"card\" className={cardClassName} {...props} />\n }\n\n if (as === 'section') {\n return <section data-slot=\"card\" className={cardClassName} {...props} />\n }\n\n return <div data-slot=\"card\" className={cardClassName} {...props} />\n}\n\n/**\n * Cabecera composable de Card.\n */\nfunction CardHeader({ className, ...props }: CardHeaderProps) {\n return (\n <header\n data-slot=\"card-header\"\n className={cn(\n '@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-1 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6',\n className\n )}\n {...props}\n />\n )\n}\n\n/**\n * Titulo principal de Card.\n */\nfunction CardTitle({ className, ...props }: CardTitleProps) {\n return (\n <h3\n data-slot=\"card-title\"\n className={cn('font-semibold leading-none', className)}\n {...props}\n />\n )\n}\n\n/**\n * Texto descriptivo secundario de Card.\n */\nfunction CardDescription({ className, ...props }: CardDescriptionProps) {\n return (\n <p\n data-slot=\"card-description\"\n className={cn('text-neutral-700 text-sm', className)}\n {...props}\n />\n )\n}\n\n/**\n * Region auxiliar para acciones de Card (ej. botones en cabecera).\n */\nfunction CardAction({ className, ...props }: CardActionProps) {\n return (\n <div\n data-slot=\"card-action\"\n className={cn(\n 'col-start-2 row-span-2 row-start-1 self-start justify-self-end',\n className\n )}\n {...props}\n />\n )\n}\n\n/**\n * Region de contenido principal de Card.\n */\nfunction CardContent({ className, ...props }: CardContentProps) {\n return (\n <section data-slot=\"card-content\" className={cn(className)} {...props} />\n )\n}\n\n/**\n * Pie de Card para acciones o informacion complementaria.\n */\nfunction CardFooter({ className, ...props }: CardFooterProps) {\n return (\n <footer\n data-slot=\"card-footer\"\n className={cn('flex items-center px-6 [.border-t]:pt-6', className)}\n {...props}\n />\n )\n}\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardAction,\n CardDescription,\n CardContent\n}\n","/**\n * Icono de cierre con forma de X.\n */\nexport function CloseX({ className, ...props }: React.SVGProps<SVGSVGElement>) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n className={className}\n {...props}\n >\n <path\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"m18 18-6-6m0 0L6 6m6 6 6-6m-6 6-6 6\"\n />\n </svg>\n )\n}\n"],"mappings":"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","names":["import_class_variance_authority","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","baseStyles","variants","sizes","import_class_variance_authority","import_react","import_react","import_jsx_runtime","rawValue","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","baseStyles","variants","sizes","import_class_variance_authority","import_react","import_react","import_react","import_jsx_runtime","import_jsx_runtime","baseStyles","variants","import_class_variance_authority","import_react","import_jsx_runtime","baseStyles","variants","switchVariants","import_jsx_runtime","import_jsx_runtime"]}
|