@misael703/ui 1.65.1 → 1.65.3

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-SZPUIQHI.js → chunk-2PNXLTEM.js} +4 -4
  2. package/dist/{chunk-SZPUIQHI.js.map → chunk-2PNXLTEM.js.map} +1 -1
  3. package/dist/{chunk-Z4P3MTRS.js → chunk-324O7B3R.js} +5 -5
  4. package/dist/{chunk-Z4P3MTRS.js.map → chunk-324O7B3R.js.map} +1 -1
  5. package/dist/{chunk-4WGXCRNN.js → chunk-3JRP3DGM.js} +3 -3
  6. package/dist/{chunk-4WGXCRNN.js.map → chunk-3JRP3DGM.js.map} +1 -1
  7. package/dist/{chunk-GZIIW3CL.js → chunk-3N24QPRP.js} +5 -5
  8. package/dist/{chunk-GZIIW3CL.js.map → chunk-3N24QPRP.js.map} +1 -1
  9. package/dist/{chunk-H24HV2KH.mjs → chunk-4Z5GFOIU.mjs} +3 -3
  10. package/dist/{chunk-H24HV2KH.mjs.map → chunk-4Z5GFOIU.mjs.map} +1 -1
  11. package/dist/{chunk-3EI7T5WX.mjs → chunk-5C7LUIBN.mjs} +5 -5
  12. package/dist/{chunk-3EI7T5WX.mjs.map → chunk-5C7LUIBN.mjs.map} +1 -1
  13. package/dist/{chunk-OSXQQYSN.mjs → chunk-5G3DVB5B.mjs} +4 -4
  14. package/dist/{chunk-OSXQQYSN.mjs.map → chunk-5G3DVB5B.mjs.map} +1 -1
  15. package/dist/{chunk-W32DESSM.mjs → chunk-6UYKIUQB.mjs} +3 -3
  16. package/dist/{chunk-W32DESSM.mjs.map → chunk-6UYKIUQB.mjs.map} +1 -1
  17. package/dist/{chunk-T374ZISI.js → chunk-7AJAQJOX.js} +5 -5
  18. package/dist/{chunk-T374ZISI.js.map → chunk-7AJAQJOX.js.map} +1 -1
  19. package/dist/{chunk-MURFESTG.js → chunk-AGMDYCGG.js} +4 -4
  20. package/dist/{chunk-MURFESTG.js.map → chunk-AGMDYCGG.js.map} +1 -1
  21. package/dist/{chunk-4WONGJAF.mjs → chunk-CEDAYY2N.mjs} +3 -3
  22. package/dist/{chunk-4WONGJAF.mjs.map → chunk-CEDAYY2N.mjs.map} +1 -1
  23. package/dist/{chunk-Z5RTA2MB.mjs → chunk-DH3IXJRJ.mjs} +4 -4
  24. package/dist/{chunk-Z5RTA2MB.mjs.map → chunk-DH3IXJRJ.mjs.map} +1 -1
  25. package/dist/{chunk-IDYMCSGE.mjs → chunk-DLPTIVZB.mjs} +5 -5
  26. package/dist/{chunk-IDYMCSGE.mjs.map → chunk-DLPTIVZB.mjs.map} +1 -1
  27. package/dist/{chunk-FR2E6DLA.js → chunk-E6BTT4I7.js} +4 -4
  28. package/dist/{chunk-FR2E6DLA.js.map → chunk-E6BTT4I7.js.map} +1 -1
  29. package/dist/{chunk-7AWENPVE.js → chunk-FI2XCF3F.js} +4 -4
  30. package/dist/{chunk-7AWENPVE.js.map → chunk-FI2XCF3F.js.map} +1 -1
  31. package/dist/{chunk-UINN3O5C.mjs → chunk-FR4JV3JA.mjs} +4 -4
  32. package/dist/{chunk-UINN3O5C.mjs.map → chunk-FR4JV3JA.mjs.map} +1 -1
  33. package/dist/{chunk-TJ35METS.js → chunk-FRUNZAYE.js} +5 -5
  34. package/dist/{chunk-TJ35METS.js.map → chunk-FRUNZAYE.js.map} +1 -1
  35. package/dist/{chunk-DAVJ3H52.mjs → chunk-GNI5MH36.mjs} +3 -3
  36. package/dist/{chunk-DAVJ3H52.mjs.map → chunk-GNI5MH36.mjs.map} +1 -1
  37. package/dist/{chunk-QMXU5WXD.js → chunk-HCTY5QYL.js} +4 -4
  38. package/dist/{chunk-QMXU5WXD.js.map → chunk-HCTY5QYL.js.map} +1 -1
  39. package/dist/{chunk-BANRYAIX.mjs → chunk-HGS3ATU2.mjs} +4 -4
  40. package/dist/{chunk-BANRYAIX.mjs.map → chunk-HGS3ATU2.mjs.map} +1 -1
  41. package/dist/{chunk-G3OEZRKQ.js → chunk-HYB7EXRB.js} +4 -4
  42. package/dist/{chunk-G3OEZRKQ.js.map → chunk-HYB7EXRB.js.map} +1 -1
  43. package/dist/{chunk-QR6X2UOT.mjs → chunk-JMFDIN5R.mjs} +3 -3
  44. package/dist/{chunk-QR6X2UOT.mjs.map → chunk-JMFDIN5R.mjs.map} +1 -1
  45. package/dist/{chunk-XJFGP7MK.js → chunk-MW7HQCFC.js} +4 -4
  46. package/dist/{chunk-XJFGP7MK.js.map → chunk-MW7HQCFC.js.map} +1 -1
  47. package/dist/{chunk-TYUTEYAK.mjs → chunk-NS6CI6RP.mjs} +4 -4
  48. package/dist/{chunk-TYUTEYAK.mjs.map → chunk-NS6CI6RP.mjs.map} +1 -1
  49. package/dist/{chunk-JZNUYA42.js → chunk-NU4GAGUV.js} +3 -3
  50. package/dist/{chunk-JZNUYA42.js.map → chunk-NU4GAGUV.js.map} +1 -1
  51. package/dist/{chunk-7YTH4TWC.js → chunk-NUTHJQYH.js} +5 -5
  52. package/dist/{chunk-7YTH4TWC.js.map → chunk-NUTHJQYH.js.map} +1 -1
  53. package/dist/{chunk-3WSB2R2K.mjs → chunk-OIYIWG53.mjs} +4 -4
  54. package/dist/{chunk-3WSB2R2K.mjs.map → chunk-OIYIWG53.mjs.map} +1 -1
  55. package/dist/{chunk-H4ZAFXAM.mjs → chunk-ORTQGS7I.mjs} +4 -4
  56. package/dist/{chunk-H4ZAFXAM.mjs.map → chunk-ORTQGS7I.mjs.map} +1 -1
  57. package/dist/{chunk-UAGGFYWJ.js → chunk-SA7NCLEK.js} +5 -5
  58. package/dist/{chunk-UAGGFYWJ.js.map → chunk-SA7NCLEK.js.map} +1 -1
  59. package/dist/{chunk-WATUFPTP.mjs → chunk-SAJMSBGQ.mjs} +5 -5
  60. package/dist/{chunk-WATUFPTP.mjs.map → chunk-SAJMSBGQ.mjs.map} +1 -1
  61. package/dist/{chunk-KPWOWFMT.js → chunk-SQJVGL7Y.js} +3 -3
  62. package/dist/{chunk-KPWOWFMT.js.map → chunk-SQJVGL7Y.js.map} +1 -1
  63. package/dist/{chunk-H7SJBODY.mjs → chunk-TGAAJCUZ.mjs} +3 -3
  64. package/dist/{chunk-H7SJBODY.mjs.map → chunk-TGAAJCUZ.mjs.map} +1 -1
  65. package/dist/{chunk-Y32XBOIC.mjs → chunk-TJ5LRNVT.mjs} +4 -4
  66. package/dist/{chunk-Y32XBOIC.mjs.map → chunk-TJ5LRNVT.mjs.map} +1 -1
  67. package/dist/{chunk-SDJHC7QY.js → chunk-TX4BUYX4.js} +4 -4
  68. package/dist/{chunk-SDJHC7QY.js.map → chunk-TX4BUYX4.js.map} +1 -1
  69. package/dist/{chunk-2EZSO6PE.js → chunk-UROEA7L4.js} +4 -4
  70. package/dist/{chunk-2EZSO6PE.js.map → chunk-UROEA7L4.js.map} +1 -1
  71. package/dist/{chunk-TCVY7K63.js → chunk-VFZ7VMU2.js} +4 -4
  72. package/dist/{chunk-TCVY7K63.js.map → chunk-VFZ7VMU2.js.map} +1 -1
  73. package/dist/{chunk-HFRMDYNW.mjs → chunk-X36H75RR.mjs} +3 -3
  74. package/dist/{chunk-HFRMDYNW.mjs.map → chunk-X36H75RR.mjs.map} +1 -1
  75. package/dist/{chunk-7RAQNHGB.mjs → chunk-YXUYWO2W.mjs} +4 -4
  76. package/dist/{chunk-7RAQNHGB.mjs.map → chunk-YXUYWO2W.mjs.map} +1 -1
  77. package/dist/components/AdvancedPickers.js +9 -9
  78. package/dist/components/AdvancedPickers.mjs +4 -4
  79. package/dist/components/AppShell.js +9 -9
  80. package/dist/components/AppShell.mjs +7 -7
  81. package/dist/components/Comments.js +7 -7
  82. package/dist/components/Comments.mjs +4 -4
  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 +12 -12
  88. package/dist/components/DataTable.mjs +5 -5
  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 +13 -13
  98. package/dist/components/InputsExtra.mjs +4 -4
  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 +5 -5
  116. package/dist/components/TimeAgo.mjs +3 -3
  117. package/dist/hooks/index.js +15 -15
  118. package/dist/hooks/index.mjs +3 -3
  119. package/dist/index.js +161 -161
  120. package/dist/index.mjs +30 -30
  121. package/dist/styles.css +1 -1
  122. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/AdvancedPickers.tsx"],"names":["format"],"mappings":"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","file":"chunk-Y32XBOIC.mjs","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { CalendarIcon, ChevronLeft, ChevronRight, ChevronDown, X, Check, Search } from './Icons';\nimport { resolveDateFormat, formatDate, parseDate, dateFormatPlaceholder, startOfMonth, addMonths, isSameDay, buildMonthGrid6, type DateFormat } from '../utils/dateFormat';\nimport { useLocale } from '../locale/LocaleProvider';\nimport { format as formatMsg } from '../locale/messages';\nimport { Portal } from './Portal';\nimport { usePopoverPosition } from '../hooks/usePopoverPosition';\nimport { useDismiss } from '../hooks/useDismiss';\n\n// ---------- MultiCombobox -----------------------------------------------\nexport interface MultiComboboxOption<T = string> {\n value: T;\n label: string;\n description?: string;\n disabled?: boolean;\n}\n\nexport interface MultiComboboxProps<T = string> {\n value: T[];\n onChange: (v: T[]) => void;\n options: MultiComboboxOption<T>[];\n placeholder?: string;\n emptyMessage?: string;\n filter?: (option: MultiComboboxOption<T>, query: string) => boolean;\n invalid?: boolean;\n disabled?: boolean;\n className?: string;\n id?: string;\n maxVisibleChips?: number;\n}\n\nconst dfilter = <T,>(o: MultiComboboxOption<T>, q: string) =>\n o.label.toLowerCase().includes(q.toLowerCase());\n\nexport function MultiCombobox<T = string>({\n value, onChange, options, placeholder,\n emptyMessage, filter = dfilter,\n invalid, disabled, className, id, maxVisibleChips = 3,\n}: MultiComboboxProps<T>) {\n const locale = useLocale();\n const ph = placeholder ?? locale['common.search'];\n const empty = emptyMessage ?? locale['common.noResults'];\n const [open, setOpen] = React.useState(false);\n const [query, setQuery] = React.useState('');\n const [active, setActive] = React.useState(0);\n const wrapRef = React.useRef<HTMLDivElement>(null);\n const inputRef = React.useRef<HTMLInputElement>(null);\n const listRef = React.useRef<HTMLUListElement>(null);\n const reactId = React.useId();\n const listboxId = `${id ?? reactId}-listbox`;\n // Build the lookup Set once per `value` change, not on every keystroke or\n // hover-driven re-render.\n const selSet = React.useMemo(() => new Set(value), [value]);\n\n const filtered = React.useMemo(\n () => (query ? options.filter((o) => filter(o, query)) : options),\n [options, query, filter]\n );\n\n const pos = usePopoverPosition(wrapRef, listRef, {\n open,\n side: 'bottom',\n align: 'start',\n offset: 4,\n matchAnchorWidth: true,\n });\n\n // Escape is handled by the input's onKeyDown; only outside-click here.\n useDismiss({\n open,\n onDismiss: () => setOpen(false),\n refs: [wrapRef, listRef],\n closeOnEscape: false,\n });\n\n const toggle = (v: T) => {\n if (selSet.has(v)) onChange(value.filter((x) => x !== v));\n else onChange([...value, v]);\n };\n\n const onKey = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'ArrowDown') { e.preventDefault(); setOpen(true); setActive((a) => Math.min(filtered.length - 1, a + 1)); }\n else if (e.key === 'ArrowUp') { e.preventDefault(); setActive((a) => Math.max(0, a - 1)); }\n else if (e.key === 'Enter') {\n e.preventDefault();\n const opt = filtered[active];\n if (opt && !opt.disabled) { toggle(opt.value); setQuery(''); }\n } else if (e.key === 'Escape') { setOpen(false); }\n else if (e.key === 'Backspace' && !query && value.length) { onChange(value.slice(0, -1)); }\n };\n\n const selectedItems = options.filter((o) => selSet.has(o.value));\n const visible = selectedItems.slice(0, maxVisibleChips);\n const overflow = selectedItems.length - visible.length;\n\n return (\n <div ref={wrapRef} className={cx('multicombo', invalid && 'is-invalid', disabled && 'is-disabled', className)}>\n <div className=\"multicombo__chips\" onClick={() => inputRef.current?.focus()}>\n {visible.map((o) => (\n <span key={String(o.value)} className=\"multicombo__chip\">\n {o.label}\n <button type=\"button\" aria-label={formatMsg(locale['combobox.remove'], { label: o.label })} onClick={(e) => { e.stopPropagation(); toggle(o.value); }}><X size={12} /></button>\n </span>\n ))}\n {overflow > 0 && <span className=\"multicombo__chip multicombo__chip--more\">+{overflow}</span>}\n <input\n ref={inputRef}\n id={id}\n type=\"text\"\n role=\"combobox\"\n aria-expanded={open}\n aria-controls={listboxId}\n className=\"multicombo__input\"\n placeholder={selectedItems.length === 0 ? ph : ''}\n disabled={disabled}\n value={query}\n onFocus={() => setOpen(true)}\n onChange={(e) => { setQuery(e.target.value); setOpen(true); setActive(0); }}\n onKeyDown={onKey}\n />\n </div>\n {open && (\n <Portal>\n <ul\n ref={listRef}\n id={listboxId}\n role=\"listbox\"\n aria-multiselectable=\"true\"\n className={cx('multicombo__list', 'is-floating')}\n style={{\n position: 'fixed',\n top: pos.top,\n left: pos.left,\n width: pos.width,\n visibility: pos.ready ? 'visible' : 'hidden',\n }}\n >\n {filtered.length === 0 ? (\n <li className=\"multicombo__empty\">{empty}</li>\n ) : (\n filtered.map((o, i) => {\n const checked = selSet.has(o.value);\n return (\n <li\n key={String(o.value)}\n role=\"option\"\n aria-selected={checked}\n aria-disabled={o.disabled}\n className={cx('multicombo__option', i === active && 'is-active', checked && 'is-selected', o.disabled && 'is-disabled')}\n onMouseEnter={() => setActive(i)}\n onMouseDown={(e) => { e.preventDefault(); if (!o.disabled) toggle(o.value); }}\n >\n <span className={cx('multicombo__check', checked && 'is-checked')} aria-hidden=\"true\">{checked ? <Check size={14} /> : null}</span>\n <span className=\"multicombo__option-body\">\n <span className=\"multicombo__option-label\">{o.label}</span>\n {o.description && <span className=\"multicombo__option-desc\">{o.description}</span>}\n </span>\n </li>\n );\n })\n )}\n </ul>\n </Portal>\n )}\n </div>\n );\n}\n\n// ---------- DateRangePicker --------------------------------------------\nexport interface DateRange { from: Date | null; to: Date | null }\n\nexport interface DateRangePickerProps {\n /** Controlled value. Omit to make the picker uncontrolled (see `defaultValue`). */\n value?: DateRange;\n /**\n * In legacy mode, fires on every day click. In apply mode (when `onApply` is\n * provided), fires only at apply time so a controlled `value` can stay in sync.\n */\n onChange?: (v: DateRange) => void;\n /** Initial value when uncontrolled. Ignored if `value` is provided. */\n defaultValue?: DateRange;\n /**\n * Opt-in: enables apply mode. Day clicks only mutate an internal draft; the\n * consumer is notified when the user confirms (button \"Apply\" or a preset).\n * Closing the popover without applying reverts the draft to the last applied\n * value. Useful when each commit triggers a server-side query.\n */\n onApply?: (v: DateRange) => void;\n /** Fires on open/close transitions. */\n onOpenChange?: (open: boolean) => void;\n minDate?: Date;\n maxDate?: Date;\n /**\n * Disable arbitrary days (holidays, blackout dates, specific weekdays). A\n * day for which this returns `true` renders disabled — greyed, not\n * focusable, not clickable. Composes with `minDate`/`maxDate`. A range\n * endpoint can never land on a disabled day; a disabled day that falls\n * inside an otherwise-valid span stays greyed but is included visually\n * (the span is allowed). E.g. disable Sundays: `d => d.getDay() === 0`.\n */\n isDateDisabled?: (date: Date) => boolean;\n presets?: Array<{ label: string; range: () => DateRange }>;\n invalid?: boolean;\n disabled?: boolean;\n className?: string;\n id?: string;\n /**\n * Display format. Default `'auto'` derives from `configureBrand().locale`.\n */\n format?: DateFormat;\n /**\n * Report-grade: show editable \"Desde\"/\"Hasta\" text inputs above the calendar\n * so the user can type an exact range. Off by default — a simple filter is\n * usually fine with presets + clicking.\n */\n showInputs?: boolean;\n /**\n * Report-grade: replace the static month title with a \"MMMM de YYYY ▾\" button\n * that opens a month/year jump menu (instead of clicking the arrows N times).\n */\n monthDropdown?: boolean;\n /** Number of month panels. Default `2`; `1` is the compact single-month layout. */\n months?: 1 | 2;\n /**\n * Start with a preset active (by its label, e.g. `\"Este mes\"`). Must match a\n * `presets` entry — the picker initializes the range to that preset and shows\n * its name on the trigger. Uncontrolled init only (when controlled, drive\n * `value` yourself; this still sets the initial trigger name). Ignored if it\n * doesn't match any preset.\n */\n defaultPreset?: string;\n}\n\nconst EMPTY_RANGE: DateRange = { from: null, to: null };\n\n// ---------- Common date-range presets -----------------------------------\nexport type DateRangePresetKey =\n | 'today' | 'yesterday' | 'thisWeek' | 'lastWeek'\n | 'thisMonth' | 'lastMonth' | 'thisYear' | 'lastYear';\n\nexport interface DateRangePresetItem {\n key: DateRangePresetKey;\n label: string;\n range: () => DateRange;\n}\n\nconst DEFAULT_PRESET_LABELS: Record<DateRangePresetKey, string> = {\n today: 'Hoy', yesterday: 'Ayer', thisWeek: 'Esta semana', lastWeek: 'Semana anterior',\n thisMonth: 'Este mes', lastMonth: 'Mes anterior', thisYear: 'Este año', lastYear: 'Año anterior',\n};\n\nconst PRESET_ORDER: DateRangePresetKey[] = [\n 'today', 'yesterday', 'thisWeek', 'lastWeek', 'thisMonth', 'lastMonth', 'thisYear', 'lastYear',\n];\n\n// Local-midnight helpers so the ranges are date-only (no time component).\nconst midnight = (d: Date): Date => new Date(d.getFullYear(), d.getMonth(), d.getDate());\nconst shiftDays = (d: Date, days: number): Date => new Date(d.getFullYear(), d.getMonth(), d.getDate() + days);\nconst mondayOf = (d: Date): Date => shiftDays(d, -((d.getDay() + 6) % 7)); // Monday = week start\n\n// \"This …\" spans from the start of the period to today; \"… anterior\" is the full\n// previous period. Evaluated lazily (on click) so they're always relative to now.\nconst PRESET_RANGES: Record<DateRangePresetKey, () => DateRange> = {\n today: () => { const t = midnight(new Date()); return { from: t, to: t }; },\n yesterday: () => { const y = shiftDays(midnight(new Date()), -1); return { from: y, to: y }; },\n thisWeek: () => { const t = midnight(new Date()); return { from: mondayOf(t), to: t }; },\n lastWeek: () => { const m = mondayOf(midnight(new Date())); return { from: shiftDays(m, -7), to: shiftDays(m, -1) }; },\n thisMonth: () => { const t = midnight(new Date()); return { from: new Date(t.getFullYear(), t.getMonth(), 1), to: t }; },\n lastMonth: () => { const t = new Date(); return { from: new Date(t.getFullYear(), t.getMonth() - 1, 1), to: new Date(t.getFullYear(), t.getMonth(), 0) }; },\n thisYear: () => { const t = midnight(new Date()); return { from: new Date(t.getFullYear(), 0, 1), to: t }; },\n lastYear: () => { const t = new Date(); return { from: new Date(t.getFullYear() - 1, 0, 1), to: new Date(t.getFullYear() - 1, 11, 31) }; },\n};\n\nexport interface DateRangePresetsOptions {\n /** Pick a subset and order. Default: all eight in a sensible order. */\n include?: DateRangePresetKey[];\n /** Override labels (e.g. for i18n). Defaults are Spanish. */\n labels?: Partial<Record<DateRangePresetKey, string>>;\n}\n\n/**\n * The common analytics date-range presets (Bsale-style): today, yesterday,\n * this/last week, this/last month, this/last year. Pass straight to\n * `<DateRangePicker presets={dateRangePresets()} />` so consumers don't\n * re-derive the (fiddly) \"previous week/month\" boundaries each time.\n */\nexport function dateRangePresets(opts: DateRangePresetsOptions = {}): DateRangePresetItem[] {\n return (opts.include ?? PRESET_ORDER).map((key) => ({\n key,\n label: opts.labels?.[key] ?? DEFAULT_PRESET_LABELS[key],\n range: PRESET_RANGES[key],\n }));\n}\n\nexport function DateRangePicker({\n value, onChange, defaultValue, onApply, onOpenChange,\n minDate, maxDate, isDateDisabled, presets,\n invalid, disabled, className, id, format = 'auto',\n showInputs = false, monthDropdown = false, months = 2, defaultPreset,\n}: DateRangePickerProps) {\n const locale = useLocale();\n const weekdays = locale['picker.weekdaysShort'];\n const monthNames = locale['calendar.months'];\n const fmt = resolveDateFormat(format);\n const isControlled = value !== undefined;\n const applyMode = !!onApply;\n // `defaultPreset` (by label) seeds the initial range + the trigger name. For an\n // uncontrolled picker it also sets the initial dates; controlled callers drive\n // `value` and this only sets the initial name.\n const matchedPreset = defaultPreset ? presets?.find((p) => p.label === defaultPreset) : undefined;\n const initial = isControlled\n ? (value as DateRange)\n : (matchedPreset ? matchedPreset.range() : (defaultValue ?? EMPTY_RANGE));\n const [draft, setDraft] = React.useState<DateRange>(initial);\n const [lastApplied, setLastApplied] = React.useState<DateRange>(initial);\n // Resync draft/lastApplied when controlled `value` changes externally.\n const vFrom = value?.from?.getTime() ?? 0;\n const vTo = value?.to?.getTime() ?? 0;\n React.useEffect(() => {\n if (!isControlled) return;\n setDraft(value as DateRange);\n setLastApplied(value as DateRange);\n }, [isControlled, vFrom, vTo]);\n // Legacy-controlled (no `onApply`) keeps prior semantics: `value` drives render\n // directly. Otherwise the draft is truth.\n const current: DateRange = isControlled && !applyMode ? (value as DateRange) : draft;\n // The trigger label shows the last-committed range in apply mode; in legacy it\n // tracks `current` (so live edits stay reflected, as before).\n const displayed: DateRange = applyMode ? lastApplied : current;\n const [open, setOpen] = React.useState(false);\n const [view, setView] = React.useState(() => startOfMonth(initial.from ?? new Date()));\n const [hover, setHover] = React.useState<Date | null>(null);\n // Editable-inputs (showInputs) mirror the current range; the month-jump menu\n // (monthDropdown) tracks a year while the user browses it.\n const [fromText, setFromText] = React.useState('');\n const [toText, setToText] = React.useState('');\n const [menuOpen, setMenuOpen] = React.useState(false);\n const [menuYear, setMenuYear] = React.useState(() => view.getFullYear());\n // The label of the preset that produced the current value (so the trigger can\n // show \"Este mes\" instead of the date range). Seeded from `defaultPreset`;\n // cleared on any manual change.\n const [appliedPreset, setAppliedPreset] = React.useState<string | null>(matchedPreset?.label ?? null);\n const wrapRef = React.useRef<HTMLDivElement>(null);\n const popoverRef = React.useRef<HTMLDivElement>(null);\n const triggerRef = React.useRef<HTMLButtonElement>(null);\n\n // Portaled to body (escapes overflow ancestors) with flip/clamp and\n // scroll/resize reposition; Escape and outside-click return focus to the\n // trigger (a11y) — same primitive as MultiCombobox above.\n const pos = usePopoverPosition(wrapRef, popoverRef, {\n open,\n side: 'bottom',\n align: 'start',\n offset: 6,\n });\n\n const closeWithoutCommit = React.useCallback(() => {\n if (applyMode) setDraft(lastApplied);\n setOpen(false);\n onOpenChange?.(false);\n }, [applyMode, lastApplied, onOpenChange]);\n\n useDismiss({\n open,\n onDismiss: closeWithoutCommit,\n refs: [wrapRef, popoverRef],\n returnFocusRef: triggerRef,\n });\n\n // Each panel renders ~42 Date cells. Without memoization, every\n // setHover() triggered a full rebuild of both panels' grids on every\n // mouse movement over the calendar. Memo keyed on `view` only.\n const monthGrid0 = React.useMemo(() => buildMonthGrid6(view, 0), [view]);\n const monthGrid1 = React.useMemo(() => buildMonthGrid6(view, 1), [view]);\n\n const isDisabled = (d: Date) =>\n !!(\n (minDate && d < new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate())) ||\n (maxDate && d > new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate())) ||\n isDateDisabled?.(d)\n );\n\n const inRange = (d: Date) => {\n if (!current.from) return false;\n const end = current.to ?? hover;\n if (!end) return isSameDay(d, current.from);\n const a = current.from < end ? current.from : end;\n const b = current.from < end ? end : current.from;\n return d >= new Date(a.getFullYear(), a.getMonth(), a.getDate()) &&\n d <= new Date(b.getFullYear(), b.getMonth(), b.getDate());\n };\n\n // Ordered span ends (handles hover-preview when `to` is still null). Drives the\n // continuous-band rounding: a cell rounds left at `a`/week-start, right at\n // `b`/week-end.\n const spanBounds = (): { a: Date; b: Date } | null => {\n if (!current.from) return null;\n const end = current.to ?? hover;\n if (!end) return { a: current.from, b: current.from };\n return current.from <= end ? { a: current.from, b: end } : { a: end, b: current.from };\n };\n\n // Apply a new range honoring apply/legacy mode (same split as a day click).\n const setRange = (next: DateRange) => {\n if (applyMode) setDraft(next);\n else { onChange?.(next); setAppliedPreset(null); }\n };\n\n // Keep the editable inputs in sync with the current range.\n const curFrom = current.from?.getTime() ?? 0;\n const curTo = current.to?.getTime() ?? 0;\n React.useEffect(() => {\n setFromText(current.from ? formatDate(current.from, fmt) : '');\n setToText(current.to ? formatDate(current.to, fmt) : '');\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [curFrom, curTo, fmt]);\n\n const commitInput = (which: 'from' | 'to', text: string) => {\n const parsed = parseDate(text, fmt);\n if (!parsed || isDisabled(parsed)) {\n // Revert the field to the current value's formatted form.\n if (which === 'from') setFromText(current.from ? formatDate(current.from, fmt) : '');\n else setToText(current.to ? formatDate(current.to, fmt) : '');\n return;\n }\n const next: DateRange = which === 'from'\n ? (current.to && current.to < parsed ? { from: current.to, to: parsed } : { from: parsed, to: current.to })\n : (current.from && parsed < current.from ? { from: parsed, to: current.from } : { from: current.from, to: parsed });\n setRange(next);\n setView(startOfMonth(parsed));\n };\n\n const jumpToMonth = (monthIndex: number) => {\n setView(new Date(menuYear, monthIndex, 1));\n setMenuOpen(false);\n };\n\n const click = (d: Date) => {\n let next: DateRange;\n if (!current.from || (current.from && current.to)) next = { from: d, to: null };\n else {\n const from = current.from;\n next = d < from ? { from: d, to: from } : { from, to: d };\n }\n // A manual day click in legacy mode commits immediately → drop any preset\n // name. In apply mode it only mutates the draft; the applied preset (shown on\n // the trigger) changes only when the user actually applies.\n if (applyMode) setDraft(next);\n else { onChange?.(next); setAppliedPreset(null); }\n };\n\n // Commits a range and closes. In apply mode this fires `onApply` (and `onChange`\n // when controlled, to keep `value` in sync). In legacy mode, only preset commits\n // propagate via `onChange`; the bare \"Apply\" button stays close-only as before.\n const commit = (next: DateRange, fromPreset = false, presetLabel: string | null = null) => {\n setAppliedPreset(fromPreset ? presetLabel : null);\n if (applyMode) {\n onApply!(next);\n setLastApplied(next);\n setDraft(next);\n if (isControlled) onChange?.(next);\n } else if (fromPreset) {\n onChange?.(next);\n }\n setOpen(false);\n onOpenChange?.(false);\n };\n\n const clear = () => {\n // \"Limpiar\" resetea el FILTRO, no solo el draft: en apply mode commitea el\n // rango vacío (dispara onApply + cierra). Antes solo reseteaba el draft y,\n // como \"Aplicar\" exige from+to, el estado limpio nunca se podía aplicar →\n // no se podía volver a \"sin filtro\".\n if (applyMode) commit(EMPTY_RANGE);\n else { onChange?.(EMPTY_RANGE); setAppliedPreset(null); }\n };\n\n const toggleOpen = () => {\n if (open) closeWithoutCommit();\n else { setOpen(true); onOpenChange?.(true); }\n };\n\n // Show the active preset's name (like Bsale) when one is applied; otherwise the\n // date range, or the placeholder when empty.\n const label = appliedPreset && displayed.from\n ? appliedPreset\n : displayed.from\n ? displayed.to\n ? `${formatDate(displayed.from, fmt)} → ${formatDate(displayed.to, fmt)}`\n : `${formatDate(displayed.from, fmt)} → …`\n : locale['picker.selectRange'];\n\n const renderMonth = (offset: number) => {\n const { month: m, cells } = offset === 0 ? monthGrid0 : monthGrid1;\n const bounds = spanBounds();\n // Only paint the band for a real (multi-day) span; a lone endpoint shows\n // just its circle.\n const isMultiDay = !!bounds && !isSameDay(bounds.a, bounds.b);\n return (\n <div className=\"daterange__month\">\n {/* The dropdown owns the month label when enabled; otherwise a static title. */}\n {!monthDropdown && <div className=\"daterange__title\">{monthNames[m.getMonth()]} {m.getFullYear()}</div>}\n <div className=\"daterange__grid\">\n {weekdays.map((w, i) => <span key={i} className=\"daterange__dow\">{w}</span>)}\n {cells.map(({ date: d, outside }, i) => {\n // Adjacent-month days: greyed, non-interactive context (keeps the grid\n // at a fixed 6 rows so the height never jumps).\n if (outside) return <span key={i} className=\"daterange__day is-outside\" aria-hidden=\"true\">{d.getDate()}</span>;\n const sel = (current.from && isSameDay(d, current.from)) || (current.to && isSameDay(d, current.to));\n const band = inRange(d) && isMultiDay;\n // Column 0 = Monday, 6 = Sunday (the 7 weekday headers offset by a\n // multiple of 7, so `i % 7` is the column).\n const col = i % 7;\n const leftEnd = band && !!bounds && isSameDay(d, bounds.a);\n const rightEnd = band && !!bounds && isSameDay(d, bounds.b);\n // Square model: round the outer corners only at the range ends and the\n // row edges (everything radius-sm); interior cells stay square and\n // bridge the gap. A lone selected day (no multi-day band) rounds all\n // four. is-rl/is-rr round both the band and the endpoint block.\n const roundL = band ? (col === 0 || leftEnd) : !!sel;\n const roundR = band ? (col === 6 || rightEnd) : !!sel;\n const today = isSameDay(d, new Date());\n const off = isDisabled(d);\n return (\n <button\n key={i}\n type=\"button\"\n className={cx(\n 'daterange__day',\n sel && 'is-selected',\n band && 'is-band',\n roundL && 'is-rl',\n roundR && 'is-rr',\n today && 'is-today',\n off && 'is-disabled',\n )}\n disabled={!!off}\n onMouseEnter={() => setHover(d)}\n onClick={() => click(d)}\n >{d.getDate()}</button>\n );\n })}\n </div>\n </div>\n );\n };\n\n // Month/year jump menu (monthDropdown). Inline (not a Portal) — it lives inside\n // the already-portaled popover and is dismissed by selecting a month.\n const renderMonthMenu = () => (\n <div className=\"daterange__menu\" role=\"dialog\" aria-label={locale['daterange.jumpMonth']}>\n <div className=\"daterange__menu-year\">\n <button type=\"button\" onClick={() => setMenuYear((y) => y - 1)} aria-label={locale['picker.prevYear']}><ChevronLeft size={16} /></button>\n <span>{menuYear}</span>\n <button type=\"button\" onClick={() => setMenuYear((y) => y + 1)} aria-label={locale['picker.nextYear']}><ChevronRight size={16} /></button>\n </div>\n <div className=\"daterange__menu-grid\">\n {monthNames.map((name, idx) => (\n <button\n type=\"button\"\n key={name}\n className={cx('daterange__menu-month', view.getMonth() === idx && view.getFullYear() === menuYear && 'is-current')}\n onClick={() => jumpToMonth(idx)}\n >{name.slice(0, 3)}</button>\n ))}\n </div>\n </div>\n );\n\n return (\n <div ref={wrapRef} className={cx('daterange', invalid && 'is-invalid', disabled && 'is-disabled', className)}>\n <button\n ref={triggerRef}\n id={id}\n type=\"button\"\n className=\"daterange__trigger\"\n disabled={disabled}\n onClick={toggleOpen}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n >\n <span className=\"daterange__icon\" aria-hidden=\"true\"><CalendarIcon size={16} /></span>\n <span>{label}</span>\n </button>\n {open && (\n <Portal>\n <div\n ref={popoverRef}\n className={cx('daterange__popover', 'is-floating', months === 1 && 'daterange__popover--compact')}\n role=\"dialog\"\n onMouseLeave={() => setHover(null)}\n style={{\n position: 'fixed',\n top: pos.top,\n left: pos.left,\n visibility: pos.ready ? 'visible' : 'hidden',\n }}\n >\n {presets && presets.length > 0 && (\n <ul className=\"daterange__presets\">\n {presets.map((p, i) => (\n <li key={i}>\n <button type=\"button\" className={cx(appliedPreset === p.label && 'is-active')} onClick={() => commit(p.range(), true, p.label)}>{p.label}</button>\n </li>\n ))}\n </ul>\n )}\n <div className=\"daterange__panes\">\n {showInputs && (\n <div className=\"daterange__inputs\">\n <label className=\"daterange__field\">\n <span className=\"daterange__field-label\">{locale['daterange.from']}</span>\n <input\n type=\"text\"\n className=\"daterange__field-input\"\n // Cap the input's intrinsic width to the format length so the\n // inputs row doesn't balloon wider than the calendar (the\n // panes then hugs the calendar into a tight square).\n size={dateFormatPlaceholder(fmt).length + 1}\n value={fromText}\n placeholder={dateFormatPlaceholder(fmt)}\n onChange={(e) => setFromText(e.target.value)}\n onBlur={(e) => commitInput('from', e.target.value)}\n onKeyDown={(e) => { if (e.key === 'Enter') commitInput('from', (e.target as HTMLInputElement).value); }}\n />\n </label>\n <label className=\"daterange__field\">\n <span className=\"daterange__field-label\">{locale['daterange.to']}</span>\n <input\n type=\"text\"\n className=\"daterange__field-input\"\n size={dateFormatPlaceholder(fmt).length + 1}\n value={toText}\n placeholder={dateFormatPlaceholder(fmt)}\n onChange={(e) => setToText(e.target.value)}\n onBlur={(e) => commitInput('to', e.target.value)}\n onKeyDown={(e) => { if (e.key === 'Enter') commitInput('to', (e.target as HTMLInputElement).value); }}\n />\n </label>\n </div>\n )}\n <div className=\"daterange__nav\">\n <button type=\"button\" onClick={() => setView((v) => addMonths(v, -1))} aria-label={locale['calendar.prevMonth']}><ChevronLeft size={16} /></button>\n {monthDropdown ? (\n <div className=\"daterange__monthjump\">\n <button\n type=\"button\"\n className=\"daterange__monthjump-trigger\"\n onClick={() => { setMenuYear(view.getFullYear()); setMenuOpen((o) => !o); }}\n aria-haspopup=\"dialog\"\n aria-expanded={menuOpen}\n >\n <span>{monthNames[view.getMonth()]} {view.getFullYear()}</span>\n <ChevronDown size={16} aria-hidden />\n </button>\n {menuOpen && renderMonthMenu()}\n </div>\n ) : (\n <span />\n )}\n <button type=\"button\" onClick={() => setView((v) => addMonths(v, 1))} aria-label={locale['calendar.nextMonth']}><ChevronRight size={16} /></button>\n </div>\n <div className={cx('daterange__months', months === 1 && 'daterange__months--single')}>\n {renderMonth(0)}\n {months === 2 && renderMonth(1)}\n </div>\n <div className=\"daterange__actions\">\n <button type=\"button\" className=\"daterange__clear\" onClick={clear}>{locale['common.clear']}</button>\n <button type=\"button\" className=\"daterange__apply\" onClick={() => commit(current)} disabled={!current.from || !current.to}>{locale['common.apply']}</button>\n </div>\n </div>\n </div>\n </Portal>\n )}\n </div>\n );\n}\n\n// ---------- Command Palette (⌘K) ----------------------------------------\nexport interface CommandItem {\n id: string;\n label: string;\n description?: string;\n group?: string;\n icon?: React.ReactNode;\n shortcut?: string;\n keywords?: string[];\n onRun: () => void;\n}\n\nexport interface CommandPaletteProps {\n open: boolean;\n onClose: () => void;\n items: CommandItem[];\n placeholder?: string;\n emptyMessage?: string;\n hotkey?: string; // 'mod+k'\n}\n\nfunction matchesHotkey(e: KeyboardEvent, hk: string) {\n const parts = hk.toLowerCase().split('+');\n const key = parts[parts.length - 1];\n const mods = parts.slice(0, -1);\n if (e.key.toLowerCase() !== key) return false;\n for (const m of mods) {\n if (m === 'mod' && !(e.metaKey || e.ctrlKey)) return false;\n if (m === 'ctrl' && !e.ctrlKey) return false;\n if (m === 'meta' && !e.metaKey) return false;\n if (m === 'shift' && !e.shiftKey) return false;\n if (m === 'alt' && !e.altKey) return false;\n }\n return true;\n}\n\nexport function CommandPalette({\n open, onClose, items,\n placeholder,\n emptyMessage,\n}: CommandPaletteProps) {\n const locale = useLocale();\n const ph = placeholder ?? locale['picker.searchCommands'];\n const empty = emptyMessage ?? locale['common.noResults'];\n const [query, setQuery] = React.useState('');\n const [active, setActive] = React.useState(0);\n const inputRef = React.useRef<HTMLInputElement>(null);\n const listRef = React.useRef<HTMLUListElement>(null);\n\n const filtered = React.useMemo(() => {\n const q = query.trim().toLowerCase();\n if (!q) return items;\n return items.filter((it) => {\n const hay = [it.label, it.description, it.group, ...(it.keywords ?? [])].join(' ').toLowerCase();\n return hay.includes(q);\n });\n }, [items, query]);\n\n // group preserve order\n const grouped = React.useMemo(() => {\n const order: string[] = [];\n const map = new Map<string, CommandItem[]>();\n for (const it of filtered) {\n const g = it.group ?? '';\n if (!map.has(g)) { map.set(g, []); order.push(g); }\n map.get(g)!.push(it);\n }\n return { order, map };\n }, [filtered]);\n\n const flat = filtered;\n\n React.useEffect(() => {\n if (open) {\n setQuery(''); setActive(0);\n requestAnimationFrame(() => inputRef.current?.focus());\n }\n }, [open]);\n\n React.useEffect(() => { setActive(0); }, [query]);\n\n React.useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n else if (e.key === 'ArrowDown') { e.preventDefault(); setActive((a) => Math.min(flat.length - 1, a + 1)); }\n else if (e.key === 'ArrowUp') { e.preventDefault(); setActive((a) => Math.max(0, a - 1)); }\n else if (e.key === 'Enter') {\n e.preventDefault();\n const it = flat[active];\n if (it) { it.onRun(); onClose(); }\n }\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [open, flat, active, onClose]);\n\n React.useEffect(() => {\n const el = listRef.current?.querySelector(`[data-cmd-idx=\"${active}\"]`);\n el?.scrollIntoView({ block: 'nearest' });\n }, [active]);\n\n if (!open) return null;\n let idx = -1;\n return (\n <div className=\"cmdk__overlay\" role=\"dialog\" aria-modal=\"true\" aria-label={locale['picker.commandPalette']} onMouseDown={(e) => { if (e.target === e.currentTarget) onClose(); }}>\n <div className=\"cmdk__panel\">\n <div className=\"cmdk__searchbar\">\n <span className=\"cmdk__icon\" aria-hidden=\"true\"><Search size={16} /></span>\n <input\n ref={inputRef}\n className=\"cmdk__input\"\n value={query}\n placeholder={ph}\n onChange={(e) => setQuery(e.target.value)}\n />\n <kbd className=\"cmdk__esc\">Esc</kbd>\n </div>\n <ul ref={listRef} className=\"cmdk__list\" role=\"listbox\">\n {flat.length === 0 && <li className=\"cmdk__empty\">{empty}</li>}\n {grouped.order.map((g) => (\n <React.Fragment key={g || '__none'}>\n {g && <li className=\"cmdk__group\" aria-hidden=\"true\">{g}</li>}\n {grouped.map.get(g)!.map((it) => {\n idx++;\n const i = idx;\n return (\n <li\n key={it.id}\n role=\"option\"\n aria-selected={i === active}\n data-cmd-idx={i}\n className={cx('cmdk__item', i === active && 'is-active')}\n onMouseEnter={() => setActive(i)}\n onMouseDown={(e) => { e.preventDefault(); it.onRun(); onClose(); }}\n >\n {it.icon && <span className=\"cmdk__item-icon\" aria-hidden=\"true\">{it.icon}</span>}\n <span className=\"cmdk__item-body\">\n <span className=\"cmdk__item-label\">{it.label}</span>\n {it.description && <span className=\"cmdk__item-desc\">{it.description}</span>}\n </span>\n {it.shortcut && <kbd className=\"cmdk__kbd\">{it.shortcut}</kbd>}\n </li>\n );\n })}\n </React.Fragment>\n ))}\n </ul>\n </div>\n </div>\n );\n}\n\nexport interface UseCommandPaletteOptions {\n hotkey?: string; // default 'mod+k'\n}\n\nexport function useCommandPalette({ hotkey = 'mod+k' }: UseCommandPaletteOptions = {}) {\n const [open, setOpen] = React.useState(false);\n React.useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (matchesHotkey(e, hotkey)) {\n e.preventDefault();\n setOpen((o) => !o);\n }\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [hotkey]);\n return { open, setOpen, close: () => setOpen(false), toggle: () => setOpen((o) => !o) };\n}\n"]}
1
+ {"version":3,"sources":["../src/components/AdvancedPickers.tsx"],"names":["format"],"mappings":"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","file":"chunk-TJ5LRNVT.mjs","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { CalendarIcon, ChevronLeft, ChevronRight, ChevronDown, X, Check, Search } from './Icons';\nimport { resolveDateFormat, formatDate, parseDate, dateFormatPlaceholder, startOfMonth, addMonths, isSameDay, buildMonthGrid6, type DateFormat } from '../utils/dateFormat';\nimport { useLocale } from '../locale/LocaleProvider';\nimport { format as formatMsg } from '../locale/messages';\nimport { Portal } from './Portal';\nimport { usePopoverPosition } from '../hooks/usePopoverPosition';\nimport { useDismiss } from '../hooks/useDismiss';\n\n// ---------- MultiCombobox -----------------------------------------------\nexport interface MultiComboboxOption<T = string> {\n value: T;\n label: string;\n description?: string;\n disabled?: boolean;\n}\n\nexport interface MultiComboboxProps<T = string> {\n value: T[];\n onChange: (v: T[]) => void;\n options: MultiComboboxOption<T>[];\n placeholder?: string;\n emptyMessage?: string;\n filter?: (option: MultiComboboxOption<T>, query: string) => boolean;\n invalid?: boolean;\n disabled?: boolean;\n className?: string;\n id?: string;\n maxVisibleChips?: number;\n}\n\nconst dfilter = <T,>(o: MultiComboboxOption<T>, q: string) =>\n o.label.toLowerCase().includes(q.toLowerCase());\n\nexport function MultiCombobox<T = string>({\n value, onChange, options, placeholder,\n emptyMessage, filter = dfilter,\n invalid, disabled, className, id, maxVisibleChips = 3,\n}: MultiComboboxProps<T>) {\n const locale = useLocale();\n const ph = placeholder ?? locale['common.search'];\n const empty = emptyMessage ?? locale['common.noResults'];\n const [open, setOpen] = React.useState(false);\n const [query, setQuery] = React.useState('');\n const [active, setActive] = React.useState(0);\n const wrapRef = React.useRef<HTMLDivElement>(null);\n const inputRef = React.useRef<HTMLInputElement>(null);\n const listRef = React.useRef<HTMLUListElement>(null);\n const reactId = React.useId();\n const listboxId = `${id ?? reactId}-listbox`;\n // Build the lookup Set once per `value` change, not on every keystroke or\n // hover-driven re-render.\n const selSet = React.useMemo(() => new Set(value), [value]);\n\n const filtered = React.useMemo(\n () => (query ? options.filter((o) => filter(o, query)) : options),\n [options, query, filter]\n );\n\n const pos = usePopoverPosition(wrapRef, listRef, {\n open,\n side: 'bottom',\n align: 'start',\n offset: 4,\n matchAnchorWidth: true,\n });\n\n // Escape is handled by the input's onKeyDown; only outside-click here.\n useDismiss({\n open,\n onDismiss: () => setOpen(false),\n refs: [wrapRef, listRef],\n closeOnEscape: false,\n });\n\n const toggle = (v: T) => {\n if (selSet.has(v)) onChange(value.filter((x) => x !== v));\n else onChange([...value, v]);\n };\n\n const onKey = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'ArrowDown') { e.preventDefault(); setOpen(true); setActive((a) => Math.min(filtered.length - 1, a + 1)); }\n else if (e.key === 'ArrowUp') { e.preventDefault(); setActive((a) => Math.max(0, a - 1)); }\n else if (e.key === 'Enter') {\n e.preventDefault();\n const opt = filtered[active];\n if (opt && !opt.disabled) { toggle(opt.value); setQuery(''); }\n } else if (e.key === 'Escape') { setOpen(false); }\n else if (e.key === 'Backspace' && !query && value.length) { onChange(value.slice(0, -1)); }\n };\n\n const selectedItems = options.filter((o) => selSet.has(o.value));\n const visible = selectedItems.slice(0, maxVisibleChips);\n const overflow = selectedItems.length - visible.length;\n\n return (\n <div ref={wrapRef} className={cx('multicombo', invalid && 'is-invalid', disabled && 'is-disabled', className)}>\n <div className=\"multicombo__chips\" onClick={() => inputRef.current?.focus()}>\n {visible.map((o) => (\n <span key={String(o.value)} className=\"multicombo__chip\">\n {o.label}\n <button type=\"button\" aria-label={formatMsg(locale['combobox.remove'], { label: o.label })} onClick={(e) => { e.stopPropagation(); toggle(o.value); }}><X size={12} /></button>\n </span>\n ))}\n {overflow > 0 && <span className=\"multicombo__chip multicombo__chip--more\">+{overflow}</span>}\n <input\n ref={inputRef}\n id={id}\n type=\"text\"\n role=\"combobox\"\n aria-expanded={open}\n aria-controls={listboxId}\n className=\"multicombo__input\"\n placeholder={selectedItems.length === 0 ? ph : ''}\n disabled={disabled}\n value={query}\n onFocus={() => setOpen(true)}\n onChange={(e) => { setQuery(e.target.value); setOpen(true); setActive(0); }}\n onKeyDown={onKey}\n />\n </div>\n {open && (\n <Portal>\n <ul\n ref={listRef}\n id={listboxId}\n role=\"listbox\"\n aria-multiselectable=\"true\"\n className={cx('multicombo__list', 'is-floating')}\n style={{\n position: 'fixed',\n top: pos.top,\n left: pos.left,\n width: pos.width,\n visibility: pos.ready ? 'visible' : 'hidden',\n }}\n >\n {filtered.length === 0 ? (\n <li className=\"multicombo__empty\">{empty}</li>\n ) : (\n filtered.map((o, i) => {\n const checked = selSet.has(o.value);\n return (\n <li\n key={String(o.value)}\n role=\"option\"\n aria-selected={checked}\n aria-disabled={o.disabled}\n className={cx('multicombo__option', i === active && 'is-active', checked && 'is-selected', o.disabled && 'is-disabled')}\n onMouseEnter={() => setActive(i)}\n onMouseDown={(e) => { e.preventDefault(); if (!o.disabled) toggle(o.value); }}\n >\n <span className={cx('multicombo__check', checked && 'is-checked')} aria-hidden=\"true\">{checked ? <Check size={14} /> : null}</span>\n <span className=\"multicombo__option-body\">\n <span className=\"multicombo__option-label\">{o.label}</span>\n {o.description && <span className=\"multicombo__option-desc\">{o.description}</span>}\n </span>\n </li>\n );\n })\n )}\n </ul>\n </Portal>\n )}\n </div>\n );\n}\n\n// ---------- DateRangePicker --------------------------------------------\nexport interface DateRange { from: Date | null; to: Date | null }\n\nexport interface DateRangePickerProps {\n /** Controlled value. Omit to make the picker uncontrolled (see `defaultValue`). */\n value?: DateRange;\n /**\n * In legacy mode, fires on every day click. In apply mode (when `onApply` is\n * provided), fires only at apply time so a controlled `value` can stay in sync.\n */\n onChange?: (v: DateRange) => void;\n /** Initial value when uncontrolled. Ignored if `value` is provided. */\n defaultValue?: DateRange;\n /**\n * Opt-in: enables apply mode. Day clicks only mutate an internal draft; the\n * consumer is notified when the user confirms (button \"Apply\" or a preset).\n * Closing the popover without applying reverts the draft to the last applied\n * value. Useful when each commit triggers a server-side query.\n */\n onApply?: (v: DateRange) => void;\n /** Fires on open/close transitions. */\n onOpenChange?: (open: boolean) => void;\n minDate?: Date;\n maxDate?: Date;\n /**\n * Disable arbitrary days (holidays, blackout dates, specific weekdays). A\n * day for which this returns `true` renders disabled — greyed, not\n * focusable, not clickable. Composes with `minDate`/`maxDate`. A range\n * endpoint can never land on a disabled day; a disabled day that falls\n * inside an otherwise-valid span stays greyed but is included visually\n * (the span is allowed). E.g. disable Sundays: `d => d.getDay() === 0`.\n */\n isDateDisabled?: (date: Date) => boolean;\n presets?: Array<{ label: string; range: () => DateRange }>;\n invalid?: boolean;\n disabled?: boolean;\n className?: string;\n id?: string;\n /**\n * Display format. Default `'auto'` derives from `configureBrand().locale`.\n */\n format?: DateFormat;\n /**\n * Report-grade: show editable \"Desde\"/\"Hasta\" text inputs above the calendar\n * so the user can type an exact range. Off by default — a simple filter is\n * usually fine with presets + clicking.\n */\n showInputs?: boolean;\n /**\n * Report-grade: replace the static month title with a \"MMMM de YYYY ▾\" button\n * that opens a month/year jump menu (instead of clicking the arrows N times).\n */\n monthDropdown?: boolean;\n /** Number of month panels. Default `2`; `1` is the compact single-month layout. */\n months?: 1 | 2;\n /**\n * Start with a preset active (by its label, e.g. `\"Este mes\"`). Must match a\n * `presets` entry — the picker initializes the range to that preset and shows\n * its name on the trigger. Uncontrolled init only (when controlled, drive\n * `value` yourself; this still sets the initial trigger name). Ignored if it\n * doesn't match any preset.\n */\n defaultPreset?: string;\n}\n\nconst EMPTY_RANGE: DateRange = { from: null, to: null };\n\n// ---------- Common date-range presets -----------------------------------\nexport type DateRangePresetKey =\n | 'today' | 'yesterday' | 'thisWeek' | 'lastWeek'\n | 'thisMonth' | 'lastMonth' | 'thisYear' | 'lastYear';\n\nexport interface DateRangePresetItem {\n key: DateRangePresetKey;\n label: string;\n range: () => DateRange;\n}\n\nconst DEFAULT_PRESET_LABELS: Record<DateRangePresetKey, string> = {\n today: 'Hoy', yesterday: 'Ayer', thisWeek: 'Esta semana', lastWeek: 'Semana anterior',\n thisMonth: 'Este mes', lastMonth: 'Mes anterior', thisYear: 'Este año', lastYear: 'Año anterior',\n};\n\nconst PRESET_ORDER: DateRangePresetKey[] = [\n 'today', 'yesterday', 'thisWeek', 'lastWeek', 'thisMonth', 'lastMonth', 'thisYear', 'lastYear',\n];\n\n// Local-midnight helpers so the ranges are date-only (no time component).\nconst midnight = (d: Date): Date => new Date(d.getFullYear(), d.getMonth(), d.getDate());\nconst shiftDays = (d: Date, days: number): Date => new Date(d.getFullYear(), d.getMonth(), d.getDate() + days);\nconst mondayOf = (d: Date): Date => shiftDays(d, -((d.getDay() + 6) % 7)); // Monday = week start\n\n// \"This …\" spans from the start of the period to today; \"… anterior\" is the full\n// previous period. Evaluated lazily (on click) so they're always relative to now.\nconst PRESET_RANGES: Record<DateRangePresetKey, () => DateRange> = {\n today: () => { const t = midnight(new Date()); return { from: t, to: t }; },\n yesterday: () => { const y = shiftDays(midnight(new Date()), -1); return { from: y, to: y }; },\n thisWeek: () => { const t = midnight(new Date()); return { from: mondayOf(t), to: t }; },\n lastWeek: () => { const m = mondayOf(midnight(new Date())); return { from: shiftDays(m, -7), to: shiftDays(m, -1) }; },\n thisMonth: () => { const t = midnight(new Date()); return { from: new Date(t.getFullYear(), t.getMonth(), 1), to: t }; },\n lastMonth: () => { const t = new Date(); return { from: new Date(t.getFullYear(), t.getMonth() - 1, 1), to: new Date(t.getFullYear(), t.getMonth(), 0) }; },\n thisYear: () => { const t = midnight(new Date()); return { from: new Date(t.getFullYear(), 0, 1), to: t }; },\n lastYear: () => { const t = new Date(); return { from: new Date(t.getFullYear() - 1, 0, 1), to: new Date(t.getFullYear() - 1, 11, 31) }; },\n};\n\nexport interface DateRangePresetsOptions {\n /** Pick a subset and order. Default: all eight in a sensible order. */\n include?: DateRangePresetKey[];\n /** Override labels (e.g. for i18n). Defaults are Spanish. */\n labels?: Partial<Record<DateRangePresetKey, string>>;\n}\n\n/**\n * The common analytics date-range presets (Bsale-style): today, yesterday,\n * this/last week, this/last month, this/last year. Pass straight to\n * `<DateRangePicker presets={dateRangePresets()} />` so consumers don't\n * re-derive the (fiddly) \"previous week/month\" boundaries each time.\n */\nexport function dateRangePresets(opts: DateRangePresetsOptions = {}): DateRangePresetItem[] {\n return (opts.include ?? PRESET_ORDER).map((key) => ({\n key,\n label: opts.labels?.[key] ?? DEFAULT_PRESET_LABELS[key],\n range: PRESET_RANGES[key],\n }));\n}\n\nexport function DateRangePicker({\n value, onChange, defaultValue, onApply, onOpenChange,\n minDate, maxDate, isDateDisabled, presets,\n invalid, disabled, className, id, format = 'auto',\n showInputs = false, monthDropdown = false, months = 2, defaultPreset,\n}: DateRangePickerProps) {\n const locale = useLocale();\n const weekdays = locale['picker.weekdaysShort'];\n const monthNames = locale['calendar.months'];\n const fmt = resolveDateFormat(format);\n const isControlled = value !== undefined;\n const applyMode = !!onApply;\n // `defaultPreset` (by label) seeds the initial range + the trigger name. For an\n // uncontrolled picker it also sets the initial dates; controlled callers drive\n // `value` and this only sets the initial name.\n const matchedPreset = defaultPreset ? presets?.find((p) => p.label === defaultPreset) : undefined;\n const initial = isControlled\n ? (value as DateRange)\n : (matchedPreset ? matchedPreset.range() : (defaultValue ?? EMPTY_RANGE));\n const [draft, setDraft] = React.useState<DateRange>(initial);\n const [lastApplied, setLastApplied] = React.useState<DateRange>(initial);\n // Resync draft/lastApplied when controlled `value` changes externally.\n const vFrom = value?.from?.getTime() ?? 0;\n const vTo = value?.to?.getTime() ?? 0;\n React.useEffect(() => {\n if (!isControlled) return;\n setDraft(value as DateRange);\n setLastApplied(value as DateRange);\n }, [isControlled, vFrom, vTo]);\n // Legacy-controlled (no `onApply`) keeps prior semantics: `value` drives render\n // directly. Otherwise the draft is truth.\n const current: DateRange = isControlled && !applyMode ? (value as DateRange) : draft;\n // The trigger label shows the last-committed range in apply mode; in legacy it\n // tracks `current` (so live edits stay reflected, as before).\n const displayed: DateRange = applyMode ? lastApplied : current;\n const [open, setOpen] = React.useState(false);\n const [view, setView] = React.useState(() => startOfMonth(initial.from ?? new Date()));\n const [hover, setHover] = React.useState<Date | null>(null);\n // Editable-inputs (showInputs) mirror the current range; the month-jump menu\n // (monthDropdown) tracks a year while the user browses it.\n const [fromText, setFromText] = React.useState('');\n const [toText, setToText] = React.useState('');\n const [menuOpen, setMenuOpen] = React.useState(false);\n const [menuYear, setMenuYear] = React.useState(() => view.getFullYear());\n // The label of the preset that produced the current value (so the trigger can\n // show \"Este mes\" instead of the date range). Seeded from `defaultPreset`;\n // cleared on any manual change.\n const [appliedPreset, setAppliedPreset] = React.useState<string | null>(matchedPreset?.label ?? null);\n const wrapRef = React.useRef<HTMLDivElement>(null);\n const popoverRef = React.useRef<HTMLDivElement>(null);\n const triggerRef = React.useRef<HTMLButtonElement>(null);\n\n // Portaled to body (escapes overflow ancestors) with flip/clamp and\n // scroll/resize reposition; Escape and outside-click return focus to the\n // trigger (a11y) — same primitive as MultiCombobox above.\n const pos = usePopoverPosition(wrapRef, popoverRef, {\n open,\n side: 'bottom',\n align: 'start',\n offset: 6,\n });\n\n const closeWithoutCommit = React.useCallback(() => {\n if (applyMode) setDraft(lastApplied);\n setOpen(false);\n onOpenChange?.(false);\n }, [applyMode, lastApplied, onOpenChange]);\n\n useDismiss({\n open,\n onDismiss: closeWithoutCommit,\n refs: [wrapRef, popoverRef],\n returnFocusRef: triggerRef,\n });\n\n // Each panel renders ~42 Date cells. Without memoization, every\n // setHover() triggered a full rebuild of both panels' grids on every\n // mouse movement over the calendar. Memo keyed on `view` only.\n const monthGrid0 = React.useMemo(() => buildMonthGrid6(view, 0), [view]);\n const monthGrid1 = React.useMemo(() => buildMonthGrid6(view, 1), [view]);\n\n const isDisabled = (d: Date) =>\n !!(\n (minDate && d < new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate())) ||\n (maxDate && d > new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate())) ||\n isDateDisabled?.(d)\n );\n\n const inRange = (d: Date) => {\n if (!current.from) return false;\n const end = current.to ?? hover;\n if (!end) return isSameDay(d, current.from);\n const a = current.from < end ? current.from : end;\n const b = current.from < end ? end : current.from;\n return d >= new Date(a.getFullYear(), a.getMonth(), a.getDate()) &&\n d <= new Date(b.getFullYear(), b.getMonth(), b.getDate());\n };\n\n // Ordered span ends (handles hover-preview when `to` is still null). Drives the\n // continuous-band rounding: a cell rounds left at `a`/week-start, right at\n // `b`/week-end.\n const spanBounds = (): { a: Date; b: Date } | null => {\n if (!current.from) return null;\n const end = current.to ?? hover;\n if (!end) return { a: current.from, b: current.from };\n return current.from <= end ? { a: current.from, b: end } : { a: end, b: current.from };\n };\n\n // Apply a new range honoring apply/legacy mode (same split as a day click).\n const setRange = (next: DateRange) => {\n if (applyMode) setDraft(next);\n else { onChange?.(next); setAppliedPreset(null); }\n };\n\n // Keep the editable inputs in sync with the current range.\n const curFrom = current.from?.getTime() ?? 0;\n const curTo = current.to?.getTime() ?? 0;\n React.useEffect(() => {\n setFromText(current.from ? formatDate(current.from, fmt) : '');\n setToText(current.to ? formatDate(current.to, fmt) : '');\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [curFrom, curTo, fmt]);\n\n const commitInput = (which: 'from' | 'to', text: string) => {\n const parsed = parseDate(text, fmt);\n if (!parsed || isDisabled(parsed)) {\n // Revert the field to the current value's formatted form.\n if (which === 'from') setFromText(current.from ? formatDate(current.from, fmt) : '');\n else setToText(current.to ? formatDate(current.to, fmt) : '');\n return;\n }\n const next: DateRange = which === 'from'\n ? (current.to && current.to < parsed ? { from: current.to, to: parsed } : { from: parsed, to: current.to })\n : (current.from && parsed < current.from ? { from: parsed, to: current.from } : { from: current.from, to: parsed });\n setRange(next);\n setView(startOfMonth(parsed));\n };\n\n const jumpToMonth = (monthIndex: number) => {\n setView(new Date(menuYear, monthIndex, 1));\n setMenuOpen(false);\n };\n\n const click = (d: Date) => {\n let next: DateRange;\n if (!current.from || (current.from && current.to)) next = { from: d, to: null };\n else {\n const from = current.from;\n next = d < from ? { from: d, to: from } : { from, to: d };\n }\n // A manual day click in legacy mode commits immediately → drop any preset\n // name. In apply mode it only mutates the draft; the applied preset (shown on\n // the trigger) changes only when the user actually applies.\n if (applyMode) setDraft(next);\n else { onChange?.(next); setAppliedPreset(null); }\n };\n\n // Commits a range and closes. In apply mode this fires `onApply` (and `onChange`\n // when controlled, to keep `value` in sync). In legacy mode, only preset commits\n // propagate via `onChange`; the bare \"Apply\" button stays close-only as before.\n const commit = (next: DateRange, fromPreset = false, presetLabel: string | null = null) => {\n setAppliedPreset(fromPreset ? presetLabel : null);\n if (applyMode) {\n onApply!(next);\n setLastApplied(next);\n setDraft(next);\n if (isControlled) onChange?.(next);\n } else if (fromPreset) {\n onChange?.(next);\n }\n setOpen(false);\n onOpenChange?.(false);\n };\n\n const clear = () => {\n // \"Limpiar\" resetea el FILTRO, no solo el draft: en apply mode commitea el\n // rango vacío (dispara onApply + cierra). Antes solo reseteaba el draft y,\n // como \"Aplicar\" exige from+to, el estado limpio nunca se podía aplicar →\n // no se podía volver a \"sin filtro\".\n if (applyMode) commit(EMPTY_RANGE);\n else { onChange?.(EMPTY_RANGE); setAppliedPreset(null); }\n };\n\n const toggleOpen = () => {\n if (open) closeWithoutCommit();\n else { setOpen(true); onOpenChange?.(true); }\n };\n\n // Show the active preset's name (like Bsale) when one is applied; otherwise the\n // date range, or the placeholder when empty.\n const label = appliedPreset && displayed.from\n ? appliedPreset\n : displayed.from\n ? displayed.to\n ? `${formatDate(displayed.from, fmt)} → ${formatDate(displayed.to, fmt)}`\n : `${formatDate(displayed.from, fmt)} → …`\n : locale['picker.selectRange'];\n\n const renderMonth = (offset: number) => {\n const { month: m, cells } = offset === 0 ? monthGrid0 : monthGrid1;\n const bounds = spanBounds();\n // Only paint the band for a real (multi-day) span; a lone endpoint shows\n // just its circle.\n const isMultiDay = !!bounds && !isSameDay(bounds.a, bounds.b);\n return (\n <div className=\"daterange__month\">\n {/* The dropdown owns the month label when enabled; otherwise a static title. */}\n {!monthDropdown && <div className=\"daterange__title\">{monthNames[m.getMonth()]} {m.getFullYear()}</div>}\n <div className=\"daterange__grid\">\n {weekdays.map((w, i) => <span key={i} className=\"daterange__dow\">{w}</span>)}\n {cells.map(({ date: d, outside }, i) => {\n // Adjacent-month days: greyed, non-interactive context (keeps the grid\n // at a fixed 6 rows so the height never jumps).\n if (outside) return <span key={i} className=\"daterange__day is-outside\" aria-hidden=\"true\">{d.getDate()}</span>;\n const sel = (current.from && isSameDay(d, current.from)) || (current.to && isSameDay(d, current.to));\n const band = inRange(d) && isMultiDay;\n // Column 0 = Monday, 6 = Sunday (the 7 weekday headers offset by a\n // multiple of 7, so `i % 7` is the column).\n const col = i % 7;\n const leftEnd = band && !!bounds && isSameDay(d, bounds.a);\n const rightEnd = band && !!bounds && isSameDay(d, bounds.b);\n // Square model: round the outer corners only at the range ends and the\n // row edges (everything radius-sm); interior cells stay square and\n // bridge the gap. A lone selected day (no multi-day band) rounds all\n // four. is-rl/is-rr round both the band and the endpoint block.\n const roundL = band ? (col === 0 || leftEnd) : !!sel;\n const roundR = band ? (col === 6 || rightEnd) : !!sel;\n const today = isSameDay(d, new Date());\n const off = isDisabled(d);\n return (\n <button\n key={i}\n type=\"button\"\n className={cx(\n 'daterange__day',\n sel && 'is-selected',\n band && 'is-band',\n roundL && 'is-rl',\n roundR && 'is-rr',\n today && 'is-today',\n off && 'is-disabled',\n )}\n disabled={!!off}\n onMouseEnter={() => setHover(d)}\n onClick={() => click(d)}\n >{d.getDate()}</button>\n );\n })}\n </div>\n </div>\n );\n };\n\n // Month/year jump menu (monthDropdown). Inline (not a Portal) — it lives inside\n // the already-portaled popover and is dismissed by selecting a month.\n const renderMonthMenu = () => (\n <div className=\"daterange__menu\" role=\"dialog\" aria-label={locale['daterange.jumpMonth']}>\n <div className=\"daterange__menu-year\">\n <button type=\"button\" onClick={() => setMenuYear((y) => y - 1)} aria-label={locale['picker.prevYear']}><ChevronLeft size={16} /></button>\n <span>{menuYear}</span>\n <button type=\"button\" onClick={() => setMenuYear((y) => y + 1)} aria-label={locale['picker.nextYear']}><ChevronRight size={16} /></button>\n </div>\n <div className=\"daterange__menu-grid\">\n {monthNames.map((name, idx) => (\n <button\n type=\"button\"\n key={name}\n className={cx('daterange__menu-month', view.getMonth() === idx && view.getFullYear() === menuYear && 'is-current')}\n onClick={() => jumpToMonth(idx)}\n >{name.slice(0, 3)}</button>\n ))}\n </div>\n </div>\n );\n\n return (\n <div ref={wrapRef} className={cx('daterange', invalid && 'is-invalid', disabled && 'is-disabled', className)}>\n <button\n ref={triggerRef}\n id={id}\n type=\"button\"\n className=\"daterange__trigger\"\n disabled={disabled}\n onClick={toggleOpen}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n >\n <span className=\"daterange__icon\" aria-hidden=\"true\"><CalendarIcon size={16} /></span>\n <span>{label}</span>\n </button>\n {open && (\n <Portal>\n <div\n ref={popoverRef}\n className={cx('daterange__popover', 'is-floating', months === 1 && 'daterange__popover--compact')}\n role=\"dialog\"\n onMouseLeave={() => setHover(null)}\n style={{\n position: 'fixed',\n top: pos.top,\n left: pos.left,\n visibility: pos.ready ? 'visible' : 'hidden',\n }}\n >\n {presets && presets.length > 0 && (\n <ul className=\"daterange__presets\">\n {presets.map((p, i) => (\n <li key={i}>\n <button type=\"button\" className={cx(appliedPreset === p.label && 'is-active')} onClick={() => commit(p.range(), true, p.label)}>{p.label}</button>\n </li>\n ))}\n </ul>\n )}\n <div className=\"daterange__panes\">\n {showInputs && (\n <div className=\"daterange__inputs\">\n <label className=\"daterange__field\">\n <span className=\"daterange__field-label\">{locale['daterange.from']}</span>\n <input\n type=\"text\"\n className=\"daterange__field-input\"\n // Cap the input's intrinsic width to the format length so the\n // inputs row doesn't balloon wider than the calendar (the\n // panes then hugs the calendar into a tight square).\n size={dateFormatPlaceholder(fmt).length + 1}\n value={fromText}\n placeholder={dateFormatPlaceholder(fmt)}\n onChange={(e) => setFromText(e.target.value)}\n onBlur={(e) => commitInput('from', e.target.value)}\n onKeyDown={(e) => { if (e.key === 'Enter') commitInput('from', (e.target as HTMLInputElement).value); }}\n />\n </label>\n <label className=\"daterange__field\">\n <span className=\"daterange__field-label\">{locale['daterange.to']}</span>\n <input\n type=\"text\"\n className=\"daterange__field-input\"\n size={dateFormatPlaceholder(fmt).length + 1}\n value={toText}\n placeholder={dateFormatPlaceholder(fmt)}\n onChange={(e) => setToText(e.target.value)}\n onBlur={(e) => commitInput('to', e.target.value)}\n onKeyDown={(e) => { if (e.key === 'Enter') commitInput('to', (e.target as HTMLInputElement).value); }}\n />\n </label>\n </div>\n )}\n <div className=\"daterange__nav\">\n <button type=\"button\" onClick={() => setView((v) => addMonths(v, -1))} aria-label={locale['calendar.prevMonth']}><ChevronLeft size={16} /></button>\n {monthDropdown ? (\n <div className=\"daterange__monthjump\">\n <button\n type=\"button\"\n className=\"daterange__monthjump-trigger\"\n onClick={() => { setMenuYear(view.getFullYear()); setMenuOpen((o) => !o); }}\n aria-haspopup=\"dialog\"\n aria-expanded={menuOpen}\n >\n <span>{monthNames[view.getMonth()]} {view.getFullYear()}</span>\n <ChevronDown size={16} aria-hidden />\n </button>\n {menuOpen && renderMonthMenu()}\n </div>\n ) : (\n <span />\n )}\n <button type=\"button\" onClick={() => setView((v) => addMonths(v, 1))} aria-label={locale['calendar.nextMonth']}><ChevronRight size={16} /></button>\n </div>\n <div className={cx('daterange__months', months === 1 && 'daterange__months--single')}>\n {renderMonth(0)}\n {months === 2 && renderMonth(1)}\n </div>\n <div className=\"daterange__actions\">\n <button type=\"button\" className=\"daterange__clear\" onClick={clear}>{locale['common.clear']}</button>\n <button type=\"button\" className=\"daterange__apply\" onClick={() => commit(current)} disabled={!current.from || !current.to}>{locale['common.apply']}</button>\n </div>\n </div>\n </div>\n </Portal>\n )}\n </div>\n );\n}\n\n// ---------- Command Palette (⌘K) ----------------------------------------\nexport interface CommandItem {\n id: string;\n label: string;\n description?: string;\n group?: string;\n icon?: React.ReactNode;\n shortcut?: string;\n keywords?: string[];\n onRun: () => void;\n}\n\nexport interface CommandPaletteProps {\n open: boolean;\n onClose: () => void;\n items: CommandItem[];\n placeholder?: string;\n emptyMessage?: string;\n hotkey?: string; // 'mod+k'\n}\n\nfunction matchesHotkey(e: KeyboardEvent, hk: string) {\n const parts = hk.toLowerCase().split('+');\n const key = parts[parts.length - 1];\n const mods = parts.slice(0, -1);\n if (e.key.toLowerCase() !== key) return false;\n for (const m of mods) {\n if (m === 'mod' && !(e.metaKey || e.ctrlKey)) return false;\n if (m === 'ctrl' && !e.ctrlKey) return false;\n if (m === 'meta' && !e.metaKey) return false;\n if (m === 'shift' && !e.shiftKey) return false;\n if (m === 'alt' && !e.altKey) return false;\n }\n return true;\n}\n\nexport function CommandPalette({\n open, onClose, items,\n placeholder,\n emptyMessage,\n}: CommandPaletteProps) {\n const locale = useLocale();\n const ph = placeholder ?? locale['picker.searchCommands'];\n const empty = emptyMessage ?? locale['common.noResults'];\n const [query, setQuery] = React.useState('');\n const [active, setActive] = React.useState(0);\n const inputRef = React.useRef<HTMLInputElement>(null);\n const listRef = React.useRef<HTMLUListElement>(null);\n\n const filtered = React.useMemo(() => {\n const q = query.trim().toLowerCase();\n if (!q) return items;\n return items.filter((it) => {\n const hay = [it.label, it.description, it.group, ...(it.keywords ?? [])].join(' ').toLowerCase();\n return hay.includes(q);\n });\n }, [items, query]);\n\n // group preserve order\n const grouped = React.useMemo(() => {\n const order: string[] = [];\n const map = new Map<string, CommandItem[]>();\n for (const it of filtered) {\n const g = it.group ?? '';\n if (!map.has(g)) { map.set(g, []); order.push(g); }\n map.get(g)!.push(it);\n }\n return { order, map };\n }, [filtered]);\n\n const flat = filtered;\n\n React.useEffect(() => {\n if (open) {\n setQuery(''); setActive(0);\n requestAnimationFrame(() => inputRef.current?.focus());\n }\n }, [open]);\n\n React.useEffect(() => { setActive(0); }, [query]);\n\n React.useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n else if (e.key === 'ArrowDown') { e.preventDefault(); setActive((a) => Math.min(flat.length - 1, a + 1)); }\n else if (e.key === 'ArrowUp') { e.preventDefault(); setActive((a) => Math.max(0, a - 1)); }\n else if (e.key === 'Enter') {\n e.preventDefault();\n const it = flat[active];\n if (it) { it.onRun(); onClose(); }\n }\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [open, flat, active, onClose]);\n\n React.useEffect(() => {\n const el = listRef.current?.querySelector(`[data-cmd-idx=\"${active}\"]`);\n el?.scrollIntoView({ block: 'nearest' });\n }, [active]);\n\n if (!open) return null;\n let idx = -1;\n return (\n <div className=\"cmdk__overlay\" role=\"dialog\" aria-modal=\"true\" aria-label={locale['picker.commandPalette']} onMouseDown={(e) => { if (e.target === e.currentTarget) onClose(); }}>\n <div className=\"cmdk__panel\">\n <div className=\"cmdk__searchbar\">\n <span className=\"cmdk__icon\" aria-hidden=\"true\"><Search size={16} /></span>\n <input\n ref={inputRef}\n className=\"cmdk__input\"\n value={query}\n placeholder={ph}\n onChange={(e) => setQuery(e.target.value)}\n />\n <kbd className=\"cmdk__esc\">Esc</kbd>\n </div>\n <ul ref={listRef} className=\"cmdk__list\" role=\"listbox\">\n {flat.length === 0 && <li className=\"cmdk__empty\">{empty}</li>}\n {grouped.order.map((g) => (\n <React.Fragment key={g || '__none'}>\n {g && <li className=\"cmdk__group\" aria-hidden=\"true\">{g}</li>}\n {grouped.map.get(g)!.map((it) => {\n idx++;\n const i = idx;\n return (\n <li\n key={it.id}\n role=\"option\"\n aria-selected={i === active}\n data-cmd-idx={i}\n className={cx('cmdk__item', i === active && 'is-active')}\n onMouseEnter={() => setActive(i)}\n onMouseDown={(e) => { e.preventDefault(); it.onRun(); onClose(); }}\n >\n {it.icon && <span className=\"cmdk__item-icon\" aria-hidden=\"true\">{it.icon}</span>}\n <span className=\"cmdk__item-body\">\n <span className=\"cmdk__item-label\">{it.label}</span>\n {it.description && <span className=\"cmdk__item-desc\">{it.description}</span>}\n </span>\n {it.shortcut && <kbd className=\"cmdk__kbd\">{it.shortcut}</kbd>}\n </li>\n );\n })}\n </React.Fragment>\n ))}\n </ul>\n </div>\n </div>\n );\n}\n\nexport interface UseCommandPaletteOptions {\n hotkey?: string; // default 'mod+k'\n}\n\nexport function useCommandPalette({ hotkey = 'mod+k' }: UseCommandPaletteOptions = {}) {\n const [open, setOpen] = React.useState(false);\n React.useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (matchesHotkey(e, hotkey)) {\n e.preventDefault();\n setOpen((o) => !o);\n }\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [hotkey]);\n return { open, setOpen, close: () => setOpen(false), toggle: () => setOpen((o) => !o) };\n}\n"]}
@@ -2,10 +2,10 @@
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');
5
7
  var chunkC4AKMVDZ_js = require('./chunk-C4AKMVDZ.js');
6
8
  var chunkPASF6T4H_js = require('./chunk-PASF6T4H.js');
7
- var chunkCRKYET66_js = require('./chunk-CRKYET66.js');
8
- var chunkXMLBKK7X_js = require('./chunk-XMLBKK7X.js');
9
9
  var React = require('react');
10
10
  var jsxRuntime = require('react/jsx-runtime');
11
11
 
@@ -195,5 +195,5 @@ function NavigationMenu({ items, className, ariaLabel = "Navegaci\xF3n principal
195
195
  }
196
196
 
197
197
  exports.NavigationMenu = NavigationMenu;
198
- //# sourceMappingURL=chunk-SDJHC7QY.js.map
199
- //# sourceMappingURL=chunk-SDJHC7QY.js.map
198
+ //# sourceMappingURL=chunk-TX4BUYX4.js.map
199
+ //# sourceMappingURL=chunk-TX4BUYX4.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/NavigationMenu.tsx"],"names":["React","usePopoverPosition","useDismiss","cx","jsxs","Fragment","jsx","ChevronDown","Portal"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCO,SAAS,cAAA,CAAe,EAAE,KAAA,EAAO,SAAA,EAAW,YAAY,yBAAA,EAAwB,MAAA,EAAQ,YAAW,EAAwB;AAChI,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAUA,0BAAwB,IAAI,CAAA;AAG9D,EAAA,MAAM,WAAA,GAAoBA,wBAAO,KAAK,CAAA;AACtC,EAAA,MAAM,OAAA,GAAgBA,wBAAoB,IAAI,CAAA;AAC9C,EAAA,MAAM,QAAA,GAAiBA,wBAAuB,IAAI,CAAA;AAIlD,EAAA,MAAM,SAAA,GAAkBA,wBAA2B,IAAI,CAAA;AACvD,EAAA,MAAM,WAAA,GAAoBA,gBAAA,CAAA,MAAA,CAAiD,EAAE,CAAA;AAE7E,EAAA,MAAM,OAAO,MAAA,KAAW,IAAA;AAExB,EAAA,MAAM,GAAA,GAAMC,mCAAA,CAAmB,SAAA,EAAW,QAAA,EAAU;AAAA,IAClD,IAAA;AAAA,IACA,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO,OAAA;AAAA,IACP,MAAA,EAAQ;AAAA,GACT,CAAA;AAID,EAAAC,2BAAA,CAAW;AAAA,IACT,IAAA;AAAA,IACA,SAAA,EAAW,MAAM,SAAA,CAAU,IAAI,CAAA;AAAA,IAC/B,IAAA,EAAM,CAAC,OAAA,EAAS,QAAQ,CAAA;AAAA,IACxB,aAAA,EAAe;AAAA,GAChB,CAAA;AAED,EAAA,MAAM,uBAAuB,MAAM;AACjC,IAAA,MAAM,EAAA,GAAK,MAAA;AACX,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,IAAI,EAAA,EAAI,WAAA,CAAY,OAAA,CAAQ,EAAE,GAAG,KAAA,EAAM;AAAA,EACzC,CAAA;AAKA,EAAA,MAAM,UAAA,GAAa,MACjB,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,SAAS,gBAAA,CAA8B,iBAAiB,CAAA,IAAK,EAAE,CAAA;AAErF,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAAkB;AACrC,IAAA,MAAM,QAAQ,UAAA,EAAW;AACzB,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACxB,IAAA,MAAM,WAAY,KAAA,GAAQ,KAAA,CAAM,MAAA,GAAU,KAAA,CAAM,UAAU,KAAA,CAAM,MAAA;AAChE,IAAA,KAAA,CAAM,OAAO,GAAG,KAAA,EAAM;AAAA,EACxB,CAAA;AAEA,EAAMF,2BAAU,MAAM;AACpB,IAAA,IAAI,IAAA,IAAQ,YAAY,OAAA,EAAS;AAC/B,MAAA,WAAA,CAAY,OAAA,GAAU,KAAA;AACtB,MAAA,WAAA,CAAY,CAAC,CAAA;AAAA,IACf;AAAA,EACF,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,MAAM,cAAA,GAAiB,CAAC,CAAA,KAA2B;AACjD,IAAA,MAAM,QAAQ,UAAA,EAAW;AACzB,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,aAA4B,CAAA;AACnE,IAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,oBAAA,EAAqB;AAAA,IACvB,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,KAAA,EAAO;AAC1B,MAAA,SAAA,CAAU,IAAI,CAAA;AAAA,IAChB,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,WAAA,EAAa;AAChC,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,WAAA,CAAY,UAAU,CAAC,CAAA;AAAA,IACzB,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,SAAA,EAAW;AAC9B,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,WAAA,CAAY,UAAU,CAAC,CAAA;AAAA,IACzB,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,MAAA,EAAQ;AAC3B,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,WAAA,CAAY,CAAC,CAAA;AAAA,IACf,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,KAAA,EAAO;AAC1B,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,WAAA,CAAY,KAAA,CAAM,SAAS,CAAC,CAAA;AAAA,IAC9B;AAAA,EACF,CAAA;AAEA,EAAA,sCACG,KAAA,EAAA,EAAI,GAAA,EAAK,SAAS,YAAA,EAAY,SAAA,EAAW,WAAWG,mBAAA,CAAG,UAAA,EAAY,SAAS,CAAA,EAC3E,yCAAC,IAAA,EAAA,EAAG,SAAA,EAAU,kBACX,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACnB,IAAA,MAAM,WAAA,GAAc,CAAC,CAAC,IAAA,CAAK,KAAA,EAAO,MAAA;AAClC,IAAA,MAAM,MAAA,GAAS,WAAW,IAAA,CAAK,EAAA;AAC/B,IAAA,MAAM,UAAA,GAAaA,mBAAA,CAAG,mBAAA,EAAqB,MAAA,IAAU,SAAS,CAAA;AAC9D,IAAA,MAAM,0BACJC,eAAA,CAAAC,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAC,cAAA,CAAC,MAAA,EAAA,EAAM,eAAK,KAAA,EAAM,CAAA;AAAA,MACjB,+BAAeA,cAAA,CAACC,4BAAA,EAAA,EAAY,IAAA,EAAM,EAAA,EAAI,WAAU,mBAAA,EAAoB;AAAA,KAAA,EACvE,CAAA;AAGF,IAAA,uBACEH,eAAA,CAAC,IAAA,EAAA,EAAiB,SAAA,EAAU,gBAAA,EACzB,QAAA,EAAA;AAAA,MAAA,WAAA,mBACCE,cAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,GAAA,EAAK,CAAC,EAAA,KAAO;AAAE,YAAA,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAK,EAAE,CAAA,GAAI,EAAA;AAAA,UAAI,CAAA;AAAA,UAClD,SAAA,EAAW,UAAA;AAAA,UACX,eAAA,EAAe,MAAA;AAAA,UACf,eAAA,EAAc,MAAA;AAAA,UACd,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,YAAA,IAAI,MAAA,EAAQ;AAAE,cAAA,SAAA,CAAU,IAAI,CAAA;AAAG,cAAA;AAAA,YAAQ;AACvC,YAAA,SAAA,CAAU,UAAU,CAAA,CAAE,aAAA;AACtB,YAAA,WAAA,CAAY,OAAA,GAAU,KAAA;AACtB,YAAA,SAAA,CAAU,KAAK,EAAE,CAAA;AAAA,UACnB,CAAA;AAAA,UACA,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,YAAA,IAAI,CAAC,MAAA,EAAQ;AACb,YAAA,SAAA,CAAU,UAAU,CAAA,CAAE,aAAA;AACtB,YAAA,WAAA,CAAY,OAAA,GAAU,KAAA;AACtB,YAAA,SAAA,CAAU,KAAK,EAAE,CAAA;AAAA,UACnB,CAAA;AAAA,UACA,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,YAAA,IAAI,CAAA,CAAE,QAAQ,WAAA,IAAe,CAAA,CAAE,QAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AAC/D,cAAA,CAAA,CAAE,cAAA,EAAe;AACjB,cAAA,IAAI,MAAA,EAAQ;AAAE,gBAAA,WAAA,CAAY,CAAC,CAAA;AAAG,gBAAA;AAAA,cAAQ;AACtC,cAAA,SAAA,CAAU,UAAU,CAAA,CAAE,aAAA;AACtB,cAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AACtB,cAAA,SAAA,CAAU,KAAK,EAAE,CAAA;AAAA,YACnB,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,QAAA,IAAY,MAAA,EAAQ;AACvC,cAAA,CAAA,CAAE,cAAA,EAAe;AACjB,cAAA,SAAA,CAAU,IAAI,CAAA;AAAA,YAChB;AAAA,UACF,CAAA;AAAA,UAEC,QAAA,EAAA;AAAA;AAAA,UAED,UAAA,IAAc,IAAA,CAAK,IAAA,GACrB,UAAA,CAAW,MAAM,OAAA,EAAS,UAAU,CAAA,mBAEpCA,cAAA,CAAC,OAAE,SAAA,EAAW,UAAA,EAAY,IAAA,EAAM,IAAA,CAAK,MAClC,QAAA,EAAA,OAAA,EACH,CAAA;AAAA,MAED,WAAA,IAAe,MAAA,oBACdA,cAAA,CAACE,uBAAA,EAAA,EACC,QAAA,kBAAAJ,eAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAU,iBAAA;AAAA,UACV,IAAA,EAAK,MAAA;AAAA,UACL,cAAY,OAAO,IAAA,CAAK,KAAA,KAAU,QAAA,GAAW,KAAK,KAAA,GAAQ,MAAA;AAAA,UAC1D,SAAA,EAAW,cAAA;AAAA,UACX,KAAA,EAAO;AAAA,YACL,QAAA,EAAU,OAAA;AAAA,YACV,KAAK,GAAA,CAAI,GAAA;AAAA,YACT,MAAM,GAAA,CAAI,IAAA;AAAA,YACV,UAAA,EAAY,GAAA,CAAI,KAAA,GAAQ,SAAA,GAAY;AAAA,WACtC;AAAA,UAEC,QAAA,EAAA;AAAA,YAAA,IAAA,CAAK,QAAA,oBACJA,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACb,QAAA,EAAA;AAAA,8BAAAE,cAAA,CAAC,QAAA,EAAA,EAAQ,QAAA,EAAA,IAAA,CAAK,QAAA,CAAS,KAAA,EAAM,CAAA;AAAA,cAC5B,KAAK,QAAA,CAAS,WAAA,mCAAgB,GAAA,EAAA,EAAG,QAAA,EAAA,IAAA,CAAK,SAAS,WAAA,EAAY;AAAA,aAAA,EAC9D,CAAA;AAAA,4BAEFA,cAAA,CAAC,QAAG,SAAA,EAAU,mBAAA,EACX,eAAK,KAAA,CAAO,GAAA,CAAI,CAAC,IAAA,KAAS;AACzB,cAAA,MAAM,OAAA,GAAU,gBAAA;AAChB,cAAA,MAAM,8BACJF,eAAA,CAAAC,mBAAA,EAAA,EACG,QAAA,EAAA;AAAA,gBAAA,IAAA,CAAK,wBAAQC,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EAAuB,eAAK,IAAA,EAAK,CAAA;AAAA,gCAC/DF,eAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EACd,QAAA,EAAA;AAAA,kCAAAE,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sBAAA,EAAwB,QAAA,EAAA,IAAA,CAAK,KAAA,EAAM,CAAA;AAAA,kBAClD,KAAK,WAAA,oBAAeA,cAAA,CAAC,UAAK,SAAA,EAAU,qBAAA,EAAuB,eAAK,WAAA,EAAY;AAAA,iBAAA,EAC/E;AAAA,eAAA,EACF,CAAA;AAEF,cAAA,uBACEA,cAAA,CAAC,QAAiB,IAAA,EAAK,MAAA,EACpB,mBACC,MAAA,CAAO,IAAA,EAAM,WAAA,EAAa,OAAO,CAAA,mBAEjCA,cAAA;AAAA,gBAAC,GAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,UAAA;AAAA,kBACL,QAAA,EAAU,EAAA;AAAA,kBACV,SAAA,EAAW,OAAA;AAAA,kBACX,MAAM,IAAA,CAAK,IAAA;AAAA,kBACX,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,oBAAA,IAAI,KAAK,OAAA,EAAS;AAChB,sBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,sBAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,oBACf;AACA,oBAAA,oBAAA,EAAqB;AAAA,kBACvB,CAAA;AAAA,kBAEC,QAAA,EAAA;AAAA;AAAA,eACH,EAAA,EAlBK,KAAK,EAoBd,CAAA;AAAA,YAEJ,CAAC,CAAA,EACH;AAAA;AAAA;AAAA,OACF,EACF;AAAA,KAAA,EAAA,EArGK,KAAK,EAuGd,CAAA;AAAA,EAEJ,CAAC,GACH,CAAA,EACF,CAAA;AAEJ","file":"chunk-SDJHC7QY.js","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { ChevronDown } from './Icons';\nimport { Portal } from './Portal';\nimport { usePopoverPosition } from '../hooks/usePopoverPosition';\nimport { useDismiss } from '../hooks/useDismiss';\n\nexport interface NavLink {\n id: string;\n label: React.ReactNode;\n href?: string;\n description?: React.ReactNode;\n icon?: React.ReactNode;\n onClick?: () => void;\n}\n\nexport interface NavMenuItem {\n id: string;\n label: React.ReactNode;\n href?: string;\n links?: NavLink[];\n featured?: NavLink;\n}\n\nexport interface NavigationMenuProps {\n items: NavMenuItem[];\n className?: string;\n ariaLabel?: string;\n linkAs?: (link: NavLink, content: React.ReactNode, className: string) => React.ReactNode;\n rootLinkAs?: (item: NavMenuItem, content: React.ReactNode, className: string) => React.ReactNode;\n}\n\nexport function NavigationMenu({ items, className, ariaLabel = 'Navegación principal', linkAs, rootLinkAs }: NavigationMenuProps) {\n const [openId, setOpenId] = React.useState<string | null>(null);\n // When the panel was opened by keyboard we move focus into it; pointer\n // (click/hover) opens leave focus with the user's cursor.\n const focusOnOpen = React.useRef(false);\n const rootRef = React.useRef<HTMLElement>(null);\n const panelRef = React.useRef<HTMLDivElement>(null);\n // The currently-open trigger; usePopoverPosition anchors to this and\n // focus returns here on close. One panel is open at a time, so a single\n // anchor ref is correct (see todo.md risk note).\n const anchorRef = React.useRef<HTMLElement | null>(null);\n const triggerRefs = React.useRef<Record<string, HTMLButtonElement | null>>({});\n\n const open = openId !== null;\n\n const pos = usePopoverPosition(anchorRef, panelRef, {\n open,\n side: 'bottom',\n align: 'start',\n offset: 8,\n });\n\n // Outside-click closes; Escape is handled on the panel so it can also\n // return focus to the trigger (WAI-ARIA disclosure/menu pattern).\n useDismiss({\n open,\n onDismiss: () => setOpenId(null),\n refs: [rootRef, panelRef],\n closeOnEscape: false,\n });\n\n const closeAndFocusTrigger = () => {\n const id = openId;\n setOpenId(null);\n if (id) triggerRefs.current[id]?.focus();\n };\n\n // `.nav-menu__link` is applied to every link node (default <a> and the\n // `linkAs` render-prop alike), so querying by class manages focus\n // uniformly regardless of how the consumer renders links.\n const panelLinks = (): HTMLElement[] =>\n Array.from(panelRef.current?.querySelectorAll<HTMLElement>('.nav-menu__link') ?? []);\n\n const focusLinkAt = (index: number) => {\n const links = panelLinks();\n if (links.length === 0) return;\n const wrapped = ((index % links.length) + links.length) % links.length;\n links[wrapped]?.focus();\n };\n\n React.useEffect(() => {\n if (open && focusOnOpen.current) {\n focusOnOpen.current = false;\n focusLinkAt(0);\n }\n }, [open]);\n\n const onPanelKeyDown = (e: React.KeyboardEvent) => {\n const links = panelLinks();\n const current = links.indexOf(document.activeElement as HTMLElement);\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 focusLinkAt(current + 1);\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n focusLinkAt(current - 1);\n } else if (e.key === 'Home') {\n e.preventDefault();\n focusLinkAt(0);\n } else if (e.key === 'End') {\n e.preventDefault();\n focusLinkAt(links.length - 1);\n }\n };\n\n return (\n <nav ref={rootRef} aria-label={ariaLabel} className={cx('nav-menu', className)}>\n <ul className=\"nav-menu__list\">\n {items.map((item) => {\n const hasChildren = !!item.links?.length;\n const isOpen = openId === item.id;\n const triggerCls = cx('nav-menu__trigger', isOpen && 'is-open');\n const content = (\n <>\n <span>{item.label}</span>\n {hasChildren && <ChevronDown size={14} className=\"nav-menu__chevron\" />}\n </>\n );\n\n return (\n <li key={item.id} className=\"nav-menu__item\">\n {hasChildren ? (\n <button\n type=\"button\"\n ref={(el) => { triggerRefs.current[item.id] = el; }}\n className={triggerCls}\n aria-expanded={isOpen}\n aria-haspopup=\"menu\"\n onClick={(e) => {\n if (isOpen) { setOpenId(null); return; }\n anchorRef.current = e.currentTarget;\n focusOnOpen.current = false;\n setOpenId(item.id);\n }}\n onMouseEnter={(e) => {\n if (!openId) return;\n anchorRef.current = e.currentTarget;\n focusOnOpen.current = false;\n setOpenId(item.id);\n }}\n onKeyDown={(e) => {\n if (e.key === 'ArrowDown' || e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n if (isOpen) { focusLinkAt(0); return; }\n anchorRef.current = e.currentTarget;\n focusOnOpen.current = true;\n setOpenId(item.id);\n } else if (e.key === 'Escape' && isOpen) {\n e.preventDefault();\n setOpenId(null);\n }\n }}\n >\n {content}\n </button>\n ) : rootLinkAs && item.href ? (\n rootLinkAs(item, content, triggerCls)\n ) : (\n <a className={triggerCls} href={item.href}>\n {content}\n </a>\n )}\n {hasChildren && isOpen && (\n <Portal>\n <div\n ref={panelRef}\n className=\"nav-menu__panel\"\n role=\"menu\"\n aria-label={typeof item.label === 'string' ? item.label : undefined}\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 {item.featured && (\n <div className=\"nav-menu__featured\">\n <strong>{item.featured.label}</strong>\n {item.featured.description && <p>{item.featured.description}</p>}\n </div>\n )}\n <ul className=\"nav-menu__sublist\">\n {item.links!.map((link) => {\n const linkCls = 'nav-menu__link';\n const linkContent = (\n <>\n {link.icon && <span className=\"nav-menu__link-icon\">{link.icon}</span>}\n <span className=\"nav-menu__link-body\">\n <span className=\"nav-menu__link-label\">{link.label}</span>\n {link.description && <span className=\"nav-menu__link-desc\">{link.description}</span>}\n </span>\n </>\n );\n return (\n <li key={link.id} role=\"none\">\n {linkAs ? (\n linkAs(link, linkContent, linkCls)\n ) : (\n <a\n role=\"menuitem\"\n tabIndex={-1}\n className={linkCls}\n href={link.href}\n onClick={(e) => {\n if (link.onClick) {\n e.preventDefault();\n link.onClick();\n }\n closeAndFocusTrigger();\n }}\n >\n {linkContent}\n </a>\n )}\n </li>\n );\n })}\n </ul>\n </div>\n </Portal>\n )}\n </li>\n );\n })}\n </ul>\n </nav>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/NavigationMenu.tsx"],"names":["React","usePopoverPosition","useDismiss","cx","jsxs","Fragment","jsx","ChevronDown","Portal"],"mappings":"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","file":"chunk-TX4BUYX4.js","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { ChevronDown } from './Icons';\nimport { Portal } from './Portal';\nimport { usePopoverPosition } from '../hooks/usePopoverPosition';\nimport { useDismiss } from '../hooks/useDismiss';\n\nexport interface NavLink {\n id: string;\n label: React.ReactNode;\n href?: string;\n description?: React.ReactNode;\n icon?: React.ReactNode;\n onClick?: () => void;\n}\n\nexport interface NavMenuItem {\n id: string;\n label: React.ReactNode;\n href?: string;\n links?: NavLink[];\n featured?: NavLink;\n}\n\nexport interface NavigationMenuProps {\n items: NavMenuItem[];\n className?: string;\n ariaLabel?: string;\n linkAs?: (link: NavLink, content: React.ReactNode, className: string) => React.ReactNode;\n rootLinkAs?: (item: NavMenuItem, content: React.ReactNode, className: string) => React.ReactNode;\n}\n\nexport function NavigationMenu({ items, className, ariaLabel = 'Navegación principal', linkAs, rootLinkAs }: NavigationMenuProps) {\n const [openId, setOpenId] = React.useState<string | null>(null);\n // When the panel was opened by keyboard we move focus into it; pointer\n // (click/hover) opens leave focus with the user's cursor.\n const focusOnOpen = React.useRef(false);\n const rootRef = React.useRef<HTMLElement>(null);\n const panelRef = React.useRef<HTMLDivElement>(null);\n // The currently-open trigger; usePopoverPosition anchors to this and\n // focus returns here on close. One panel is open at a time, so a single\n // anchor ref is correct (see todo.md risk note).\n const anchorRef = React.useRef<HTMLElement | null>(null);\n const triggerRefs = React.useRef<Record<string, HTMLButtonElement | null>>({});\n\n const open = openId !== null;\n\n const pos = usePopoverPosition(anchorRef, panelRef, {\n open,\n side: 'bottom',\n align: 'start',\n offset: 8,\n });\n\n // Outside-click closes; Escape is handled on the panel so it can also\n // return focus to the trigger (WAI-ARIA disclosure/menu pattern).\n useDismiss({\n open,\n onDismiss: () => setOpenId(null),\n refs: [rootRef, panelRef],\n closeOnEscape: false,\n });\n\n const closeAndFocusTrigger = () => {\n const id = openId;\n setOpenId(null);\n if (id) triggerRefs.current[id]?.focus();\n };\n\n // `.nav-menu__link` is applied to every link node (default <a> and the\n // `linkAs` render-prop alike), so querying by class manages focus\n // uniformly regardless of how the consumer renders links.\n const panelLinks = (): HTMLElement[] =>\n Array.from(panelRef.current?.querySelectorAll<HTMLElement>('.nav-menu__link') ?? []);\n\n const focusLinkAt = (index: number) => {\n const links = panelLinks();\n if (links.length === 0) return;\n const wrapped = ((index % links.length) + links.length) % links.length;\n links[wrapped]?.focus();\n };\n\n React.useEffect(() => {\n if (open && focusOnOpen.current) {\n focusOnOpen.current = false;\n focusLinkAt(0);\n }\n }, [open]);\n\n const onPanelKeyDown = (e: React.KeyboardEvent) => {\n const links = panelLinks();\n const current = links.indexOf(document.activeElement as HTMLElement);\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 focusLinkAt(current + 1);\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n focusLinkAt(current - 1);\n } else if (e.key === 'Home') {\n e.preventDefault();\n focusLinkAt(0);\n } else if (e.key === 'End') {\n e.preventDefault();\n focusLinkAt(links.length - 1);\n }\n };\n\n return (\n <nav ref={rootRef} aria-label={ariaLabel} className={cx('nav-menu', className)}>\n <ul className=\"nav-menu__list\">\n {items.map((item) => {\n const hasChildren = !!item.links?.length;\n const isOpen = openId === item.id;\n const triggerCls = cx('nav-menu__trigger', isOpen && 'is-open');\n const content = (\n <>\n <span>{item.label}</span>\n {hasChildren && <ChevronDown size={14} className=\"nav-menu__chevron\" />}\n </>\n );\n\n return (\n <li key={item.id} className=\"nav-menu__item\">\n {hasChildren ? (\n <button\n type=\"button\"\n ref={(el) => { triggerRefs.current[item.id] = el; }}\n className={triggerCls}\n aria-expanded={isOpen}\n aria-haspopup=\"menu\"\n onClick={(e) => {\n if (isOpen) { setOpenId(null); return; }\n anchorRef.current = e.currentTarget;\n focusOnOpen.current = false;\n setOpenId(item.id);\n }}\n onMouseEnter={(e) => {\n if (!openId) return;\n anchorRef.current = e.currentTarget;\n focusOnOpen.current = false;\n setOpenId(item.id);\n }}\n onKeyDown={(e) => {\n if (e.key === 'ArrowDown' || e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n if (isOpen) { focusLinkAt(0); return; }\n anchorRef.current = e.currentTarget;\n focusOnOpen.current = true;\n setOpenId(item.id);\n } else if (e.key === 'Escape' && isOpen) {\n e.preventDefault();\n setOpenId(null);\n }\n }}\n >\n {content}\n </button>\n ) : rootLinkAs && item.href ? (\n rootLinkAs(item, content, triggerCls)\n ) : (\n <a className={triggerCls} href={item.href}>\n {content}\n </a>\n )}\n {hasChildren && isOpen && (\n <Portal>\n <div\n ref={panelRef}\n className=\"nav-menu__panel\"\n role=\"menu\"\n aria-label={typeof item.label === 'string' ? item.label : undefined}\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 {item.featured && (\n <div className=\"nav-menu__featured\">\n <strong>{item.featured.label}</strong>\n {item.featured.description && <p>{item.featured.description}</p>}\n </div>\n )}\n <ul className=\"nav-menu__sublist\">\n {item.links!.map((link) => {\n const linkCls = 'nav-menu__link';\n const linkContent = (\n <>\n {link.icon && <span className=\"nav-menu__link-icon\">{link.icon}</span>}\n <span className=\"nav-menu__link-body\">\n <span className=\"nav-menu__link-label\">{link.label}</span>\n {link.description && <span className=\"nav-menu__link-desc\">{link.description}</span>}\n </span>\n </>\n );\n return (\n <li key={link.id} role=\"none\">\n {linkAs ? (\n linkAs(link, linkContent, linkCls)\n ) : (\n <a\n role=\"menuitem\"\n tabIndex={-1}\n className={linkCls}\n href={link.href}\n onClick={(e) => {\n if (link.onClick) {\n e.preventDefault();\n link.onClick();\n }\n closeAndFocusTrigger();\n }}\n >\n {linkContent}\n </a>\n )}\n </li>\n );\n })}\n </ul>\n </div>\n </Portal>\n )}\n </li>\n );\n })}\n </ul>\n </nav>\n );\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunkMURFESTG_js = require('./chunk-MURFESTG.js');
4
+ var chunkAGMDYCGG_js = require('./chunk-AGMDYCGG.js');
5
5
  var chunkAB52PRTH_js = require('./chunk-AB52PRTH.js');
6
6
  var chunkDKOAATV2_js = require('./chunk-DKOAATV2.js');
7
7
  var chunkC4AKMVDZ_js = require('./chunk-C4AKMVDZ.js');
@@ -96,7 +96,7 @@ function CommentThread({
96
96
  // compose sits below the vertical center of the container in
97
97
  // empty state.
98
98
  /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "comments__list", children: comments.map((c) => /* @__PURE__ */ jsxRuntime.jsxs("li", { className: chunkPASF6T4H_js.cx("comment", c.internal && "comment--internal"), children: [
99
- /* @__PURE__ */ jsxRuntime.jsx(chunkMURFESTG_js.Avatar, { name: c.author.name, src: c.author.avatarSrc, size: 32 }),
99
+ /* @__PURE__ */ jsxRuntime.jsx(chunkAGMDYCGG_js.Avatar, { name: c.author.name, src: c.author.avatarSrc, size: 32 }),
100
100
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "comment__body", children: [
101
101
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "comment__head", children: [
102
102
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "comment__author", children: c.author.name }),
@@ -162,5 +162,5 @@ var _internal = { X: chunkC4AKMVDZ_js.X };
162
162
  exports.AttachmentList = AttachmentList;
163
163
  exports.CommentThread = CommentThread;
164
164
  exports._internal = _internal;
165
- //# sourceMappingURL=chunk-2EZSO6PE.js.map
166
- //# sourceMappingURL=chunk-2EZSO6PE.js.map
165
+ //# sourceMappingURL=chunk-UROEA7L4.js.map
166
+ //# sourceMappingURL=chunk-UROEA7L4.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Comments.tsx"],"names":["React","useLocale","jsxs","cx","jsx","Avatar","FileText","format","Download","Trash","X"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCA,IAAM,oBAAA,GAAuB,GAAA;AAEtB,SAAS,aAAA,CAAc;AAAA,EAC5B,QAAA;AAAA,EAAU,KAAA;AAAA,EAAO,WAAA;AAAA,EACjB,aAAA,GAAgB,KAAA;AAAA,EAAO,WAAA,GAAc,SAAA;AAAA,EACrC,SAAA;AAAA,EAAW,GAAG;AAChB,CAAA,EAAuB;AACrB,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAUA,0BAAS,EAAE,CAAA;AAC3C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAUA,0BAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAUA,0BAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,IAAIC,0BAAA,EAAU;AACpB,EAAA,MAAM,EAAA,GAAK,WAAA,IAAe,CAAA,CAAE,sBAAsB,CAAA;AAClD,EAAA,MAAM,WAAW,WAAA,KAAgB,QAAA;AACjC,EAAA,MAAM,WAAA,GAAoBD,wBAA4B,IAAI,CAAA;AAK1D,EAAA,MAAM,WAAA,GAAoBA,wBAAsB,IAAI,CAAA;AASpD,EAAMA,2BAAU,MAAM;AACpB,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AACtB,MAAA,QAAA,CAAS,KAAK,CAAA;AACd,MAAA;AAAA,IACF;AACA,IAAA,MAAM,KAAK,WAAA,CAAY,OAAA;AACvB,IAAA,IAAI,CAAC,EAAA,EAAI;AAYT,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,MAAM,UAAU,MAAM;AACpB,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,MAAM,OAAO,WAAA,CAAY,OAAA;AACzB,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,IAAA,CAAK,MAAM,MAAA,GAAS,MAAA;AAIpB,MAAA,MAAM,UAAU,IAAA,CAAK,YAAA;AAGrB,MAAA,MAAM,KAAK,IAAA,CAAK,YAAA;AAChB,MAAA,IAAI,WAAA,CAAY,OAAA,IAAW,IAAA,EAAM,WAAA,CAAY,OAAA,GAAU,EAAA;AACvD,MAAA,IAAA,CAAK,MAAM,MAAA,GAAS,CAAA,EAAG,KAAK,GAAA,CAAI,OAAA,EAAS,oBAAoB,CAAC,CAAA,EAAA,CAAA;AAI9D,MAAA,QAAA,CAAS,EAAA,GAAA,CAAM,WAAA,CAAY,OAAA,IAAW,EAAA,IAAM,CAAC,CAAA;AAAA,IAC/C,CAAA;AACA,IAAA,OAAA,EAAQ;AAKR,IAAA,IAAI,OAAO,QAAA,KAAa,WAAA,IAAe,SAAS,KAAA,IAAS,QAAA,CAAS,MAAM,KAAA,EAAO;AAC7E,MAAA,QAAA,CAAS,MAAM,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA,CAAE,MAAM,MAAM;AAAA,MAA8C,CAAC,CAAA;AAAA,IAChG;AACA,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,GAAY,IAAA;AAAA,IAAM,CAAA;AAAA,EACnC,CAAA,EAAG,CAAC,KAAA,EAAO,QAAQ,CAAC,CAAA;AAEpB,EAAA,MAAM,SAAS,MAAM;AACnB,IAAA,IAAI,CAAC,KAAA,CAAM,IAAA,EAAK,IAAK,CAAC,KAAA,EAAO;AAC7B,IAAA,KAAA,CAAM,OAAO,QAAQ,CAAA;AACrB,IAAA,QAAA,CAAS,EAAE,CAAA;AACX,IAAA,WAAA,CAAY,KAAK,CAAA;AAAA,EACnB,CAAA;AAIA,EAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAAgD;AACjE,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAA,EAAU;AACrC,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,MAAA,EAAO;AAAA,EACT,CAAA;AAEA,EAAA,uBACEE,eAAA,CAAC,SAAI,SAAA,EAAWC,mBAAA,CAAG,YAAY,SAAS,CAAA,EAAI,GAAG,IAAA,EAC5C,QAAA,EAAA;AAAA,IAAA,QAAA,CAAS,MAAA,GAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mCAOhB,IAAA,EAAA,EAAG,SAAA,EAAU,gBAAA,EACX,QAAA,EAAA,QAAA,CAAS,IAAI,CAAC,CAAA,qBACbD,eAAA,CAAC,IAAA,EAAA,EAAc,WAAWC,mBAAA,CAAG,SAAA,EAAW,CAAA,CAAE,QAAA,IAAY,mBAAmB,CAAA,EACvE,QAAA,EAAA;AAAA,sBAAAC,cAAA,CAACC,uBAAA,EAAA,EAAO,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,IAAA,EAAM,KAAK,CAAA,CAAE,MAAA,CAAO,SAAA,EAAW,IAAA,EAAM,EAAA,EAAI,CAAA;AAAA,sBAChEH,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,eAAA,EACb,QAAA,EAAA;AAAA,0BAAAE,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAA,EAAmB,QAAA,EAAA,CAAA,CAAE,OAAO,IAAA,EAAK,CAAA;AAAA,0BACjDA,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAiB,YAAE,SAAA,EAAU,CAAA;AAAA,UAC5C,CAAA,CAAE,4BAAYA,cAAA,CAAC,MAAA,EAAA,EAAK,WAAU,cAAA,EAAgB,QAAA,EAAA,CAAA,CAAE,sBAAsB,CAAA,EAAE;AAAA,SAAA,EAC3E,CAAA;AAAA,wBACAA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EAAiB,YAAE,IAAA,EAAK;AAAA,OAAA,EACzC;AAAA,KAAA,EAAA,EATO,CAAA,CAAE,EAUX,CACD,CAAA,EACH,CAAA;AAAA,IAED,KAAA,oBACCF,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAWC,mBAAA,CAAG,mBAAA,EAAqB,QAAA,IAAY,2BAAA,EAA6B,QAAA,IAAY,KAAA,IAAS,UAAU,CAAA,EAC9G,QAAA,EAAA;AAAA,sBAAAC,cAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,WAAA;AAAA,UACL,SAAA,EAAU,UAAA;AAAA,UACV,KAAA,EAAO,KAAA;AAAA,UACP,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UACxC,SAAA;AAAA,UACA,WAAA,EAAa,EAAA;AAAA,UACb,IAAA,EAAM,WAAW,CAAA,GAAI;AAAA;AAAA,OACvB;AAAA,MACC,QAAA,kCACE,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAU,mDAAA,EAAoD,UAAU,CAAC,KAAA,CAAM,MAAK,EAAG,OAAA,EAAS,QACnH,QAAA,EAAA,CAAA,CAAE,eAAe,GACpB,CAAA,mBAEAF,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACZ,QAAA,EAAA;AAAA,QAAA,aAAA,oBACCA,eAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,2BAAA,EACf,QAAA,EAAA;AAAA,0BAAAE,cAAA,CAAC,OAAA,EAAA,EAAM,IAAA,EAAK,UAAA,EAAW,OAAA,EAAS,QAAA,EAAU,QAAA,EAAU,CAAC,CAAA,KAAM,WAAA,CAAY,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,EAAG,CAAA;AAAA,0BAC1FA,cAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,CAAA,CAAE,uBAAuB,CAAA,EAAE;AAAA,SAAA,EACpC,CAAA;AAAA,wBAEFA,cAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,WAAU,0BAAA,EAA2B,QAAA,EAAU,CAAC,KAAA,CAAM,MAAK,EAAG,OAAA,EAAS,MAAA,EAC1F,QAAA,EAAA,CAAA,CAAE,eAAe,CAAA,EACpB;AAAA,OAAA,EACF;AAAA,KAAA,EAEJ;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAmBO,SAAS,eAAe,EAAE,WAAA,EAAa,cAAc,SAAA,EAAW,GAAG,MAAK,EAAwB;AACrG,EAAA,MAAM,IAAIH,0BAAA,EAAU;AACpB,EAAA,MAAM,KAAA,GAAQ,YAAA,IAAgB,CAAA,CAAE,mBAAmB,CAAA;AACnD,EAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC5B,IAAA,uBAAOG,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EAAsB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,EACpD;AACA,EAAA,sCACG,IAAA,EAAA,EAAG,SAAA,EAAWD,mBAAA,CAAG,aAAA,EAAe,SAAS,CAAA,EAAI,GAAG,IAAA,EAC9C,QAAA,EAAA,WAAA,CAAY,IAAI,CAAC,CAAA,qBAChBD,eAAA,CAAC,IAAA,EAAA,EAAc,WAAU,YAAA,EACvB,QAAA,EAAA;AAAA,oBAAAE,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EAAmB,aAAA,EAAY,MAAA,EAC5C,QAAA,EAAA,CAAA,CAAE,IAAA,oBAAQA,cAAA,CAACE,yBAAA,EAAA,EAAS,IAAA,EAAM,EAAA,EAAI,CAAA,EACjC,CAAA;AAAA,oBACAJ,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACb,QAAA,EAAA;AAAA,sBAAAE,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EAAoB,QAAA,EAAA,CAAA,CAAE,IAAA,EAAK,CAAA;AAAA,sBAC1CF,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACZ,QAAA,EAAA;AAAA,QAAA,CAAA,CAAE,IAAA,oBAAQE,cAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,CAAA,CAAE,IAAA,EAAK,CAAA;AAAA,QACxB,CAAA,CAAE,UAAA,oBAAcF,eAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,UAAA,OAAA;AAAA,UAAG,CAAA,CAAE;AAAA,SAAA,EAAW,CAAA;AAAA,QACtC,CAAA,CAAE,UAAA,oBAAcA,eAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,UAAA,OAAA;AAAA,UAAG,CAAA,CAAE;AAAA,SAAA,EAAW;AAAA,OAAA,EACzC;AAAA,KAAA,EACF,CAAA;AAAA,oBACAA,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACZ,QAAA,EAAA;AAAA,MAAA,CAAA,CAAE,GAAA,oBACDE,cAAA,CAAC,GAAA,EAAA,EAAE,IAAA,EAAM,CAAA,CAAE,KAAK,QAAA,EAAQ,IAAA,EAAC,SAAA,EAAU,oBAAA,EAAqB,YAAA,EAAYG,uBAAA,CAAO,EAAE,sBAAsB,CAAA,EAAG,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,CAAA,EACpH,QAAA,kBAAAH,cAAA,CAACI,yBAAA,EAAA,EAAS,IAAA,EAAM,EAAA,EAAI,CAAA,EACtB,CAAA;AAAA,MAED,CAAA,CAAE,QAAA,oBACDJ,cAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,+CAAA,EAAgD,YAAA,EAAYG,uBAAA,CAAO,CAAA,CAAE,oBAAoB,CAAA,EAAG,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,CAAA,EAAG,OAAA,EAAS,CAAA,CAAE,QAAA,EACxJ,QAAA,kBAAAH,cAAA,CAACK,sBAAA,EAAA,EAAM,IAAA,EAAM,EAAA,EAAI,CAAA,EACnB;AAAA,KAAA,EAEJ;AAAA,GAAA,EAAA,EAvBO,CAAA,CAAE,EAwBX,CACD,CAAA,EACH,CAAA;AAEJ;AAGO,IAAM,SAAA,GAAY,KAAEC,kBAAA","file":"chunk-2EZSO6PE.js","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { Avatar } from './Display2';\nimport { FileText, Download, Trash, X } from './Icons';\nimport { useLocale } from '../locale/LocaleProvider';\nimport { format } from '../locale/messages';\n\n// ---------- CommentThread ----------------------------------------------\nexport interface CommentItem {\n id: string;\n author: { name: string; avatarSrc?: string };\n body: React.ReactNode;\n timestamp: React.ReactNode;\n internal?: boolean;\n}\n\nexport interface CommentThreadProps extends React.HTMLAttributes<HTMLDivElement> {\n comments: CommentItem[];\n onAdd?: (body: string, internal: boolean) => void;\n placeholder?: string;\n allowInternal?: boolean;\n /**\n * Compose layout. Default `'stacked'`: textarea on top, action row\n * below (form-style). `'inline'`: textarea and submit button share a\n * single row, the textarea auto-grows, and Enter submits while\n * Shift+Enter inserts a newline — chat convention (Slack/Linear).\n * `allowInternal` is ignored in `'inline'`; if you need the internal\n * toggle, use `'stacked'`.\n */\n inputLayout?: 'stacked' | 'inline';\n}\n\n// Inline mode auto-grow ceiling. ~5 lines at the kit's default\n// textarea font/line-height; beyond this the textarea scrolls.\nconst INLINE_MAX_HEIGHT_PX = 140;\n\nexport function CommentThread({\n comments, onAdd, placeholder,\n allowInternal = false, inputLayout = 'stacked',\n className, ...rest\n}: CommentThreadProps) {\n const [draft, setDraft] = React.useState('');\n const [internal, setInternal] = React.useState(false);\n const [grown, setGrown] = React.useState(false);\n const t = useLocale();\n const ph = placeholder ?? t['comments.placeholder'];\n const isInline = inputLayout === 'inline';\n const textareaRef = React.useRef<HTMLTextAreaElement>(null);\n // Captures the 1-line scrollHeight on first paint with the empty\n // textarea. Anything taller than baseline + epsilon means the user\n // has typed a newline (or wrapped past one line). Cleared when\n // leaving inline mode so a re-entry re-measures.\n const baselineRef = React.useRef<number | null>(null);\n\n // Auto-grow in inline mode: reset to single-row, then size to\n // scrollHeight, capped at INLINE_MAX_HEIGHT_PX. Runs on every draft\n // change so deletes shrink the box too. Same pass detects whether the\n // textarea has grown past its 1-line baseline so the wrap can flip\n // alignment from `center` (steady state) to `flex-end` (multi-line).\n // Stacked mode keeps the static rows={3} height — no DOM measurement,\n // no observable side-effect.\n React.useEffect(() => {\n if (!isInline) {\n baselineRef.current = null;\n setGrown(false);\n return;\n }\n const el = textareaRef.current;\n if (!el) return;\n // Auto-grow runs once now (with whatever font metrics are in play)\n // and once more after web fonts settle. Without the second pass,\n // a cold load that swaps from fallback to custom font (Outfit/DM\n // Sans here) leaves the textarea's calculated height 2px short\n // of the post-swap content box — `overflow-y: auto` then shows a\n // phantom scrollbar at rest until the next draft change. This was\n // the root cause of the 1.36.x scrollbar bug; both the\n // `scrollHeight + border` and the `offsetHeight` reads were\n // honest, the metric *itself* was changing under our feet as the\n // font finished loading. `useEffect` (not `useLayoutEffect`) so\n // the first measurement runs after paint, never during reconcile.\n let cancelled = false;\n const measure = () => {\n if (cancelled) return;\n const node = textareaRef.current;\n if (!node) return;\n node.style.height = 'auto';\n // `offsetHeight` after `'auto'` is the textarea's natural\n // rendered box, border-box border included — no separate border\n // math, no `getComputedStyle` round-trip.\n const natural = node.offsetHeight;\n // `scrollHeight` here is used only for the grown-vs-baseline\n // delta: what matters is the *change*, not the absolute.\n const sh = node.scrollHeight;\n if (baselineRef.current == null) baselineRef.current = sh;\n node.style.height = `${Math.min(natural, INLINE_MAX_HEIGHT_PX)}px`;\n // 4px epsilon absorbs subpixel rounding / font-metrics noise on\n // the baseline measurement; without it the wrap flicker-toggles\n // between center and flex-end at the boundary.\n setGrown(sh > (baselineRef.current ?? sh) + 4);\n };\n measure();\n // `document.fonts.ready` resolves immediately when no fonts are\n // pending (the hot path in prod where the font is cached), so the\n // re-measure is essentially free; on a cold load it fires when the\n // swap completes and the textarea reflows to its real metric.\n if (typeof document !== 'undefined' && document.fonts && document.fonts.ready) {\n document.fonts.ready.then(measure).catch(() => { /* fonts.ready can reject on aborted nav */ });\n }\n return () => { cancelled = true; };\n }, [draft, isInline]);\n\n const submit = () => {\n if (!draft.trim() || !onAdd) return;\n onAdd(draft, internal);\n setDraft('');\n setInternal(false);\n };\n\n // Enter submits in inline mode; Shift+Enter inserts a newline. In\n // stacked mode Enter keeps its default newline behaviour (form style).\n const onKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (!isInline) return;\n if (e.key !== 'Enter' || e.shiftKey) return;\n e.preventDefault();\n submit();\n };\n\n return (\n <div className={cx('comments', className)} {...rest}>\n {comments.length > 0 && (\n // Skip the list element entirely when empty. `.comments` is a\n // flex column with `gap: var(--space-4)`; an empty `<ul>` would\n // still consume a gap slot, leaving a phantom 16px between\n // \"nothing\" and the compose row. The visual symptom: the\n // compose sits below the vertical center of the container in\n // empty state.\n <ul className=\"comments__list\">\n {comments.map((c) => (\n <li key={c.id} className={cx('comment', c.internal && 'comment--internal')}>\n <Avatar name={c.author.name} src={c.author.avatarSrc} size={32} />\n <div className=\"comment__body\">\n <div className=\"comment__head\">\n <span className=\"comment__author\">{c.author.name}</span>\n <span className=\"comment__time\">{c.timestamp}</span>\n {c.internal && <span className=\"comment__tag\">{t['comments.internalTag']}</span>}\n </div>\n <div className=\"comment__text\">{c.body}</div>\n </div>\n </li>\n ))}\n </ul>\n )}\n {onAdd && (\n <div className={cx('comments__compose', isInline && 'comments__compose--inline', isInline && grown && 'is-grown')}>\n <textarea\n ref={textareaRef}\n className=\"textarea\"\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={onKeyDown}\n placeholder={ph}\n rows={isInline ? 1 : 3}\n />\n {isInline ? (\n <button type=\"button\" className=\"btn btn--primary btn--sm comments__compose-submit\" disabled={!draft.trim()} onClick={submit}>\n {t['comments.send']}\n </button>\n ) : (\n <div className=\"comments__compose-actions\">\n {allowInternal && (\n <label className=\"comments__internal-toggle\">\n <input type=\"checkbox\" checked={internal} onChange={(e) => setInternal(e.target.checked)} />\n <span>{t['comments.internalOnly']}</span>\n </label>\n )}\n <button type=\"button\" className=\"btn btn--primary btn--sm\" disabled={!draft.trim()} onClick={submit}>\n {t['comments.send']}\n </button>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n\n// ---------- AttachmentList ---------------------------------------------\nexport interface AttachmentItem {\n id: string;\n name: string;\n size?: string; // ya formateado: \"245 KB\"\n url?: string;\n uploadedBy?: string;\n uploadedAt?: React.ReactNode;\n icon?: React.ReactNode;\n onRemove?: () => void;\n}\n\nexport interface AttachmentListProps extends React.HTMLAttributes<HTMLUListElement> {\n attachments: AttachmentItem[];\n emptyMessage?: React.ReactNode;\n}\n\nexport function AttachmentList({ attachments, emptyMessage, className, ...rest }: AttachmentListProps) {\n const t = useLocale();\n const empty = emptyMessage ?? t['attachments.empty'];\n if (attachments.length === 0) {\n return <div className=\"attachments__empty\">{empty}</div>;\n }\n return (\n <ul className={cx('attachments', className)} {...rest}>\n {attachments.map((a) => (\n <li key={a.id} className=\"attachment\">\n <span className=\"attachment__icon\" aria-hidden=\"true\">\n {a.icon ?? <FileText size={20} />}\n </span>\n <div className=\"attachment__body\">\n <div className=\"attachment__name\">{a.name}</div>\n <div className=\"attachment__meta\">\n {a.size && <span>{a.size}</span>}\n {a.uploadedBy && <span>· {a.uploadedBy}</span>}\n {a.uploadedAt && <span>· {a.uploadedAt}</span>}\n </div>\n </div>\n <div className=\"attachment__actions\">\n {a.url && (\n <a href={a.url} download className=\"attachment__action\" aria-label={format(t['attachments.download'], { name: a.name })}>\n <Download size={16} />\n </a>\n )}\n {a.onRemove && (\n <button type=\"button\" className=\"attachment__action attachment__action--danger\" aria-label={format(t['attachments.remove'], { name: a.name })} onClick={a.onRemove}>\n <Trash size={16} />\n </button>\n )}\n </div>\n </li>\n ))}\n </ul>\n );\n}\n\n// re-export para que el bundle no tenga dead imports\nexport const _internal = { X };\n"]}
1
+ {"version":3,"sources":["../src/components/Comments.tsx"],"names":["React","useLocale","jsxs","cx","jsx","Avatar","FileText","format","Download","Trash","X"],"mappings":"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","file":"chunk-UROEA7L4.js","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { Avatar } from './Display2';\nimport { FileText, Download, Trash, X } from './Icons';\nimport { useLocale } from '../locale/LocaleProvider';\nimport { format } from '../locale/messages';\n\n// ---------- CommentThread ----------------------------------------------\nexport interface CommentItem {\n id: string;\n author: { name: string; avatarSrc?: string };\n body: React.ReactNode;\n timestamp: React.ReactNode;\n internal?: boolean;\n}\n\nexport interface CommentThreadProps extends React.HTMLAttributes<HTMLDivElement> {\n comments: CommentItem[];\n onAdd?: (body: string, internal: boolean) => void;\n placeholder?: string;\n allowInternal?: boolean;\n /**\n * Compose layout. Default `'stacked'`: textarea on top, action row\n * below (form-style). `'inline'`: textarea and submit button share a\n * single row, the textarea auto-grows, and Enter submits while\n * Shift+Enter inserts a newline — chat convention (Slack/Linear).\n * `allowInternal` is ignored in `'inline'`; if you need the internal\n * toggle, use `'stacked'`.\n */\n inputLayout?: 'stacked' | 'inline';\n}\n\n// Inline mode auto-grow ceiling. ~5 lines at the kit's default\n// textarea font/line-height; beyond this the textarea scrolls.\nconst INLINE_MAX_HEIGHT_PX = 140;\n\nexport function CommentThread({\n comments, onAdd, placeholder,\n allowInternal = false, inputLayout = 'stacked',\n className, ...rest\n}: CommentThreadProps) {\n const [draft, setDraft] = React.useState('');\n const [internal, setInternal] = React.useState(false);\n const [grown, setGrown] = React.useState(false);\n const t = useLocale();\n const ph = placeholder ?? t['comments.placeholder'];\n const isInline = inputLayout === 'inline';\n const textareaRef = React.useRef<HTMLTextAreaElement>(null);\n // Captures the 1-line scrollHeight on first paint with the empty\n // textarea. Anything taller than baseline + epsilon means the user\n // has typed a newline (or wrapped past one line). Cleared when\n // leaving inline mode so a re-entry re-measures.\n const baselineRef = React.useRef<number | null>(null);\n\n // Auto-grow in inline mode: reset to single-row, then size to\n // scrollHeight, capped at INLINE_MAX_HEIGHT_PX. Runs on every draft\n // change so deletes shrink the box too. Same pass detects whether the\n // textarea has grown past its 1-line baseline so the wrap can flip\n // alignment from `center` (steady state) to `flex-end` (multi-line).\n // Stacked mode keeps the static rows={3} height — no DOM measurement,\n // no observable side-effect.\n React.useEffect(() => {\n if (!isInline) {\n baselineRef.current = null;\n setGrown(false);\n return;\n }\n const el = textareaRef.current;\n if (!el) return;\n // Auto-grow runs once now (with whatever font metrics are in play)\n // and once more after web fonts settle. Without the second pass,\n // a cold load that swaps from fallback to custom font (Outfit/DM\n // Sans here) leaves the textarea's calculated height 2px short\n // of the post-swap content box — `overflow-y: auto` then shows a\n // phantom scrollbar at rest until the next draft change. This was\n // the root cause of the 1.36.x scrollbar bug; both the\n // `scrollHeight + border` and the `offsetHeight` reads were\n // honest, the metric *itself* was changing under our feet as the\n // font finished loading. `useEffect` (not `useLayoutEffect`) so\n // the first measurement runs after paint, never during reconcile.\n let cancelled = false;\n const measure = () => {\n if (cancelled) return;\n const node = textareaRef.current;\n if (!node) return;\n node.style.height = 'auto';\n // `offsetHeight` after `'auto'` is the textarea's natural\n // rendered box, border-box border included — no separate border\n // math, no `getComputedStyle` round-trip.\n const natural = node.offsetHeight;\n // `scrollHeight` here is used only for the grown-vs-baseline\n // delta: what matters is the *change*, not the absolute.\n const sh = node.scrollHeight;\n if (baselineRef.current == null) baselineRef.current = sh;\n node.style.height = `${Math.min(natural, INLINE_MAX_HEIGHT_PX)}px`;\n // 4px epsilon absorbs subpixel rounding / font-metrics noise on\n // the baseline measurement; without it the wrap flicker-toggles\n // between center and flex-end at the boundary.\n setGrown(sh > (baselineRef.current ?? sh) + 4);\n };\n measure();\n // `document.fonts.ready` resolves immediately when no fonts are\n // pending (the hot path in prod where the font is cached), so the\n // re-measure is essentially free; on a cold load it fires when the\n // swap completes and the textarea reflows to its real metric.\n if (typeof document !== 'undefined' && document.fonts && document.fonts.ready) {\n document.fonts.ready.then(measure).catch(() => { /* fonts.ready can reject on aborted nav */ });\n }\n return () => { cancelled = true; };\n }, [draft, isInline]);\n\n const submit = () => {\n if (!draft.trim() || !onAdd) return;\n onAdd(draft, internal);\n setDraft('');\n setInternal(false);\n };\n\n // Enter submits in inline mode; Shift+Enter inserts a newline. In\n // stacked mode Enter keeps its default newline behaviour (form style).\n const onKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (!isInline) return;\n if (e.key !== 'Enter' || e.shiftKey) return;\n e.preventDefault();\n submit();\n };\n\n return (\n <div className={cx('comments', className)} {...rest}>\n {comments.length > 0 && (\n // Skip the list element entirely when empty. `.comments` is a\n // flex column with `gap: var(--space-4)`; an empty `<ul>` would\n // still consume a gap slot, leaving a phantom 16px between\n // \"nothing\" and the compose row. The visual symptom: the\n // compose sits below the vertical center of the container in\n // empty state.\n <ul className=\"comments__list\">\n {comments.map((c) => (\n <li key={c.id} className={cx('comment', c.internal && 'comment--internal')}>\n <Avatar name={c.author.name} src={c.author.avatarSrc} size={32} />\n <div className=\"comment__body\">\n <div className=\"comment__head\">\n <span className=\"comment__author\">{c.author.name}</span>\n <span className=\"comment__time\">{c.timestamp}</span>\n {c.internal && <span className=\"comment__tag\">{t['comments.internalTag']}</span>}\n </div>\n <div className=\"comment__text\">{c.body}</div>\n </div>\n </li>\n ))}\n </ul>\n )}\n {onAdd && (\n <div className={cx('comments__compose', isInline && 'comments__compose--inline', isInline && grown && 'is-grown')}>\n <textarea\n ref={textareaRef}\n className=\"textarea\"\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={onKeyDown}\n placeholder={ph}\n rows={isInline ? 1 : 3}\n />\n {isInline ? (\n <button type=\"button\" className=\"btn btn--primary btn--sm comments__compose-submit\" disabled={!draft.trim()} onClick={submit}>\n {t['comments.send']}\n </button>\n ) : (\n <div className=\"comments__compose-actions\">\n {allowInternal && (\n <label className=\"comments__internal-toggle\">\n <input type=\"checkbox\" checked={internal} onChange={(e) => setInternal(e.target.checked)} />\n <span>{t['comments.internalOnly']}</span>\n </label>\n )}\n <button type=\"button\" className=\"btn btn--primary btn--sm\" disabled={!draft.trim()} onClick={submit}>\n {t['comments.send']}\n </button>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n\n// ---------- AttachmentList ---------------------------------------------\nexport interface AttachmentItem {\n id: string;\n name: string;\n size?: string; // ya formateado: \"245 KB\"\n url?: string;\n uploadedBy?: string;\n uploadedAt?: React.ReactNode;\n icon?: React.ReactNode;\n onRemove?: () => void;\n}\n\nexport interface AttachmentListProps extends React.HTMLAttributes<HTMLUListElement> {\n attachments: AttachmentItem[];\n emptyMessage?: React.ReactNode;\n}\n\nexport function AttachmentList({ attachments, emptyMessage, className, ...rest }: AttachmentListProps) {\n const t = useLocale();\n const empty = emptyMessage ?? t['attachments.empty'];\n if (attachments.length === 0) {\n return <div className=\"attachments__empty\">{empty}</div>;\n }\n return (\n <ul className={cx('attachments', className)} {...rest}>\n {attachments.map((a) => (\n <li key={a.id} className=\"attachment\">\n <span className=\"attachment__icon\" aria-hidden=\"true\">\n {a.icon ?? <FileText size={20} />}\n </span>\n <div className=\"attachment__body\">\n <div className=\"attachment__name\">{a.name}</div>\n <div className=\"attachment__meta\">\n {a.size && <span>{a.size}</span>}\n {a.uploadedBy && <span>· {a.uploadedBy}</span>}\n {a.uploadedAt && <span>· {a.uploadedAt}</span>}\n </div>\n </div>\n <div className=\"attachment__actions\">\n {a.url && (\n <a href={a.url} download className=\"attachment__action\" aria-label={format(t['attachments.download'], { name: a.name })}>\n <Download size={16} />\n </a>\n )}\n {a.onRemove && (\n <button type=\"button\" className=\"attachment__action attachment__action--danger\" aria-label={format(t['attachments.remove'], { name: a.name })} onClick={a.onRemove}>\n <Trash size={16} />\n </button>\n )}\n </div>\n </li>\n ))}\n </ul>\n );\n}\n\n// re-export para que el bundle no tenga dead imports\nexport const _internal = { X };\n"]}
@@ -5,10 +5,10 @@ var chunkIH7U4FJT_js = require('./chunk-IH7U4FJT.js');
5
5
  var chunkMUXOT5KS_js = require('./chunk-MUXOT5KS.js');
6
6
  var chunkWAGWB35Q_js = require('./chunk-WAGWB35Q.js');
7
7
  var chunkDKOAATV2_js = require('./chunk-DKOAATV2.js');
8
+ var chunkXMLBKK7X_js = require('./chunk-XMLBKK7X.js');
9
+ var chunkCRKYET66_js = require('./chunk-CRKYET66.js');
8
10
  var chunkC4AKMVDZ_js = require('./chunk-C4AKMVDZ.js');
9
11
  var chunkPASF6T4H_js = require('./chunk-PASF6T4H.js');
10
- var chunkCRKYET66_js = require('./chunk-CRKYET66.js');
11
- var chunkXMLBKK7X_js = require('./chunk-XMLBKK7X.js');
12
12
  var React = require('react');
13
13
  var jsxRuntime = require('react/jsx-runtime');
14
14
 
@@ -611,5 +611,5 @@ exports.DatePicker = DatePicker;
611
611
  exports.FileUpload = FileUpload;
612
612
  exports.MonthPicker = MonthPicker;
613
613
  exports.YearPicker = YearPicker;
614
- //# sourceMappingURL=chunk-TCVY7K63.js.map
615
- //# sourceMappingURL=chunk-TCVY7K63.js.map
614
+ //# sourceMappingURL=chunk-VFZ7VMU2.js.map
615
+ //# sourceMappingURL=chunk-VFZ7VMU2.js.map