@misael703/ui 1.49.0 → 1.51.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 (168) hide show
  1. package/dist/{chunk-KTK5EPQP.js → chunk-2XIFGGF2.js} +7 -7
  2. package/dist/{chunk-KTK5EPQP.js.map → chunk-2XIFGGF2.js.map} +1 -1
  3. package/dist/{chunk-A2U72HLY.mjs → chunk-3TS54SJB.mjs} +5 -5
  4. package/dist/{chunk-A2U72HLY.mjs.map → chunk-3TS54SJB.mjs.map} +1 -1
  5. package/dist/{chunk-QK3COHER.mjs → chunk-4LU36CNV.mjs} +3 -3
  6. package/dist/{chunk-QK3COHER.mjs.map → chunk-4LU36CNV.mjs.map} +1 -1
  7. package/dist/{chunk-XLKTIQTD.js → chunk-5UBYEEOF.js} +8 -8
  8. package/dist/{chunk-XLKTIQTD.js.map → chunk-5UBYEEOF.js.map} +1 -1
  9. package/dist/{chunk-VREEDSRE.js → chunk-64YL7DN5.js} +4 -4
  10. package/dist/{chunk-VREEDSRE.js.map → chunk-64YL7DN5.js.map} +1 -1
  11. package/dist/chunk-6D5UP23V.js +63 -0
  12. package/dist/chunk-6D5UP23V.js.map +1 -0
  13. package/dist/{chunk-KAQJWVXS.js → chunk-AKUGR3AX.js} +7 -7
  14. package/dist/{chunk-KAQJWVXS.js.map → chunk-AKUGR3AX.js.map} +1 -1
  15. package/dist/{chunk-BY4VPPA4.mjs → chunk-AP655IUN.mjs} +3 -3
  16. package/dist/{chunk-BY4VPPA4.mjs.map → chunk-AP655IUN.mjs.map} +1 -1
  17. package/dist/{chunk-RS74LVAT.mjs → chunk-C4XPGEU2.mjs} +4 -4
  18. package/dist/{chunk-RS74LVAT.mjs.map → chunk-C4XPGEU2.mjs.map} +1 -1
  19. package/dist/{chunk-QTSZWDZR.js → chunk-CJLCPURD.js} +5 -5
  20. package/dist/{chunk-QTSZWDZR.js.map → chunk-CJLCPURD.js.map} +1 -1
  21. package/dist/{chunk-SRSVD5AT.mjs → chunk-D6YFA5HW.mjs} +117 -6
  22. package/dist/chunk-D6YFA5HW.mjs.map +1 -0
  23. package/dist/{chunk-5BACX5CP.mjs → chunk-EE3VOAU4.mjs} +4 -4
  24. package/dist/{chunk-5BACX5CP.mjs.map → chunk-EE3VOAU4.mjs.map} +1 -1
  25. package/dist/{chunk-DQMKMRE4.js → chunk-EI2V2GGG.js} +6 -6
  26. package/dist/{chunk-DQMKMRE4.js.map → chunk-EI2V2GGG.js.map} +1 -1
  27. package/dist/{chunk-TMSEACN2.mjs → chunk-FI5U4TL5.mjs} +4 -4
  28. package/dist/{chunk-TMSEACN2.mjs.map → chunk-FI5U4TL5.mjs.map} +1 -1
  29. package/dist/{chunk-HCOJH3W3.mjs → chunk-H6ZT2DJ2.mjs} +3 -2
  30. package/dist/chunk-H6ZT2DJ2.mjs.map +1 -0
  31. package/dist/chunk-HT43MPKW.js +5 -0
  32. package/dist/{chunk-2KZ4NI3X.js.map → chunk-HT43MPKW.js.map} +1 -1
  33. package/dist/{chunk-NZNTB5OI.js → chunk-JDK4GEME.js} +2 -2
  34. package/dist/chunk-JDK4GEME.js.map +1 -0
  35. package/dist/{chunk-4IJTH556.mjs → chunk-JL77KUET.mjs} +3 -3
  36. package/dist/{chunk-4IJTH556.mjs.map → chunk-JL77KUET.mjs.map} +1 -1
  37. package/dist/chunk-JT6OOSI2.mjs +4 -0
  38. package/dist/{chunk-QQE3XOEM.mjs.map → chunk-JT6OOSI2.mjs.map} +1 -1
  39. package/dist/{chunk-AJNQDMWF.js → chunk-L5R6FKHH.js} +4 -4
  40. package/dist/{chunk-AJNQDMWF.js.map → chunk-L5R6FKHH.js.map} +1 -1
  41. package/dist/{chunk-PGTOBPHI.mjs → chunk-LDCG4KDI.mjs} +3 -3
  42. package/dist/{chunk-PGTOBPHI.mjs.map → chunk-LDCG4KDI.mjs.map} +1 -1
  43. package/dist/{chunk-2KBQSARY.mjs → chunk-MG4MFZL3.mjs} +4 -4
  44. package/dist/{chunk-2KBQSARY.mjs.map → chunk-MG4MFZL3.mjs.map} +1 -1
  45. package/dist/{chunk-SVXJ2IPG.js → chunk-MIUDP3FD.js} +8 -8
  46. package/dist/{chunk-SVXJ2IPG.js.map → chunk-MIUDP3FD.js.map} +1 -1
  47. package/dist/{chunk-WXODIWH7.js → chunk-MJMLNETS.js} +3 -2
  48. package/dist/chunk-MJMLNETS.js.map +1 -0
  49. package/dist/{chunk-KKJDF3EL.mjs → chunk-MMFYXM3J.mjs} +4 -4
  50. package/dist/{chunk-KKJDF3EL.mjs.map → chunk-MMFYXM3J.mjs.map} +1 -1
  51. package/dist/{chunk-5DFEMKK5.js → chunk-MR2KQSBB.js} +10 -10
  52. package/dist/{chunk-5DFEMKK5.js.map → chunk-MR2KQSBB.js.map} +1 -1
  53. package/dist/{chunk-YWRVGG7Q.js → chunk-N5N5K36B.js} +6 -6
  54. package/dist/{chunk-YWRVGG7Q.js.map → chunk-N5N5K36B.js.map} +1 -1
  55. package/dist/{chunk-7SMQLCIU.js → chunk-OG4IEN7J.js} +8 -8
  56. package/dist/{chunk-7SMQLCIU.js.map → chunk-OG4IEN7J.js.map} +1 -1
  57. package/dist/{chunk-LT52N2KJ.mjs → chunk-OSR32MPG.mjs} +4 -4
  58. package/dist/{chunk-LT52N2KJ.mjs.map → chunk-OSR32MPG.mjs.map} +1 -1
  59. package/dist/{chunk-64X5LNXF.mjs → chunk-PDZN6KBV.mjs} +4 -4
  60. package/dist/{chunk-64X5LNXF.mjs.map → chunk-PDZN6KBV.mjs.map} +1 -1
  61. package/dist/{chunk-JSKNG7Y2.js → chunk-Q4MSQLMS.js} +13 -13
  62. package/dist/{chunk-JSKNG7Y2.js.map → chunk-Q4MSQLMS.js.map} +1 -1
  63. package/dist/{chunk-5FIUO3RY.mjs → chunk-QMBSDSSN.mjs} +3 -3
  64. package/dist/{chunk-5FIUO3RY.mjs.map → chunk-QMBSDSSN.mjs.map} +1 -1
  65. package/dist/{chunk-OP2XWWSV.js → chunk-QUP2GEPF.js} +4 -4
  66. package/dist/{chunk-OP2XWWSV.js.map → chunk-QUP2GEPF.js.map} +1 -1
  67. package/dist/{chunk-5AC43UHU.mjs → chunk-RHS4E3R7.mjs} +4 -4
  68. package/dist/{chunk-5AC43UHU.mjs.map → chunk-RHS4E3R7.mjs.map} +1 -1
  69. package/dist/{chunk-4P2MAERZ.mjs → chunk-RSU5CPC7.mjs} +4 -4
  70. package/dist/{chunk-4P2MAERZ.mjs.map → chunk-RSU5CPC7.mjs.map} +1 -1
  71. package/dist/{chunk-MM7MT37Y.mjs → chunk-SDR7JKDF.mjs} +2 -2
  72. package/dist/chunk-SDR7JKDF.mjs.map +1 -0
  73. package/dist/{chunk-7SRJ4UVY.js → chunk-T3IZPDGQ.js} +5 -5
  74. package/dist/{chunk-7SRJ4UVY.js.map → chunk-T3IZPDGQ.js.map} +1 -1
  75. package/dist/{chunk-23U5TMYH.mjs → chunk-TS4UIWRG.mjs} +3 -3
  76. package/dist/{chunk-23U5TMYH.mjs.map → chunk-TS4UIWRG.mjs.map} +1 -1
  77. package/dist/{chunk-DHWGICRP.js → chunk-UWKP36N6.js} +121 -9
  78. package/dist/chunk-UWKP36N6.js.map +1 -0
  79. package/dist/{chunk-LL7PZ6Q3.js → chunk-UZX2SE42.js} +55 -41
  80. package/dist/chunk-UZX2SE42.js.map +1 -0
  81. package/dist/{chunk-GNRWMXHN.mjs → chunk-VNRZAYM7.mjs} +51 -37
  82. package/dist/chunk-VNRZAYM7.mjs.map +1 -0
  83. package/dist/{chunk-VZV24VNK.js → chunk-WXWEZQLX.js} +6 -6
  84. package/dist/{chunk-VZV24VNK.js.map → chunk-WXWEZQLX.js.map} +1 -1
  85. package/dist/{chunk-LWEX5XQF.js → chunk-Y6WOMG2H.js} +6 -6
  86. package/dist/{chunk-LWEX5XQF.js.map → chunk-Y6WOMG2H.js.map} +1 -1
  87. package/dist/{chunk-6NLW2VHE.mjs → chunk-YEIU5W7E.mjs} +4 -4
  88. package/dist/{chunk-6NLW2VHE.mjs.map → chunk-YEIU5W7E.mjs.map} +1 -1
  89. package/dist/chunk-YTKPENNW.mjs +41 -0
  90. package/dist/chunk-YTKPENNW.mjs.map +1 -0
  91. package/dist/{chunk-66QZFBTI.js → chunk-Z3GT7VB2.js} +10 -10
  92. package/dist/{chunk-66QZFBTI.js.map → chunk-Z3GT7VB2.js.map} +1 -1
  93. package/dist/components/AdvancedPickers.js +7 -7
  94. package/dist/components/AdvancedPickers.mjs +3 -3
  95. package/dist/components/AppShell.js +6 -5
  96. package/dist/components/AppShell.mjs +4 -3
  97. package/dist/components/Comments.js +6 -6
  98. package/dist/components/Comments.mjs +3 -3
  99. package/dist/components/Commerce.js +17 -16
  100. package/dist/components/Commerce.mjs +6 -5
  101. package/dist/components/DataTable.d.mts +19 -4
  102. package/dist/components/DataTable.d.ts +19 -4
  103. package/dist/components/DataTable.js +12 -11
  104. package/dist/components/DataTable.mjs +5 -4
  105. package/dist/components/Display.js +13 -13
  106. package/dist/components/Display.mjs +2 -2
  107. package/dist/components/Display3.js +8 -8
  108. package/dist/components/Display3.mjs +2 -2
  109. package/dist/components/Editing.d.mts +40 -1
  110. package/dist/components/Editing.d.ts +40 -1
  111. package/dist/components/Editing.js +14 -9
  112. package/dist/components/Editing.mjs +5 -4
  113. package/dist/components/Filters.js +9 -9
  114. package/dist/components/Filters.mjs +3 -3
  115. package/dist/components/Gallery.js +5 -5
  116. package/dist/components/Gallery.mjs +3 -3
  117. package/dist/components/Inputs.js +7 -7
  118. package/dist/components/Inputs.mjs +3 -3
  119. package/dist/components/InputsExtra.js +12 -12
  120. package/dist/components/InputsExtra.mjs +3 -3
  121. package/dist/components/Notifications.js +4 -4
  122. package/dist/components/Notifications.mjs +3 -3
  123. package/dist/components/Overlay.js +6 -5
  124. package/dist/components/Overlay.mjs +4 -3
  125. package/dist/components/Permissions.js +4 -4
  126. package/dist/components/Permissions.mjs +3 -3
  127. package/dist/components/Pickers.js +8 -8
  128. package/dist/components/Pickers.mjs +3 -3
  129. package/dist/components/TimeAgo.js +6 -6
  130. package/dist/components/TimeAgo.mjs +4 -4
  131. package/dist/components/Toast.js +4 -4
  132. package/dist/components/Toast.mjs +2 -2
  133. package/dist/hooks/index.d.mts +1 -0
  134. package/dist/hooks/index.d.ts +1 -0
  135. package/dist/hooks/index.js +6 -1
  136. package/dist/hooks/index.mjs +2 -1
  137. package/dist/hooks/useVirtualRows.d.mts +40 -0
  138. package/dist/hooks/useVirtualRows.d.ts +40 -0
  139. package/dist/hooks/useVirtualRows.js +13 -0
  140. package/dist/hooks/useVirtualRows.js.map +1 -0
  141. package/dist/hooks/useVirtualRows.mjs +4 -0
  142. package/dist/hooks/useVirtualRows.mjs.map +1 -0
  143. package/dist/index.d.mts +3 -2
  144. package/dist/index.d.ts +3 -2
  145. package/dist/index.js +122 -113
  146. package/dist/index.mjs +23 -22
  147. package/dist/locale/index.d.mts +2 -2
  148. package/dist/locale/index.d.ts +2 -2
  149. package/dist/locale/index.js +6 -6
  150. package/dist/locale/index.mjs +2 -2
  151. package/dist/{messages-CT40Sck2.d.ts → messages-D7YiIzCG.d.mts} +2 -0
  152. package/dist/{messages-CT40Sck2.d.mts → messages-D7YiIzCG.d.ts} +2 -0
  153. package/dist/styles.css +1 -1
  154. package/dist/utils/smartTime.d.mts +1 -1
  155. package/dist/utils/smartTime.d.ts +1 -1
  156. package/dist/utils/smartTime.js +6 -6
  157. package/dist/utils/smartTime.mjs +2 -2
  158. package/package.json +1 -1
  159. package/dist/chunk-2KZ4NI3X.js +0 -5
  160. package/dist/chunk-DHWGICRP.js.map +0 -1
  161. package/dist/chunk-GNRWMXHN.mjs.map +0 -1
  162. package/dist/chunk-HCOJH3W3.mjs.map +0 -1
  163. package/dist/chunk-LL7PZ6Q3.js.map +0 -1
  164. package/dist/chunk-MM7MT37Y.mjs.map +0 -1
  165. package/dist/chunk-NZNTB5OI.js.map +0 -1
  166. package/dist/chunk-QQE3XOEM.mjs +0 -4
  167. package/dist/chunk-SRSVD5AT.mjs.map +0 -1
  168. package/dist/chunk-WXODIWH7.js.map +0 -1
@@ -8,5 +8,5 @@ function format(template, vars) {
8
8
  }
9
9
 
10
10
  export { format };
11
- //# sourceMappingURL=chunk-MM7MT37Y.mjs.map
12
- //# sourceMappingURL=chunk-MM7MT37Y.mjs.map
11
+ //# sourceMappingURL=chunk-SDR7JKDF.mjs.map
12
+ //# sourceMappingURL=chunk-SDR7JKDF.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/locale/messages.ts"],"names":[],"mappings":";AA6MO,SAAS,MAAA,CAAO,UAAkB,IAAA,EAA+C;AACtF,EAAA,OAAO,QAAA,CAAS,OAAA;AAAA,IAAQ,YAAA;AAAA,IAAc,CAAC,KAAA,EAAO,GAAA,KAC5C,MAAA,CAAO,UAAU,cAAA,CAAe,IAAA,CAAK,IAAA,EAAM,GAAG,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,GAAG,CAAC,CAAA,GAAI;AAAA,GACxE;AACF","file":"chunk-SDR7JKDF.mjs","sourcesContent":["/**\n * Flat dictionary of UI strings used by the kit. Keys are dot-separated\n * namespaces (component or area). Values may include `{var}` placeholders\n * that get substituted via `format()`.\n */\nexport interface UiKitMessages {\n // Generic actions\n 'common.close': string;\n 'common.cancel': string;\n 'common.confirm': string;\n 'common.apply': string;\n 'common.clear': string;\n 'common.edit': string;\n 'common.empty': string;\n 'common.loading': string;\n 'common.search': string;\n 'common.noResults': string;\n\n // Overlay\n 'modal.close': string;\n 'drawer.close': string;\n 'toast.close': string;\n\n // DataTable\n 'table.empty': string;\n 'table.selectAll': string;\n /** Template: \"Seleccionar {label}\" */\n 'table.selectRow': string;\n /** Template: \"Ver {label}\" — accessible name of an interactive row. */\n 'table.rowAction': string;\n /** Template: \"Expandir detalle de {label}\" — accessible name of the row-expansion toggle. */\n 'table.expandRow': string;\n /** Accessible name of the (visually empty) expansion-toggle column header. */\n 'table.expandColumn': string;\n /** ColumnToggle trigger label / menu name (\"Columnas\"). */\n 'table.columns': string;\n /** EditableCell: shown (via title/aria) when an async commit rejects. */\n 'editable.commitError': string;\n\n // AppShell\n 'appshell.mainNav': string;\n 'appshell.breadcrumb': string;\n /** Accessible name for the kit's built-in menu toggle (opt-in via `showMenuToggle`). */\n 'appshell.toggleMenu': string;\n\n // TimeAgo / smart-time helpers\n /** Sub-minute past: \"ahora\". */\n 'timeAgo.now': string;\n /** Sub-minute future: \"pronto\". */\n 'timeAgo.soon': string;\n /** Template: \"hace {n} min\" (past, 1-59 minutes). */\n 'timeAgo.minAgo': string;\n /** Template: \"en {n} min\" (future, 1-59 minutes). */\n 'timeAgo.minIn': string;\n /** Same-day prefix: \"hoy\". */\n 'timeAgo.today': string;\n /** Day-before prefix: \"ayer\". */\n 'timeAgo.yesterday': string;\n /** Day-after prefix: \"mañana\". */\n 'timeAgo.tomorrow': string;\n /** Compact weekday names, index 0 = Sunday (matches `Date.prototype.getDay()`). */\n 'timeAgo.weekdaysShort': string[];\n /** Compact month names, index 0 = January (matches `Date.prototype.getMonth()`). */\n 'timeAgo.monthsShort': string[];\n\n // Notifications\n 'notifications.button': string;\n /** Template: \" ({n} sin leer)\" */\n 'notifications.unreadSuffix': string;\n 'notifications.empty': string;\n 'notifications.panel': string;\n 'notifications.title': string;\n 'notifications.markAllRead': string;\n 'notifications.clear': string;\n\n // Filters\n 'filters.panel': string;\n 'filters.clear': string;\n 'filters.bulkActions': string;\n 'filters.deselectAll': string;\n 'filters.sortBy': string;\n /** Template: \"{n} seleccionado\" (used when n === 1) */\n 'filters.selectedOne': string;\n /** Template: \"{n} seleccionados\" (used when n !== 1) */\n 'filters.selectedMany': string;\n\n // Editing\n 'transfer.available': string;\n 'transfer.assigned': string;\n 'transfer.assignSelected': string;\n 'transfer.removeSelected': string;\n 'transfer.empty': string;\n 'descList.edit': string;\n 'diff.label': string;\n 'diff.field': string;\n 'diff.before': string;\n 'diff.after': string;\n\n // Permissions\n 'permissions.markAll': string;\n 'permissions.unmarkAll': string;\n 'permissions.action': string;\n /** Template: \"{action} para {role}\" */\n 'permissions.cellLabel': string;\n\n // Comments\n 'comments.placeholder': string;\n 'comments.send': string;\n 'comments.internalTag': string;\n 'comments.internalOnly': string;\n 'attachments.empty': string;\n /** Template: \"Eliminar {name}\" */\n 'attachments.remove': string;\n /** Template: \"Descargar {name}\" */\n 'attachments.download': string;\n\n // Gallery\n 'gallery.thumbnails': string;\n 'gallery.viewer': string;\n 'gallery.prev': string;\n 'gallery.next': string;\n 'gallery.close': string;\n /** Template: \"Imagen {n}\" */\n 'gallery.imageNumber': string;\n\n // Display\n 'alert.close': string;\n 'spinner.loading': string;\n 'chip.remove': string;\n\n // Display3 — Calendar\n 'calendar.prevMonth': string;\n 'calendar.nextMonth': string;\n 'calendar.expand': string;\n 'calendar.collapse': string;\n /** Mon, Tue, Wed, Thu, Fri, Sat, Sun (in array order, kit assumes Mon-first) */\n 'calendar.weekdays': readonly [string, string, string, string, string, string, string];\n 'calendar.months': readonly [\n string, string, string, string, string, string,\n string, string, string, string, string, string,\n ];\n\n // Pickers\n 'picker.openCalendar': string;\n 'picker.clearSelection': string;\n 'picker.selectRange': string;\n 'picker.searchCommands': string;\n 'picker.commandPalette': string;\n 'picker.prevYear': string;\n 'picker.nextYear': string;\n 'picker.prevDecade': string;\n 'picker.nextDecade': string;\n 'picker.selectYear': string;\n 'picker.selectMonth': string;\n /**\n * Single-letter weekday initials used by compact calendar grids (DatePicker,\n * DateRangePicker). Mon-first to match the kit's calendars.\n */\n 'picker.weekdaysShort': readonly [string, string, string, string, string, string, string];\n /** Template: \"Quitar {label}\" */\n 'combobox.remove': string;\n 'fileUpload.title': string;\n\n // Inputs\n 'pagination.label': string;\n 'pagination.prev': string;\n 'pagination.next': string;\n /** Template: \"{from}–{to} de {total}\" */\n 'pagination.range': string;\n 'pagination.rowsPerPage': string;\n 'numberInput.decrement': string;\n 'numberInput.increment': string;\n\n // Commerce\n 'commerce.quantity': string;\n 'commerce.decreaseQty': string;\n 'commerce.increaseQty': string;\n 'commerce.removeFromCart': string;\n /** Template: \"Quitar {name}\" */\n 'commerce.removeItem': string;\n 'commerce.addFavorite': string;\n 'commerce.removeFavorite': string;\n 'commerce.applyCoupon': string;\n 'commerce.cartTitle': string;\n 'commerce.cartEmpty': string;\n 'commerce.subtotal': string;\n 'commerce.checkout': string;\n 'commerce.promoPlaceholder': string;\n 'commerce.promoInvalid': string;\n 'commerce.shippingAchieved': string;\n /** Template before {amount} placeholder: \"Te falta \" (suffix \" para envío gratis\"). Split into two so consumers can swap word order. */\n 'commerce.shippingPrefix': string;\n 'commerce.shippingSuffix': string;\n\n // Tags input\n /** Template: \"Quitar {tag}\" */\n 'tagsInput.remove': string;\n 'tagsInput.placeholder': string;\n}\n\n/**\n * Replace `{var}` placeholders in a template string with values from `vars`.\n * Missing vars are left as-is, so a typo surfaces during dev instead of being\n * silently dropped.\n */\nexport function format(template: string, vars: Record<string, string | number>): string {\n return template.replace(/\\{(\\w+)\\}/g, (match, key) =>\n Object.prototype.hasOwnProperty.call(vars, key) ? String(vars[key]) : match\n );\n}\n"]}
@@ -5,7 +5,7 @@ var chunkD2H4VZVL_js = require('./chunk-D2H4VZVL.js');
5
5
  var chunkFL4ZCWUF_js = require('./chunk-FL4ZCWUF.js');
6
6
  var chunkNPXEZCTA_js = require('./chunk-NPXEZCTA.js');
7
7
  var chunk55P5FA5Q_js = require('./chunk-55P5FA5Q.js');
8
- var chunkWXODIWH7_js = require('./chunk-WXODIWH7.js');
8
+ var chunkMJMLNETS_js = require('./chunk-MJMLNETS.js');
9
9
  var chunkC4AKMVDZ_js = require('./chunk-C4AKMVDZ.js');
10
10
  var chunkPASF6T4H_js = require('./chunk-PASF6T4H.js');
11
11
  var React = require('react');
@@ -47,7 +47,7 @@ function Modal({
47
47
  const ref = React__namespace.useRef(null);
48
48
  const downOnBackdrop = React__namespace.useRef(false);
49
49
  const titleId = React__namespace.useId();
50
- const t = chunkWXODIWH7_js.useLocale();
50
+ const t = chunkMJMLNETS_js.useLocale();
51
51
  const { mounted, closing } = chunkFL4ZCWUF_js.useDelayedUnmount(open, EXIT_MS);
52
52
  chunkNPXEZCTA_js.useEscape(open, onClose, closeOnEsc);
53
53
  chunk55P5FA5Q_js.useFocusTrap(ref, open);
@@ -102,7 +102,7 @@ function Drawer({
102
102
  const ref = React__namespace.useRef(null);
103
103
  const downOnBackdrop = React__namespace.useRef(false);
104
104
  const titleId = React__namespace.useId();
105
- const t = chunkWXODIWH7_js.useLocale();
105
+ const t = chunkMJMLNETS_js.useLocale();
106
106
  const { mounted, closing } = chunkFL4ZCWUF_js.useDelayedUnmount(open, EXIT_MS);
107
107
  chunkNPXEZCTA_js.useEscape(open, onClose, closeOnEsc);
108
108
  chunk55P5FA5Q_js.useFocusTrap(ref, open);
@@ -146,5 +146,5 @@ function Drawer({
146
146
 
147
147
  exports.Drawer = Drawer;
148
148
  exports.Modal = Modal;
149
- //# sourceMappingURL=chunk-7SRJ4UVY.js.map
150
- //# sourceMappingURL=chunk-7SRJ4UVY.js.map
149
+ //# sourceMappingURL=chunk-T3IZPDGQ.js.map
150
+ //# sourceMappingURL=chunk-T3IZPDGQ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Overlay.tsx"],"names":["React","useLocale","useDelayedUnmount","useEscape","useFocusTrap","useScrollLock","createPortal","jsx","cx","jsxs","X"],"mappings":"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","file":"chunk-7SRJ4UVY.js","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { cx } from '../utils/cx';\nimport { X } from './Icons';\nimport { useLocale } from '../locale/LocaleProvider';\nimport { useDelayedUnmount } from '../hooks/useDelayedUnmount';\nimport { useFocusTrap, useEscape, useScrollLock } from '../hooks';\n\n// Exit animation duration in ms. Must match `--duration-exit` and the\n// `is-closing` keyframes in src/styles/index.css (`.modal-backdrop`,\n// `.drawer-backdrop`).\nconst EXIT_MS = 150;\n\nexport interface OverlayProps {\n open: boolean;\n onClose: () => void;\n title?: React.ReactNode;\n children?: React.ReactNode;\n footer?: React.ReactNode;\n size?: 'sm' | 'md' | 'lg';\n closeOnBackdrop?: boolean;\n closeOnEsc?: boolean;\n className?: string;\n}\n\nexport function Modal({\n open, onClose, title, children, footer, size = 'md',\n closeOnBackdrop = true, closeOnEsc = true, className,\n}: OverlayProps) {\n const ref = React.useRef<HTMLDivElement>(null);\n // True only when the press both started AND ended on the backdrop itself.\n // Fixes: press inside (e.g. text-selecting in an input) released over the\n // backdrop must NOT dismiss.\n const downOnBackdrop = React.useRef(false);\n const titleId = React.useId();\n const t = useLocale();\n // useDelayedUnmount keeps the DOM mounted during exit animation. The\n // a11y/scroll-lock hooks still consume `open` (the user's intent), not\n // `mounted` — we don't want to trap focus or block scroll while\n // animating out.\n const { mounted, closing } = useDelayedUnmount(open, EXIT_MS);\n useEscape(open, onClose, closeOnEsc);\n useFocusTrap(ref, open);\n useScrollLock(open);\n if (!mounted || typeof document === 'undefined') return null;\n return createPortal(\n <div\n className={cx('modal-backdrop', closing && 'is-closing')}\n onMouseDown={(e) => { downOnBackdrop.current = e.target === e.currentTarget; }}\n onClick={(e) => {\n if (closeOnBackdrop && downOnBackdrop.current && e.target === e.currentTarget) onClose();\n downOnBackdrop.current = false;\n }}\n >\n <div\n ref={ref}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n className={cx('modal', `modal--${size}`, closing && 'is-closing', className)}\n >\n {title && (\n <div className=\"modal__header\">\n <div id={titleId} className=\"modal__title\">{title}</div>\n <button type=\"button\" className=\"modal__close\" onClick={onClose} aria-label={t['modal.close']}><X size={18} /></button>\n </div>\n )}\n <div className=\"modal__body\">{children}</div>\n {footer && <div className=\"modal__footer\">{footer}</div>}\n </div>\n </div>,\n document.body\n );\n}\n\nexport interface DrawerProps extends OverlayProps {\n side?: 'left' | 'right';\n}\n\nexport function Drawer({\n open, onClose, title, children, footer, side = 'right',\n closeOnBackdrop = true, closeOnEsc = true, className,\n}: DrawerProps) {\n const ref = React.useRef<HTMLDivElement>(null);\n // True only when the press both started AND ended on the backdrop itself.\n // Fixes: press inside (e.g. text-selecting in an input) released over the\n // backdrop must NOT dismiss.\n const downOnBackdrop = React.useRef(false);\n const titleId = React.useId();\n const t = useLocale();\n const { mounted, closing } = useDelayedUnmount(open, EXIT_MS);\n useEscape(open, onClose, closeOnEsc);\n useFocusTrap(ref, open);\n useScrollLock(open);\n if (!mounted || typeof document === 'undefined') return null;\n return createPortal(\n <div\n className={cx('drawer-backdrop', closing && 'is-closing')}\n onMouseDown={(e) => { downOnBackdrop.current = e.target === e.currentTarget; }}\n onClick={(e) => {\n if (closeOnBackdrop && downOnBackdrop.current && e.target === e.currentTarget) onClose();\n downOnBackdrop.current = false;\n }}\n >\n <div\n ref={ref}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n className={cx('drawer', `drawer--${side}`, closing && 'is-closing', className)}\n >\n {title && (\n <div className=\"drawer__header\">\n <div id={titleId} className=\"drawer__title\">{title}</div>\n <button type=\"button\" className=\"drawer__close\" onClick={onClose} aria-label={t['drawer.close']}><X size={18} /></button>\n </div>\n )}\n <div className=\"drawer__body\">{children}</div>\n {footer && <div className=\"drawer__footer\">{footer}</div>}\n </div>\n </div>,\n document.body\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/Overlay.tsx"],"names":["React","useLocale","useDelayedUnmount","useEscape","useFocusTrap","useScrollLock","createPortal","jsx","cx","jsxs","X"],"mappings":"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","file":"chunk-T3IZPDGQ.js","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { cx } from '../utils/cx';\nimport { X } from './Icons';\nimport { useLocale } from '../locale/LocaleProvider';\nimport { useDelayedUnmount } from '../hooks/useDelayedUnmount';\nimport { useFocusTrap, useEscape, useScrollLock } from '../hooks';\n\n// Exit animation duration in ms. Must match `--duration-exit` and the\n// `is-closing` keyframes in src/styles/index.css (`.modal-backdrop`,\n// `.drawer-backdrop`).\nconst EXIT_MS = 150;\n\nexport interface OverlayProps {\n open: boolean;\n onClose: () => void;\n title?: React.ReactNode;\n children?: React.ReactNode;\n footer?: React.ReactNode;\n size?: 'sm' | 'md' | 'lg';\n closeOnBackdrop?: boolean;\n closeOnEsc?: boolean;\n className?: string;\n}\n\nexport function Modal({\n open, onClose, title, children, footer, size = 'md',\n closeOnBackdrop = true, closeOnEsc = true, className,\n}: OverlayProps) {\n const ref = React.useRef<HTMLDivElement>(null);\n // True only when the press both started AND ended on the backdrop itself.\n // Fixes: press inside (e.g. text-selecting in an input) released over the\n // backdrop must NOT dismiss.\n const downOnBackdrop = React.useRef(false);\n const titleId = React.useId();\n const t = useLocale();\n // useDelayedUnmount keeps the DOM mounted during exit animation. The\n // a11y/scroll-lock hooks still consume `open` (the user's intent), not\n // `mounted` — we don't want to trap focus or block scroll while\n // animating out.\n const { mounted, closing } = useDelayedUnmount(open, EXIT_MS);\n useEscape(open, onClose, closeOnEsc);\n useFocusTrap(ref, open);\n useScrollLock(open);\n if (!mounted || typeof document === 'undefined') return null;\n return createPortal(\n <div\n className={cx('modal-backdrop', closing && 'is-closing')}\n onMouseDown={(e) => { downOnBackdrop.current = e.target === e.currentTarget; }}\n onClick={(e) => {\n if (closeOnBackdrop && downOnBackdrop.current && e.target === e.currentTarget) onClose();\n downOnBackdrop.current = false;\n }}\n >\n <div\n ref={ref}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n className={cx('modal', `modal--${size}`, closing && 'is-closing', className)}\n >\n {title && (\n <div className=\"modal__header\">\n <div id={titleId} className=\"modal__title\">{title}</div>\n <button type=\"button\" className=\"modal__close\" onClick={onClose} aria-label={t['modal.close']}><X size={18} /></button>\n </div>\n )}\n <div className=\"modal__body\">{children}</div>\n {footer && <div className=\"modal__footer\">{footer}</div>}\n </div>\n </div>,\n document.body\n );\n}\n\nexport interface DrawerProps extends OverlayProps {\n side?: 'left' | 'right';\n}\n\nexport function Drawer({\n open, onClose, title, children, footer, side = 'right',\n closeOnBackdrop = true, closeOnEsc = true, className,\n}: DrawerProps) {\n const ref = React.useRef<HTMLDivElement>(null);\n // True only when the press both started AND ended on the backdrop itself.\n // Fixes: press inside (e.g. text-selecting in an input) released over the\n // backdrop must NOT dismiss.\n const downOnBackdrop = React.useRef(false);\n const titleId = React.useId();\n const t = useLocale();\n const { mounted, closing } = useDelayedUnmount(open, EXIT_MS);\n useEscape(open, onClose, closeOnEsc);\n useFocusTrap(ref, open);\n useScrollLock(open);\n if (!mounted || typeof document === 'undefined') return null;\n return createPortal(\n <div\n className={cx('drawer-backdrop', closing && 'is-closing')}\n onMouseDown={(e) => { downOnBackdrop.current = e.target === e.currentTarget; }}\n onClick={(e) => {\n if (closeOnBackdrop && downOnBackdrop.current && e.target === e.currentTarget) onClose();\n downOnBackdrop.current = false;\n }}\n >\n <div\n ref={ref}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n className={cx('drawer', `drawer--${side}`, closing && 'is-closing', className)}\n >\n {title && (\n <div className=\"drawer__header\">\n <div id={titleId} className=\"drawer__title\">{title}</div>\n <button type=\"button\" className=\"drawer__close\" onClick={onClose} aria-label={t['drawer.close']}><X size={18} /></button>\n </div>\n )}\n <div className=\"drawer__body\">{children}</div>\n {footer && <div className=\"drawer__footer\">{footer}</div>}\n </div>\n </div>,\n document.body\n );\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  'use client';
2
- import { format } from './chunk-MM7MT37Y.mjs';
2
+ import { format } from './chunk-SDR7JKDF.mjs';
3
3
 
4
4
  // src/utils/smartTime.ts
5
5
  var MINUTE_MS = 6e4;
@@ -82,5 +82,5 @@ function smartDate(iso, locale, now) {
82
82
  }
83
83
 
84
84
  export { formatIsoDate, formatIsoDateTime, smartDate, smartDateTime };
85
- //# sourceMappingURL=chunk-23U5TMYH.mjs.map
86
- //# sourceMappingURL=chunk-23U5TMYH.mjs.map
85
+ //# sourceMappingURL=chunk-TS4UIWRG.mjs.map
86
+ //# sourceMappingURL=chunk-TS4UIWRG.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/smartTime.ts"],"names":["d"],"mappings":"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","file":"chunk-23U5TMYH.mjs","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"],"mappings":"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","file":"chunk-TS4UIWRG.mjs","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,9 +1,9 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunk7SRJ4UVY_js = require('./chunk-7SRJ4UVY.js');
4
+ var chunkT3IZPDGQ_js = require('./chunk-T3IZPDGQ.js');
5
5
  var chunk6SSTTJV4_js = require('./chunk-6SSTTJV4.js');
6
- var chunkWXODIWH7_js = require('./chunk-WXODIWH7.js');
6
+ var chunkMJMLNETS_js = require('./chunk-MJMLNETS.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 ConfirmDialog({
42
42
  }) {
43
43
  const [busy, setBusy] = React__namespace.useState(false);
44
44
  const isBusy = loading ?? busy;
45
- const t = chunkWXODIWH7_js.useLocale();
45
+ const t = chunkMJMLNETS_js.useLocale();
46
46
  const confirmText = confirmLabel ?? t["common.confirm"];
47
47
  const cancelText = cancelLabel ?? t["common.cancel"];
48
48
  const handleConfirm = async () => {
@@ -55,7 +55,7 @@ function ConfirmDialog({
55
55
  }
56
56
  };
57
57
  return /* @__PURE__ */ jsxRuntime.jsx(
58
- chunk7SRJ4UVY_js.Modal,
58
+ chunkT3IZPDGQ_js.Modal,
59
59
  {
60
60
  open,
61
61
  onClose,
@@ -86,7 +86,7 @@ function DescriptionList({ children, className, ...rest }) {
86
86
  return /* @__PURE__ */ jsxRuntime.jsx("dl", { className: chunkPASF6T4H_js.cx("desc-list", className), ...rest, children });
87
87
  }
88
88
  function DescriptionListItem({ label, value, onEdit, editable }) {
89
- const t = chunkWXODIWH7_js.useLocale();
89
+ const t = chunkMJMLNETS_js.useLocale();
90
90
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
91
91
  /* @__PURE__ */ jsxRuntime.jsx("dt", { className: "desc-list__label", children: label }),
92
92
  /* @__PURE__ */ jsxRuntime.jsxs("dd", { className: "desc-list__value", children: [
@@ -96,7 +96,7 @@ function DescriptionListItem({ label, value, onEdit, editable }) {
96
96
  ] });
97
97
  }
98
98
  function DiffViewer({ entries, className, ...rest }) {
99
- const t = chunkWXODIWH7_js.useLocale();
99
+ const t = chunkMJMLNETS_js.useLocale();
100
100
  const beforeLabel = typeof t["diff.before"] === "string" ? t["diff.before"] : void 0;
101
101
  const afterLabel = typeof t["diff.after"] === "string" ? t["diff.after"] : void 0;
102
102
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: chunkPASF6T4H_js.cx("diff", className), role: "table", "aria-label": t["diff.label"], ...rest, children: [
@@ -122,7 +122,7 @@ function TransferList({
122
122
  }) {
123
123
  const [leftChecked, setLeftChecked] = React__namespace.useState(/* @__PURE__ */ new Set());
124
124
  const [rightChecked, setRightChecked] = React__namespace.useState(/* @__PURE__ */ new Set());
125
- const t = chunkWXODIWH7_js.useLocale();
125
+ const t = chunkMJMLNETS_js.useLocale();
126
126
  const srcTitle = sourceTitle ?? t["transfer.available"];
127
127
  const selTitle = selectedTitle ?? t["transfer.assigned"];
128
128
  const selectedIds = React__namespace.useMemo(
@@ -188,11 +188,123 @@ function TransferList({
188
188
  renderColumn(selTitle, right, rightChecked, setRightChecked)
189
189
  ] });
190
190
  }
191
+ function EditableCell({
192
+ value,
193
+ onCommit,
194
+ type = "text",
195
+ formatDisplay,
196
+ validate,
197
+ disabled,
198
+ placeholder,
199
+ ariaLabel,
200
+ className
201
+ }) {
202
+ const t = chunkMJMLNETS_js.useLocale();
203
+ const [editing, setEditing] = React__namespace.useState(false);
204
+ const [draft, setDraft] = React__namespace.useState(value);
205
+ const [pending, setPending] = React__namespace.useState(false);
206
+ const [error, setError] = React__namespace.useState(null);
207
+ const inputRef = React__namespace.useRef(null);
208
+ const cancelledRef = React__namespace.useRef(false);
209
+ const startEdit = () => {
210
+ if (disabled) return;
211
+ setDraft(value);
212
+ setError(null);
213
+ setEditing(true);
214
+ };
215
+ React__namespace.useEffect(() => {
216
+ if (editing) {
217
+ inputRef.current?.focus();
218
+ inputRef.current?.select();
219
+ }
220
+ }, [editing]);
221
+ const commit = async () => {
222
+ if (pending) return;
223
+ if (draft === value) {
224
+ setEditing(false);
225
+ setError(null);
226
+ return;
227
+ }
228
+ const invalid = validate?.(draft) ?? null;
229
+ if (invalid) {
230
+ setError(invalid);
231
+ inputRef.current?.focus();
232
+ return;
233
+ }
234
+ try {
235
+ setPending(true);
236
+ await onCommit(draft);
237
+ setEditing(false);
238
+ setError(null);
239
+ } catch {
240
+ setError(t["editable.commitError"]);
241
+ inputRef.current?.focus();
242
+ } finally {
243
+ setPending(false);
244
+ }
245
+ };
246
+ const cancel = () => {
247
+ cancelledRef.current = true;
248
+ setEditing(false);
249
+ setError(null);
250
+ };
251
+ if (!editing) {
252
+ return /* @__PURE__ */ jsxRuntime.jsxs(
253
+ "button",
254
+ {
255
+ type: "button",
256
+ className: chunkPASF6T4H_js.cx("editable-cell", disabled && "is-disabled", className),
257
+ onClick: startEdit,
258
+ disabled,
259
+ "aria-label": ariaLabel,
260
+ children: [
261
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "editable-cell__value", children: formatDisplay ? formatDisplay(value) : value || placeholder }),
262
+ /* @__PURE__ */ jsxRuntime.jsx(chunkC4AKMVDZ_js.Edit, { size: 12, className: "editable-cell__icon", "aria-hidden": "true" })
263
+ ]
264
+ }
265
+ );
266
+ }
267
+ return /* @__PURE__ */ jsxRuntime.jsx(
268
+ "input",
269
+ {
270
+ ref: inputRef,
271
+ type,
272
+ className: chunkPASF6T4H_js.cx("input", "editable-cell__input", error != null && "is-invalid", className),
273
+ value: draft,
274
+ disabled: pending,
275
+ placeholder,
276
+ "aria-label": ariaLabel,
277
+ "aria-invalid": error != null || void 0,
278
+ title: error ?? void 0,
279
+ onChange: (e) => {
280
+ setDraft(e.target.value);
281
+ setError(null);
282
+ },
283
+ onKeyDown: (e) => {
284
+ if (e.key === "Enter") {
285
+ e.preventDefault();
286
+ void commit();
287
+ } else if (e.key === "Escape") {
288
+ e.preventDefault();
289
+ cancel();
290
+ }
291
+ },
292
+ onBlur: () => {
293
+ if (cancelledRef.current) {
294
+ cancelledRef.current = false;
295
+ return;
296
+ }
297
+ void commit();
298
+ }
299
+ }
300
+ );
301
+ }
191
302
 
192
303
  exports.ConfirmDialog = ConfirmDialog;
193
304
  exports.DescriptionList = DescriptionList;
194
305
  exports.DescriptionListItem = DescriptionListItem;
195
306
  exports.DiffViewer = DiffViewer;
307
+ exports.EditableCell = EditableCell;
196
308
  exports.TransferList = TransferList;
197
- //# sourceMappingURL=chunk-DHWGICRP.js.map
198
- //# sourceMappingURL=chunk-DHWGICRP.js.map
309
+ //# sourceMappingURL=chunk-UWKP36N6.js.map
310
+ //# sourceMappingURL=chunk-UWKP36N6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Editing.tsx"],"names":["React","useLocale","jsx","Modal","jsxs","Fragment","cx","Checkbox","ChevronRight","ChevronLeft","Edit"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuBO,SAAS,aAAA,CAAc;AAAA,EAC5B,IAAA;AAAA,EAAM,OAAA;AAAA,EAAS,SAAA;AAAA,EAAW,KAAA;AAAA,EAAO,WAAA;AAAA,EACjC,YAAA;AAAA,EAAc,WAAA;AAAA,EACd,IAAA,GAAO,SAAA;AAAA,EAAW;AACpB,CAAA,EAAuB;AACrB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAUA,0BAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,SAAS,OAAA,IAAW,IAAA;AAC1B,EAAA,MAAM,IAAIC,0BAAA,EAAU;AACpB,EAAA,MAAM,WAAA,GAAc,YAAA,IAAgB,CAAA,CAAE,gBAAgB,CAAA;AACtD,EAAA,MAAM,UAAA,GAAa,WAAA,IAAe,CAAA,CAAE,eAAe,CAAA;AAEnD,EAAA,MAAM,gBAAgB,YAAY;AAChC,IAAA,IAAI;AACF,MAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,MAAA,MAAM,SAAA,EAAU;AAChB,MAAA,OAAA,EAAQ;AAAA,IACV,CAAA,SAAE;AACA,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf;AAAA,EACF,CAAA;AAEA,EAAA,uBACEC,cAAA;AAAA,IAACC,sBAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,OAAA;AAAA,MACA,IAAA,EAAK,IAAA;AAAA,MACL,KAAA;AAAA,MACA,wBACEC,eAAA,CAAAC,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAAH,cAAA,CAAC,QAAA,EAAA,EAAO,MAAK,QAAA,EAAS,SAAA,EAAU,0BAAyB,OAAA,EAAS,OAAA,EAAS,QAAA,EAAU,MAAA,EAClF,QAAA,EAAA,UAAA,EACH,CAAA;AAAA,wBACAE,eAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,WAAWE,mBAAA,CAAG,KAAA,EAAO,SAAS,QAAA,GAAW,aAAA,GAAgB,gBAAgB,SAAS,CAAA;AAAA,YAClF,OAAA,EAAS,aAAA;AAAA,YACT,QAAA,EAAU,MAAA;AAAA,YACV,aAAW,MAAA,IAAU,MAAA;AAAA,YAEpB,QAAA,EAAA;AAAA,cAAA,MAAA,kCAAU,MAAA,EAAA,EAAK,SAAA,EAAU,0BAAA,EAA2B,aAAA,EAAY,QAAO,CAAA,GAAK,IAAA;AAAA,cAC5E;AAAA;AAAA;AAAA;AACH,OAAA,EACF,CAAA;AAAA,MAGD,QAAA,EAAA,WAAA,oBAAeJ,cAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iBAAiB,QAAA,EAAA,WAAA,EAAY;AAAA;AAAA,GAC5D;AAEJ;AAWO,SAAS,gBAAgB,EAAE,QAAA,EAAU,SAAA,EAAW,GAAG,MAAK,EAA2C;AACxG,EAAA,uBAAOA,cAAA,CAAC,QAAG,SAAA,EAAWI,mBAAA,CAAG,aAAa,SAAS,CAAA,EAAI,GAAG,IAAA,EAAO,QAAA,EAAS,CAAA;AACxE;AAEO,SAAS,oBAAoB,EAAE,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,UAAS,EAA6B;AAChG,EAAA,MAAM,IAAIL,0BAAA,EAAU;AACpB,EAAA,uBACEG,eAAA,CAAAC,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAH,cAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,kBAAA,EAAoB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,oBACxCE,eAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,kBAAA,EACZ,QAAA,EAAA;AAAA,sBAAAF,cAAA,CAAC,UAAM,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,MACZ,QAAA,IAAY,MAAA,oBACXA,cAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,iBAAA,EAAkB,OAAA,EAAS,MAAA,EACxD,QAAA,EAAA,CAAA,CAAE,eAAe,CAAA,EACpB;AAAA,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;AAaO,SAAS,WAAW,EAAE,OAAA,EAAS,SAAA,EAAW,GAAG,MAAK,EAAoB;AAC3E,EAAA,MAAM,IAAID,0BAAA,EAAU;AAGpB,EAAA,MAAM,WAAA,GAAc,OAAO,CAAA,CAAE,aAAa,MAAM,QAAA,GAAW,CAAA,CAAE,aAAa,CAAA,GAAI,MAAA;AAC9E,EAAA,MAAM,UAAA,GAAa,OAAO,CAAA,CAAE,YAAY,MAAM,QAAA,GAAW,CAAA,CAAE,YAAY,CAAA,GAAI,MAAA;AAC3E,EAAA,uBACEG,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAWE,mBAAA,CAAG,QAAQ,SAAS,CAAA,EAAG,IAAA,EAAK,OAAA,EAAQ,YAAA,EAAY,CAAA,CAAE,YAAY,CAAA,EAAI,GAAG,IAAA,EACnF,QAAA,EAAA;AAAA,oBAAAF,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EAAa,IAAA,EAAK,KAAA,EAC/B,QAAA,EAAA;AAAA,sBAAAF,cAAA,CAAC,KAAA,EAAA,EAAI,IAAA,EAAK,cAAA,EAAgB,QAAA,EAAA,CAAA,CAAE,YAAY,CAAA,EAAE,CAAA;AAAA,qCACzC,KAAA,EAAA,EAAI,IAAA,EAAK,cAAA,EAAgB,QAAA,EAAA,CAAA,CAAE,aAAa,CAAA,EAAE,CAAA;AAAA,qCAC1C,KAAA,EAAA,EAAI,IAAA,EAAK,cAAA,EAAgB,QAAA,EAAA,CAAA,CAAE,YAAY,CAAA,EAAE;AAAA,KAAA,EAC5C,CAAA;AAAA,IACC,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,qCACd,KAAA,EAAA,EAAY,SAAA,EAAU,WAAA,EAAY,IAAA,EAAK,KAAA,EACtC,QAAA,EAAA;AAAA,sBAAAA,cAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,IAAA,EAAK,MAAA,EAAQ,YAAE,KAAA,EAAM,CAAA;AAAA,sBAClDA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAA,EAAe,IAAA,EAAK,MAAA,EAAO,YAAA,EAAY,WAAA,EAAa,QAAA,kBAAAA,cAAA,CAAC,KAAA,EAAA,EAAK,QAAA,EAAA,CAAA,CAAE,MAAA,EAAO,CAAA,EAAM,CAAA;AAAA,sBACxFA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EAAc,IAAA,EAAK,MAAA,EAAO,YAAA,EAAY,UAAA,EAAY,QAAA,kBAAAA,cAAA,CAAC,KAAA,EAAA,EAAK,QAAA,EAAA,CAAA,CAAE,KAAA,EAAM,CAAA,EAAM;AAAA,KAAA,EAAA,EAH7E,CAIV,CACD;AAAA,GAAA,EACH,CAAA;AAEJ;AAmBO,SAAS,YAAA,CAAa;AAAA,EAC3B,MAAA;AAAA,EAAQ,QAAA;AAAA,EAAU,QAAA;AAAA,EAClB,WAAA;AAAA,EAAa,aAAA;AAAA,EACb;AACF,CAAA,EAAsB;AACpB,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,IAAUF,gBAAA,CAAA,QAAA,iBAAsB,IAAI,KAAK,CAAA;AAC3E,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,IAAUA,gBAAA,CAAA,QAAA,iBAAsB,IAAI,KAAK,CAAA;AAC7E,EAAA,MAAM,IAAIC,0BAAA,EAAU;AACpB,EAAA,MAAM,QAAA,GAAW,WAAA,IAAe,CAAA,CAAE,oBAAoB,CAAA;AACtD,EAAA,MAAM,QAAA,GAAW,aAAA,IAAiB,CAAA,CAAE,mBAAmB,CAAA;AAKvD,EAAA,MAAM,WAAA,GAAoBD,gBAAA,CAAA,OAAA;AAAA,IACxB,MAAM,IAAI,GAAA,CAAI,QAAA,CAAS,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AAAA,IACvC,CAAC,QAAQ;AAAA,GACX;AACA,EAAA,MAAM,IAAA,GAAaA,gBAAA,CAAA,OAAA;AAAA,IACjB,MAAM,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,WAAA,CAAY,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC,CAAA;AAAA,IACjD,CAAC,QAAQ,WAAW;AAAA,GACtB;AACA,EAAA,MAAM,KAAA,GAAQ,QAAA;AAEd,EAAA,MAAM,YAAY,MAAM;AACtB,IAAA,MAAM,MAAA,GAAS,KAAK,MAAA,CAAO,CAAC,MAAM,WAAA,CAAY,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC,CAAA;AACvD,IAAA,QAAA,CAAS,CAAC,GAAG,KAAA,EAAO,GAAG,MAAM,CAAC,CAAA;AAC9B,IAAA,cAAA,iBAAe,IAAI,KAAK,CAAA;AAAA,EAC1B,CAAA;AACA,EAAA,MAAM,WAAW,MAAM;AACrB,IAAA,QAAA,CAAS,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,aAAa,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC,CAAC,CAAA;AACrD,IAAA,eAAA,iBAAgB,IAAI,KAAK,CAAA;AAAA,EAC3B,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,GAAA,EAAkB,MAAA,EAAkC,EAAA,KAAe;AACtF,IAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,GAAG,CAAA;AACxB,IAAA,IAAI,KAAK,GAAA,CAAI,EAAE,CAAA,EAAG,IAAA,CAAK,OAAO,EAAE,CAAA;AAAA,SAAQ,IAAA,CAAK,IAAI,EAAE,CAAA;AACnD,IAAA,MAAA,CAAO,IAAI,CAAA;AAAA,EACb,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,CAAC,KAAA,EAAwB,KAAA,EAAuB,SAAsB,UAAA,qBACzFI,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oBAAA,EACb,QAAA,EAAA;AAAA,sBAAAF,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EAAuB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,sBAC7CA,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EAAuB,gBAAM,MAAA,EAAO;AAAA,KAAA,EACtD,CAAA;AAAA,oBACAA,cAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,gBAAA,EAAiB,IAAA,EAAK,SAAA,EAAU,YAAA,EAAY,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,MAAA,EAC3F,QAAA,EAAA,KAAA,CAAM,WAAW,CAAA,mBAChBA,cAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,iBAAA,EAAmB,QAAA,EAAA,CAAA,CAAE,gBAAgB,CAAA,EAAE,CAAA,GACnD,KAAA,CAAM,GAAA,CAAI,CAAC,EAAA,qBACbE,eAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QAEC,SAAA,EAAWE,mBAAA,CAAG,gBAAA,EAAkB,OAAA,CAAQ,GAAA,CAAI,EAAA,CAAG,EAAE,CAAA,IAAK,YAAA,EAAc,EAAA,CAAG,QAAA,IAAY,aAAa,CAAA;AAAA,QAChG,IAAA,EAAK,QAAA;AAAA,QACL,eAAA,EAAe,OAAA,CAAQ,GAAA,CAAI,EAAA,CAAG,EAAE,CAAA;AAAA,QAChC,OAAA,EAAS,MAAM,CAAC,EAAA,CAAG,YAAY,WAAA,CAAY,OAAA,EAAS,UAAA,EAAY,EAAA,CAAG,EAAE,CAAA;AAAA,QAErE,QAAA,EAAA;AAAA,0BAAAJ,cAAA,CAAC,UAAK,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,iBAAgB,EACtC,QAAA,kBAAAA,cAAA;AAAA,YAACK,yBAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,EAAA,CAAG,EAAE,CAAA;AAAA,cAC1B,UAAU,EAAA,CAAG,QAAA;AAAA,cACb,UAAU,MAAM,WAAA,CAAY,OAAA,EAAS,UAAA,EAAY,GAAG,EAAE;AAAA;AAAA,WACxD,EACF,CAAA;AAAA,0BACAH,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA;AAAA,4BAAAF,cAAA,CAAC,KAAA,EAAA,EAAK,aAAG,KAAA,EAAM,CAAA;AAAA,YACd,GAAG,WAAA,oBAAeA,cAAA,CAAC,SAAI,SAAA,EAAU,qBAAA,EAAuB,aAAG,WAAA,EAAY;AAAA,WAAA,EAC1E;AAAA;AAAA,OAAA;AAAA,MAhBK,EAAA,CAAG;AAAA,KAkBX,CAAA,EACH;AAAA,GAAA,EACF,CAAA;AAGF,EAAA,uCACG,KAAA,EAAA,EAAI,SAAA,EAAWI,mBAAA,CAAG,UAAA,EAAY,SAAS,CAAA,EACrC,QAAA,EAAA;AAAA,IAAA,YAAA,CAAa,QAAA,EAAU,IAAA,EAAM,WAAA,EAAa,cAAc,CAAA;AAAA,oBACzDF,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACb,QAAA,EAAA;AAAA,sBAAAF,cAAA,CAAC,YAAO,IAAA,EAAK,QAAA,EAAS,WAAU,0BAAA,EAA2B,QAAA,EAAU,YAAY,IAAA,KAAS,CAAA,EAAG,SAAS,SAAA,EAAW,YAAA,EAAY,EAAE,yBAAyB,CAAA,EACtJ,yCAACM,6BAAA,EAAA,EAAa,IAAA,EAAM,IAAI,CAAA,EAC1B,CAAA;AAAA,sBACAN,cAAA,CAAC,YAAO,IAAA,EAAK,QAAA,EAAS,WAAU,0BAAA,EAA2B,QAAA,EAAU,aAAa,IAAA,KAAS,CAAA,EAAG,SAAS,QAAA,EAAU,YAAA,EAAY,EAAE,yBAAyB,CAAA,EACtJ,yCAACO,4BAAA,EAAA,EAAY,IAAA,EAAM,IAAI,CAAA,EACzB;AAAA,KAAA,EACF,CAAA;AAAA,IACC,YAAA,CAAa,QAAA,EAAU,KAAA,EAAO,YAAA,EAAc,eAAe;AAAA,GAAA,EAC9D,CAAA;AAEJ;AA0CO,SAAS,YAAA,CAAa;AAAA,EAC3B,KAAA;AAAA,EAAO,QAAA;AAAA,EAAU,IAAA,GAAO,MAAA;AAAA,EAAQ,aAAA;AAAA,EAAe,QAAA;AAAA,EAC/C,QAAA;AAAA,EAAU,WAAA;AAAA,EAAa,SAAA;AAAA,EAAW;AACpC,CAAA,EAAsB;AACpB,EAAA,MAAM,IAAIR,0BAAA,EAAU;AACpB,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAUD,0BAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAUA,0BAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAUA,0BAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAUA,0BAAwB,IAAI,CAAA;AAC5D,EAAA,MAAM,QAAA,GAAiBA,wBAAyB,IAAI,CAAA;AAEpD,EAAA,MAAM,YAAA,GAAqBA,wBAAO,KAAK,CAAA;AAEvC,EAAA,MAAM,YAAY,MAAM;AACtB,IAAA,IAAI,QAAA,EAAU;AACd,IAAA,QAAA,CAAS,KAAK,CAAA;AACd,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,UAAA,CAAW,IAAI,CAAA;AAAA,EACjB,CAAA;AAEA,EAAMA,2BAAU,MAAM;AACpB,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,QAAA,CAAS,SAAS,KAAA,EAAM;AACxB,MAAA,QAAA,CAAS,SAAS,MAAA,EAAO;AAAA,IAC3B;AAAA,EACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,MAAM,SAAS,YAAY;AACzB,IAAA,IAAI,OAAA,EAAS;AACb,IAAA,IAAI,UAAU,KAAA,EAAO;AAAE,MAAA,UAAA,CAAW,KAAK,CAAA;AAAG,MAAA,QAAA,CAAS,IAAI,CAAA;AAAG,MAAA;AAAA,IAAQ;AAClE,IAAA,MAAM,OAAA,GAAU,QAAA,GAAW,KAAK,CAAA,IAAK,IAAA;AACrC,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,QAAA,CAAS,OAAO,CAAA;AAChB,MAAA,QAAA,CAAS,SAAS,KAAA,EAAM;AACxB,MAAA;AAAA,IACF;AACA,IAAA,IAAI;AACF,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,MAAM,SAAS,KAAK,CAAA;AACpB,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACf,CAAA,CAAA,MAAQ;AAEN,MAAA,QAAA,CAAS,CAAA,CAAE,sBAAsB,CAAC,CAAA;AAClC,MAAA,QAAA,CAAS,SAAS,KAAA,EAAM;AAAA,IAC1B,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,SAAS,MAAM;AACnB,IAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AACvB,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,QAAA,CAAS,IAAI,CAAA;AAAA,EACf,CAAA;AAEA,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,uBACEI,eAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAWE,mBAAA,CAAG,eAAA,EAAiB,QAAA,IAAY,eAAe,SAAS,CAAA;AAAA,QACnE,OAAA,EAAS,SAAA;AAAA,QACT,QAAA;AAAA,QACA,YAAA,EAAY,SAAA;AAAA,QAEZ,QAAA,EAAA;AAAA,0BAAAJ,cAAA,CAAC,MAAA,EAAA,EAAK,WAAU,sBAAA,EACb,QAAA,EAAA,aAAA,GAAgB,cAAc,KAAK,CAAA,GAAK,SAAS,WAAA,EACpD,CAAA;AAAA,yCACCQ,qBAAA,EAAA,EAAS,IAAA,EAAM,IAAI,SAAA,EAAU,qBAAA,EAAsB,eAAY,MAAA,EAAO;AAAA;AAAA;AAAA,KACzE;AAAA,EAEJ;AAEA,EAAA,uBACER,cAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,QAAA;AAAA,MACL,IAAA;AAAA,MACA,WAAWI,mBAAA,CAAG,OAAA,EAAS,wBAAwB,KAAA,IAAS,IAAA,IAAQ,cAAc,SAAS,CAAA;AAAA,MACvF,KAAA,EAAO,KAAA;AAAA,MACP,QAAA,EAAU,OAAA;AAAA,MACV,WAAA;AAAA,MACA,YAAA,EAAY,SAAA;AAAA,MACZ,cAAA,EAAc,SAAS,IAAA,IAAQ,MAAA;AAAA,MAC/B,OAAO,KAAA,IAAS,MAAA;AAAA,MAChB,QAAA,EAAU,CAAC,CAAA,KAAM;AAAE,QAAA,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAG,QAAA,QAAA,CAAS,IAAI,CAAA;AAAA,MAAG,CAAA;AAAA,MAC7D,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,QAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AAAE,UAAA,CAAA,CAAE,cAAA,EAAe;AAAG,UAAA,KAAK,MAAA,EAAO;AAAA,QAAG,CAAA,MAAA,IACnD,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU;AAAE,UAAA,CAAA,CAAE,cAAA,EAAe;AAAG,UAAA,MAAA,EAAO;AAAA,QAAG;AAAA,MAC/D,CAAA;AAAA,MACA,QAAQ,MAAM;AACZ,QAAA,IAAI,aAAa,OAAA,EAAS;AAAE,UAAA,YAAA,CAAa,OAAA,GAAU,KAAA;AAAO,UAAA;AAAA,QAAQ;AAClE,QAAA,KAAK,MAAA,EAAO;AAAA,MACd;AAAA;AAAA,GACF;AAEJ","file":"chunk-UWKP36N6.js","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { Modal } from './Overlay';\nimport { ChevronLeft, ChevronRight, Edit as EditIcon } from './Icons';\nimport { Checkbox } from './Form';\nimport { useLocale } from '../locale/LocaleProvider';\n\n// ---------- ConfirmDialog -----------------------------------------------\nexport interface ConfirmDialogProps {\n open: boolean;\n onClose: () => void;\n onConfirm: () => void | Promise<void>;\n title: React.ReactNode;\n description?: React.ReactNode;\n confirmLabel?: React.ReactNode;\n cancelLabel?: React.ReactNode;\n /** 'danger' usa botón rojo. */\n tone?: 'default' | 'danger';\n /** Si true, deshabilita el confirm mientras se ejecuta. */\n loading?: boolean;\n}\n\nexport function ConfirmDialog({\n open, onClose, onConfirm, title, description,\n confirmLabel, cancelLabel,\n tone = 'default', loading,\n}: ConfirmDialogProps) {\n const [busy, setBusy] = React.useState(false);\n const isBusy = loading ?? busy;\n const t = useLocale();\n const confirmText = confirmLabel ?? t['common.confirm'];\n const cancelText = cancelLabel ?? t['common.cancel'];\n\n const handleConfirm = async () => {\n try {\n setBusy(true);\n await onConfirm();\n onClose();\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n size=\"sm\"\n title={title}\n footer={\n <>\n <button type=\"button\" className=\"btn btn--ghost btn--md\" onClick={onClose} disabled={isBusy}>\n {cancelText}\n </button>\n <button\n type=\"button\"\n className={cx('btn', tone === 'danger' ? 'btn--danger' : 'btn--primary', 'btn--md')}\n onClick={handleConfirm}\n disabled={isBusy}\n aria-busy={isBusy || undefined}\n >\n {isBusy ? <span className=\"spinner spinner--inverse\" aria-hidden=\"true\" /> : null}\n {confirmText}\n </button>\n </>\n }\n >\n {description && <p className=\"confirm__desc\">{description}</p>}\n </Modal>\n );\n}\n\n// ---------- DescriptionList (KeyValue editable) ------------------------\nexport interface DescriptionListItemProps {\n label: React.ReactNode;\n value: React.ReactNode;\n /** Si se pasa, el valor se vuelve editable inline. */\n onEdit?: () => void;\n editable?: boolean;\n}\n\nexport function DescriptionList({ children, className, ...rest }: React.HTMLAttributes<HTMLDListElement>) {\n return <dl className={cx('desc-list', className)} {...rest}>{children}</dl>;\n}\n\nexport function DescriptionListItem({ label, value, onEdit, editable }: DescriptionListItemProps) {\n const t = useLocale();\n return (\n <>\n <dt className=\"desc-list__label\">{label}</dt>\n <dd className=\"desc-list__value\">\n <span>{value}</span>\n {editable && onEdit && (\n <button type=\"button\" className=\"desc-list__edit\" onClick={onEdit}>\n {t['descList.edit']}\n </button>\n )}\n </dd>\n </>\n );\n}\n\n// ---------- DiffViewer (before / after) --------------------------------\nexport interface DiffEntry {\n field: React.ReactNode;\n before: React.ReactNode;\n after: React.ReactNode;\n}\n\nexport interface DiffViewerProps extends React.HTMLAttributes<HTMLDivElement> {\n entries: DiffEntry[];\n}\n\nexport function DiffViewer({ entries, className, ...rest }: DiffViewerProps) {\n const t = useLocale();\n // data-label feeds the mobile stacked layout's ::before pseudo-elements\n // so the \"Antes\" / \"Después\" labels remain i18n-able.\n const beforeLabel = typeof t['diff.before'] === 'string' ? t['diff.before'] : undefined;\n const afterLabel = typeof t['diff.after'] === 'string' ? t['diff.after'] : undefined;\n return (\n <div className={cx('diff', className)} role=\"table\" aria-label={t['diff.label']} {...rest}>\n <div className=\"diff__head\" role=\"row\">\n <div role=\"columnheader\">{t['diff.field']}</div>\n <div role=\"columnheader\">{t['diff.before']}</div>\n <div role=\"columnheader\">{t['diff.after']}</div>\n </div>\n {entries.map((e, i) => (\n <div key={i} className=\"diff__row\" role=\"row\">\n <div className=\"diff__field\" role=\"cell\">{e.field}</div>\n <div className=\"diff__before\" role=\"cell\" data-label={beforeLabel}><del>{e.before}</del></div>\n <div className=\"diff__after\" role=\"cell\" data-label={afterLabel}><ins>{e.after}</ins></div>\n </div>\n ))}\n </div>\n );\n}\n\n// ---------- TransferList (dual list select) ----------------------------\nexport interface TransferItem {\n id: string;\n label: React.ReactNode;\n description?: React.ReactNode;\n disabled?: boolean;\n}\n\nexport interface TransferListProps {\n source: TransferItem[];\n selected: TransferItem[];\n onChange: (selected: TransferItem[]) => void;\n sourceTitle?: React.ReactNode;\n selectedTitle?: React.ReactNode;\n className?: string;\n}\n\nexport function TransferList({\n source, selected, onChange,\n sourceTitle, selectedTitle,\n className,\n}: TransferListProps) {\n const [leftChecked, setLeftChecked] = React.useState<Set<string>>(new Set());\n const [rightChecked, setRightChecked] = React.useState<Set<string>>(new Set());\n const t = useLocale();\n const srcTitle = sourceTitle ?? t['transfer.available'];\n const selTitle = selectedTitle ?? t['transfer.assigned'];\n\n // Without memo, every checkbox click rebuilt selectedIds and re-filtered\n // `source` to compute `left`. At ~500 source items that's a measurable\n // O(n) hit per click.\n const selectedIds = React.useMemo(\n () => new Set(selected.map((s) => s.id)),\n [selected]\n );\n const left = React.useMemo(\n () => source.filter((s) => !selectedIds.has(s.id)),\n [source, selectedIds]\n );\n const right = selected;\n\n const moveRight = () => {\n const toMove = left.filter((i) => leftChecked.has(i.id));\n onChange([...right, ...toMove]);\n setLeftChecked(new Set());\n };\n const moveLeft = () => {\n onChange(right.filter((i) => !rightChecked.has(i.id)));\n setRightChecked(new Set());\n };\n\n const toggleCheck = (set: Set<string>, setSet: (s: Set<string>) => void, id: string) => {\n const next = new Set(set);\n if (next.has(id)) next.delete(id); else next.add(id);\n setSet(next);\n };\n\n const renderColumn = (title: React.ReactNode, items: TransferItem[], checked: Set<string>, setChecked: (s: Set<string>) => void) => (\n <div className=\"transfer__col\">\n <div className=\"transfer__col-head\">\n <span className=\"transfer__col-title\">{title}</span>\n <span className=\"transfer__col-count\">{items.length}</span>\n </div>\n <ul className=\"transfer__list\" role=\"listbox\" aria-label={typeof title === 'string' ? title : undefined}>\n {items.length === 0 ? (\n <li className=\"transfer__empty\">{t['transfer.empty']}</li>\n ) : items.map((it) => (\n <li\n key={it.id}\n className={cx('transfer__item', checked.has(it.id) && 'is-checked', it.disabled && 'is-disabled')}\n role=\"option\"\n aria-selected={checked.has(it.id)}\n onClick={() => !it.disabled && toggleCheck(checked, setChecked, it.id)}\n >\n <span onClick={(e) => e.stopPropagation()}>\n <Checkbox\n checked={checked.has(it.id)}\n disabled={it.disabled}\n onChange={() => toggleCheck(checked, setChecked, it.id)}\n />\n </span>\n <div className=\"transfer__item-body\">\n <div>{it.label}</div>\n {it.description && <div className=\"transfer__item-desc\">{it.description}</div>}\n </div>\n </li>\n ))}\n </ul>\n </div>\n );\n\n return (\n <div className={cx('transfer', className)}>\n {renderColumn(srcTitle, left, leftChecked, setLeftChecked)}\n <div className=\"transfer__controls\">\n <button type=\"button\" className=\"btn btn--outline btn--sm\" disabled={leftChecked.size === 0} onClick={moveRight} aria-label={t['transfer.assignSelected']}>\n <ChevronRight size={16} />\n </button>\n <button type=\"button\" className=\"btn btn--outline btn--sm\" disabled={rightChecked.size === 0} onClick={moveLeft} aria-label={t['transfer.removeSelected']}>\n <ChevronLeft size={16} />\n </button>\n </div>\n {renderColumn(selTitle, right, rightChecked, setRightChecked)}\n </div>\n );\n}\n\n// ---------- EditableCell ---------------------------------------------------\nexport interface EditableCellProps {\n /** Committed value (controlled — the consumer owns it). */\n value: string;\n /**\n * Called on commit (Enter or blur) with the edited raw value. May return\n * a promise: while it's pending the input is disabled; on rejection the\n * cell STAYS in edit mode with the invalid style, so the user's typing\n * is never lost to a failed PATCH. Not called when the value is\n * unchanged.\n */\n onCommit: (next: string) => void | Promise<void>;\n /** Input mode. `'number'` renders a numeric input. */\n type?: 'text' | 'number';\n /**\n * Display-mode formatter (e.g. `formatCurrency`) — editing always works\n * on the RAW `value`; only the resting presentation is formatted.\n */\n formatDisplay?: (value: string) => React.ReactNode;\n /**\n * Sync validation before commit. Return an error message to block the\n * commit (cell stays editing, invalid style, message via title/aria);\n * return `null` to allow it.\n */\n validate?: (next: string) => string | null;\n disabled?: boolean;\n placeholder?: string;\n /** Accessible name of the edit affordance (e.g. \"Editar precio de Taladro\"). */\n ariaLabel?: string;\n className?: string;\n}\n\n/**\n * Click-to-edit primitive for inline editing (Airtable/Notion semantics):\n * click or Enter to edit, Enter/blur commits, Escape cancels. Composable\n * anywhere — typically inside a `DataTable` cell via `accessor`. The kit\n * deliberately ships the CELL, not an editable-table subsystem: commit\n * orchestration (optimistic update, refetch, toast) stays in the consumer,\n * where the data layer lives.\n */\nexport function EditableCell({\n value, onCommit, type = 'text', formatDisplay, validate,\n disabled, placeholder, ariaLabel, className,\n}: EditableCellProps) {\n const t = useLocale();\n const [editing, setEditing] = React.useState(false);\n const [draft, setDraft] = React.useState(value);\n const [pending, setPending] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n const inputRef = React.useRef<HTMLInputElement>(null);\n // Distinguishes Escape-initiated blur from a committing blur.\n const cancelledRef = React.useRef(false);\n\n const startEdit = () => {\n if (disabled) return;\n setDraft(value);\n setError(null);\n setEditing(true);\n };\n\n React.useEffect(() => {\n if (editing) {\n inputRef.current?.focus();\n inputRef.current?.select();\n }\n }, [editing]);\n\n const commit = async () => {\n if (pending) return;\n if (draft === value) { setEditing(false); setError(null); return; }\n const invalid = validate?.(draft) ?? null;\n if (invalid) {\n setError(invalid);\n inputRef.current?.focus();\n return;\n }\n try {\n setPending(true);\n await onCommit(draft);\n setEditing(false);\n setError(null);\n } catch {\n // Keep the draft and the edit mode — the user decides to retry or Esc.\n setError(t['editable.commitError']);\n inputRef.current?.focus();\n } finally {\n setPending(false);\n }\n };\n\n const cancel = () => {\n cancelledRef.current = true;\n setEditing(false);\n setError(null);\n };\n\n if (!editing) {\n return (\n <button\n type=\"button\"\n className={cx('editable-cell', disabled && 'is-disabled', className)}\n onClick={startEdit}\n disabled={disabled}\n aria-label={ariaLabel}\n >\n <span className=\"editable-cell__value\">\n {formatDisplay ? formatDisplay(value) : (value || placeholder)}\n </span>\n <EditIcon size={12} className=\"editable-cell__icon\" aria-hidden=\"true\" />\n </button>\n );\n }\n\n return (\n <input\n ref={inputRef}\n type={type}\n className={cx('input', 'editable-cell__input', error != null && 'is-invalid', className)}\n value={draft}\n disabled={pending}\n placeholder={placeholder}\n aria-label={ariaLabel}\n aria-invalid={error != null || undefined}\n title={error ?? undefined}\n onChange={(e) => { setDraft(e.target.value); setError(null); }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') { e.preventDefault(); void commit(); }\n else if (e.key === 'Escape') { e.preventDefault(); cancel(); }\n }}\n onBlur={() => {\n if (cancelledRef.current) { cancelledRef.current = false; return; }\n void commit();\n }}\n />\n );\n}\n"]}
@@ -2,10 +2,11 @@
2
2
  'use strict';
3
3
 
4
4
  var chunkMW7HQCFC_js = require('./chunk-MW7HQCFC.js');
5
- var chunkKAQJWVXS_js = require('./chunk-KAQJWVXS.js');
5
+ var chunkAKUGR3AX_js = require('./chunk-AKUGR3AX.js');
6
6
  var chunk6SSTTJV4_js = require('./chunk-6SSTTJV4.js');
7
- var chunkNZNTB5OI_js = require('./chunk-NZNTB5OI.js');
8
- var chunkWXODIWH7_js = require('./chunk-WXODIWH7.js');
7
+ var chunkJDK4GEME_js = require('./chunk-JDK4GEME.js');
8
+ var chunk6D5UP23V_js = require('./chunk-6D5UP23V.js');
9
+ var chunkMJMLNETS_js = require('./chunk-MJMLNETS.js');
9
10
  var chunkAJ22SXI2_js = require('./chunk-AJ22SXI2.js');
10
11
  var chunkC4AKMVDZ_js = require('./chunk-C4AKMVDZ.js');
11
12
  var chunkPASF6T4H_js = require('./chunk-PASF6T4H.js');
@@ -141,9 +142,10 @@ function DataTable({
141
142
  expandedKeys,
142
143
  onExpandedChange,
143
144
  hiddenColumnKeys,
145
+ virtualizeRows,
144
146
  surface = "card"
145
147
  }) {
146
- const t = chunkWXODIWH7_js.useLocale();
148
+ const t = chunkMJMLNETS_js.useLocale();
147
149
  const columns = React__namespace.useMemo(
148
150
  () => hiddenColumnKeys?.size ? allColumns.filter((c) => !hiddenColumnKeys.has(c.key)) : allColumns,
149
151
  [allColumns, hiddenColumnKeys]
@@ -203,6 +205,13 @@ function DataTable({
203
205
  const expandable = renderExpanded != null;
204
206
  const tableId = React__namespace.useId();
205
207
  const totalCols = columns.length + (selectable ? 1 : 0) + (expandable ? 1 : 0);
208
+ const virtual = virtualizeRows != null && maxHeight != null && !expandable && mobileLayout !== "cards";
209
+ const vrange = chunk6D5UP23V_js.useVirtualRows(scrollRef, {
210
+ count: rows.length,
211
+ rowHeight: virtualizeRows?.rowHeight ?? 1,
212
+ overscan: virtualizeRows?.overscan,
213
+ enabled: virtual
214
+ });
206
215
  const onSort = (col) => {
207
216
  if (!col.sortable || !onSortChange) return;
208
217
  if (!sort || sort.key !== col.key) onSortChange({ key: col.key, dir: "asc" });
@@ -217,6 +226,7 @@ function DataTable({
217
226
  density === "comfortable" && "table--comfortable"
218
227
  ),
219
228
  "aria-label": ariaLabel,
229
+ "aria-rowcount": virtual ? rows.length + 1 : void 0,
220
230
  children: [
221
231
  /* @__PURE__ */ jsxRuntime.jsx("thead", { children: /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
222
232
  selectable && /* @__PURE__ */ jsxRuntime.jsx("th", { scope: "col", style: { width: 40 }, children: /* @__PURE__ */ jsxRuntime.jsx(
@@ -270,38 +280,42 @@ function DataTable({
270
280
  selectable && /* @__PURE__ */ jsxRuntime.jsx("td", { children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "skel", style: { height: 14 } }) }),
271
281
  expandable && /* @__PURE__ */ jsxRuntime.jsx("td", { "aria-hidden": "true" }),
272
282
  columns.map((c) => /* @__PURE__ */ jsxRuntime.jsx("td", { children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "skel", style: { height: 12, width: "70%" } }) }, c.key))
273
- ] }, `s${i}`)) : rows.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("tr", { children: /* @__PURE__ */ jsxRuntime.jsx("td", { colSpan: totalCols, style: { padding: 32 }, children: empty ?? /* @__PURE__ */ jsxRuntime.jsx("div", { style: { textAlign: "center", color: "var(--fg-muted)" }, children: t["table.empty"] }) }) }) : rows.map((r) => {
274
- const k = rowKey(r);
275
- const label = rowLabel ? rowLabel(r) : k;
276
- const href = rowHref?.(r);
277
- const onActivate = onRowClick ? () => onRowClick(r) : void 0;
278
- const expanded = expandable && !!expandedKeys?.has(k);
279
- const detailId = `${tableId}-detail-${k}`;
280
- return /* @__PURE__ */ jsxRuntime.jsxs(React__namespace.Fragment, { children: [
281
- /* @__PURE__ */ jsxRuntime.jsx(
282
- DataTableRow,
283
- {
284
- row: r,
285
- rowK: k,
286
- selected: !!selectedKeys?.has(k),
287
- selectable: !!selectable,
288
- selectAriaLabel: chunkNZNTB5OI_js.format(t["table.selectRow"], { label }),
289
- columns,
290
- onToggle: toggleRow,
291
- href,
292
- onActivate,
293
- actionLabel: chunkNZNTB5OI_js.format(t["table.rowAction"], { label }),
294
- renderRow,
295
- expandable,
296
- expanded,
297
- onToggleExpand: toggleExpand,
298
- expandLabel: chunkNZNTB5OI_js.format(t["table.expandRow"], { label }),
299
- detailId
300
- }
301
- ),
302
- expanded && /* @__PURE__ */ jsxRuntime.jsx("tr", { className: "data-table__detail", children: /* @__PURE__ */ jsxRuntime.jsx("td", { colSpan: totalCols, id: detailId, children: renderExpanded(r) }) })
303
- ] }, k);
304
- }) }),
283
+ ] }, `s${i}`)) : rows.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("tr", { children: /* @__PURE__ */ jsxRuntime.jsx("td", { colSpan: totalCols, style: { padding: 32 }, children: empty ?? /* @__PURE__ */ jsxRuntime.jsx("div", { style: { textAlign: "center", color: "var(--fg-muted)" }, children: t["table.empty"] }) }) }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
284
+ virtual && vrange.padTop > 0 && /* @__PURE__ */ jsxRuntime.jsx("tr", { className: "data-table__spacer", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx("td", { colSpan: totalCols, style: { height: vrange.padTop } }) }),
285
+ (virtual ? rows.slice(vrange.start, vrange.end) : rows).map((r) => {
286
+ const k = rowKey(r);
287
+ const label = rowLabel ? rowLabel(r) : k;
288
+ const href = rowHref?.(r);
289
+ const onActivate = onRowClick ? () => onRowClick(r) : void 0;
290
+ const expanded = expandable && !!expandedKeys?.has(k);
291
+ const detailId = `${tableId}-detail-${k}`;
292
+ return /* @__PURE__ */ jsxRuntime.jsxs(React__namespace.Fragment, { children: [
293
+ /* @__PURE__ */ jsxRuntime.jsx(
294
+ DataTableRow,
295
+ {
296
+ row: r,
297
+ rowK: k,
298
+ selected: !!selectedKeys?.has(k),
299
+ selectable: !!selectable,
300
+ selectAriaLabel: chunkJDK4GEME_js.format(t["table.selectRow"], { label }),
301
+ columns,
302
+ onToggle: toggleRow,
303
+ href,
304
+ onActivate,
305
+ actionLabel: chunkJDK4GEME_js.format(t["table.rowAction"], { label }),
306
+ renderRow,
307
+ expandable,
308
+ expanded,
309
+ onToggleExpand: toggleExpand,
310
+ expandLabel: chunkJDK4GEME_js.format(t["table.expandRow"], { label }),
311
+ detailId
312
+ }
313
+ ),
314
+ expanded && /* @__PURE__ */ jsxRuntime.jsx("tr", { className: "data-table__detail", children: /* @__PURE__ */ jsxRuntime.jsx("td", { colSpan: totalCols, id: detailId, children: renderExpanded(r) }) })
315
+ ] }, k);
316
+ }),
317
+ virtual && vrange.padBottom > 0 && /* @__PURE__ */ jsxRuntime.jsx("tr", { className: "data-table__spacer", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx("td", { colSpan: totalCols, style: { height: vrange.padBottom } }) })
318
+ ] }) }),
305
319
  columns.some((c) => c.footer != null) && !error && !loading && rows.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("tfoot", { children: /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
306
320
  selectable && /* @__PURE__ */ jsxRuntime.jsx("td", {}),
307
321
  expandable && /* @__PURE__ */ jsxRuntime.jsx("td", { "aria-hidden": "true" }),
@@ -423,7 +437,7 @@ function TablePagination({
423
437
  pageSizeOptions = [10, 25, 50, 100],
424
438
  className
425
439
  }) {
426
- const t = chunkWXODIWH7_js.useLocale();
440
+ const t = chunkMJMLNETS_js.useLocale();
427
441
  const selectId = React__namespace.useId();
428
442
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: chunkPASF6T4H_js.cx("table-pagination", className), children: [
429
443
  onPageSizeChange && /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "table-pagination__size", htmlFor: selectId, children: [
@@ -440,7 +454,7 @@ function TablePagination({
440
454
  )
441
455
  ] }),
442
456
  /* @__PURE__ */ jsxRuntime.jsx(
443
- chunkKAQJWVXS_js.Pagination,
457
+ chunkAKUGR3AX_js.Pagination,
444
458
  {
445
459
  page,
446
460
  pageSize,
@@ -456,7 +470,7 @@ var TableToolbar = React__namespace.forwardRef(
456
470
  }
457
471
  );
458
472
  function ColumnToggle({ columns, hiddenKeys, onChange, label, className }) {
459
- const t = chunkWXODIWH7_js.useLocale();
473
+ const t = chunkMJMLNETS_js.useLocale();
460
474
  const visibleCount = columns.length - columns.filter((c) => hiddenKeys.has(c.key)).length;
461
475
  const toggle = (key) => {
462
476
  const next = new Set(hiddenKeys);
@@ -497,5 +511,5 @@ exports.ColumnToggle = ColumnToggle;
497
511
  exports.DataTable = DataTable;
498
512
  exports.TablePagination = TablePagination;
499
513
  exports.TableToolbar = TableToolbar;
500
- //# sourceMappingURL=chunk-LL7PZ6Q3.js.map
501
- //# sourceMappingURL=chunk-LL7PZ6Q3.js.map
514
+ //# sourceMappingURL=chunk-UZX2SE42.js.map
515
+ //# sourceMappingURL=chunk-UZX2SE42.js.map