@misael703/ui 1.65.0 → 1.65.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 (122) hide show
  1. package/dist/{chunk-5C7LUIBN.mjs → chunk-274Z36JK.mjs} +6 -6
  2. package/dist/{chunk-5C7LUIBN.mjs.map → chunk-274Z36JK.mjs.map} +1 -1
  3. package/dist/{chunk-UROEA7L4.js → chunk-2EZSO6PE.js} +4 -4
  4. package/dist/{chunk-UROEA7L4.js.map → chunk-2EZSO6PE.js.map} +1 -1
  5. package/dist/{chunk-OIYIWG53.mjs → chunk-3WSB2R2K.mjs} +4 -4
  6. package/dist/{chunk-OIYIWG53.mjs.map → chunk-3WSB2R2K.mjs.map} +1 -1
  7. package/dist/{chunk-3JRP3DGM.js → chunk-4WGXCRNN.js} +3 -3
  8. package/dist/{chunk-3JRP3DGM.js.map → chunk-4WGXCRNN.js.map} +1 -1
  9. package/dist/{chunk-CEDAYY2N.mjs → chunk-4WONGJAF.mjs} +3 -3
  10. package/dist/{chunk-CEDAYY2N.mjs.map → chunk-4WONGJAF.mjs.map} +1 -1
  11. package/dist/{chunk-SA7NCLEK.js → chunk-5XAU6BSB.js} +6 -6
  12. package/dist/{chunk-SA7NCLEK.js.map → chunk-5XAU6BSB.js.map} +1 -1
  13. package/dist/{chunk-YXUYWO2W.mjs → chunk-7RAQNHGB.mjs} +4 -4
  14. package/dist/{chunk-YXUYWO2W.mjs.map → chunk-7RAQNHGB.mjs.map} +1 -1
  15. package/dist/{chunk-NUTHJQYH.js → chunk-7YTH4TWC.js} +5 -5
  16. package/dist/{chunk-NUTHJQYH.js.map → chunk-7YTH4TWC.js.map} +1 -1
  17. package/dist/{chunk-HGS3ATU2.mjs → chunk-BANRYAIX.mjs} +4 -4
  18. package/dist/{chunk-HGS3ATU2.mjs.map → chunk-BANRYAIX.mjs.map} +1 -1
  19. package/dist/{chunk-GNI5MH36.mjs → chunk-DAVJ3H52.mjs} +3 -3
  20. package/dist/{chunk-GNI5MH36.mjs.map → chunk-DAVJ3H52.mjs.map} +1 -1
  21. package/dist/{chunk-FI2XCF3F.js → chunk-EMU27DI4.js} +5 -5
  22. package/dist/{chunk-FI2XCF3F.js.map → chunk-EMU27DI4.js.map} +1 -1
  23. package/dist/{chunk-E6BTT4I7.js → chunk-FR2E6DLA.js} +4 -4
  24. package/dist/{chunk-E6BTT4I7.js.map → chunk-FR2E6DLA.js.map} +1 -1
  25. package/dist/{chunk-HYB7EXRB.js → chunk-G3OEZRKQ.js} +4 -4
  26. package/dist/{chunk-HYB7EXRB.js.map → chunk-G3OEZRKQ.js.map} +1 -1
  27. package/dist/{chunk-3N24QPRP.js → chunk-GZIIW3CL.js} +5 -5
  28. package/dist/{chunk-3N24QPRP.js.map → chunk-GZIIW3CL.js.map} +1 -1
  29. package/dist/{chunk-4Z5GFOIU.mjs → chunk-H24HV2KH.mjs} +3 -3
  30. package/dist/{chunk-4Z5GFOIU.mjs.map → chunk-H24HV2KH.mjs.map} +1 -1
  31. package/dist/{chunk-ORTQGS7I.mjs → chunk-H4ZAFXAM.mjs} +4 -4
  32. package/dist/{chunk-ORTQGS7I.mjs.map → chunk-H4ZAFXAM.mjs.map} +1 -1
  33. package/dist/{chunk-TGAAJCUZ.mjs → chunk-H7SJBODY.mjs} +3 -3
  34. package/dist/{chunk-TGAAJCUZ.mjs.map → chunk-H7SJBODY.mjs.map} +1 -1
  35. package/dist/{chunk-X36H75RR.mjs → chunk-HFRMDYNW.mjs} +3 -3
  36. package/dist/{chunk-X36H75RR.mjs.map → chunk-HFRMDYNW.mjs.map} +1 -1
  37. package/dist/{chunk-DLPTIVZB.mjs → chunk-IDYMCSGE.mjs} +5 -5
  38. package/dist/{chunk-DLPTIVZB.mjs.map → chunk-IDYMCSGE.mjs.map} +1 -1
  39. package/dist/{chunk-NU4GAGUV.js → chunk-JZNUYA42.js} +3 -3
  40. package/dist/{chunk-NU4GAGUV.js.map → chunk-JZNUYA42.js.map} +1 -1
  41. package/dist/{chunk-SQJVGL7Y.js → chunk-KPWOWFMT.js} +3 -3
  42. package/dist/{chunk-SQJVGL7Y.js.map → chunk-KPWOWFMT.js.map} +1 -1
  43. package/dist/{chunk-AGMDYCGG.js → chunk-MURFESTG.js} +4 -4
  44. package/dist/{chunk-AGMDYCGG.js.map → chunk-MURFESTG.js.map} +1 -1
  45. package/dist/{chunk-5G3DVB5B.mjs → chunk-OSXQQYSN.mjs} +4 -4
  46. package/dist/{chunk-5G3DVB5B.mjs.map → chunk-OSXQQYSN.mjs.map} +1 -1
  47. package/dist/{chunk-HCTY5QYL.js → chunk-QMXU5WXD.js} +4 -4
  48. package/dist/{chunk-HCTY5QYL.js.map → chunk-QMXU5WXD.js.map} +1 -1
  49. package/dist/{chunk-JMFDIN5R.mjs → chunk-QR6X2UOT.mjs} +3 -3
  50. package/dist/{chunk-JMFDIN5R.mjs.map → chunk-QR6X2UOT.mjs.map} +1 -1
  51. package/dist/{chunk-TJ5LRNVT.mjs → chunk-RCE35UCX.mjs} +5 -5
  52. package/dist/{chunk-TJ5LRNVT.mjs.map → chunk-RCE35UCX.mjs.map} +1 -1
  53. package/dist/{chunk-TX4BUYX4.js → chunk-SDJHC7QY.js} +4 -4
  54. package/dist/{chunk-TX4BUYX4.js.map → chunk-SDJHC7QY.js.map} +1 -1
  55. package/dist/{chunk-2PNXLTEM.js → chunk-SZPUIQHI.js} +4 -4
  56. package/dist/{chunk-2PNXLTEM.js.map → chunk-SZPUIQHI.js.map} +1 -1
  57. package/dist/{chunk-7AJAQJOX.js → chunk-T374ZISI.js} +5 -5
  58. package/dist/{chunk-7AJAQJOX.js.map → chunk-T374ZISI.js.map} +1 -1
  59. package/dist/{chunk-VFZ7VMU2.js → chunk-TCVY7K63.js} +4 -4
  60. package/dist/{chunk-VFZ7VMU2.js.map → chunk-TCVY7K63.js.map} +1 -1
  61. package/dist/{chunk-FRUNZAYE.js → chunk-TJ35METS.js} +5 -5
  62. package/dist/{chunk-FRUNZAYE.js.map → chunk-TJ35METS.js.map} +1 -1
  63. package/dist/{chunk-NS6CI6RP.mjs → chunk-TYUTEYAK.mjs} +4 -4
  64. package/dist/{chunk-NS6CI6RP.mjs.map → chunk-TYUTEYAK.mjs.map} +1 -1
  65. package/dist/{chunk-FR4JV3JA.mjs → chunk-UINN3O5C.mjs} +4 -4
  66. package/dist/{chunk-FR4JV3JA.mjs.map → chunk-UINN3O5C.mjs.map} +1 -1
  67. package/dist/{chunk-6UYKIUQB.mjs → chunk-W32DESSM.mjs} +3 -3
  68. package/dist/{chunk-6UYKIUQB.mjs.map → chunk-W32DESSM.mjs.map} +1 -1
  69. package/dist/{chunk-SAJMSBGQ.mjs → chunk-WATUFPTP.mjs} +5 -5
  70. package/dist/{chunk-SAJMSBGQ.mjs.map → chunk-WATUFPTP.mjs.map} +1 -1
  71. package/dist/{chunk-MW7HQCFC.js → chunk-XJFGP7MK.js} +4 -4
  72. package/dist/{chunk-MW7HQCFC.js.map → chunk-XJFGP7MK.js.map} +1 -1
  73. package/dist/{chunk-324O7B3R.js → chunk-Z4P3MTRS.js} +5 -5
  74. package/dist/{chunk-324O7B3R.js.map → chunk-Z4P3MTRS.js.map} +1 -1
  75. package/dist/{chunk-DH3IXJRJ.mjs → chunk-Z5RTA2MB.mjs} +4 -4
  76. package/dist/{chunk-DH3IXJRJ.mjs.map → chunk-Z5RTA2MB.mjs.map} +1 -1
  77. package/dist/components/AdvancedPickers.js +10 -10
  78. package/dist/components/AdvancedPickers.mjs +5 -5
  79. package/dist/components/AppShell.js +9 -9
  80. package/dist/components/AppShell.mjs +7 -7
  81. package/dist/components/Comments.js +8 -8
  82. package/dist/components/Comments.mjs +5 -5
  83. package/dist/components/Commerce.js +19 -19
  84. package/dist/components/Commerce.mjs +8 -8
  85. package/dist/components/ContextMenu.js +4 -4
  86. package/dist/components/ContextMenu.mjs +3 -3
  87. package/dist/components/DataTable.js +13 -13
  88. package/dist/components/DataTable.mjs +6 -6
  89. package/dist/components/Display2.js +7 -7
  90. package/dist/components/Display2.mjs +3 -3
  91. package/dist/components/Display3.js +11 -11
  92. package/dist/components/Display3.mjs +5 -5
  93. package/dist/components/Editing.js +14 -14
  94. package/dist/components/Editing.mjs +8 -8
  95. package/dist/components/HoverCard.js +3 -3
  96. package/dist/components/HoverCard.mjs +2 -2
  97. package/dist/components/InputsExtra.js +14 -14
  98. package/dist/components/InputsExtra.mjs +5 -5
  99. package/dist/components/Layout.js +21 -21
  100. package/dist/components/Layout.mjs +2 -2
  101. package/dist/components/Logo.js +3 -3
  102. package/dist/components/Logo.mjs +2 -2
  103. package/dist/components/Menubar.js +4 -4
  104. package/dist/components/Menubar.mjs +3 -3
  105. package/dist/components/Metrics.js +1 -1
  106. package/dist/components/Metrics.mjs +1 -1
  107. package/dist/components/NavigationMenu.js +4 -4
  108. package/dist/components/NavigationMenu.mjs +3 -3
  109. package/dist/components/Overlay.js +9 -9
  110. package/dist/components/Overlay.mjs +7 -7
  111. package/dist/components/Pickers.js +9 -9
  112. package/dist/components/Pickers.mjs +4 -4
  113. package/dist/components/Popover.js +4 -4
  114. package/dist/components/Popover.mjs +3 -3
  115. package/dist/components/TimeAgo.js +6 -6
  116. package/dist/components/TimeAgo.mjs +4 -4
  117. package/dist/hooks/index.js +15 -15
  118. package/dist/hooks/index.mjs +3 -3
  119. package/dist/index.js +202 -202
  120. package/dist/index.mjs +34 -34
  121. package/dist/styles.css +1 -1
  122. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Display2.tsx"],"names":["jsxs","cx","jsx","React","usePopoverPosition","useDismiss","Portal","ChevronUp","ChevronDown"],"mappings":"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","file":"chunk-AGMDYCGG.js","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { ChevronUp, ChevronDown } from './Icons';\nimport { Portal } from './Portal';\nimport { usePopoverPosition } from '../hooks/usePopoverPosition';\nimport { useDismiss } from '../hooks/useDismiss';\n\n// ---------- Avatar ------------------------------------------------------\nexport interface AvatarProps extends React.HTMLAttributes<HTMLSpanElement> {\n src?: string;\n alt?: string;\n name?: string; // for initials fallback\n size?: 24 | 32 | 40 | 48 | 64;\n shape?: 'circle' | 'square';\n status?: 'online' | 'offline' | 'busy';\n}\n\nfunction initials(name: string) {\n if (name.startsWith('+')) return name;\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return '?';\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return parts.slice(0, 2).map((p) => p[0]?.toUpperCase() ?? '').join('');\n}\n\nexport function Avatar({ src, alt, name, size = 32, shape = 'circle', status, className, style, ...rest }: AvatarProps) {\n return (\n <span\n className={cx('avatar', `avatar--${shape}`, className)}\n style={{ width: size, height: size, fontSize: size * 0.42, ...style }}\n {...rest}\n >\n {src ? (\n <img src={src} alt={alt ?? name ?? ''} />\n ) : (\n <span className=\"avatar__initials\">{name ? initials(name) : '?'}</span>\n )}\n {status && <span className={cx('avatar__status', `avatar__status--${status}`)} aria-label={status} />}\n </span>\n );\n}\n\nexport interface AvatarGroupProps {\n children: React.ReactNode;\n max?: number;\n size?: AvatarProps['size'];\n className?: string;\n}\n\nexport function AvatarGroup({ children, max = 4, size = 32, className }: AvatarGroupProps) {\n const arr = React.Children.toArray(children);\n const shown = arr.slice(0, max);\n const overflow = arr.length - shown.length;\n return (\n <div className={cx('avatar-group', className)}>\n {shown.map((c, i) => <span key={i} style={{ marginLeft: i === 0 ? 0 : -size * 0.3, zIndex: shown.length - i }}>{c}</span>)}\n {overflow > 0 && (\n <Avatar name={`+${overflow}`} size={size} className=\"avatar--overflow\" />\n )}\n </div>\n );\n}\n\n// ---------- Menu (dropdown) accesible -----------------------------------\nexport interface MenuItemProps {\n label: React.ReactNode;\n icon?: React.ReactNode;\n description?: React.ReactNode;\n onSelect?: () => void;\n disabled?: boolean;\n destructive?: boolean;\n shortcut?: string;\n}\n\nexport interface MenuProps {\n trigger: React.ReactElement;\n items: Array<MenuItemProps | { type: 'separator' } | { type: 'label'; label: React.ReactNode }>;\n align?: 'start' | 'end';\n className?: string;\n}\n\nexport function Menu({ trigger, items, align = 'start', className }: MenuProps) {\n const [open, setOpen] = React.useState(false);\n const [active, setActive] = React.useState(0);\n const wrapRef = React.useRef<HTMLSpanElement>(null);\n const panelRef = React.useRef<HTMLDivElement>(null);\n const itemRefs = React.useRef<Array<HTMLButtonElement | null>>([]);\n\n // Positions within `items` that are focusable menu items (no\n // separators/labels/disabled). `active` indexes into this list.\n const enabledIdx = items\n .map((it, i) => ('type' in it ? -1 : it.disabled ? -1 : i))\n .filter((i) => i >= 0);\n\n const pos = usePopoverPosition(wrapRef, panelRef, {\n open,\n side: 'bottom',\n align,\n offset: 6,\n });\n\n const focusTrigger = React.useCallback(() => {\n wrapRef.current?.querySelector<HTMLElement>('[aria-haspopup=\"menu\"]')?.focus();\n }, []);\n\n // Outside-click closes; Escape is handled on the panel so it can also\n // return focus to the trigger (WAI-ARIA menu button pattern).\n useDismiss({\n open,\n onDismiss: () => setOpen(false),\n refs: [wrapRef, panelRef],\n closeOnEscape: false,\n });\n\n React.useEffect(() => {\n if (open) setActive(0);\n }, [open]);\n\n React.useEffect(() => {\n if (!open) return;\n const realIdx = enabledIdx[active];\n if (realIdx != null) itemRefs.current[realIdx]?.focus();\n }, [open, active, enabledIdx]);\n\n const select = (i: number) => {\n const it = items[i];\n if (!it || 'type' in it || it.disabled) return;\n it.onSelect?.();\n setOpen(false);\n focusTrigger();\n };\n\n const onPanelKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n setOpen(false);\n focusTrigger();\n } else if (e.key === 'Tab') {\n setOpen(false);\n } else if (e.key === 'ArrowDown') {\n e.preventDefault();\n setActive((a) => Math.min(a + 1, enabledIdx.length - 1));\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setActive((a) => Math.max(a - 1, 0));\n } else if (e.key === 'Home') {\n e.preventDefault();\n setActive(0);\n } else if (e.key === 'End') {\n e.preventDefault();\n setActive(Math.max(enabledIdx.length - 1, 0));\n } else if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n const realIdx = enabledIdx[active];\n if (realIdx != null) select(realIdx);\n }\n };\n\n const triggerEl = React.cloneElement(trigger, {\n onClick: (e: React.MouseEvent) => {\n trigger.props.onClick?.(e);\n setOpen((o) => !o);\n },\n onKeyDown: (e: React.KeyboardEvent) => {\n trigger.props.onKeyDown?.(e);\n if (e.key === 'ArrowDown' || e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n setOpen(true);\n }\n },\n 'aria-haspopup': 'menu',\n 'aria-expanded': open,\n });\n\n return (\n <span ref={wrapRef} className={cx('menu', className)} style={{ display: 'inline-block' }}>\n {triggerEl}\n {open && (\n <Portal>\n <div\n ref={panelRef}\n role=\"menu\"\n className=\"menu__panel\"\n onKeyDown={onPanelKeyDown}\n style={{\n position: 'fixed',\n top: pos.top,\n left: pos.left,\n visibility: pos.ready ? 'visible' : 'hidden',\n }}\n >\n {items.map((it, i) => {\n if ('type' in it && it.type === 'separator') return <div key={i} className=\"menu__sep\" role=\"separator\" />;\n if ('type' in it && it.type === 'label') return <div key={i} className=\"menu__label\">{it.label}</div>;\n const item = it as MenuItemProps;\n const isActive = enabledIdx[active] === i;\n return (\n <button\n key={i}\n ref={(el) => { itemRefs.current[i] = el; }}\n type=\"button\"\n role=\"menuitem\"\n tabIndex={isActive ? 0 : -1}\n disabled={item.disabled}\n className={cx('menu__item', isActive && 'is-active', item.destructive && 'is-destructive')}\n onMouseEnter={() => setActive(enabledIdx.indexOf(i))}\n onClick={() => select(i)}\n >\n {item.icon && <span className=\"menu__icon\" aria-hidden=\"true\">{item.icon}</span>}\n <span className=\"menu__body\">\n <span className=\"menu__label-row\">\n <span>{item.label}</span>\n {item.shortcut && <kbd className=\"menu__kbd\">{item.shortcut}</kbd>}\n </span>\n {item.description && <span className=\"menu__desc\">{item.description}</span>}\n </span>\n </button>\n );\n })}\n </div>\n </Portal>\n )}\n </span>\n );\n}\n\n// ---------- Stat / MiniStat ---------------------------------------------\nexport interface StatProps {\n label: React.ReactNode;\n value: React.ReactNode;\n hint?: React.ReactNode;\n trend?: { dir: 'up' | 'down' | 'flat'; value: string };\n align?: 'start' | 'center';\n className?: string;\n}\n\nexport function Stat({ label, value, hint, trend, align = 'start', className }: StatProps) {\n return (\n <div className={cx('stat', `stat--${align}`, className)}>\n <span className=\"stat__label\">{label}</span>\n <span className=\"stat__value\">{value}</span>\n {(hint || trend) && (\n <span className=\"stat__foot\">\n {trend && (\n <span className={cx('stat__trend', `stat__trend--${trend.dir}`)}>\n {trend.dir === 'up' ? <ChevronUp size={12} /> : trend.dir === 'down' ? <ChevronDown size={12} /> : '–'} {trend.value}\n </span>\n )}\n {hint && <span className=\"stat__hint\">{hint}</span>}\n </span>\n )}\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/Display2.tsx"],"names":["jsxs","cx","jsx","React","usePopoverPosition","useDismiss","Portal","ChevronUp","ChevronDown"],"mappings":"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","file":"chunk-MURFESTG.js","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { ChevronUp, ChevronDown } from './Icons';\nimport { Portal } from './Portal';\nimport { usePopoverPosition } from '../hooks/usePopoverPosition';\nimport { useDismiss } from '../hooks/useDismiss';\n\n// ---------- Avatar ------------------------------------------------------\nexport interface AvatarProps extends React.HTMLAttributes<HTMLSpanElement> {\n src?: string;\n alt?: string;\n name?: string; // for initials fallback\n size?: 24 | 32 | 40 | 48 | 64;\n shape?: 'circle' | 'square';\n status?: 'online' | 'offline' | 'busy';\n}\n\nfunction initials(name: string) {\n if (name.startsWith('+')) return name;\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return '?';\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return parts.slice(0, 2).map((p) => p[0]?.toUpperCase() ?? '').join('');\n}\n\nexport function Avatar({ src, alt, name, size = 32, shape = 'circle', status, className, style, ...rest }: AvatarProps) {\n return (\n <span\n className={cx('avatar', `avatar--${shape}`, className)}\n style={{ width: size, height: size, fontSize: size * 0.42, ...style }}\n {...rest}\n >\n {src ? (\n <img src={src} alt={alt ?? name ?? ''} />\n ) : (\n <span className=\"avatar__initials\">{name ? initials(name) : '?'}</span>\n )}\n {status && <span className={cx('avatar__status', `avatar__status--${status}`)} aria-label={status} />}\n </span>\n );\n}\n\nexport interface AvatarGroupProps {\n children: React.ReactNode;\n max?: number;\n size?: AvatarProps['size'];\n className?: string;\n}\n\nexport function AvatarGroup({ children, max = 4, size = 32, className }: AvatarGroupProps) {\n const arr = React.Children.toArray(children);\n const shown = arr.slice(0, max);\n const overflow = arr.length - shown.length;\n return (\n <div className={cx('avatar-group', className)}>\n {shown.map((c, i) => <span key={i} style={{ marginLeft: i === 0 ? 0 : -size * 0.3, zIndex: shown.length - i }}>{c}</span>)}\n {overflow > 0 && (\n <Avatar name={`+${overflow}`} size={size} className=\"avatar--overflow\" />\n )}\n </div>\n );\n}\n\n// ---------- Menu (dropdown) accesible -----------------------------------\nexport interface MenuItemProps {\n label: React.ReactNode;\n icon?: React.ReactNode;\n description?: React.ReactNode;\n onSelect?: () => void;\n disabled?: boolean;\n destructive?: boolean;\n shortcut?: string;\n}\n\nexport interface MenuProps {\n trigger: React.ReactElement;\n items: Array<MenuItemProps | { type: 'separator' } | { type: 'label'; label: React.ReactNode }>;\n align?: 'start' | 'end';\n className?: string;\n}\n\nexport function Menu({ trigger, items, align = 'start', className }: MenuProps) {\n const [open, setOpen] = React.useState(false);\n const [active, setActive] = React.useState(0);\n const wrapRef = React.useRef<HTMLSpanElement>(null);\n const panelRef = React.useRef<HTMLDivElement>(null);\n const itemRefs = React.useRef<Array<HTMLButtonElement | null>>([]);\n\n // Positions within `items` that are focusable menu items (no\n // separators/labels/disabled). `active` indexes into this list.\n const enabledIdx = items\n .map((it, i) => ('type' in it ? -1 : it.disabled ? -1 : i))\n .filter((i) => i >= 0);\n\n const pos = usePopoverPosition(wrapRef, panelRef, {\n open,\n side: 'bottom',\n align,\n offset: 6,\n });\n\n const focusTrigger = React.useCallback(() => {\n wrapRef.current?.querySelector<HTMLElement>('[aria-haspopup=\"menu\"]')?.focus();\n }, []);\n\n // Outside-click closes; Escape is handled on the panel so it can also\n // return focus to the trigger (WAI-ARIA menu button pattern).\n useDismiss({\n open,\n onDismiss: () => setOpen(false),\n refs: [wrapRef, panelRef],\n closeOnEscape: false,\n });\n\n React.useEffect(() => {\n if (open) setActive(0);\n }, [open]);\n\n React.useEffect(() => {\n if (!open) return;\n const realIdx = enabledIdx[active];\n if (realIdx != null) itemRefs.current[realIdx]?.focus();\n }, [open, active, enabledIdx]);\n\n const select = (i: number) => {\n const it = items[i];\n if (!it || 'type' in it || it.disabled) return;\n it.onSelect?.();\n setOpen(false);\n focusTrigger();\n };\n\n const onPanelKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n setOpen(false);\n focusTrigger();\n } else if (e.key === 'Tab') {\n setOpen(false);\n } else if (e.key === 'ArrowDown') {\n e.preventDefault();\n setActive((a) => Math.min(a + 1, enabledIdx.length - 1));\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setActive((a) => Math.max(a - 1, 0));\n } else if (e.key === 'Home') {\n e.preventDefault();\n setActive(0);\n } else if (e.key === 'End') {\n e.preventDefault();\n setActive(Math.max(enabledIdx.length - 1, 0));\n } else if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n const realIdx = enabledIdx[active];\n if (realIdx != null) select(realIdx);\n }\n };\n\n const triggerEl = React.cloneElement(trigger, {\n onClick: (e: React.MouseEvent) => {\n trigger.props.onClick?.(e);\n setOpen((o) => !o);\n },\n onKeyDown: (e: React.KeyboardEvent) => {\n trigger.props.onKeyDown?.(e);\n if (e.key === 'ArrowDown' || e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n setOpen(true);\n }\n },\n 'aria-haspopup': 'menu',\n 'aria-expanded': open,\n });\n\n return (\n <span ref={wrapRef} className={cx('menu', className)} style={{ display: 'inline-block' }}>\n {triggerEl}\n {open && (\n <Portal>\n <div\n ref={panelRef}\n role=\"menu\"\n className=\"menu__panel\"\n onKeyDown={onPanelKeyDown}\n style={{\n position: 'fixed',\n top: pos.top,\n left: pos.left,\n visibility: pos.ready ? 'visible' : 'hidden',\n }}\n >\n {items.map((it, i) => {\n if ('type' in it && it.type === 'separator') return <div key={i} className=\"menu__sep\" role=\"separator\" />;\n if ('type' in it && it.type === 'label') return <div key={i} className=\"menu__label\">{it.label}</div>;\n const item = it as MenuItemProps;\n const isActive = enabledIdx[active] === i;\n return (\n <button\n key={i}\n ref={(el) => { itemRefs.current[i] = el; }}\n type=\"button\"\n role=\"menuitem\"\n tabIndex={isActive ? 0 : -1}\n disabled={item.disabled}\n className={cx('menu__item', isActive && 'is-active', item.destructive && 'is-destructive')}\n onMouseEnter={() => setActive(enabledIdx.indexOf(i))}\n onClick={() => select(i)}\n >\n {item.icon && <span className=\"menu__icon\" aria-hidden=\"true\">{item.icon}</span>}\n <span className=\"menu__body\">\n <span className=\"menu__label-row\">\n <span>{item.label}</span>\n {item.shortcut && <kbd className=\"menu__kbd\">{item.shortcut}</kbd>}\n </span>\n {item.description && <span className=\"menu__desc\">{item.description}</span>}\n </span>\n </button>\n );\n })}\n </div>\n </Portal>\n )}\n </span>\n );\n}\n\n// ---------- Stat / MiniStat ---------------------------------------------\nexport interface StatProps {\n label: React.ReactNode;\n value: React.ReactNode;\n hint?: React.ReactNode;\n trend?: { dir: 'up' | 'down' | 'flat'; value: string };\n align?: 'start' | 'center';\n className?: string;\n}\n\nexport function Stat({ label, value, hint, trend, align = 'start', className }: StatProps) {\n return (\n <div className={cx('stat', `stat--${align}`, className)}>\n <span className=\"stat__label\">{label}</span>\n <span className=\"stat__value\">{value}</span>\n {(hint || trend) && (\n <span className=\"stat__foot\">\n {trend && (\n <span className={cx('stat__trend', `stat__trend--${trend.dir}`)}>\n {trend.dir === 'up' ? <ChevronUp size={12} /> : trend.dir === 'down' ? <ChevronDown size={12} /> : '–'} {trend.value}\n </span>\n )}\n {hint && <span className=\"stat__hint\">{hint}</span>}\n </span>\n )}\n </div>\n );\n}\n"]}
@@ -1,10 +1,10 @@
1
1
  'use client';
2
- import { Drawer } from './chunk-DLPTIVZB.mjs';
2
+ import { Drawer } from './chunk-IDYMCSGE.mjs';
3
3
  import { format } from './chunk-IGNKSI2E.mjs';
4
- import { getBrand } from './chunk-5GEWIK4T.mjs';
5
4
  import { useLocale } from './chunk-OOIRRKJ7.mjs';
6
5
  import { Star, Minus, Plus, Check, Heart, Trash, X } from './chunk-BJGMROKL.mjs';
7
6
  import { cx } from './chunk-IEPCH3JB.mjs';
7
+ import { getBrand } from './chunk-5GEWIK4T.mjs';
8
8
  import * as React from 'react';
9
9
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
10
10
 
@@ -423,5 +423,5 @@ function CompareTable({ items, attributes, onRemove, className, ...rest }) {
423
423
  }
424
424
 
425
425
  export { AddressForm, CartDrawer, CompareTable, FreeShippingProgress, OrderSummary, PriceDisplay, PromoCodeInput, QuantitySelector, Rating, VariantSelector, WishlistButton };
426
- //# sourceMappingURL=chunk-5G3DVB5B.mjs.map
427
- //# sourceMappingURL=chunk-5G3DVB5B.mjs.map
426
+ //# sourceMappingURL=chunk-OSXQQYSN.mjs.map
427
+ //# sourceMappingURL=chunk-OSXQQYSN.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Commerce.tsx"],"names":[],"mappings":"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","file":"chunk-5G3DVB5B.mjs","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { Drawer } from './Overlay';\nimport { Heart, Minus, Plus, Star, Trash, X, Check } from './Icons';\nimport { getBrand } from '../brand';\nimport { useLocale } from '../locale/LocaleProvider';\nimport { format } from '../locale/messages';\n\n// ---------- Rating ------------------------------------------------------\nexport interface RatingProps {\n value: number; // 0..max\n max?: number; // default 5\n /** Si se pasa, se vuelve interactivo. */\n onChange?: (value: number) => void;\n size?: number;\n /** Permite medias estrellas (display only). */\n allowHalf?: boolean;\n className?: string;\n ariaLabel?: string;\n}\n\nexport function Rating({\n value, max = 5, onChange, size = 16, allowHalf = true, className, ariaLabel,\n}: RatingProps) {\n const isInteractive = !!onChange;\n return (\n <div\n className={cx('rating', isInteractive && 'rating--interactive', className)}\n role={isInteractive ? 'slider' : 'img'}\n aria-label={ariaLabel ?? `${value} de ${max} estrellas`}\n aria-valuenow={isInteractive ? value : undefined}\n aria-valuemin={isInteractive ? 0 : undefined}\n aria-valuemax={isInteractive ? max : undefined}\n >\n {Array.from({ length: max }, (_, i) => {\n const idx = i + 1;\n const fill = value >= idx ? 1 : (allowHalf && value >= idx - 0.5 ? 0.5 : 0);\n return (\n <button\n key={i}\n type=\"button\"\n className={cx('rating__star', fill === 1 && 'is-full', fill === 0.5 && 'is-half')}\n disabled={!isInteractive}\n onClick={() => onChange?.(idx)}\n aria-label={`${idx} ${idx === 1 ? 'estrella' : 'estrellas'}`}\n >\n <Star size={size} />\n </button>\n );\n })}\n </div>\n );\n}\n\n// ---------- PriceDisplay -----------------------------------------------\nexport interface PriceDisplayProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n amount: number;\n /** Precio original tachado (para descuentos). */\n compareAt?: number;\n /** ISO 4217. Default desde `getBrand().currency`. */\n currency?: string;\n /** BCP 47. Default desde `getBrand().locale`. */\n locale?: string;\n size?: 'sm' | 'md' | 'lg' | 'xl';\n /** Muestra \"% off\" si hay compareAt. Default: true. */\n showDiscount?: boolean;\n}\n\nexport function PriceDisplay({\n amount, compareAt, currency, locale,\n size = 'md', showDiscount = true, className, ...rest\n}: PriceDisplayProps) {\n const brand = getBrand();\n const fmt = (n: number) =>\n new Intl.NumberFormat(locale ?? brand.locale, { style: 'currency', currency: currency ?? brand.currency, maximumFractionDigits: 0 }).format(n);\n\n const hasDiscount = compareAt != null && compareAt > amount;\n const discount = hasDiscount ? Math.round(((compareAt - amount) / compareAt) * 100) : 0;\n\n return (\n <div className={cx('price', `price--${size}`, className)} {...rest}>\n <span className=\"price__amount\">{fmt(amount)}</span>\n {hasDiscount && (\n <>\n <span className=\"price__compare\"><del>{fmt(compareAt)}</del></span>\n {showDiscount && discount > 0 && (\n <span className=\"price__discount\">-{discount}%</span>\n )}\n </>\n )}\n </div>\n );\n}\n\n// ---------- QuantitySelector (compacto) --------------------------------\nexport interface QuantitySelectorProps {\n value: number;\n onChange: (v: number) => void;\n min?: number;\n max?: number;\n step?: number;\n disabled?: boolean;\n size?: 'sm' | 'md';\n className?: string;\n id?: string;\n}\n\nexport function QuantitySelector({\n value, onChange, min = 1, max, step = 1, disabled, size = 'md', className, id,\n}: QuantitySelectorProps) {\n const t = useLocale();\n const set = (next: number) => {\n let v = next;\n if (typeof min === 'number') v = Math.max(min, v);\n if (typeof max === 'number') v = Math.min(max, v);\n onChange(v);\n };\n const dec = () => set(value - step);\n const inc = () => set(value + step);\n return (\n <div className={cx('qty', `qty--${size}`, disabled && 'is-disabled', className)}>\n <button\n type=\"button\"\n className=\"qty__btn\"\n aria-label={t['commerce.decreaseQty']}\n onClick={dec}\n disabled={disabled || (typeof min === 'number' && value <= min)}\n >\n <Minus size={14} />\n </button>\n <input\n id={id}\n type=\"number\"\n className=\"qty__input\"\n value={value}\n min={min}\n max={max}\n step={step}\n disabled={disabled}\n onChange={(e) => set(Number(e.target.value))}\n aria-label={t['commerce.quantity']}\n />\n <button\n type=\"button\"\n className=\"qty__btn\"\n aria-label={t['commerce.increaseQty']}\n onClick={inc}\n disabled={disabled || (typeof max === 'number' && value >= max)}\n >\n <Plus size={14} />\n </button>\n </div>\n );\n}\n\n// ---------- VariantSelector --------------------------------------------\nexport interface VariantOption<T = string> {\n value: T;\n label: React.ReactNode;\n disabled?: boolean;\n /** Color hex/rgb para chips de tipo \"color\". */\n swatch?: string;\n}\n\nexport interface VariantSelectorProps<T = string> {\n label?: React.ReactNode;\n options: VariantOption<T>[];\n value: T | null;\n onChange: (value: T) => void;\n /** 'chip' (default), 'swatch' (círculos de color). */\n appearance?: 'chip' | 'swatch';\n className?: string;\n}\n\nexport function VariantSelector<T extends string | number = string>({\n label, options, value, onChange, appearance = 'chip', className,\n}: VariantSelectorProps<T>) {\n return (\n <div className={cx('variants', className)}>\n {label && <div className=\"variants__label\">{label}</div>}\n <div className={cx('variants__options', `variants__options--${appearance}`)} role=\"radiogroup\">\n {options.map((o) => {\n const selected = value === o.value;\n if (appearance === 'swatch') {\n return (\n <button\n key={String(o.value)}\n type=\"button\"\n role=\"radio\"\n aria-checked={selected}\n disabled={o.disabled}\n className={cx('variants__swatch', selected && 'is-selected', o.disabled && 'is-disabled')}\n style={{ background: o.swatch }}\n title={typeof o.label === 'string' ? o.label : String(o.value)}\n aria-label={typeof o.label === 'string' ? o.label : String(o.value)}\n onClick={() => onChange(o.value)}\n >\n {selected && <Check size={14} />}\n </button>\n );\n }\n return (\n <button\n key={String(o.value)}\n type=\"button\"\n role=\"radio\"\n aria-checked={selected}\n disabled={o.disabled}\n className={cx('variants__chip', selected && 'is-selected', o.disabled && 'is-disabled')}\n onClick={() => onChange(o.value)}\n >\n {o.label}\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n\n// ---------- WishlistButton ---------------------------------------------\nexport interface WishlistButtonProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'onChange'> {\n active?: boolean;\n onToggle?: (next: boolean) => void;\n size?: number;\n}\n\nexport function WishlistButton({ active = false, onToggle, size = 20, className, ...rest }: WishlistButtonProps) {\n const t = useLocale();\n return (\n <button\n type=\"button\"\n className={cx('wishlist', active && 'is-active', className)}\n aria-label={active ? t['commerce.removeFavorite'] : t['commerce.addFavorite']}\n aria-pressed={active}\n onClick={() => onToggle?.(!active)}\n {...rest}\n >\n <Heart size={size} />\n </button>\n );\n}\n\n// ---------- PromoCodeInput ---------------------------------------------\nexport interface PromoCodeInputProps {\n /** Validador async. Resuelve con un mensaje de éxito o lanza un Error con el mensaje. */\n onApply: (code: string) => Promise<string>;\n placeholder?: string;\n buttonLabel?: string;\n className?: string;\n id?: string;\n}\n\nexport function PromoCodeInput({\n onApply, placeholder,\n buttonLabel, className, id,\n}: PromoCodeInputProps) {\n const [code, setCode] = React.useState('');\n const [state, setState] = React.useState<'idle' | 'loading' | 'success' | 'error'>('idle');\n const [message, setMessage] = React.useState<string | null>(null);\n const t = useLocale();\n const ph = placeholder ?? t['commerce.promoPlaceholder'];\n const btn = buttonLabel ?? t['commerce.applyCoupon'];\n\n const apply = async () => {\n if (!code.trim()) return;\n setState('loading');\n setMessage(null);\n try {\n const msg = await onApply(code.trim());\n setState('success');\n setMessage(msg);\n } catch (err) {\n setState('error');\n setMessage(err instanceof Error ? err.message : t['commerce.promoInvalid']);\n }\n };\n\n return (\n <div className={cx('promo', state === 'success' && 'is-success', state === 'error' && 'is-error', className)}>\n <div className=\"promo__row\">\n <input\n id={id}\n type=\"text\"\n className=\"input promo__input\"\n value={code}\n placeholder={ph}\n disabled={state === 'loading' || state === 'success'}\n onChange={(e) => { setCode(e.target.value.toUpperCase()); if (state !== 'idle') setState('idle'); }}\n onKeyDown={(e) => e.key === 'Enter' && apply()}\n />\n <button\n type=\"button\"\n className=\"btn btn--primary btn--md\"\n disabled={!code.trim() || state === 'loading' || state === 'success'}\n onClick={apply}\n >\n {state === 'loading' ? <span className=\"spinner spinner--inverse\" aria-hidden=\"true\" /> : btn}\n </button>\n </div>\n {message && <div className={cx('promo__message', `promo__message--${state}`)}>{message}</div>}\n </div>\n );\n}\n\n// ---------- FreeShippingProgress ---------------------------------------\nexport interface FreeShippingProgressProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Subtotal actual del cart. */\n current: number;\n /** Threshold para envío gratis. */\n threshold: number;\n currency?: string;\n locale?: string;\n achievedMessage?: React.ReactNode;\n}\n\nexport function FreeShippingProgress({\n current, threshold, currency, locale,\n achievedMessage,\n className, ...rest\n}: FreeShippingProgressProps) {\n const brand = getBrand();\n const t = useLocale();\n const fmt = (n: number) =>\n new Intl.NumberFormat(locale ?? brand.locale, { style: 'currency', currency: currency ?? brand.currency, maximumFractionDigits: 0 }).format(n);\n\n const pct = Math.min(100, (current / threshold) * 100);\n const remaining = Math.max(0, threshold - current);\n const achieved = current >= threshold;\n const successMsg = achievedMessage ?? t['commerce.shippingAchieved'];\n\n return (\n <div className={cx('shipping-progress', achieved && 'is-achieved', className)} {...rest}>\n <div className=\"shipping-progress__text\">\n {achieved ? successMsg : <>{t['commerce.shippingPrefix']}<strong>{fmt(remaining)}</strong>{t['commerce.shippingSuffix']}</>}\n </div>\n <div className=\"shipping-progress__track\" aria-hidden=\"true\">\n <div className=\"shipping-progress__bar\" style={{ width: `${pct}%` }} />\n </div>\n </div>\n );\n}\n\n// ---------- CartDrawer + line items ------------------------------------\nexport interface CartLineItem {\n id: string;\n name: React.ReactNode;\n variant?: React.ReactNode;\n image?: string;\n unitPrice: number;\n quantity: number;\n}\n\nexport interface CartDrawerProps {\n open: boolean;\n onClose: () => void;\n items: CartLineItem[];\n onQuantityChange?: (id: string, qty: number) => void;\n onRemove?: (id: string) => void;\n onCheckout?: () => void;\n freeShippingThreshold?: number;\n currency?: string;\n locale?: string;\n}\n\nexport function CartDrawer({\n open, onClose, items,\n onQuantityChange, onRemove, onCheckout,\n freeShippingThreshold, currency, locale,\n}: CartDrawerProps) {\n const brand = getBrand();\n const t = useLocale();\n const resolvedCurrency = currency ?? brand.currency;\n const resolvedLocale = locale ?? brand.locale;\n const subtotal = items.reduce((sum, it) => sum + it.unitPrice * it.quantity, 0);\n const fmt = (n: number) =>\n new Intl.NumberFormat(resolvedLocale, { style: 'currency', currency: resolvedCurrency, maximumFractionDigits: 0 }).format(n);\n\n return (\n <Drawer\n open={open}\n onClose={onClose}\n title={t['commerce.cartTitle']}\n footer={\n <div className=\"cart__footer\">\n {freeShippingThreshold != null && (\n <FreeShippingProgress current={subtotal} threshold={freeShippingThreshold} currency={resolvedCurrency} locale={resolvedLocale} />\n )}\n <div className=\"cart__totals\">\n <span>{t['commerce.subtotal']}</span>\n <strong>{fmt(subtotal)}</strong>\n </div>\n <button type=\"button\" className=\"btn btn--primary btn--lg btn--block\" disabled={items.length === 0} onClick={onCheckout}>\n {t['commerce.checkout']}\n </button>\n </div>\n }\n >\n {items.length === 0 ? (\n <div className=\"cart__empty\">{t['commerce.cartEmpty']}</div>\n ) : (\n <ul className=\"cart__list\">\n {items.map((it) => (\n <li key={it.id} className=\"cart__item\">\n <div className=\"cart__item-media\">\n {it.image ? <img src={it.image} alt=\"\" /> : <div className=\"cart__item-placeholder\" />}\n </div>\n <div className=\"cart__item-body\">\n <div className=\"cart__item-name\">{it.name}</div>\n {it.variant && <div className=\"cart__item-variant\">{it.variant}</div>}\n <div className=\"cart__item-price\">{fmt(it.unitPrice)}</div>\n </div>\n <div className=\"cart__item-actions\">\n {onQuantityChange ? (\n <QuantitySelector\n size=\"sm\"\n value={it.quantity}\n onChange={(q) => onQuantityChange(it.id, q)}\n />\n ) : (\n <span className=\"cart__item-qty\">x{it.quantity}</span>\n )}\n {onRemove && (\n <button\n type=\"button\"\n className=\"cart__item-remove\"\n aria-label={t['commerce.removeFromCart']}\n onClick={() => onRemove(it.id)}\n >\n <Trash size={14} />\n </button>\n )}\n </div>\n </li>\n ))}\n </ul>\n )}\n </Drawer>\n );\n}\n\n// ---------- OrderSummary ------------------------------------------------\nexport interface OrderLineRow {\n label: React.ReactNode;\n value: React.ReactNode;\n /** Aplica estilo de total (negrita, más grande). */\n emphasis?: boolean;\n}\n\nexport interface OrderSummaryProps extends Omit<React.HTMLAttributes<HTMLDListElement>, 'title'> {\n rows: OrderLineRow[];\n title?: React.ReactNode;\n}\n\nexport function OrderSummary({ rows, title, className, ...rest }: OrderSummaryProps) {\n return (\n <div className={cx('order-summary', className)}>\n {title && <div className=\"order-summary__title\">{title}</div>}\n <dl className=\"order-summary__list\" {...rest}>\n {rows.map((r, i) => (\n <div key={i} className={cx('order-summary__row', r.emphasis && 'is-emphasis')}>\n <dt>{r.label}</dt>\n <dd>{r.value}</dd>\n </div>\n ))}\n </dl>\n </div>\n );\n}\n\n// ---------- AddressForm (generic field composer) -----------------------\n// The kit doesn't ship country-specific fields. Consumers pass a `fields`\n// array describing which inputs to render and the order. For Chile, that\n// means defining `[{ key: 'rut', ... }, { key: 'comuna', ... }, ...]` in\n// app code. For other markets, define different fields.\n//\n// Layout: each field declares its `width` ('full' | 'half' | 'third').\n// The form renders in a 6-column CSS grid, where 'full' spans 6, 'half'\n// spans 3, and 'third' spans 2. On narrow viewports everything stacks.\n\nexport interface AddressFieldOption {\n value: string;\n label: React.ReactNode;\n}\n\nexport interface AddressField {\n /** Key del campo en el objeto `value`. */\n key: string;\n label: React.ReactNode;\n type?: 'text' | 'select' | 'textarea';\n placeholder?: string;\n /** Solo para `type: 'select'`. */\n options?: readonly AddressFieldOption[];\n /** Placeholder de la opción vacía. Default: 'Selecciona…' (locale: `common.search` no aplica). */\n selectPlaceholder?: string;\n /** Anchura en una grilla de 6 columnas. Default: 'full'. */\n width?: 'full' | 'half' | 'third';\n /** Solo para `type: 'textarea'`. */\n rows?: number;\n}\n\nexport interface AddressFormProps {\n fields: AddressField[];\n value: Record<string, string>;\n onChange: (value: Record<string, string>) => void;\n className?: string;\n}\n\nexport function AddressForm({ fields, value, onChange, className }: AddressFormProps) {\n const reactId = React.useId();\n const set = (key: string, v: string) => onChange({ ...value, [key]: v });\n\n return (\n <div className={cx('address-form', className)}>\n {fields.map((f) => {\n const id = `${reactId}-${f.key}`;\n const width = f.width ?? 'full';\n const v = value[f.key] ?? '';\n return (\n <div key={f.key} className={cx('form-field', `address-form__field--${width}`)}>\n <label className=\"label\" htmlFor={id}>{f.label}</label>\n {f.type === 'select' ? (\n <select\n id={id}\n className=\"select\"\n value={v}\n onChange={(e) => set(f.key, e.target.value)}\n >\n <option value=\"\">{f.selectPlaceholder ?? 'Selecciona…'}</option>\n {f.options?.map((o) => (\n <option key={o.value} value={o.value}>\n {typeof o.label === 'string' ? o.label : o.value}\n </option>\n ))}\n </select>\n ) : f.type === 'textarea' ? (\n <textarea\n id={id}\n className=\"textarea\"\n value={v}\n placeholder={f.placeholder}\n rows={f.rows ?? 2}\n onChange={(e) => set(f.key, e.target.value)}\n />\n ) : (\n <input\n id={id}\n className=\"input\"\n value={v}\n placeholder={f.placeholder}\n onChange={(e) => set(f.key, e.target.value)}\n />\n )}\n </div>\n );\n })}\n </div>\n );\n}\n\n// ---------- CompareTable -----------------------------------------------\nexport interface CompareItem {\n id: string;\n name: React.ReactNode;\n image?: string;\n price?: React.ReactNode;\n}\n\nexport interface CompareAttribute {\n key: string;\n label: React.ReactNode;\n /** Valor por item, indexado por id. */\n values: Record<string, React.ReactNode>;\n}\n\nexport interface CompareTableProps extends React.HTMLAttributes<HTMLTableElement> {\n items: CompareItem[];\n attributes: CompareAttribute[];\n onRemove?: (id: string) => void;\n}\n\nexport function CompareTable({ items, attributes, onRemove, className, ...rest }: CompareTableProps) {\n const t = useLocale();\n return (\n <div className={cx('compare', className)}>\n <table className=\"compare__table\" {...rest}>\n <thead>\n <tr>\n <th />\n {items.map((it) => (\n <th key={it.id} scope=\"col\">\n <div className=\"compare__head\">\n {it.image && <img src={it.image} alt=\"\" className=\"compare__img\" />}\n <div className=\"compare__name\">{it.name}</div>\n {it.price && <div className=\"compare__price\">{it.price}</div>}\n {onRemove && (\n <button\n type=\"button\"\n className=\"compare__remove\"\n aria-label={format(t['commerce.removeItem'], { name: typeof it.name === 'string' ? it.name : 'item' })}\n onClick={() => onRemove(it.id)}\n >\n <X size={14} />\n </button>\n )}\n </div>\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {attributes.map((attr) => (\n <tr key={attr.key}>\n <th scope=\"row\" className=\"compare__attr\">{attr.label}</th>\n {items.map((it) => (\n <td key={it.id} className=\"compare__cell\">{attr.values[it.id] ?? '—'}</td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/Commerce.tsx"],"names":[],"mappings":"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","file":"chunk-OSXQQYSN.mjs","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { Drawer } from './Overlay';\nimport { Heart, Minus, Plus, Star, Trash, X, Check } from './Icons';\nimport { getBrand } from '../brand';\nimport { useLocale } from '../locale/LocaleProvider';\nimport { format } from '../locale/messages';\n\n// ---------- Rating ------------------------------------------------------\nexport interface RatingProps {\n value: number; // 0..max\n max?: number; // default 5\n /** Si se pasa, se vuelve interactivo. */\n onChange?: (value: number) => void;\n size?: number;\n /** Permite medias estrellas (display only). */\n allowHalf?: boolean;\n className?: string;\n ariaLabel?: string;\n}\n\nexport function Rating({\n value, max = 5, onChange, size = 16, allowHalf = true, className, ariaLabel,\n}: RatingProps) {\n const isInteractive = !!onChange;\n return (\n <div\n className={cx('rating', isInteractive && 'rating--interactive', className)}\n role={isInteractive ? 'slider' : 'img'}\n aria-label={ariaLabel ?? `${value} de ${max} estrellas`}\n aria-valuenow={isInteractive ? value : undefined}\n aria-valuemin={isInteractive ? 0 : undefined}\n aria-valuemax={isInteractive ? max : undefined}\n >\n {Array.from({ length: max }, (_, i) => {\n const idx = i + 1;\n const fill = value >= idx ? 1 : (allowHalf && value >= idx - 0.5 ? 0.5 : 0);\n return (\n <button\n key={i}\n type=\"button\"\n className={cx('rating__star', fill === 1 && 'is-full', fill === 0.5 && 'is-half')}\n disabled={!isInteractive}\n onClick={() => onChange?.(idx)}\n aria-label={`${idx} ${idx === 1 ? 'estrella' : 'estrellas'}`}\n >\n <Star size={size} />\n </button>\n );\n })}\n </div>\n );\n}\n\n// ---------- PriceDisplay -----------------------------------------------\nexport interface PriceDisplayProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n amount: number;\n /** Precio original tachado (para descuentos). */\n compareAt?: number;\n /** ISO 4217. Default desde `getBrand().currency`. */\n currency?: string;\n /** BCP 47. Default desde `getBrand().locale`. */\n locale?: string;\n size?: 'sm' | 'md' | 'lg' | 'xl';\n /** Muestra \"% off\" si hay compareAt. Default: true. */\n showDiscount?: boolean;\n}\n\nexport function PriceDisplay({\n amount, compareAt, currency, locale,\n size = 'md', showDiscount = true, className, ...rest\n}: PriceDisplayProps) {\n const brand = getBrand();\n const fmt = (n: number) =>\n new Intl.NumberFormat(locale ?? brand.locale, { style: 'currency', currency: currency ?? brand.currency, maximumFractionDigits: 0 }).format(n);\n\n const hasDiscount = compareAt != null && compareAt > amount;\n const discount = hasDiscount ? Math.round(((compareAt - amount) / compareAt) * 100) : 0;\n\n return (\n <div className={cx('price', `price--${size}`, className)} {...rest}>\n <span className=\"price__amount\">{fmt(amount)}</span>\n {hasDiscount && (\n <>\n <span className=\"price__compare\"><del>{fmt(compareAt)}</del></span>\n {showDiscount && discount > 0 && (\n <span className=\"price__discount\">-{discount}%</span>\n )}\n </>\n )}\n </div>\n );\n}\n\n// ---------- QuantitySelector (compacto) --------------------------------\nexport interface QuantitySelectorProps {\n value: number;\n onChange: (v: number) => void;\n min?: number;\n max?: number;\n step?: number;\n disabled?: boolean;\n size?: 'sm' | 'md';\n className?: string;\n id?: string;\n}\n\nexport function QuantitySelector({\n value, onChange, min = 1, max, step = 1, disabled, size = 'md', className, id,\n}: QuantitySelectorProps) {\n const t = useLocale();\n const set = (next: number) => {\n let v = next;\n if (typeof min === 'number') v = Math.max(min, v);\n if (typeof max === 'number') v = Math.min(max, v);\n onChange(v);\n };\n const dec = () => set(value - step);\n const inc = () => set(value + step);\n return (\n <div className={cx('qty', `qty--${size}`, disabled && 'is-disabled', className)}>\n <button\n type=\"button\"\n className=\"qty__btn\"\n aria-label={t['commerce.decreaseQty']}\n onClick={dec}\n disabled={disabled || (typeof min === 'number' && value <= min)}\n >\n <Minus size={14} />\n </button>\n <input\n id={id}\n type=\"number\"\n className=\"qty__input\"\n value={value}\n min={min}\n max={max}\n step={step}\n disabled={disabled}\n onChange={(e) => set(Number(e.target.value))}\n aria-label={t['commerce.quantity']}\n />\n <button\n type=\"button\"\n className=\"qty__btn\"\n aria-label={t['commerce.increaseQty']}\n onClick={inc}\n disabled={disabled || (typeof max === 'number' && value >= max)}\n >\n <Plus size={14} />\n </button>\n </div>\n );\n}\n\n// ---------- VariantSelector --------------------------------------------\nexport interface VariantOption<T = string> {\n value: T;\n label: React.ReactNode;\n disabled?: boolean;\n /** Color hex/rgb para chips de tipo \"color\". */\n swatch?: string;\n}\n\nexport interface VariantSelectorProps<T = string> {\n label?: React.ReactNode;\n options: VariantOption<T>[];\n value: T | null;\n onChange: (value: T) => void;\n /** 'chip' (default), 'swatch' (círculos de color). */\n appearance?: 'chip' | 'swatch';\n className?: string;\n}\n\nexport function VariantSelector<T extends string | number = string>({\n label, options, value, onChange, appearance = 'chip', className,\n}: VariantSelectorProps<T>) {\n return (\n <div className={cx('variants', className)}>\n {label && <div className=\"variants__label\">{label}</div>}\n <div className={cx('variants__options', `variants__options--${appearance}`)} role=\"radiogroup\">\n {options.map((o) => {\n const selected = value === o.value;\n if (appearance === 'swatch') {\n return (\n <button\n key={String(o.value)}\n type=\"button\"\n role=\"radio\"\n aria-checked={selected}\n disabled={o.disabled}\n className={cx('variants__swatch', selected && 'is-selected', o.disabled && 'is-disabled')}\n style={{ background: o.swatch }}\n title={typeof o.label === 'string' ? o.label : String(o.value)}\n aria-label={typeof o.label === 'string' ? o.label : String(o.value)}\n onClick={() => onChange(o.value)}\n >\n {selected && <Check size={14} />}\n </button>\n );\n }\n return (\n <button\n key={String(o.value)}\n type=\"button\"\n role=\"radio\"\n aria-checked={selected}\n disabled={o.disabled}\n className={cx('variants__chip', selected && 'is-selected', o.disabled && 'is-disabled')}\n onClick={() => onChange(o.value)}\n >\n {o.label}\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n\n// ---------- WishlistButton ---------------------------------------------\nexport interface WishlistButtonProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'onChange'> {\n active?: boolean;\n onToggle?: (next: boolean) => void;\n size?: number;\n}\n\nexport function WishlistButton({ active = false, onToggle, size = 20, className, ...rest }: WishlistButtonProps) {\n const t = useLocale();\n return (\n <button\n type=\"button\"\n className={cx('wishlist', active && 'is-active', className)}\n aria-label={active ? t['commerce.removeFavorite'] : t['commerce.addFavorite']}\n aria-pressed={active}\n onClick={() => onToggle?.(!active)}\n {...rest}\n >\n <Heart size={size} />\n </button>\n );\n}\n\n// ---------- PromoCodeInput ---------------------------------------------\nexport interface PromoCodeInputProps {\n /** Validador async. Resuelve con un mensaje de éxito o lanza un Error con el mensaje. */\n onApply: (code: string) => Promise<string>;\n placeholder?: string;\n buttonLabel?: string;\n className?: string;\n id?: string;\n}\n\nexport function PromoCodeInput({\n onApply, placeholder,\n buttonLabel, className, id,\n}: PromoCodeInputProps) {\n const [code, setCode] = React.useState('');\n const [state, setState] = React.useState<'idle' | 'loading' | 'success' | 'error'>('idle');\n const [message, setMessage] = React.useState<string | null>(null);\n const t = useLocale();\n const ph = placeholder ?? t['commerce.promoPlaceholder'];\n const btn = buttonLabel ?? t['commerce.applyCoupon'];\n\n const apply = async () => {\n if (!code.trim()) return;\n setState('loading');\n setMessage(null);\n try {\n const msg = await onApply(code.trim());\n setState('success');\n setMessage(msg);\n } catch (err) {\n setState('error');\n setMessage(err instanceof Error ? err.message : t['commerce.promoInvalid']);\n }\n };\n\n return (\n <div className={cx('promo', state === 'success' && 'is-success', state === 'error' && 'is-error', className)}>\n <div className=\"promo__row\">\n <input\n id={id}\n type=\"text\"\n className=\"input promo__input\"\n value={code}\n placeholder={ph}\n disabled={state === 'loading' || state === 'success'}\n onChange={(e) => { setCode(e.target.value.toUpperCase()); if (state !== 'idle') setState('idle'); }}\n onKeyDown={(e) => e.key === 'Enter' && apply()}\n />\n <button\n type=\"button\"\n className=\"btn btn--primary btn--md\"\n disabled={!code.trim() || state === 'loading' || state === 'success'}\n onClick={apply}\n >\n {state === 'loading' ? <span className=\"spinner spinner--inverse\" aria-hidden=\"true\" /> : btn}\n </button>\n </div>\n {message && <div className={cx('promo__message', `promo__message--${state}`)}>{message}</div>}\n </div>\n );\n}\n\n// ---------- FreeShippingProgress ---------------------------------------\nexport interface FreeShippingProgressProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Subtotal actual del cart. */\n current: number;\n /** Threshold para envío gratis. */\n threshold: number;\n currency?: string;\n locale?: string;\n achievedMessage?: React.ReactNode;\n}\n\nexport function FreeShippingProgress({\n current, threshold, currency, locale,\n achievedMessage,\n className, ...rest\n}: FreeShippingProgressProps) {\n const brand = getBrand();\n const t = useLocale();\n const fmt = (n: number) =>\n new Intl.NumberFormat(locale ?? brand.locale, { style: 'currency', currency: currency ?? brand.currency, maximumFractionDigits: 0 }).format(n);\n\n const pct = Math.min(100, (current / threshold) * 100);\n const remaining = Math.max(0, threshold - current);\n const achieved = current >= threshold;\n const successMsg = achievedMessage ?? t['commerce.shippingAchieved'];\n\n return (\n <div className={cx('shipping-progress', achieved && 'is-achieved', className)} {...rest}>\n <div className=\"shipping-progress__text\">\n {achieved ? successMsg : <>{t['commerce.shippingPrefix']}<strong>{fmt(remaining)}</strong>{t['commerce.shippingSuffix']}</>}\n </div>\n <div className=\"shipping-progress__track\" aria-hidden=\"true\">\n <div className=\"shipping-progress__bar\" style={{ width: `${pct}%` }} />\n </div>\n </div>\n );\n}\n\n// ---------- CartDrawer + line items ------------------------------------\nexport interface CartLineItem {\n id: string;\n name: React.ReactNode;\n variant?: React.ReactNode;\n image?: string;\n unitPrice: number;\n quantity: number;\n}\n\nexport interface CartDrawerProps {\n open: boolean;\n onClose: () => void;\n items: CartLineItem[];\n onQuantityChange?: (id: string, qty: number) => void;\n onRemove?: (id: string) => void;\n onCheckout?: () => void;\n freeShippingThreshold?: number;\n currency?: string;\n locale?: string;\n}\n\nexport function CartDrawer({\n open, onClose, items,\n onQuantityChange, onRemove, onCheckout,\n freeShippingThreshold, currency, locale,\n}: CartDrawerProps) {\n const brand = getBrand();\n const t = useLocale();\n const resolvedCurrency = currency ?? brand.currency;\n const resolvedLocale = locale ?? brand.locale;\n const subtotal = items.reduce((sum, it) => sum + it.unitPrice * it.quantity, 0);\n const fmt = (n: number) =>\n new Intl.NumberFormat(resolvedLocale, { style: 'currency', currency: resolvedCurrency, maximumFractionDigits: 0 }).format(n);\n\n return (\n <Drawer\n open={open}\n onClose={onClose}\n title={t['commerce.cartTitle']}\n footer={\n <div className=\"cart__footer\">\n {freeShippingThreshold != null && (\n <FreeShippingProgress current={subtotal} threshold={freeShippingThreshold} currency={resolvedCurrency} locale={resolvedLocale} />\n )}\n <div className=\"cart__totals\">\n <span>{t['commerce.subtotal']}</span>\n <strong>{fmt(subtotal)}</strong>\n </div>\n <button type=\"button\" className=\"btn btn--primary btn--lg btn--block\" disabled={items.length === 0} onClick={onCheckout}>\n {t['commerce.checkout']}\n </button>\n </div>\n }\n >\n {items.length === 0 ? (\n <div className=\"cart__empty\">{t['commerce.cartEmpty']}</div>\n ) : (\n <ul className=\"cart__list\">\n {items.map((it) => (\n <li key={it.id} className=\"cart__item\">\n <div className=\"cart__item-media\">\n {it.image ? <img src={it.image} alt=\"\" /> : <div className=\"cart__item-placeholder\" />}\n </div>\n <div className=\"cart__item-body\">\n <div className=\"cart__item-name\">{it.name}</div>\n {it.variant && <div className=\"cart__item-variant\">{it.variant}</div>}\n <div className=\"cart__item-price\">{fmt(it.unitPrice)}</div>\n </div>\n <div className=\"cart__item-actions\">\n {onQuantityChange ? (\n <QuantitySelector\n size=\"sm\"\n value={it.quantity}\n onChange={(q) => onQuantityChange(it.id, q)}\n />\n ) : (\n <span className=\"cart__item-qty\">x{it.quantity}</span>\n )}\n {onRemove && (\n <button\n type=\"button\"\n className=\"cart__item-remove\"\n aria-label={t['commerce.removeFromCart']}\n onClick={() => onRemove(it.id)}\n >\n <Trash size={14} />\n </button>\n )}\n </div>\n </li>\n ))}\n </ul>\n )}\n </Drawer>\n );\n}\n\n// ---------- OrderSummary ------------------------------------------------\nexport interface OrderLineRow {\n label: React.ReactNode;\n value: React.ReactNode;\n /** Aplica estilo de total (negrita, más grande). */\n emphasis?: boolean;\n}\n\nexport interface OrderSummaryProps extends Omit<React.HTMLAttributes<HTMLDListElement>, 'title'> {\n rows: OrderLineRow[];\n title?: React.ReactNode;\n}\n\nexport function OrderSummary({ rows, title, className, ...rest }: OrderSummaryProps) {\n return (\n <div className={cx('order-summary', className)}>\n {title && <div className=\"order-summary__title\">{title}</div>}\n <dl className=\"order-summary__list\" {...rest}>\n {rows.map((r, i) => (\n <div key={i} className={cx('order-summary__row', r.emphasis && 'is-emphasis')}>\n <dt>{r.label}</dt>\n <dd>{r.value}</dd>\n </div>\n ))}\n </dl>\n </div>\n );\n}\n\n// ---------- AddressForm (generic field composer) -----------------------\n// The kit doesn't ship country-specific fields. Consumers pass a `fields`\n// array describing which inputs to render and the order. For Chile, that\n// means defining `[{ key: 'rut', ... }, { key: 'comuna', ... }, ...]` in\n// app code. For other markets, define different fields.\n//\n// Layout: each field declares its `width` ('full' | 'half' | 'third').\n// The form renders in a 6-column CSS grid, where 'full' spans 6, 'half'\n// spans 3, and 'third' spans 2. On narrow viewports everything stacks.\n\nexport interface AddressFieldOption {\n value: string;\n label: React.ReactNode;\n}\n\nexport interface AddressField {\n /** Key del campo en el objeto `value`. */\n key: string;\n label: React.ReactNode;\n type?: 'text' | 'select' | 'textarea';\n placeholder?: string;\n /** Solo para `type: 'select'`. */\n options?: readonly AddressFieldOption[];\n /** Placeholder de la opción vacía. Default: 'Selecciona…' (locale: `common.search` no aplica). */\n selectPlaceholder?: string;\n /** Anchura en una grilla de 6 columnas. Default: 'full'. */\n width?: 'full' | 'half' | 'third';\n /** Solo para `type: 'textarea'`. */\n rows?: number;\n}\n\nexport interface AddressFormProps {\n fields: AddressField[];\n value: Record<string, string>;\n onChange: (value: Record<string, string>) => void;\n className?: string;\n}\n\nexport function AddressForm({ fields, value, onChange, className }: AddressFormProps) {\n const reactId = React.useId();\n const set = (key: string, v: string) => onChange({ ...value, [key]: v });\n\n return (\n <div className={cx('address-form', className)}>\n {fields.map((f) => {\n const id = `${reactId}-${f.key}`;\n const width = f.width ?? 'full';\n const v = value[f.key] ?? '';\n return (\n <div key={f.key} className={cx('form-field', `address-form__field--${width}`)}>\n <label className=\"label\" htmlFor={id}>{f.label}</label>\n {f.type === 'select' ? (\n <select\n id={id}\n className=\"select\"\n value={v}\n onChange={(e) => set(f.key, e.target.value)}\n >\n <option value=\"\">{f.selectPlaceholder ?? 'Selecciona…'}</option>\n {f.options?.map((o) => (\n <option key={o.value} value={o.value}>\n {typeof o.label === 'string' ? o.label : o.value}\n </option>\n ))}\n </select>\n ) : f.type === 'textarea' ? (\n <textarea\n id={id}\n className=\"textarea\"\n value={v}\n placeholder={f.placeholder}\n rows={f.rows ?? 2}\n onChange={(e) => set(f.key, e.target.value)}\n />\n ) : (\n <input\n id={id}\n className=\"input\"\n value={v}\n placeholder={f.placeholder}\n onChange={(e) => set(f.key, e.target.value)}\n />\n )}\n </div>\n );\n })}\n </div>\n );\n}\n\n// ---------- CompareTable -----------------------------------------------\nexport interface CompareItem {\n id: string;\n name: React.ReactNode;\n image?: string;\n price?: React.ReactNode;\n}\n\nexport interface CompareAttribute {\n key: string;\n label: React.ReactNode;\n /** Valor por item, indexado por id. */\n values: Record<string, React.ReactNode>;\n}\n\nexport interface CompareTableProps extends React.HTMLAttributes<HTMLTableElement> {\n items: CompareItem[];\n attributes: CompareAttribute[];\n onRemove?: (id: string) => void;\n}\n\nexport function CompareTable({ items, attributes, onRemove, className, ...rest }: CompareTableProps) {\n const t = useLocale();\n return (\n <div className={cx('compare', className)}>\n <table className=\"compare__table\" {...rest}>\n <thead>\n <tr>\n <th />\n {items.map((it) => (\n <th key={it.id} scope=\"col\">\n <div className=\"compare__head\">\n {it.image && <img src={it.image} alt=\"\" className=\"compare__img\" />}\n <div className=\"compare__name\">{it.name}</div>\n {it.price && <div className=\"compare__price\">{it.price}</div>}\n {onRemove && (\n <button\n type=\"button\"\n className=\"compare__remove\"\n aria-label={format(t['commerce.removeItem'], { name: typeof it.name === 'string' ? it.name : 'item' })}\n onClick={() => onRemove(it.id)}\n >\n <X size={14} />\n </button>\n )}\n </div>\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {attributes.map((attr) => (\n <tr key={attr.key}>\n <th scope=\"row\" className=\"compare__attr\">{attr.label}</th>\n {items.map((it) => (\n <td key={it.id} className=\"compare__cell\">{attr.values[it.id] ?? '—'}</td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n"]}
@@ -2,9 +2,9 @@
2
2
  'use strict';
3
3
 
4
4
  var chunkWAGWB35Q_js = require('./chunk-WAGWB35Q.js');
5
- var chunkXMLBKK7X_js = require('./chunk-XMLBKK7X.js');
6
- var chunkCRKYET66_js = require('./chunk-CRKYET66.js');
7
5
  var chunkPASF6T4H_js = require('./chunk-PASF6T4H.js');
6
+ var chunkCRKYET66_js = require('./chunk-CRKYET66.js');
7
+ var chunkXMLBKK7X_js = require('./chunk-XMLBKK7X.js');
8
8
  var React = require('react');
9
9
  var jsxRuntime = require('react/jsx-runtime');
10
10
 
@@ -235,5 +235,5 @@ function Menubar({ menus, className, ariaLabel = "Barra de men\xFAs" }) {
235
235
  }
236
236
 
237
237
  exports.Menubar = Menubar;
238
- //# sourceMappingURL=chunk-HCTY5QYL.js.map
239
- //# sourceMappingURL=chunk-HCTY5QYL.js.map
238
+ //# sourceMappingURL=chunk-QMXU5WXD.js.map
239
+ //# sourceMappingURL=chunk-QMXU5WXD.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Menubar.tsx"],"names":["React","usePopoverPosition","useDismiss","cx","jsxs","jsx","Portal"],"mappings":"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","file":"chunk-HCTY5QYL.js","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { Portal } from './Portal';\nimport { usePopoverPosition } from '../hooks/usePopoverPosition';\nimport { useDismiss } from '../hooks/useDismiss';\n\nexport interface MenubarItem {\n id: string;\n label?: React.ReactNode;\n onSelect?: () => void;\n disabled?: boolean;\n separator?: boolean;\n shortcut?: string;\n}\n\nexport interface MenubarMenu {\n id: string;\n label: React.ReactNode;\n items: MenubarItem[];\n}\n\nexport interface MenubarProps {\n menus: MenubarMenu[];\n className?: string;\n ariaLabel?: string;\n}\n\nexport function Menubar({ menus, className, ariaLabel = 'Barra de menús' }: MenubarProps) {\n const [openId, setOpenId] = React.useState<string | null>(null);\n const [active, setActive] = React.useState(0);\n // Roving tab stop for the menubar row (one tab stop, arrows move between\n // triggers — WAI-ARIA menubar pattern).\n const [tabId, setTabId] = React.useState<string | null>(menus[0]?.id ?? null);\n // Keyboard opens move focus into the menu; pointer opens don't.\n const focusOnOpen = React.useRef(false);\n const rootRef = React.useRef<HTMLDivElement>(null);\n const panelRef = React.useRef<HTMLUListElement>(null);\n const anchorRef = React.useRef<HTMLElement | null>(null);\n const triggerRefs = React.useRef<Record<string, HTMLButtonElement | null>>({});\n const itemRefs = React.useRef<Array<HTMLButtonElement | null>>([]);\n\n const open = openId !== null;\n const openMenu = menus.find((m) => m.id === openId) ?? null;\n const menuIndex = menus.findIndex((m) => m.id === openId);\n\n // Positions within the open menu that are selectable (no\n // separators/disabled). `active` indexes into this list.\n const enabledIdx = (openMenu?.items ?? [])\n .map((it, i) => (it.separator || it.disabled ? -1 : i))\n .filter((i) => i >= 0);\n\n const pos = usePopoverPosition(anchorRef, panelRef, {\n open,\n side: 'bottom',\n align: 'start',\n offset: 6,\n });\n\n useDismiss({\n open,\n onDismiss: () => setOpenId(null),\n refs: [rootRef, panelRef],\n closeOnEscape: false,\n });\n\n const focusTrigger = (id: string | null) => {\n if (id) triggerRefs.current[id]?.focus();\n };\n\n const openMenuById = (id: string, viaKeyboard: boolean) => {\n const el = triggerRefs.current[id];\n if (el) anchorRef.current = el;\n focusOnOpen.current = viaKeyboard;\n setActive(0);\n setTabId(id);\n setOpenId(id);\n };\n\n const closeAndFocusTrigger = () => {\n const id = openId;\n setOpenId(null);\n focusTrigger(id);\n };\n\n React.useEffect(() => {\n if (open && focusOnOpen.current) {\n focusOnOpen.current = false;\n const realIdx = enabledIdx[0];\n if (realIdx != null) itemRefs.current[realIdx]?.focus();\n }\n }, [open, enabledIdx]);\n\n React.useEffect(() => {\n if (!open || focusOnOpen.current) return;\n const realIdx = enabledIdx[active];\n if (realIdx != null) itemRefs.current[realIdx]?.focus();\n }, [open, active, enabledIdx]);\n\n const selectItem = (item: MenubarItem) => {\n if (item.disabled || item.separator) return;\n item.onSelect?.();\n closeAndFocusTrigger();\n };\n\n const stepMenu = (dir: 1 | -1) => {\n if (menus.length === 0) return;\n const from = menuIndex >= 0 ? menuIndex : 0;\n const next = (from + dir + menus.length) % menus.length;\n openMenuById(menus[next].id, true);\n };\n\n const onTriggerKeyDown = (e: React.KeyboardEvent, menu: MenubarMenu, index: number) => {\n if (e.key === 'ArrowDown' || e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n openMenuById(menu.id, true);\n } else if (e.key === 'ArrowRight') {\n e.preventDefault();\n const next = menus[(index + 1) % menus.length];\n setTabId(next.id);\n if (open) openMenuById(next.id, true);\n else focusTrigger(next.id);\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault();\n const prev = menus[(index - 1 + menus.length) % menus.length];\n setTabId(prev.id);\n if (open) openMenuById(prev.id, true);\n else focusTrigger(prev.id);\n } else if (e.key === 'Escape' && open) {\n e.preventDefault();\n setOpenId(null);\n } else if (e.key === 'Home') {\n e.preventDefault();\n setTabId(menus[0].id);\n focusTrigger(menus[0].id);\n } else if (e.key === 'End') {\n e.preventDefault();\n const last = menus[menus.length - 1];\n setTabId(last.id);\n focusTrigger(last.id);\n }\n };\n\n const onPanelKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n closeAndFocusTrigger();\n } else if (e.key === 'Tab') {\n setOpenId(null);\n } else if (e.key === 'ArrowDown') {\n e.preventDefault();\n setActive((a) => Math.min(a + 1, enabledIdx.length - 1));\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setActive((a) => Math.max(a - 1, 0));\n } else if (e.key === 'Home') {\n e.preventDefault();\n setActive(0);\n } else if (e.key === 'End') {\n e.preventDefault();\n setActive(Math.max(enabledIdx.length - 1, 0));\n } else if (e.key === 'ArrowRight') {\n e.preventDefault();\n stepMenu(1);\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault();\n stepMenu(-1);\n } else if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n const realIdx = enabledIdx[active];\n const it = realIdx != null ? openMenu?.items[realIdx] : undefined;\n if (it) selectItem(it);\n }\n };\n\n return (\n <div ref={rootRef} role=\"menubar\" aria-label={ariaLabel} className={cx('menubar', className)}>\n {menus.map((menu, index) => {\n const isOpen = openId === menu.id;\n return (\n <div key={menu.id} className=\"menubar__menu\">\n <button\n type=\"button\"\n role=\"menuitem\"\n ref={(el) => { triggerRefs.current[menu.id] = el; }}\n tabIndex={(tabId ?? menus[0]?.id) === menu.id ? 0 : -1}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n className={cx('menubar__trigger', isOpen && 'is-open')}\n onClick={(e) => {\n if (isOpen) { setOpenId(null); return; }\n anchorRef.current = e.currentTarget;\n focusOnOpen.current = false;\n setActive(0);\n setTabId(menu.id);\n setOpenId(menu.id);\n }}\n onMouseEnter={(e) => {\n if (!openId) return;\n anchorRef.current = e.currentTarget;\n focusOnOpen.current = false;\n setActive(0);\n setTabId(menu.id);\n setOpenId(menu.id);\n }}\n onFocus={() => setTabId(menu.id)}\n onKeyDown={(e) => onTriggerKeyDown(e, menu, index)}\n >\n {menu.label}\n </button>\n {isOpen && (\n <Portal>\n <ul\n ref={panelRef}\n role=\"menu\"\n aria-label={typeof menu.label === 'string' ? menu.label : undefined}\n className=\"menubar__list\"\n onKeyDown={onPanelKeyDown}\n style={{\n position: 'fixed',\n top: pos.top,\n left: pos.left,\n visibility: pos.ready ? 'visible' : 'hidden',\n }}\n >\n {menu.items.map((item, i) =>\n item.separator ? (\n <li key={item.id} className=\"menubar__separator\" role=\"separator\" />\n ) : (\n <li key={item.id} role=\"none\">\n <button\n type=\"button\"\n role=\"menuitem\"\n ref={(el) => { itemRefs.current[i] = el; }}\n tabIndex={enabledIdx[active] === i ? 0 : -1}\n disabled={item.disabled}\n className={cx('menubar__item', item.disabled && 'is-disabled', enabledIdx[active] === i && 'is-active')}\n onMouseEnter={() => setActive(enabledIdx.indexOf(i))}\n onClick={() => selectItem(item)}\n >\n <span className=\"menubar__label\">{item.label}</span>\n {item.shortcut && <kbd className=\"menubar__shortcut\">{item.shortcut}</kbd>}\n </button>\n </li>\n )\n )}\n </ul>\n </Portal>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/Menubar.tsx"],"names":["React","usePopoverPosition","useDismiss","cx","jsxs","jsx","Portal"],"mappings":"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","file":"chunk-QMXU5WXD.js","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { Portal } from './Portal';\nimport { usePopoverPosition } from '../hooks/usePopoverPosition';\nimport { useDismiss } from '../hooks/useDismiss';\n\nexport interface MenubarItem {\n id: string;\n label?: React.ReactNode;\n onSelect?: () => void;\n disabled?: boolean;\n separator?: boolean;\n shortcut?: string;\n}\n\nexport interface MenubarMenu {\n id: string;\n label: React.ReactNode;\n items: MenubarItem[];\n}\n\nexport interface MenubarProps {\n menus: MenubarMenu[];\n className?: string;\n ariaLabel?: string;\n}\n\nexport function Menubar({ menus, className, ariaLabel = 'Barra de menús' }: MenubarProps) {\n const [openId, setOpenId] = React.useState<string | null>(null);\n const [active, setActive] = React.useState(0);\n // Roving tab stop for the menubar row (one tab stop, arrows move between\n // triggers — WAI-ARIA menubar pattern).\n const [tabId, setTabId] = React.useState<string | null>(menus[0]?.id ?? null);\n // Keyboard opens move focus into the menu; pointer opens don't.\n const focusOnOpen = React.useRef(false);\n const rootRef = React.useRef<HTMLDivElement>(null);\n const panelRef = React.useRef<HTMLUListElement>(null);\n const anchorRef = React.useRef<HTMLElement | null>(null);\n const triggerRefs = React.useRef<Record<string, HTMLButtonElement | null>>({});\n const itemRefs = React.useRef<Array<HTMLButtonElement | null>>([]);\n\n const open = openId !== null;\n const openMenu = menus.find((m) => m.id === openId) ?? null;\n const menuIndex = menus.findIndex((m) => m.id === openId);\n\n // Positions within the open menu that are selectable (no\n // separators/disabled). `active` indexes into this list.\n const enabledIdx = (openMenu?.items ?? [])\n .map((it, i) => (it.separator || it.disabled ? -1 : i))\n .filter((i) => i >= 0);\n\n const pos = usePopoverPosition(anchorRef, panelRef, {\n open,\n side: 'bottom',\n align: 'start',\n offset: 6,\n });\n\n useDismiss({\n open,\n onDismiss: () => setOpenId(null),\n refs: [rootRef, panelRef],\n closeOnEscape: false,\n });\n\n const focusTrigger = (id: string | null) => {\n if (id) triggerRefs.current[id]?.focus();\n };\n\n const openMenuById = (id: string, viaKeyboard: boolean) => {\n const el = triggerRefs.current[id];\n if (el) anchorRef.current = el;\n focusOnOpen.current = viaKeyboard;\n setActive(0);\n setTabId(id);\n setOpenId(id);\n };\n\n const closeAndFocusTrigger = () => {\n const id = openId;\n setOpenId(null);\n focusTrigger(id);\n };\n\n React.useEffect(() => {\n if (open && focusOnOpen.current) {\n focusOnOpen.current = false;\n const realIdx = enabledIdx[0];\n if (realIdx != null) itemRefs.current[realIdx]?.focus();\n }\n }, [open, enabledIdx]);\n\n React.useEffect(() => {\n if (!open || focusOnOpen.current) return;\n const realIdx = enabledIdx[active];\n if (realIdx != null) itemRefs.current[realIdx]?.focus();\n }, [open, active, enabledIdx]);\n\n const selectItem = (item: MenubarItem) => {\n if (item.disabled || item.separator) return;\n item.onSelect?.();\n closeAndFocusTrigger();\n };\n\n const stepMenu = (dir: 1 | -1) => {\n if (menus.length === 0) return;\n const from = menuIndex >= 0 ? menuIndex : 0;\n const next = (from + dir + menus.length) % menus.length;\n openMenuById(menus[next].id, true);\n };\n\n const onTriggerKeyDown = (e: React.KeyboardEvent, menu: MenubarMenu, index: number) => {\n if (e.key === 'ArrowDown' || e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n openMenuById(menu.id, true);\n } else if (e.key === 'ArrowRight') {\n e.preventDefault();\n const next = menus[(index + 1) % menus.length];\n setTabId(next.id);\n if (open) openMenuById(next.id, true);\n else focusTrigger(next.id);\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault();\n const prev = menus[(index - 1 + menus.length) % menus.length];\n setTabId(prev.id);\n if (open) openMenuById(prev.id, true);\n else focusTrigger(prev.id);\n } else if (e.key === 'Escape' && open) {\n e.preventDefault();\n setOpenId(null);\n } else if (e.key === 'Home') {\n e.preventDefault();\n setTabId(menus[0].id);\n focusTrigger(menus[0].id);\n } else if (e.key === 'End') {\n e.preventDefault();\n const last = menus[menus.length - 1];\n setTabId(last.id);\n focusTrigger(last.id);\n }\n };\n\n const onPanelKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n closeAndFocusTrigger();\n } else if (e.key === 'Tab') {\n setOpenId(null);\n } else if (e.key === 'ArrowDown') {\n e.preventDefault();\n setActive((a) => Math.min(a + 1, enabledIdx.length - 1));\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setActive((a) => Math.max(a - 1, 0));\n } else if (e.key === 'Home') {\n e.preventDefault();\n setActive(0);\n } else if (e.key === 'End') {\n e.preventDefault();\n setActive(Math.max(enabledIdx.length - 1, 0));\n } else if (e.key === 'ArrowRight') {\n e.preventDefault();\n stepMenu(1);\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault();\n stepMenu(-1);\n } else if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n const realIdx = enabledIdx[active];\n const it = realIdx != null ? openMenu?.items[realIdx] : undefined;\n if (it) selectItem(it);\n }\n };\n\n return (\n <div ref={rootRef} role=\"menubar\" aria-label={ariaLabel} className={cx('menubar', className)}>\n {menus.map((menu, index) => {\n const isOpen = openId === menu.id;\n return (\n <div key={menu.id} className=\"menubar__menu\">\n <button\n type=\"button\"\n role=\"menuitem\"\n ref={(el) => { triggerRefs.current[menu.id] = el; }}\n tabIndex={(tabId ?? menus[0]?.id) === menu.id ? 0 : -1}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n className={cx('menubar__trigger', isOpen && 'is-open')}\n onClick={(e) => {\n if (isOpen) { setOpenId(null); return; }\n anchorRef.current = e.currentTarget;\n focusOnOpen.current = false;\n setActive(0);\n setTabId(menu.id);\n setOpenId(menu.id);\n }}\n onMouseEnter={(e) => {\n if (!openId) return;\n anchorRef.current = e.currentTarget;\n focusOnOpen.current = false;\n setActive(0);\n setTabId(menu.id);\n setOpenId(menu.id);\n }}\n onFocus={() => setTabId(menu.id)}\n onKeyDown={(e) => onTriggerKeyDown(e, menu, index)}\n >\n {menu.label}\n </button>\n {isOpen && (\n <Portal>\n <ul\n ref={panelRef}\n role=\"menu\"\n aria-label={typeof menu.label === 'string' ? menu.label : undefined}\n className=\"menubar__list\"\n onKeyDown={onPanelKeyDown}\n style={{\n position: 'fixed',\n top: pos.top,\n left: pos.left,\n visibility: pos.ready ? 'visible' : 'hidden',\n }}\n >\n {menu.items.map((item, i) =>\n item.separator ? (\n <li key={item.id} className=\"menubar__separator\" role=\"separator\" />\n ) : (\n <li key={item.id} role=\"none\">\n <button\n type=\"button\"\n role=\"menuitem\"\n ref={(el) => { itemRefs.current[i] = el; }}\n tabIndex={enabledIdx[active] === i ? 0 : -1}\n disabled={item.disabled}\n className={cx('menubar__item', item.disabled && 'is-disabled', enabledIdx[active] === i && 'is-active')}\n onMouseEnter={() => setActive(enabledIdx.indexOf(i))}\n onClick={() => selectItem(item)}\n >\n <span className=\"menubar__label\">{item.label}</span>\n {item.shortcut && <kbd className=\"menubar__shortcut\">{item.shortcut}</kbd>}\n </button>\n </li>\n )\n )}\n </ul>\n </Portal>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  'use client';
2
- import { getBrand } from './chunk-5GEWIK4T.mjs';
3
2
  import { cx } from './chunk-IEPCH3JB.mjs';
3
+ import { getBrand } from './chunk-5GEWIK4T.mjs';
4
4
  import * as React from 'react';
5
5
  import { jsxs, jsx } from 'react/jsx-runtime';
6
6
 
@@ -61,5 +61,5 @@ var Logo = React.forwardRef(function Logo2({
61
61
  });
62
62
 
63
63
  export { Logo };
64
- //# sourceMappingURL=chunk-JMFDIN5R.mjs.map
65
- //# sourceMappingURL=chunk-JMFDIN5R.mjs.map
64
+ //# sourceMappingURL=chunk-QR6X2UOT.mjs.map
65
+ //# sourceMappingURL=chunk-QR6X2UOT.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Logo.tsx"],"names":["Logo"],"mappings":";;;;;AASA,IAAM,gBAAA,GAAoD;AAAA,EACxD,UAAA,EAAY,KAAA;AAAA,EACZ,QAAA,EAAU,KAAA;AAAA,EACV,IAAA,EAAM,KAAA;AAAA,EACN,QAAA,EAAU;AACZ,CAAA;AAGA,IAAM,cAAA,GAA8C;AAAA,EAClD,UAAA,EAAY,EAAA;AAAA,EACZ,QAAA,EAAU,EAAA;AAAA,EACV,IAAA,EAAM,EAAA;AAAA,EACN,QAAA,EAAU;AACZ,CAAA;AAEA,SAAS,SAAA,CACP,OAAA,EACA,EAAA,EACA,MAAA,EACA,QAAA,EACA;AACA,EAAA,MAAM,MAAA,GAAS,OAAA,KAAY,YAAA,IAAgB,OAAA,KAAY,aAAa,OAAA,GAAU,EAAA;AAC9E,EAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,MAAM,GAAG,OAAO,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AACxD;AAiCO,IAAM,IAAA,GAAa,KAAA,CAAA,UAAA,CAAwC,SAASA,KAAAA,CACzE;AAAA,EACE,OAAA,GAAU,MAAA;AAAA,EACV,EAAA,GAAK,OAAA;AAAA,EACL,MAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,GAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EACA,GAAA,EACA;AACA,EAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,EAAA,MAAM,gBAAA,GAAmB,YAAY,KAAA,CAAM,YAAA;AAC3C,EAAA,MAAM,iBAAA,GAAoB,aAAa,KAAA,CAAM,IAAA;AAC7C,EAAA,MAAM,GAAA,GAAM,MAAA,IAAU,gBAAA,CAAiB,OAAO,CAAA;AAC9C,EAAA,MAAM,CAAA,GAAI,MAAA,IAAU,cAAA,CAAe,OAAO,CAAA;AAC1C,EAAA,MAAM,IAAI,GAAA,IAAO,iBAAA;AACjB,EAAA,MAAM,UAAA,GAAa,SAAA,CAAU,OAAA,EAAS,EAAA,EAAI,KAAK,gBAAgB,CAAA;AAE/D,EAAA,IAAI,UAAA,IAAc,YAAY,MAAA,EAAQ;AACpC,IAAA,MAAM,SAAA,GAAY,UAAU,gBAAA,CAAiB,IAAA;AAC7C,IAAA,MAAM,SAAA,GAAY,SAAA,CAAU,MAAA,EAAQ,EAAA,EAAI,WAAW,gBAAgB,CAAA;AACnE,IAAA,4BACG,SAAA,EAAA,EAAQ,SAAA,EAAW,EAAA,CAAG,MAAA,EAAQ,SAAS,CAAA,EACtC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,oBAAA,EAAqB,MAAA,EAAQ,UAAA,EAAY,CAAA;AAAA,sBACvD,GAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,GAAA,EAAK,SAAA,EAAW,KAAK,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAI,GAAG,IAAA,EAAM;AAAA,KAAA,EAC9D,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,GAAA,EAAK,UAAA;AAAA,MACL,GAAA,EAAK,CAAA;AAAA,MACL,MAAA,EAAQ,CAAA;AAAA,MACR,SAAA,EAAW,EAAA,CAAG,MAAA,EAAQ,SAAS,CAAA;AAAA,MAC9B,GAAG;AAAA;AAAA,GACN;AAEJ,CAAC","file":"chunk-JMFDIN5R.mjs","sourcesContent":["import * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { getBrand } from '../brand';\n\nexport type LogoVariant = 'horizontal' | 'vertical' | 'mark' | 'wordmark';\nexport type LogoBg = 'light' | 'dark';\nexport type LogoFormat = 'svg' | 'png';\n\n/** Formato preferido por variante. SVG en todas las variantes (mejor escalado y peso). */\nconst PREFERRED_FORMAT: Record<LogoVariant, LogoFormat> = {\n horizontal: 'svg',\n vertical: 'svg',\n mark: 'svg',\n wordmark: 'svg',\n};\n\n/** Altura razonable por defecto según la forma de la variante. */\nconst DEFAULT_HEIGHT: Record<LogoVariant, number> = {\n horizontal: 32,\n vertical: 64,\n mark: 32,\n wordmark: 28,\n};\n\nfunction buildPath(\n variant: LogoVariant,\n bg: LogoBg,\n format: LogoFormat,\n basePath: string\n) {\n const prefix = variant === 'horizontal' || variant === 'vertical' ? 'logo-' : '';\n return `${basePath}/${prefix}${variant}-${bg}.${format}`;\n}\n\nexport interface LogoProps extends Omit<React.ImgHTMLAttributes<HTMLImageElement>, 'src'> {\n /** Forma del logo. Default: `mark` (isotipo). */\n variant?: LogoVariant;\n /** Color del fondo donde se va a pintar. Define si usar la versión normal o invertida. Default: `light`. */\n bg?: LogoBg;\n /** Forza el formato (svg|png). Por defecto se usa el preferido por variante. */\n format?: LogoFormat;\n /**\n * Si `true`, usa `mark` en mobile (<768px) y `variant` en desktop.\n * Útil para AppShell / topbars / headers que se vuelven angostos.\n */\n responsive?: boolean;\n /** Base URL donde están los assets. Default desde `getBrand().logoBasePath`. */\n basePath?: string;\n /** Altura en px. Default depende de la variante (mark: 32, horizontal: 32, vertical: 64, wordmark: 28). */\n height?: number;\n /** Texto alternativo (a11y). Default: el `brandName`. */\n alt?: string;\n /** Nombre de la marca; fallback de `alt`. Default desde `getBrand().name`. */\n brandName?: string;\n}\n\n/**\n * Componente Logo unificado para todas las variantes (horizontal, vertical, mark, wordmark)\n * con soporte responsive (`mark` en mobile, variante elegida en desktop).\n *\n * @example\n * <Logo variant=\"horizontal\" bg=\"light\" />\n * <Logo responsive variant=\"horizontal\" bg=\"light\" /> // mark en mobile, horizontal en desktop\n * <Logo variant=\"mark\" bg=\"dark\" height={48} />\n */\nexport const Logo = React.forwardRef<HTMLImageElement, LogoProps>(function Logo(\n {\n variant = 'mark',\n bg = 'light',\n format,\n responsive,\n basePath,\n height,\n alt,\n brandName,\n className,\n ...rest\n },\n ref\n) {\n const brand = getBrand();\n const resolvedBasePath = basePath ?? brand.logoBasePath;\n const resolvedBrandName = brandName ?? brand.name;\n const fmt = format ?? PREFERRED_FORMAT[variant];\n const h = height ?? DEFAULT_HEIGHT[variant];\n const a = alt ?? resolvedBrandName;\n const desktopSrc = buildPath(variant, bg, fmt, resolvedBasePath);\n\n if (responsive && variant !== 'mark') {\n const mobileFmt = format ?? PREFERRED_FORMAT.mark;\n const mobileSrc = buildPath('mark', bg, mobileFmt, resolvedBasePath);\n return (\n <picture className={cx('logo', className)}>\n <source media=\"(min-width: 768px)\" srcSet={desktopSrc} />\n <img ref={ref} src={mobileSrc} alt={a} height={h} {...rest} />\n </picture>\n );\n }\n\n return (\n <img\n ref={ref}\n src={desktopSrc}\n alt={a}\n height={h}\n className={cx('logo', className)}\n {...rest}\n />\n );\n});\n"]}
1
+ {"version":3,"sources":["../src/components/Logo.tsx"],"names":["Logo"],"mappings":";;;;;AASA,IAAM,gBAAA,GAAoD;AAAA,EACxD,UAAA,EAAY,KAAA;AAAA,EACZ,QAAA,EAAU,KAAA;AAAA,EACV,IAAA,EAAM,KAAA;AAAA,EACN,QAAA,EAAU;AACZ,CAAA;AAGA,IAAM,cAAA,GAA8C;AAAA,EAClD,UAAA,EAAY,EAAA;AAAA,EACZ,QAAA,EAAU,EAAA;AAAA,EACV,IAAA,EAAM,EAAA;AAAA,EACN,QAAA,EAAU;AACZ,CAAA;AAEA,SAAS,SAAA,CACP,OAAA,EACA,EAAA,EACA,MAAA,EACA,QAAA,EACA;AACA,EAAA,MAAM,MAAA,GAAS,OAAA,KAAY,YAAA,IAAgB,OAAA,KAAY,aAAa,OAAA,GAAU,EAAA;AAC9E,EAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,MAAM,GAAG,OAAO,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AACxD;AAiCO,IAAM,IAAA,GAAa,KAAA,CAAA,UAAA,CAAwC,SAASA,KAAAA,CACzE;AAAA,EACE,OAAA,GAAU,MAAA;AAAA,EACV,EAAA,GAAK,OAAA;AAAA,EACL,MAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,GAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EACA,GAAA,EACA;AACA,EAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,EAAA,MAAM,gBAAA,GAAmB,YAAY,KAAA,CAAM,YAAA;AAC3C,EAAA,MAAM,iBAAA,GAAoB,aAAa,KAAA,CAAM,IAAA;AAC7C,EAAA,MAAM,GAAA,GAAM,MAAA,IAAU,gBAAA,CAAiB,OAAO,CAAA;AAC9C,EAAA,MAAM,CAAA,GAAI,MAAA,IAAU,cAAA,CAAe,OAAO,CAAA;AAC1C,EAAA,MAAM,IAAI,GAAA,IAAO,iBAAA;AACjB,EAAA,MAAM,UAAA,GAAa,SAAA,CAAU,OAAA,EAAS,EAAA,EAAI,KAAK,gBAAgB,CAAA;AAE/D,EAAA,IAAI,UAAA,IAAc,YAAY,MAAA,EAAQ;AACpC,IAAA,MAAM,SAAA,GAAY,UAAU,gBAAA,CAAiB,IAAA;AAC7C,IAAA,MAAM,SAAA,GAAY,SAAA,CAAU,MAAA,EAAQ,EAAA,EAAI,WAAW,gBAAgB,CAAA;AACnE,IAAA,4BACG,SAAA,EAAA,EAAQ,SAAA,EAAW,EAAA,CAAG,MAAA,EAAQ,SAAS,CAAA,EACtC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,oBAAA,EAAqB,MAAA,EAAQ,UAAA,EAAY,CAAA;AAAA,sBACvD,GAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,GAAA,EAAK,SAAA,EAAW,KAAK,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAI,GAAG,IAAA,EAAM;AAAA,KAAA,EAC9D,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,GAAA,EAAK,UAAA;AAAA,MACL,GAAA,EAAK,CAAA;AAAA,MACL,MAAA,EAAQ,CAAA;AAAA,MACR,SAAA,EAAW,EAAA,CAAG,MAAA,EAAQ,SAAS,CAAA;AAAA,MAC9B,GAAG;AAAA;AAAA,GACN;AAEJ,CAAC","file":"chunk-QR6X2UOT.mjs","sourcesContent":["import * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { getBrand } from '../brand';\n\nexport type LogoVariant = 'horizontal' | 'vertical' | 'mark' | 'wordmark';\nexport type LogoBg = 'light' | 'dark';\nexport type LogoFormat = 'svg' | 'png';\n\n/** Formato preferido por variante. SVG en todas las variantes (mejor escalado y peso). */\nconst PREFERRED_FORMAT: Record<LogoVariant, LogoFormat> = {\n horizontal: 'svg',\n vertical: 'svg',\n mark: 'svg',\n wordmark: 'svg',\n};\n\n/** Altura razonable por defecto según la forma de la variante. */\nconst DEFAULT_HEIGHT: Record<LogoVariant, number> = {\n horizontal: 32,\n vertical: 64,\n mark: 32,\n wordmark: 28,\n};\n\nfunction buildPath(\n variant: LogoVariant,\n bg: LogoBg,\n format: LogoFormat,\n basePath: string\n) {\n const prefix = variant === 'horizontal' || variant === 'vertical' ? 'logo-' : '';\n return `${basePath}/${prefix}${variant}-${bg}.${format}`;\n}\n\nexport interface LogoProps extends Omit<React.ImgHTMLAttributes<HTMLImageElement>, 'src'> {\n /** Forma del logo. Default: `mark` (isotipo). */\n variant?: LogoVariant;\n /** Color del fondo donde se va a pintar. Define si usar la versión normal o invertida. Default: `light`. */\n bg?: LogoBg;\n /** Forza el formato (svg|png). Por defecto se usa el preferido por variante. */\n format?: LogoFormat;\n /**\n * Si `true`, usa `mark` en mobile (<768px) y `variant` en desktop.\n * Útil para AppShell / topbars / headers que se vuelven angostos.\n */\n responsive?: boolean;\n /** Base URL donde están los assets. Default desde `getBrand().logoBasePath`. */\n basePath?: string;\n /** Altura en px. Default depende de la variante (mark: 32, horizontal: 32, vertical: 64, wordmark: 28). */\n height?: number;\n /** Texto alternativo (a11y). Default: el `brandName`. */\n alt?: string;\n /** Nombre de la marca; fallback de `alt`. Default desde `getBrand().name`. */\n brandName?: string;\n}\n\n/**\n * Componente Logo unificado para todas las variantes (horizontal, vertical, mark, wordmark)\n * con soporte responsive (`mark` en mobile, variante elegida en desktop).\n *\n * @example\n * <Logo variant=\"horizontal\" bg=\"light\" />\n * <Logo responsive variant=\"horizontal\" bg=\"light\" /> // mark en mobile, horizontal en desktop\n * <Logo variant=\"mark\" bg=\"dark\" height={48} />\n */\nexport const Logo = React.forwardRef<HTMLImageElement, LogoProps>(function Logo(\n {\n variant = 'mark',\n bg = 'light',\n format,\n responsive,\n basePath,\n height,\n alt,\n brandName,\n className,\n ...rest\n },\n ref\n) {\n const brand = getBrand();\n const resolvedBasePath = basePath ?? brand.logoBasePath;\n const resolvedBrandName = brandName ?? brand.name;\n const fmt = format ?? PREFERRED_FORMAT[variant];\n const h = height ?? DEFAULT_HEIGHT[variant];\n const a = alt ?? resolvedBrandName;\n const desktopSrc = buildPath(variant, bg, fmt, resolvedBasePath);\n\n if (responsive && variant !== 'mark') {\n const mobileFmt = format ?? PREFERRED_FORMAT.mark;\n const mobileSrc = buildPath('mark', bg, mobileFmt, resolvedBasePath);\n return (\n <picture className={cx('logo', className)}>\n <source media=\"(min-width: 768px)\" srcSet={desktopSrc} />\n <img ref={ref} src={mobileSrc} alt={a} height={h} {...rest} />\n </picture>\n );\n }\n\n return (\n <img\n ref={ref}\n src={desktopSrc}\n alt={a}\n height={h}\n className={cx('logo', className)}\n {...rest}\n />\n );\n});\n"]}
@@ -1,12 +1,12 @@
1
1
  'use client';
2
2
  import { resolveDateFormat, startOfMonth, buildMonthGrid6, formatDate, dateFormatPlaceholder, addMonths, parseDate, isSameDay } from './chunk-ODE2ROR2.mjs';
3
- import { format } from './chunk-IGNKSI2E.mjs';
4
3
  import { Portal } from './chunk-FKBQYQQD.mjs';
4
+ import { format } from './chunk-IGNKSI2E.mjs';
5
5
  import { useLocale } from './chunk-OOIRRKJ7.mjs';
6
- import { useDismiss } from './chunk-6P2TKRTL.mjs';
7
- import { usePopoverPosition } from './chunk-5XT2LX3I.mjs';
8
6
  import { X, Check, CalendarIcon, ChevronLeft, ChevronDown, ChevronRight, Search } from './chunk-BJGMROKL.mjs';
9
7
  import { cx } from './chunk-IEPCH3JB.mjs';
8
+ import { usePopoverPosition } from './chunk-5XT2LX3I.mjs';
9
+ import { useDismiss } from './chunk-6P2TKRTL.mjs';
10
10
  import * as React from 'react';
11
11
  import { jsxs, jsx } from 'react/jsx-runtime';
12
12
 
@@ -714,5 +714,5 @@ function useCommandPalette({ hotkey = "mod+k" } = {}) {
714
714
  }
715
715
 
716
716
  export { CommandPalette, DateRangePicker, MultiCombobox, dateRangePresets, useCommandPalette };
717
- //# sourceMappingURL=chunk-TJ5LRNVT.mjs.map
718
- //# sourceMappingURL=chunk-TJ5LRNVT.mjs.map
717
+ //# sourceMappingURL=chunk-RCE35UCX.mjs.map
718
+ //# sourceMappingURL=chunk-RCE35UCX.mjs.map