@xscriptor/xcomponents 0.1.0 → 0.1.2

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.
Files changed (106) hide show
  1. package/README.md +1 -0
  2. package/dist/{chunk-QCMWPIG7.mjs → chunk-BXVG4SYP.mjs} +101 -3
  3. package/dist/chunk-BXVG4SYP.mjs.map +7 -0
  4. package/dist/{chunk-42XPBYTL.mjs → chunk-FW47JGYZ.mjs} +122 -4
  5. package/dist/chunk-FW47JGYZ.mjs.map +7 -0
  6. package/dist/chunk-FZRTAML3.mjs +1 -1
  7. package/dist/chunk-FZRTAML3.mjs.map +7 -1
  8. package/dist/{chunk-5G4P2E76.mjs → chunk-IK2UCTCM.mjs} +46 -6
  9. package/dist/chunk-IK2UCTCM.mjs.map +7 -0
  10. package/dist/{chunk-U27ZVCP7.mjs → chunk-WE7QZGVP.mjs} +45 -2
  11. package/dist/chunk-WE7QZGVP.mjs.map +7 -0
  12. package/dist/{chunk-2OAXRRVQ.mjs → chunk-XB3UGHSF.mjs} +94 -3
  13. package/dist/chunk-XB3UGHSF.mjs.map +7 -0
  14. package/dist/{chunk-NY22GB3E.mjs → chunk-ZDMG7X6H.mjs} +57 -2
  15. package/dist/chunk-ZDMG7X6H.mjs.map +7 -0
  16. package/dist/components/content/index.css +65 -66
  17. package/dist/components/content/index.css.map +7 -1
  18. package/dist/components/content/index.d.ts +2 -17
  19. package/dist/components/content/index.js +46 -10
  20. package/dist/components/content/index.js.map +7 -1
  21. package/dist/components/content/index.mjs +2 -2
  22. package/dist/components/content/index.mjs.map +7 -1
  23. package/dist/components/content/xinteractivephrase/XInteractivePhrase.d.ts +13 -0
  24. package/dist/components/content/xinteractivephrase/index.d.ts +3 -0
  25. package/dist/components/forms/index.css +114 -116
  26. package/dist/components/forms/index.css.map +7 -1
  27. package/dist/components/forms/index.d.ts +4 -68
  28. package/dist/components/forms/index.js +101 -8
  29. package/dist/components/forms/index.js.map +7 -1
  30. package/dist/components/forms/index.mjs +2 -2
  31. package/dist/components/forms/index.mjs.map +7 -1
  32. package/dist/components/forms/xcontactform/XContactForm.d.ts +42 -0
  33. package/dist/components/forms/xcontactform/index.d.ts +3 -0
  34. package/dist/components/forms/xnewsletter/XNewsletter.d.ts +21 -0
  35. package/dist/components/forms/xnewsletter/index.d.ts +3 -0
  36. package/dist/components/gallery/index.css +108 -111
  37. package/dist/components/gallery/index.css.map +7 -1
  38. package/dist/components/gallery/index.d.ts +4 -29
  39. package/dist/components/gallery/index.js +94 -8
  40. package/dist/components/gallery/index.js.map +7 -1
  41. package/dist/components/gallery/index.mjs +2 -2
  42. package/dist/components/gallery/index.mjs.map +7 -1
  43. package/dist/components/gallery/xmicrogallerytext/XMicroGalleryText.d.ts +15 -0
  44. package/dist/components/gallery/xmicrogallerytext/index.d.ts +3 -0
  45. package/dist/components/gallery/xstaticgallery/XStaticGallery.d.ts +10 -0
  46. package/dist/components/gallery/xstaticgallery/index.d.ts +3 -0
  47. package/dist/components/index.css +537 -535
  48. package/dist/components/index.css.map +7 -1
  49. package/dist/components/index.d.ts +6 -8
  50. package/dist/components/index.js +460 -35
  51. package/dist/components/index.js.map +7 -1
  52. package/dist/components/index.mjs +12 -12
  53. package/dist/components/index.mjs.map +7 -1
  54. package/dist/components/layout/index.css +90 -82
  55. package/dist/components/layout/index.css.map +7 -1
  56. package/dist/components/layout/index.d.ts +6 -55
  57. package/dist/components/layout/index.js +122 -10
  58. package/dist/components/layout/index.js.map +7 -1
  59. package/dist/components/layout/index.mjs +2 -2
  60. package/dist/components/layout/index.mjs.map +7 -1
  61. package/dist/components/layout/xfooter/XFooter.d.ts +24 -0
  62. package/dist/components/layout/xfooter/index.d.ts +3 -0
  63. package/dist/components/layout/xseparator/XSeparator.d.ts +13 -0
  64. package/dist/components/layout/xseparator/index.d.ts +3 -0
  65. package/dist/components/layout/xzigzaglayout/XZigZagLayout.d.ts +12 -0
  66. package/dist/components/layout/xzigzaglayout/index.d.ts +3 -0
  67. package/dist/components/navigation/index.css +121 -121
  68. package/dist/components/navigation/index.css.map +7 -1
  69. package/dist/components/navigation/index.d.ts +2 -76
  70. package/dist/components/navigation/index.js +57 -6
  71. package/dist/components/navigation/index.js.map +7 -1
  72. package/dist/components/navigation/index.mjs +2 -2
  73. package/dist/components/navigation/index.mjs.map +7 -1
  74. package/dist/components/navigation/{index.d.mts → xnavbar/XNavbar.d.ts} +6 -10
  75. package/dist/components/navigation/xnavbar/index.d.ts +3 -0
  76. package/dist/components/social/index.css +44 -44
  77. package/dist/components/social/index.css.map +7 -1
  78. package/dist/components/social/index.d.ts +2 -55
  79. package/dist/components/social/index.js +45 -13
  80. package/dist/components/social/index.js.map +7 -1
  81. package/dist/components/social/index.mjs +2 -2
  82. package/dist/components/social/index.mjs.map +7 -1
  83. package/dist/components/social/xsocialcontact/XSocialContact.d.ts +30 -0
  84. package/dist/components/social/xsocialcontact/XSocialIcons.d.ts +21 -0
  85. package/dist/components/social/xsocialcontact/index.d.ts +5 -0
  86. package/dist/index.css +537 -535
  87. package/dist/index.css.map +7 -1
  88. package/dist/index.d.ts +1 -8
  89. package/dist/index.js +463 -38
  90. package/dist/index.js.map +7 -1
  91. package/dist/index.mjs +12 -12
  92. package/dist/index.mjs.map +7 -1
  93. package/package.json +7 -4
  94. package/dist/chunk-2OAXRRVQ.mjs.map +0 -1
  95. package/dist/chunk-42XPBYTL.mjs.map +0 -1
  96. package/dist/chunk-5G4P2E76.mjs.map +0 -1
  97. package/dist/chunk-NY22GB3E.mjs.map +0 -1
  98. package/dist/chunk-QCMWPIG7.mjs.map +0 -1
  99. package/dist/chunk-U27ZVCP7.mjs.map +0 -1
  100. package/dist/components/content/index.d.mts +0 -17
  101. package/dist/components/forms/index.d.mts +0 -68
  102. package/dist/components/gallery/index.d.mts +0 -29
  103. package/dist/components/index.d.mts +0 -8
  104. package/dist/components/layout/index.d.mts +0 -55
  105. package/dist/components/social/index.d.mts +0 -55
  106. package/dist/index.d.mts +0 -8
@@ -1,76 +1,2 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { ReactNode } from 'react';
3
-
4
- type NavLinkItem = {
5
- /** Ruta destino */
6
- url: string;
7
- /** Texto visible */
8
- title: string;
9
- /** Si es true abre en pestaña nueva y muestra el indicador ↗ */
10
- external?: boolean;
11
- };
12
- /**
13
- * ReactNode estático O función de render (size, color?) => ReactNode.
14
- * La función recibe el tamaño y el color vigente para que el ícono
15
- * pueda adaptarse dinámicamente a los props del navbar.
16
- */
17
- type IconRenderer = ReactNode | ((size: number, color?: string) => ReactNode);
18
- type ThemeToggleIcons = {
19
- /** Ícono/renderer hacia tema oscuro (ReactNode o función) */
20
- toDark: IconRenderer;
21
- /** Ícono/renderer hacia tema claro (ReactNode o función) */
22
- toLight: IconRenderer;
23
- };
24
- type XNavbarProps = {
25
- /** Links que aparecen a la izquierda del logo en desktop */
26
- linksLeft?: NavLinkItem[];
27
- /** Links que aparecen a la derecha del logo en desktop */
28
- linksRight?: NavLinkItem[];
29
- /** Contenido del botón central (texto o JSX). Por defecto: "X" */
30
- logo?: ReactNode;
31
- /** Si true el logo actúa como toggle de tema (comportamiento original). Default: true */
32
- logoAsThemeToggle?: boolean;
33
- /** Callback custom si logoAsThemeToggle es false */
34
- onLogoClick?: () => void;
35
- /** Íconos para el toggle de tema. Si no se pasa, no se mostrará hint de ícono */
36
- themeIcons?: ThemeToggleIcons;
37
- /** Tema inicial. Default: "light" */
38
- defaultTheme?: "light" | "dark";
39
- /** Key de localStorage para persistencia del tema. Default: "theme" */
40
- storageKey?: string;
41
- /** Color base de los enlaces (Inicio, Contacto, etc.). Default: var(--text) */
42
- linkColor?: string;
43
- /** Color al hacer hover sobre los enlaces. Default: opacidad reducida del linkColor */
44
- linkHoverColor?: string;
45
- /** Color del borde inferior del enlace activo. Default: linkColor */
46
- linkActiveColor?: string;
47
- /** Color base de los íconos. Acepta cualquier valor CSS: hex, hsl, "var(--accent)", etc.
48
- * Si no se pasa, los íconos heredan el color del texto (currentColor). */
49
- iconColor?: string;
50
- /** Color que toman los íconos al hacer hover sobre el logo. Default: iconColor */
51
- iconHoverColor?: string;
52
- /** Tamaño en px que se pasa a IconRenderer cuando es función. Default: 22 */
53
- iconSize?: number;
54
- /** Color de las 3 barras (y la X de cierre móvil). Acepta cualquier valor CSS. Default: var(--text) */
55
- hamburgerColor?: string;
56
- /** Ancho de las barras. Cualquier unidad CSS. Default: "2rem" */
57
- hamburgerBarWidth?: string;
58
- /** Grosor (altura) de las barras. Cualquier unidad CSS. Default: "3px" */
59
- hamburgerBarThickness?: string;
60
- /** Inyecta variables CSS extra directamente en el style del <header>.
61
- * Útil para pasar tokens del tema: { '--xnav-icon-color': 'var(--accent)' } */
62
- cssVars?: Record<string, string>;
63
- /** aria-label del botón hamburguesa cuando está cerrado. Default: "Abrir menú" */
64
- labelOpen?: string;
65
- /** aria-label del botón hamburguesa cuando está abierto. Default: "Cerrar menú" */
66
- labelClose?: string;
67
- /** Texto del botón de tema oscuro en menú móvil. Default: "Oscuro" */
68
- labelDark?: string;
69
- /** Texto del botón de tema claro en menú móvil. Default: "Claro" */
70
- labelLight?: string;
71
- /** className extra que se añade al <header> */
72
- className?: string;
73
- };
74
- declare function XNavbar({ linksLeft, linksRight, logo, logoAsThemeToggle, onLogoClick, themeIcons, defaultTheme, storageKey, linkColor, linkHoverColor, linkActiveColor, iconColor, iconHoverColor, iconSize, hamburgerColor, hamburgerBarWidth, hamburgerBarThickness, cssVars, labelOpen, labelClose, labelDark, labelLight, className, }: XNavbarProps): react_jsx_runtime.JSX.Element;
75
-
76
- export { type IconRenderer, type NavLinkItem, type ThemeToggleIcons, XNavbar, type XNavbarProps };
1
+ export { XNavbar } from "./xnavbar";
2
+ export type { XNavbarProps, NavLinkItem, ThemeToggleIcons, IconRenderer, } from "./xnavbar";
@@ -40,8 +40,63 @@ var import_framer_motion = require("framer-motion");
40
40
  var import_link = __toESM(require("next/link"));
41
41
  var import_navigation = require("next/navigation");
42
42
 
43
+ // esbuild-css-modules-plugin-ns-js::src/components/navigation/xnavbar/XNavbar.module.css:injector.js
44
+ var content = __content_placeholder__;
45
+ var digest = __digest_placeholder__;
46
+ var inject = () => {
47
+ setTimeout(() => {
48
+ if (!globalThis.document) {
49
+ return;
50
+ }
51
+ let root = globalThis.document.querySelector("head");
52
+ if (root && root.shadowRoot) {
53
+ root = root.shadowRoot;
54
+ }
55
+ if (!root) {
56
+ root = globalThis.document.head;
57
+ }
58
+ let container = root.querySelector("#_" + digest);
59
+ if (!container) {
60
+ container = globalThis.document.createElement("style");
61
+ container.id = "_" + digest;
62
+ const text = globalThis.document.createTextNode(content);
63
+ container.appendChild(text);
64
+ root.appendChild(container);
65
+ }
66
+ }, 0);
67
+ };
68
+
43
69
  // src/components/navigation/xnavbar/XNavbar.module.css
44
- var XNavbar_default = {};
70
+ var XNavbar_default = new Proxy({
71
+ "bar": "XNavbar-module__bar_wx7KiW__012",
72
+ "closeBar": "XNavbar-module__closeBar_wx7KiW__012",
73
+ "desktopLinksLeft": "XNavbar-module__desktopLinksLeft_wx7KiW__012",
74
+ "desktopLinksRight": "XNavbar-module__desktopLinksRight_wx7KiW__012",
75
+ "desktopNav": "XNavbar-module__desktopNav_wx7KiW__012",
76
+ "hamburgerBtn": "XNavbar-module__hamburgerBtn_wx7KiW__012",
77
+ "header": "XNavbar-module__header_wx7KiW__012",
78
+ "iconTray": "XNavbar-module__iconTray_wx7KiW__012",
79
+ "iconTrayLeft": "XNavbar-module__iconTrayLeft_wx7KiW__012",
80
+ "iconTrayRight": "XNavbar-module__iconTrayRight_wx7KiW__012",
81
+ "logoBtn": "XNavbar-module__logoBtn_wx7KiW__012",
82
+ "logoSlot": "XNavbar-module__logoSlot_wx7KiW__012",
83
+ "logoWrapper": "XNavbar-module__logoWrapper_wx7KiW__012",
84
+ "mobileCloseBtn": "XNavbar-module__mobileCloseBtn_wx7KiW__012",
85
+ "mobileLogo": "XNavbar-module__mobileLogo_wx7KiW__012",
86
+ "mobileNavLink": "XNavbar-module__mobileNavLink_wx7KiW__012",
87
+ "mobileNavLinkActive": "XNavbar-module__mobileNavLinkActive_wx7KiW__012",
88
+ "mobileOverlay": "XNavbar-module__mobileOverlay_wx7KiW__012",
89
+ "mobileToggle": "XNavbar-module__mobileToggle_wx7KiW__012",
90
+ "navLink": "XNavbar-module__navLink_wx7KiW__012",
91
+ "navLinkActive": "XNavbar-module__navLinkActive_wx7KiW__012",
92
+ "navLinkExternal": "XNavbar-module__navLinkExternal_wx7KiW__012",
93
+ "themeToggleMobile": "XNavbar-module__themeToggleMobile_wx7KiW__012"
94
+ }, {
95
+ get: function(source, key) {
96
+ inject();
97
+ return source[key];
98
+ }
99
+ });
45
100
 
46
101
  // src/components/navigation/xnavbar/XNavbar.tsx
47
102
  var import_jsx_runtime = require("react/jsx-runtime");
@@ -340,8 +395,4 @@ function XNavbar({
340
395
  }
341
396
  );
342
397
  }
343
- // Annotate the CommonJS export names for ESM import in node:
344
- 0 && (module.exports = {
345
- XNavbar
346
- });
347
- //# sourceMappingURL=index.js.map
398
+ //# sourceMappingURL=index.js.map
@@ -1 +1,7 @@
1
- {"version":3,"sources":["../../../src/components/navigation/index.ts","../../../src/components/navigation/xnavbar/XNavbar.tsx","../../../src/components/navigation/xnavbar/XNavbar.module.css"],"sourcesContent":["export { XNavbar } from \"./xnavbar\";\nexport type {\n XNavbarProps,\n NavLinkItem,\n ThemeToggleIcons,\n IconRenderer,\n} from \"./xnavbar\";\n","\"use client\";\n\nimport { useEffect, useState, ReactNode, CSSProperties } from \"react\";\nimport { motion, Variants } from \"framer-motion\";\nimport Link from \"next/link\";\nimport { usePathname } from \"next/navigation\";\nimport styles from \"./XNavbar.module.css\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Tipos públicos — exportados para que el consumidor pueda tipear sus datos\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type NavLinkItem = {\n /** Ruta destino */\n url: string;\n /** Texto visible */\n title: string;\n /** Si es true abre en pestaña nueva y muestra el indicador ↗ */\n external?: boolean;\n};\n\n/**\n * ReactNode estático O función de render (size, color?) => ReactNode.\n * La función recibe el tamaño y el color vigente para que el ícono\n * pueda adaptarse dinámicamente a los props del navbar.\n */\nexport type IconRenderer = ReactNode | ((size: number, color?: string) => ReactNode);\n\nexport type ThemeToggleIcons = {\n /** Ícono/renderer hacia tema oscuro (ReactNode o función) */\n toDark: IconRenderer;\n /** Ícono/renderer hacia tema claro (ReactNode o función) */\n toLight: IconRenderer;\n};\n\nexport type XNavbarProps = {\n // ── Navegación ──────────────────────────────────────────────────────────\n /** Links que aparecen a la izquierda del logo en desktop */\n linksLeft?: NavLinkItem[];\n /** Links que aparecen a la derecha del logo en desktop */\n linksRight?: NavLinkItem[];\n\n // ── Logo central ────────────────────────────────────────────────────────\n /** Contenido del botón central (texto o JSX). Por defecto: \"X\" */\n logo?: ReactNode;\n /** Si true el logo actúa como toggle de tema (comportamiento original). Default: true */\n logoAsThemeToggle?: boolean;\n /** Callback custom si logoAsThemeToggle es false */\n onLogoClick?: () => void;\n\n // ── Toggle de tema ──────────────────────────────────────────────────────\n /** Íconos para el toggle de tema. Si no se pasa, no se mostrará hint de ícono */\n themeIcons?: ThemeToggleIcons;\n /** Tema inicial. Default: \"light\" */\n defaultTheme?: \"light\" | \"dark\";\n /** Key de localStorage para persistencia del tema. Default: \"theme\" */\n storageKey?: string;\n\n // ── Color de los enlaces de navegación ──────────────────────────────────────\n /** Color base de los enlaces (Inicio, Contacto, etc.). Default: var(--text) */\n linkColor?: string;\n /** Color al hacer hover sobre los enlaces. Default: opacidad reducida del linkColor */\n linkHoverColor?: string;\n /** Color del borde inferior del enlace activo. Default: linkColor */\n linkActiveColor?: string;\n\n // ── Color y tamaño de íconos theme-toggle ────────────────────────────────\n /** Color base de los íconos. Acepta cualquier valor CSS: hex, hsl, \"var(--accent)\", etc.\n * Si no se pasa, los íconos heredan el color del texto (currentColor). */\n iconColor?: string;\n /** Color que toman los íconos al hacer hover sobre el logo. Default: iconColor */\n iconHoverColor?: string;\n /** Tamaño en px que se pasa a IconRenderer cuando es función. Default: 22 */\n iconSize?: number;\n\n // ── Hamburguesa ──────────────────────────────────────────────────────────\n /** Color de las 3 barras (y la X de cierre móvil). Acepta cualquier valor CSS. Default: var(--text) */\n hamburgerColor?: string;\n /** Ancho de las barras. Cualquier unidad CSS. Default: \"2rem\" */\n hamburgerBarWidth?: string;\n /** Grosor (altura) de las barras. Cualquier unidad CSS. Default: \"3px\" */\n hamburgerBarThickness?: string;\n\n // ── Variables CSS personalizadas ─────────────────────────────────────────\n /** Inyecta variables CSS extra directamente en el style del <header>.\n * Útil para pasar tokens del tema: { '--xnav-icon-color': 'var(--accent)' } */\n cssVars?: Record<string, string>;\n\n // ── Labels de accesibilidad ─────────────────────────────────────────────\n /** aria-label del botón hamburguesa cuando está cerrado. Default: \"Abrir menú\" */\n labelOpen?: string;\n /** aria-label del botón hamburguesa cuando está abierto. Default: \"Cerrar menú\" */\n labelClose?: string;\n /** Texto del botón de tema oscuro en menú móvil. Default: \"Oscuro\" */\n labelDark?: string;\n /** Texto del botón de tema claro en menú móvil. Default: \"Claro\" */\n labelLight?: string;\n\n // ── Estilos adicionales ─────────────────────────────────────────────────\n /** className extra que se añade al <header> */\n className?: string;\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Variantes de animación (idénticas al navbar original)\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst iconTrayRightVariants: Variants = {\n hidden: { opacity: 0, x: -6, pointerEvents: \"none\" },\n visible: { opacity: 1, x: 0, pointerEvents: \"none\", transition: { duration: 0.18 } },\n};\nconst iconTrayLeftVariants: Variants = {\n hidden: { opacity: 0, x: 6, pointerEvents: \"none\" },\n visible: { opacity: 1, x: 0, pointerEvents: \"none\", transition: { duration: 0.18 } },\n};\n\nconst topVariants: Variants = { closed: { rotate: 0 }, opened: { rotate: 45 } };\nconst centerVariants: Variants = { closed: { opacity: 1 }, opened: { opacity: 0 } };\nconst bottomVariants: Variants = { closed: { rotate: 0 }, opened: { rotate: -45 } };\n\nconst listVariants: Variants = {\n closed: { x: \"100vw\" },\n opened: { x: 0, transition: { when: \"beforeChildren\", staggerChildren: 0.02 } },\n};\nconst itemVariants: Variants = {\n closed: { x: -10, opacity: 0 },\n opened: { x: 0, opacity: 1 },\n};\n\n/** Renderiza un IconRenderer: si es función la llama con (size, color?), si es ReactNode lo devuelve tal cual. */\nfunction renderIcon(\n icon: IconRenderer,\n size: number,\n color?: string\n): ReactNode {\n if (typeof icon === \"function\") return icon(size, color);\n return icon;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Sub-componente NavLink (interno)\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype NavLinkProps = {\n link: NavLinkItem;\n onClick?: () => void;\n mobile?: boolean;\n};\n\nfunction XNavLink({ link, onClick, mobile }: NavLinkProps) {\n const pathname = usePathname();\n const isActive =\n link.url === \"/\" ? pathname === \"/\" : pathname?.startsWith(link.url);\n\n const baseClass = mobile ? styles.mobileNavLink : styles.navLink;\n const activeClass = mobile ? styles.mobileNavLinkActive : styles.navLinkActive;\n const externalClass = link.external ? styles.navLinkExternal : \"\";\n\n return (\n <Link\n href={link.url}\n onClick={onClick}\n target={link.external ? \"_blank\" : undefined}\n rel={link.external ? \"noopener noreferrer\" : undefined}\n aria-label={`Ir a ${link.title}`}\n aria-current={isActive ? \"page\" : undefined}\n className={[baseClass, isActive ? activeClass : \"\", externalClass]\n .filter(Boolean)\n .join(\" \")}\n >\n {link.title}\n </Link>\n );\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Componente principal XNavbar\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport default function XNavbar({\n linksLeft = [],\n linksRight = [],\n logo = \"X\",\n logoAsThemeToggle = true,\n onLogoClick,\n themeIcons,\n defaultTheme = \"light\",\n storageKey = \"theme\",\n linkColor,\n linkHoverColor,\n linkActiveColor,\n iconColor,\n iconHoverColor,\n iconSize = 22,\n hamburgerColor,\n hamburgerBarWidth,\n hamburgerBarThickness,\n cssVars,\n labelOpen = \"Abrir menú\",\n labelClose = \"Cerrar menú\",\n labelDark = \"Oscuro\",\n labelLight = \"Claro\",\n className,\n}: XNavbarProps) {\n const [open, setOpen] = useState(false);\n const [hoverX, setHoverX] = useState(false);\n const [theme, setTheme] = useState<\"light\" | \"dark\">(defaultTheme);\n\n // Persistir tema\n useEffect(() => {\n const saved = (typeof window !== \"undefined\" &&\n localStorage.getItem(storageKey)) as \"light\" | \"dark\" | null;\n applyTheme(saved ?? defaultTheme);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n function applyTheme(t: \"light\" | \"dark\") {\n setTheme(t);\n const root = document.documentElement;\n if (t === \"dark\") root.setAttribute(\"data-theme\", \"dark\");\n else root.removeAttribute(\"data-theme\");\n localStorage.setItem(storageKey, t);\n }\n\n function toggleTheme() {\n applyTheme(theme === \"dark\" ? \"light\" : \"dark\");\n }\n\n // Bloquear scroll — usamos documentElement para no tocar document.body\n useEffect(() => {\n document.documentElement.style.overflow = open ? \"hidden\" : \"\";\n return () => { document.documentElement.style.overflow = \"\"; };\n }, [open]);\n\n // Cerrar con ESC\n useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") setOpen(false);\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [open]);\n\n const allLinks = [...linksLeft, ...linksRight];\n\n // ── CSS vars inyectadas en el <header> via inline style ─────────────────\n // Usando \"--xnav-*\" como namespace para no colisionar con vars globales.\n const headerStyle = {\n ...(linkColor && { \"--xnav-link-color\" : linkColor }),\n ...(linkHoverColor && { \"--xnav-link-hover\" : linkHoverColor }),\n ...(linkActiveColor && { \"--xnav-link-active\" : linkActiveColor }),\n ...(iconColor && { \"--xnav-icon-color\" : iconColor }),\n ...(iconHoverColor && { \"--xnav-icon-hover\" : iconHoverColor }),\n ...(hamburgerColor && { \"--xnav-bar-color\" : hamburgerColor }),\n ...(hamburgerBarWidth && { \"--xnav-bar-w\" : hamburgerBarWidth }),\n ...(hamburgerBarThickness && { \"--xnav-bar-h\" : hamburgerBarThickness }),\n ...cssVars,\n } as CSSProperties;\n\n // Acción del logo central\n const handleLogoClick = () => {\n if (logoAsThemeToggle) {\n toggleTheme();\n } else {\n onLogoClick?.();\n }\n };\n\n const logoAriaLabel = logoAsThemeToggle\n ? `Cambiar a tema ${theme === \"dark\" ? \"claro\" : \"oscuro\"}`\n : undefined;\n\n const logoTitle = logoAsThemeToggle\n ? theme === \"dark\"\n ? \"Cambiar a tema claro\"\n : \"Cambiar a tema oscuro\"\n : undefined;\n\n return (\n <header\n className={[styles.header, className].filter(Boolean).join(\" \")}\n style={headerStyle}\n role=\"banner\"\n >\n {/* ── Desktop ── */}\n <nav className={styles.desktopNav} aria-label=\"Navegación principal\">\n <div className={styles.desktopLinksLeft}>\n {linksLeft.map((link) => (\n <XNavLink key={link.url + link.title} link={link} />\n ))}\n </div>\n\n {/* Botón logo central */}\n <div className={styles.logoSlot}>\n <div\n className={styles.logoWrapper}\n onMouseEnter={() => setHoverX(true)}\n onMouseLeave={() => setHoverX(false)}\n >\n <button\n type=\"button\"\n onClick={handleLogoClick}\n aria-label={logoAriaLabel}\n title={logoTitle}\n className={styles.logoBtn}\n >\n {logo}\n </button>\n\n {/* Ícono hint al hover (solo si se pasan themeIcons y el logo es toggle de tema) */}\n {logoAsThemeToggle && themeIcons && (\n <>\n {theme === \"light\" ? (\n <motion.div\n initial={false}\n animate={hoverX ? \"visible\" : \"hidden\"}\n variants={iconTrayRightVariants}\n className={`${styles.iconTray} ${styles.iconTrayRight}`}\n style={{\n color:\n (hoverX ? iconHoverColor ?? iconColor : iconColor) ||\n undefined,\n }}\n aria-hidden\n >\n {renderIcon(themeIcons.toDark, iconSize, iconColor)}\n </motion.div>\n ) : (\n <motion.div\n initial={false}\n animate={hoverX ? \"visible\" : \"hidden\"}\n variants={iconTrayLeftVariants}\n className={`${styles.iconTray} ${styles.iconTrayLeft}`}\n style={{\n color:\n (hoverX ? iconHoverColor ?? iconColor : iconColor) ||\n undefined,\n }}\n aria-hidden\n >\n {renderIcon(themeIcons.toLight, iconSize, iconColor)}\n </motion.div>\n )}\n </>\n )}\n </div>\n </div>\n\n <div className={styles.desktopLinksRight}>\n {linksRight.map((link) => (\n <XNavLink key={link.url + link.title} link={link} />\n ))}\n </div>\n </nav>\n\n {/* ── Mobile: botón hamburguesa ── */}\n <div className={styles.mobileToggle}>\n <button\n aria-label={open ? labelClose : labelOpen}\n aria-expanded={open}\n aria-controls=\"xnavbar-mobile-menu\"\n onClick={() => setOpen((p) => !p)}\n className={styles.hamburgerBtn}\n title={open ? labelClose : labelOpen}\n >\n <motion.div\n variants={topVariants}\n initial=\"closed\"\n animate={open ? \"opened\" : \"closed\"}\n className={styles.bar}\n style={{ originX: \"left\" }}\n aria-hidden\n />\n <motion.div\n variants={centerVariants}\n initial=\"closed\"\n animate={open ? \"opened\" : \"closed\"}\n className={styles.bar}\n aria-hidden\n />\n <motion.div\n variants={bottomVariants}\n initial=\"closed\"\n animate={open ? \"opened\" : \"closed\"}\n className={styles.bar}\n style={{ originX: \"left\" }}\n aria-hidden\n />\n </button>\n </div>\n\n {/* ── Mobile overlay — position:fixed, sin portal, sin document.body ── */}\n {open && (\n <motion.div\n id=\"xnavbar-mobile-menu\"\n variants={listVariants}\n initial=\"closed\"\n animate=\"opened\"\n className={styles.mobileOverlay}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Menú de navegación\"\n >\n {/* Botón cerrar */}\n <button\n aria-label={labelClose}\n onClick={() => setOpen(false)}\n className={styles.mobileCloseBtn}\n style={{ WebkitTapHighlightColor: \"transparent\" }}\n >\n <span\n aria-hidden\n className={styles.closeBar}\n style={{ transform: \"rotate(45deg)\" }}\n />\n <span\n aria-hidden\n className={styles.closeBar}\n style={{ transform: \"rotate(-45deg)\" }}\n />\n <span className=\"sr-only\">{labelClose}</span>\n </button>\n\n {/* Logo decorativo */}\n <motion.div variants={itemVariants} className={styles.mobileLogo}>\n {logo}\n </motion.div>\n\n {/* Links */}\n {allLinks.map((link) => (\n <motion.div key={link.url + link.title} variants={itemVariants}>\n <XNavLink\n link={link}\n onClick={() => setOpen(false)}\n mobile\n />\n </motion.div>\n ))}\n\n {/* Toggle de tema */}\n <motion.button\n variants={itemVariants}\n onClick={toggleTheme}\n className={styles.themeToggleMobile}\n >\n {themeIcons ? (\n theme === \"light\" ? (\n <>\n {renderIcon(themeIcons.toDark, iconSize, iconColor)}\n {labelDark}\n </>\n ) : (\n <>\n {renderIcon(themeIcons.toLight, iconSize, iconColor)}\n {labelLight}\n </>\n )\n ) : theme === \"light\" ? (\n labelDark\n ) : (\n labelLight\n )}\n </motion.button>\n </motion.div>\n )}\n </header>\n );\n}\n","/* ────────────────────────────────────────────\n XNavbar.module.css\n Navbar completamente libre de Tailwind.\n Usa variables CSS del tema global (--bg, --text, --border, --accent).\n ──────────────────────────────────────────── */\n\n/* ── Header / contenedor raíz ── */\n.header {\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 2rem 3rem;\n background: var(--bg);\n color: var(--text);\n font-size: 1.25rem;\n z-index: 60;\n}\n\n@media (min-width: 640px) { .header { padding-inline: 2rem; } }\n@media (min-width: 768px) { .header { padding-inline: 3rem; } }\n@media (min-width: 1024px) { .header { padding-inline: 5rem; } }\n@media (min-width: 1280px) { .header { padding-inline: 12rem; } }\n\n/* ── Desktop nav ── */\n.desktopNav {\n display: none;\n align-items: center;\n width: 100%;\n grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);\n padding-bottom: 0.5rem;\n}\n\n@media (min-width: 768px) {\n .desktopNav {\n display: grid;\n }\n}\n\n.desktopLinksLeft,\n.desktopLinksRight {\n display: flex;\n align-items: center;\n gap: 1.5rem;\n min-width: 0;\n}\n\n.desktopLinksLeft {\n justify-content: flex-end;\n}\n\n.desktopLinksRight {\n justify-content: flex-start;\n}\n\n.logoSlot {\n display: flex;\n justify-content: center;\n align-items: center;\n}\n\n/* ── Logo / botón central (desktop) ── */\n.logoWrapper {\n position: relative;\n margin-inline: 1rem;\n display: flex;\n align-items: center;\n}\n\n.logoBtn {\n font-weight: 700;\n font-size: 1.5rem;\n line-height: 1;\n user-select: none;\n background: none;\n border: none;\n cursor: pointer;\n color: var(--text);\n padding: 0;\n}\n\n/* ── Tray de íconos hover (sun/moon) ── */\n.iconTray {\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n pointer-events: none;\n}\n\n.iconTrayRight {\n left: 100%;\n padding-left: 0.75rem;\n}\n\n.iconTrayLeft {\n right: 100%;\n padding-right: 0.75rem;\n}\n\n/* ── NavLink (desktop) ── */\n.navLink {\n padding: 0.25rem;\n border-bottom: 2px solid transparent;\n transition: border-color 0.2s, opacity 0.2s, color 0.2s;\n color: var(--xnav-link-color, var(--text));\n text-decoration: none;\n white-space: nowrap;\n}\n\n.navLink:hover {\n color: var(--xnav-link-hover, var(--xnav-link-color, var(--text)));\n opacity: var(--xnav-link-hover-opacity, 0.7);\n}\n\n.navLinkActive {\n border-bottom-color: var(--xnav-link-active, var(--xnav-link-color, var(--text)));\n font-weight: 600;\n}\n\n/* External link indicator */\n.navLinkExternal::after {\n content: \" ↗\";\n font-size: 0.7em;\n opacity: 0.6;\n}\n\n/* ── Mobile hamburger ── */\n.mobileToggle {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n@media (min-width: 768px) {\n .mobileToggle {\n display: none;\n }\n}\n\n.hamburgerBtn {\n width: 2.5rem;\n height: 2rem;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: space-between;\n background: none;\n border: none;\n cursor: pointer;\n position: relative;\n z-index: 80;\n padding: 0;\n}\n\n.bar {\n width: var(--xnav-bar-w, 2rem);\n height: var(--xnav-bar-h, 3px);\n background: var(--xnav-bar-color, var(--text));\n border-radius: 2px;\n}\n\n/* ── Mobile overlay (portal) ── */\n.mobileOverlay {\n position: fixed;\n inset: 0;\n width: 100vw;\n height: 100svh;\n background: var(--bg);\n color: var(--text);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 2rem;\n font-size: 2.5rem;\n z-index: 9999;\n}\n\n.mobileCloseBtn {\n position: fixed;\n top: 2rem;\n left: 1rem;\n width: 2.5rem;\n height: 2rem;\n display: flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n cursor: pointer;\n /* hereda el mismo color que las barras del hamburguesa */\n color: var(--xnav-bar-color, var(--text));\n z-index: 10000;\n -webkit-tap-highlight-color: transparent;\n}\n\n.closeBar {\n display: block;\n position: absolute;\n width: 2rem;\n height: 3px;\n border-radius: 2px;\n background: currentColor;\n}\n\n.mobileLogo {\n font-weight: 700;\n font-size: 3rem;\n user-select: none;\n pointer-events: none;\n}\n\n.mobileNavLink {\n font-size: 2.5rem;\n color: var(--xnav-link-color, var(--text));\n text-decoration: none;\n border-bottom: 2px solid transparent;\n transition: border-color 0.2s, color 0.2s, opacity 0.2s;\n padding: 0.25rem;\n}\n\n.mobileNavLink:hover {\n color: var(--xnav-link-hover, var(--xnav-link-color, var(--text)));\n opacity: var(--xnav-link-hover-opacity, 0.7);\n}\n\n.mobileNavLinkActive {\n font-weight: 600;\n border-bottom-color: var(--xnav-link-active, var(--xnav-link-color, var(--text)));\n}\n\n/* ── Botón tema (móvil) ── */\n.themeToggleMobile {\n margin-top: 1rem;\n font-size: 1rem;\n padding: 0.5rem 1rem;\n border: 1px solid var(--border);\n border-radius: 0.375rem;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n background: none;\n color: var(--text);\n cursor: pointer;\n transition: opacity 0.2s;\n}\n\n.themeToggleMobile:hover {\n opacity: 0.7;\n}\n"],"mappings":"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","names":["Link"]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/navigation/index.ts", "../../../src/components/navigation/xnavbar/XNavbar.tsx", "esbuild-css-modules-plugin-ns-js::src/components/navigation/xnavbar/XNavbar.module.css:injector.js", "../../../src/components/navigation/xnavbar/XNavbar.module.css"],
4
+ "sourcesContent": ["export { XNavbar } from \"./xnavbar\";\nexport type {\n XNavbarProps,\n NavLinkItem,\n ThemeToggleIcons,\n IconRenderer,\n} from \"./xnavbar\";\n", "\"use client\";\n\nimport { useEffect, useState, ReactNode, CSSProperties } from \"react\";\nimport { motion, Variants } from \"framer-motion\";\nimport Link from \"next/link\";\nimport { usePathname } from \"next/navigation\";\nimport styles from \"./XNavbar.module.css\";\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Tipos p\u00FAblicos \u2014 exportados para que el consumidor pueda tipear sus datos\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type NavLinkItem = {\n /** Ruta destino */\n url: string;\n /** Texto visible */\n title: string;\n /** Si es true abre en pesta\u00F1a nueva y muestra el indicador \u2197 */\n external?: boolean;\n};\n\n/**\n * ReactNode est\u00E1tico O funci\u00F3n de render (size, color?) => ReactNode.\n * La funci\u00F3n recibe el tama\u00F1o y el color vigente para que el \u00EDcono\n * pueda adaptarse din\u00E1micamente a los props del navbar.\n */\nexport type IconRenderer = ReactNode | ((size: number, color?: string) => ReactNode);\n\nexport type ThemeToggleIcons = {\n /** \u00CDcono/renderer hacia tema oscuro (ReactNode o funci\u00F3n) */\n toDark: IconRenderer;\n /** \u00CDcono/renderer hacia tema claro (ReactNode o funci\u00F3n) */\n toLight: IconRenderer;\n};\n\nexport type XNavbarProps = {\n // \u2500\u2500 Navegaci\u00F3n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n /** Links que aparecen a la izquierda del logo en desktop */\n linksLeft?: NavLinkItem[];\n /** Links que aparecen a la derecha del logo en desktop */\n linksRight?: NavLinkItem[];\n\n // \u2500\u2500 Logo central \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n /** Contenido del bot\u00F3n central (texto o JSX). Por defecto: \"X\" */\n logo?: ReactNode;\n /** Si true el logo act\u00FAa como toggle de tema (comportamiento original). Default: true */\n logoAsThemeToggle?: boolean;\n /** Callback custom si logoAsThemeToggle es false */\n onLogoClick?: () => void;\n\n // \u2500\u2500 Toggle de tema \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n /** \u00CDconos para el toggle de tema. Si no se pasa, no se mostrar\u00E1 hint de \u00EDcono */\n themeIcons?: ThemeToggleIcons;\n /** Tema inicial. Default: \"light\" */\n defaultTheme?: \"light\" | \"dark\";\n /** Key de localStorage para persistencia del tema. Default: \"theme\" */\n storageKey?: string;\n\n // \u2500\u2500 Color de los enlaces de navegaci\u00F3n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n /** Color base de los enlaces (Inicio, Contacto, etc.). Default: var(--text) */\n linkColor?: string;\n /** Color al hacer hover sobre los enlaces. Default: opacidad reducida del linkColor */\n linkHoverColor?: string;\n /** Color del borde inferior del enlace activo. Default: linkColor */\n linkActiveColor?: string;\n\n // \u2500\u2500 Color y tama\u00F1o de \u00EDconos theme-toggle \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n /** Color base de los \u00EDconos. Acepta cualquier valor CSS: hex, hsl, \"var(--accent)\", etc.\n * Si no se pasa, los \u00EDconos heredan el color del texto (currentColor). */\n iconColor?: string;\n /** Color que toman los \u00EDconos al hacer hover sobre el logo. Default: iconColor */\n iconHoverColor?: string;\n /** Tama\u00F1o en px que se pasa a IconRenderer cuando es funci\u00F3n. Default: 22 */\n iconSize?: number;\n\n // \u2500\u2500 Hamburguesa \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n /** Color de las 3 barras (y la X de cierre m\u00F3vil). Acepta cualquier valor CSS. Default: var(--text) */\n hamburgerColor?: string;\n /** Ancho de las barras. Cualquier unidad CSS. Default: \"2rem\" */\n hamburgerBarWidth?: string;\n /** Grosor (altura) de las barras. Cualquier unidad CSS. Default: \"3px\" */\n hamburgerBarThickness?: string;\n\n // \u2500\u2500 Variables CSS personalizadas \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n /** Inyecta variables CSS extra directamente en el style del <header>.\n * \u00DAtil para pasar tokens del tema: { '--xnav-icon-color': 'var(--accent)' } */\n cssVars?: Record<string, string>;\n\n // \u2500\u2500 Labels de accesibilidad \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n /** aria-label del bot\u00F3n hamburguesa cuando est\u00E1 cerrado. Default: \"Abrir men\u00FA\" */\n labelOpen?: string;\n /** aria-label del bot\u00F3n hamburguesa cuando est\u00E1 abierto. Default: \"Cerrar men\u00FA\" */\n labelClose?: string;\n /** Texto del bot\u00F3n de tema oscuro en men\u00FA m\u00F3vil. Default: \"Oscuro\" */\n labelDark?: string;\n /** Texto del bot\u00F3n de tema claro en men\u00FA m\u00F3vil. Default: \"Claro\" */\n labelLight?: string;\n\n // \u2500\u2500 Estilos adicionales \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n /** className extra que se a\u00F1ade al <header> */\n className?: string;\n};\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Variantes de animaci\u00F3n (id\u00E9nticas al navbar original)\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst iconTrayRightVariants: Variants = {\n hidden: { opacity: 0, x: -6, pointerEvents: \"none\" },\n visible: { opacity: 1, x: 0, pointerEvents: \"none\", transition: { duration: 0.18 } },\n};\nconst iconTrayLeftVariants: Variants = {\n hidden: { opacity: 0, x: 6, pointerEvents: \"none\" },\n visible: { opacity: 1, x: 0, pointerEvents: \"none\", transition: { duration: 0.18 } },\n};\n\nconst topVariants: Variants = { closed: { rotate: 0 }, opened: { rotate: 45 } };\nconst centerVariants: Variants = { closed: { opacity: 1 }, opened: { opacity: 0 } };\nconst bottomVariants: Variants = { closed: { rotate: 0 }, opened: { rotate: -45 } };\n\nconst listVariants: Variants = {\n closed: { x: \"100vw\" },\n opened: { x: 0, transition: { when: \"beforeChildren\", staggerChildren: 0.02 } },\n};\nconst itemVariants: Variants = {\n closed: { x: -10, opacity: 0 },\n opened: { x: 0, opacity: 1 },\n};\n\n/** Renderiza un IconRenderer: si es funci\u00F3n la llama con (size, color?), si es ReactNode lo devuelve tal cual. */\nfunction renderIcon(\n icon: IconRenderer,\n size: number,\n color?: string\n): ReactNode {\n if (typeof icon === \"function\") return icon(size, color);\n return icon;\n}\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Sub-componente NavLink (interno)\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ntype NavLinkProps = {\n link: NavLinkItem;\n onClick?: () => void;\n mobile?: boolean;\n};\n\nfunction XNavLink({ link, onClick, mobile }: NavLinkProps) {\n const pathname = usePathname();\n const isActive =\n link.url === \"/\" ? pathname === \"/\" : pathname?.startsWith(link.url);\n\n const baseClass = mobile ? styles.mobileNavLink : styles.navLink;\n const activeClass = mobile ? styles.mobileNavLinkActive : styles.navLinkActive;\n const externalClass = link.external ? styles.navLinkExternal : \"\";\n\n return (\n <Link\n href={link.url}\n onClick={onClick}\n target={link.external ? \"_blank\" : undefined}\n rel={link.external ? \"noopener noreferrer\" : undefined}\n aria-label={`Ir a ${link.title}`}\n aria-current={isActive ? \"page\" : undefined}\n className={[baseClass, isActive ? activeClass : \"\", externalClass]\n .filter(Boolean)\n .join(\" \")}\n >\n {link.title}\n </Link>\n );\n}\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Componente principal XNavbar\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport default function XNavbar({\n linksLeft = [],\n linksRight = [],\n logo = \"X\",\n logoAsThemeToggle = true,\n onLogoClick,\n themeIcons,\n defaultTheme = \"light\",\n storageKey = \"theme\",\n linkColor,\n linkHoverColor,\n linkActiveColor,\n iconColor,\n iconHoverColor,\n iconSize = 22,\n hamburgerColor,\n hamburgerBarWidth,\n hamburgerBarThickness,\n cssVars,\n labelOpen = \"Abrir men\u00FA\",\n labelClose = \"Cerrar men\u00FA\",\n labelDark = \"Oscuro\",\n labelLight = \"Claro\",\n className,\n}: XNavbarProps) {\n const [open, setOpen] = useState(false);\n const [hoverX, setHoverX] = useState(false);\n const [theme, setTheme] = useState<\"light\" | \"dark\">(defaultTheme);\n\n // Persistir tema\n useEffect(() => {\n const saved = (typeof window !== \"undefined\" &&\n localStorage.getItem(storageKey)) as \"light\" | \"dark\" | null;\n applyTheme(saved ?? defaultTheme);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n function applyTheme(t: \"light\" | \"dark\") {\n setTheme(t);\n const root = document.documentElement;\n if (t === \"dark\") root.setAttribute(\"data-theme\", \"dark\");\n else root.removeAttribute(\"data-theme\");\n localStorage.setItem(storageKey, t);\n }\n\n function toggleTheme() {\n applyTheme(theme === \"dark\" ? \"light\" : \"dark\");\n }\n\n // Bloquear scroll \u2014 usamos documentElement para no tocar document.body\n useEffect(() => {\n document.documentElement.style.overflow = open ? \"hidden\" : \"\";\n return () => { document.documentElement.style.overflow = \"\"; };\n }, [open]);\n\n // Cerrar con ESC\n useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") setOpen(false);\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [open]);\n\n const allLinks = [...linksLeft, ...linksRight];\n\n // \u2500\u2500 CSS vars inyectadas en el <header> via inline style \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Usando \"--xnav-*\" como namespace para no colisionar con vars globales.\n const headerStyle = {\n ...(linkColor && { \"--xnav-link-color\" : linkColor }),\n ...(linkHoverColor && { \"--xnav-link-hover\" : linkHoverColor }),\n ...(linkActiveColor && { \"--xnav-link-active\" : linkActiveColor }),\n ...(iconColor && { \"--xnav-icon-color\" : iconColor }),\n ...(iconHoverColor && { \"--xnav-icon-hover\" : iconHoverColor }),\n ...(hamburgerColor && { \"--xnav-bar-color\" : hamburgerColor }),\n ...(hamburgerBarWidth && { \"--xnav-bar-w\" : hamburgerBarWidth }),\n ...(hamburgerBarThickness && { \"--xnav-bar-h\" : hamburgerBarThickness }),\n ...cssVars,\n } as CSSProperties;\n\n // Acci\u00F3n del logo central\n const handleLogoClick = () => {\n if (logoAsThemeToggle) {\n toggleTheme();\n } else {\n onLogoClick?.();\n }\n };\n\n const logoAriaLabel = logoAsThemeToggle\n ? `Cambiar a tema ${theme === \"dark\" ? \"claro\" : \"oscuro\"}`\n : undefined;\n\n const logoTitle = logoAsThemeToggle\n ? theme === \"dark\"\n ? \"Cambiar a tema claro\"\n : \"Cambiar a tema oscuro\"\n : undefined;\n\n return (\n <header\n className={[styles.header, className].filter(Boolean).join(\" \")}\n style={headerStyle}\n role=\"banner\"\n >\n {/* \u2500\u2500 Desktop \u2500\u2500 */}\n <nav className={styles.desktopNav} aria-label=\"Navegaci\u00F3n principal\">\n <div className={styles.desktopLinksLeft}>\n {linksLeft.map((link) => (\n <XNavLink key={link.url + link.title} link={link} />\n ))}\n </div>\n\n {/* Bot\u00F3n logo central */}\n <div className={styles.logoSlot}>\n <div\n className={styles.logoWrapper}\n onMouseEnter={() => setHoverX(true)}\n onMouseLeave={() => setHoverX(false)}\n >\n <button\n type=\"button\"\n onClick={handleLogoClick}\n aria-label={logoAriaLabel}\n title={logoTitle}\n className={styles.logoBtn}\n >\n {logo}\n </button>\n\n {/* \u00CDcono hint al hover (solo si se pasan themeIcons y el logo es toggle de tema) */}\n {logoAsThemeToggle && themeIcons && (\n <>\n {theme === \"light\" ? (\n <motion.div\n initial={false}\n animate={hoverX ? \"visible\" : \"hidden\"}\n variants={iconTrayRightVariants}\n className={`${styles.iconTray} ${styles.iconTrayRight}`}\n style={{\n color:\n (hoverX ? iconHoverColor ?? iconColor : iconColor) ||\n undefined,\n }}\n aria-hidden\n >\n {renderIcon(themeIcons.toDark, iconSize, iconColor)}\n </motion.div>\n ) : (\n <motion.div\n initial={false}\n animate={hoverX ? \"visible\" : \"hidden\"}\n variants={iconTrayLeftVariants}\n className={`${styles.iconTray} ${styles.iconTrayLeft}`}\n style={{\n color:\n (hoverX ? iconHoverColor ?? iconColor : iconColor) ||\n undefined,\n }}\n aria-hidden\n >\n {renderIcon(themeIcons.toLight, iconSize, iconColor)}\n </motion.div>\n )}\n </>\n )}\n </div>\n </div>\n\n <div className={styles.desktopLinksRight}>\n {linksRight.map((link) => (\n <XNavLink key={link.url + link.title} link={link} />\n ))}\n </div>\n </nav>\n\n {/* \u2500\u2500 Mobile: bot\u00F3n hamburguesa \u2500\u2500 */}\n <div className={styles.mobileToggle}>\n <button\n aria-label={open ? labelClose : labelOpen}\n aria-expanded={open}\n aria-controls=\"xnavbar-mobile-menu\"\n onClick={() => setOpen((p) => !p)}\n className={styles.hamburgerBtn}\n title={open ? labelClose : labelOpen}\n >\n <motion.div\n variants={topVariants}\n initial=\"closed\"\n animate={open ? \"opened\" : \"closed\"}\n className={styles.bar}\n style={{ originX: \"left\" }}\n aria-hidden\n />\n <motion.div\n variants={centerVariants}\n initial=\"closed\"\n animate={open ? \"opened\" : \"closed\"}\n className={styles.bar}\n aria-hidden\n />\n <motion.div\n variants={bottomVariants}\n initial=\"closed\"\n animate={open ? \"opened\" : \"closed\"}\n className={styles.bar}\n style={{ originX: \"left\" }}\n aria-hidden\n />\n </button>\n </div>\n\n {/* \u2500\u2500 Mobile overlay \u2014 position:fixed, sin portal, sin document.body \u2500\u2500 */}\n {open && (\n <motion.div\n id=\"xnavbar-mobile-menu\"\n variants={listVariants}\n initial=\"closed\"\n animate=\"opened\"\n className={styles.mobileOverlay}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Men\u00FA de navegaci\u00F3n\"\n >\n {/* Bot\u00F3n cerrar */}\n <button\n aria-label={labelClose}\n onClick={() => setOpen(false)}\n className={styles.mobileCloseBtn}\n style={{ WebkitTapHighlightColor: \"transparent\" }}\n >\n <span\n aria-hidden\n className={styles.closeBar}\n style={{ transform: \"rotate(45deg)\" }}\n />\n <span\n aria-hidden\n className={styles.closeBar}\n style={{ transform: \"rotate(-45deg)\" }}\n />\n <span className=\"sr-only\">{labelClose}</span>\n </button>\n\n {/* Logo decorativo */}\n <motion.div variants={itemVariants} className={styles.mobileLogo}>\n {logo}\n </motion.div>\n\n {/* Links */}\n {allLinks.map((link) => (\n <motion.div key={link.url + link.title} variants={itemVariants}>\n <XNavLink\n link={link}\n onClick={() => setOpen(false)}\n mobile\n />\n </motion.div>\n ))}\n\n {/* Toggle de tema */}\n <motion.button\n variants={itemVariants}\n onClick={toggleTheme}\n className={styles.themeToggleMobile}\n >\n {themeIcons ? (\n theme === \"light\" ? (\n <>\n {renderIcon(themeIcons.toDark, iconSize, iconColor)}\n {labelDark}\n </>\n ) : (\n <>\n {renderIcon(themeIcons.toLight, iconSize, iconColor)}\n {labelLight}\n </>\n )\n ) : theme === \"light\" ? (\n labelDark\n ) : (\n labelLight\n )}\n </motion.button>\n </motion.div>\n )}\n </header>\n );\n}\n", "\nconst content = __content_placeholder__;\nconst digest = __digest_placeholder__; \nconst inject = () => {\n setTimeout(() => {\n if (!globalThis.document) {\n return;\n }\n let root = globalThis.document.querySelector(\"head\");\n if (root && root.shadowRoot) {\n root = root.shadowRoot;\n }\n if (!root) {\n root = globalThis.document.head;\n }\n let container = root.querySelector(\"#_\" + digest);\n if (!container) {\n container = globalThis.document.createElement(\"style\");\n container.id = \"_\" + digest;\n const text = globalThis.document.createTextNode(content);\n container.appendChild(text);\n root.appendChild(container);\n }\n }, 0);\n};\n\nexport { inject };\n ", "import \"esbuild-css-modules-plugin-ns-css:src/components/navigation/xnavbar/XNavbar.module.css\";\n\nimport { inject } from \"esbuild-css-modules-plugin-ns-js:src/components/navigation/xnavbar/XNavbar.module.css:injector.js\";\nexport default new Proxy({\n \"bar\": \"XNavbar-module__bar_wx7KiW__012\",\n \"closeBar\": \"XNavbar-module__closeBar_wx7KiW__012\",\n \"desktopLinksLeft\": \"XNavbar-module__desktopLinksLeft_wx7KiW__012\",\n \"desktopLinksRight\": \"XNavbar-module__desktopLinksRight_wx7KiW__012\",\n \"desktopNav\": \"XNavbar-module__desktopNav_wx7KiW__012\",\n \"hamburgerBtn\": \"XNavbar-module__hamburgerBtn_wx7KiW__012\",\n \"header\": \"XNavbar-module__header_wx7KiW__012\",\n \"iconTray\": \"XNavbar-module__iconTray_wx7KiW__012\",\n \"iconTrayLeft\": \"XNavbar-module__iconTrayLeft_wx7KiW__012\",\n \"iconTrayRight\": \"XNavbar-module__iconTrayRight_wx7KiW__012\",\n \"logoBtn\": \"XNavbar-module__logoBtn_wx7KiW__012\",\n \"logoSlot\": \"XNavbar-module__logoSlot_wx7KiW__012\",\n \"logoWrapper\": \"XNavbar-module__logoWrapper_wx7KiW__012\",\n \"mobileCloseBtn\": \"XNavbar-module__mobileCloseBtn_wx7KiW__012\",\n \"mobileLogo\": \"XNavbar-module__mobileLogo_wx7KiW__012\",\n \"mobileNavLink\": \"XNavbar-module__mobileNavLink_wx7KiW__012\",\n \"mobileNavLinkActive\": \"XNavbar-module__mobileNavLinkActive_wx7KiW__012\",\n \"mobileOverlay\": \"XNavbar-module__mobileOverlay_wx7KiW__012\",\n \"mobileToggle\": \"XNavbar-module__mobileToggle_wx7KiW__012\",\n \"navLink\": \"XNavbar-module__navLink_wx7KiW__012\",\n \"navLinkActive\": \"XNavbar-module__navLinkActive_wx7KiW__012\",\n \"navLinkExternal\": \"XNavbar-module__navLinkExternal_wx7KiW__012\",\n \"themeToggleMobile\": \"XNavbar-module__themeToggleMobile_wx7KiW__012\"\n}, {\n get: function(source, key) {\n inject();\n return source[key];\n }\n});\n "],
5
+ "mappings": "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",
6
+ "names": ["Link"]
7
+ }
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  XNavbar
3
- } from "../../chunk-NY22GB3E.mjs";
3
+ } from "../../chunk-ZDMG7X6H.mjs";
4
4
  export {
5
5
  XNavbar
6
6
  };
7
- //# sourceMappingURL=index.mjs.map
7
+ //# sourceMappingURL=index.mjs.map
@@ -1 +1,7 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -1,7 +1,5 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { ReactNode } from 'react';
3
-
4
- type NavLinkItem = {
1
+ import { ReactNode } from "react";
2
+ export type NavLinkItem = {
5
3
  /** Ruta destino */
6
4
  url: string;
7
5
  /** Texto visible */
@@ -14,14 +12,14 @@ type NavLinkItem = {
14
12
  * La función recibe el tamaño y el color vigente para que el ícono
15
13
  * pueda adaptarse dinámicamente a los props del navbar.
16
14
  */
17
- type IconRenderer = ReactNode | ((size: number, color?: string) => ReactNode);
18
- type ThemeToggleIcons = {
15
+ export type IconRenderer = ReactNode | ((size: number, color?: string) => ReactNode);
16
+ export type ThemeToggleIcons = {
19
17
  /** Ícono/renderer hacia tema oscuro (ReactNode o función) */
20
18
  toDark: IconRenderer;
21
19
  /** Ícono/renderer hacia tema claro (ReactNode o función) */
22
20
  toLight: IconRenderer;
23
21
  };
24
- type XNavbarProps = {
22
+ export type XNavbarProps = {
25
23
  /** Links que aparecen a la izquierda del logo en desktop */
26
24
  linksLeft?: NavLinkItem[];
27
25
  /** Links que aparecen a la derecha del logo en desktop */
@@ -71,6 +69,4 @@ type XNavbarProps = {
71
69
  /** className extra que se añade al <header> */
72
70
  className?: string;
73
71
  };
74
- declare function XNavbar({ linksLeft, linksRight, logo, logoAsThemeToggle, onLogoClick, themeIcons, defaultTheme, storageKey, linkColor, linkHoverColor, linkActiveColor, iconColor, iconHoverColor, iconSize, hamburgerColor, hamburgerBarWidth, hamburgerBarThickness, cssVars, labelOpen, labelClose, labelDark, labelLight, className, }: XNavbarProps): react_jsx_runtime.JSX.Element;
75
-
76
- export { type IconRenderer, type NavLinkItem, type ThemeToggleIcons, XNavbar, type XNavbarProps };
72
+ export default function XNavbar({ linksLeft, linksRight, logo, logoAsThemeToggle, onLogoClick, themeIcons, defaultTheme, storageKey, linkColor, linkHoverColor, linkActiveColor, iconColor, iconHoverColor, iconSize, hamburgerColor, hamburgerBarWidth, hamburgerBarThickness, cssVars, labelOpen, labelClose, labelDark, labelLight, className, }: XNavbarProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,3 @@
1
+ export { default as XNavbar } from "./XNavbar";
2
+ export { default } from "./XNavbar";
3
+ export type { XNavbarProps, NavLinkItem, ThemeToggleIcons, IconRenderer } from "./XNavbar";
@@ -1,5 +1,5 @@
1
- /* src/components/social/xsocialcontact/XSocialContact.module.css */
2
- .container {
1
+ /* esbuild-css-modules-plugin-ns-css:src/components/social/xsocialcontact/XSocialContact.module.css */
2
+ .XSocialContact-module__container_D0-L3a__012 {
3
3
  --columns: 3;
4
4
  --gap: 1.5rem;
5
5
  --padding: 1.5rem;
@@ -7,7 +7,7 @@
7
7
  --alignment: center;
8
8
  --text-align: center;
9
9
  --icon-gap: 1.5rem;
10
- --border-radius: 0.5rem;
10
+ --border-radius: .5rem;
11
11
  --bg-color: transparent;
12
12
  --icon-color: currentColor;
13
13
  --icon-hover-color: currentColor;
@@ -15,7 +15,6 @@
15
15
  --border-width: 0px;
16
16
  --border-style: solid;
17
17
  --text-color: inherit;
18
- display: grid;
19
18
  grid-template-columns: repeat(var(--columns), 1fr);
20
19
  gap: var(--gap);
21
20
  padding: var(--padding);
@@ -23,94 +22,95 @@
23
22
  border: var(--border-width) var(--border-style) var(--border-color);
24
23
  border-radius: var(--border-radius);
25
24
  justify-items: var(--alignment);
25
+ display: grid;
26
26
  }
27
- .small {
27
+ .XSocialContact-module__small_D0-L3a__012 {
28
28
  --icon-gap: 1rem;
29
29
  --gap: 1rem;
30
30
  --padding: 1rem;
31
- --text-size: 0.875rem;
31
+ --text-size: .875rem;
32
32
  }
33
- .medium {
33
+ .XSocialContact-module__medium_D0-L3a__012 {
34
34
  --icon-gap: 1.5rem;
35
35
  --gap: 1.5rem;
36
36
  --padding: 1.5rem;
37
37
  --text-size: 1rem;
38
38
  }
39
- .large {
39
+ .XSocialContact-module__large_D0-L3a__012 {
40
40
  --icon-gap: 2rem;
41
41
  --gap: 2rem;
42
42
  --padding: 2rem;
43
43
  --text-size: 1.125rem;
44
44
  }
45
- .rows1 {
45
+ .XSocialContact-module__rows1_D0-L3a__012 {
46
46
  grid-template-rows: auto;
47
47
  }
48
- .rows2 {
48
+ .XSocialContact-module__rows2_D0-L3a__012 {
49
49
  grid-template-rows: repeat(2, auto);
50
50
  }
51
- .rows3 {
51
+ .XSocialContact-module__rows3_D0-L3a__012 {
52
52
  grid-template-rows: repeat(3, auto);
53
53
  }
54
- .rows4 {
54
+ .XSocialContact-module__rows4_D0-L3a__012 {
55
55
  grid-template-rows: repeat(4, auto);
56
56
  }
57
- .item {
58
- display: flex;
59
- flex-direction: column;
57
+ .XSocialContact-module__item_D0-L3a__012 {
60
58
  align-items: center;
61
- gap: calc(var(--icon-gap) * 0.5);
62
- text-decoration: none;
63
- transition: opacity 0.2s ease;
59
+ gap: calc(var(--icon-gap) * .5);
64
60
  color: inherit;
61
+ flex-direction: column;
62
+ text-decoration: none;
63
+ transition: opacity .2s;
64
+ display: flex;
65
65
  }
66
- .item:hover {
67
- opacity: 0.8;
66
+ .XSocialContact-module__item_D0-L3a__012:hover {
67
+ opacity: .8;
68
68
  }
69
- .iconWrapper {
69
+ .XSocialContact-module__iconWrapper_D0-L3a__012 {
70
70
  --item-icon-color: var(--icon-color);
71
71
  --item-icon-hover-color: var(--icon-hover-color);
72
- display: flex;
73
- align-items: center;
74
- justify-content: center;
75
72
  width: var(--icon-gap);
76
73
  height: var(--icon-gap);
77
74
  color: var(--item-icon-color);
78
- transition: color 0.2s ease;
75
+ justify-content: center;
76
+ align-items: center;
77
+ transition: color .2s;
78
+ display: flex;
79
79
  }
80
- .item:hover .iconWrapper {
80
+ .XSocialContact-module__item_D0-L3a__012:hover .XSocialContact-module__iconWrapper_D0-L3a__012 {
81
81
  color: var(--item-icon-hover-color);
82
82
  }
83
- .text {
83
+ .XSocialContact-module__text_D0-L3a__012 {
84
84
  font-size: var(--text-size);
85
85
  color: var(--text-color);
86
86
  text-align: var(--text-align);
87
87
  word-break: break-word;
88
88
  max-width: 100%;
89
89
  }
90
- @media (max-width: 768px) {
91
- .container {
90
+ @media (width <= 768px) {
91
+ .XSocialContact-module__container_D0-L3a__012 {
92
92
  --columns: 2;
93
- --gap: calc(var(--gap) * 0.75);
94
- --padding: calc(var(--padding) * 0.75);
93
+ --gap: calc(var(--gap) * .75);
94
+ --padding: calc(var(--padding) * .75);
95
95
  }
96
- .rows2,
97
- .rows3,
98
- .rows4 {
99
- grid-template-columns: repeat(2, 1fr);
96
+ .XSocialContact-module__rows2_D0-L3a__012,
97
+ .XSocialContact-module__rows3_D0-L3a__012,
98
+ .XSocialContact-module__rows4_D0-L3a__012 {
100
99
  grid-template-rows: repeat(2, auto);
100
+ grid-template-columns: repeat(2, 1fr);
101
101
  }
102
102
  }
103
- @media (max-width: 480px) {
104
- .container {
103
+ @media (width <= 480px) {
104
+ .XSocialContact-module__container_D0-L3a__012 {
105
105
  --columns: 1;
106
- --gap: calc(var(--gap) * 0.5);
107
- --padding: calc(var(--padding) * 0.5);
106
+ --gap: calc(var(--gap) * .5);
107
+ --padding: calc(var(--padding) * .5);
108
108
  }
109
- .rows2,
110
- .rows3,
111
- .rows4 {
112
- grid-template-columns: 1fr;
109
+ .XSocialContact-module__rows2_D0-L3a__012,
110
+ .XSocialContact-module__rows3_D0-L3a__012,
111
+ .XSocialContact-module__rows4_D0-L3a__012 {
113
112
  grid-template-rows: auto;
113
+ grid-template-columns: 1fr;
114
114
  }
115
115
  }
116
- /*# sourceMappingURL=index.css.map */
116
+ /*# sourceMappingURL=index.css.map */
@@ -1 +1,7 @@
1
- {"version":3,"sources":["../../../src/components/social/xsocialcontact/XSocialContact.module.css"],"sourcesContent":["/* XSocialContact Styles */\n\n.container {\n --columns: 3;\n --gap: 1.5rem;\n --padding: 1.5rem;\n --text-size: 1rem;\n --alignment: center;\n --text-align: center;\n --icon-gap: 1.5rem;\n --border-radius: 0.5rem;\n --bg-color: transparent;\n --icon-color: currentColor;\n --icon-hover-color: currentColor;\n --border-color: transparent;\n --border-width: 0px;\n --border-style: solid;\n --text-color: inherit;\n\n display: grid;\n grid-template-columns: repeat(var(--columns), 1fr);\n gap: var(--gap);\n padding: var(--padding);\n background-color: var(--bg-color);\n border: var(--border-width) var(--border-style) var(--border-color);\n border-radius: var(--border-radius);\n justify-items: var(--alignment);\n}\n\n/* Size variants */\n.small {\n --icon-gap: 1rem;\n --gap: 1rem;\n --padding: 1rem;\n --text-size: 0.875rem;\n}\n\n.medium {\n --icon-gap: 1.5rem;\n --gap: 1.5rem;\n --padding: 1.5rem;\n --text-size: 1rem;\n}\n\n.large {\n --icon-gap: 2rem;\n --gap: 2rem;\n --padding: 2rem;\n --text-size: 1.125rem;\n}\n\n/* Rows configuration */\n.rows1 {\n grid-template-rows: auto;\n}\n\n.rows2 {\n grid-template-rows: repeat(2, auto);\n}\n\n.rows3 {\n grid-template-rows: repeat(3, auto);\n}\n\n.rows4 {\n grid-template-rows: repeat(4, auto);\n}\n\n/* Item styling */\n.item {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: calc(var(--icon-gap) * 0.5);\n text-decoration: none;\n transition: opacity 0.2s ease;\n color: inherit;\n}\n\n.item:hover {\n opacity: 0.8;\n}\n\n.iconWrapper {\n --item-icon-color: var(--icon-color);\n --item-icon-hover-color: var(--icon-hover-color);\n \n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--icon-gap);\n height: var(--icon-gap);\n color: var(--item-icon-color);\n transition: color 0.2s ease;\n}\n\n.item:hover .iconWrapper {\n color: var(--item-icon-hover-color);\n}\n\n.text {\n font-size: var(--text-size);\n color: var(--text-color);\n text-align: var(--text-align);\n word-break: break-word;\n max-width: 100%;\n}\n\n/* Responsive */\n@media (max-width: 768px) {\n .container {\n --columns: 2;\n --gap: calc(var(--gap) * 0.75);\n --padding: calc(var(--padding) * 0.75);\n }\n \n .rows2,\n .rows3,\n .rows4 {\n grid-template-columns: repeat(2, 1fr);\n grid-template-rows: repeat(2, auto);\n }\n}\n\n@media (max-width: 480px) {\n .container {\n --columns: 1;\n --gap: calc(var(--gap) * 0.5);\n --padding: calc(var(--padding) * 0.5);\n }\n \n .rows2,\n .rows3,\n .rows4 {\n grid-template-columns: 1fr;\n grid-template-rows: auto;\n }\n}\n"],"mappings":";AAEA,CAAC;AACG,aAAW;AACX,SAAO;AACP,aAAW;AACX,eAAa;AACb,eAAa;AACb,gBAAc;AACd,cAAY;AACZ,mBAAiB;AACjB,cAAY;AACZ,gBAAc;AACd,sBAAoB;AACpB,kBAAgB;AAChB,kBAAgB;AAChB,kBAAgB;AAChB,gBAAc;AAEd,WAAS;AACT,yBAAuB,OAAO,IAAI,UAAU,EAAE;AAC9C,OAAK,IAAI;AACT,WAAS,IAAI;AACb,oBAAkB,IAAI;AACtB,UAAQ,IAAI,gBAAgB,IAAI,gBAAgB,IAAI;AACpD,iBAAe,IAAI;AACnB,iBAAe,IAAI;AACvB;AAGA,CAAC;AACG,cAAY;AACZ,SAAO;AACP,aAAW;AACX,eAAa;AACjB;AAEA,CAAC;AACG,cAAY;AACZ,SAAO;AACP,aAAW;AACX,eAAa;AACjB;AAEA,CAAC;AACG,cAAY;AACZ,SAAO;AACP,aAAW;AACX,eAAa;AACjB;AAGA,CAAC;AACG,sBAAoB;AACxB;AAEA,CAAC;AACG,sBAAoB,OAAO,CAAC,EAAE;AAClC;AAEA,CAAC;AACG,sBAAoB,OAAO,CAAC,EAAE;AAClC;AAEA,CAAC;AACG,sBAAoB,OAAO,CAAC,EAAE;AAClC;AAGA,CAAC;AACG,WAAS;AACT,kBAAgB;AAChB,eAAa;AACb,OAAK,KAAK,IAAI,YAAY,EAAE;AAC5B,mBAAiB;AACjB,cAAY,QAAQ,KAAK;AACzB,SAAO;AACX;AAEA,CAVC,IAUI;AACD,WAAS;AACb;AAEA,CAAC;AACG,qBAAmB,IAAI;AACvB,2BAAyB,IAAI;AAE7B,WAAS;AACT,eAAa;AACb,mBAAiB;AACjB,SAAO,IAAI;AACX,UAAQ,IAAI;AACZ,SAAO,IAAI;AACX,cAAY,MAAM,KAAK;AAC3B;AAEA,CA3BC,IA2BI,OAAO,CAbX;AAcG,SAAO,IAAI;AACf;AAEA,CAAC;AACG,aAAW,IAAI;AACf,SAAO,IAAI;AACX,cAAY,IAAI;AAChB,cAAY;AACZ,aAAW;AACf;AAGA,QAAO,WAAY;AACf,GA5GH;AA6GO,eAAW;AACX,WAAO,KAAK,IAAI,OAAO,EAAE;AACzB,eAAW,KAAK,IAAI,WAAW,EAAE;AACrC;AAEA,GA5DH;AAAA,EA6DG,CAzDH;AAAA,EA0DG,CAtDH;AAuDO,2BAAuB,OAAO,CAAC,EAAE;AACjC,wBAAoB,OAAO,CAAC,EAAE;AAClC;AACJ;AAEA,QAAO,WAAY;AACf,GA3HH;AA4HO,eAAW;AACX,WAAO,KAAK,IAAI,OAAO,EAAE;AACzB,eAAW,KAAK,IAAI,WAAW,EAAE;AACrC;AAEA,GA3EH;AAAA,EA4EG,CAxEH;AAAA,EAyEG,CArEH;AAsEO,2BAAuB;AACvB,wBAAoB;AACxB;AACJ;","names":[]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["esbuild-css-modules-plugin-ns-css:src/components/social/xsocialcontact/XSocialContact.module.css"],
4
+ "sourcesContent": [".XSocialContact-module__container_D0-L3a__012 {\n --columns: 3;\n --gap: 1.5rem;\n --padding: 1.5rem;\n --text-size: 1rem;\n --alignment: center;\n --text-align: center;\n --icon-gap: 1.5rem;\n --border-radius: .5rem;\n --bg-color: transparent;\n --icon-color: currentColor;\n --icon-hover-color: currentColor;\n --border-color: transparent;\n --border-width: 0px;\n --border-style: solid;\n --text-color: inherit;\n grid-template-columns: repeat(var(--columns), 1fr);\n gap: var(--gap);\n padding: var(--padding);\n background-color: var(--bg-color);\n border: var(--border-width) var(--border-style) var(--border-color);\n border-radius: var(--border-radius);\n justify-items: var(--alignment);\n display: grid;\n}\n\n.XSocialContact-module__small_D0-L3a__012 {\n --icon-gap: 1rem;\n --gap: 1rem;\n --padding: 1rem;\n --text-size: .875rem;\n}\n\n.XSocialContact-module__medium_D0-L3a__012 {\n --icon-gap: 1.5rem;\n --gap: 1.5rem;\n --padding: 1.5rem;\n --text-size: 1rem;\n}\n\n.XSocialContact-module__large_D0-L3a__012 {\n --icon-gap: 2rem;\n --gap: 2rem;\n --padding: 2rem;\n --text-size: 1.125rem;\n}\n\n.XSocialContact-module__rows1_D0-L3a__012 {\n grid-template-rows: auto;\n}\n\n.XSocialContact-module__rows2_D0-L3a__012 {\n grid-template-rows: repeat(2, auto);\n}\n\n.XSocialContact-module__rows3_D0-L3a__012 {\n grid-template-rows: repeat(3, auto);\n}\n\n.XSocialContact-module__rows4_D0-L3a__012 {\n grid-template-rows: repeat(4, auto);\n}\n\n.XSocialContact-module__item_D0-L3a__012 {\n align-items: center;\n gap: calc(var(--icon-gap) * .5);\n color: inherit;\n flex-direction: column;\n text-decoration: none;\n transition: opacity .2s;\n display: flex;\n}\n\n.XSocialContact-module__item_D0-L3a__012:hover {\n opacity: .8;\n}\n\n.XSocialContact-module__iconWrapper_D0-L3a__012 {\n --item-icon-color: var(--icon-color);\n --item-icon-hover-color: var(--icon-hover-color);\n width: var(--icon-gap);\n height: var(--icon-gap);\n color: var(--item-icon-color);\n justify-content: center;\n align-items: center;\n transition: color .2s;\n display: flex;\n}\n\n.XSocialContact-module__item_D0-L3a__012:hover .XSocialContact-module__iconWrapper_D0-L3a__012 {\n color: var(--item-icon-hover-color);\n}\n\n.XSocialContact-module__text_D0-L3a__012 {\n font-size: var(--text-size);\n color: var(--text-color);\n text-align: var(--text-align);\n word-break: break-word;\n max-width: 100%;\n}\n\n@media (width <= 768px) {\n .XSocialContact-module__container_D0-L3a__012 {\n --columns: 2;\n --gap: calc(var(--gap) * .75);\n --padding: calc(var(--padding) * .75);\n }\n\n .XSocialContact-module__rows2_D0-L3a__012, .XSocialContact-module__rows3_D0-L3a__012, .XSocialContact-module__rows4_D0-L3a__012 {\n grid-template-rows: repeat(2, auto);\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (width <= 480px) {\n .XSocialContact-module__container_D0-L3a__012 {\n --columns: 1;\n --gap: calc(var(--gap) * .5);\n --padding: calc(var(--padding) * .5);\n }\n\n .XSocialContact-module__rows2_D0-L3a__012, .XSocialContact-module__rows3_D0-L3a__012, .XSocialContact-module__rows4_D0-L3a__012 {\n grid-template-rows: auto;\n grid-template-columns: 1fr;\n }\n}\n"],
5
+ "mappings": ";AAAA,CAAC;AACC,aAAW;AACX,SAAO;AACP,aAAW;AACX,eAAa;AACb,eAAa;AACb,gBAAc;AACd,cAAY;AACZ,mBAAiB;AACjB,cAAY;AACZ,gBAAc;AACd,sBAAoB;AACpB,kBAAgB;AAChB,kBAAgB;AAChB,kBAAgB;AAChB,gBAAc;AACd,yBAAuB,OAAO,IAAI,UAAU,EAAE;AAC9C,OAAK,IAAI;AACT,WAAS,IAAI;AACb,oBAAkB,IAAI;AACtB,UAAQ,IAAI,gBAAgB,IAAI,gBAAgB,IAAI;AACpD,iBAAe,IAAI;AACnB,iBAAe,IAAI;AACnB,WAAS;AACX;AAEA,CAAC;AACC,cAAY;AACZ,SAAO;AACP,aAAW;AACX,eAAa;AACf;AAEA,CAAC;AACC,cAAY;AACZ,SAAO;AACP,aAAW;AACX,eAAa;AACf;AAEA,CAAC;AACC,cAAY;AACZ,SAAO;AACP,aAAW;AACX,eAAa;AACf;AAEA,CAAC;AACC,sBAAoB;AACtB;AAEA,CAAC;AACC,sBAAoB,OAAO,CAAC,EAAE;AAChC;AAEA,CAAC;AACC,sBAAoB,OAAO,CAAC,EAAE;AAChC;AAEA,CAAC;AACC,sBAAoB,OAAO,CAAC,EAAE;AAChC;AAEA,CAAC;AACC,eAAa;AACb,OAAK,KAAK,IAAI,YAAY,EAAE;AAC5B,SAAO;AACP,kBAAgB;AAChB,mBAAiB;AACjB,cAAY,QAAQ;AACpB,WAAS;AACX;AAEA,CAVC,uCAUuC;AACtC,WAAS;AACX;AAEA,CAAC;AACC,qBAAmB,IAAI;AACvB,2BAAyB,IAAI;AAC7B,SAAO,IAAI;AACX,UAAQ,IAAI;AACZ,SAAO,IAAI;AACX,mBAAiB;AACjB,eAAa;AACb,cAAY,MAAM;AAClB,WAAS;AACX;AAEA,CA1BC,uCA0BuC,OAAO,CAZ9C;AAaC,SAAO,IAAI;AACb;AAEA,CAAC;AACC,aAAW,IAAI;AACf,SAAO,IAAI;AACX,cAAY,IAAI;AAChB,cAAY;AACZ,aAAW;AACb;AAEA,QAAQ,SAAS;AACf,GAtGD;AAuGG,eAAW;AACX,WAAO,KAAK,IAAI,OAAO,EAAE;AACzB,eAAW,KAAK,IAAI,WAAW,EAAE;AACnC;AAEA,GAzDD;AAAA,EAyD4C,CArD5C;AAAA,EAqDuF,CAjDvF;AAkDG,wBAAoB,OAAO,CAAC,EAAE;AAC9B,2BAAuB,OAAO,CAAC,EAAE;AACnC;AACF;AAEA,QAAQ,SAAS;AACf,GAnHD;AAoHG,eAAW;AACX,WAAO,KAAK,IAAI,OAAO,EAAE;AACzB,eAAW,KAAK,IAAI,WAAW,EAAE;AACnC;AAEA,GAtED;AAAA,EAsE4C,CAlE5C;AAAA,EAkEuF,CA9DvF;AA+DG,wBAAoB;AACpB,2BAAuB;AACzB;AACF;",
6
+ "names": []
7
+ }
@@ -1,55 +1,2 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import React from 'react';
3
-
4
- interface SocialItem {
5
- id: string;
6
- href: string;
7
- label: string;
8
- icon: React.ReactNode;
9
- text?: string;
10
- iconColor?: string;
11
- iconHoverColor?: string;
12
- }
13
- interface XSocialContactProps {
14
- items: SocialItem[];
15
- columns?: number;
16
- rows?: number;
17
- size?: "small" | "medium" | "large";
18
- alignment?: "left" | "center" | "right";
19
- gap?: string;
20
- backgroundColor?: string;
21
- iconDefaultColor?: string;
22
- iconDefaultHoverColor?: string;
23
- borderColor?: string;
24
- borderWidth?: string;
25
- borderStyle?: "solid" | "dashed" | "dotted";
26
- borderRadius?: "rounded" | "square";
27
- padding?: string;
28
- textAlign?: "left" | "center" | "right";
29
- textColor?: string;
30
- textSize?: string;
31
- }
32
- declare function XSocialContact({ items, columns, rows, size, alignment, gap, backgroundColor, iconDefaultColor, iconDefaultHoverColor, borderColor, borderWidth, borderStyle, borderRadius, padding, textAlign, textColor, textSize, }: XSocialContactProps): react_jsx_runtime.JSX.Element;
33
-
34
- interface XSocialIconProps extends Omit<React.SVGProps<SVGSVGElement>, "color" | "children"> {
35
- size?: number | string;
36
- color?: string;
37
- hoverColor?: string;
38
- fillColor?: string;
39
- hoverFillColor?: string;
40
- backgroundColor?: string;
41
- badgeColor?: string;
42
- badgeBackgroundColor?: string;
43
- strokeWidth?: number;
44
- showBadge?: boolean;
45
- title?: string;
46
- }
47
- declare function XTelegramIcon(props: XSocialIconProps): react_jsx_runtime.JSX.Element;
48
- declare function XInstagramIcon(props: XSocialIconProps): react_jsx_runtime.JSX.Element;
49
- declare function XWhatsappIcon(props: XSocialIconProps): react_jsx_runtime.JSX.Element;
50
- declare function XEmailIcon(props: XSocialIconProps): react_jsx_runtime.JSX.Element;
51
- declare function XLinkedInIcon(props: XSocialIconProps): react_jsx_runtime.JSX.Element;
52
- declare function XTwitterIcon(props: XSocialIconProps): react_jsx_runtime.JSX.Element;
53
- declare function XGitHubIcon(props: XSocialIconProps): react_jsx_runtime.JSX.Element;
54
-
55
- export { type SocialItem, XEmailIcon, XGitHubIcon, XInstagramIcon, XLinkedInIcon, XSocialContact, type XSocialContactProps, type XSocialIconProps, XTelegramIcon, XTwitterIcon, XWhatsappIcon };
1
+ export { XSocialContact, XTelegramIcon, XInstagramIcon, XWhatsappIcon, XEmailIcon, XLinkedInIcon, XTwitterIcon, XGitHubIcon, } from "./xsocialcontact";
2
+ export type { SocialItem, XSocialContactProps, XSocialIconProps } from "./xsocialcontact";