@misael703/ui 1.0.1 → 1.2.0

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 (178) hide show
  1. package/dist/chunk-2S6JJYN7.js +209 -0
  2. package/dist/chunk-2S6JJYN7.js.map +1 -0
  3. package/dist/{chunk-GDFYAUHT.mjs → chunk-3N4IBCLW.mjs} +11 -29
  4. package/dist/chunk-3N4IBCLW.mjs.map +1 -0
  5. package/dist/{chunk-TB6EHWRF.mjs → chunk-3OVWAAGP.mjs} +3 -3
  6. package/dist/{chunk-TB6EHWRF.mjs.map → chunk-3OVWAAGP.mjs.map} +1 -1
  7. package/dist/chunk-427NHGTX.js +4 -0
  8. package/dist/chunk-427NHGTX.js.map +1 -0
  9. package/dist/chunk-6P2TKRTL.mjs +45 -0
  10. package/dist/chunk-6P2TKRTL.mjs.map +1 -0
  11. package/dist/chunk-6RVCYULF.mjs +78 -0
  12. package/dist/chunk-6RVCYULF.mjs.map +1 -0
  13. package/dist/chunk-BVQRDAR7.mjs +3 -0
  14. package/dist/chunk-BVQRDAR7.mjs.map +1 -0
  15. package/dist/{chunk-TXKFCVCN.mjs → chunk-C35GKQJO.mjs} +3 -3
  16. package/dist/{chunk-TXKFCVCN.mjs.map → chunk-C35GKQJO.mjs.map} +1 -1
  17. package/dist/chunk-DPMUWQHL.js +95 -0
  18. package/dist/chunk-DPMUWQHL.js.map +1 -0
  19. package/dist/chunk-GIOMV3J7.js +48 -0
  20. package/dist/chunk-GIOMV3J7.js.map +1 -0
  21. package/dist/chunk-GLYGO7WX.js +13 -0
  22. package/dist/chunk-GLYGO7WX.js.map +1 -0
  23. package/dist/chunk-H3PRT76O.mjs +73 -0
  24. package/dist/chunk-H3PRT76O.mjs.map +1 -0
  25. package/dist/{chunk-Z4GRQHIG.mjs → chunk-IEJXZ67E.mjs} +3 -3
  26. package/dist/{chunk-Z4GRQHIG.mjs.map → chunk-IEJXZ67E.mjs.map} +1 -1
  27. package/dist/chunk-IMHLJKYR.mjs +176 -0
  28. package/dist/chunk-IMHLJKYR.mjs.map +1 -0
  29. package/dist/{chunk-EJJDJJEM.js → chunk-K5S3SV2U.js} +108 -106
  30. package/dist/chunk-K5S3SV2U.js.map +1 -0
  31. package/dist/{chunk-ADIKHOEG.js → chunk-KOIRRZRD.js} +72 -6
  32. package/dist/chunk-KOIRRZRD.js.map +1 -0
  33. package/dist/{chunk-ZXSSOEIM.js → chunk-LXNHGGAK.js} +4 -4
  34. package/dist/{chunk-ZXSSOEIM.js.map → chunk-LXNHGGAK.js.map} +1 -1
  35. package/dist/{chunk-HI3JT6SI.mjs → chunk-MM7VE7YN.mjs} +72 -6
  36. package/dist/chunk-MM7VE7YN.mjs.map +1 -0
  37. package/dist/chunk-MUL2FKYF.js +100 -0
  38. package/dist/chunk-MUL2FKYF.js.map +1 -0
  39. package/dist/chunk-N2Y2KWX5.mjs +216 -0
  40. package/dist/chunk-N2Y2KWX5.mjs.map +1 -0
  41. package/dist/{chunk-CVXS7IHA.js → chunk-N7LFCAAY.js} +112 -113
  42. package/dist/chunk-N7LFCAAY.js.map +1 -0
  43. package/dist/chunk-OCLBAGNF.mjs +184 -0
  44. package/dist/chunk-OCLBAGNF.mjs.map +1 -0
  45. package/dist/{chunk-QSCJ2CER.mjs → chunk-OHCS5CYV.mjs} +108 -106
  46. package/dist/chunk-OHCS5CYV.mjs.map +1 -0
  47. package/dist/{chunk-LUXTZOTJ.js → chunk-OHMFYAB2.js} +4 -4
  48. package/dist/{chunk-LUXTZOTJ.js.map → chunk-OHMFYAB2.js.map} +1 -1
  49. package/dist/{chunk-T4R2LSRL.js → chunk-PROKTOL7.js} +3 -2
  50. package/dist/chunk-PROKTOL7.js.map +1 -0
  51. package/dist/{chunk-3UHX7ITQ.mjs → chunk-QI4JT3V3.mjs} +29 -34
  52. package/dist/chunk-QI4JT3V3.mjs.map +1 -0
  53. package/dist/{chunk-Z3FAKG3E.mjs → chunk-QW2CSXPH.mjs} +3 -2
  54. package/dist/chunk-QW2CSXPH.mjs.map +1 -0
  55. package/dist/chunk-QX5GGPV5.mjs +11 -0
  56. package/dist/chunk-QX5GGPV5.mjs.map +1 -0
  57. package/dist/{chunk-2RVSLQEA.mjs → chunk-R76SJURE.mjs} +3 -3
  58. package/dist/{chunk-2RVSLQEA.mjs.map → chunk-R76SJURE.mjs.map} +1 -1
  59. package/dist/{chunk-E2XOUDAH.js → chunk-REL2RZTI.js} +14 -32
  60. package/dist/chunk-REL2RZTI.js.map +1 -0
  61. package/dist/{chunk-R76YER7O.js → chunk-TBAKKSAN.js} +4 -4
  62. package/dist/{chunk-R76YER7O.js.map → chunk-TBAKKSAN.js.map} +1 -1
  63. package/dist/chunk-V7MK42GX.js +238 -0
  64. package/dist/chunk-V7MK42GX.js.map +1 -0
  65. package/dist/chunk-VR4OXVKE.js +198 -0
  66. package/dist/chunk-VR4OXVKE.js.map +1 -0
  67. package/dist/chunk-WLDQP4KD.mjs +75 -0
  68. package/dist/chunk-WLDQP4KD.mjs.map +1 -0
  69. package/dist/{chunk-W6YOBPL5.js → chunk-WVN5JJVV.js} +27 -40
  70. package/dist/chunk-WVN5JJVV.js.map +1 -0
  71. package/dist/chunk-XMLBKK7X.js +67 -0
  72. package/dist/chunk-XMLBKK7X.js.map +1 -0
  73. package/dist/chunk-XXUSZD5I.mjs +26 -0
  74. package/dist/chunk-XXUSZD5I.mjs.map +1 -0
  75. package/dist/{chunk-IIYQO6BL.js → chunk-YAORRBMU.js} +29 -34
  76. package/dist/chunk-YAORRBMU.js.map +1 -0
  77. package/dist/{chunk-AAQ7KUZH.mjs → chunk-YFLVB62R.mjs} +112 -113
  78. package/dist/chunk-YFLVB62R.mjs.map +1 -0
  79. package/dist/{chunk-UIKCTWKG.js → chunk-YRACSKAT.js} +4 -4
  80. package/dist/{chunk-UIKCTWKG.js.map → chunk-YRACSKAT.js.map} +1 -1
  81. package/dist/components/AdvancedPickers.js +8 -5
  82. package/dist/components/AdvancedPickers.mjs +4 -1
  83. package/dist/components/AppShell.js +3 -3
  84. package/dist/components/AppShell.mjs +1 -1
  85. package/dist/components/Comments.js +8 -5
  86. package/dist/components/Comments.mjs +5 -2
  87. package/dist/components/Commerce.js +14 -13
  88. package/dist/components/Commerce.mjs +3 -2
  89. package/dist/components/ContextMenu.js +5 -2
  90. package/dist/components/ContextMenu.mjs +4 -1
  91. package/dist/components/Display2.js +8 -5
  92. package/dist/components/Display2.mjs +4 -1
  93. package/dist/components/Display3.js +11 -8
  94. package/dist/components/Display3.mjs +5 -2
  95. package/dist/components/Editing.js +8 -7
  96. package/dist/components/Editing.mjs +3 -2
  97. package/dist/components/HoverCard.js +4 -2
  98. package/dist/components/HoverCard.mjs +3 -1
  99. package/dist/components/Layout.js +20 -18
  100. package/dist/components/Layout.mjs +3 -1
  101. package/dist/components/Menubar.js +5 -2
  102. package/dist/components/Menubar.mjs +4 -1
  103. package/dist/components/NavigationMenu.js +5 -2
  104. package/dist/components/NavigationMenu.mjs +4 -1
  105. package/dist/components/Overlay.js +4 -3
  106. package/dist/components/Overlay.mjs +2 -1
  107. package/dist/components/Pickers.js +7 -4
  108. package/dist/components/Pickers.mjs +4 -1
  109. package/dist/components/Popover.js +5 -2
  110. package/dist/components/Popover.mjs +4 -1
  111. package/dist/components/Portal.d.mts +30 -0
  112. package/dist/components/Portal.d.ts +30 -0
  113. package/dist/components/Portal.js +12 -0
  114. package/dist/components/Portal.js.map +1 -0
  115. package/dist/components/Portal.mjs +3 -0
  116. package/dist/components/Portal.mjs.map +1 -0
  117. package/dist/hooks/index.d.mts +4 -0
  118. package/dist/hooks/index.d.ts +4 -0
  119. package/dist/hooks/index.js +23 -0
  120. package/dist/hooks/index.js.map +1 -0
  121. package/dist/hooks/index.mjs +6 -0
  122. package/dist/hooks/index.mjs.map +1 -0
  123. package/dist/hooks/useDelayedUnmount.d.mts +22 -0
  124. package/dist/hooks/useDelayedUnmount.d.ts +22 -0
  125. package/dist/hooks/useDelayedUnmount.js +12 -0
  126. package/dist/hooks/useDelayedUnmount.js.map +1 -0
  127. package/dist/hooks/useDelayedUnmount.mjs +3 -0
  128. package/dist/hooks/useDelayedUnmount.mjs.map +1 -0
  129. package/dist/hooks/useDismiss.d.mts +23 -0
  130. package/dist/hooks/useDismiss.d.ts +23 -0
  131. package/dist/hooks/useDismiss.js +12 -0
  132. package/dist/hooks/useDismiss.js.map +1 -0
  133. package/dist/hooks/useDismiss.mjs +3 -0
  134. package/dist/hooks/useDismiss.mjs.map +1 -0
  135. package/dist/hooks/usePopoverPosition.d.mts +50 -0
  136. package/dist/hooks/usePopoverPosition.d.ts +50 -0
  137. package/dist/hooks/usePopoverPosition.js +12 -0
  138. package/dist/hooks/usePopoverPosition.js.map +1 -0
  139. package/dist/hooks/usePopoverPosition.mjs +3 -0
  140. package/dist/hooks/usePopoverPosition.mjs.map +1 -0
  141. package/dist/index.d.mts +4 -1
  142. package/dist/index.d.ts +4 -1
  143. package/dist/index.js +95 -78
  144. package/dist/index.mjs +21 -16
  145. package/dist/styles.css +1 -1
  146. package/dist/tokens.css +1 -1
  147. package/package.json +1 -1
  148. package/dist/chunk-3UHX7ITQ.mjs.map +0 -1
  149. package/dist/chunk-5VMZMDJF.js +0 -145
  150. package/dist/chunk-5VMZMDJF.js.map +0 -1
  151. package/dist/chunk-7AKN7FDA.mjs +0 -103
  152. package/dist/chunk-7AKN7FDA.mjs.map +0 -1
  153. package/dist/chunk-AAQ7KUZH.mjs.map +0 -1
  154. package/dist/chunk-ADIKHOEG.js.map +0 -1
  155. package/dist/chunk-CVXS7IHA.js.map +0 -1
  156. package/dist/chunk-E2XOUDAH.js.map +0 -1
  157. package/dist/chunk-EJJDJJEM.js.map +0 -1
  158. package/dist/chunk-GDFYAUHT.mjs.map +0 -1
  159. package/dist/chunk-HI3JT6SI.mjs.map +0 -1
  160. package/dist/chunk-HPFJ2A24.js +0 -125
  161. package/dist/chunk-HPFJ2A24.js.map +0 -1
  162. package/dist/chunk-IIYQO6BL.js.map +0 -1
  163. package/dist/chunk-JDOXRLZW.js +0 -138
  164. package/dist/chunk-JDOXRLZW.js.map +0 -1
  165. package/dist/chunk-NLCKWF3Y.mjs +0 -88
  166. package/dist/chunk-NLCKWF3Y.mjs.map +0 -1
  167. package/dist/chunk-NUURPO3J.mjs +0 -120
  168. package/dist/chunk-NUURPO3J.mjs.map +0 -1
  169. package/dist/chunk-OCE4ODTM.mjs +0 -116
  170. package/dist/chunk-OCE4ODTM.mjs.map +0 -1
  171. package/dist/chunk-QI6TVWWF.js +0 -121
  172. package/dist/chunk-QI6TVWWF.js.map +0 -1
  173. package/dist/chunk-QSCJ2CER.mjs.map +0 -1
  174. package/dist/chunk-T4R2LSRL.js.map +0 -1
  175. package/dist/chunk-W6YOBPL5.js.map +0 -1
  176. package/dist/chunk-YBOTLQ3G.mjs +0 -99
  177. package/dist/chunk-YBOTLQ3G.mjs.map +0 -1
  178. package/dist/chunk-Z3FAKG3E.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Commerce.tsx"],"names":[],"mappings":"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","file":"chunk-TXKFCVCN.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-C35GKQJO.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"]}
@@ -0,0 +1,95 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+
5
+ function _interopNamespace(e) {
6
+ if (e && e.__esModule) return e;
7
+ var n = Object.create(null);
8
+ if (e) {
9
+ Object.keys(e).forEach(function (k) {
10
+ if (k !== 'default') {
11
+ var d = Object.getOwnPropertyDescriptor(e, k);
12
+ Object.defineProperty(n, k, d.get ? d : {
13
+ enumerable: true,
14
+ get: function () { return e[k]; }
15
+ });
16
+ }
17
+ });
18
+ }
19
+ n.default = e;
20
+ return Object.freeze(n);
21
+ }
22
+
23
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
24
+
25
+ // src/hooks/usePopoverPosition.ts
26
+ var GUTTER = 8;
27
+ function usePopoverPosition(anchorRef, contentRef, { open, side = "bottom", align = "center", offset = 8, matchAnchorWidth = false }) {
28
+ const [pos, setPos] = React__namespace.useState({
29
+ top: 0,
30
+ left: 0,
31
+ side,
32
+ ready: false
33
+ });
34
+ const compute = React__namespace.useCallback(() => {
35
+ const anchorEl = anchorRef.current;
36
+ const contentEl = contentRef.current;
37
+ if (!anchorEl || !contentEl || typeof window === "undefined") return;
38
+ const a = anchorEl.getBoundingClientRect();
39
+ const c = contentEl.getBoundingClientRect();
40
+ const vw = window.innerWidth;
41
+ const vh = window.innerHeight;
42
+ let chosen = side;
43
+ if (side === "bottom" && a.bottom + offset + c.height > vh && a.top - offset - c.height >= 0) {
44
+ chosen = "top";
45
+ } else if (side === "top" && a.top - offset - c.height < 0 && a.bottom + offset + c.height <= vh) {
46
+ chosen = "bottom";
47
+ } else if (side === "right" && a.right + offset + c.width > vw && a.left - offset - c.width >= 0) {
48
+ chosen = "left";
49
+ } else if (side === "left" && a.left - offset - c.width < 0 && a.right + offset + c.width <= vw) {
50
+ chosen = "right";
51
+ }
52
+ let top = 0;
53
+ let left = 0;
54
+ if (chosen === "bottom" || chosen === "top") {
55
+ top = chosen === "bottom" ? a.bottom + offset : a.top - c.height - offset;
56
+ left = align === "start" ? a.left : align === "end" ? a.right - c.width : a.left + (a.width - c.width) / 2;
57
+ } else {
58
+ left = chosen === "right" ? a.right + offset : a.left - c.width - offset;
59
+ top = align === "start" ? a.top : align === "end" ? a.bottom - c.height : a.top + (a.height - c.height) / 2;
60
+ }
61
+ left = Math.max(GUTTER, Math.min(left, vw - c.width - GUTTER));
62
+ top = Math.max(GUTTER, Math.min(top, vh - c.height - GUTTER));
63
+ setPos({
64
+ top: top + window.scrollY,
65
+ left: left + window.scrollX,
66
+ side: chosen,
67
+ ready: true,
68
+ width: matchAnchorWidth ? a.width : void 0
69
+ });
70
+ }, [anchorRef, contentRef, side, align, offset, matchAnchorWidth]);
71
+ React__namespace.useEffect(() => {
72
+ if (!open) {
73
+ setPos((p) => p.ready ? { ...p, ready: false } : p);
74
+ return;
75
+ }
76
+ compute();
77
+ let raf = 0;
78
+ const schedule = () => {
79
+ cancelAnimationFrame(raf);
80
+ raf = requestAnimationFrame(compute);
81
+ };
82
+ window.addEventListener("scroll", schedule, { capture: true, passive: true });
83
+ window.addEventListener("resize", schedule, { passive: true });
84
+ return () => {
85
+ cancelAnimationFrame(raf);
86
+ window.removeEventListener("scroll", schedule, { capture: true });
87
+ window.removeEventListener("resize", schedule);
88
+ };
89
+ }, [open, compute]);
90
+ return pos;
91
+ }
92
+
93
+ exports.usePopoverPosition = usePopoverPosition;
94
+ //# sourceMappingURL=chunk-DPMUWQHL.js.map
95
+ //# sourceMappingURL=chunk-DPMUWQHL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/usePopoverPosition.ts"],"names":["React"],"mappings":"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","file":"chunk-DPMUWQHL.js","sourcesContent":["import * as React from 'react';\n\nexport type PopoverSide = 'top' | 'bottom' | 'left' | 'right';\nexport type PopoverAlign = 'start' | 'center' | 'end';\n\n/** Anything that can report its viewport rect: a DOM element or a virtual\n * anchor (e.g. a point under the cursor for a context menu). */\nexport interface VirtualElement {\n getBoundingClientRect: () => DOMRect;\n}\n\nexport interface UsePopoverPositionOptions {\n open: boolean;\n side?: PopoverSide;\n align?: PopoverAlign;\n offset?: number;\n /** Expose the anchor's width so the consumer can match it (comboboxes). */\n matchAnchorWidth?: boolean;\n}\n\nexport interface PopoverPosition {\n /** Document-relative coords (use with `position: absolute` in a body portal). */\n top: number;\n left: number;\n /** Side actually used after flipping; useful for arrow/animation origin. */\n side: PopoverSide;\n /** False until the first measure. Keep content `visibility: hidden` until true. */\n ready: boolean;\n /** Anchor width, only when `matchAnchorWidth` is set. */\n width?: number;\n}\n\nconst GUTTER = 8;\n\n/**\n * Positions a floating panel relative to an anchor, for panels portaled to\n * `document.body`. Computes document-relative coords from\n * `getBoundingClientRect()`, flips to the opposite side when the preferred\n * side doesn't fit the viewport, clamps into the viewport, and recomputes\n * on scroll of *any* ancestor (capture-phase) and on resize\n * (rAF-coalesced). Listeners are torn down on close/unmount.\n *\n * The content must be mounted (it can be visually hidden) so its size can\n * be measured — gate visibility on the returned `ready` flag.\n *\n * ```tsx\n * const pos = usePopoverPosition(triggerRef, contentRef, { open, side: 'bottom' });\n * <Portal><div ref={contentRef} style={{\n * position: 'absolute', top: pos.top, left: pos.left,\n * visibility: pos.ready ? 'visible' : 'hidden',\n * }} /></Portal>\n * ```\n */\nexport function usePopoverPosition(\n anchorRef: React.RefObject<HTMLElement | VirtualElement | null>,\n contentRef: React.RefObject<HTMLElement | null>,\n { open, side = 'bottom', align = 'center', offset = 8, matchAnchorWidth = false }: UsePopoverPositionOptions,\n): PopoverPosition {\n const [pos, setPos] = React.useState<PopoverPosition>({\n top: 0,\n left: 0,\n side,\n ready: false,\n });\n\n const compute = React.useCallback((): void => {\n const anchorEl = anchorRef.current;\n const contentEl = contentRef.current;\n if (!anchorEl || !contentEl || typeof window === 'undefined') return;\n\n const a = anchorEl.getBoundingClientRect();\n const c = contentEl.getBoundingClientRect();\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n\n let chosen: PopoverSide = side;\n if (side === 'bottom' && a.bottom + offset + c.height > vh && a.top - offset - c.height >= 0) {\n chosen = 'top';\n } else if (side === 'top' && a.top - offset - c.height < 0 && a.bottom + offset + c.height <= vh) {\n chosen = 'bottom';\n } else if (side === 'right' && a.right + offset + c.width > vw && a.left - offset - c.width >= 0) {\n chosen = 'left';\n } else if (side === 'left' && a.left - offset - c.width < 0 && a.right + offset + c.width <= vw) {\n chosen = 'right';\n }\n\n let top = 0;\n let left = 0;\n if (chosen === 'bottom' || chosen === 'top') {\n top = chosen === 'bottom' ? a.bottom + offset : a.top - c.height - offset;\n left =\n align === 'start' ? a.left\n : align === 'end' ? a.right - c.width\n : a.left + (a.width - c.width) / 2;\n } else {\n left = chosen === 'right' ? a.right + offset : a.left - c.width - offset;\n top =\n align === 'start' ? a.top\n : align === 'end' ? a.bottom - c.height\n : a.top + (a.height - c.height) / 2;\n }\n\n left = Math.max(GUTTER, Math.min(left, vw - c.width - GUTTER));\n top = Math.max(GUTTER, Math.min(top, vh - c.height - GUTTER));\n\n setPos({\n top: top + window.scrollY,\n left: left + window.scrollX,\n side: chosen,\n ready: true,\n width: matchAnchorWidth ? a.width : undefined,\n });\n }, [anchorRef, contentRef, side, align, offset, matchAnchorWidth]);\n\n React.useEffect(() => {\n if (!open) {\n setPos((p) => (p.ready ? { ...p, ready: false } : p));\n return;\n }\n // Portal is synchronous, so by the time this effect runs the content\n // node is committed and measurable — position immediately (no flicker,\n // and deterministic under test without a rAF dependency).\n compute();\n let raf = 0;\n const schedule = (): void => {\n cancelAnimationFrame(raf);\n raf = requestAnimationFrame(compute);\n };\n // Capture-phase: scroll doesn't bubble, so capture catches scrolling\n // from *any* ancestor (the table/card wrapper, not just window).\n window.addEventListener('scroll', schedule, { capture: true, passive: true });\n window.addEventListener('resize', schedule, { passive: true });\n return () => {\n cancelAnimationFrame(raf);\n window.removeEventListener('scroll', schedule, { capture: true });\n window.removeEventListener('resize', schedule);\n };\n }, [open, compute]);\n\n return pos;\n}\n"]}
@@ -0,0 +1,48 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+
5
+ function _interopNamespace(e) {
6
+ if (e && e.__esModule) return e;
7
+ var n = Object.create(null);
8
+ if (e) {
9
+ Object.keys(e).forEach(function (k) {
10
+ if (k !== 'default') {
11
+ var d = Object.getOwnPropertyDescriptor(e, k);
12
+ Object.defineProperty(n, k, d.get ? d : {
13
+ enumerable: true,
14
+ get: function () { return e[k]; }
15
+ });
16
+ }
17
+ });
18
+ }
19
+ n.default = e;
20
+ return Object.freeze(n);
21
+ }
22
+
23
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
24
+
25
+ // src/hooks/useDelayedUnmount.ts
26
+ function useDelayedUnmount(open, durationMs) {
27
+ const [mounted, setMounted] = React__namespace.useState(open);
28
+ const [closing, setClosing] = React__namespace.useState(false);
29
+ React__namespace.useEffect(() => {
30
+ if (open) {
31
+ setMounted(true);
32
+ setClosing(false);
33
+ return;
34
+ }
35
+ if (!mounted) return;
36
+ setClosing(true);
37
+ const handle = setTimeout(() => {
38
+ setMounted(false);
39
+ setClosing(false);
40
+ }, durationMs);
41
+ return () => clearTimeout(handle);
42
+ }, [open, durationMs, mounted]);
43
+ return { mounted, closing };
44
+ }
45
+
46
+ exports.useDelayedUnmount = useDelayedUnmount;
47
+ //# sourceMappingURL=chunk-GIOMV3J7.js.map
48
+ //# sourceMappingURL=chunk-GIOMV3J7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/useDelayedUnmount.ts"],"names":["React"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAkBO,SAAS,iBAAA,CAAkB,MAAe,UAAA,EAAoB;AACnE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAUA,0BAAS,IAAI,CAAA;AACjD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAUA,0BAAS,KAAK,CAAA;AAElD,EAAMA,2BAAU,MAAM;AACpB,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,MAAM,MAAA,GAAS,WAAW,MAAM;AAC9B,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB,GAAG,UAAU,CAAA;AACb,IAAA,OAAO,MAAM,aAAa,MAAM,CAAA;AAAA,EAClC,CAAA,EAAG,CAAC,IAAA,EAAM,UAAA,EAAY,OAAO,CAAC,CAAA;AAE9B,EAAA,OAAO,EAAE,SAAS,OAAA,EAAQ;AAC5B","file":"chunk-GIOMV3J7.js","sourcesContent":["import * as React from 'react';\n\n/**\n * Delays unmounting of a component so an exit animation can play.\n *\n * When `open` flips to false, the hook keeps `mounted` true for `durationMs`\n * (giving CSS time to play `is-closing` keyframes) and then flips it to\n * false. The `closing` flag toggles during that window so the consumer can\n * apply a class like `is-closing` for the CSS animation.\n *\n * Usage:\n *\n * ```tsx\n * const { mounted, closing } = useDelayedUnmount(open, 200);\n * if (!mounted) return null;\n * return <div className={cx('modal', closing && 'is-closing')} />\n * ```\n */\nexport function useDelayedUnmount(open: boolean, durationMs: number) {\n const [mounted, setMounted] = React.useState(open);\n const [closing, setClosing] = React.useState(false);\n\n React.useEffect(() => {\n if (open) {\n setMounted(true);\n setClosing(false);\n return;\n }\n if (!mounted) return;\n setClosing(true);\n const handle = setTimeout(() => {\n setMounted(false);\n setClosing(false);\n }, durationMs);\n return () => clearTimeout(handle);\n }, [open, durationMs, mounted]);\n\n return { mounted, closing };\n}\n"]}
@@ -0,0 +1,13 @@
1
+ 'use strict';
2
+
3
+ var reactDom = require('react-dom');
4
+
5
+ // src/components/Portal.tsx
6
+ function Portal({ children, container }) {
7
+ if (typeof document === "undefined") return null;
8
+ return reactDom.createPortal(children, container ?? document.body);
9
+ }
10
+
11
+ exports.Portal = Portal;
12
+ //# sourceMappingURL=chunk-GLYGO7WX.js.map
13
+ //# sourceMappingURL=chunk-GLYGO7WX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Portal.tsx"],"names":["createPortal"],"mappings":";;;;;AA8BO,SAAS,MAAA,CAAO,EAAE,QAAA,EAAU,SAAA,EAAU,EAA0C;AACrF,EAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,IAAA;AAC5C,EAAA,OAAOA,qBAAA,CAAa,QAAA,EAAU,SAAA,IAAa,QAAA,CAAS,IAAI,CAAA;AAC1D","file":"chunk-GLYGO7WX.js","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\n\nexport interface PortalProps {\n children: React.ReactNode;\n /** Mount target. Defaults to `document.body`. */\n container?: Element | null;\n}\n\n/**\n * SSR-safe portal.\n *\n * Renders nothing during server rendering (`document` undefined), and\n * portals `children` into `container` (default `document.body`) on the\n * client. Floating panels are only mounted while open — i.e. driven by a\n * client interaction, never during the SSR/hydration pass — so there is no\n * hydration mismatch and we can portal synchronously (a deferred\n * `mounted` flag would delay measurement by a commit and make the panel\n * briefly unmeasurable). The body portal lets panels escape any ancestor\n * with `overflow: hidden|auto|scroll`, a transform, or a filter.\n *\n * ```tsx\n * {open && (\n * <Portal>\n * <div role=\"menu\" style={{ position: 'absolute', top, left }} />\n * </Portal>\n * )}\n * ```\n */\nexport function Portal({ children, container }: PortalProps): React.ReactPortal | null {\n if (typeof document === 'undefined') return null;\n return createPortal(children, container ?? document.body);\n}\n"]}
@@ -0,0 +1,73 @@
1
+ import * as React from 'react';
2
+
3
+ // src/hooks/usePopoverPosition.ts
4
+ var GUTTER = 8;
5
+ function usePopoverPosition(anchorRef, contentRef, { open, side = "bottom", align = "center", offset = 8, matchAnchorWidth = false }) {
6
+ const [pos, setPos] = React.useState({
7
+ top: 0,
8
+ left: 0,
9
+ side,
10
+ ready: false
11
+ });
12
+ const compute = React.useCallback(() => {
13
+ const anchorEl = anchorRef.current;
14
+ const contentEl = contentRef.current;
15
+ if (!anchorEl || !contentEl || typeof window === "undefined") return;
16
+ const a = anchorEl.getBoundingClientRect();
17
+ const c = contentEl.getBoundingClientRect();
18
+ const vw = window.innerWidth;
19
+ const vh = window.innerHeight;
20
+ let chosen = side;
21
+ if (side === "bottom" && a.bottom + offset + c.height > vh && a.top - offset - c.height >= 0) {
22
+ chosen = "top";
23
+ } else if (side === "top" && a.top - offset - c.height < 0 && a.bottom + offset + c.height <= vh) {
24
+ chosen = "bottom";
25
+ } else if (side === "right" && a.right + offset + c.width > vw && a.left - offset - c.width >= 0) {
26
+ chosen = "left";
27
+ } else if (side === "left" && a.left - offset - c.width < 0 && a.right + offset + c.width <= vw) {
28
+ chosen = "right";
29
+ }
30
+ let top = 0;
31
+ let left = 0;
32
+ if (chosen === "bottom" || chosen === "top") {
33
+ top = chosen === "bottom" ? a.bottom + offset : a.top - c.height - offset;
34
+ left = align === "start" ? a.left : align === "end" ? a.right - c.width : a.left + (a.width - c.width) / 2;
35
+ } else {
36
+ left = chosen === "right" ? a.right + offset : a.left - c.width - offset;
37
+ top = align === "start" ? a.top : align === "end" ? a.bottom - c.height : a.top + (a.height - c.height) / 2;
38
+ }
39
+ left = Math.max(GUTTER, Math.min(left, vw - c.width - GUTTER));
40
+ top = Math.max(GUTTER, Math.min(top, vh - c.height - GUTTER));
41
+ setPos({
42
+ top: top + window.scrollY,
43
+ left: left + window.scrollX,
44
+ side: chosen,
45
+ ready: true,
46
+ width: matchAnchorWidth ? a.width : void 0
47
+ });
48
+ }, [anchorRef, contentRef, side, align, offset, matchAnchorWidth]);
49
+ React.useEffect(() => {
50
+ if (!open) {
51
+ setPos((p) => p.ready ? { ...p, ready: false } : p);
52
+ return;
53
+ }
54
+ compute();
55
+ let raf = 0;
56
+ const schedule = () => {
57
+ cancelAnimationFrame(raf);
58
+ raf = requestAnimationFrame(compute);
59
+ };
60
+ window.addEventListener("scroll", schedule, { capture: true, passive: true });
61
+ window.addEventListener("resize", schedule, { passive: true });
62
+ return () => {
63
+ cancelAnimationFrame(raf);
64
+ window.removeEventListener("scroll", schedule, { capture: true });
65
+ window.removeEventListener("resize", schedule);
66
+ };
67
+ }, [open, compute]);
68
+ return pos;
69
+ }
70
+
71
+ export { usePopoverPosition };
72
+ //# sourceMappingURL=chunk-H3PRT76O.mjs.map
73
+ //# sourceMappingURL=chunk-H3PRT76O.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/usePopoverPosition.ts"],"names":[],"mappings":"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","file":"chunk-H3PRT76O.mjs","sourcesContent":["import * as React from 'react';\n\nexport type PopoverSide = 'top' | 'bottom' | 'left' | 'right';\nexport type PopoverAlign = 'start' | 'center' | 'end';\n\n/** Anything that can report its viewport rect: a DOM element or a virtual\n * anchor (e.g. a point under the cursor for a context menu). */\nexport interface VirtualElement {\n getBoundingClientRect: () => DOMRect;\n}\n\nexport interface UsePopoverPositionOptions {\n open: boolean;\n side?: PopoverSide;\n align?: PopoverAlign;\n offset?: number;\n /** Expose the anchor's width so the consumer can match it (comboboxes). */\n matchAnchorWidth?: boolean;\n}\n\nexport interface PopoverPosition {\n /** Document-relative coords (use with `position: absolute` in a body portal). */\n top: number;\n left: number;\n /** Side actually used after flipping; useful for arrow/animation origin. */\n side: PopoverSide;\n /** False until the first measure. Keep content `visibility: hidden` until true. */\n ready: boolean;\n /** Anchor width, only when `matchAnchorWidth` is set. */\n width?: number;\n}\n\nconst GUTTER = 8;\n\n/**\n * Positions a floating panel relative to an anchor, for panels portaled to\n * `document.body`. Computes document-relative coords from\n * `getBoundingClientRect()`, flips to the opposite side when the preferred\n * side doesn't fit the viewport, clamps into the viewport, and recomputes\n * on scroll of *any* ancestor (capture-phase) and on resize\n * (rAF-coalesced). Listeners are torn down on close/unmount.\n *\n * The content must be mounted (it can be visually hidden) so its size can\n * be measured — gate visibility on the returned `ready` flag.\n *\n * ```tsx\n * const pos = usePopoverPosition(triggerRef, contentRef, { open, side: 'bottom' });\n * <Portal><div ref={contentRef} style={{\n * position: 'absolute', top: pos.top, left: pos.left,\n * visibility: pos.ready ? 'visible' : 'hidden',\n * }} /></Portal>\n * ```\n */\nexport function usePopoverPosition(\n anchorRef: React.RefObject<HTMLElement | VirtualElement | null>,\n contentRef: React.RefObject<HTMLElement | null>,\n { open, side = 'bottom', align = 'center', offset = 8, matchAnchorWidth = false }: UsePopoverPositionOptions,\n): PopoverPosition {\n const [pos, setPos] = React.useState<PopoverPosition>({\n top: 0,\n left: 0,\n side,\n ready: false,\n });\n\n const compute = React.useCallback((): void => {\n const anchorEl = anchorRef.current;\n const contentEl = contentRef.current;\n if (!anchorEl || !contentEl || typeof window === 'undefined') return;\n\n const a = anchorEl.getBoundingClientRect();\n const c = contentEl.getBoundingClientRect();\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n\n let chosen: PopoverSide = side;\n if (side === 'bottom' && a.bottom + offset + c.height > vh && a.top - offset - c.height >= 0) {\n chosen = 'top';\n } else if (side === 'top' && a.top - offset - c.height < 0 && a.bottom + offset + c.height <= vh) {\n chosen = 'bottom';\n } else if (side === 'right' && a.right + offset + c.width > vw && a.left - offset - c.width >= 0) {\n chosen = 'left';\n } else if (side === 'left' && a.left - offset - c.width < 0 && a.right + offset + c.width <= vw) {\n chosen = 'right';\n }\n\n let top = 0;\n let left = 0;\n if (chosen === 'bottom' || chosen === 'top') {\n top = chosen === 'bottom' ? a.bottom + offset : a.top - c.height - offset;\n left =\n align === 'start' ? a.left\n : align === 'end' ? a.right - c.width\n : a.left + (a.width - c.width) / 2;\n } else {\n left = chosen === 'right' ? a.right + offset : a.left - c.width - offset;\n top =\n align === 'start' ? a.top\n : align === 'end' ? a.bottom - c.height\n : a.top + (a.height - c.height) / 2;\n }\n\n left = Math.max(GUTTER, Math.min(left, vw - c.width - GUTTER));\n top = Math.max(GUTTER, Math.min(top, vh - c.height - GUTTER));\n\n setPos({\n top: top + window.scrollY,\n left: left + window.scrollX,\n side: chosen,\n ready: true,\n width: matchAnchorWidth ? a.width : undefined,\n });\n }, [anchorRef, contentRef, side, align, offset, matchAnchorWidth]);\n\n React.useEffect(() => {\n if (!open) {\n setPos((p) => (p.ready ? { ...p, ready: false } : p));\n return;\n }\n // Portal is synchronous, so by the time this effect runs the content\n // node is committed and measurable — position immediately (no flicker,\n // and deterministic under test without a rAF dependency).\n compute();\n let raf = 0;\n const schedule = (): void => {\n cancelAnimationFrame(raf);\n raf = requestAnimationFrame(compute);\n };\n // Capture-phase: scroll doesn't bubble, so capture catches scrolling\n // from *any* ancestor (the table/card wrapper, not just window).\n window.addEventListener('scroll', schedule, { capture: true, passive: true });\n window.addEventListener('resize', schedule, { passive: true });\n return () => {\n cancelAnimationFrame(raf);\n window.removeEventListener('scroll', schedule, { capture: true });\n window.removeEventListener('resize', schedule);\n };\n }, [open, compute]);\n\n return pos;\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { Avatar } from './chunk-NUURPO3J.mjs';
1
+ import { Avatar } from './chunk-OCLBAGNF.mjs';
2
2
  import { useLocale } from './chunk-ZRFSTYRL.mjs';
3
3
  import { ChevronDown, ChevronRight } from './chunk-CIBJKJV3.mjs';
4
4
  import { cx } from './chunk-IEPCH3JB.mjs';
@@ -173,5 +173,5 @@ function Calendar({ month: monthProp, events = [], onMonthChange, onDayClick, cl
173
173
  }
174
174
 
175
175
  export { Calendar, StatusIndicator, Timeline, TimelineItem, Tree, UserCell };
176
- //# sourceMappingURL=chunk-Z4GRQHIG.mjs.map
177
- //# sourceMappingURL=chunk-Z4GRQHIG.mjs.map
176
+ //# sourceMappingURL=chunk-IEJXZ67E.mjs.map
177
+ //# sourceMappingURL=chunk-IEJXZ67E.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Display3.tsx"],"names":["Timeline"],"mappings":"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","file":"chunk-Z4GRQHIG.mjs","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { Avatar } from './Display2';\nimport { ChevronRight, ChevronDown } from './Icons';\nimport { useLocale } from '../locale/LocaleProvider';\n\n// ---------- UserCell ----------------------------------------------------\nexport interface UserCellProps extends React.HTMLAttributes<HTMLDivElement> {\n name: React.ReactNode;\n meta?: React.ReactNode; // role / email / etc.\n avatarSrc?: string;\n avatarAlt?: string;\n size?: 24 | 32 | 40 | 48;\n}\n\nexport function UserCell({ name, meta, avatarSrc, avatarAlt, size = 32, className, ...rest }: UserCellProps) {\n const initialsName = typeof name === 'string' ? name : undefined;\n return (\n <div className={cx('user-cell', className)} {...rest}>\n <Avatar src={avatarSrc} alt={avatarAlt} name={initialsName} size={size} />\n <div className=\"user-cell__body\">\n <div className=\"user-cell__name\">{name}</div>\n {meta && <div className=\"user-cell__meta\">{meta}</div>}\n </div>\n </div>\n );\n}\n\n// ---------- StatusIndicator (pulsing dot) ------------------------------\nexport type StatusTone = 'success' | 'warning' | 'danger' | 'info' | 'neutral';\n\nexport interface StatusIndicatorProps extends React.HTMLAttributes<HTMLSpanElement> {\n tone?: StatusTone;\n pulse?: boolean;\n label?: React.ReactNode;\n}\n\nexport function StatusIndicator({ tone = 'success', pulse, label, className, ...rest }: StatusIndicatorProps) {\n return (\n <span className={cx('status-indicator', className)} role=\"status\" {...rest}>\n <span className={cx('status-indicator__dot', `status-indicator__dot--${tone}`, pulse && 'is-pulsing')} aria-hidden=\"true\" />\n {label && <span className=\"status-indicator__label\">{label}</span>}\n </span>\n );\n}\n\n// ---------- Timeline ----------------------------------------------------\nexport interface TimelineProps extends React.HTMLAttributes<HTMLOListElement> {}\n\nexport const Timeline = React.forwardRef<HTMLOListElement, TimelineProps>(\n function Timeline({ className, ...rest }, ref) {\n return <ol ref={ref} className={cx('timeline', className)} {...rest} />;\n }\n);\n\nexport interface TimelineItemProps extends Omit<React.LiHTMLAttributes<HTMLLIElement>, 'title'> {\n icon?: React.ReactNode;\n tone?: StatusTone;\n title: React.ReactNode;\n meta?: React.ReactNode;\n}\n\nexport function TimelineItem({ icon, tone = 'neutral', title, meta, children, className, ...rest }: TimelineItemProps) {\n return (\n <li className={cx('timeline__item', className)} {...rest}>\n <span className={cx('timeline__marker', `timeline__marker--${tone}`)} aria-hidden=\"true\">\n {icon}\n </span>\n <div className=\"timeline__body\">\n <div className=\"timeline__title\">{title}</div>\n {meta && <div className=\"timeline__meta\">{meta}</div>}\n {children && <div className=\"timeline__content\">{children}</div>}\n </div>\n </li>\n );\n}\n\n// ---------- Tree --------------------------------------------------------\nexport interface TreeNodeData {\n id: string;\n label: React.ReactNode;\n icon?: React.ReactNode;\n children?: TreeNodeData[];\n meta?: React.ReactNode;\n}\n\nexport interface TreeProps extends Omit<React.HTMLAttributes<HTMLUListElement>, 'onSelect'> {\n nodes: TreeNodeData[];\n defaultExpanded?: string[];\n selectedId?: string;\n onSelect?: (id: string) => void;\n}\n\nexport function Tree({ nodes, defaultExpanded = [], selectedId, onSelect, className, ...rest }: TreeProps) {\n const [expanded, setExpanded] = React.useState<Set<string>>(new Set(defaultExpanded));\n const toggle = (id: string) => {\n setExpanded((curr) => {\n const next = new Set(curr);\n if (next.has(id)) next.delete(id); else next.add(id);\n return next;\n });\n };\n return (\n <ul role=\"tree\" className={cx('tree', className)} {...rest}>\n {nodes.map((n) => (\n <TreeNode key={n.id} node={n} depth={0} expanded={expanded} toggle={toggle} selectedId={selectedId} onSelect={onSelect} />\n ))}\n </ul>\n );\n}\n\ninterface TreeNodeProps {\n node: TreeNodeData;\n depth: number;\n expanded: Set<string>;\n toggle: (id: string) => void;\n selectedId?: string;\n onSelect?: (id: string) => void;\n}\n\nfunction TreeNode({ node, depth, expanded, toggle, selectedId, onSelect }: TreeNodeProps) {\n const hasChildren = !!(node.children && node.children.length);\n const isOpen = expanded.has(node.id);\n const isSelected = selectedId === node.id;\n const t = useLocale();\n return (\n <li role=\"treeitem\" aria-expanded={hasChildren ? isOpen : undefined} aria-selected={isSelected} className=\"tree__node\">\n <div\n className={cx('tree__row', isSelected && 'is-selected')}\n style={{ paddingLeft: `calc(var(--space-2) + var(--space-4) * ${depth})` }}\n onClick={() => onSelect?.(node.id)}\n >\n {hasChildren ? (\n <button\n type=\"button\"\n className=\"tree__chev\"\n aria-label={isOpen ? t['calendar.collapse'] : t['calendar.expand']}\n onClick={(e) => { e.stopPropagation(); toggle(node.id); }}\n >\n {isOpen ? <ChevronDown size={14} /> : <ChevronRight size={14} />}\n </button>\n ) : (\n <span className=\"tree__chev tree__chev--placeholder\" aria-hidden=\"true\" />\n )}\n {node.icon && <span className=\"tree__icon\" aria-hidden=\"true\">{node.icon}</span>}\n <span className=\"tree__label\">{node.label}</span>\n {node.meta && <span className=\"tree__meta\">{node.meta}</span>}\n </div>\n {hasChildren && isOpen && (\n <ul role=\"group\" className=\"tree__children\">\n {node.children!.map((c) => (\n <TreeNode key={c.id} node={c} depth={depth + 1} expanded={expanded} toggle={toggle} selectedId={selectedId} onSelect={onSelect} />\n ))}\n </ul>\n )}\n </li>\n );\n}\n\n// ---------- Calendar (vista mes completa, no picker) -------------------\nexport interface CalendarEvent {\n date: Date;\n label: React.ReactNode;\n tone?: StatusTone;\n onClick?: () => void;\n}\n\nexport interface CalendarProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Mes a mostrar. Default: mes actual. */\n month?: Date;\n events?: CalendarEvent[];\n onMonthChange?: (m: Date) => void;\n onDayClick?: (d: Date) => void;\n}\n\nfunction startOfMonth(d: Date) { return new Date(d.getFullYear(), d.getMonth(), 1); }\nfunction addMonths(d: Date, n: number) { return new Date(d.getFullYear(), d.getMonth() + n, 1); }\nfunction isSameDay(a: Date, b: Date) {\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();\n}\n\nexport function Calendar({ month: monthProp, events = [], onMonthChange, onDayClick, className, ...rest }: CalendarProps) {\n const [internalMonth, setInternalMonth] = React.useState(() => startOfMonth(monthProp ?? new Date()));\n const month = monthProp ? startOfMonth(monthProp) : internalMonth;\n const t = useLocale();\n const weekdays = t['calendar.weekdays'];\n const months = t['calendar.months'];\n const setMonth = (m: Date) => {\n if (!monthProp) setInternalMonth(m);\n onMonthChange?.(m);\n };\n\n const today = new Date();\n\n // primer día visible: lunes anterior al primer día del mes\n const firstDay = startOfMonth(month);\n const firstWeekday = (firstDay.getDay() + 6) % 7; // domingo=0 → 6, lunes=1 → 0\n const gridStart = new Date(firstDay);\n gridStart.setDate(firstDay.getDate() - firstWeekday);\n\n const days: Date[] = Array.from({ length: 42 }, (_, i) => {\n const d = new Date(gridStart);\n d.setDate(gridStart.getDate() + i);\n return d;\n });\n\n const eventsByDay = React.useMemo(() => {\n const m = new Map<string, CalendarEvent[]>();\n for (const ev of events) {\n const key = `${ev.date.getFullYear()}-${ev.date.getMonth()}-${ev.date.getDate()}`;\n const list = m.get(key) ?? [];\n list.push(ev);\n m.set(key, list);\n }\n return m;\n }, [events]);\n\n return (\n <div className={cx('calendar', className)} {...rest}>\n <div className=\"calendar__head\">\n <button type=\"button\" className=\"calendar__nav\" aria-label={t['calendar.prevMonth']} onClick={() => setMonth(addMonths(month, -1))}>\n <ChevronRight size={16} style={{ transform: 'rotate(180deg)' }} />\n </button>\n <div className=\"calendar__title\">{months[month.getMonth()]} {month.getFullYear()}</div>\n <button type=\"button\" className=\"calendar__nav\" aria-label={t['calendar.nextMonth']} onClick={() => setMonth(addMonths(month, 1))}>\n <ChevronRight size={16} />\n </button>\n </div>\n <div className=\"calendar__grid calendar__weekdays\">\n {weekdays.map((w) => <div key={w} className=\"calendar__weekday\">{w}</div>)}\n </div>\n <div className=\"calendar__grid\">\n {days.map((d, i) => {\n const inMonth = d.getMonth() === month.getMonth();\n const isToday = isSameDay(d, today);\n const key = `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`;\n const dayEvents = eventsByDay.get(key) ?? [];\n return (\n <button\n key={i}\n type=\"button\"\n className={cx('calendar__day', !inMonth && 'is-out', isToday && 'is-today')}\n onClick={() => onDayClick?.(d)}\n >\n <span className=\"calendar__daynum\">{d.getDate()}</span>\n {dayEvents.length > 0 && (\n <div className=\"calendar__events\">\n {dayEvents.slice(0, 2).map((ev, idx) => (\n <span\n key={idx}\n className={cx('calendar__event', `calendar__event--${ev.tone ?? 'neutral'}`)}\n onClick={(e) => { e.stopPropagation(); ev.onClick?.(); }}\n >\n {ev.label}\n </span>\n ))}\n {dayEvents.length > 2 && <span className=\"calendar__more\">+{dayEvents.length - 2}</span>}\n </div>\n )}\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/Display3.tsx"],"names":["Timeline"],"mappings":"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","file":"chunk-IEJXZ67E.mjs","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { Avatar } from './Display2';\nimport { ChevronRight, ChevronDown } from './Icons';\nimport { useLocale } from '../locale/LocaleProvider';\n\n// ---------- UserCell ----------------------------------------------------\nexport interface UserCellProps extends React.HTMLAttributes<HTMLDivElement> {\n name: React.ReactNode;\n meta?: React.ReactNode; // role / email / etc.\n avatarSrc?: string;\n avatarAlt?: string;\n size?: 24 | 32 | 40 | 48;\n}\n\nexport function UserCell({ name, meta, avatarSrc, avatarAlt, size = 32, className, ...rest }: UserCellProps) {\n const initialsName = typeof name === 'string' ? name : undefined;\n return (\n <div className={cx('user-cell', className)} {...rest}>\n <Avatar src={avatarSrc} alt={avatarAlt} name={initialsName} size={size} />\n <div className=\"user-cell__body\">\n <div className=\"user-cell__name\">{name}</div>\n {meta && <div className=\"user-cell__meta\">{meta}</div>}\n </div>\n </div>\n );\n}\n\n// ---------- StatusIndicator (pulsing dot) ------------------------------\nexport type StatusTone = 'success' | 'warning' | 'danger' | 'info' | 'neutral';\n\nexport interface StatusIndicatorProps extends React.HTMLAttributes<HTMLSpanElement> {\n tone?: StatusTone;\n pulse?: boolean;\n label?: React.ReactNode;\n}\n\nexport function StatusIndicator({ tone = 'success', pulse, label, className, ...rest }: StatusIndicatorProps) {\n return (\n <span className={cx('status-indicator', className)} role=\"status\" {...rest}>\n <span className={cx('status-indicator__dot', `status-indicator__dot--${tone}`, pulse && 'is-pulsing')} aria-hidden=\"true\" />\n {label && <span className=\"status-indicator__label\">{label}</span>}\n </span>\n );\n}\n\n// ---------- Timeline ----------------------------------------------------\nexport interface TimelineProps extends React.HTMLAttributes<HTMLOListElement> {}\n\nexport const Timeline = React.forwardRef<HTMLOListElement, TimelineProps>(\n function Timeline({ className, ...rest }, ref) {\n return <ol ref={ref} className={cx('timeline', className)} {...rest} />;\n }\n);\n\nexport interface TimelineItemProps extends Omit<React.LiHTMLAttributes<HTMLLIElement>, 'title'> {\n icon?: React.ReactNode;\n tone?: StatusTone;\n title: React.ReactNode;\n meta?: React.ReactNode;\n}\n\nexport function TimelineItem({ icon, tone = 'neutral', title, meta, children, className, ...rest }: TimelineItemProps) {\n return (\n <li className={cx('timeline__item', className)} {...rest}>\n <span className={cx('timeline__marker', `timeline__marker--${tone}`)} aria-hidden=\"true\">\n {icon}\n </span>\n <div className=\"timeline__body\">\n <div className=\"timeline__title\">{title}</div>\n {meta && <div className=\"timeline__meta\">{meta}</div>}\n {children && <div className=\"timeline__content\">{children}</div>}\n </div>\n </li>\n );\n}\n\n// ---------- Tree --------------------------------------------------------\nexport interface TreeNodeData {\n id: string;\n label: React.ReactNode;\n icon?: React.ReactNode;\n children?: TreeNodeData[];\n meta?: React.ReactNode;\n}\n\nexport interface TreeProps extends Omit<React.HTMLAttributes<HTMLUListElement>, 'onSelect'> {\n nodes: TreeNodeData[];\n defaultExpanded?: string[];\n selectedId?: string;\n onSelect?: (id: string) => void;\n}\n\nexport function Tree({ nodes, defaultExpanded = [], selectedId, onSelect, className, ...rest }: TreeProps) {\n const [expanded, setExpanded] = React.useState<Set<string>>(new Set(defaultExpanded));\n const toggle = (id: string) => {\n setExpanded((curr) => {\n const next = new Set(curr);\n if (next.has(id)) next.delete(id); else next.add(id);\n return next;\n });\n };\n return (\n <ul role=\"tree\" className={cx('tree', className)} {...rest}>\n {nodes.map((n) => (\n <TreeNode key={n.id} node={n} depth={0} expanded={expanded} toggle={toggle} selectedId={selectedId} onSelect={onSelect} />\n ))}\n </ul>\n );\n}\n\ninterface TreeNodeProps {\n node: TreeNodeData;\n depth: number;\n expanded: Set<string>;\n toggle: (id: string) => void;\n selectedId?: string;\n onSelect?: (id: string) => void;\n}\n\nfunction TreeNode({ node, depth, expanded, toggle, selectedId, onSelect }: TreeNodeProps) {\n const hasChildren = !!(node.children && node.children.length);\n const isOpen = expanded.has(node.id);\n const isSelected = selectedId === node.id;\n const t = useLocale();\n return (\n <li role=\"treeitem\" aria-expanded={hasChildren ? isOpen : undefined} aria-selected={isSelected} className=\"tree__node\">\n <div\n className={cx('tree__row', isSelected && 'is-selected')}\n style={{ paddingLeft: `calc(var(--space-2) + var(--space-4) * ${depth})` }}\n onClick={() => onSelect?.(node.id)}\n >\n {hasChildren ? (\n <button\n type=\"button\"\n className=\"tree__chev\"\n aria-label={isOpen ? t['calendar.collapse'] : t['calendar.expand']}\n onClick={(e) => { e.stopPropagation(); toggle(node.id); }}\n >\n {isOpen ? <ChevronDown size={14} /> : <ChevronRight size={14} />}\n </button>\n ) : (\n <span className=\"tree__chev tree__chev--placeholder\" aria-hidden=\"true\" />\n )}\n {node.icon && <span className=\"tree__icon\" aria-hidden=\"true\">{node.icon}</span>}\n <span className=\"tree__label\">{node.label}</span>\n {node.meta && <span className=\"tree__meta\">{node.meta}</span>}\n </div>\n {hasChildren && isOpen && (\n <ul role=\"group\" className=\"tree__children\">\n {node.children!.map((c) => (\n <TreeNode key={c.id} node={c} depth={depth + 1} expanded={expanded} toggle={toggle} selectedId={selectedId} onSelect={onSelect} />\n ))}\n </ul>\n )}\n </li>\n );\n}\n\n// ---------- Calendar (vista mes completa, no picker) -------------------\nexport interface CalendarEvent {\n date: Date;\n label: React.ReactNode;\n tone?: StatusTone;\n onClick?: () => void;\n}\n\nexport interface CalendarProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Mes a mostrar. Default: mes actual. */\n month?: Date;\n events?: CalendarEvent[];\n onMonthChange?: (m: Date) => void;\n onDayClick?: (d: Date) => void;\n}\n\nfunction startOfMonth(d: Date) { return new Date(d.getFullYear(), d.getMonth(), 1); }\nfunction addMonths(d: Date, n: number) { return new Date(d.getFullYear(), d.getMonth() + n, 1); }\nfunction isSameDay(a: Date, b: Date) {\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();\n}\n\nexport function Calendar({ month: monthProp, events = [], onMonthChange, onDayClick, className, ...rest }: CalendarProps) {\n const [internalMonth, setInternalMonth] = React.useState(() => startOfMonth(monthProp ?? new Date()));\n const month = monthProp ? startOfMonth(monthProp) : internalMonth;\n const t = useLocale();\n const weekdays = t['calendar.weekdays'];\n const months = t['calendar.months'];\n const setMonth = (m: Date) => {\n if (!monthProp) setInternalMonth(m);\n onMonthChange?.(m);\n };\n\n const today = new Date();\n\n // primer día visible: lunes anterior al primer día del mes\n const firstDay = startOfMonth(month);\n const firstWeekday = (firstDay.getDay() + 6) % 7; // domingo=0 → 6, lunes=1 → 0\n const gridStart = new Date(firstDay);\n gridStart.setDate(firstDay.getDate() - firstWeekday);\n\n const days: Date[] = Array.from({ length: 42 }, (_, i) => {\n const d = new Date(gridStart);\n d.setDate(gridStart.getDate() + i);\n return d;\n });\n\n const eventsByDay = React.useMemo(() => {\n const m = new Map<string, CalendarEvent[]>();\n for (const ev of events) {\n const key = `${ev.date.getFullYear()}-${ev.date.getMonth()}-${ev.date.getDate()}`;\n const list = m.get(key) ?? [];\n list.push(ev);\n m.set(key, list);\n }\n return m;\n }, [events]);\n\n return (\n <div className={cx('calendar', className)} {...rest}>\n <div className=\"calendar__head\">\n <button type=\"button\" className=\"calendar__nav\" aria-label={t['calendar.prevMonth']} onClick={() => setMonth(addMonths(month, -1))}>\n <ChevronRight size={16} style={{ transform: 'rotate(180deg)' }} />\n </button>\n <div className=\"calendar__title\">{months[month.getMonth()]} {month.getFullYear()}</div>\n <button type=\"button\" className=\"calendar__nav\" aria-label={t['calendar.nextMonth']} onClick={() => setMonth(addMonths(month, 1))}>\n <ChevronRight size={16} />\n </button>\n </div>\n <div className=\"calendar__grid calendar__weekdays\">\n {weekdays.map((w) => <div key={w} className=\"calendar__weekday\">{w}</div>)}\n </div>\n <div className=\"calendar__grid\">\n {days.map((d, i) => {\n const inMonth = d.getMonth() === month.getMonth();\n const isToday = isSameDay(d, today);\n const key = `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`;\n const dayEvents = eventsByDay.get(key) ?? [];\n return (\n <button\n key={i}\n type=\"button\"\n className={cx('calendar__day', !inMonth && 'is-out', isToday && 'is-today')}\n onClick={() => onDayClick?.(d)}\n >\n <span className=\"calendar__daynum\">{d.getDate()}</span>\n {dayEvents.length > 0 && (\n <div className=\"calendar__events\">\n {dayEvents.slice(0, 2).map((ev, idx) => (\n <span\n key={idx}\n className={cx('calendar__event', `calendar__event--${ev.tone ?? 'neutral'}`)}\n onClick={(e) => { e.stopPropagation(); ev.onClick?.(); }}\n >\n {ev.label}\n </span>\n ))}\n {dayEvents.length > 2 && <span className=\"calendar__more\">+{dayEvents.length - 2}</span>}\n </div>\n )}\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n"]}