unicornial-ui 0.0.11 → 0.0.13

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.
@@ -1 +1 @@
1
- {"version":3,"file":"unicornial-ui.umd.js","names":[],"sources":["../src/theme/theme.config.json","../src/utils/typeUtils.ts","../src/theme/ThemeProvider.tsx","../src/components/Button.tsx","../src/utils/utils.ts","../src/components/Header.tsx","../src/components/Background.tsx","../src/components/Separator.tsx","../src/components/Input.tsx","../src/utils/validation.ts","../src/components/Mobile.tsx","../src/components/Desktop.tsx"],"sourcesContent":["{\n \"colors\": {\n \"primary\": \"#aa3bff\",\n \"secondary\": \"#f4f3ec\",\n \"text\": \"#000000\",\n \"background\": \"#ffffff\",\n \"border\": \"#e5e4e7\",\n \"header\": {\n \"background\": \"#ffffff\",\n \"border\": \"#e5e4e7\"\n }\n },\n \"darkColors\": {\n \"primary\": \"#aa3bff\",\n \"secondary\": \"#f4f3ec\",\n \"text\": \"#ffffff\",\n \"background\": \"#0b0912\",\n \"border\": \"#2a2535\",\n \"header\": {\n \"background\": \"#0b0912\",\n \"border\": \"#2a2535\"\n }\n },\n \"darkMode\": false,\n \"text\": {\n \"title\": \"text-3xl font-bold text-text-h\",\n \"subtitle\": \"text-xl font-semibold text-text-h\",\n \"normal\": \"text-base font-normal text-text\",\n \"color\": \"text-text\",\n \"darkColor\": \"text-text-d\"\n }\n}\n","// Deep merge two objects, handling nested objects and arrays.\n// If a property is undefined in the overrides, it is not merged.\nexport const deepMerge = <T extends object>(base: T, overrides: Partial<T>): T => {\n const result: any = { ...base };\n for (const key of Object.keys(overrides) as (keyof T)[]) {\n const value = overrides[key];\n if (\n value &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n base[key] &&\n typeof base[key] === \"object\" &&\n !Array.isArray(base[key])\n ) {\n result[key] = deepMerge(base[key] as any, value as any);\n } else if (value !== undefined) {\n result[key] = value;\n }\n }\n return result as T;\n};","import {\n createContext,\n useContext,\n useMemo,\n useState,\n useCallback,\n useEffect,\n} from \"react\";\nimport defaultConfig from \"./theme.config.json\";\nimport type { ThemeConfig, ThemeContextValue, ThemeColors, ThemeTextClasses, ThemeProviderProps } from \"./types\";\nimport { deepMerge } from \"../utils/typeUtils\";\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null);\n\nexport function ThemeProvider({ children, config }: ThemeProviderProps) {\n const mergedInitial = useMemo(\n () => deepMerge(defaultConfig as ThemeConfig, config ?? {}),\n [config],\n ); \n\n const [colors, setColorsState] = useState<ThemeColors>(mergedInitial.colors);\n const [darkColors, setDarkColorsState] = useState<ThemeColors>(mergedInitial.darkColors);\n\n const [darkMode, setDarkModeState] = useState<boolean>(mergedInitial.darkMode);\n const [text, setTextState] = useState<ThemeTextClasses>(mergedInitial.text);\n\n const setColors = useCallback((partial: Partial<ThemeColors>) => {\n setColorsState((prev) => ({ ...prev, ...partial }));\n }, []);\n\n const setDarkColors = useCallback((partial: Partial<ThemeColors>) => {\n setDarkColorsState((prev) => ({ ...prev, ...partial }));\n }, []);\n\n const setDarkMode = useCallback((enabled: boolean) => {\n setDarkModeState(enabled);\n }, []);\n\n const setText = useCallback((partial: Partial<ThemeTextClasses>) => {\n setTextState((prev) => ({ ...prev, ...partial }));\n }, []);\n\n const setTheme = useCallback((partial: Partial<ThemeConfig>) => {\n if (partial.colors) setColorsState((prev) => ({ ...prev, ...partial.colors! }));\n if (partial.darkColors) setDarkColorsState((prev) => ({ ...prev, ...partial.darkColors! }));\n if (partial.darkMode !== undefined) setDarkModeState(partial.darkMode);\n if (partial.text) setTextState((prev) => ({ ...prev, ...partial.text! }));\n }, []);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n const root = document.documentElement;\n if (darkMode) {\n root.classList.add(\"dark\");\n } else {\n root.classList.remove(\"dark\");\n }\n root.style.setProperty(\"--theme-primary\", darkMode ? darkColors.primary : colors.primary);\n root.style.setProperty(\"--theme-secondary\", darkMode ? darkColors.secondary : colors.secondary);\n }, [colors, darkMode]);\n\n const value = useMemo<ThemeContextValue>(\n () => ({\n enabled: true,\n colors,\n darkColors,\n darkMode,\n text,\n setColors,\n setDarkColors,\n setDarkMode,\n setText,\n setTheme,\n }),\n [colors, darkMode, text, setColors, setDarkMode, setText, setTheme],\n );\n\n return (\n <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>\n );\n}\n\nexport function useTheme(): ThemeContextValue {\n const ctx = useContext(ThemeContext);\n if (!ctx) {\n return {\n enabled: false,\n colors: defaultConfig.colors as ThemeColors,\n darkColors: defaultConfig.darkColors as ThemeColors,\n darkMode: defaultConfig.darkMode,\n text: defaultConfig.text as ThemeTextClasses,\n setColors: () => {},\n setDarkMode: () => {},\n setText: () => {},\n setTheme: () => {},\n setDarkColors: () => {},\n };\n }\n return ctx;\n}\n\nexport { defaultConfig as themeConfig };\n","import { type ButtonHTMLAttributes, forwardRef, useMemo } from \"react\";\nimport { useTheme } from \"../theme/ThemeProvider\";\n\ntype Variant = \"primary\" | \"secondary\" | \"outline\" | \"ghost\";\ntype Size = \"sm\" | \"md\" | \"lg\";\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: Variant;\n size?: Size;\n}\n\nconst variantClasses: Record<Variant, string> = {\n primary:\n \"bg-accent text-white hover:bg-accent/90 focus-visible:ring-accent/50\",\n secondary:\n \"bg-code-bg text-text-h hover:bg-code-bg/80 focus-visible:ring-code-bg/50\",\n outline:\n \"border border-border bg-transparent text-text-h hover:bg-accent-bg hover:border-accent-border focus-visible:ring-accent/50\",\n ghost:\n \"bg-transparent text-text-h hover:bg-accent-bg focus-visible:ring-accent/50\",\n};\n\nconst sizeClasses: Record<Size, string> = {\n sm: \"px-3 py-1.5 text-sm gap-1.5\",\n md: \"px-5 py-2.5 text-base gap-2\",\n lg: \"px-7 py-3 text-lg gap-2.5\",\n};\n\nfunction hexToRgba(hex: string, alpha: number): string {\n const cleaned = hex.replace(\"#\", \"\");\n const full =\n cleaned.length === 3\n ? cleaned\n .split(\"\")\n .map((c) => c + c)\n .join(\"\")\n : cleaned;\n const num = parseInt(full, 16);\n const r = (num >> 16) & 0xff;\n const g = (num >> 8) & 0xff;\n const b = num & 0xff;\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button(\n { variant = \"primary\", size = \"md\", className = \"\", style, ...props },\n ref,\n) {\n const theme = useTheme();\n\n const themeStyle = useMemo<React.CSSProperties | undefined>(() => {\n if (!theme.enabled) return undefined;\n const primary = theme.colors.primary;\n const secondary = theme.colors.secondary;\n const primaryBg = hexToRgba(primary, 0.1);\n const primaryBorder = hexToRgba(primary, 0.5);\n const primaryRing = hexToRgba(primary, 0.5);\n\n switch (variant) {\n case \"primary\":\n return {\n backgroundColor: primary,\n color: \"#fff\",\n [\"--tw-ring-color\" as any]: primaryRing,\n };\n case \"secondary\":\n return {\n backgroundColor: secondary,\n color: \"#08060d\",\n };\n case \"outline\":\n return {\n borderColor: \"#e5e4e7\",\n backgroundColor: \"transparent\",\n color: \"#08060d\",\n [\"--hover-bg\" as any]: primaryBg,\n [\"--hover-border\" as any]: primaryBorder,\n [\"--tw-ring-color\" as any]: primaryRing,\n };\n case \"ghost\":\n default:\n return {\n backgroundColor: \"transparent\",\n color: \"#08060d\",\n [\"--hover-bg\" as any]: primaryBg,\n [\"--tw-ring-color\" as any]: primaryRing,\n };\n }\n }, [theme, variant]);\n\n const themeHoverClass =\n theme.enabled && variant === \"primary\"\n ? \"hover:brightness-110\"\n : theme.enabled && variant === \"outline\"\n ? \"hover:bg-[var(--hover-bg)] hover:border-[var(--hover-border)]\"\n : theme.enabled\n ? \"hover:bg-[var(--hover-bg)]\"\n : \"\";\n\n return (\n <button\n ref={ref}\n className={[\n \"inline-flex items-center justify-center font-medium rounded-lg\",\n \"transition-all duration-200 ease-in-out\",\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2\",\n \"disabled:opacity-50 disabled:pointer-events-none\",\n \"select-none\",\n variantClasses[variant],\n sizeClasses[size],\n themeHoverClass,\n className,\n ].join(\" \")}\n style={{ ...themeStyle, ...style }}\n {...props}\n />\n );\n});\n","//colors ------------------------------------------------------------------------------------------------\n\n// Convert a hex color to rgba components.\nexport function hexToRgba(hex: string, alpha: number): number[] {\n const cleaned = hex.replace(\"#\", \"\");\n const full =\n cleaned.length === 3\n ? cleaned\n .split(\"\")\n .map((c) => c + c)\n .join(\"\")\n : cleaned;\n const num = parseInt(full, 16);\n const r = (num >> 16) & 0xff;\n const g = (num >> 8) & 0xff;\n const b = num & 0xff;\n return [r, g, b, alpha];\n}\n\nexport function rgbaToString(components: number[]) {\n return `rgba(${components[0]}, ${components[1]}, ${components[2]}, ${components[3]})`;\n}\n\nexport function stringToRgba(str: string): number[] {\n const match = str.match(/rgba\\((\\d+), (\\d+), (\\d+), (\\d+\\.\\d+)\\)\\)/);\n if (!match) {\n throw new Error(\"Invalid rgba string\");\n }\n return match.slice(1).map(Number);\n}\n\n// rgb to hsl\nexport function rgbToHsl(components: number[]): number[] {\n let [r, g, b] = components;\n r /= 255;\n g /= 255;\n b /= 255;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const delta = max - min;\n let h = 0;\n let s = 0;\n let l = (max + min) / 2;\n\n if (delta !== 0) {\n // Saturación\n s = l > 0.5 ? delta / (2 - max - min) : delta / (max + min);\n\n // Tono\n switch (max) {\n case r:\n h = (g - b) / delta + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / delta + 2;\n break;\n case b:\n h = (r - g) / delta + 4;\n break;\n }\n h /= 6;\n }\n h = Math.round(h * 360),\n s = Math.round(s * 100),\n l = Math.round(l * 100)\n return [h, s, l];\n}\n\nexport function hslToRgb(components: number[]): number[] {\n let [h, s, l] = components;\n\n s /= 100;\n l /= 100;\n\n let r, g, b;\n\n if (s === 0) {\n // Caso acromático (es un tono de gris)\n r = g = b = l; \n } else {\n // Función auxiliar para calcular cada canal de color\n const hue2rgb = (p: number, q: number, t: number) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n\n // Calcular variables temporales q y p\n const q: number = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p: number = 2 * l - q;\n\n // Convertir el tono (h) a una fracción entre 0 y 1\n const hFrac: number = h / 360;\n\n // Calcular los tres canales independientes\n r = hue2rgb(p, q, hFrac + 1 / 3);\n g = hue2rgb(p, q, hFrac);\n b = hue2rgb(p, q, hFrac - 1 / 3);\n }\n\n \n r = Math.round(r * 255),\n g = Math.round(g * 255),\n b = Math.round(b * 255)\n return [r, g, b];\n}\n\nexport function hslToString(components: number[]) {\n return `hsl(${components[0]}, ${components[1]}, ${components[2]})`;\n}\n\nexport function stringToHsl(str: string): number[] {\n const match = str.match(/hsl\\((\\d+), (\\d+), (\\d+\\.\\d+)\\)\\)/);\n if (!match) {\n throw new Error(\"Invalid hsl string\");\n }\n return match.slice(1).map(Number);\n}\n\nexport function changeColorValue(hex: string, value: number): string {\n const rgba = hexToRgba(hex, 1);\n const hsl = rgbToHsl(rgba);\n const newHsl = [hsl[0], hsl[1], value];\n return hslToString(newHsl);\n}\n","import {\n type AnchorHTMLAttributes,\n type HTMLAttributes,\n type ImgHTMLAttributes,\n useEffect,\n useState,\n forwardRef,\n useMemo,\n} from \"react\";\nimport { useTheme } from \"../theme/ThemeProvider\";\nimport { hexToRgba } from \"../utils/utils\";\n\n//types -----------------------------------------------------------------------------\ntype Behaviour = \"default\" | \"sticky\" | \"hide\";\ntype Variant = \"default\" | \"blur\";\n\nexport interface HeaderProps extends HTMLAttributes<HTMLElement> {\n behaviour?: Behaviour;\n variant?: Variant;\n}\n\nexport interface HeaderLogoProps extends ImgHTMLAttributes<HTMLImageElement> {\n darkSrc?: string;\n}\n\nexport interface HeaderNavButtonProps\n extends AnchorHTMLAttributes<HTMLAnchorElement> {}\n\n//Header container -----------------------------------------------------------------------------\n\nconst behaviourContainerClasses: Record<Behaviour, string> = {\n default: \"\",\n sticky: \"sticky top-0 z-50\",\n hide: \"transition-transform duration-300 absolute top-0 left-0\",\n};\n\nconst headerVariantClasses: Record<Variant, string> = {\n default: \"\",\n blur: \"bg-white/10 backdrop-blur-sm\",\n};\n\nexport const Header = forwardRef<HTMLElement, HeaderProps>(function Header(\n { behaviour = \"default\", className = \"\", style, children, variant = \"default\", ...props },\n ref,\n) {\n const theme = useTheme();\n const [scrolled, setScrolled] = useState(false);\n const translateY = behaviour === \"hide\" && scrolled ? \"-100%\" : \"0\";\n //scroll event\n useEffect(() => {\n if (behaviour !== \"hide\") return;\n\n const handleScroll = () => {\n setScrolled(window.scrollY > 10);\n };\n\n handleScroll();\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n\n return () => window.removeEventListener(\"scroll\", handleScroll);\n }, [behaviour]);\n\n //get theme\n const themeStyle = useMemo<React.CSSProperties | undefined>(() => {\n if (!theme.enabled) return undefined;\n const bg = theme.darkMode ? theme.darkColors.header.background : theme.colors.header.background;\n const border = theme.darkMode ? theme.darkColors.header.border : theme.colors.header.border;\n\n return {\n backgroundColor: bg,\n borderBottom: `1px solid ${border}`,\n color: theme.darkMode ? theme.darkColors.text : theme.colors.text,\n };\n }, [theme]);\n\n return (\n <header\n ref={ref}\n className={[\n \"w-full h-16 px-12 py-2 flex items-center justify-between shadow-md shadow-gray-500/25\",\n behaviourContainerClasses[behaviour],\n headerVariantClasses[variant],\n className,\n ].join(\" \")}\n style={{ ...themeStyle, ...style, transform: `translateY(${translateY})` }}\n {...props}\n >\n {children}\n </header>\n );\n});\n\nexport const HeaderLogo = forwardRef<HTMLImageElement, HeaderLogoProps>(\n function HeaderLogo({ className = \"\", style, alt = \"\", darkSrc, ...props }, ref) {\n const theme = useTheme();\n\n const src = theme.darkMode && darkSrc ? darkSrc : props.src;\n\n return (\n <div className=\"h-full flex items-center justify-center shrink-0\">\n <img\n ref={ref}\n alt={alt}\n className=\"h-full max-h-12 w-auto object-contain\"\n style={{ aspectRatio: \"auto\", ...style }}\n {...props}\n src={src}\n />\n </div>\n );\n },\n);\n\nexport const HeaderNavButton = forwardRef<\n HTMLAnchorElement,\n HeaderNavButtonProps\n>(function HeaderNavButton(\n { className = \"\", style, children, ...props },\n ref,\n) {\n const theme = useTheme();\n\n const themeStyle = useMemo<React.CSSProperties | undefined>(() => {\n if (!theme.enabled) return undefined;\n const ringColor = hexToRgba(theme.colors.primary, 0.5);\n return {\n color: theme.darkMode ? \"#e8e4f0\" : \"#08060d\",\n [\"--tw-ring-color\" as any]: ringColor,\n [\"--hover-color\" as any]: theme.colors.primary,\n };\n }, [theme]);\n\n const themeHoverClass = theme.enabled ? \"hover:text-[var(--hover-color)]\" : \"\";\n\n const originalClass = theme.enabled ? \"\" : \"text-text-h hover:text-accent\";\n const originalRing = theme.enabled\n ? \"\"\n : \"focus-visible:ring-accent/50\";\n\n return (\n <a\n ref={ref}\n className={[\n \"inline-flex items-center justify-center\",\n \"px-3 py-2 text-sm font-medium\",\n originalClass,\n themeHoverClass,\n \"transition-colors duration-200 ease-in-out\",\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 rounded-md\",\n originalRing,\n \"select-none\",\n className,\n ].join(\" \")}\n style={{ ...themeStyle, ...style }}\n {...props}\n >\n {children}\n </a>\n );\n});\n\nexport const HeaderNamespace = Object.assign(Header, {\n Logo: HeaderLogo,\n NavButton: HeaderNavButton,\n});\n\nexport default HeaderNamespace;\n","import { type HTMLAttributes, forwardRef, useMemo } from \"react\";\nimport { useTheme } from \"../theme/ThemeProvider\";\nimport { hexToRgba, rgbaToString } from \"../utils/utils\";\n\n// types ----------------------------------------------------------------------------------------------\ntype Variant =\n | \"dots-grid\"\n | \"dots-isometric\"\n | \"grid\"\n | \"diamond\"\n | \"grid-45\"\n | \"lines\";\n\n type Mask = \"fade-in\" | \"fade-out\" | \"none\";\n\nexport interface BackgroundProps extends HTMLAttributes<HTMLDivElement> {\n variant?: Variant;\n mask?: Mask;\n color?: string;\n size?: number;\n}\n\n// styles ----------------------------------------------------------------------------------------------\nconst variantStyles: Record<\n Variant,\n (color: string, size: number) => React.CSSProperties\n> = {\n \"dots-grid\": (c, s) => ({\n backgroundImage: `radial-gradient(${c} 1.5px, transparent 1.5px)`,\n backgroundSize: `${s}px ${s}px`,\n }),\n \"dots-isometric\": (c, s) => ({\n backgroundImage: `\n radial-gradient(circle, ${c} 1px, transparent 1px),\n radial-gradient(circle, ${c} 1px, transparent 1px)\n `,\n backgroundSize: `${s}px ${s * 0.866}px`,\n backgroundPosition: `\n 0 0,\n ${s / 2}px ${s * 0.433}px\n `,\n }),\n grid: (c, s) => ({\n backgroundImage: `linear-gradient(${c} 2px, transparent 2px), linear-gradient(90deg, ${c} 2px, transparent 2px)`,\n backgroundSize: `${s}px ${s}px`,\n }),\n \"diamond\": (c, s) => {\n const diamondSize = 2.2;\n\n const svg = `\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n width=\"${s}\"\n height=\"${s * 0.866}\"\n viewBox=\"0 0 ${s} ${s * 0.866}\">\n <polygon\n points=\"\n ${s / 2},0\n ${s / 2 + diamondSize},${diamondSize}\n ${s / 2},${diamondSize * 2}\n ${s / 2 - diamondSize},${diamondSize}\n \"\n fill=\"${c}\"\n />\n </svg>\n `;\n\n return {\n backgroundImage: `url(\"data:image/svg+xml,${encodeURIComponent(svg)}\")`,\n backgroundSize: `${s}px ${s * 0.866}px`,\n };\n},\n \"grid-45\": (c, s) => ({\n backgroundImage: `\n linear-gradient(\n 45deg,\n transparent 49%,\n ${c} 49%,\n ${c} 51%,\n transparent 51%\n ),\n linear-gradient(\n -45deg,\n transparent 49%,\n ${c} 49%,\n ${c} 51%,\n transparent 51%\n )\n `,\n backgroundSize: `${s}px ${s}px`,\n }),\n lines: (c, s) => ({\n backgroundImage: `linear-gradient(${c} 1px, transparent 1px)`,\n backgroundSize: `${s}px ${s}px`,\n }),\n};\n\nconst maskStyles: Record<Mask, () => React.CSSProperties> = {\n \"fade-in\": () => ({\n maskImage: `\n radial-gradient(\n ellipse at center,\n rgba(0, 0, 0, 0.7) 0%,\n rgba(0, 0, 0, 0) 75%\n )\n `,\n WebkitMaskImage: `\n radial-gradient(\n ellipse at center,\n rgba(0, 0, 0, 0.7) 0%,\n rgba(0, 0, 0, 0) 75%\n )\n `,\n maskSize: \"100% 100%\",\n WebkitMaskSize: \"100% 100%\",\n maskRepeat: \"no-repeat\",\n WebkitMaskRepeat: \"no-repeat\",\n }),\n\n \"fade-out\": () => ({\n maskImage: `\n radial-gradient(\n ellipse at center,\n rgba(0, 0, 0, 0) 40%,\n rgba(0, 0, 0, 0.6) 100%\n )\n `,\n WebkitMaskImage: `\n radial-gradient(\n ellipse at center,\n rgba(0, 0, 0, 0) 40%,\n rgba(0, 0, 0, 0.6) 100%\n )\n `,\n maskSize: \"100% 100%\",\n WebkitMaskSize: \"100% 100%\",\n maskRepeat: \"no-repeat\",\n WebkitMaskRepeat: \"no-repeat\",\n }),\n none: () => ({\n }),\n};\n\n// component ----------------------------------------------------------------------------------------------\nexport const Background = forwardRef<HTMLDivElement, BackgroundProps>(\n function Background(\n {\n variant = \"dots-grid\",\n mask = \"none\",\n color,\n size = 24,\n className = \"\",\n style,\n children,\n ...props\n },\n ref,\n ) {\n const theme = useTheme();\n\n const resolvedColor = useMemo(() => {\n if (color) return color;\n if (theme.enabled) return rgbaToString(hexToRgba(theme.colors.primary, 0.25));\n return \"rgba(170, 59, 255, 0.25)\";\n }, [color, theme]);\n\n const bgStyles = useMemo<React.CSSProperties>(\n () => ({...variantStyles[variant](resolvedColor, size), ...maskStyles[mask]()}),\n [variant, mask, resolvedColor, size],\n );\n\n return (\n <div\n ref={ref}\n className={[\"w-full h-full relative overflow-hidden flex flex-col\", className].join(\n \" \",\n )}\n style={style}\n {...props}\n >\n <div\n aria-hidden\n className=\"absolute inset-0 -z-10 pointer-events-none\"\n style={bgStyles}\n />\n {children}\n </div>\n );\n },\n);\n\nexport default Background;\n","import { type HTMLAttributes, forwardRef, useMemo } from \"react\";\nimport { useTheme } from \"../theme/ThemeProvider\";\n\ntype Variant = \"line\" | \"point\";\ntype Orientation = \"horizontal\" | \"vertical\";\n\nexport interface SeparatorProps extends HTMLAttributes<HTMLDivElement> {\n variant?: Variant;\n orientation?: Orientation;\n color?: string;\n thickness?: number;\n spacing?: number;\n}\n\nexport const Separator = forwardRef<HTMLDivElement, SeparatorProps>(\n function Separator(\n {\n variant = \"line\",\n orientation = \"horizontal\",\n color,\n thickness = 1,\n spacing = 16,\n className = \"\",\n style,\n ...props\n },\n ref,\n ) {\n const theme = useTheme();\n\n const resolvedColor = useMemo(() => {\n if (color) return color;\n if (theme.enabled) return theme.darkMode ? \"#2a2535\" : \"#e5e4e7\";\n return \"#e5e4e7\";\n }, [color, theme]);\n\n const isHorizontal = orientation === \"horizontal\";\n\n if (variant === \"point\") {\n const paddingStyle = isHorizontal\n ? { paddingTop: spacing, paddingBottom: spacing }\n : { paddingLeft: spacing, paddingRight: spacing };\n\n return (\n <div\n ref={ref}\n className={[\n \"flex items-center justify-center shrink-0\",\n isHorizontal ? \"w-full\" : \"h-full\",\n className,\n ].join(\" \")}\n style={{ ...paddingStyle, ...style }}\n {...props}\n >\n <span\n aria-hidden\n className=\"rounded-full shrink-0\"\n style={{\n width: thickness * 4,\n height: thickness * 4,\n backgroundColor: resolvedColor,\n }}\n />\n </div>\n );\n }\n\n const dimStyle = isHorizontal\n ? {\n height: thickness,\n backgroundColor: resolvedColor,\n marginTop: spacing,\n marginBottom: spacing,\n }\n : {\n width: thickness,\n backgroundColor: resolvedColor,\n marginLeft: spacing,\n marginRight: spacing,\n };\n\n return (\n <div\n ref={ref}\n role=\"separator\"\n aria-orientation={orientation}\n className={[\n \"shrink-0\",\n isHorizontal ? \"w-full\" : \"h-full\",\n className,\n ].join(\" \")}\n style={{ ...dimStyle, ...style }}\n {...props}\n />\n );\n },\n);\n\nexport default Separator;\n","import {\n type InputHTMLAttributes,\n forwardRef,\n useMemo,\n type ReactNode,\n} from \"react\";\nimport { useTheme } from \"../theme/ThemeProvider\";\n\ntype Variant = \"default\" | \"filled\" | \"underline\";\ntype Size = \"sm\" | \"md\" | \"lg\";\n\nexport interface InputProps extends InputHTMLAttributes<HTMLInputElement> {\n variant?: Variant;\n Isize?: Size;\n error?: boolean;\n leftIcon?: ReactNode;\n rightIcon?: ReactNode;\n wrapperClassName?: string;\n}\n\nconst sizeClasses: Record<Size, string> = {\n sm: \"h-8 px-3 text-sm\",\n md: \"h-10 px-4 text-base\",\n lg: \"h-12 px-5 text-lg\",\n};\n\nconst sizePaddingWithIcon: Record<Size, string> = {\n sm: \"pl-9 pr-3\",\n md: \"pl-11 pr-4\",\n lg: \"pl-13 pr-5\",\n};\n\nconst sizePaddingWithRightIcon: Record<Size, string> = {\n sm: \"pl-3 pr-9\",\n md: \"pl-4 pr-11\",\n lg: \"pl-5 pr-13\",\n};\n\nconst sizePaddingWithBothIcons: Record<Size, string> = {\n sm: \"pl-9 pr-9\",\n md: \"pl-11 pr-11\",\n lg: \"pl-13 pr-13\",\n};\n\nconst iconSizeClasses: Record<Size, string> = {\n sm: \"w-4 h-4 left-2.5\",\n md: \"w-5 h-5 left-3\",\n lg: \"w-6 h-6 left-4\",\n};\n\nconst rightIconSizeClasses: Record<Size, string> = {\n sm: \"w-4 h-4 right-2.5\",\n md: \"w-5 h-5 right-3\",\n lg: \"w-6 h-6 right-4\",\n};\n\nfunction hexToRgba(hex: string, alpha: number): string {\n const cleaned = hex.replace(\"#\", \"\");\n const full =\n cleaned.length === 3\n ? cleaned\n .split(\"\")\n .map((c) => c + c)\n .join(\"\")\n : cleaned;\n const num = parseInt(full, 16);\n const r = (num >> 16) & 0xff;\n const g = (num >> 8) & 0xff;\n const b = num & 0xff;\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(function Input(\n {\n variant = \"default\",\n Isize = \"md\",\n error = false,\n leftIcon,\n rightIcon,\n className = \"\",\n wrapperClassName = \"\",\n style,\n disabled,\n ...props\n },\n ref,\n) {\n const theme = useTheme();\n\n const baseWrapperClasses = \"relative w-full flex items-center\";\n\n const variantWrapperStyles = useMemo<React.CSSProperties | undefined>(() => {\n if (!theme.enabled) return undefined;\n const primary = theme.colors.primary;\n const border = theme.darkMode ? \"#2a2535\" : \"#e5e4e7\";\n const filledBg = theme.darkMode ? \"#14111f\" : \"#f5f5f7\";\n const errorBorder = \"#ef4444\";\n\n const base: React.CSSProperties = {\n borderRadius: variant === \"underline\" ? 0 : 8,\n };\n\n switch (variant) {\n case \"filled\":\n return {\n ...base,\n backgroundColor: filledBg,\n borderBottom: `2px solid ${error ? errorBorder : \"transparent\"}`,\n [\"--focus-border\" as any]: error ? errorBorder : primary,\n [\"--ring-color\" as any]: hexToRgba(error ? errorBorder : primary, 0.5),\n };\n case \"underline\":\n return {\n ...base,\n backgroundColor: \"transparent\",\n borderBottom: `1.5px solid ${error ? errorBorder : border}`,\n [\"--focus-border\" as any]: error ? errorBorder : primary,\n [\"--ring-color\" as any]: hexToRgba(error ? errorBorder : primary, 0.5),\n };\n case \"default\":\n default:\n return {\n ...base,\n backgroundColor: theme.darkMode ? \"#0b0912\" : \"#ffffff\",\n border: `1px solid ${error ? errorBorder : border}`,\n [\"--focus-border\" as any]: error ? errorBorder : primary,\n [\"--ring-color\" as any]: hexToRgba(error ? errorBorder : primary, 0.5),\n };\n }\n }, [theme, variant, error]);\n\n const variantWrapperClass = useMemo(() => {\n if (theme.enabled) {\n if (variant === \"underline\") {\n return \"focus-within:border-b-[2px] focus-within:border-b-[var(--focus-border)]\";\n }\n return \"focus-within:ring-2 focus-within:ring-[var(--ring-color)] focus-within:ring-offset-0 focus-within:border-[var(--focus-border)]\";\n }\n\n if (variant === \"underline\") {\n return error\n ? \"border-b-2 border-b-red-500 focus-within:border-b-accent\"\n : \"border-b border-border focus-within:border-b-2 focus-within:border-b-accent\";\n }\n\n const ringClass =\n \"focus-within:ring-2 focus-within:ring-accent/50 focus-within:ring-offset-0\";\n\n switch (variant) {\n case \"filled\":\n return error\n ? `bg-code-bg border-b-2 border-b-red-500 ${ringClass} focus-within:border-b-accent`\n : `bg-code-bg border-b-2 border-b-transparent ${ringClass} focus-within:border-b-accent`;\n case \"default\":\n default:\n return error\n ? `bg-bg border border-red-500 rounded-lg ${ringClass} focus-within:border-accent`\n : `bg-bg border border-border rounded-lg ${ringClass} focus-within:border-accent`;\n }\n }, [theme, variant, error]);\n\n const inputSizeClass =\n leftIcon && rightIcon\n ? sizePaddingWithBothIcons[Isize]\n : leftIcon\n ? sizePaddingWithIcon[Isize]\n : rightIcon\n ? sizePaddingWithRightIcon[Isize]\n : sizeClasses[Isize];\n\n const inputVariantClass =\n variant === \"underline\" ? \"bg-transparent rounded-none\" : \"rounded-lg\";\n\n const themeInputStyle = useMemo<React.CSSProperties | undefined>(() => {\n if (!theme.enabled) return undefined;\n const textColor = theme.darkMode ? \"#e8e4f0\" : \"#08060d\";\n const placeholderColor = hexToRgba(\n theme.darkMode ? \"#908a9e\" : \"#706a7c\",\n 1,\n );\n return {\n color: textColor,\n [\"--placeholder-color\" as any]: placeholderColor,\n backgroundColor: \"transparent\",\n };\n }, [theme]);\n\n const themeInputPlaceholderClass = theme.enabled\n ? \"placeholder:text-[color:var(--placeholder-color)]\"\n : \"placeholder:text-text-muted\";\n\n return (\n <div\n className={[\n baseWrapperClasses,\n variantWrapperClass,\n disabled ? \"opacity-50 cursor-not-allowed\" : \"\",\n wrapperClassName,\n ].join(\" \")}\n style={variantWrapperStyles}\n >\n {leftIcon && (\n <span\n aria-hidden\n className={[\n \"absolute text-text-muted pointer-events-none shrink-0\",\n iconSizeClasses[Isize],\n ].join(\" \")}\n >\n {leftIcon}\n </span>\n )}\n\n <input\n ref={ref}\n disabled={disabled}\n className={[\n \"w-full h-full outline-none bg-transparent font-normal\",\n \"transition-all duration-200 ease-in-out\",\n \"disabled:cursor-not-allowed\",\n inputSizeClass,\n inputVariantClass,\n themeInputPlaceholderClass,\n className,\n ].join(\" \")}\n style={{ ...themeInputStyle, ...style }}\n {...props}\n />\n\n {rightIcon && (\n <span\n aria-hidden\n className={[\n \"absolute text-text-muted pointer-events-none shrink-0\",\n rightIconSizeClasses[Isize],\n ].join(\" \")}\n >\n {rightIcon}\n </span>\n )}\n </div>\n );\n});\n","export interface ValidationResult {\n valid: boolean;\n message: string;\n}\n\nexport type Validator = (value: unknown) => ValidationResult;\n\nconst isNumericString = (v: unknown): v is string =>\n typeof v === \"string\" && v.trim() !== \"\" && !isNaN(Number(v));\n\nconst toNumber = (v: unknown): number | null => {\n if (typeof v === \"number\") return isNaN(v) ? null : v;\n if (isNumericString(v)) return Number(v);\n return null;\n};\n\nexport const validators: Record<string, (...args: any[]) => Validator> = {\n email: () => (value: unknown): ValidationResult => {\n const str = String(value ?? \"\");\n const re = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return re.test(str)\n ? { valid: true, message: \"\" }\n : { valid: false, message: \"El valor no es un correo válido\" };\n },\n\n onlyNumbers: () => (value: unknown): ValidationResult => {\n const str = String(value ?? \"\");\n return /^\\d+$/.test(str)\n ? { valid: true, message: \"\" }\n : { valid: false, message: \"El valor debe contener solo números\" };\n },\n\n min: (n: number) => (value: unknown): ValidationResult => {\n const num = toNumber(value);\n if (num !== null) {\n return num >= n\n ? { valid: true, message: \"\" }\n : { valid: false, message: `El valor debe ser mayor o igual a ${n}` };\n }\n const len = String(value ?? \"\").length;\n return len >= n\n ? { valid: true, message: \"\" }\n : { valid: false, message: `La longitud debe ser al menos ${n}` };\n },\n\n max: (n: number) => (value: unknown): ValidationResult => {\n const num = toNumber(value);\n if (num !== null) {\n return num <= n\n ? { valid: true, message: \"\" }\n : { valid: false, message: `El valor debe ser menor o igual a ${n}` };\n }\n const len = String(value ?? \"\").length;\n return len <= n\n ? { valid: true, message: \"\" }\n : { valid: false, message: `La longitud debe ser como máximo ${n}` };\n },\n};\n\nexport class Validate {\n private checks: Validator[] = [];\n\n private add(fn: Validator): this {\n this.checks.push(fn);\n return this;\n }\n\n static email(): Validate {\n return new Validate().email();\n }\n\n static onlyNumbers(): Validate {\n return new Validate().onlyNumbers();\n }\n\n static min(n: number): Validate {\n return new Validate().min(n);\n }\n\n static max(n: number): Validate {\n return new Validate().max(n);\n }\n\n email(): this {\n return this.add(validators.email());\n }\n\n onlyNumbers(): this {\n return this.add(validators.onlyNumbers());\n }\n\n min(n: number): this {\n return this.add(validators.min(n));\n }\n\n max(n: number): this {\n return this.add(validators.max(n));\n }\n\n validate(value: unknown): ValidationResult {\n for (const check of this.checks) {\n const result = check(value);\n if (!result.valid) {\n return result;\n }\n }\n return { valid: true, message: \"\" };\n }\n}\n\nexport default Validate;\n","import { useState, useEffect, type ReactNode } from 'react';\n\ninterface MobilePortraitOnlyProps {\n children: ReactNode;\n}\n\nconst MobileOnly = ({ children }: MobilePortraitOnlyProps) => {\n const [isMobilePortrait, setIsMobilePortrait] = useState(false);\n\n useEffect(() => {\n const checkMobilePortrait = () => {\n const isPortrait = window.innerHeight > window.innerWidth;\n setIsMobilePortrait(isPortrait);\n };\n\n checkMobilePortrait();\n window.addEventListener('resize', checkMobilePortrait);\n \n return () => window.removeEventListener('resize', checkMobilePortrait);\n }, []);\n\n return isMobilePortrait ? <>{children}</> : null;\n};\n\nexport { MobileOnly };","import type { ReactNode } from \"react\";\nimport { useState, useEffect } from 'react';\n\ninterface NonMobilePortraitOnlyProps {\n children: ReactNode;\n}\n\nconst DesktopOnly = ({ children }: NonMobilePortraitOnlyProps) => {\n const [isNonMobilePortrait, setIsNonMobilePortrait] = useState(false);\n\n useEffect(() => {\n const checkNonMobilePortrait = () => {\n const isPortrait = window.innerHeight > window.innerWidth;\n setIsNonMobilePortrait(!isPortrait);\n };\n\n checkNonMobilePortrait();\n window.addEventListener('resize', checkNonMobilePortrait);\n \n return () => window.removeEventListener('resize', checkNonMobilePortrait);\n }, []);\n\n return isNonMobilePortrait ? <>{children}</> : null;\n};\n\nexport { DesktopOnly };\n"],"mappings":"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"}
1
+ {"version":3,"file":"unicornial-ui.umd.js","names":[],"sources":["../src/theme/theme.config.json","../src/utils/typeUtils.ts","../src/theme/ThemeProvider.tsx","../src/utils/utils.ts","../src/components/Header.tsx","../src/components/Background.tsx","../src/components/Separator.tsx","../src/components/Surface.tsx","../src/components/Form.tsx","../src/components/Input.tsx","../src/hooks/useDebounce.tsx","../src/components/UnicornialInput.tsx","../src/components/Button.tsx","../src/components/Mobile.tsx","../src/components/Desktop.tsx","../src/utils/validators.ts","../src/utils/validation.ts"],"sourcesContent":["{\n \"colors\": {\n \"primary\": \"#aa3bff\",\n \"secondary\": \"#f4f3ec\",\n \"text\": \"#000000\",\n \"background\": \"#ffffff\",\n \"border\": \"#e5e4e7\",\n \"header\": {\n \"background\": \"#ffffff\",\n \"border\": \"#e5e4e7\"\n }\n },\n \"darkColors\": {\n \"primary\": \"#aa3bff\",\n \"secondary\": \"#f4f3ec\",\n \"text\": \"#ffffff\",\n \"background\": \"#0b0912\",\n \"border\": \"#2a2535\",\n \"header\": {\n \"background\": \"#0b0912\",\n \"border\": \"#2a2535\"\n }\n },\n \"darkMode\": false,\n \"text\": {\n \"title\": \"text-3xl font-bold text-text-h\",\n \"subtitle\": \"text-xl font-semibold text-text-h\",\n \"normal\": \"text-base font-normal text-text\",\n \"color\": \"text-text\",\n \"darkColor\": \"text-text-d\"\n }\n}\n","// Deep merge two objects, handling nested objects and arrays.\n// If a property is undefined in the overrides, it is not merged.\nexport const deepMerge = <T extends object>(base: T, overrides: Partial<T>): T => {\n const result: any = { ...base };\n for (const key of Object.keys(overrides) as (keyof T)[]) {\n const value = overrides[key];\n if (\n value &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n base[key] &&\n typeof base[key] === \"object\" &&\n !Array.isArray(base[key])\n ) {\n result[key] = deepMerge(base[key] as any, value as any);\n } else if (value !== undefined) {\n result[key] = value;\n }\n }\n return result as T;\n};","import { createContext, useContext, useMemo, useState, useCallback, useEffect } from \"react\";\nimport defaultConfig from \"./theme.config.json\";\nimport type {\n ThemeConfig,\n ThemeContextValue,\n ThemeColors,\n ThemeTextClasses,\n ThemeProviderProps,\n} from \"./types\";\nimport { deepMerge } from \"../utils/typeUtils\";\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null);\n\nexport function ThemeProvider({ children, config }: ThemeProviderProps) {\n const mergedInitial = useMemo(\n () => deepMerge(defaultConfig as ThemeConfig, config ?? {}),\n [config],\n );\n\n const [colors, setColorsState] = useState<ThemeColors>(mergedInitial.colors);\n const [darkColors, setDarkColorsState] = useState<ThemeColors>(mergedInitial.darkColors);\n\n const [darkMode, setDarkModeState] = useState<boolean>(mergedInitial.darkMode);\n const [text, setTextState] = useState<ThemeTextClasses>(mergedInitial.text);\n\n const setColors = useCallback((partial: Partial<ThemeColors>) => {\n setColorsState((prev) => ({ ...prev, ...partial }));\n }, []);\n\n const setDarkColors = useCallback((partial: Partial<ThemeColors>) => {\n setDarkColorsState((prev) => ({ ...prev, ...partial }));\n }, []);\n\n const setDarkMode = useCallback((enabled: boolean) => {\n setDarkModeState(enabled);\n }, []);\n\n const setText = useCallback((partial: Partial<ThemeTextClasses>) => {\n setTextState((prev) => ({ ...prev, ...partial }));\n }, []);\n\n const setTheme = useCallback((partial: Partial<ThemeConfig>) => {\n if (partial.colors) setColorsState((prev) => ({ ...prev, ...partial.colors! }));\n if (partial.darkColors) setDarkColorsState((prev) => ({ ...prev, ...partial.darkColors! }));\n if (partial.darkMode !== undefined) setDarkModeState(partial.darkMode);\n if (partial.text) setTextState((prev) => ({ ...prev, ...partial.text! }));\n }, []);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n const root = document.documentElement;\n if (darkMode) {\n root.classList.add(\"dark\");\n } else {\n root.classList.remove(\"dark\");\n }\n root.style.setProperty(\"--theme-primary\", darkMode ? darkColors.primary : colors.primary);\n root.style.setProperty(\"--theme-secondary\", darkMode ? darkColors.secondary : colors.secondary);\n }, [colors, darkMode, darkColors]);\n\n const value = useMemo<ThemeContextValue>(\n () => ({\n enabled: true,\n colors,\n darkColors,\n darkMode,\n text,\n setColors,\n setDarkColors,\n setDarkMode,\n setText,\n setTheme,\n }),\n [colors, darkMode, darkColors, text, setColors, setDarkMode, setDarkColors, setText, setTheme],\n );\n\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>;\n}\n\nexport function useTheme(): ThemeContextValue {\n const ctx = useContext(ThemeContext);\n if (!ctx) {\n return {\n enabled: false,\n colors: defaultConfig.colors as ThemeColors,\n darkColors: defaultConfig.darkColors as ThemeColors,\n darkMode: defaultConfig.darkMode,\n text: defaultConfig.text as ThemeTextClasses,\n setColors: () => {},\n setDarkMode: () => {},\n setText: () => {},\n setTheme: () => {},\n setDarkColors: () => {},\n };\n }\n return ctx;\n}\n\nexport { defaultConfig as themeConfig };\n","//colors ------------------------------------------------------------------------------------------------\n\n// Convert a hex color to rgba components.\nexport function hexToRgba(hex: string, alpha: number): number[] {\n const cleaned = hex.replace(\"#\", \"\");\n const full =\n cleaned.length === 3\n ? cleaned\n .split(\"\")\n .map((c) => c + c)\n .join(\"\")\n : cleaned;\n const num = parseInt(full, 16);\n const r = (num >> 16) & 0xff;\n const g = (num >> 8) & 0xff;\n const b = num & 0xff;\n return [r, g, b, alpha];\n}\n\nexport function rgbaToString(components: number[]) {\n return `rgba(${components[0]}, ${components[1]}, ${components[2]}, ${components[3]})`;\n}\n\nexport function stringToRgba(str: string): number[] {\n const match = str.match(/rgba\\((\\d+), (\\d+), (\\d+), (\\d+\\.\\d+)\\)\\)/);\n if (!match) {\n throw new Error(\"Invalid rgba string\");\n }\n return match.slice(1).map(Number);\n}\n\n// rgb to hsl\nexport function rgbToHsl(components: number[]): number[] {\n let [r, g, b] = components;\n r /= 255;\n g /= 255;\n b /= 255;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const delta = max - min;\n let h = 0;\n let s = 0;\n let l = (max + min) / 2;\n\n if (delta !== 0) {\n // Saturación\n s = l > 0.5 ? delta / (2 - max - min) : delta / (max + min);\n\n // Tono\n switch (max) {\n case r:\n h = (g - b) / delta + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / delta + 2;\n break;\n case b:\n h = (r - g) / delta + 4;\n break;\n }\n h /= 6;\n }\n h = Math.round(h * 360),\n s = Math.round(s * 100),\n l = Math.round(l * 100)\n return [h, s, l];\n}\n\nexport function hslToRgb(components: number[]): number[] {\n let [h, s, l] = components;\n\n s /= 100;\n l /= 100;\n\n let r, g, b;\n\n if (s === 0) {\n // Caso acromático (es un tono de gris)\n r = g = b = l; \n } else {\n // Función auxiliar para calcular cada canal de color\n const hue2rgb = (p: number, q: number, t: number) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n\n // Calcular variables temporales q y p\n const q: number = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p: number = 2 * l - q;\n\n // Convertir el tono (h) a una fracción entre 0 y 1\n const hFrac: number = h / 360;\n\n // Calcular los tres canales independientes\n r = hue2rgb(p, q, hFrac + 1 / 3);\n g = hue2rgb(p, q, hFrac);\n b = hue2rgb(p, q, hFrac - 1 / 3);\n }\n\n \n r = Math.round(r * 255),\n g = Math.round(g * 255),\n b = Math.round(b * 255)\n return [r, g, b];\n}\n\nexport function hslToString(components: number[]) {\n return `hsl(${components[0]}, ${components[1]}, ${components[2]})`;\n}\n\nexport function stringToHsl(str: string): number[] {\n const match = str.match(/hsl\\((\\d+), (\\d+), (\\d+\\.\\d+)\\)\\)/);\n if (!match) {\n throw new Error(\"Invalid hsl string\");\n }\n return match.slice(1).map(Number);\n}\n\nexport function changeColorValue(hex: string, value: number): string {\n const rgba = hexToRgba(hex, 1);\n const hsl = rgbToHsl(rgba);\n const newHsl = [hsl[0], hsl[1], value];\n return hslToString(newHsl);\n}\n","import {\n type AnchorHTMLAttributes,\n type HTMLAttributes,\n type ImgHTMLAttributes,\n useEffect,\n useState,\n forwardRef,\n useMemo,\n} from \"react\";\nimport { useTheme } from \"../theme/ThemeProvider\";\nimport { hexToRgba } from \"../utils/utils\";\n\n//types -----------------------------------------------------------------------------\ntype Behaviour = \"default\" | \"sticky\" | \"hide\";\ntype Variant = \"default\" | \"blur\";\n\nexport interface HeaderProps extends HTMLAttributes<HTMLElement> {\n behaviour?: Behaviour;\n variant?: Variant;\n}\n\nexport interface HeaderLogoProps extends ImgHTMLAttributes<HTMLImageElement> {\n darkSrc?: string;\n}\n\nexport interface HeaderNavButtonProps\n extends AnchorHTMLAttributes<HTMLAnchorElement> {}\n\n//Header container -----------------------------------------------------------------------------\n\nconst behaviourContainerClasses: Record<Behaviour, string> = {\n default: \"\",\n sticky: \"sticky top-0 z-50\",\n hide: \"transition-transform duration-300 absolute top-0 left-0\",\n};\n\nconst headerVariantClasses: Record<Variant, string> = {\n default: \"\",\n blur: \"bg-white/10 backdrop-blur-sm\",\n};\n\nexport const Header = forwardRef<HTMLElement, HeaderProps>(function Header(\n { behaviour = \"default\", className = \"\", style, children, variant = \"default\", ...props },\n ref,\n) {\n const theme = useTheme();\n const [scrolled, setScrolled] = useState(false);\n const translateY = behaviour === \"hide\" && scrolled ? \"-100%\" : \"0\";\n //scroll event\n useEffect(() => {\n if (behaviour !== \"hide\") return;\n\n const handleScroll = () => {\n setScrolled(window.scrollY > 10);\n };\n\n handleScroll();\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n\n return () => window.removeEventListener(\"scroll\", handleScroll);\n }, [behaviour]);\n\n //get theme\n const themeStyle = useMemo<React.CSSProperties | undefined>(() => {\n if (!theme.enabled) return undefined;\n const bg = theme.darkMode ? theme.darkColors.header.background : theme.colors.header.background;\n const border = theme.darkMode ? theme.darkColors.header.border : theme.colors.header.border;\n\n return {\n backgroundColor: bg,\n borderBottom: `1px solid ${border}`,\n color: theme.darkMode ? theme.darkColors.text : theme.colors.text,\n };\n }, [theme]);\n\n return (\n <header\n ref={ref}\n className={[\n \"w-full h-16 px-12 py-2 flex items-center justify-between shadow-md shadow-gray-500/25\",\n behaviourContainerClasses[behaviour],\n headerVariantClasses[variant],\n className,\n ].join(\" \")}\n style={{ ...themeStyle, ...style, transform: `translateY(${translateY})` }}\n {...props}\n >\n {children}\n </header>\n );\n});\n\nexport const HeaderLogo = forwardRef<HTMLImageElement, HeaderLogoProps>(\n function HeaderLogo({ className = \"\", style, alt = \"\", darkSrc, ...props }, ref) {\n const theme = useTheme();\n\n const src = theme.darkMode && darkSrc ? darkSrc : props.src;\n\n return (\n <div className=\"h-full flex items-center justify-center shrink-0\">\n <img\n ref={ref}\n alt={alt}\n className=\"h-full max-h-12 w-auto object-contain\"\n style={{ aspectRatio: \"auto\", ...style }}\n {...props}\n src={src}\n />\n </div>\n );\n },\n);\n\nexport const HeaderNavButton = forwardRef<\n HTMLAnchorElement,\n HeaderNavButtonProps\n>(function HeaderNavButton(\n { className = \"\", style, children, ...props },\n ref,\n) {\n const theme = useTheme();\n\n const themeStyle = useMemo<React.CSSProperties | undefined>(() => {\n if (!theme.enabled) return undefined;\n const ringColor = hexToRgba(theme.colors.primary, 0.5);\n return {\n color: theme.darkMode ? \"#e8e4f0\" : \"#08060d\",\n [\"--tw-ring-color\" as any]: ringColor,\n [\"--hover-color\" as any]: theme.colors.primary,\n };\n }, [theme]);\n\n const themeHoverClass = theme.enabled ? \"hover:text-[var(--hover-color)]\" : \"\";\n\n const originalClass = theme.enabled ? \"\" : \"text-text-h hover:text-accent\";\n const originalRing = theme.enabled\n ? \"\"\n : \"focus-visible:ring-accent/50\";\n\n return (\n <a\n ref={ref}\n className={[\n \"inline-flex items-center justify-center\",\n \"px-3 py-2 text-sm font-medium\",\n originalClass,\n themeHoverClass,\n \"transition-colors duration-200 ease-in-out\",\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 rounded-md\",\n originalRing,\n \"select-none\",\n className,\n ].join(\" \")}\n style={{ ...themeStyle, ...style }}\n {...props}\n >\n {children}\n </a>\n );\n});\n\nexport const HeaderNamespace = Object.assign(Header, {\n Logo: HeaderLogo,\n NavButton: HeaderNavButton,\n});\n\nexport default HeaderNamespace;\n","import { type HTMLAttributes, forwardRef, useMemo } from \"react\";\nimport { useTheme } from \"../theme/ThemeProvider\";\nimport { hexToRgba, rgbaToString } from \"../utils/utils\";\n\n// types ----------------------------------------------------------------------------------------------\ntype Variant =\n | \"dots-grid\"\n | \"dots-isometric\"\n | \"grid\"\n | \"diamond\"\n | \"grid-45\"\n | \"lines\";\n\n type Mask = \"fade-in\" | \"fade-out\" | \"none\";\n\nexport interface BackgroundProps extends HTMLAttributes<HTMLDivElement> {\n variant?: Variant;\n mask?: Mask;\n color?: string;\n size?: number;\n}\n\n// styles ----------------------------------------------------------------------------------------------\nconst variantStyles: Record<\n Variant,\n (color: string, size: number) => React.CSSProperties\n> = {\n \"dots-grid\": (c, s) => ({\n backgroundImage: `radial-gradient(${c} 1.5px, transparent 1.5px)`,\n backgroundSize: `${s}px ${s}px`,\n }),\n \"dots-isometric\": (c, s) => ({\n backgroundImage: `\n radial-gradient(circle, ${c} 1px, transparent 1px),\n radial-gradient(circle, ${c} 1px, transparent 1px)\n `,\n backgroundSize: `${s}px ${s * 0.866}px`,\n backgroundPosition: `\n 0 0,\n ${s / 2}px ${s * 0.433}px\n `,\n }),\n grid: (c, s) => ({\n backgroundImage: `linear-gradient(${c} 2px, transparent 2px), linear-gradient(90deg, ${c} 2px, transparent 2px)`,\n backgroundSize: `${s}px ${s}px`,\n }),\n \"diamond\": (c, s) => {\n const diamondSize = 2.2;\n\n const svg = `\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n width=\"${s}\"\n height=\"${s * 0.866}\"\n viewBox=\"0 0 ${s} ${s * 0.866}\">\n <polygon\n points=\"\n ${s / 2},0\n ${s / 2 + diamondSize},${diamondSize}\n ${s / 2},${diamondSize * 2}\n ${s / 2 - diamondSize},${diamondSize}\n \"\n fill=\"${c}\"\n />\n </svg>\n `;\n\n return {\n backgroundImage: `url(\"data:image/svg+xml,${encodeURIComponent(svg)}\")`,\n backgroundSize: `${s}px ${s * 0.866}px`,\n };\n},\n \"grid-45\": (c, s) => ({\n backgroundImage: `\n linear-gradient(\n 45deg,\n transparent 49%,\n ${c} 49%,\n ${c} 51%,\n transparent 51%\n ),\n linear-gradient(\n -45deg,\n transparent 49%,\n ${c} 49%,\n ${c} 51%,\n transparent 51%\n )\n `,\n backgroundSize: `${s}px ${s}px`,\n }),\n lines: (c, s) => ({\n backgroundImage: `linear-gradient(${c} 1px, transparent 1px)`,\n backgroundSize: `${s}px ${s}px`,\n }),\n};\n\nconst maskStyles: Record<Mask, () => React.CSSProperties> = {\n \"fade-in\": () => ({\n maskImage: `\n radial-gradient(\n ellipse at center,\n rgba(0, 0, 0, 0.7) 0%,\n rgba(0, 0, 0, 0) 75%\n )\n `,\n WebkitMaskImage: `\n radial-gradient(\n ellipse at center,\n rgba(0, 0, 0, 0.7) 0%,\n rgba(0, 0, 0, 0) 75%\n )\n `,\n maskSize: \"100% 100%\",\n WebkitMaskSize: \"100% 100%\",\n maskRepeat: \"no-repeat\",\n WebkitMaskRepeat: \"no-repeat\",\n }),\n\n \"fade-out\": () => ({\n maskImage: `\n radial-gradient(\n ellipse at center,\n rgba(0, 0, 0, 0) 40%,\n rgba(0, 0, 0, 0.6) 100%\n )\n `,\n WebkitMaskImage: `\n radial-gradient(\n ellipse at center,\n rgba(0, 0, 0, 0) 40%,\n rgba(0, 0, 0, 0.6) 100%\n )\n `,\n maskSize: \"100% 100%\",\n WebkitMaskSize: \"100% 100%\",\n maskRepeat: \"no-repeat\",\n WebkitMaskRepeat: \"no-repeat\",\n }),\n none: () => ({\n }),\n};\n\n// component ----------------------------------------------------------------------------------------------\nexport const Background = forwardRef<HTMLDivElement, BackgroundProps>(\n function Background(\n {\n variant = \"dots-grid\",\n mask = \"none\",\n color,\n size = 24,\n className = \"\",\n style,\n children,\n ...props\n },\n ref,\n ) {\n const theme = useTheme();\n\n const resolvedColor = useMemo(() => {\n if (color) return color;\n if (theme.enabled) return rgbaToString(hexToRgba(theme.colors.primary, 0.25));\n return \"rgba(170, 59, 255, 0.25)\";\n }, [color, theme]);\n\n const bgStyles = useMemo<React.CSSProperties>(\n () => ({...variantStyles[variant](resolvedColor, size), ...maskStyles[mask]()}),\n [variant, mask, resolvedColor, size],\n );\n\n return (\n <div\n ref={ref}\n className={[\"w-full h-full relative overflow-hidden flex flex-col\", className].join(\n \" \",\n )}\n style={style}\n {...props}\n >\n <div\n aria-hidden\n className=\"absolute inset-0 -z-10 pointer-events-none\"\n style={bgStyles}\n />\n {children}\n </div>\n );\n },\n);\n\nexport default Background;\n","import { type HTMLAttributes, forwardRef, useMemo } from \"react\";\nimport { useTheme } from \"../theme/ThemeProvider\";\n\ntype Variant = \"line\" | \"point\";\ntype Orientation = \"horizontal\" | \"vertical\";\n\nexport interface SeparatorProps extends HTMLAttributes<HTMLDivElement> {\n variant?: Variant;\n orientation?: Orientation;\n color?: string;\n thickness?: number;\n spacing?: number;\n}\n\nexport const Separator = forwardRef<HTMLDivElement, SeparatorProps>(\n function Separator(\n {\n variant = \"line\",\n orientation = \"horizontal\",\n color,\n thickness = 1,\n spacing = 16,\n className = \"\",\n style,\n ...props\n },\n ref,\n ) {\n const theme = useTheme();\n\n const resolvedColor = useMemo(() => {\n if (color) return color;\n if (theme.enabled) return theme.darkMode ? \"#2a2535\" : \"#e5e4e7\";\n return \"#e5e4e7\";\n }, [color, theme]);\n\n const isHorizontal = orientation === \"horizontal\";\n\n if (variant === \"point\") {\n const paddingStyle = isHorizontal\n ? { paddingTop: spacing, paddingBottom: spacing }\n : { paddingLeft: spacing, paddingRight: spacing };\n\n return (\n <div\n ref={ref}\n className={[\n \"flex items-center justify-center shrink-0\",\n isHorizontal ? \"w-full\" : \"h-full\",\n className,\n ].join(\" \")}\n style={{ ...paddingStyle, ...style }}\n {...props}\n >\n <span\n aria-hidden\n className=\"rounded-full shrink-0\"\n style={{\n width: thickness * 4,\n height: thickness * 4,\n backgroundColor: resolvedColor,\n }}\n />\n </div>\n );\n }\n\n const dimStyle = isHorizontal\n ? {\n height: thickness,\n backgroundColor: resolvedColor,\n marginTop: spacing,\n marginBottom: spacing,\n }\n : {\n width: thickness,\n backgroundColor: resolvedColor,\n marginLeft: spacing,\n marginRight: spacing,\n };\n\n return (\n <div\n ref={ref}\n role=\"separator\"\n aria-orientation={orientation}\n className={[\n \"shrink-0\",\n isHorizontal ? \"w-full\" : \"h-full\",\n className,\n ].join(\" \")}\n style={{ ...dimStyle, ...style }}\n {...props}\n />\n );\n },\n);\n\nexport default Separator;\n","import { forwardRef, useMemo, type HTMLAttributes } from \"react\";\nimport { useTheme } from \"../theme/ThemeProvider\";\n\nexport const Surface = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(function Surface(\n { className = \"\", style, children, ...props },\n ref,\n) {\n const theme = useTheme();\n\n const resolvedStyles = useMemo(\n () => ({\n borderColor: theme.darkMode ? theme.darkColors.border : theme.colors.border,\n backgroundColor: theme.darkMode ? theme.darkColors.background : theme.colors.background,\n }),\n [theme],\n );\n return (\n <div\n ref={ref}\n {...props}\n className={[className, \"p-2 rounded-md shadow-md bg-white border\"].join(\" \")}\n style={{\n ...style,\n ...resolvedStyles,\n }}\n >\n {children}\n </div>\n );\n});\n","import { createContext, useContext, useState } from \"react\";\nimport type Validate from \"../utils/validation\";\n\nexport interface ValidatorList {\n [key: string]: Validate;\n}\n\ninterface FormContextType {\n initialValues: Record<string, unknown>;\n values: Record<string, unknown>;\n setValues: (values: Record<string, unknown>) => void;\n isSubmitting: boolean;\n validators: ValidatorList | null;\n setValidators: React.Dispatch<React.SetStateAction<ValidatorList | null>>;\n setIsSubmitting: (isSubmitting: boolean) => void;\n handleSubmit: (event: React.FormEvent<HTMLFormElement>) => void;\n reset: () => void;\n}\n\ninterface FormProviderProps {\n initialValues: Record<string, unknown>;\n onSubmit: (values: Record<string, unknown>, hasErrors: boolean) => void;\n children: React.ReactNode;\n}\n\nconst FormContext = createContext<FormContextType | null>(null);\n\nexport function Form({ initialValues, onSubmit, children }: FormProviderProps) {\n const [values, setValues] = useState(initialValues);\n const [validators, setValidators] = useState<ValidatorList | null>(null);\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n if (validators) {\n const hasErrors = Object.keys(validators).some((key) => {\n const validator = validators[key];\n const value = values[key];\n return !validator.validate(value).valid;\n });\n onSubmit(values, hasErrors);\n } else {\n onSubmit(values, false);\n }\n };\n\n return (\n <FormContext.Provider\n value={{\n initialValues,\n values,\n setValues,\n isSubmitting,\n validators,\n setValidators,\n setIsSubmitting,\n handleSubmit,\n reset: () => {\n setValues(initialValues);\n },\n }}\n >\n <form onSubmit={handleSubmit}>{children}</form>\n </FormContext.Provider>\n );\n}\n\nexport function useForm() {\n const context = useContext(FormContext);\n if (!context) {\n throw new Error(\"useForm must be used within a FormProvider\");\n }\n return context;\n}\n","import { type InputHTMLAttributes, forwardRef } from \"react\";\n//import { useTheme } from \"../theme/ThemeProvider\";\n\ntype Variant = \"default\" | \"filled\" | \"underline\";\n\nexport interface InputProps extends InputHTMLAttributes<HTMLInputElement> {\n variant?: Variant;\n label?: string;\n}\n\nconst variantStyles: Record<Variant, string> = {\n default: \"border border-gray-300 rounded-md p-2\",\n filled: \"bg-gray-100 border border-gray-300 rounded-md p-2\",\n underline: \"border-b border-gray-300 p-2\",\n};\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(function Input(\n { variant = \"default\", label, ...props },\n ref,\n) {\n //const theme = useTheme();\n\n return (\n <div className=\"w-full\">\n {label && (\n <label htmlFor={props.id} className=\"block text-sm font-bold mb-1 mt-2 text-gray-700\">\n {label}\n </label>\n )}\n <input\n ref={ref}\n {...props}\n className={`mb-4 last:mb-0 block w-full ${variantStyles[variant]} focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 sm:text-sm`}\n />\n </div>\n );\n});\n","import { useCallback, useEffect, useRef } from \"react\";\n\n/** Returns a stable function that runs after calls have stopped for `delay` ms. */\nexport function useDebounce<T extends (...args: any[]) => void>(\n fn: T,\n delay: number,\n): (...args: Parameters<T>) => void {\n const fnRef = useRef(fn);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n fnRef.current = fn;\n }, [fn]);\n\n const debounced = useCallback(\n (...args: Parameters<T>) => {\n if (timerRef.current !== null) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => {\n timerRef.current = null;\n fnRef.current(...args);\n }, delay);\n },\n [delay],\n );\n\n useEffect(\n () => () => {\n if (timerRef.current !== null) clearTimeout(timerRef.current);\n },\n [],\n );\n\n return debounced;\n}\n","import { type InputHTMLAttributes, forwardRef, useEffect } from \"react\";\nimport type { Validate } from \"../utils/validation\";\nimport { Input } from \"./Input\";\nimport { useDebounce } from \"../hooks/useDebounce\";\nimport React from \"react\";\nimport { useForm } from \"./Form\";\n\ntype Variant = \"default\" | \"filled\" | \"underline\";\n\nexport interface InputProps extends InputHTMLAttributes<HTMLInputElement> {\n variant?: Variant;\n label?: string;\n validator?: Validate;\n debounce?: number; // Debounce time in milliseconds\n}\n\nexport const UnicornialInput = forwardRef<HTMLInputElement, InputProps>(function Minput(\n { variant = \"default\", debounce = 300, label, name, ...props },\n ref,\n) {\n const { values, setValues, isSubmitting, setValidators } = useForm();\n\n useEffect(() => {\n if (name && props.validator) {\n setValidators((prev) => ({ ...(prev ?? {}), [name]: props.validator! }));\n }\n }, [name, props.validator, setValidators]);\n\n //validations --------------------------------------------------\n const [message, setMessage] = React.useState(\"\");\n\n const debouncedChangeHandler = useDebounce((event: React.ChangeEvent<HTMLInputElement>) => {\n validate(event.target.value);\n if (props.onChange) {\n props.onChange(event);\n }\n }, debounce || 300);\n\n const validate = (value: unknown) => {\n if (props.validator) {\n const result = props.validator.validate(value, (v) => setValues({ ...values, [name!]: v }));\n if (!result.valid) {\n setMessage(result.message);\n } else {\n setMessage(\"\");\n }\n }\n };\n\n const handleBlur = (event: React.FocusEvent<HTMLInputElement>) => {\n validate(event.target.value);\n if (props.onBlur) {\n props.onBlur(event);\n }\n };\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (name) {\n setValues({ ...values, [name]: event.target.value });\n }\n debouncedChangeHandler(event);\n };\n\n return (\n <>\n <Input\n variant={variant}\n label={label}\n ref={ref}\n value={name && ((values[name] as string) || \"\")}\n disabled={isSubmitting}\n {...props}\n onChange={handleChange}\n onBlur={handleBlur}\n />\n {message && <p className=\"text-sm text-red-500 mt-1\">{message}</p>}\n </>\n );\n});\n","import { type ButtonHTMLAttributes, forwardRef, useMemo } from \"react\";\nimport { useTheme } from \"../theme/ThemeProvider\";\n\ntype Variant = \"primary\" | \"secondary\" | \"outline\" | \"ghost\";\ntype Size = \"sm\" | \"md\" | \"lg\";\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: Variant;\n size?: Size;\n}\n\nconst variantClasses: Record<Variant, string> = {\n primary:\n \"bg-accent text-white hover:bg-accent/90 focus-visible:ring-accent/50\",\n secondary:\n \"bg-code-bg text-text-h hover:bg-code-bg/80 focus-visible:ring-code-bg/50\",\n outline:\n \"border border-border bg-transparent text-text-h hover:bg-accent-bg hover:border-accent-border focus-visible:ring-accent/50\",\n ghost:\n \"bg-transparent text-text-h hover:bg-accent-bg focus-visible:ring-accent/50\",\n};\n\nconst sizeClasses: Record<Size, string> = {\n sm: \"px-3 py-1.5 text-sm gap-1.5\",\n md: \"px-5 py-2.5 text-base gap-2\",\n lg: \"px-7 py-3 text-lg gap-2.5\",\n};\n\nfunction hexToRgba(hex: string, alpha: number): string {\n const cleaned = hex.replace(\"#\", \"\");\n const full =\n cleaned.length === 3\n ? cleaned\n .split(\"\")\n .map((c) => c + c)\n .join(\"\")\n : cleaned;\n const num = parseInt(full, 16);\n const r = (num >> 16) & 0xff;\n const g = (num >> 8) & 0xff;\n const b = num & 0xff;\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button(\n { variant = \"primary\", size = \"md\", className = \"\", style, ...props },\n ref,\n) {\n const theme = useTheme();\n\n const themeStyle = useMemo<React.CSSProperties | undefined>(() => {\n if (!theme.enabled) return undefined;\n const primary = theme.colors.primary;\n const secondary = theme.colors.secondary;\n const primaryBg = hexToRgba(primary, 0.1);\n const primaryBorder = hexToRgba(primary, 0.5);\n const primaryRing = hexToRgba(primary, 0.5);\n\n switch (variant) {\n case \"primary\":\n return {\n backgroundColor: primary,\n color: \"#fff\",\n [\"--tw-ring-color\" as any]: primaryRing,\n };\n case \"secondary\":\n return {\n backgroundColor: secondary,\n color: \"#08060d\",\n };\n case \"outline\":\n return {\n borderColor: \"#e5e4e7\",\n backgroundColor: \"transparent\",\n color: \"#08060d\",\n [\"--hover-bg\" as any]: primaryBg,\n [\"--hover-border\" as any]: primaryBorder,\n [\"--tw-ring-color\" as any]: primaryRing,\n };\n case \"ghost\":\n default:\n return {\n backgroundColor: \"transparent\",\n color: \"#08060d\",\n [\"--hover-bg\" as any]: primaryBg,\n [\"--tw-ring-color\" as any]: primaryRing,\n };\n }\n }, [theme, variant]);\n\n const themeHoverClass =\n theme.enabled && variant === \"primary\"\n ? \"hover:brightness-110\"\n : theme.enabled && variant === \"outline\"\n ? \"hover:bg-[var(--hover-bg)] hover:border-[var(--hover-border)]\"\n : theme.enabled\n ? \"hover:bg-[var(--hover-bg)]\"\n : \"\";\n\n return (\n <button\n ref={ref}\n className={[\n \"inline-flex items-center justify-center font-medium rounded-lg\",\n \"transition-all duration-200 ease-in-out\",\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2\",\n \"disabled:opacity-50 disabled:pointer-events-none\",\n \"select-none\",\n variantClasses[variant],\n sizeClasses[size],\n themeHoverClass,\n className,\n ].join(\" \")}\n style={{ ...themeStyle, ...style }}\n {...props}\n />\n );\n});\n","import { useState, useEffect, type ReactNode } from 'react';\n\ninterface MobilePortraitOnlyProps {\n children: ReactNode;\n}\n\nconst MobileOnly = ({ children }: MobilePortraitOnlyProps) => {\n const [isMobilePortrait, setIsMobilePortrait] = useState(false);\n\n useEffect(() => {\n const checkMobilePortrait = () => {\n const isPortrait = window.innerHeight > window.innerWidth;\n setIsMobilePortrait(isPortrait);\n };\n\n checkMobilePortrait();\n window.addEventListener('resize', checkMobilePortrait);\n \n return () => window.removeEventListener('resize', checkMobilePortrait);\n }, []);\n\n return isMobilePortrait ? <>{children}</> : null;\n};\n\nexport { MobileOnly };","import type { ReactNode } from \"react\";\nimport { useState, useEffect } from 'react';\n\ninterface NonMobilePortraitOnlyProps {\n children: ReactNode;\n}\n\nconst DesktopOnly = ({ children }: NonMobilePortraitOnlyProps) => {\n const [isNonMobilePortrait, setIsNonMobilePortrait] = useState(false);\n\n useEffect(() => {\n const checkNonMobilePortrait = () => {\n const isPortrait = window.innerHeight > window.innerWidth;\n setIsNonMobilePortrait(!isPortrait);\n };\n\n checkNonMobilePortrait();\n window.addEventListener('resize', checkNonMobilePortrait);\n \n return () => window.removeEventListener('resize', checkNonMobilePortrait);\n }, []);\n\n return isNonMobilePortrait ? <>{children}</> : null;\n};\n\nexport { DesktopOnly };\n","export interface ValidationResult {\n valid: boolean;\n message: string;\n}\n\nexport type Validator = (value: unknown) => ValidationResult;\n\nexport const validators: Record<string, (...args: any[]) => Validator> = {\n required:\n (message: string) =>\n (value: unknown): ValidationResult => {\n const str = String(value ?? \"\");\n return str.trim() !== \"\"\n ? { valid: true, message: \"\" }\n : { valid: false, message: message || \"Este campo es obligatorio\" };\n },\n // Numbers ---------------------------------------------------------------------------------------------------------\n onlyNumbers:\n (message: string) =>\n (value: unknown): ValidationResult => {\n const str = String(value ?? \"\");\n return /^\\d+$/.test(str)\n ? { valid: true, message: \"\" }\n : { valid: false, message: message || \"Debe contener solo números\" };\n },\n min:\n (n: number, message: string) =>\n (value: unknown): ValidationResult => {\n if (isNaN(n)) {\n throw new Error(\"El valor debe ser un número\");\n }\n\n const num = Number(value);\n return num >= n\n ? { valid: true, message: \"\" }\n : { valid: false, message: message || `El valor debe ser mayor o igual a ${n}` };\n },\n max:\n (n: number, message: string) =>\n (value: unknown): ValidationResult => {\n if (isNaN(n)) {\n throw new Error(\"El valor debe ser un número\");\n }\n const num = Number(value);\n return num <= n\n ? { valid: true, message: \"\" }\n : { valid: false, message: message || `El valor debe ser menor o igual a ${n}` };\n },\n positive:\n (message: string) =>\n (value: unknown): ValidationResult => {\n const num = Number(value);\n return num > 0\n ? { valid: true, message: \"\" }\n : { valid: false, message: message || \"El valor debe ser positivo\" };\n },\n negative:\n (message: string) =>\n (value: unknown): ValidationResult => {\n const num = Number(value);\n return num < 0\n ? { valid: true, message: \"\" }\n : { valid: false, message: message || \"El valor debe ser negativo\" };\n },\n integer:\n (message: string) =>\n (value: unknown): ValidationResult => {\n const num = Number(value);\n return Number.isInteger(num)\n ? { valid: true, message: \"\" }\n : { valid: false, message: message || \"El valor debe ser un número entero\" };\n },\n round:\n () =>\n (value: unknown): ValidationResult => {\n const num = Number(value);\n return { valid: true, message: Math.round(num).toString() };\n },\n truncate:\n () =>\n (value: unknown): ValidationResult => {\n const num = Number(value);\n return { valid: true, message: Math.trunc(num).toString() };\n },\n // Strings ---------------------------------------------------------------------------------------------------------\n email:\n (message: string) =>\n (value: unknown): ValidationResult => {\n const str = String(value ?? \"\");\n const re = /^[\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4}$/;\n return re.test(str)\n ? { valid: true, message: \"\" }\n : { valid: false, message: message || \"Correo invalido\" };\n },\n minLength:\n (n: number, message: string) =>\n (value: unknown): ValidationResult => {\n if (isNaN(n)) {\n throw new Error(\"El valor debe ser un número\");\n }\n const str = String(value ?? \"\");\n return str.length >= n\n ? { valid: true, message: \"\" }\n : { valid: false, message: message || `El valor debe tener al menos ${n} caracteres` };\n },\n maxLength:\n (n: number, message: string) =>\n (value: unknown): ValidationResult => {\n if (isNaN(n)) {\n throw new Error(\"El valor debe ser un número\");\n }\n const str = String(value ?? \"\");\n return str.length <= n\n ? { valid: true, message: \"\" }\n : { valid: false, message: message || `El valor debe tener como máximo ${n} caracteres` };\n },\n lowercase:\n () =>\n (value: unknown): ValidationResult => {\n const str = String(value ?? \"\");\n return { valid: true, message: str.toLowerCase() };\n },\n uppercase:\n () =>\n (value: unknown): ValidationResult => {\n const str = String(value ?? \"\");\n return { valid: true, message: str.toUpperCase() };\n },\n regex:\n (pattern: RegExp, message: string) =>\n (value: unknown): ValidationResult => {\n const str = String(value ?? \"\");\n return pattern.test(str)\n ? { valid: true, message: \"\" }\n : { valid: false, message: message || \"El valor no coincide con el patrón\" };\n },\n trim:\n () =>\n (value: unknown): ValidationResult => {\n const str = String(value ?? \"\");\n return { valid: true, message: str.trim() };\n },\n // dates ---------------------------------------------------------------------------------------------------------\n minDate:\n (date: Date, message: string) =>\n (value: unknown): ValidationResult => {\n const inputDate = new Date(String(value ?? \"\"));\n return inputDate >= date\n ? { valid: true, message: \"\" }\n : {\n valid: false,\n message: message || `La fecha debe ser posterior a ${date.toLocaleDateString()}`,\n };\n },\n maxDate:\n (date: Date, message: string) =>\n (value: unknown): ValidationResult => {\n const inputDate = new Date(String(value ?? \"\"));\n return inputDate <= date\n ? { valid: true, message: \"\" }\n : {\n valid: false,\n message: message || `La fecha debe ser anterior a ${date.toLocaleDateString()}`,\n };\n },\n};\n","import { validators, type ValidationResult, type Validator } from \"./validators\";\n\nexport class Validate {\n private checks: Validator[] = [];\n\n private add(fn: Validator): this {\n this.checks.push(fn);\n return this;\n }\n\n static required(): Validate {\n return new Validate().add(validators.required());\n }\n\n // Numbers ---------------------------------------------------------------------------------------------------------\n static onlyNumbers(): Validate {\n return new Validate().onlyNumbers();\n }\n\n static min(n: number): Validate {\n return new Validate().min(n);\n }\n\n static max(n: number): Validate {\n return new Validate().max(n);\n }\n\n static positive(): Validate {\n return new Validate().add(validators.positive());\n }\n\n static negative(): Validate {\n return new Validate().add(validators.negative());\n }\n\n static integer(): Validate {\n return new Validate().add(validators.integer());\n }\n\n static round(): Validate {\n return new Validate().add(validators.round());\n }\n\n static truncate(): Validate {\n return new Validate().add(validators.truncate());\n }\n\n // Strings ---------------------------------------------------------------------------------------------------------\n static email(): Validate {\n return new Validate().email();\n }\n\n static minLength(n: number): Validate {\n return new Validate().minLength(n);\n }\n\n static maxLength(n: number): Validate {\n return new Validate().maxLength(n);\n }\n\n static lowercase(): Validate {\n return new Validate().add(validators.lowercase());\n }\n\n static uppercase(): Validate {\n return new Validate().add(validators.uppercase());\n }\n\n static trim(): Validate {\n return new Validate().add(validators.trim());\n }\n\n static regex(pattern: RegExp, message?: string): Validate {\n return new Validate().add(validators.regex(pattern, message || \"Valor inválido\"));\n }\n\n // dates ---------------------------------------------------------------------------------------------------------\n static minDate(date: Date): Validate {\n return new Validate().add(validators.minDate(date));\n }\n\n static maxDate(date: Date): Validate {\n return new Validate().add(validators.maxDate(date));\n }\n\n // Instance methods -----------------------------------------------------------------------------------------------\n required(): this {\n return this.add(validators.required());\n }\n\n // Numbers ---------------------------------------------------------------------------------------------------------\n onlyNumbers(): this {\n return this.add(validators.onlyNumbers());\n }\n\n min(n: number): this {\n return this.add(validators.min(n));\n }\n\n max(n: number): this {\n return this.add(validators.max(n));\n }\n\n positive(): this {\n return this.add(validators.positive());\n }\n\n negative(): this {\n return this.add(validators.negative());\n }\n\n integer(): this {\n return this.add(validators.integer());\n }\n\n round(): this {\n return this.add(validators.round());\n }\n\n truncate(): this {\n return this.add(validators.truncate());\n }\n\n // Strings ---------------------------------------------------------------------------------------------------------\n email(): this {\n return this.add(validators.email());\n }\n\n minLength(n: number): this {\n return this.add(validators.minLength(n));\n }\n\n maxLength(n: number): this {\n return this.add(validators.maxLength(n));\n }\n\n lowercase(): this {\n return this.add(validators.lowercase());\n }\n\n uppercase(): this {\n return this.add(validators.uppercase());\n }\n\n trim(): this {\n return this.add(validators.trim());\n }\n\n regex(pattern: RegExp, message?: string): this {\n return this.add(validators.regex(pattern, message || \"Valor inválido\"));\n }\n\n // dates ---------------------------------------------------------------------------------------------------------\n minDate(date: Date): this {\n return this.add(validators.minDate(date));\n }\n\n maxDate(date: Date): this {\n return this.add(validators.maxDate(date));\n }\n\n // checks validations\n validate(value: unknown, onTransform?: (v: unknown) => unknown): ValidationResult {\n let tmpValue = value;\n for (const check of this.checks) {\n const result = check(tmpValue);\n if (!result.valid) {\n return result;\n }\n if (result.message) {\n tmpValue = result.message;\n if (onTransform) {\n tmpValue = onTransform(tmpValue);\n }\n }\n }\n return { valid: true, message: \"\" };\n }\n}\n\nexport default Validate;\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,10 +1,18 @@
1
1
  {
2
2
  "name": "unicornial-ui",
3
- "version": "0.0.11",
3
+ "version": "0.0.13",
4
4
  "private": false,
5
- "type": "module",
6
5
  "style": "./dist/unicornial-ui.css",
7
- "css": "./dist/unicornial-ui.css",
6
+ "files": [
7
+ "dist"
8
+ ],
9
+ "type": "module",
10
+ "sideEffects": [
11
+ "**/*.css",
12
+ "**/*.js",
13
+ "./dist/unicornial-ui.es.js",
14
+ "./dist/**/*.css"
15
+ ],
8
16
  "main": "./dist/unicornial-ui.umd.js",
9
17
  "module": "./dist/unicornial-ui.es.js",
10
18
  "types": "./dist/types/index.d.ts",
@@ -16,23 +24,8 @@
16
24
  },
17
25
  "./style.css": "./dist/unicornial-ui.css"
18
26
  },
19
- "files": [
20
- "dist"
21
- ],
22
- "sideEffects": [
23
- "**/*.css",
24
- "**/*.js",
25
- "./dist/unicornial-ui.es.js",
26
- "./dist/**/*.css"
27
- ],
28
- "peerDependencies": {
29
- "react": "^18.0.0 || ^19.0.0",
30
- "react-dom": "^18.0.0 || ^19.0.0"
31
- },
32
27
  "dependencies": {},
33
28
  "devDependencies": {
34
- "react": "^19.2.7",
35
- "react-dom": "^19.2.7",
36
29
  "@babel/core": "^7.29.7",
37
30
  "@rolldown/plugin-babel": "^0.2.3",
38
31
  "@tailwindcss/vite": "^4.0.0",
@@ -44,10 +37,17 @@
44
37
  "babel-plugin-react-compiler": "^1.0.0",
45
38
  "oxfmt": "^0.60.0",
46
39
  "oxlint": "^1.71.0",
40
+ "react": "^19.2.7",
41
+ "react-dom": "^19.2.7",
47
42
  "tailwindcss": "^4.0.0",
48
43
  "typescript": "~6.0.2",
49
44
  "vite": "^8.1.1"
50
45
  },
46
+ "peerDependencies": {
47
+ "react": "^18.0.0 || ^19.0.0",
48
+ "react-dom": "^18.0.0 || ^19.0.0"
49
+ },
50
+ "css": "./dist/unicornial-ui.css",
51
51
  "scripts": {
52
52
  "dev": "vite",
53
53
  "build": "vite build && tsc -b",
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=Card.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Card.d.ts","sourceRoot":"","sources":["../../../src/components/Card.tsx"],"names":[],"mappings":""}