unicornial-ui 0.0.11 → 0.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/types/index.d.ts
CHANGED
|
@@ -8,4 +8,5 @@ export { Validate, validators } from "./utils/validation";
|
|
|
8
8
|
export { ThemeProvider, useTheme, themeConfig, } from "./theme/ThemeProvider";
|
|
9
9
|
export { MobileOnly } from "./components/Mobile";
|
|
10
10
|
export { DesktopOnly } from "./components/Desktop";
|
|
11
|
+
export { Surface } from "./components/Surface";
|
|
11
12
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAC;AAErB,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EACL,aAAa,EACb,QAAQ,EACR,WAAW,GACZ,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAC,UAAU,EAAC,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAC,WAAW,EAAC,MAAM,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAC;AAErB,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EACL,aAAa,EACb,QAAQ,EACR,WAAW,GACZ,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAC,UAAU,EAAC,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAC,WAAW,EAAC,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAC,OAAO,EAAC,MAAM,sBAAsB,CAAC"}
|
package/dist/unicornial-ui.es.js
CHANGED
|
@@ -673,8 +673,23 @@ var R = t(function({ variant: e = "default", Isize: t = "md", error: n = !1, lef
|
|
|
673
673
|
};
|
|
674
674
|
return e(), window.addEventListener("resize", e), () => window.removeEventListener("resize", e);
|
|
675
675
|
}, []), t ? /* @__PURE__ */ c(s, { children: e }) : null;
|
|
676
|
-
}
|
|
676
|
+
}, G = t(function({ className: e = "", style: t, children: n, ...r }, i) {
|
|
677
|
+
let o = m(), s = a(() => ({
|
|
678
|
+
borderColor: o.darkMode ? o.darkColors.border : o.colors.border,
|
|
679
|
+
backgroundColor: o.darkMode ? o.darkColors.background : o.colors.background
|
|
680
|
+
}), [o]);
|
|
681
|
+
return /* @__PURE__ */ c("div", {
|
|
682
|
+
ref: i,
|
|
683
|
+
...r,
|
|
684
|
+
className: ["px-2 py-1 rounded-xs shadow-md bg-white border", e].join(" "),
|
|
685
|
+
style: {
|
|
686
|
+
...t,
|
|
687
|
+
...s
|
|
688
|
+
},
|
|
689
|
+
children: n
|
|
690
|
+
});
|
|
691
|
+
});
|
|
677
692
|
//#endregion
|
|
678
|
-
export { k as Background, v as Button, W as DesktopOnly, E as Header, R as Input, U as MobileOnly, A as Separator, p as ThemeProvider, H as Validate, u as themeConfig, m as useTheme, V as validators };
|
|
693
|
+
export { k as Background, v as Button, W as DesktopOnly, E as Header, R as Input, U as MobileOnly, A as Separator, G as Surface, p as ThemeProvider, H as Validate, u as themeConfig, m as useTheme, V as validators };
|
|
679
694
|
|
|
680
695
|
//# sourceMappingURL=unicornial-ui.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unicornial-ui.es.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.es.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","../src/components/Surface.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","import { forwardRef, useMemo, type HTMLAttributes } from \"react\";\nimport { useTheme } from \"../theme/ThemeProvider\";\n\nexport const Surface = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n function Surface(\n {\n className = \"\",\n style,\n children,\n ...props\n },\n ref,\n ) {\n const theme = useTheme();\n\n const resolvedStyles = useMemo(() => ({\n borderColor: theme.darkMode ? theme.darkColors.border : theme.colors.border,\n backgroundColor: theme.darkMode ? theme.darkColors.background : theme.colors.background,\n }), [theme]);\n return (\n <div\n ref={ref}\n {...props}\n className={\n [\n \"px-2 py-1 rounded-xs shadow-md bg-white border\", \n className\n ].join(\" \")\n }\n style={{\n ...style,\n ...resolvedStyles,\n }}\n >\n {children}\n </div>\n );\n },\n);"],"mappings":"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"}
|
|
@@ -58,5 +58,5 @@
|
|
|
58
58
|
rgba(0, 0, 0, 0) 40%,
|
|
59
59
|
rgba(0, 0, 0, 0.6) 100%
|
|
60
60
|
)
|
|
61
|
-
`,maskSize:`100% 100%`,WebkitMaskSize:`100% 100%`,maskRepeat:`no-repeat`,WebkitMaskRepeat:`no-repeat`}),none:()=>({})},S=(0,t.forwardRef)(function({variant:e=`dots-grid`,mask:r=`none`,color:i,size:a=24,className:o=``,style:c,children:l,...u},d){let m=s(),h=(0,t.useMemo)(()=>i||(m.enabled?p(f(m.colors.primary,.25)):`rgba(170, 59, 255, 0.25)`),[i,m]),g=(0,t.useMemo)(()=>({...b[e](h,a),...x[r]()}),[e,r,h,a]);return(0,n.jsxs)(`div`,{ref:d,className:[`w-full h-full relative overflow-hidden flex flex-col`,o].join(` `),style:c,...u,children:[(0,n.jsx)(`div`,{"aria-hidden":!0,className:`absolute inset-0 -z-10 pointer-events-none`,style:g}),l]})}),C=(0,t.forwardRef)(function({variant:e=`line`,orientation:r=`horizontal`,color:i,thickness:a=1,spacing:o=16,className:c=``,style:l,...u},d){let f=s(),p=(0,t.useMemo)(()=>i||(f.enabled&&f.darkMode?`#2a2535`:`#e5e4e7`),[i,f]),m=r===`horizontal`;if(e===`point`){let e=m?{paddingTop:o,paddingBottom:o}:{paddingLeft:o,paddingRight:o};return(0,n.jsx)(`div`,{ref:d,className:[`flex items-center justify-center shrink-0`,m?`w-full`:`h-full`,c].join(` `),style:{...e,...l},...u,children:(0,n.jsx)(`span`,{"aria-hidden":!0,className:`rounded-full shrink-0`,style:{width:a*4,height:a*4,backgroundColor:p}})})}let h=m?{height:a,backgroundColor:p,marginTop:o,marginBottom:o}:{width:a,backgroundColor:p,marginLeft:o,marginRight:o};return(0,n.jsx)(`div`,{ref:d,role:`separator`,"aria-orientation":r,className:[`shrink-0`,m?`w-full`:`h-full`,c].join(` `),style:{...h,...l},...u})}),w={sm:`h-8 px-3 text-sm`,md:`h-10 px-4 text-base`,lg:`h-12 px-5 text-lg`},T={sm:`pl-9 pr-3`,md:`pl-11 pr-4`,lg:`pl-13 pr-5`},E={sm:`pl-3 pr-9`,md:`pl-4 pr-11`,lg:`pl-5 pr-13`},D={sm:`pl-9 pr-9`,md:`pl-11 pr-11`,lg:`pl-13 pr-13`},O={sm:`w-4 h-4 left-2.5`,md:`w-5 h-5 left-3`,lg:`w-6 h-6 left-4`},k={sm:`w-4 h-4 right-2.5`,md:`w-5 h-5 right-3`,lg:`w-6 h-6 right-4`};function A(e,t){let n=e.replace(`#`,``),r=n.length===3?n.split(``).map(e=>e+e).join(``):n,i=parseInt(r,16);return`rgba(${i>>16&255}, ${i>>8&255}, ${i&255}, ${t})`}var j=(0,t.forwardRef)(function({variant:e=`default`,Isize:r=`md`,error:i=!1,leftIcon:a,rightIcon:o,className:c=``,wrapperClassName:l=``,style:u,disabled:d,...f},p){let m=s(),h=(0,t.useMemo)(()=>{if(!m.enabled)return;let t=m.colors.primary,n=m.darkMode?`#2a2535`:`#e5e4e7`,r=m.darkMode?`#14111f`:`#f5f5f7`,a=`#ef4444`,o={borderRadius:e===`underline`?0:8};switch(e){case`filled`:return{...o,backgroundColor:r,borderBottom:`2px solid ${i?a:`transparent`}`,"--focus-border":i?a:t,"--ring-color":A(i?a:t,.5)};case`underline`:return{...o,backgroundColor:`transparent`,borderBottom:`1.5px solid ${i?a:n}`,"--focus-border":i?a:t,"--ring-color":A(i?a:t,.5)};default:return{...o,backgroundColor:m.darkMode?`#0b0912`:`#ffffff`,border:`1px solid ${i?a:n}`,"--focus-border":i?a:t,"--ring-color":A(i?a:t,.5)}}},[m,e,i]),g=(0,t.useMemo)(()=>{if(m.enabled)return e===`underline`?`focus-within:border-b-[2px] focus-within:border-b-[var(--focus-border)]`:`focus-within:ring-2 focus-within:ring-[var(--ring-color)] focus-within:ring-offset-0 focus-within:border-[var(--focus-border)]`;if(e===`underline`)return i?`border-b-2 border-b-red-500 focus-within:border-b-accent`:`border-b border-border focus-within:border-b-2 focus-within:border-b-accent`;let t=`focus-within:ring-2 focus-within:ring-accent/50 focus-within:ring-offset-0`;switch(e){case`filled`:return i?`bg-code-bg border-b-2 border-b-red-500 ${t} focus-within:border-b-accent`:`bg-code-bg border-b-2 border-b-transparent ${t} focus-within:border-b-accent`;default:return i?`bg-bg border border-red-500 rounded-lg ${t} focus-within:border-accent`:`bg-bg border border-border rounded-lg ${t} focus-within:border-accent`}},[m,e,i]),_=a&&o?D[r]:a?T[r]:o?E[r]:w[r],v=e===`underline`?`bg-transparent rounded-none`:`rounded-lg`,y=(0,t.useMemo)(()=>m.enabled?{color:m.darkMode?`#e8e4f0`:`#08060d`,"--placeholder-color":A(m.darkMode?`#908a9e`:`#706a7c`,1),backgroundColor:`transparent`}:void 0,[m]),b=m.enabled?`placeholder:text-[color:var(--placeholder-color)]`:`placeholder:text-text-muted`;return(0,n.jsxs)(`div`,{className:[`relative w-full flex items-center`,g,d?`opacity-50 cursor-not-allowed`:``,l].join(` `),style:h,children:[a&&(0,n.jsx)(`span`,{"aria-hidden":!0,className:[`absolute text-text-muted pointer-events-none shrink-0`,O[r]].join(` `),children:a}),(0,n.jsx)(`input`,{ref:p,disabled:d,className:[`w-full h-full outline-none bg-transparent font-normal`,`transition-all duration-200 ease-in-out`,`disabled:cursor-not-allowed`,_,v,b,c].join(` `),style:{...y,...u},...f}),o&&(0,n.jsx)(`span`,{"aria-hidden":!0,className:[`absolute text-text-muted pointer-events-none shrink-0`,k[r]].join(` `),children:o})]})}),M=e=>typeof e==`string`&&e.trim()!==``&&!isNaN(Number(e)),N=e=>typeof e==`number`?isNaN(e)?null:e:M(e)?Number(e):null,P={email:()=>e=>{let t=String(e??``);return/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(t)?{valid:!0,message:``}:{valid:!1,message:`El valor no es un correo válido`}},onlyNumbers:()=>e=>{let t=String(e??``);return/^\d+$/.test(t)?{valid:!0,message:``}:{valid:!1,message:`El valor debe contener solo números`}},min:e=>t=>{let n=N(t);return n===null?String(t??``).length>=e?{valid:!0,message:``}:{valid:!1,message:`La longitud debe ser al menos ${e}`}:n>=e?{valid:!0,message:``}:{valid:!1,message:`El valor debe ser mayor o igual a ${e}`}},max:e=>t=>{let n=N(t);return n===null?String(t??``).length<=e?{valid:!0,message:``}:{valid:!1,message:`La longitud debe ser como máximo ${e}`}:n<=e?{valid:!0,message:``}:{valid:!1,message:`El valor debe ser menor o igual a ${e}`}}},F=class e{checks=[];add(e){return this.checks.push(e),this}static email(){return new e().email()}static onlyNumbers(){return new e().onlyNumbers()}static min(t){return new e().min(t)}static max(t){return new e().max(t)}email(){return this.add(P.email())}onlyNumbers(){return this.add(P.onlyNumbers())}min(e){return this.add(P.min(e))}max(e){return this.add(P.max(e))}validate(e){for(let t of this.checks){let n=t(e);if(!n.valid)return n}return{valid:!0,message:``}}}
|
|
61
|
+
`,maskSize:`100% 100%`,WebkitMaskSize:`100% 100%`,maskRepeat:`no-repeat`,WebkitMaskRepeat:`no-repeat`}),none:()=>({})},S=(0,t.forwardRef)(function({variant:e=`dots-grid`,mask:r=`none`,color:i,size:a=24,className:o=``,style:c,children:l,...u},d){let m=s(),h=(0,t.useMemo)(()=>i||(m.enabled?p(f(m.colors.primary,.25)):`rgba(170, 59, 255, 0.25)`),[i,m]),g=(0,t.useMemo)(()=>({...b[e](h,a),...x[r]()}),[e,r,h,a]);return(0,n.jsxs)(`div`,{ref:d,className:[`w-full h-full relative overflow-hidden flex flex-col`,o].join(` `),style:c,...u,children:[(0,n.jsx)(`div`,{"aria-hidden":!0,className:`absolute inset-0 -z-10 pointer-events-none`,style:g}),l]})}),C=(0,t.forwardRef)(function({variant:e=`line`,orientation:r=`horizontal`,color:i,thickness:a=1,spacing:o=16,className:c=``,style:l,...u},d){let f=s(),p=(0,t.useMemo)(()=>i||(f.enabled&&f.darkMode?`#2a2535`:`#e5e4e7`),[i,f]),m=r===`horizontal`;if(e===`point`){let e=m?{paddingTop:o,paddingBottom:o}:{paddingLeft:o,paddingRight:o};return(0,n.jsx)(`div`,{ref:d,className:[`flex items-center justify-center shrink-0`,m?`w-full`:`h-full`,c].join(` `),style:{...e,...l},...u,children:(0,n.jsx)(`span`,{"aria-hidden":!0,className:`rounded-full shrink-0`,style:{width:a*4,height:a*4,backgroundColor:p}})})}let h=m?{height:a,backgroundColor:p,marginTop:o,marginBottom:o}:{width:a,backgroundColor:p,marginLeft:o,marginRight:o};return(0,n.jsx)(`div`,{ref:d,role:`separator`,"aria-orientation":r,className:[`shrink-0`,m?`w-full`:`h-full`,c].join(` `),style:{...h,...l},...u})}),w={sm:`h-8 px-3 text-sm`,md:`h-10 px-4 text-base`,lg:`h-12 px-5 text-lg`},T={sm:`pl-9 pr-3`,md:`pl-11 pr-4`,lg:`pl-13 pr-5`},E={sm:`pl-3 pr-9`,md:`pl-4 pr-11`,lg:`pl-5 pr-13`},D={sm:`pl-9 pr-9`,md:`pl-11 pr-11`,lg:`pl-13 pr-13`},O={sm:`w-4 h-4 left-2.5`,md:`w-5 h-5 left-3`,lg:`w-6 h-6 left-4`},k={sm:`w-4 h-4 right-2.5`,md:`w-5 h-5 right-3`,lg:`w-6 h-6 right-4`};function A(e,t){let n=e.replace(`#`,``),r=n.length===3?n.split(``).map(e=>e+e).join(``):n,i=parseInt(r,16);return`rgba(${i>>16&255}, ${i>>8&255}, ${i&255}, ${t})`}var j=(0,t.forwardRef)(function({variant:e=`default`,Isize:r=`md`,error:i=!1,leftIcon:a,rightIcon:o,className:c=``,wrapperClassName:l=``,style:u,disabled:d,...f},p){let m=s(),h=(0,t.useMemo)(()=>{if(!m.enabled)return;let t=m.colors.primary,n=m.darkMode?`#2a2535`:`#e5e4e7`,r=m.darkMode?`#14111f`:`#f5f5f7`,a=`#ef4444`,o={borderRadius:e===`underline`?0:8};switch(e){case`filled`:return{...o,backgroundColor:r,borderBottom:`2px solid ${i?a:`transparent`}`,"--focus-border":i?a:t,"--ring-color":A(i?a:t,.5)};case`underline`:return{...o,backgroundColor:`transparent`,borderBottom:`1.5px solid ${i?a:n}`,"--focus-border":i?a:t,"--ring-color":A(i?a:t,.5)};default:return{...o,backgroundColor:m.darkMode?`#0b0912`:`#ffffff`,border:`1px solid ${i?a:n}`,"--focus-border":i?a:t,"--ring-color":A(i?a:t,.5)}}},[m,e,i]),g=(0,t.useMemo)(()=>{if(m.enabled)return e===`underline`?`focus-within:border-b-[2px] focus-within:border-b-[var(--focus-border)]`:`focus-within:ring-2 focus-within:ring-[var(--ring-color)] focus-within:ring-offset-0 focus-within:border-[var(--focus-border)]`;if(e===`underline`)return i?`border-b-2 border-b-red-500 focus-within:border-b-accent`:`border-b border-border focus-within:border-b-2 focus-within:border-b-accent`;let t=`focus-within:ring-2 focus-within:ring-accent/50 focus-within:ring-offset-0`;switch(e){case`filled`:return i?`bg-code-bg border-b-2 border-b-red-500 ${t} focus-within:border-b-accent`:`bg-code-bg border-b-2 border-b-transparent ${t} focus-within:border-b-accent`;default:return i?`bg-bg border border-red-500 rounded-lg ${t} focus-within:border-accent`:`bg-bg border border-border rounded-lg ${t} focus-within:border-accent`}},[m,e,i]),_=a&&o?D[r]:a?T[r]:o?E[r]:w[r],v=e===`underline`?`bg-transparent rounded-none`:`rounded-lg`,y=(0,t.useMemo)(()=>m.enabled?{color:m.darkMode?`#e8e4f0`:`#08060d`,"--placeholder-color":A(m.darkMode?`#908a9e`:`#706a7c`,1),backgroundColor:`transparent`}:void 0,[m]),b=m.enabled?`placeholder:text-[color:var(--placeholder-color)]`:`placeholder:text-text-muted`;return(0,n.jsxs)(`div`,{className:[`relative w-full flex items-center`,g,d?`opacity-50 cursor-not-allowed`:``,l].join(` `),style:h,children:[a&&(0,n.jsx)(`span`,{"aria-hidden":!0,className:[`absolute text-text-muted pointer-events-none shrink-0`,O[r]].join(` `),children:a}),(0,n.jsx)(`input`,{ref:p,disabled:d,className:[`w-full h-full outline-none bg-transparent font-normal`,`transition-all duration-200 ease-in-out`,`disabled:cursor-not-allowed`,_,v,b,c].join(` `),style:{...y,...u},...f}),o&&(0,n.jsx)(`span`,{"aria-hidden":!0,className:[`absolute text-text-muted pointer-events-none shrink-0`,k[r]].join(` `),children:o})]})}),M=e=>typeof e==`string`&&e.trim()!==``&&!isNaN(Number(e)),N=e=>typeof e==`number`?isNaN(e)?null:e:M(e)?Number(e):null,P={email:()=>e=>{let t=String(e??``);return/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(t)?{valid:!0,message:``}:{valid:!1,message:`El valor no es un correo válido`}},onlyNumbers:()=>e=>{let t=String(e??``);return/^\d+$/.test(t)?{valid:!0,message:``}:{valid:!1,message:`El valor debe contener solo números`}},min:e=>t=>{let n=N(t);return n===null?String(t??``).length>=e?{valid:!0,message:``}:{valid:!1,message:`La longitud debe ser al menos ${e}`}:n>=e?{valid:!0,message:``}:{valid:!1,message:`El valor debe ser mayor o igual a ${e}`}},max:e=>t=>{let n=N(t);return n===null?String(t??``).length<=e?{valid:!0,message:``}:{valid:!1,message:`La longitud debe ser como máximo ${e}`}:n<=e?{valid:!0,message:``}:{valid:!1,message:`El valor debe ser menor o igual a ${e}`}}},F=class e{checks=[];add(e){return this.checks.push(e),this}static email(){return new e().email()}static onlyNumbers(){return new e().onlyNumbers()}static min(t){return new e().min(t)}static max(t){return new e().max(t)}email(){return this.add(P.email())}onlyNumbers(){return this.add(P.onlyNumbers())}min(e){return this.add(P.min(e))}max(e){return this.add(P.max(e))}validate(e){for(let t of this.checks){let n=t(e);if(!n.valid)return n}return{valid:!0,message:``}}},I=({children:e})=>{let[r,i]=(0,t.useState)(!1);return(0,t.useEffect)(()=>{let e=()=>{let e=window.innerHeight>window.innerWidth;i(e)};return e(),window.addEventListener(`resize`,e),()=>window.removeEventListener(`resize`,e)},[]),r?(0,n.jsx)(n.Fragment,{children:e}):null},L=({children:e})=>{let[r,i]=(0,t.useState)(!1);return(0,t.useEffect)(()=>{let e=()=>{let e=window.innerHeight>window.innerWidth;i(!e)};return e(),window.addEventListener(`resize`,e),()=>window.removeEventListener(`resize`,e)},[]),r?(0,n.jsx)(n.Fragment,{children:e}):null},R=(0,t.forwardRef)(function({className:e=``,style:r,children:i,...a},o){let c=s(),l=(0,t.useMemo)(()=>({borderColor:c.darkMode?c.darkColors.border:c.colors.border,backgroundColor:c.darkMode?c.darkColors.background:c.colors.background}),[c]);return(0,n.jsx)(`div`,{ref:o,...a,className:[`px-2 py-1 rounded-xs shadow-md bg-white border`,e].join(` `),style:{...r,...l},children:i})});e.Background=S,e.Button=d,e.DesktopOnly=L,e.Header=y,e.Input=j,e.MobileOnly=I,e.Separator=C,e.Surface=R,e.ThemeProvider=o,e.Validate=F,e.themeConfig=r,e.useTheme=s,e.validators=P});
|
|
62
62
|
//# sourceMappingURL=unicornial-ui.umd.js.map
|
|
@@ -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/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","../src/components/Surface.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","import { forwardRef, useMemo, type HTMLAttributes } from \"react\";\nimport { useTheme } from \"../theme/ThemeProvider\";\n\nexport const Surface = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n function Surface(\n {\n className = \"\",\n style,\n children,\n ...props\n },\n ref,\n ) {\n const theme = useTheme();\n\n const resolvedStyles = useMemo(() => ({\n borderColor: theme.darkMode ? theme.darkColors.border : theme.colors.border,\n backgroundColor: theme.darkMode ? theme.darkColors.background : theme.colors.background,\n }), [theme]);\n return (\n <div\n ref={ref}\n {...props}\n className={\n [\n \"px-2 py-1 rounded-xs shadow-md bg-white border\", \n className\n ].join(\" \")\n }\n style={{\n ...style,\n ...resolvedStyles,\n }}\n >\n {children}\n </div>\n );\n },\n);"],"mappings":"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"}
|