@misael703/ui 1.59.1 → 1.61.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/dist/{chunk-G4OOD6AR.mjs → chunk-2UW2K5MV.mjs} +3 -3
  2. package/dist/{chunk-G4OOD6AR.mjs.map → chunk-2UW2K5MV.mjs.map} +1 -1
  3. package/dist/{chunk-S3DEFKS5.js → chunk-324O7B3R.js} +5 -5
  4. package/dist/{chunk-S3DEFKS5.js.map → chunk-324O7B3R.js.map} +1 -1
  5. package/dist/{chunk-XF445GS6.js → chunk-3N24QPRP.js} +12 -12
  6. package/dist/{chunk-XF445GS6.js.map → chunk-3N24QPRP.js.map} +1 -1
  7. package/dist/{chunk-4G6NENVM.js → chunk-3RB4OZTJ.js} +160 -31
  8. package/dist/chunk-3RB4OZTJ.js.map +1 -0
  9. package/dist/{chunk-T2DNEJR3.mjs → chunk-4Z5GFOIU.mjs} +4 -4
  10. package/dist/{chunk-T2DNEJR3.mjs.map → chunk-4Z5GFOIU.mjs.map} +1 -1
  11. package/dist/{chunk-3IZYL42M.js → chunk-53MN366Q.js} +8 -8
  12. package/dist/{chunk-3IZYL42M.js.map → chunk-53MN366Q.js.map} +1 -1
  13. package/dist/{chunk-ESU5UMEK.mjs → chunk-5C7LUIBN.mjs} +4 -4
  14. package/dist/{chunk-ESU5UMEK.mjs.map → chunk-5C7LUIBN.mjs.map} +1 -1
  15. package/dist/{chunk-J2HHAZHV.mjs → chunk-5G3DVB5B.mjs} +5 -5
  16. package/dist/{chunk-J2HHAZHV.mjs.map → chunk-5G3DVB5B.mjs.map} +1 -1
  17. package/dist/{chunk-VMTN5C6F.mjs → chunk-67SCO4BO.mjs} +4 -4
  18. package/dist/{chunk-VMTN5C6F.mjs.map → chunk-67SCO4BO.mjs.map} +1 -1
  19. package/dist/{chunk-DN4KVUJF.mjs → chunk-6IXP5UIY.mjs} +3 -3
  20. package/dist/{chunk-DN4KVUJF.mjs.map → chunk-6IXP5UIY.mjs.map} +1 -1
  21. package/dist/{chunk-6JXGCU7F.mjs → chunk-6UYKIUQB.mjs} +4 -4
  22. package/dist/{chunk-6JXGCU7F.mjs.map → chunk-6UYKIUQB.mjs.map} +1 -1
  23. package/dist/{chunk-3PYU6OHQ.js → chunk-7AJAQJOX.js} +10 -10
  24. package/dist/{chunk-3PYU6OHQ.js.map → chunk-7AJAQJOX.js.map} +1 -1
  25. package/dist/{chunk-YHB3BPZR.js → chunk-7CA4IMXM.js} +4 -4
  26. package/dist/{chunk-YHB3BPZR.js.map → chunk-7CA4IMXM.js.map} +1 -1
  27. package/dist/{chunk-G3V4UOZW.js → chunk-AB52PRTH.js} +2 -2
  28. package/dist/{chunk-G3V4UOZW.js.map → chunk-AB52PRTH.js.map} +1 -1
  29. package/dist/{chunk-RZQIZZKH.mjs → chunk-CEDAYY2N.mjs} +4 -4
  30. package/dist/{chunk-RZQIZZKH.mjs.map → chunk-CEDAYY2N.mjs.map} +1 -1
  31. package/dist/{chunk-QHI4S5PM.mjs → chunk-DAITXFG3.mjs} +4 -4
  32. package/dist/{chunk-QHI4S5PM.mjs.map → chunk-DAITXFG3.mjs.map} +1 -1
  33. package/dist/{chunk-DOAGIAIQ.js → chunk-DF4CKUI6.js} +7 -7
  34. package/dist/{chunk-DOAGIAIQ.js.map → chunk-DF4CKUI6.js.map} +1 -1
  35. package/dist/{chunk-A42WMR4M.js → chunk-DKOAATV2.js} +5 -2
  36. package/dist/chunk-DKOAATV2.js.map +1 -0
  37. package/dist/{chunk-XJHK3RH5.mjs → chunk-DLPTIVZB.mjs} +3 -3
  38. package/dist/{chunk-XJHK3RH5.mjs.map → chunk-DLPTIVZB.mjs.map} +1 -1
  39. package/dist/{chunk-PKUOZT75.js → chunk-DYYMUXKH.js} +7 -7
  40. package/dist/{chunk-PKUOZT75.js.map → chunk-DYYMUXKH.js.map} +1 -1
  41. package/dist/{chunk-HKHGODQE.js → chunk-E6BTT4I7.js} +10 -10
  42. package/dist/{chunk-HKHGODQE.js.map → chunk-E6BTT4I7.js.map} +1 -1
  43. package/dist/{chunk-2TKTMFVC.mjs → chunk-EFX3FU6B.mjs} +4 -4
  44. package/dist/{chunk-2TKTMFVC.mjs.map → chunk-EFX3FU6B.mjs.map} +1 -1
  45. package/dist/{chunk-LYT27EIM.js → chunk-EHTHHF2P.js} +6 -6
  46. package/dist/{chunk-LYT27EIM.js.map → chunk-EHTHHF2P.js.map} +1 -1
  47. package/dist/{chunk-6OBFBETV.mjs → chunk-GNI5MH36.mjs} +4 -4
  48. package/dist/{chunk-6OBFBETV.mjs.map → chunk-GNI5MH36.mjs.map} +1 -1
  49. package/dist/{chunk-SCUHLOET.mjs → chunk-HGS3ATU2.mjs} +8 -8
  50. package/dist/chunk-HGS3ATU2.mjs.map +1 -0
  51. package/dist/{chunk-F237OMT6.js → chunk-HYB7EXRB.js} +11 -11
  52. package/dist/{chunk-F237OMT6.js.map → chunk-HYB7EXRB.js.map} +1 -1
  53. package/dist/{chunk-VGA7UT6T.mjs → chunk-IGNKSI2E.mjs} +2 -2
  54. package/dist/{chunk-VGA7UT6T.mjs.map → chunk-IGNKSI2E.mjs.map} +1 -1
  55. package/dist/{chunk-RFWSMP7Q.js → chunk-IH7U4FJT.js} +6 -6
  56. package/dist/{chunk-RFWSMP7Q.js.map → chunk-IH7U4FJT.js.map} +1 -1
  57. package/dist/{chunk-Q4WPZJUS.mjs → chunk-JXRAMV3H.mjs} +149 -20
  58. package/dist/chunk-JXRAMV3H.mjs.map +1 -0
  59. package/dist/{chunk-AECVFYGP.mjs → chunk-LMJW566R.mjs} +3 -3
  60. package/dist/{chunk-AECVFYGP.mjs.map → chunk-LMJW566R.mjs.map} +1 -1
  61. package/dist/{chunk-MSDFMVIF.js → chunk-M7QZCHMM.js} +5 -5
  62. package/dist/{chunk-MSDFMVIF.js.map → chunk-M7QZCHMM.js.map} +1 -1
  63. package/dist/{chunk-MVJITG75.js → chunk-MUXOT5KS.js} +16 -2
  64. package/dist/chunk-MUXOT5KS.js.map +1 -0
  65. package/dist/{chunk-T46LLZHX.js → chunk-NUTHJQYH.js} +13 -13
  66. package/dist/{chunk-T46LLZHX.js.map → chunk-NUTHJQYH.js.map} +1 -1
  67. package/dist/{chunk-4QHE5H36.mjs → chunk-ODE2ROR2.mjs} +16 -3
  68. package/dist/chunk-ODE2ROR2.mjs.map +1 -0
  69. package/dist/{chunk-KYYRQNY7.mjs → chunk-OOIRRKJ7.mjs} +5 -2
  70. package/dist/chunk-OOIRRKJ7.mjs.map +1 -0
  71. package/dist/{chunk-O3KM5SQB.mjs → chunk-ORTQGS7I.mjs} +5 -5
  72. package/dist/{chunk-O3KM5SQB.mjs.map → chunk-ORTQGS7I.mjs.map} +1 -1
  73. package/dist/{chunk-5OZ6QIFC.mjs → chunk-QWQSOJFP.mjs} +3 -3
  74. package/dist/{chunk-5OZ6QIFC.mjs.map → chunk-QWQSOJFP.mjs.map} +1 -1
  75. package/dist/{chunk-ZXHOBEQM.js → chunk-RPNLDCRV.js} +6 -6
  76. package/dist/{chunk-ZXHOBEQM.js.map → chunk-RPNLDCRV.js.map} +1 -1
  77. package/dist/{chunk-J2PQFMR5.js → chunk-SA7NCLEK.js} +7 -7
  78. package/dist/{chunk-J2PQFMR5.js.map → chunk-SA7NCLEK.js.map} +1 -1
  79. package/dist/{chunk-VLTIVWKF.mjs → chunk-SB7XXXWS.mjs} +4 -4
  80. package/dist/{chunk-VLTIVWKF.mjs.map → chunk-SB7XXXWS.mjs.map} +1 -1
  81. package/dist/{chunk-SHIQMHQP.js → chunk-UROEA7L4.js} +8 -8
  82. package/dist/{chunk-SHIQMHQP.js.map → chunk-UROEA7L4.js.map} +1 -1
  83. package/dist/{chunk-KY6OH2IK.js → chunk-UW5DUEXJ.js} +4 -4
  84. package/dist/{chunk-KY6OH2IK.js.map → chunk-UW5DUEXJ.js.map} +1 -1
  85. package/dist/{chunk-S3MMU3LW.js → chunk-VFZ7VMU2.js} +24 -24
  86. package/dist/chunk-VFZ7VMU2.js.map +1 -0
  87. package/dist/{chunk-JZZHOJWY.mjs → chunk-YBJ7NFFW.mjs} +4 -4
  88. package/dist/{chunk-JZZHOJWY.mjs.map → chunk-YBJ7NFFW.mjs.map} +1 -1
  89. package/dist/components/AdvancedPickers.d.mts +14 -1
  90. package/dist/components/AdvancedPickers.d.ts +14 -1
  91. package/dist/components/AdvancedPickers.js +8 -8
  92. package/dist/components/AdvancedPickers.mjs +4 -4
  93. package/dist/components/AppShell.js +4 -4
  94. package/dist/components/AppShell.mjs +2 -2
  95. package/dist/components/Comments.js +6 -6
  96. package/dist/components/Comments.mjs +3 -3
  97. package/dist/components/Commerce.js +15 -15
  98. package/dist/components/Commerce.mjs +4 -4
  99. package/dist/components/DataTable.js +11 -11
  100. package/dist/components/DataTable.mjs +4 -4
  101. package/dist/components/Display.js +13 -13
  102. package/dist/components/Display.mjs +2 -2
  103. package/dist/components/Display3.js +9 -9
  104. package/dist/components/Display3.mjs +3 -3
  105. package/dist/components/Editing.js +9 -9
  106. package/dist/components/Editing.mjs +3 -3
  107. package/dist/components/Filters.js +9 -9
  108. package/dist/components/Filters.mjs +3 -3
  109. package/dist/components/Gallery.js +5 -5
  110. package/dist/components/Gallery.mjs +3 -3
  111. package/dist/components/Inputs.js +7 -7
  112. package/dist/components/Inputs.mjs +3 -3
  113. package/dist/components/InputsExtra.js +12 -12
  114. package/dist/components/InputsExtra.mjs +3 -3
  115. package/dist/components/Notifications.js +4 -4
  116. package/dist/components/Notifications.mjs +3 -3
  117. package/dist/components/Overlay.js +4 -4
  118. package/dist/components/Overlay.mjs +2 -2
  119. package/dist/components/Permissions.js +4 -4
  120. package/dist/components/Permissions.mjs +3 -3
  121. package/dist/components/Pickers.js +9 -9
  122. package/dist/components/Pickers.mjs +4 -4
  123. package/dist/components/TimeAgo.js +6 -6
  124. package/dist/components/TimeAgo.mjs +4 -4
  125. package/dist/components/Toast.js +4 -4
  126. package/dist/components/Toast.mjs +2 -2
  127. package/dist/index.d.mts +2 -2
  128. package/dist/index.d.ts +2 -2
  129. package/dist/index.js +131 -127
  130. package/dist/index.mjs +22 -22
  131. package/dist/locale/index.d.mts +2 -2
  132. package/dist/locale/index.d.ts +2 -2
  133. package/dist/locale/index.js +6 -6
  134. package/dist/locale/index.mjs +2 -2
  135. package/dist/{messages-B3tPolS2.d.ts → messages-Cd8MBbpL.d.mts} +3 -0
  136. package/dist/{messages-B3tPolS2.d.mts → messages-Cd8MBbpL.d.ts} +3 -0
  137. package/dist/styles.css +1 -1
  138. package/dist/utils/dateFormat.d.mts +17 -1
  139. package/dist/utils/dateFormat.d.ts +17 -1
  140. package/dist/utils/dateFormat.js +18 -14
  141. package/dist/utils/dateFormat.mjs +1 -1
  142. package/dist/utils/smartTime.d.mts +1 -1
  143. package/dist/utils/smartTime.d.ts +1 -1
  144. package/dist/utils/smartTime.js +6 -6
  145. package/dist/utils/smartTime.mjs +2 -2
  146. package/package.json +1 -1
  147. package/dist/chunk-4G6NENVM.js.map +0 -1
  148. package/dist/chunk-4QHE5H36.mjs.map +0 -1
  149. package/dist/chunk-A42WMR4M.js.map +0 -1
  150. package/dist/chunk-KYYRQNY7.mjs.map +0 -1
  151. package/dist/chunk-MVJITG75.js.map +0 -1
  152. package/dist/chunk-Q4WPZJUS.mjs.map +0 -1
  153. package/dist/chunk-S3MMU3LW.js.map +0 -1
  154. package/dist/chunk-SCUHLOET.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/InputsExtra.tsx"],"names":["React","Slider","cx","jsx","jsxs","useLocale","format","X","MoneyInput","getBrand","usePopoverPosition","useDismiss","Clock","Portal"],"mappings":"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","file":"chunk-J2PQFMR5.js","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { X, Clock } from './Icons';\nimport { getBrand } from '../brand';\nimport { useLocale } from '../locale/LocaleProvider';\nimport { format } from '../locale/messages';\nimport { Portal } from './Portal';\nimport { usePopoverPosition } from '../hooks/usePopoverPosition';\nimport { useDismiss } from '../hooks/useDismiss';\n\n// ---------- Slider ------------------------------------------------------\nexport interface SliderProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'onChange' | 'value' | 'type'> {\n value: number;\n onChange: (v: number) => void;\n min?: number;\n max?: number;\n step?: number;\n showValue?: boolean;\n formatValue?: (v: number) => string;\n}\n\nexport const Slider = React.forwardRef<HTMLInputElement, SliderProps>(function Slider(\n { value, onChange, min = 0, max = 100, step = 1, showValue, formatValue, className, ...rest },\n ref\n) {\n const pct = ((value - min) / (max - min)) * 100;\n return (\n <div className={cx('slider', className)}>\n <input\n ref={ref}\n type=\"range\"\n className=\"slider__input\"\n value={value}\n min={min}\n max={max}\n step={step}\n onChange={(e) => onChange(Number(e.target.value))}\n style={{ '--pct': `${pct}%` } as React.CSSProperties}\n {...rest}\n />\n {showValue && (\n <span className=\"slider__value\">{formatValue ? formatValue(value) : value}</span>\n )}\n </div>\n );\n});\n\n// ---------- Progress (linear + circular) --------------------------------\nexport interface ProgressProps {\n value: number; // 0–100\n variant?: 'blue' | 'orange' | 'success' | 'warning' | 'danger';\n showLabel?: boolean;\n size?: 'sm' | 'md';\n className?: string;\n}\n\nexport function Progress({ value, variant = 'blue', showLabel, size = 'md', className }: ProgressProps) {\n const v = Math.max(0, Math.min(100, value));\n return (\n <div className={cx('progress', size === 'sm' && 'progress--sm', className)}>\n <div className={cx('progress__bar', `progress__bar--${variant}`)} style={{ width: `${v}%` }} role=\"progressbar\" aria-valuenow={v} aria-valuemin={0} aria-valuemax={100} />\n {showLabel && <span className=\"progress__label\">{Math.round(v)}%</span>}\n </div>\n );\n}\n\nexport interface ProgressCircleProps {\n value: number;\n size?: number;\n stroke?: number;\n variant?: 'blue' | 'orange' | 'success' | 'warning' | 'danger';\n showLabel?: boolean;\n className?: string;\n}\n\nexport function ProgressCircle({ value, size = 64, stroke = 6, variant = 'blue', showLabel = true, className }: ProgressCircleProps) {\n const v = Math.max(0, Math.min(100, value));\n const r = (size - stroke) / 2;\n const c = 2 * Math.PI * r;\n const off = c - (v / 100) * c;\n const colorVar = {\n blue: 'var(--color-primary)',\n orange: 'var(--color-secondary)',\n success: 'var(--color-success)',\n warning: 'var(--color-warning)',\n danger: 'var(--color-danger)',\n }[variant];\n return (\n <div className={cx('progress-circle', className)} style={{ width: size, height: size }} role=\"progressbar\" aria-valuenow={v} aria-valuemin={0} aria-valuemax={100}>\n <svg width={size} height={size} viewBox={`0 0 ${size} ${size}`}>\n <circle cx={size/2} cy={size/2} r={r} stroke=\"var(--bg-subtle)\" strokeWidth={stroke} fill=\"none\" />\n <circle\n cx={size/2} cy={size/2} r={r}\n stroke={colorVar} strokeWidth={stroke} fill=\"none\"\n strokeDasharray={c} strokeDashoffset={off} strokeLinecap=\"round\"\n style={{ transform: 'rotate(-90deg)', transformOrigin: '50% 50%', transition: 'stroke-dashoffset 320ms var(--ease-standard, ease-out)' }}\n />\n </svg>\n {showLabel && <span className=\"progress-circle__label\">{Math.round(v)}%</span>}\n </div>\n );\n}\n\n// ---------- Tag input ---------------------------------------------------\nexport interface TagInputProps {\n value: string[];\n onChange: (tags: string[]) => void;\n placeholder?: string;\n separator?: RegExp;\n maxTags?: number;\n validate?: (tag: string) => boolean;\n disabled?: boolean;\n className?: string;\n id?: string;\n}\n\nexport function TagInput({\n value, onChange, placeholder,\n separator = /[,\\s]+/, maxTags, validate, disabled, className, id,\n}: TagInputProps) {\n const [draft, setDraft] = React.useState('');\n const locale = useLocale();\n const ph = placeholder ?? locale['tagsInput.placeholder'];\n\n const addTags = (raw: string) => {\n const next = raw.split(separator).map((t) => t.trim()).filter(Boolean);\n if (next.length === 0) return;\n let merged = [...value];\n for (const t of next) {\n if (validate && !validate(t)) continue;\n if (merged.includes(t)) continue;\n if (maxTags && merged.length >= maxTags) break;\n merged.push(t);\n }\n onChange(merged);\n setDraft('');\n };\n\n return (\n <div className={cx('tag-input', disabled && 'is-disabled', className)} onClick={(e) => {\n const input = (e.currentTarget.querySelector('input') as HTMLInputElement);\n input?.focus();\n }}>\n {value.map((t, i) => (\n <span key={`${t}-${i}`} className=\"tag-input__tag\">\n {t}\n <button type=\"button\" aria-label={format(locale['tagsInput.remove'], { tag: t })} onClick={() => onChange(value.filter((_, idx) => idx !== i))}><X size={12} /></button>\n </span>\n ))}\n <input\n id={id}\n className=\"tag-input__field\"\n value={draft}\n disabled={disabled}\n placeholder={value.length === 0 ? ph : ''}\n onChange={(e) => {\n const v = e.target.value;\n if (separator.test(v)) addTags(v);\n else setDraft(v);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && draft.trim()) {\n e.preventDefault();\n addTags(draft);\n } else if (e.key === 'Backspace' && !draft && value.length) {\n onChange(value.slice(0, -1));\n }\n }}\n onBlur={() => draft.trim() && addTags(draft)}\n />\n </div>\n );\n}\n\n// ---------- MoneyInput (CLP-friendly, but accepts any locale) -----------\nexport interface MoneyInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'onChange' | 'value' | 'type'> {\n value: number | null;\n onChange: (v: number | null) => void;\n currency?: string; // 'CLP' | 'USD' | 'EUR' | …\n locale?: string; // 'es-CL' | …\n invalid?: boolean;\n}\n\nexport const MoneyInput = React.forwardRef<HTMLInputElement, MoneyInputProps>(function MoneyInput(\n { value, onChange, currency, locale, invalid, className, disabled, ...rest },\n ref\n) {\n const brand = getBrand();\n const resolvedCurrency = currency ?? brand.currency;\n const resolvedLocale = locale ?? brand.locale;\n const [focus, setFocus] = React.useState(false);\n const display = value == null\n ? ''\n : focus\n ? String(value)\n : new Intl.NumberFormat(resolvedLocale, { style: 'currency', currency: resolvedCurrency, maximumFractionDigits: 0 }).format(value);\n return (\n <input\n ref={ref}\n type=\"text\"\n inputMode=\"numeric\"\n className={cx('input', invalid && 'is-invalid', className)}\n value={display}\n disabled={disabled}\n onFocus={() => setFocus(true)}\n onBlur={() => setFocus(false)}\n onChange={(e) => {\n const cleaned = e.target.value.replace(/[^\\d-]/g, '');\n if (!cleaned || cleaned === '-') return onChange(null);\n const n = Number(cleaned);\n onChange(Number.isFinite(n) ? n : null);\n }}\n aria-invalid={invalid || undefined}\n {...rest}\n />\n );\n});\n\n// ---------- PhoneInput (CL default, prefix + digits) --------------------\nexport interface PhoneInputProps {\n value: string;\n onChange: (v: string) => void;\n prefix?: string;\n invalid?: boolean;\n disabled?: boolean;\n className?: string;\n id?: string;\n placeholder?: string;\n}\n\nexport function PhoneInput({ value, onChange, prefix, invalid, disabled, className, id, placeholder = '9 1234 5678' }: PhoneInputProps) {\n return (\n <div className={cx('phone-input', invalid && 'is-invalid', disabled && 'is-disabled', className)}>\n {prefix && <span className=\"phone-input__prefix\">{prefix}</span>}\n <input\n id={id}\n type=\"tel\"\n inputMode=\"tel\"\n placeholder={placeholder}\n className=\"phone-input__field\"\n value={value}\n disabled={disabled}\n onChange={(e) => onChange(e.target.value.replace(/[^\\d ]/g, ''))}\n aria-invalid={invalid || undefined}\n />\n </div>\n );\n}\n\n// ---------- TimePicker (custom popover, HH:mm[:ss] / hour) --------------\nexport type TimeGranularity = 'hour' | 'minute' | 'second';\n\nconst pad2 = (n: number) => String(n).padStart(2, '0');\nconst rangeBy = (end: number, step: number): number[] => {\n const out: number[] = [];\n for (let i = 0; i < end; i += step) out.push(i);\n return out;\n};\n// Parse 'HH', 'HH:mm' or 'HH:mm:ss' into a [h, m, s] tuple; missing parts → 0.\nconst parseTime = (v: string): [number, number, number] => {\n const [h, m, s] = v.split(':');\n return [Number(h) || 0, Number(m) || 0, Number(s) || 0];\n};\n\nexport interface TimePickerProps {\n /**\n * Time of day. String format follows `granularity`: `'minute'` → `'HH:mm'`\n * (e.g. `'14:37'`), `'second'` → `'HH:mm:ss'` (e.g. `'14:37:09'`),\n * `'hour'` → `'HH:00'` (e.g. `'14:00'`).\n */\n value: string;\n onChange: (v: string) => void;\n /**\n * Precision of the control. Default `'minute'`.\n * - `'minute'`: hour + minute columns; value `HH:mm`.\n * - `'second'`: hour + minute + second columns; value `HH:mm:ss`.\n * - `'hour'`: a single hour column; value `HH:00`.\n */\n granularity?: TimeGranularity;\n /**\n * Increment of the finest column, in units of `granularity` (minutes /\n * seconds / hours). Omit for `1` (every value of the unit — e.g. any minute).\n * `step` thins that column: `granularity='minute'` + `step={15}` → minutes\n * `00 15 30 45`. Coarser columns always step by 1.\n */\n step?: number;\n invalid?: boolean;\n disabled?: boolean;\n className?: string;\n id?: string;\n}\n\n// One scrollable column of the picker. A listbox with roving `aria-activedescendant`\n// (the container is the single tab stop) so a 60-item column adds one focus stop,\n// not sixty; Arrow/Home/End move + commit, and the active cell is centered.\nfunction TimeColumn({ label, values, selected, idBase, onSelect }: {\n label: string;\n values: number[];\n selected: number;\n idBase: string;\n onSelect: (v: number) => void;\n}) {\n const listRef = React.useRef<HTMLDivElement>(null);\n React.useEffect(() => {\n const list = listRef.current;\n const active = list?.querySelector<HTMLElement>('[aria-selected=\"true\"]');\n if (list && active) list.scrollTop = active.offsetTop - list.clientHeight / 2 + active.offsetHeight / 2;\n }, [selected]);\n const idx = Math.max(0, values.indexOf(selected));\n const onKeyDown = (e: React.KeyboardEvent) => {\n let next = idx;\n if (e.key === 'ArrowDown') next = (idx + 1) % values.length;\n else if (e.key === 'ArrowUp') next = (idx - 1 + values.length) % values.length;\n else if (e.key === 'Home') next = 0;\n else if (e.key === 'End') next = values.length - 1;\n else return;\n e.preventDefault();\n onSelect(values[next]);\n };\n return (\n <div\n ref={listRef}\n className=\"timepicker__col kit-scrollbar\"\n role=\"listbox\"\n aria-label={label}\n tabIndex={0}\n aria-activedescendant={`${idBase}-${selected}`}\n onKeyDown={onKeyDown}\n >\n {values.map((v) => (\n <div\n key={v}\n id={`${idBase}-${v}`}\n role=\"option\"\n aria-selected={v === selected}\n className={cx('timepicker__cell', v === selected && 'is-selected')}\n onClick={() => onSelect(v)}\n >{pad2(v)}</div>\n ))}\n </div>\n );\n}\n\nexport function TimePicker({ value, onChange, granularity = 'minute', step, invalid, disabled, className, id }: TimePickerProps) {\n const t = useLocale();\n const reactId = React.useId();\n const [open, setOpen] = React.useState(false);\n const wrapRef = React.useRef<HTMLDivElement>(null);\n const popoverRef = React.useRef<HTMLDivElement>(null);\n const triggerRef = React.useRef<HTMLButtonElement>(null);\n\n const [h, m, s] = parseTime(value);\n const unitStep = step && step > 0 ? step : 1;\n const showMinutes = granularity !== 'hour';\n const showSeconds = granularity === 'second';\n // `step` thins the finest column for the chosen granularity; coarser ones step by 1.\n const hours = rangeBy(24, granularity === 'hour' ? unitStep : 1);\n const minutes = rangeBy(60, granularity === 'minute' ? unitStep : 1);\n const seconds = rangeBy(60, unitStep);\n\n const compose = (hh: number, mm: number, ss: number): string =>\n granularity === 'hour' ? `${pad2(hh)}:00`\n : granularity === 'minute' ? `${pad2(hh)}:${pad2(mm)}`\n : `${pad2(hh)}:${pad2(mm)}:${pad2(ss)}`;\n\n const pos = usePopoverPosition(wrapRef, popoverRef, { open, side: 'bottom', align: 'start', offset: 4 });\n useDismiss({ open, onDismiss: () => setOpen(false), refs: [wrapRef, popoverRef], returnFocusRef: triggerRef });\n\n const label = value ? compose(h, m, s) : t['picker.selectTime'];\n\n return (\n <div ref={wrapRef} className={cx('timepicker', invalid && 'is-invalid', disabled && 'is-disabled', className)}>\n <button\n ref={triggerRef}\n id={id}\n type=\"button\"\n className=\"timepicker__trigger\"\n disabled={disabled}\n onClick={() => setOpen((o) => !o)}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n >\n <span>{label}</span>\n <span className=\"timepicker__icon\" aria-hidden=\"true\"><Clock size={16} /></span>\n </button>\n {open && (\n <Portal>\n <div\n ref={popoverRef}\n className={cx('timepicker__popover', 'is-floating')}\n role=\"dialog\"\n aria-label={t['picker.selectTime']}\n style={{ position: 'fixed', top: pos.top, left: pos.left, visibility: pos.ready ? 'visible' : 'hidden' }}\n >\n <div className=\"timepicker__cols\">\n <TimeColumn label={t['picker.hours']} idBase={`${reactId}-h`} values={hours} selected={h}\n onSelect={(hh) => onChange(compose(hh, m, s))} />\n {showMinutes && (\n <TimeColumn label={t['picker.minutes']} idBase={`${reactId}-m`} values={minutes} selected={m}\n onSelect={(mm) => onChange(compose(h, mm, s))} />\n )}\n {showSeconds && (\n <TimeColumn label={t['picker.seconds']} idBase={`${reactId}-s`} values={seconds} selected={s}\n onSelect={(ss) => onChange(compose(h, m, ss))} />\n )}\n </div>\n </div>\n </Portal>\n )}\n </div>\n );\n}\n\n// ---------- RadioGroup / CheckboxGroup ---------------------------------\nexport interface OptionItem<T = string> { value: T; label: React.ReactNode; description?: React.ReactNode; disabled?: boolean }\n\nexport interface RadioGroupProps<T = string> {\n value: T | null;\n onChange: (v: T) => void;\n options: OptionItem<T>[];\n name: string;\n orientation?: 'vertical' | 'horizontal';\n /** Accessible name for the group (announced as \"<label>, radio group\" by screen readers). */\n label?: string;\n className?: string;\n}\n\nexport function RadioGroup<T = string>({ value, onChange, options, name, orientation = 'vertical', label, className }: RadioGroupProps<T>) {\n return (\n <div role=\"radiogroup\" aria-label={label} className={cx('option-group', `option-group--${orientation}`, className)}>\n {options.map((o) => (\n <label key={String(o.value)} className={cx('option-row', o.disabled && 'is-disabled')}>\n <input\n type=\"radio\"\n className=\"radio\"\n name={name}\n checked={o.value === value}\n disabled={o.disabled}\n onChange={() => onChange(o.value)}\n />\n <span className=\"option-row__body\">\n <span className=\"option-row__label\">{o.label}</span>\n {o.description && <span className=\"option-row__desc\">{o.description}</span>}\n </span>\n </label>\n ))}\n </div>\n );\n}\n\nexport interface CheckboxGroupProps<T = string> {\n value: T[];\n onChange: (v: T[]) => void;\n options: OptionItem<T>[];\n orientation?: 'vertical' | 'horizontal';\n className?: string;\n}\n\nexport function CheckboxGroup<T = string>({ value, onChange, options, orientation = 'vertical', className }: CheckboxGroupProps<T>) {\n const set = new Set(value);\n return (\n <div role=\"group\" className={cx('option-group', `option-group--${orientation}`, className)}>\n {options.map((o) => (\n <label key={String(o.value)} className={cx('option-row', o.disabled && 'is-disabled')}>\n <input\n type=\"checkbox\"\n className=\"checkbox\"\n checked={set.has(o.value)}\n disabled={o.disabled}\n onChange={() => {\n if (set.has(o.value)) onChange(value.filter((v) => v !== o.value));\n else onChange([...value, o.value]);\n }}\n />\n <span className=\"option-row__body\">\n <span className=\"option-row__label\">{o.label}</span>\n {o.description && <span className=\"option-row__desc\">{o.description}</span>}\n </span>\n </label>\n ))}\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/InputsExtra.tsx"],"names":["React","Slider","cx","jsx","jsxs","useLocale","format","X","MoneyInput","getBrand","usePopoverPosition","useDismiss","Clock","Portal"],"mappings":"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","file":"chunk-SA7NCLEK.js","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { X, Clock } from './Icons';\nimport { getBrand } from '../brand';\nimport { useLocale } from '../locale/LocaleProvider';\nimport { format } from '../locale/messages';\nimport { Portal } from './Portal';\nimport { usePopoverPosition } from '../hooks/usePopoverPosition';\nimport { useDismiss } from '../hooks/useDismiss';\n\n// ---------- Slider ------------------------------------------------------\nexport interface SliderProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'onChange' | 'value' | 'type'> {\n value: number;\n onChange: (v: number) => void;\n min?: number;\n max?: number;\n step?: number;\n showValue?: boolean;\n formatValue?: (v: number) => string;\n}\n\nexport const Slider = React.forwardRef<HTMLInputElement, SliderProps>(function Slider(\n { value, onChange, min = 0, max = 100, step = 1, showValue, formatValue, className, ...rest },\n ref\n) {\n const pct = ((value - min) / (max - min)) * 100;\n return (\n <div className={cx('slider', className)}>\n <input\n ref={ref}\n type=\"range\"\n className=\"slider__input\"\n value={value}\n min={min}\n max={max}\n step={step}\n onChange={(e) => onChange(Number(e.target.value))}\n style={{ '--pct': `${pct}%` } as React.CSSProperties}\n {...rest}\n />\n {showValue && (\n <span className=\"slider__value\">{formatValue ? formatValue(value) : value}</span>\n )}\n </div>\n );\n});\n\n// ---------- Progress (linear + circular) --------------------------------\nexport interface ProgressProps {\n value: number; // 0–100\n variant?: 'blue' | 'orange' | 'success' | 'warning' | 'danger';\n showLabel?: boolean;\n size?: 'sm' | 'md';\n className?: string;\n}\n\nexport function Progress({ value, variant = 'blue', showLabel, size = 'md', className }: ProgressProps) {\n const v = Math.max(0, Math.min(100, value));\n return (\n <div className={cx('progress', size === 'sm' && 'progress--sm', className)}>\n <div className={cx('progress__bar', `progress__bar--${variant}`)} style={{ width: `${v}%` }} role=\"progressbar\" aria-valuenow={v} aria-valuemin={0} aria-valuemax={100} />\n {showLabel && <span className=\"progress__label\">{Math.round(v)}%</span>}\n </div>\n );\n}\n\nexport interface ProgressCircleProps {\n value: number;\n size?: number;\n stroke?: number;\n variant?: 'blue' | 'orange' | 'success' | 'warning' | 'danger';\n showLabel?: boolean;\n className?: string;\n}\n\nexport function ProgressCircle({ value, size = 64, stroke = 6, variant = 'blue', showLabel = true, className }: ProgressCircleProps) {\n const v = Math.max(0, Math.min(100, value));\n const r = (size - stroke) / 2;\n const c = 2 * Math.PI * r;\n const off = c - (v / 100) * c;\n const colorVar = {\n blue: 'var(--color-primary)',\n orange: 'var(--color-secondary)',\n success: 'var(--color-success)',\n warning: 'var(--color-warning)',\n danger: 'var(--color-danger)',\n }[variant];\n return (\n <div className={cx('progress-circle', className)} style={{ width: size, height: size }} role=\"progressbar\" aria-valuenow={v} aria-valuemin={0} aria-valuemax={100}>\n <svg width={size} height={size} viewBox={`0 0 ${size} ${size}`}>\n <circle cx={size/2} cy={size/2} r={r} stroke=\"var(--bg-subtle)\" strokeWidth={stroke} fill=\"none\" />\n <circle\n cx={size/2} cy={size/2} r={r}\n stroke={colorVar} strokeWidth={stroke} fill=\"none\"\n strokeDasharray={c} strokeDashoffset={off} strokeLinecap=\"round\"\n style={{ transform: 'rotate(-90deg)', transformOrigin: '50% 50%', transition: 'stroke-dashoffset 320ms var(--ease-standard, ease-out)' }}\n />\n </svg>\n {showLabel && <span className=\"progress-circle__label\">{Math.round(v)}%</span>}\n </div>\n );\n}\n\n// ---------- Tag input ---------------------------------------------------\nexport interface TagInputProps {\n value: string[];\n onChange: (tags: string[]) => void;\n placeholder?: string;\n separator?: RegExp;\n maxTags?: number;\n validate?: (tag: string) => boolean;\n disabled?: boolean;\n className?: string;\n id?: string;\n}\n\nexport function TagInput({\n value, onChange, placeholder,\n separator = /[,\\s]+/, maxTags, validate, disabled, className, id,\n}: TagInputProps) {\n const [draft, setDraft] = React.useState('');\n const locale = useLocale();\n const ph = placeholder ?? locale['tagsInput.placeholder'];\n\n const addTags = (raw: string) => {\n const next = raw.split(separator).map((t) => t.trim()).filter(Boolean);\n if (next.length === 0) return;\n let merged = [...value];\n for (const t of next) {\n if (validate && !validate(t)) continue;\n if (merged.includes(t)) continue;\n if (maxTags && merged.length >= maxTags) break;\n merged.push(t);\n }\n onChange(merged);\n setDraft('');\n };\n\n return (\n <div className={cx('tag-input', disabled && 'is-disabled', className)} onClick={(e) => {\n const input = (e.currentTarget.querySelector('input') as HTMLInputElement);\n input?.focus();\n }}>\n {value.map((t, i) => (\n <span key={`${t}-${i}`} className=\"tag-input__tag\">\n {t}\n <button type=\"button\" aria-label={format(locale['tagsInput.remove'], { tag: t })} onClick={() => onChange(value.filter((_, idx) => idx !== i))}><X size={12} /></button>\n </span>\n ))}\n <input\n id={id}\n className=\"tag-input__field\"\n value={draft}\n disabled={disabled}\n placeholder={value.length === 0 ? ph : ''}\n onChange={(e) => {\n const v = e.target.value;\n if (separator.test(v)) addTags(v);\n else setDraft(v);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && draft.trim()) {\n e.preventDefault();\n addTags(draft);\n } else if (e.key === 'Backspace' && !draft && value.length) {\n onChange(value.slice(0, -1));\n }\n }}\n onBlur={() => draft.trim() && addTags(draft)}\n />\n </div>\n );\n}\n\n// ---------- MoneyInput (CLP-friendly, but accepts any locale) -----------\nexport interface MoneyInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'onChange' | 'value' | 'type'> {\n value: number | null;\n onChange: (v: number | null) => void;\n currency?: string; // 'CLP' | 'USD' | 'EUR' | …\n locale?: string; // 'es-CL' | …\n invalid?: boolean;\n}\n\nexport const MoneyInput = React.forwardRef<HTMLInputElement, MoneyInputProps>(function MoneyInput(\n { value, onChange, currency, locale, invalid, className, disabled, ...rest },\n ref\n) {\n const brand = getBrand();\n const resolvedCurrency = currency ?? brand.currency;\n const resolvedLocale = locale ?? brand.locale;\n const [focus, setFocus] = React.useState(false);\n const display = value == null\n ? ''\n : focus\n ? String(value)\n : new Intl.NumberFormat(resolvedLocale, { style: 'currency', currency: resolvedCurrency, maximumFractionDigits: 0 }).format(value);\n return (\n <input\n ref={ref}\n type=\"text\"\n inputMode=\"numeric\"\n className={cx('input', invalid && 'is-invalid', className)}\n value={display}\n disabled={disabled}\n onFocus={() => setFocus(true)}\n onBlur={() => setFocus(false)}\n onChange={(e) => {\n const cleaned = e.target.value.replace(/[^\\d-]/g, '');\n if (!cleaned || cleaned === '-') return onChange(null);\n const n = Number(cleaned);\n onChange(Number.isFinite(n) ? n : null);\n }}\n aria-invalid={invalid || undefined}\n {...rest}\n />\n );\n});\n\n// ---------- PhoneInput (CL default, prefix + digits) --------------------\nexport interface PhoneInputProps {\n value: string;\n onChange: (v: string) => void;\n prefix?: string;\n invalid?: boolean;\n disabled?: boolean;\n className?: string;\n id?: string;\n placeholder?: string;\n}\n\nexport function PhoneInput({ value, onChange, prefix, invalid, disabled, className, id, placeholder = '9 1234 5678' }: PhoneInputProps) {\n return (\n <div className={cx('phone-input', invalid && 'is-invalid', disabled && 'is-disabled', className)}>\n {prefix && <span className=\"phone-input__prefix\">{prefix}</span>}\n <input\n id={id}\n type=\"tel\"\n inputMode=\"tel\"\n placeholder={placeholder}\n className=\"phone-input__field\"\n value={value}\n disabled={disabled}\n onChange={(e) => onChange(e.target.value.replace(/[^\\d ]/g, ''))}\n aria-invalid={invalid || undefined}\n />\n </div>\n );\n}\n\n// ---------- TimePicker (custom popover, HH:mm[:ss] / hour) --------------\nexport type TimeGranularity = 'hour' | 'minute' | 'second';\n\nconst pad2 = (n: number) => String(n).padStart(2, '0');\nconst rangeBy = (end: number, step: number): number[] => {\n const out: number[] = [];\n for (let i = 0; i < end; i += step) out.push(i);\n return out;\n};\n// Parse 'HH', 'HH:mm' or 'HH:mm:ss' into a [h, m, s] tuple; missing parts → 0.\nconst parseTime = (v: string): [number, number, number] => {\n const [h, m, s] = v.split(':');\n return [Number(h) || 0, Number(m) || 0, Number(s) || 0];\n};\n\nexport interface TimePickerProps {\n /**\n * Time of day. String format follows `granularity`: `'minute'` → `'HH:mm'`\n * (e.g. `'14:37'`), `'second'` → `'HH:mm:ss'` (e.g. `'14:37:09'`),\n * `'hour'` → `'HH:00'` (e.g. `'14:00'`).\n */\n value: string;\n onChange: (v: string) => void;\n /**\n * Precision of the control. Default `'minute'`.\n * - `'minute'`: hour + minute columns; value `HH:mm`.\n * - `'second'`: hour + minute + second columns; value `HH:mm:ss`.\n * - `'hour'`: a single hour column; value `HH:00`.\n */\n granularity?: TimeGranularity;\n /**\n * Increment of the finest column, in units of `granularity` (minutes /\n * seconds / hours). Omit for `1` (every value of the unit — e.g. any minute).\n * `step` thins that column: `granularity='minute'` + `step={15}` → minutes\n * `00 15 30 45`. Coarser columns always step by 1.\n */\n step?: number;\n invalid?: boolean;\n disabled?: boolean;\n className?: string;\n id?: string;\n}\n\n// One scrollable column of the picker. A listbox with roving `aria-activedescendant`\n// (the container is the single tab stop) so a 60-item column adds one focus stop,\n// not sixty; Arrow/Home/End move + commit, and the active cell is centered.\nfunction TimeColumn({ label, values, selected, idBase, onSelect }: {\n label: string;\n values: number[];\n selected: number;\n idBase: string;\n onSelect: (v: number) => void;\n}) {\n const listRef = React.useRef<HTMLDivElement>(null);\n React.useEffect(() => {\n const list = listRef.current;\n const active = list?.querySelector<HTMLElement>('[aria-selected=\"true\"]');\n if (list && active) list.scrollTop = active.offsetTop - list.clientHeight / 2 + active.offsetHeight / 2;\n }, [selected]);\n const idx = Math.max(0, values.indexOf(selected));\n const onKeyDown = (e: React.KeyboardEvent) => {\n let next = idx;\n if (e.key === 'ArrowDown') next = (idx + 1) % values.length;\n else if (e.key === 'ArrowUp') next = (idx - 1 + values.length) % values.length;\n else if (e.key === 'Home') next = 0;\n else if (e.key === 'End') next = values.length - 1;\n else return;\n e.preventDefault();\n onSelect(values[next]);\n };\n return (\n <div\n ref={listRef}\n className=\"timepicker__col kit-scrollbar\"\n role=\"listbox\"\n aria-label={label}\n tabIndex={0}\n aria-activedescendant={`${idBase}-${selected}`}\n onKeyDown={onKeyDown}\n >\n {values.map((v) => (\n <div\n key={v}\n id={`${idBase}-${v}`}\n role=\"option\"\n aria-selected={v === selected}\n className={cx('timepicker__cell', v === selected && 'is-selected')}\n onClick={() => onSelect(v)}\n >{pad2(v)}</div>\n ))}\n </div>\n );\n}\n\nexport function TimePicker({ value, onChange, granularity = 'minute', step, invalid, disabled, className, id }: TimePickerProps) {\n const t = useLocale();\n const reactId = React.useId();\n const [open, setOpen] = React.useState(false);\n const wrapRef = React.useRef<HTMLDivElement>(null);\n const popoverRef = React.useRef<HTMLDivElement>(null);\n const triggerRef = React.useRef<HTMLButtonElement>(null);\n\n const [h, m, s] = parseTime(value);\n const unitStep = step && step > 0 ? step : 1;\n const showMinutes = granularity !== 'hour';\n const showSeconds = granularity === 'second';\n // `step` thins the finest column for the chosen granularity; coarser ones step by 1.\n const hours = rangeBy(24, granularity === 'hour' ? unitStep : 1);\n const minutes = rangeBy(60, granularity === 'minute' ? unitStep : 1);\n const seconds = rangeBy(60, unitStep);\n\n const compose = (hh: number, mm: number, ss: number): string =>\n granularity === 'hour' ? `${pad2(hh)}:00`\n : granularity === 'minute' ? `${pad2(hh)}:${pad2(mm)}`\n : `${pad2(hh)}:${pad2(mm)}:${pad2(ss)}`;\n\n const pos = usePopoverPosition(wrapRef, popoverRef, { open, side: 'bottom', align: 'start', offset: 4 });\n useDismiss({ open, onDismiss: () => setOpen(false), refs: [wrapRef, popoverRef], returnFocusRef: triggerRef });\n\n const label = value ? compose(h, m, s) : t['picker.selectTime'];\n\n return (\n <div ref={wrapRef} className={cx('timepicker', invalid && 'is-invalid', disabled && 'is-disabled', className)}>\n <button\n ref={triggerRef}\n id={id}\n type=\"button\"\n className=\"timepicker__trigger\"\n disabled={disabled}\n onClick={() => setOpen((o) => !o)}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n >\n <span>{label}</span>\n <span className=\"timepicker__icon\" aria-hidden=\"true\"><Clock size={16} /></span>\n </button>\n {open && (\n <Portal>\n <div\n ref={popoverRef}\n className={cx('timepicker__popover', 'is-floating')}\n role=\"dialog\"\n aria-label={t['picker.selectTime']}\n style={{ position: 'fixed', top: pos.top, left: pos.left, visibility: pos.ready ? 'visible' : 'hidden' }}\n >\n <div className=\"timepicker__cols\">\n <TimeColumn label={t['picker.hours']} idBase={`${reactId}-h`} values={hours} selected={h}\n onSelect={(hh) => onChange(compose(hh, m, s))} />\n {showMinutes && (\n <TimeColumn label={t['picker.minutes']} idBase={`${reactId}-m`} values={minutes} selected={m}\n onSelect={(mm) => onChange(compose(h, mm, s))} />\n )}\n {showSeconds && (\n <TimeColumn label={t['picker.seconds']} idBase={`${reactId}-s`} values={seconds} selected={s}\n onSelect={(ss) => onChange(compose(h, m, ss))} />\n )}\n </div>\n </div>\n </Portal>\n )}\n </div>\n );\n}\n\n// ---------- RadioGroup / CheckboxGroup ---------------------------------\nexport interface OptionItem<T = string> { value: T; label: React.ReactNode; description?: React.ReactNode; disabled?: boolean }\n\nexport interface RadioGroupProps<T = string> {\n value: T | null;\n onChange: (v: T) => void;\n options: OptionItem<T>[];\n name: string;\n orientation?: 'vertical' | 'horizontal';\n /** Accessible name for the group (announced as \"<label>, radio group\" by screen readers). */\n label?: string;\n className?: string;\n}\n\nexport function RadioGroup<T = string>({ value, onChange, options, name, orientation = 'vertical', label, className }: RadioGroupProps<T>) {\n return (\n <div role=\"radiogroup\" aria-label={label} className={cx('option-group', `option-group--${orientation}`, className)}>\n {options.map((o) => (\n <label key={String(o.value)} className={cx('option-row', o.disabled && 'is-disabled')}>\n <input\n type=\"radio\"\n className=\"radio\"\n name={name}\n checked={o.value === value}\n disabled={o.disabled}\n onChange={() => onChange(o.value)}\n />\n <span className=\"option-row__body\">\n <span className=\"option-row__label\">{o.label}</span>\n {o.description && <span className=\"option-row__desc\">{o.description}</span>}\n </span>\n </label>\n ))}\n </div>\n );\n}\n\nexport interface CheckboxGroupProps<T = string> {\n value: T[];\n onChange: (v: T[]) => void;\n options: OptionItem<T>[];\n orientation?: 'vertical' | 'horizontal';\n className?: string;\n}\n\nexport function CheckboxGroup<T = string>({ value, onChange, options, orientation = 'vertical', className }: CheckboxGroupProps<T>) {\n const set = new Set(value);\n return (\n <div role=\"group\" className={cx('option-group', `option-group--${orientation}`, className)}>\n {options.map((o) => (\n <label key={String(o.value)} className={cx('option-row', o.disabled && 'is-disabled')}>\n <input\n type=\"checkbox\"\n className=\"checkbox\"\n checked={set.has(o.value)}\n disabled={o.disabled}\n onChange={() => {\n if (set.has(o.value)) onChange(value.filter((v) => v !== o.value));\n else onChange([...value, o.value]);\n }}\n />\n <span className=\"option-row__body\">\n <span className=\"option-row__label\">{o.label}</span>\n {o.description && <span className=\"option-row__desc\">{o.description}</span>}\n </span>\n </label>\n ))}\n </div>\n );\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  'use client';
2
- import { format } from './chunk-VGA7UT6T.mjs';
3
- import { useLocale } from './chunk-KYYRQNY7.mjs';
2
+ import { format } from './chunk-IGNKSI2E.mjs';
3
+ import { useLocale } from './chunk-OOIRRKJ7.mjs';
4
4
  import { ChevronLeft, ChevronRight, X } from './chunk-BJGMROKL.mjs';
5
5
  import { cx } from './chunk-IEPCH3JB.mjs';
6
6
  import * as React from 'react';
@@ -143,5 +143,5 @@ function Lightbox({ open, onClose, images, index, onChange }) {
143
143
  }
144
144
 
145
145
  export { ImageGallery, Lightbox };
146
- //# sourceMappingURL=chunk-VLTIVWKF.mjs.map
147
- //# sourceMappingURL=chunk-VLTIVWKF.mjs.map
146
+ //# sourceMappingURL=chunk-SB7XXXWS.mjs.map
147
+ //# sourceMappingURL=chunk-SB7XXXWS.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Gallery.tsx"],"names":[],"mappings":"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","file":"chunk-VLTIVWKF.mjs","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { ChevronLeft, ChevronRight, X } from './Icons';\nimport { useLocale } from '../locale/LocaleProvider';\nimport { format } from '../locale/messages';\n\n// ---------- ImageGallery ------------------------------------------------\nexport interface GalleryImage {\n src: string;\n alt?: string;\n thumbnail?: string; // si no se pasa, se usa src\n}\n\nexport interface ImageGalleryProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n images: GalleryImage[];\n /** Index inicial. */\n defaultIndex?: number;\n /** Click en imagen principal abre lightbox. Default: true. */\n enableLightbox?: boolean;\n /** Layout de thumbnails. */\n thumbnailPosition?: 'bottom' | 'left';\n}\n\nexport function ImageGallery({\n images, defaultIndex = 0, enableLightbox = true,\n thumbnailPosition = 'bottom', className, ...rest\n}: ImageGalleryProps) {\n const [index, setIndex] = React.useState(defaultIndex);\n const [lightboxOpen, setLightboxOpen] = React.useState(false);\n const t = useLocale();\n\n if (images.length === 0) return null;\n const safeIndex = Math.max(0, Math.min(index, images.length - 1));\n const current = images[safeIndex];\n\n return (\n <>\n <div className={cx('gallery', `gallery--thumbs-${thumbnailPosition}`, className)} {...rest}>\n <div className=\"gallery__main\">\n <img\n src={current.src}\n alt={current.alt ?? ''}\n className=\"gallery__image\"\n onClick={() => enableLightbox && setLightboxOpen(true)}\n style={{ cursor: enableLightbox ? 'zoom-in' : 'default' }}\n />\n {images.length > 1 && (\n <>\n <button\n type=\"button\"\n className=\"gallery__nav gallery__nav--prev\"\n aria-label={t['gallery.prev']}\n onClick={() => setIndex((i) => (i - 1 + images.length) % images.length)}\n >\n <ChevronLeft size={20} />\n </button>\n <button\n type=\"button\"\n className=\"gallery__nav gallery__nav--next\"\n aria-label={t['gallery.next']}\n onClick={() => setIndex((i) => (i + 1) % images.length)}\n >\n <ChevronRight size={20} />\n </button>\n </>\n )}\n </div>\n {images.length > 1 && (\n <div className=\"gallery__thumbs\" role=\"tablist\" aria-label={t['gallery.thumbnails']}>\n {images.map((img, i) => (\n <button\n key={i}\n type=\"button\"\n role=\"tab\"\n aria-selected={i === safeIndex}\n aria-label={format(t['gallery.imageNumber'], { n: i + 1 })}\n className={cx('gallery__thumb', i === safeIndex && 'is-active')}\n onClick={() => setIndex(i)}\n >\n <img src={img.thumbnail ?? img.src} alt={img.alt ?? ''} />\n </button>\n ))}\n </div>\n )}\n </div>\n\n {enableLightbox && (\n <Lightbox\n open={lightboxOpen}\n onClose={() => setLightboxOpen(false)}\n images={images}\n index={safeIndex}\n onChange={setIndex}\n />\n )}\n </>\n );\n}\n\n// ---------- Lightbox ---------------------------------------------------\nexport interface LightboxProps {\n open: boolean;\n onClose: () => void;\n images: GalleryImage[];\n index: number;\n onChange?: (i: number) => void;\n}\n\nexport function Lightbox({ open, onClose, images, index, onChange }: LightboxProps) {\n const t = useLocale();\n React.useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n else if (e.key === 'ArrowLeft' && onChange) onChange((index - 1 + images.length) % images.length);\n else if (e.key === 'ArrowRight' && onChange) onChange((index + 1) % images.length);\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [open, index, images.length, onChange, onClose]);\n\n if (!open || images.length === 0) return null;\n const current = images[Math.max(0, Math.min(index, images.length - 1))];\n\n return (\n <div className=\"lightbox\" role=\"dialog\" aria-modal=\"true\" aria-label={t['gallery.viewer']} onClick={onClose}>\n <button\n type=\"button\"\n className=\"lightbox__close\"\n aria-label={t['gallery.close']}\n onClick={onClose}\n >\n <X size={20} />\n </button>\n {images.length > 1 && onChange && (\n <button\n type=\"button\"\n className=\"lightbox__nav lightbox__nav--prev\"\n aria-label={t['gallery.prev']}\n onClick={(e) => { e.stopPropagation(); onChange((index - 1 + images.length) % images.length); }}\n >\n <ChevronLeft size={24} />\n </button>\n )}\n <img src={current.src} alt={current.alt ?? ''} className=\"lightbox__image\" onClick={(e) => e.stopPropagation()} />\n {images.length > 1 && onChange && (\n <button\n type=\"button\"\n className=\"lightbox__nav lightbox__nav--next\"\n aria-label={t['gallery.next']}\n onClick={(e) => { e.stopPropagation(); onChange((index + 1) % images.length); }}\n >\n <ChevronRight size={24} />\n </button>\n )}\n {images.length > 1 && (\n <div className=\"lightbox__counter\">{index + 1} / {images.length}</div>\n )}\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/Gallery.tsx"],"names":[],"mappings":"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","file":"chunk-SB7XXXWS.mjs","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { ChevronLeft, ChevronRight, X } from './Icons';\nimport { useLocale } from '../locale/LocaleProvider';\nimport { format } from '../locale/messages';\n\n// ---------- ImageGallery ------------------------------------------------\nexport interface GalleryImage {\n src: string;\n alt?: string;\n thumbnail?: string; // si no se pasa, se usa src\n}\n\nexport interface ImageGalleryProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n images: GalleryImage[];\n /** Index inicial. */\n defaultIndex?: number;\n /** Click en imagen principal abre lightbox. Default: true. */\n enableLightbox?: boolean;\n /** Layout de thumbnails. */\n thumbnailPosition?: 'bottom' | 'left';\n}\n\nexport function ImageGallery({\n images, defaultIndex = 0, enableLightbox = true,\n thumbnailPosition = 'bottom', className, ...rest\n}: ImageGalleryProps) {\n const [index, setIndex] = React.useState(defaultIndex);\n const [lightboxOpen, setLightboxOpen] = React.useState(false);\n const t = useLocale();\n\n if (images.length === 0) return null;\n const safeIndex = Math.max(0, Math.min(index, images.length - 1));\n const current = images[safeIndex];\n\n return (\n <>\n <div className={cx('gallery', `gallery--thumbs-${thumbnailPosition}`, className)} {...rest}>\n <div className=\"gallery__main\">\n <img\n src={current.src}\n alt={current.alt ?? ''}\n className=\"gallery__image\"\n onClick={() => enableLightbox && setLightboxOpen(true)}\n style={{ cursor: enableLightbox ? 'zoom-in' : 'default' }}\n />\n {images.length > 1 && (\n <>\n <button\n type=\"button\"\n className=\"gallery__nav gallery__nav--prev\"\n aria-label={t['gallery.prev']}\n onClick={() => setIndex((i) => (i - 1 + images.length) % images.length)}\n >\n <ChevronLeft size={20} />\n </button>\n <button\n type=\"button\"\n className=\"gallery__nav gallery__nav--next\"\n aria-label={t['gallery.next']}\n onClick={() => setIndex((i) => (i + 1) % images.length)}\n >\n <ChevronRight size={20} />\n </button>\n </>\n )}\n </div>\n {images.length > 1 && (\n <div className=\"gallery__thumbs\" role=\"tablist\" aria-label={t['gallery.thumbnails']}>\n {images.map((img, i) => (\n <button\n key={i}\n type=\"button\"\n role=\"tab\"\n aria-selected={i === safeIndex}\n aria-label={format(t['gallery.imageNumber'], { n: i + 1 })}\n className={cx('gallery__thumb', i === safeIndex && 'is-active')}\n onClick={() => setIndex(i)}\n >\n <img src={img.thumbnail ?? img.src} alt={img.alt ?? ''} />\n </button>\n ))}\n </div>\n )}\n </div>\n\n {enableLightbox && (\n <Lightbox\n open={lightboxOpen}\n onClose={() => setLightboxOpen(false)}\n images={images}\n index={safeIndex}\n onChange={setIndex}\n />\n )}\n </>\n );\n}\n\n// ---------- Lightbox ---------------------------------------------------\nexport interface LightboxProps {\n open: boolean;\n onClose: () => void;\n images: GalleryImage[];\n index: number;\n onChange?: (i: number) => void;\n}\n\nexport function Lightbox({ open, onClose, images, index, onChange }: LightboxProps) {\n const t = useLocale();\n React.useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n else if (e.key === 'ArrowLeft' && onChange) onChange((index - 1 + images.length) % images.length);\n else if (e.key === 'ArrowRight' && onChange) onChange((index + 1) % images.length);\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [open, index, images.length, onChange, onClose]);\n\n if (!open || images.length === 0) return null;\n const current = images[Math.max(0, Math.min(index, images.length - 1))];\n\n return (\n <div className=\"lightbox\" role=\"dialog\" aria-modal=\"true\" aria-label={t['gallery.viewer']} onClick={onClose}>\n <button\n type=\"button\"\n className=\"lightbox__close\"\n aria-label={t['gallery.close']}\n onClick={onClose}\n >\n <X size={20} />\n </button>\n {images.length > 1 && onChange && (\n <button\n type=\"button\"\n className=\"lightbox__nav lightbox__nav--prev\"\n aria-label={t['gallery.prev']}\n onClick={(e) => { e.stopPropagation(); onChange((index - 1 + images.length) % images.length); }}\n >\n <ChevronLeft size={24} />\n </button>\n )}\n <img src={current.src} alt={current.alt ?? ''} className=\"lightbox__image\" onClick={(e) => e.stopPropagation()} />\n {images.length > 1 && onChange && (\n <button\n type=\"button\"\n className=\"lightbox__nav lightbox__nav--next\"\n aria-label={t['gallery.next']}\n onClick={(e) => { e.stopPropagation(); onChange((index + 1) % images.length); }}\n >\n <ChevronRight size={24} />\n </button>\n )}\n {images.length > 1 && (\n <div className=\"lightbox__counter\">{index + 1} / {images.length}</div>\n )}\n </div>\n );\n}\n"]}
@@ -2,8 +2,8 @@
2
2
  'use strict';
3
3
 
4
4
  var chunkAGMDYCGG_js = require('./chunk-AGMDYCGG.js');
5
- var chunkG3V4UOZW_js = require('./chunk-G3V4UOZW.js');
6
- var chunkA42WMR4M_js = require('./chunk-A42WMR4M.js');
5
+ var chunkAB52PRTH_js = require('./chunk-AB52PRTH.js');
6
+ var chunkDKOAATV2_js = require('./chunk-DKOAATV2.js');
7
7
  var chunkC4AKMVDZ_js = require('./chunk-C4AKMVDZ.js');
8
8
  var chunkPASF6T4H_js = require('./chunk-PASF6T4H.js');
9
9
  var React = require('react');
@@ -42,7 +42,7 @@ function CommentThread({
42
42
  const [draft, setDraft] = React__namespace.useState("");
43
43
  const [internal, setInternal] = React__namespace.useState(false);
44
44
  const [grown, setGrown] = React__namespace.useState(false);
45
- const t = chunkA42WMR4M_js.useLocale();
45
+ const t = chunkDKOAATV2_js.useLocale();
46
46
  const ph = placeholder ?? t["comments.placeholder"];
47
47
  const isInline = inputLayout === "inline";
48
48
  const textareaRef = React__namespace.useRef(null);
@@ -130,7 +130,7 @@ function CommentThread({
130
130
  ] });
131
131
  }
132
132
  function AttachmentList({ attachments, emptyMessage, className, ...rest }) {
133
- const t = chunkA42WMR4M_js.useLocale();
133
+ const t = chunkDKOAATV2_js.useLocale();
134
134
  const empty = emptyMessage ?? t["attachments.empty"];
135
135
  if (attachments.length === 0) {
136
136
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "attachments__empty", children: empty });
@@ -152,8 +152,8 @@ function AttachmentList({ attachments, emptyMessage, className, ...rest }) {
152
152
  ] })
153
153
  ] }),
154
154
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "attachment__actions", children: [
155
- a.url && /* @__PURE__ */ jsxRuntime.jsx("a", { href: a.url, download: true, className: "attachment__action", "aria-label": chunkG3V4UOZW_js.format(t["attachments.download"], { name: a.name }), children: /* @__PURE__ */ jsxRuntime.jsx(chunkC4AKMVDZ_js.Download, { size: 16 }) }),
156
- a.onRemove && /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "attachment__action attachment__action--danger", "aria-label": chunkG3V4UOZW_js.format(t["attachments.remove"], { name: a.name }), onClick: a.onRemove, children: /* @__PURE__ */ jsxRuntime.jsx(chunkC4AKMVDZ_js.Trash, { size: 16 }) })
155
+ a.url && /* @__PURE__ */ jsxRuntime.jsx("a", { href: a.url, download: true, className: "attachment__action", "aria-label": chunkAB52PRTH_js.format(t["attachments.download"], { name: a.name }), children: /* @__PURE__ */ jsxRuntime.jsx(chunkC4AKMVDZ_js.Download, { size: 16 }) }),
156
+ a.onRemove && /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "attachment__action attachment__action--danger", "aria-label": chunkAB52PRTH_js.format(t["attachments.remove"], { name: a.name }), onClick: a.onRemove, children: /* @__PURE__ */ jsxRuntime.jsx(chunkC4AKMVDZ_js.Trash, { size: 16 }) })
157
157
  ] })
158
158
  ] }, a.id)) });
159
159
  }
@@ -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-SHIQMHQP.js.map
166
- //# sourceMappingURL=chunk-SHIQMHQP.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":"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","file":"chunk-SHIQMHQP.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"]}
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunkG3V4UOZW_js = require('./chunk-G3V4UOZW.js');
4
+ var chunkAB52PRTH_js = require('./chunk-AB52PRTH.js');
5
5
 
6
6
  // src/utils/smartTime.ts
7
7
  var MINUTE_MS = 6e4;
@@ -57,7 +57,7 @@ function smartDateTime(iso, locale, now) {
57
57
  const absMin = Math.abs(deltaMin);
58
58
  if (absMin < 1) return deltaMs < 0 ? locale["timeAgo.now"] : locale["timeAgo.soon"];
59
59
  if (absMin < 60) {
60
- return deltaMs < 0 ? chunkG3V4UOZW_js.format(locale["timeAgo.minAgo"], { n: absMin }) : chunkG3V4UOZW_js.format(locale["timeAgo.minIn"], { n: absMin });
60
+ return deltaMs < 0 ? chunkAB52PRTH_js.format(locale["timeAgo.minAgo"], { n: absMin }) : chunkAB52PRTH_js.format(locale["timeAgo.minIn"], { n: absMin });
61
61
  }
62
62
  const meaningful = hasMeaningfulTime(d);
63
63
  const dd = dayDiff(d, ref);
@@ -87,5 +87,5 @@ exports.formatIsoDate = formatIsoDate;
87
87
  exports.formatIsoDateTime = formatIsoDateTime;
88
88
  exports.smartDate = smartDate;
89
89
  exports.smartDateTime = smartDateTime;
90
- //# sourceMappingURL=chunk-KY6OH2IK.js.map
91
- //# sourceMappingURL=chunk-KY6OH2IK.js.map
90
+ //# sourceMappingURL=chunk-UW5DUEXJ.js.map
91
+ //# sourceMappingURL=chunk-UW5DUEXJ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/smartTime.ts"],"names":["d","format"],"mappings":"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","file":"chunk-KY6OH2IK.js","sourcesContent":["import { format, type UiKitMessages } from '../locale/messages';\n\n// Smart time helpers — deterministic, Intl-free. SSR-safe because no\n// Intl.DateTimeFormat is involved; the only environment-dependent input\n// is `now`, which the consumer can inject for testing or for\n// hydration-safe rendering (TimeAgo flips from absolute to relative\n// post-mount). TZ follows the runtime — pass `now` from a known TZ if\n// you need cross-TZ consistency.\n\nconst MINUTE_MS = 60_000;\nconst DAY_MS = 86_400_000;\n\n// Day-precision inputs (\"YYYY-MM-DD\" with no time, or \"YYYY-MM-DDT00:00:00Z\"\n// from APIs that don't carry a real time-of-day) parse as UTC midnight by\n// the JS spec. In a negative TZ that lands on the previous calendar day\n// — the user expects the day they typed, not a TZ shift. We normalise\n// both forms to LOCAL midnight of the same calendar day. Timestamps with\n// a real time-of-day fall through to the standard parser.\nconst DATE_ONLY_RE = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\nconst DAY_UTC_RE = /^(\\d{4})-(\\d{2})-(\\d{2})T00:00:00(?:\\.0+)?Z$/;\n\nfunction parseIso(iso: string): Date | null {\n const dateOnly = DATE_ONLY_RE.exec(iso) ?? DAY_UTC_RE.exec(iso);\n if (dateOnly) {\n const [, y, m, d] = dateOnly;\n return new Date(Number(y), Number(m) - 1, Number(d));\n }\n const d = new Date(iso);\n return Number.isNaN(d.getTime()) ? null : d;\n}\n\nfunction pad2(n: number): string {\n return n < 10 ? `0${n}` : String(n);\n}\n\n// Day-precision markers (T00:00:00Z from Bsale/APIs that don't carry a\n// real time) parse as midnight in local TZ — checking local h/m matches\n// what the user sees. Without this, the smart formatter would render\n// \"mié 00:00\" for every day-precision value, which is noise.\nfunction hasMeaningfulTime(d: Date): boolean {\n return d.getHours() !== 0 || d.getMinutes() !== 0;\n}\n\nfunction startOfDay(d: Date): number {\n return new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();\n}\n\nfunction dayDiff(target: Date, ref: Date): number {\n return Math.round((startOfDay(target) - startOfDay(ref)) / DAY_MS);\n}\n\nfunction timeOfDay(d: Date): string {\n return `${pad2(d.getHours())}:${pad2(d.getMinutes())}`;\n}\n\nfunction dateOnlyText(d: Date, ref: Date, locale: UiKitMessages): string {\n const months = locale['timeAgo.monthsShort'];\n const base = `${d.getDate()} ${months[d.getMonth()]}`;\n return d.getFullYear() === ref.getFullYear() ? base : `${base} ${d.getFullYear()}`;\n}\n\n/**\n * Absolute date in compact form. Same-year omits the year (\"12 mar\");\n * different year appends it (\"12 mar 2025\"). Ignores time-of-day.\n */\nexport function formatIsoDate(iso: string, locale: UiKitMessages, now?: Date): string {\n const d = parseIso(iso);\n if (!d) return '';\n return dateOnlyText(d, now ?? new Date(), locale);\n}\n\n/**\n * Absolute date-time in compact form. Adds \", HH:MM\" only when the\n * input carries a meaningful time-of-day (see {@link hasMeaningfulTime}).\n */\nexport function formatIsoDateTime(iso: string, locale: UiKitMessages, now?: Date): string {\n const d = parseIso(iso);\n if (!d) return '';\n const base = dateOnlyText(d, now ?? new Date(), locale);\n return hasMeaningfulTime(d) ? `${base}, ${timeOfDay(d)}` : base;\n}\n\n/**\n * Adaptive date-time. Renders the most informative compact label given\n * the distance between `iso` and `now` (default: `new Date()`):\n * `<1 min` → \"ahora\" / \"pronto\"; `<60 min` → \"hace N min\" / \"en N min\";\n * same day → \"hoy HH:MM\"; ±1 day → \"ayer HH:MM\" / \"mañana HH:MM\";\n * `<7 days` → \"lun HH:MM\"; same year → \"12 mar\"; else \"12 mar 2025\".\n * The time-of-day portion is dropped when the input lacks one.\n */\nexport function smartDateTime(iso: string, locale: UiKitMessages, now?: Date): string {\n const d = parseIso(iso);\n if (!d) return '';\n const ref = now ?? new Date();\n const deltaMs = d.getTime() - ref.getTime();\n const deltaMin = Math.round(deltaMs / MINUTE_MS);\n const absMin = Math.abs(deltaMin);\n if (absMin < 1) return deltaMs < 0 ? locale['timeAgo.now'] : locale['timeAgo.soon'];\n if (absMin < 60) {\n return deltaMs < 0\n ? format(locale['timeAgo.minAgo'], { n: absMin })\n : format(locale['timeAgo.minIn'], { n: absMin });\n }\n const meaningful = hasMeaningfulTime(d);\n const dd = dayDiff(d, ref);\n const tod = meaningful ? ` ${timeOfDay(d)}` : '';\n if (dd === 0) return meaningful ? `${locale['timeAgo.today']} ${timeOfDay(d)}` : locale['timeAgo.today'];\n if (dd === -1) return meaningful ? `${locale['timeAgo.yesterday']} ${timeOfDay(d)}` : locale['timeAgo.yesterday'];\n if (dd === 1) return meaningful ? `${locale['timeAgo.tomorrow']} ${timeOfDay(d)}` : locale['timeAgo.tomorrow'];\n if (Math.abs(dd) < 7) {\n const weekdays = locale['timeAgo.weekdaysShort'];\n return `${weekdays[d.getDay()]}${tod}`;\n }\n return dateOnlyText(d, ref, locale);\n}\n\n/**\n * Adaptive date (date-only). Same scale as {@link smartDateTime} but\n * without the HH:MM portion — useful when the consumer wants\n * coarse-grained labels like \"hoy\" / \"lun\" / \"12 mar\" regardless of\n * whether the input carries a time-of-day.\n */\nexport function smartDate(iso: string, locale: UiKitMessages, now?: Date): string {\n const d = parseIso(iso);\n if (!d) return '';\n const ref = now ?? new Date();\n const dd = dayDiff(d, ref);\n if (dd === 0) return locale['timeAgo.today'];\n if (dd === -1) return locale['timeAgo.yesterday'];\n if (dd === 1) return locale['timeAgo.tomorrow'];\n if (Math.abs(dd) < 7) return locale['timeAgo.weekdaysShort'][d.getDay()];\n return dateOnlyText(d, ref, locale);\n}\n"]}
1
+ {"version":3,"sources":["../src/utils/smartTime.ts"],"names":["d","format"],"mappings":"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","file":"chunk-UW5DUEXJ.js","sourcesContent":["import { format, type UiKitMessages } from '../locale/messages';\n\n// Smart time helpers — deterministic, Intl-free. SSR-safe because no\n// Intl.DateTimeFormat is involved; the only environment-dependent input\n// is `now`, which the consumer can inject for testing or for\n// hydration-safe rendering (TimeAgo flips from absolute to relative\n// post-mount). TZ follows the runtime — pass `now` from a known TZ if\n// you need cross-TZ consistency.\n\nconst MINUTE_MS = 60_000;\nconst DAY_MS = 86_400_000;\n\n// Day-precision inputs (\"YYYY-MM-DD\" with no time, or \"YYYY-MM-DDT00:00:00Z\"\n// from APIs that don't carry a real time-of-day) parse as UTC midnight by\n// the JS spec. In a negative TZ that lands on the previous calendar day\n// — the user expects the day they typed, not a TZ shift. We normalise\n// both forms to LOCAL midnight of the same calendar day. Timestamps with\n// a real time-of-day fall through to the standard parser.\nconst DATE_ONLY_RE = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\nconst DAY_UTC_RE = /^(\\d{4})-(\\d{2})-(\\d{2})T00:00:00(?:\\.0+)?Z$/;\n\nfunction parseIso(iso: string): Date | null {\n const dateOnly = DATE_ONLY_RE.exec(iso) ?? DAY_UTC_RE.exec(iso);\n if (dateOnly) {\n const [, y, m, d] = dateOnly;\n return new Date(Number(y), Number(m) - 1, Number(d));\n }\n const d = new Date(iso);\n return Number.isNaN(d.getTime()) ? null : d;\n}\n\nfunction pad2(n: number): string {\n return n < 10 ? `0${n}` : String(n);\n}\n\n// Day-precision markers (T00:00:00Z from Bsale/APIs that don't carry a\n// real time) parse as midnight in local TZ — checking local h/m matches\n// what the user sees. Without this, the smart formatter would render\n// \"mié 00:00\" for every day-precision value, which is noise.\nfunction hasMeaningfulTime(d: Date): boolean {\n return d.getHours() !== 0 || d.getMinutes() !== 0;\n}\n\nfunction startOfDay(d: Date): number {\n return new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();\n}\n\nfunction dayDiff(target: Date, ref: Date): number {\n return Math.round((startOfDay(target) - startOfDay(ref)) / DAY_MS);\n}\n\nfunction timeOfDay(d: Date): string {\n return `${pad2(d.getHours())}:${pad2(d.getMinutes())}`;\n}\n\nfunction dateOnlyText(d: Date, ref: Date, locale: UiKitMessages): string {\n const months = locale['timeAgo.monthsShort'];\n const base = `${d.getDate()} ${months[d.getMonth()]}`;\n return d.getFullYear() === ref.getFullYear() ? base : `${base} ${d.getFullYear()}`;\n}\n\n/**\n * Absolute date in compact form. Same-year omits the year (\"12 mar\");\n * different year appends it (\"12 mar 2025\"). Ignores time-of-day.\n */\nexport function formatIsoDate(iso: string, locale: UiKitMessages, now?: Date): string {\n const d = parseIso(iso);\n if (!d) return '';\n return dateOnlyText(d, now ?? new Date(), locale);\n}\n\n/**\n * Absolute date-time in compact form. Adds \", HH:MM\" only when the\n * input carries a meaningful time-of-day (see {@link hasMeaningfulTime}).\n */\nexport function formatIsoDateTime(iso: string, locale: UiKitMessages, now?: Date): string {\n const d = parseIso(iso);\n if (!d) return '';\n const base = dateOnlyText(d, now ?? new Date(), locale);\n return hasMeaningfulTime(d) ? `${base}, ${timeOfDay(d)}` : base;\n}\n\n/**\n * Adaptive date-time. Renders the most informative compact label given\n * the distance between `iso` and `now` (default: `new Date()`):\n * `<1 min` → \"ahora\" / \"pronto\"; `<60 min` → \"hace N min\" / \"en N min\";\n * same day → \"hoy HH:MM\"; ±1 day → \"ayer HH:MM\" / \"mañana HH:MM\";\n * `<7 days` → \"lun HH:MM\"; same year → \"12 mar\"; else \"12 mar 2025\".\n * The time-of-day portion is dropped when the input lacks one.\n */\nexport function smartDateTime(iso: string, locale: UiKitMessages, now?: Date): string {\n const d = parseIso(iso);\n if (!d) return '';\n const ref = now ?? new Date();\n const deltaMs = d.getTime() - ref.getTime();\n const deltaMin = Math.round(deltaMs / MINUTE_MS);\n const absMin = Math.abs(deltaMin);\n if (absMin < 1) return deltaMs < 0 ? locale['timeAgo.now'] : locale['timeAgo.soon'];\n if (absMin < 60) {\n return deltaMs < 0\n ? format(locale['timeAgo.minAgo'], { n: absMin })\n : format(locale['timeAgo.minIn'], { n: absMin });\n }\n const meaningful = hasMeaningfulTime(d);\n const dd = dayDiff(d, ref);\n const tod = meaningful ? ` ${timeOfDay(d)}` : '';\n if (dd === 0) return meaningful ? `${locale['timeAgo.today']} ${timeOfDay(d)}` : locale['timeAgo.today'];\n if (dd === -1) return meaningful ? `${locale['timeAgo.yesterday']} ${timeOfDay(d)}` : locale['timeAgo.yesterday'];\n if (dd === 1) return meaningful ? `${locale['timeAgo.tomorrow']} ${timeOfDay(d)}` : locale['timeAgo.tomorrow'];\n if (Math.abs(dd) < 7) {\n const weekdays = locale['timeAgo.weekdaysShort'];\n return `${weekdays[d.getDay()]}${tod}`;\n }\n return dateOnlyText(d, ref, locale);\n}\n\n/**\n * Adaptive date (date-only). Same scale as {@link smartDateTime} but\n * without the HH:MM portion — useful when the consumer wants\n * coarse-grained labels like \"hoy\" / \"lun\" / \"12 mar\" regardless of\n * whether the input carries a time-of-day.\n */\nexport function smartDate(iso: string, locale: UiKitMessages, now?: Date): string {\n const d = parseIso(iso);\n if (!d) return '';\n const ref = now ?? new Date();\n const dd = dayDiff(d, ref);\n if (dd === 0) return locale['timeAgo.today'];\n if (dd === -1) return locale['timeAgo.yesterday'];\n if (dd === 1) return locale['timeAgo.tomorrow'];\n if (Math.abs(dd) < 7) return locale['timeAgo.weekdaysShort'][d.getDay()];\n return dateOnlyText(d, ref, locale);\n}\n"]}
@@ -1,10 +1,10 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunkRFWSMP7Q_js = require('./chunk-RFWSMP7Q.js');
5
- var chunkMVJITG75_js = require('./chunk-MVJITG75.js');
4
+ var chunkIH7U4FJT_js = require('./chunk-IH7U4FJT.js');
5
+ var chunkMUXOT5KS_js = require('./chunk-MUXOT5KS.js');
6
6
  var chunkWAGWB35Q_js = require('./chunk-WAGWB35Q.js');
7
- var chunkA42WMR4M_js = require('./chunk-A42WMR4M.js');
7
+ var chunkDKOAATV2_js = require('./chunk-DKOAATV2.js');
8
8
  var chunkXMLBKK7X_js = require('./chunk-XMLBKK7X.js');
9
9
  var chunkCRKYET66_js = require('./chunk-CRKYET66.js');
10
10
  var chunkC4AKMVDZ_js = require('./chunk-C4AKMVDZ.js');
@@ -49,7 +49,7 @@ function Combobox({
49
49
  onQueryChange,
50
50
  loading
51
51
  }) {
52
- const locale = chunkA42WMR4M_js.useLocale();
52
+ const locale = chunkDKOAATV2_js.useLocale();
53
53
  const ph = placeholder ?? locale["common.search"];
54
54
  const empty = emptyMessage ?? locale["common.noResults"];
55
55
  const [open, setOpen] = React__namespace.useState(false);
@@ -200,7 +200,7 @@ function Combobox({
200
200
  visibility: pos.ready ? "visible" : "hidden"
201
201
  },
202
202
  children: filtered.length === 0 ? loading ? /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "combobox__empty combobox__loading", children: [
203
- /* @__PURE__ */ jsxRuntime.jsx(chunkRFWSMP7Q_js.Spinner, { size: "sm", "aria-hidden": "true" }),
203
+ /* @__PURE__ */ jsxRuntime.jsx(chunkIH7U4FJT_js.Spinner, { size: "sm", "aria-hidden": "true" }),
204
204
  locale["common.loading"],
205
205
  "\u2026"
206
206
  ] }) : /* @__PURE__ */ jsxRuntime.jsx("li", { className: "combobox__empty", children: empty }) : filtered.map((o, i) => /* @__PURE__ */ jsxRuntime.jsxs(
@@ -245,13 +245,13 @@ function DatePicker({
245
245
  id,
246
246
  format = "auto"
247
247
  }) {
248
- const locale = chunkA42WMR4M_js.useLocale();
249
- const fmt = chunkMVJITG75_js.resolveDateFormat(format);
250
- const ph = placeholder ?? chunkMVJITG75_js.dateFormatPlaceholder(fmt);
248
+ const locale = chunkDKOAATV2_js.useLocale();
249
+ const fmt = chunkMUXOT5KS_js.resolveDateFormat(format);
250
+ const ph = placeholder ?? chunkMUXOT5KS_js.dateFormatPlaceholder(fmt);
251
251
  const weekdays = locale["picker.weekdaysShort"];
252
252
  const months = locale["calendar.months"];
253
253
  const [open, setOpen] = React__namespace.useState(false);
254
- const [view, setView] = React__namespace.useState(() => chunkMVJITG75_js.startOfMonth(value ?? /* @__PURE__ */ new Date()));
254
+ const [view, setView] = React__namespace.useState(() => chunkMUXOT5KS_js.startOfMonth(value ?? /* @__PURE__ */ new Date()));
255
255
  const wrapRef = React__namespace.useRef(null);
256
256
  const popoverRef = React__namespace.useRef(null);
257
257
  const pos = chunkCRKYET66_js.usePopoverPosition(wrapRef, popoverRef, {
@@ -266,9 +266,9 @@ function DatePicker({
266
266
  refs: [wrapRef, popoverRef]
267
267
  });
268
268
  React__namespace.useEffect(() => {
269
- if (value) setView(chunkMVJITG75_js.startOfMonth(value));
269
+ if (value) setView(chunkMUXOT5KS_js.startOfMonth(value));
270
270
  }, [value]);
271
- const { cells } = chunkMVJITG75_js.buildMonthGrid(view, 0);
271
+ const { cells } = chunkMUXOT5KS_js.buildMonthGrid6(view, 0);
272
272
  const isDisabled = (d) => !!(minDate && d < new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate()) || maxDate && d > new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate()) || isDateDisabled?.(d));
273
273
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref: wrapRef, className: chunkPASF6T4H_js.cx("datepicker", invalid && "is-invalid", disabled && "is-disabled", className), children: [
274
274
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -280,9 +280,9 @@ function DatePicker({
280
280
  placeholder: ph,
281
281
  size: ph.length + 1,
282
282
  disabled,
283
- value: value ? chunkMVJITG75_js.formatDate(value, fmt) : "",
283
+ value: value ? chunkMUXOT5KS_js.formatDate(value, fmt) : "",
284
284
  onChange: (e) => {
285
- const d = chunkMVJITG75_js.parseDate(e.target.value, fmt);
285
+ const d = chunkMUXOT5KS_js.parseDate(e.target.value, fmt);
286
286
  onChange(d);
287
287
  },
288
288
  onFocus: () => setOpen(true),
@@ -314,20 +314,20 @@ function DatePicker({
314
314
  },
315
315
  children: [
316
316
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "datepicker__nav", children: [
317
- /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: () => setView((v) => chunkMVJITG75_js.addMonths(v, -1)), "aria-label": locale["calendar.prevMonth"], children: /* @__PURE__ */ jsxRuntime.jsx(chunkC4AKMVDZ_js.ChevronLeft, { size: 16 }) }),
317
+ /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: () => setView((v) => chunkMUXOT5KS_js.addMonths(v, -1)), "aria-label": locale["calendar.prevMonth"], children: /* @__PURE__ */ jsxRuntime.jsx(chunkC4AKMVDZ_js.ChevronLeft, { size: 16 }) }),
318
318
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "datepicker__title", children: [
319
319
  months[view.getMonth()],
320
320
  " ",
321
321
  view.getFullYear()
322
322
  ] }),
323
- /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: () => setView((v) => chunkMVJITG75_js.addMonths(v, 1)), "aria-label": locale["calendar.nextMonth"], children: /* @__PURE__ */ jsxRuntime.jsx(chunkC4AKMVDZ_js.ChevronRight, { size: 16 }) })
323
+ /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: () => setView((v) => chunkMUXOT5KS_js.addMonths(v, 1)), "aria-label": locale["calendar.nextMonth"], children: /* @__PURE__ */ jsxRuntime.jsx(chunkC4AKMVDZ_js.ChevronRight, { size: 16 }) })
324
324
  ] }),
325
325
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "datepicker__grid", children: [
326
326
  weekdays.map((w, i) => /* @__PURE__ */ jsxRuntime.jsx("span", { className: "datepicker__dow", children: w }, i)),
327
- cells.map((d, i) => {
328
- if (!d) return /* @__PURE__ */ jsxRuntime.jsx("span", {}, `b${i}`);
329
- const sel = value && chunkMVJITG75_js.isSameDay(d, value);
330
- const today = chunkMVJITG75_js.isSameDay(d, /* @__PURE__ */ new Date());
327
+ cells.map(({ date: d, outside }, i) => {
328
+ if (outside) return /* @__PURE__ */ jsxRuntime.jsx("span", { className: "datepicker__day is-outside", "aria-hidden": "true", children: d.getDate() }, i);
329
+ const sel = value && chunkMUXOT5KS_js.isSameDay(d, value);
330
+ const today = chunkMUXOT5KS_js.isSameDay(d, /* @__PURE__ */ new Date());
331
331
  const off = isDisabled(d);
332
332
  return /* @__PURE__ */ jsxRuntime.jsx(
333
333
  "button",
@@ -363,7 +363,7 @@ function FileUpload({
363
363
  const [drag, setDrag] = React__namespace.useState(false);
364
364
  const inputRef = React__namespace.useRef(null);
365
365
  const hintId = React__namespace.useId();
366
- const locale = chunkA42WMR4M_js.useLocale();
366
+ const locale = chunkDKOAATV2_js.useLocale();
367
367
  const handle = (list) => {
368
368
  if (!list) return;
369
369
  let arr = Array.from(list);
@@ -521,7 +521,7 @@ function YearPicker({
521
521
  id,
522
522
  className
523
523
  }) {
524
- const t = chunkA42WMR4M_js.useLocale();
524
+ const t = chunkDKOAATV2_js.useLocale();
525
525
  const base = value ?? (/* @__PURE__ */ new Date()).getFullYear();
526
526
  const [decade, setDecade] = React__namespace.useState(Math.floor(base / 10) * 10);
527
527
  React__namespace.useEffect(() => {
@@ -569,7 +569,7 @@ function MonthPicker({
569
569
  id,
570
570
  className
571
571
  }) {
572
- const t = chunkA42WMR4M_js.useLocale();
572
+ const t = chunkDKOAATV2_js.useLocale();
573
573
  const months = t["calendar.months"];
574
574
  const base = value ?? /* @__PURE__ */ new Date();
575
575
  const [year, setYear] = React__namespace.useState(base.getFullYear());
@@ -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-S3MMU3LW.js.map
615
- //# sourceMappingURL=chunk-S3MMU3LW.js.map
614
+ //# sourceMappingURL=chunk-VFZ7VMU2.js.map
615
+ //# sourceMappingURL=chunk-VFZ7VMU2.js.map