@misael703/ui 1.48.0 → 1.50.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.
- package/dist/{chunk-KW76HGQL.js → chunk-2IKGRN2O.js} +54 -12
- package/dist/chunk-2IKGRN2O.js.map +1 -0
- package/dist/{chunk-IRKLU5NI.js → chunk-2XIFGGF2.js} +7 -7
- package/dist/{chunk-IRKLU5NI.js.map → chunk-2XIFGGF2.js.map} +1 -1
- package/dist/{chunk-7EBAE24K.mjs → chunk-3TS54SJB.mjs} +5 -5
- package/dist/{chunk-7EBAE24K.mjs.map → chunk-3TS54SJB.mjs.map} +1 -1
- package/dist/{chunk-PBA3F3M7.mjs → chunk-4LU36CNV.mjs} +3 -3
- package/dist/{chunk-PBA3F3M7.mjs.map → chunk-4LU36CNV.mjs.map} +1 -1
- package/dist/{chunk-3SOVR6JL.js → chunk-5UBYEEOF.js} +8 -8
- package/dist/{chunk-3SOVR6JL.js.map → chunk-5UBYEEOF.js.map} +1 -1
- package/dist/{chunk-JLIAKJCK.js → chunk-64YL7DN5.js} +4 -4
- package/dist/{chunk-JLIAKJCK.js.map → chunk-64YL7DN5.js.map} +1 -1
- package/dist/{chunk-V6VOF4DT.js → chunk-AKUGR3AX.js} +7 -7
- package/dist/{chunk-V6VOF4DT.js.map → chunk-AKUGR3AX.js.map} +1 -1
- package/dist/{chunk-TCTMCVHJ.mjs → chunk-AP655IUN.mjs} +3 -3
- package/dist/{chunk-TCTMCVHJ.mjs.map → chunk-AP655IUN.mjs.map} +1 -1
- package/dist/{chunk-YHRTDEEI.mjs → chunk-C4XPGEU2.mjs} +4 -4
- package/dist/{chunk-YHRTDEEI.mjs.map → chunk-C4XPGEU2.mjs.map} +1 -1
- package/dist/{chunk-UCEPFTZV.js → chunk-CJLCPURD.js} +5 -5
- package/dist/{chunk-UCEPFTZV.js.map → chunk-CJLCPURD.js.map} +1 -1
- package/dist/{chunk-VKVWIEDG.mjs → chunk-D6YFA5HW.mjs} +117 -6
- package/dist/chunk-D6YFA5HW.mjs.map +1 -0
- package/dist/{chunk-FXXYC73W.mjs → chunk-EE3VOAU4.mjs} +4 -4
- package/dist/{chunk-FXXYC73W.mjs.map → chunk-EE3VOAU4.mjs.map} +1 -1
- package/dist/{chunk-OZEYZNU6.js → chunk-EI2V2GGG.js} +6 -6
- package/dist/{chunk-OZEYZNU6.js.map → chunk-EI2V2GGG.js.map} +1 -1
- package/dist/{chunk-7IHOZOXC.mjs → chunk-FI5U4TL5.mjs} +4 -4
- package/dist/{chunk-7IHOZOXC.mjs.map → chunk-FI5U4TL5.mjs.map} +1 -1
- package/dist/{chunk-WWAUCHWD.mjs → chunk-H6ZT2DJ2.mjs} +4 -2
- package/dist/chunk-H6ZT2DJ2.mjs.map +1 -0
- package/dist/{chunk-7EHLO6NI.js → chunk-JDK4GEME.js} +2 -2
- package/dist/chunk-JDK4GEME.js.map +1 -0
- package/dist/{chunk-ECLG6BQ6.mjs → chunk-JL77KUET.mjs} +3 -3
- package/dist/{chunk-ECLG6BQ6.mjs.map → chunk-JL77KUET.mjs.map} +1 -1
- package/dist/{chunk-YRR6BOGQ.js → chunk-L5R6FKHH.js} +4 -4
- package/dist/{chunk-YRR6BOGQ.js.map → chunk-L5R6FKHH.js.map} +1 -1
- package/dist/{chunk-CSALA64D.mjs → chunk-LDCG4KDI.mjs} +3 -3
- package/dist/{chunk-CSALA64D.mjs.map → chunk-LDCG4KDI.mjs.map} +1 -1
- package/dist/{chunk-HNVTREZD.mjs → chunk-LPKS5CM5.mjs} +48 -7
- package/dist/chunk-LPKS5CM5.mjs.map +1 -0
- package/dist/{chunk-Z54MFDON.mjs → chunk-MG4MFZL3.mjs} +4 -4
- package/dist/{chunk-Z54MFDON.mjs.map → chunk-MG4MFZL3.mjs.map} +1 -1
- package/dist/{chunk-7MGAHY2M.js → chunk-MIUDP3FD.js} +8 -8
- package/dist/{chunk-7MGAHY2M.js.map → chunk-MIUDP3FD.js.map} +1 -1
- package/dist/{chunk-U2Z6DGHD.js → chunk-MJMLNETS.js} +4 -2
- package/dist/chunk-MJMLNETS.js.map +1 -0
- package/dist/{chunk-PPFIVMB7.mjs → chunk-MMFYXM3J.mjs} +4 -4
- package/dist/{chunk-PPFIVMB7.mjs.map → chunk-MMFYXM3J.mjs.map} +1 -1
- package/dist/{chunk-5RG53WIK.js → chunk-MR2KQSBB.js} +10 -10
- package/dist/{chunk-5RG53WIK.js.map → chunk-MR2KQSBB.js.map} +1 -1
- package/dist/{chunk-RO5ZFFUR.js → chunk-N5N5K36B.js} +6 -6
- package/dist/{chunk-RO5ZFFUR.js.map → chunk-N5N5K36B.js.map} +1 -1
- package/dist/{chunk-PNG74DNV.js → chunk-OG4IEN7J.js} +8 -8
- package/dist/{chunk-PNG74DNV.js.map → chunk-OG4IEN7J.js.map} +1 -1
- package/dist/{chunk-ZX5SLGGV.mjs → chunk-OSR32MPG.mjs} +4 -4
- package/dist/{chunk-ZX5SLGGV.mjs.map → chunk-OSR32MPG.mjs.map} +1 -1
- package/dist/{chunk-FPDVVACE.mjs → chunk-PDZN6KBV.mjs} +4 -4
- package/dist/{chunk-FPDVVACE.mjs.map → chunk-PDZN6KBV.mjs.map} +1 -1
- package/dist/{chunk-QHH6MT2S.js → chunk-Q4MSQLMS.js} +13 -13
- package/dist/{chunk-QHH6MT2S.js.map → chunk-Q4MSQLMS.js.map} +1 -1
- package/dist/{chunk-QFXRHPBU.mjs → chunk-QMBSDSSN.mjs} +3 -3
- package/dist/{chunk-QFXRHPBU.mjs.map → chunk-QMBSDSSN.mjs.map} +1 -1
- package/dist/{chunk-QBT62V5L.js → chunk-QUP2GEPF.js} +4 -4
- package/dist/{chunk-QBT62V5L.js.map → chunk-QUP2GEPF.js.map} +1 -1
- package/dist/{chunk-B7KVAKHG.mjs → chunk-RHS4E3R7.mjs} +4 -4
- package/dist/{chunk-B7KVAKHG.mjs.map → chunk-RHS4E3R7.mjs.map} +1 -1
- package/dist/{chunk-4FPZQCWI.mjs → chunk-RSU5CPC7.mjs} +4 -4
- package/dist/{chunk-4FPZQCWI.mjs.map → chunk-RSU5CPC7.mjs.map} +1 -1
- package/dist/{chunk-H7MLCJ27.mjs → chunk-SDR7JKDF.mjs} +2 -2
- package/dist/chunk-SDR7JKDF.mjs.map +1 -0
- package/dist/{chunk-5VRVKCOW.js → chunk-T3IZPDGQ.js} +5 -5
- package/dist/{chunk-5VRVKCOW.js.map → chunk-T3IZPDGQ.js.map} +1 -1
- package/dist/{chunk-CKYOOJGR.mjs → chunk-TS4UIWRG.mjs} +3 -3
- package/dist/{chunk-CKYOOJGR.mjs.map → chunk-TS4UIWRG.mjs.map} +1 -1
- package/dist/{chunk-NYZXNKMS.js → chunk-UWKP36N6.js} +121 -9
- package/dist/chunk-UWKP36N6.js.map +1 -0
- package/dist/{chunk-WRQWJDO2.js → chunk-WXWEZQLX.js} +6 -6
- package/dist/{chunk-WRQWJDO2.js.map → chunk-WXWEZQLX.js.map} +1 -1
- package/dist/{chunk-CN4WRFCH.js → chunk-Y6WOMG2H.js} +6 -6
- package/dist/{chunk-CN4WRFCH.js.map → chunk-Y6WOMG2H.js.map} +1 -1
- package/dist/{chunk-M7BOLJLW.mjs → chunk-YEIU5W7E.mjs} +4 -4
- package/dist/{chunk-M7BOLJLW.mjs.map → chunk-YEIU5W7E.mjs.map} +1 -1
- package/dist/{chunk-V6YCJSYT.js → chunk-Z3GT7VB2.js} +10 -10
- package/dist/{chunk-V6YCJSYT.js.map → chunk-Z3GT7VB2.js.map} +1 -1
- package/dist/components/AdvancedPickers.js +7 -7
- package/dist/components/AdvancedPickers.mjs +3 -3
- package/dist/components/AppShell.js +4 -4
- package/dist/components/AppShell.mjs +2 -2
- package/dist/components/Comments.js +6 -6
- package/dist/components/Comments.mjs +3 -3
- package/dist/components/Commerce.js +15 -15
- package/dist/components/Commerce.mjs +4 -4
- package/dist/components/DataTable.d.mts +35 -2
- package/dist/components/DataTable.d.ts +35 -2
- package/dist/components/DataTable.js +20 -10
- package/dist/components/DataTable.mjs +10 -4
- package/dist/components/Display.js +13 -13
- package/dist/components/Display.mjs +2 -2
- package/dist/components/Display3.js +8 -8
- package/dist/components/Display3.mjs +2 -2
- package/dist/components/Editing.d.mts +40 -1
- package/dist/components/Editing.d.ts +40 -1
- package/dist/components/Editing.js +12 -8
- package/dist/components/Editing.mjs +3 -3
- package/dist/components/Filters.js +9 -9
- package/dist/components/Filters.mjs +3 -3
- package/dist/components/Gallery.js +5 -5
- package/dist/components/Gallery.mjs +3 -3
- package/dist/components/Inputs.js +7 -7
- package/dist/components/Inputs.mjs +3 -3
- package/dist/components/InputsExtra.js +12 -12
- package/dist/components/InputsExtra.mjs +3 -3
- package/dist/components/Notifications.js +4 -4
- package/dist/components/Notifications.mjs +3 -3
- package/dist/components/Overlay.js +4 -4
- package/dist/components/Overlay.mjs +2 -2
- package/dist/components/Permissions.js +4 -4
- package/dist/components/Permissions.mjs +3 -3
- package/dist/components/Pickers.js +8 -8
- package/dist/components/Pickers.mjs +3 -3
- package/dist/components/TimeAgo.js +6 -6
- package/dist/components/TimeAgo.mjs +4 -4
- package/dist/components/Toast.js +4 -4
- package/dist/components/Toast.mjs +2 -2
- package/dist/index.d.mts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +125 -117
- package/dist/index.mjs +23 -23
- package/dist/locale/index.d.mts +2 -2
- package/dist/locale/index.d.ts +2 -2
- package/dist/locale/index.js +6 -6
- package/dist/locale/index.mjs +2 -2
- package/dist/{messages-K0Cw7IAD.d.ts → messages-D7YiIzCG.d.mts} +4 -0
- package/dist/{messages-K0Cw7IAD.d.mts → messages-D7YiIzCG.d.ts} +4 -0
- package/dist/styles.css +1 -1
- package/dist/utils/smartTime.d.mts +1 -1
- package/dist/utils/smartTime.d.ts +1 -1
- package/dist/utils/smartTime.js +6 -6
- package/dist/utils/smartTime.mjs +2 -2
- package/package.json +1 -1
- package/dist/chunk-7EHLO6NI.js.map +0 -1
- package/dist/chunk-H7MLCJ27.mjs.map +0 -1
- package/dist/chunk-HNVTREZD.mjs.map +0 -1
- package/dist/chunk-KW76HGQL.js.map +0 -1
- package/dist/chunk-NYZXNKMS.js.map +0 -1
- package/dist/chunk-U2Z6DGHD.js.map +0 -1
- package/dist/chunk-VKVWIEDG.mjs.map +0 -1
- package/dist/chunk-WWAUCHWD.mjs.map +0 -1
package/dist/utils/smartTime.js
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
5
|
-
require('../chunk-
|
|
4
|
+
var chunkQUP2GEPF_js = require('../chunk-QUP2GEPF.js');
|
|
5
|
+
require('../chunk-JDK4GEME.js');
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
Object.defineProperty(exports, "formatIsoDate", {
|
|
10
10
|
enumerable: true,
|
|
11
|
-
get: function () { return
|
|
11
|
+
get: function () { return chunkQUP2GEPF_js.formatIsoDate; }
|
|
12
12
|
});
|
|
13
13
|
Object.defineProperty(exports, "formatIsoDateTime", {
|
|
14
14
|
enumerable: true,
|
|
15
|
-
get: function () { return
|
|
15
|
+
get: function () { return chunkQUP2GEPF_js.formatIsoDateTime; }
|
|
16
16
|
});
|
|
17
17
|
Object.defineProperty(exports, "smartDate", {
|
|
18
18
|
enumerable: true,
|
|
19
|
-
get: function () { return
|
|
19
|
+
get: function () { return chunkQUP2GEPF_js.smartDate; }
|
|
20
20
|
});
|
|
21
21
|
Object.defineProperty(exports, "smartDateTime", {
|
|
22
22
|
enumerable: true,
|
|
23
|
-
get: function () { return
|
|
23
|
+
get: function () { return chunkQUP2GEPF_js.smartDateTime; }
|
|
24
24
|
});
|
|
25
25
|
//# sourceMappingURL=smartTime.js.map
|
|
26
26
|
//# sourceMappingURL=smartTime.js.map
|
package/dist/utils/smartTime.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
export { formatIsoDate, formatIsoDateTime, smartDate, smartDateTime } from '../chunk-
|
|
3
|
-
import '../chunk-
|
|
2
|
+
export { formatIsoDate, formatIsoDateTime, smartDate, smartDateTime } from '../chunk-TS4UIWRG.mjs';
|
|
3
|
+
import '../chunk-SDR7JKDF.mjs';
|
|
4
4
|
//# sourceMappingURL=smartTime.mjs.map
|
|
5
5
|
//# sourceMappingURL=smartTime.mjs.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@misael703/ui",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.50.0",
|
|
4
4
|
"description": "Generic React + TypeScript UI kit, optimized for Next.js. Tokens, accessible components, runtime-configurable theming via presets.",
|
|
5
5
|
"author": "Misael Ocas <misael.ocas@gmail.com>",
|
|
6
6
|
"license": "MIT",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/locale/messages.ts"],"names":[],"mappings":";;;AAyMO,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-7EHLO6NI.js","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\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"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/locale/messages.ts"],"names":[],"mappings":";AAyMO,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-H7MLCJ27.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\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"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/DataTable.tsx"],"names":["Fragment","rows","rowKey","selectedKeys","onSelectionChange","expandedKeys","onExpandedChange","TableToolbar"],"mappings":"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","file":"chunk-HNVTREZD.mjs","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { ChevronUp, ChevronDown, ChevronRight, MoreVertical } from './Icons';\nimport { Checkbox } from './Form';\nimport { useLocale } from '../locale/LocaleProvider';\nimport { format } from '../locale/messages';\n\n// ---------- DataTableRow (memoized) -------------------------------------\n// Extracted as React.memo so unrelated parent re-renders don't churn through\n// every row in the table. Combined with a ref-stable `onToggle`, only the\n// row whose `selected` prop actually changed re-renders on toggle.\ninterface DataTableRowProps<T> {\n row: T;\n rowK: string;\n selected: boolean;\n selectable: boolean;\n selectAriaLabel: string;\n columns: Column<T>[];\n onToggle: (k: string) => void;\n /** Resolved from `rowHref(row)` — makes the row a navigable link. */\n href?: string;\n /** Resolved from `onRowClick(row)` — makes the row activate a callback. */\n onActivate?: () => void;\n /** Accessible name for the stretched row control (e.g. \"Ver Taladro\"). */\n actionLabel?: string;\n /** Full-control escape hatch (see `DataTableProps.renderRow`). */\n renderRow?: (args: {\n row: T;\n cells: React.ReactNode;\n rowKey: string;\n }) => React.ReactNode;\n /** Row expansion (resolved from `DataTableProps.renderExpanded`). */\n expandable?: boolean;\n expanded?: boolean;\n onToggleExpand?: (k: string) => void;\n expandLabel?: string;\n detailId?: string;\n}\n\nfunction DataTableRowImpl<T>({\n row, rowK, selected, selectable, selectAriaLabel, columns, onToggle,\n href, onActivate, actionLabel, renderRow,\n expandable, expanded, onToggleExpand, expandLabel, detailId,\n}: DataTableRowProps<T>) {\n const interactive = !renderRow && (!!href || !!onActivate);\n\n const cells = (\n <>\n {selectable && (\n <td className={cx(interactive && 'data-table__cell--above')}>\n <Checkbox\n checked={selected}\n onChange={() => onToggle(rowK)}\n aria-label={selectAriaLabel}\n />\n </td>\n )}\n {expandable && (\n <td className={cx(interactive && 'data-table__cell--above')}>\n <button\n type=\"button\"\n className=\"data-table__expand-btn\"\n aria-expanded={expanded}\n // Only reference the panel while it exists in the DOM — a\n // collapsed row's aria-controls would point at a missing id.\n aria-controls={expanded ? detailId : undefined}\n aria-label={expandLabel}\n onClick={() => onToggleExpand?.(rowK)}\n >\n <ChevronRight size={16} />\n </button>\n </td>\n )}\n {columns.map((c, ci) => {\n const align = c.align ?? (c.numeric ? 'right' : 'left');\n const value = c.accessor\n ? c.accessor(row)\n : (row as Record<string, unknown>)[c.key] as React.ReactNode;\n // data-label is consumed by the .data-table--cards CSS to surface\n // the column header as an inline label on each row when the table\n // collapses to a card layout on narrow viewports. Non-string\n // headers (e.g. JSX) can't be projected through `attr()` so we\n // omit the attribute and the cell renders without a visible label.\n const label = typeof c.header === 'string' ? c.header : undefined;\n return (\n <td\n key={c.key}\n // `table__align-*` makes alignment authoritative for ANY cell\n // content. `text-align` alone silently fails for a block/flex\n // child (e.g. an action column of buttons → floated left); the\n // class adds the matching `margin` auto so element children\n // honor `align` too. Left cells emit no extra class → byte-\n // identical to pre-1.10.0 (zero regression for the default).\n className={cx(\n c.numeric && 'table__num',\n align !== 'left' && `table__align-${align}`,\n )}\n style={{ textAlign: align }}\n data-label={label}\n >\n {/* Stretched row control: a real <a>/<button> in the first\n data cell, overlaying the whole row (the <tr> is the\n positioned ancestor). Keyboard-operable + SR-labelled +\n valid table markup — no role hacks, no onClick-only div.\n Visually empty; the cells stay the visible content. Other\n interactive cell content opts above it via\n `data-table__cell--above` (stretched-link pattern). */}\n {interactive && ci === 0 && (\n href ? (\n <a\n href={href}\n className=\"data-table__rowlink\"\n aria-label={actionLabel}\n onClick={onActivate}\n />\n ) : (\n <button\n type=\"button\"\n className=\"data-table__rowlink\"\n aria-label={actionLabel}\n onClick={onActivate}\n />\n )\n )}\n {value as React.ReactNode}\n </td>\n );\n })}\n </>\n );\n\n if (renderRow) return <>{renderRow({ row, cells, rowKey: rowK })}</>;\n\n return (\n <tr className={cx(selected && 'is-selected', interactive && 'is-clickable')}>\n {cells}\n </tr>\n );\n}\n\n// Cast preserves the generic signature through React.memo.\nconst DataTableRow = React.memo(DataTableRowImpl) as typeof DataTableRowImpl;\n\n// ---------- DataTable ----------------------------------------------------\nexport interface Column<T> {\n key: string;\n header: React.ReactNode;\n accessor?: (row: T) => React.ReactNode;\n sortable?: boolean;\n align?: 'left' | 'right' | 'center';\n width?: number | string;\n /**\n * Marks the column as numeric: cells get the `.table__num` class\n * (monospace + tabular alignment) and right-align by default.\n */\n numeric?: boolean;\n /**\n * Aggregate cell for this column (a total, a count, a \"Total\" label).\n * When ANY column sets it, the table renders a `<tfoot>` row styled like\n * the header band; in bounded (`maxHeight`) mode it stays pinned to the\n * bottom of the scroll box, so totals remain visible while rows scroll.\n * Aggregating is the consumer's job (the kit never sums for you — rows\n * may be a server page, and the page total ≠ the dataset total).\n * Only rendered with actual rows: the error / loading / empty states\n * have nothing meaningful to total. Hidden in `mobileLayout=\"cards\"`\n * (cells lose their column geometry there, like the header does).\n */\n footer?: React.ReactNode;\n}\n\nexport interface DataTableProps<T> {\n columns: Column<T>[];\n rows: T[];\n rowKey: (row: T) => string;\n sort?: { key: string; dir: 'asc' | 'desc' } | null;\n /**\n * Sorting is uncontrolled inside the table — consumers re-order `rows`\n * in response to `onSortChange`. Stability of equal-keyed rows is the\n * caller's responsibility (use a stable sort like `Array.prototype.sort`\n * in V8/Node ≥ 12, or a tiebreaker on rowKey).\n */\n onSortChange?: (s: { key: string; dir: 'asc' | 'desc' } | null) => void;\n selectable?: boolean;\n selectedKeys?: Set<string>;\n /**\n * \"Select all\" toggles only the rows currently passed to the component.\n * If the consumer paginates externally and only passes the visible page,\n * this selects the page — not the dataset across all pages.\n */\n onSelectionChange?: (keys: Set<string>) => void;\n empty?: React.ReactNode;\n /**\n * Renders an error state in place of the body. Takes precedence over\n * `loading`, `empty`, and rows. Use it when a fetch fails.\n */\n error?: React.ReactNode;\n loading?: boolean;\n /**\n * Keep the table header pinned while rows scroll past it\n * (`position: sticky`). The header sticks to the nearest scrolling\n * ancestor: pair it with `maxHeight` to scroll inside a bounded box, or\n * leave `maxHeight` unset to let the header stick to an outer scroller\n * (a `Modal` body, the page) — one scroll, no nested scrollbar.\n *\n * NOTE: a wide table needs its own horizontal scroll, which only exists in\n * the bounded (`maxHeight`) mode. Without `maxHeight` the wrap is not a\n * scroll container, so a wider-than-container table overflows its parent —\n * use `maxHeight` for wide tables, or keep the table within its width.\n */\n stickyHeader?: boolean;\n /**\n * Cap the table's height and scroll its body inside a bounded box (the\n * wrap becomes the vertical scroll container). Accepts any CSS length\n * (`'70vh'`, `480`, `'30rem'`). Combine with `stickyHeader` for a\n * scroll-region table whose header stays pinned to the box. Leaving this\n * unset (with `stickyHeader`) makes the header stick to an outer scroller\n * instead — see `stickyHeader`.\n */\n maxHeight?: string | number;\n /**\n * Layout for narrow viewports (`<600px`):\n * - `'table'` (default): the table scrolls horizontally inside its wrapper.\n * - `'cards'`: each row collapses to a stacked card with the column\n * header as an inline label per cell. Requires string `header` values\n * for the labels to appear; non-string headers render without a label.\n */\n mobileLayout?: 'table' | 'cards';\n /** Accessible name announced by screen readers (e.g. \"Pedidos abiertos\"). */\n ariaLabel?: string;\n /**\n * Builds the accessible label for the per-row checkbox so screen-reader\n * users can tell rows apart. Defaults to the row's key. Provide this\n * when the key isn't human-readable (e.g. a UUID).\n */\n rowLabel?: (row: T) => string;\n /**\n * Body density. Default `'compact'` (v1.10.0): a readable-dense register\n * (~30px rows, `--text-xs`, single-line cells) — the right default for\n * the data-heavy screens this kit serves (\"default = product\"). Pass\n * `'comfortable'` to opt back into the pre-1.10.0 airy 14px/16px rows\n * (which wrap to two lines).\n */\n density?: 'comfortable' | 'compact';\n /**\n * Makes every row a navigable link. The kit renders a real, keyboard-\n * operable, screen-reader-labelled `<a>` stretched over the row — valid\n * table markup (no `role` hacks, no `asChild` on `<tr>`, never an\n * onClick-only div). One Tab stop per row; Enter activates; the focus\n * ring shows on the row. Additive; combinable with `onRowClick`.\n */\n rowHref?: (row: T) => string;\n /**\n * Makes every row activate a callback (pointer **and** keyboard).\n * Renders a real stretched `<button>` with the same a11y guarantees as\n * `rowHref`. Prefer `rowHref` when the action is navigation.\n */\n onRowClick?: (row: T) => void;\n /**\n * Full-control escape hatch — the render-prop polymorphism the kit uses\n * for data/array-driven components (cf. `AppShell.linkAs`; deliberately\n * NOT `asChild`, which would emit invalid markup on `<tr>`). Receives the\n * row, the kit-rendered `cells`, and the row key; return your own row\n * element (e.g. a framework `<Link>` wrapping a `<tr>`). When set,\n * `rowHref`/`onRowClick` are ignored (you own row interactivity & a11y).\n */\n renderRow?: (args: {\n row: T;\n cells: React.ReactNode;\n rowKey: string;\n }) => React.ReactNode;\n /**\n * Row expansion: renders a detail panel under the row (an order's line\n * items, an audit trail). Setting it adds a chevron toggle column; the\n * open panel is an extra `<tr>` spanning every column, recessed on the\n * header's grey band. Controlled like selection: pair with\n * `expandedKeys`/`onExpandedChange`. The toggle is a real `<button>`\n * (`aria-expanded` + `aria-controls` while open) and stays clickable on\n * interactive rows (above the stretched row link). In\n * `mobileLayout=\"cards\"` the detail renders as its own card under the\n * row's card.\n */\n renderExpanded?: (row: T) => React.ReactNode;\n expandedKeys?: Set<string>;\n onExpandedChange?: (keys: Set<string>) => void;\n /**\n * Toolbar / filter zone that shares the table's rounded surface. When\n * set, the DataTable renders it INSIDE its own border+radius+overflow\n * surface (`.table-surface`): the toolbar is clipped to the radius,\n * there is exactly one divider between it and the header, and the\n * header band's corner-rounding is dropped so the strip is clean in the\n * corner — no card-border + filter-border + header-top stack, no seam.\n * Accepts any node (`<TableToolbar>`, `<FilterBar>`, a custom row). The\n * legacy sibling pattern (`<TableToolbar/><DataTable/>`) still works.\n */\n toolbar?: React.ReactNode;\n /**\n * Surface chrome mode. Default `'card'`: the table draws its own\n * border + radius (and `--table-elevation` if set), the standalone\n * surface. `'flush'`: drops that chrome so the table sits clean inside\n * a parent that already owns the surface (a `<Card>`) without doubling\n * the border or nesting a radius. Use `'flush'` for the embedded-in-Card\n * case; leave the default for standalone tables.\n */\n surface?: 'card' | 'flush';\n className?: string;\n}\n\n/**\n * Tabular data renderer with optional sorting, selection, error/empty/\n * loading states.\n *\n * State priority (only one body state renders at a time):\n * error > loading > empty > rows\n *\n * Known limits (deferred to a later release):\n * - No virtualization; tested up to ~200 rows. For large datasets, plug\n * in react-window/tanstack-virtual around the body rows.\n */\nexport function DataTable<T>({\n columns, rows, rowKey,\n sort, onSortChange,\n selectable, selectedKeys, onSelectionChange,\n empty, error, loading, stickyHeader, maxHeight, mobileLayout = 'table',\n ariaLabel, rowLabel, className,\n density = 'compact', rowHref, onRowClick, renderRow, toolbar,\n renderExpanded, expandedKeys, onExpandedChange,\n surface = 'card',\n}: DataTableProps<T>) {\n const t = useLocale();\n const allSelected = selectable && rows.length > 0 && rows.every((r) => selectedKeys?.has(rowKey(r)));\n const someSelected = selectable && !allSelected && rows.some((r) => selectedKeys?.has(rowKey(r)));\n const headerCbRef = React.useRef<HTMLInputElement>(null);\n React.useEffect(() => {\n if (headerCbRef.current) headerCbRef.current.indeterminate = !!someSelected;\n }, [someSelected]);\n\n // On-scroll header elevation (bounded `maxHeight` + `stickyHeader` only).\n // A zero-height sentinel sits at the top of the inner scroll container; an\n // IntersectionObserver flips `stuck` when it leaves the scroller's top, so\n // the sticky header gains a soft drop shadow once content scrolls beneath\n // it. IO (not a scroll listener) → no per-frame work; SSR/jsdom-safe via\n // the `typeof` guard. Ancestor-stick mode keeps the flush header (the\n // outer scroller isn't ours to observe).\n const scrollRef = React.useRef<HTMLDivElement>(null);\n const sentinelRef = React.useRef<HTMLDivElement>(null);\n const [stuck, setStuck] = React.useState(false);\n const elevatable = stickyHeader && maxHeight != null;\n React.useEffect(() => {\n if (!elevatable) { setStuck(false); return; }\n const root = scrollRef.current;\n const sentinel = sentinelRef.current;\n if (!root || !sentinel || typeof IntersectionObserver === 'undefined') return;\n const io = new IntersectionObserver(\n ([entry]) => setStuck(!entry.isIntersecting),\n { root, threshold: 0 },\n );\n io.observe(sentinel);\n return () => io.disconnect();\n }, [elevatable]);\n\n // Latest-props ref so toggleRow stays referentially stable across selection\n // changes. Without this, every selection update would create a new\n // toggleRow, defeating React.memo on DataTableRow.\n const propsRef = React.useRef({ rows, rowKey, selectedKeys, onSelectionChange, expandedKeys, onExpandedChange });\n propsRef.current = { rows, rowKey, selectedKeys, onSelectionChange, expandedKeys, onExpandedChange };\n\n const toggleAll = React.useCallback(() => {\n const { rows, rowKey, selectedKeys, onSelectionChange } = propsRef.current;\n if (!onSelectionChange) return;\n const allSel = rows.length > 0 && rows.every((r) => selectedKeys?.has(rowKey(r)));\n const next = new Set(selectedKeys);\n if (allSel) rows.forEach((r) => next.delete(rowKey(r)));\n else rows.forEach((r) => next.add(rowKey(r)));\n onSelectionChange(next);\n }, []);\n\n const toggleRow = React.useCallback((k: string) => {\n const { selectedKeys, onSelectionChange } = propsRef.current;\n if (!onSelectionChange) return;\n const next = new Set(selectedKeys);\n if (next.has(k)) next.delete(k); else next.add(k);\n onSelectionChange(next);\n }, []);\n\n const toggleExpand = React.useCallback((k: string) => {\n const { expandedKeys, onExpandedChange } = propsRef.current;\n if (!onExpandedChange) return;\n const next = new Set(expandedKeys);\n if (next.has(k)) next.delete(k); else next.add(k);\n onExpandedChange(next);\n }, []);\n\n const expandable = renderExpanded != null;\n // Stable per-table id base for the detail panels' aria-controls wiring.\n const tableId = React.useId();\n const totalCols = columns.length + (selectable ? 1 : 0) + (expandable ? 1 : 0);\n\n const onSort = (col: Column<T>) => {\n if (!col.sortable || !onSortChange) return;\n if (!sort || sort.key !== col.key) onSortChange({ key: col.key, dir: 'asc' });\n else if (sort.dir === 'asc') onSortChange({ key: col.key, dir: 'desc' });\n else onSortChange(null);\n };\n\n const tableEl = (\n <table\n className={cx(\n 'table data-table',\n density === 'comfortable' && 'table--comfortable',\n )}\n aria-label={ariaLabel}\n >\n <thead>\n <tr>\n {selectable && (\n <th scope=\"col\" style={{ width: 40 }}>\n <Checkbox\n ref={headerCbRef}\n checked={!!allSelected}\n onChange={toggleAll}\n aria-label={t['table.selectAll']}\n />\n </th>\n )}\n {/* Visually empty but properly named: it IS the column header\n of the toggle column (a `td` here would lose the thead band\n and sticky CSS, which target `thead th`). */}\n {expandable && <th scope=\"col\" style={{ width: 36 }} aria-label={t['table.expandColumn']} />}\n {columns.map((c) => {\n const active = sort?.key === c.key;\n const align = c.align ?? (c.numeric ? 'right' : 'left');\n const sortValue = c.sortable\n ? (active ? (sort!.dir === 'asc' ? 'ascending' : 'descending') : 'none')\n : undefined;\n const headerInner = (\n <span className=\"data-table__th\">\n {c.header}\n {c.sortable && (\n <span className=\"data-table__sort\" aria-hidden=\"true\">\n {active ? (sort!.dir === 'asc' ? <ChevronUp size={12} /> : <ChevronDown size={12} />) : <MoreVertical size={12} />}\n </span>\n )}\n </span>\n );\n return (\n <th\n key={c.key}\n scope=\"col\"\n style={{ width: c.width, textAlign: align }}\n aria-sort={sortValue}\n >\n {c.sortable ? (\n <button\n type=\"button\"\n className=\"data-table__sort-btn\"\n onClick={() => onSort(c)}\n >\n {headerInner}\n </button>\n ) : headerInner}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {error ? (\n <tr>\n <td\n colSpan={totalCols}\n className=\"data-table__error\"\n role=\"alert\"\n style={{ padding: 32, textAlign: 'center' }}\n >\n {error}\n </td>\n </tr>\n ) : loading ? (\n Array.from({ length: 5 }).map((_, i) => (\n <tr key={`s${i}`}>\n {selectable && <td><div className=\"skel\" style={{ height: 14 }} /></td>}\n {expandable && <td aria-hidden=\"true\" />}\n {columns.map((c) => <td key={c.key}><div className=\"skel\" style={{ height: 12, width: '70%' }} /></td>)}\n </tr>\n ))\n ) : rows.length === 0 ? (\n <tr>\n <td colSpan={totalCols} style={{ padding: 32 }}>\n {empty ?? <div style={{ textAlign: 'center', color: 'var(--fg-muted)' }}>{t['table.empty']}</div>}\n </td>\n </tr>\n ) : (\n rows.map((r) => {\n const k = rowKey(r);\n const label = rowLabel ? rowLabel(r) : k;\n const href = rowHref?.(r);\n const onActivate = onRowClick ? () => onRowClick(r) : undefined;\n const expanded = expandable && !!expandedKeys?.has(k);\n const detailId = `${tableId}-detail-${k}`;\n return (\n <React.Fragment key={k}>\n <DataTableRow\n row={r}\n rowK={k}\n selected={!!selectedKeys?.has(k)}\n selectable={!!selectable}\n selectAriaLabel={format(t['table.selectRow'], { label })}\n columns={columns}\n onToggle={toggleRow}\n href={href}\n onActivate={onActivate}\n actionLabel={format(t['table.rowAction'], { label })}\n renderRow={renderRow}\n expandable={expandable}\n expanded={expanded}\n onToggleExpand={toggleExpand}\n expandLabel={format(t['table.expandRow'], { label })}\n detailId={detailId}\n />\n {expanded && (\n <tr className=\"data-table__detail\">\n <td colSpan={totalCols} id={detailId}>\n {renderExpanded(r)}\n </td>\n </tr>\n )}\n </React.Fragment>\n );\n })\n )}\n </tbody>\n {columns.some((c) => c.footer != null) && !error && !loading && rows.length > 0 && (\n <tfoot>\n <tr>\n {selectable && <td />}\n {expandable && <td aria-hidden=\"true\" />}\n {columns.map((c) => {\n const align = c.align ?? (c.numeric ? 'right' : 'left');\n return (\n <td\n key={c.key}\n className={cx(\n c.numeric && 'table__num',\n align !== 'left' && `table__align-${align}`,\n )}\n style={{ textAlign: align }}\n >\n {c.footer}\n </td>\n );\n })}\n </tr>\n </tfoot>\n )}\n </table>\n );\n // Bounded mode (`maxHeight`): the table lives in an inner scroll\n // container, while the outer `.table-wrap` keeps the border/radius and\n // `overflow: hidden` clips it cleanly — including the sticky header's\n // paint and the scrollbar corners. (A single element that is BOTH the\n // rounded box AND the sticky scroll container can't clip the sticky paint\n // to its radius in Chrome; splitting the two does, because the outer\n // clipping element is no longer the sticky's scroll container.)\n const wrap = (\n <div\n className={cx(\n 'table-wrap',\n stickyHeader && 'table-wrap--sticky',\n maxHeight != null && 'table-wrap--scroll',\n mobileLayout === 'cards' && 'table-wrap--cards',\n surface === 'flush' && toolbar == null && 'table-wrap--flush',\n className,\n )}\n >\n {maxHeight != null\n ? (\n <div\n ref={scrollRef}\n className={cx('table-wrap__scroll', stuck && 'is-stuck')}\n style={{ maxHeight }}\n >\n {elevatable && <div ref={sentinelRef} className=\"table-wrap__sentinel\" aria-hidden=\"true\" />}\n {tableEl}\n </div>\n )\n : tableEl}\n </div>\n );\n // No toolbar → byte-identical legacy output. With a toolbar, the\n // DataTable owns the single rounded+clipped+bordered surface; the inner\n // .table-wrap defers its border/radius (CSS) and stays the scroll/sticky\n // context, so existing behaviour is untouched.\n return toolbar == null ? wrap : (\n <div className={cx('table-surface', surface === 'flush' && 'table-surface--flush')}>\n <div className=\"table-surface__bar\">{toolbar}</div>\n {wrap}\n </div>\n );\n}\n\n// ---------- Accordion ----------------------------------------------------\ninterface AccordionContextValue {\n open: Set<string>;\n toggle: (id: string) => void;\n multiple: boolean;\n}\nconst AccordionContext = React.createContext<AccordionContextValue | null>(null);\n\nexport interface AccordionProps {\n multiple?: boolean;\n defaultOpen?: string[];\n children: React.ReactNode;\n className?: string;\n}\n\nexport function Accordion({ multiple = false, defaultOpen = [], children, className }: AccordionProps) {\n const [open, setOpen] = React.useState<Set<string>>(new Set(defaultOpen));\n const toggle = (id: string) => {\n setOpen((curr) => {\n const next = new Set(curr);\n if (next.has(id)) next.delete(id);\n else {\n if (!multiple) next.clear();\n next.add(id);\n }\n return next;\n });\n };\n return (\n <AccordionContext.Provider value={{ open, toggle, multiple }}>\n <div className={cx('accordion', className)}>{children}</div>\n </AccordionContext.Provider>\n );\n}\n\nexport function AccordionItem({ id, title, children }: { id: string; title: React.ReactNode; children: React.ReactNode }) {\n const ctx = React.useContext(AccordionContext);\n if (!ctx) throw new Error('<AccordionItem> must be used inside <Accordion>');\n const isOpen = ctx.open.has(id);\n const reactId = React.useId();\n const triggerId = `accordion-trigger-${reactId}`;\n const panelId = `accordion-panel-${reactId}`;\n return (\n <div className={cx('accordion__item', isOpen && 'is-open')}>\n <button\n type=\"button\"\n id={triggerId}\n className=\"accordion__trigger\"\n aria-expanded={isOpen}\n aria-controls={panelId}\n onClick={() => ctx.toggle(id)}\n >\n <span>{title}</span>\n <span className=\"accordion__chev\" aria-hidden=\"true\"><ChevronDown size={14} /></span>\n </button>\n {isOpen && (\n <div\n id={panelId}\n role=\"region\"\n aria-labelledby={triggerId}\n className=\"accordion__panel\"\n >\n {children}\n </div>\n )}\n </div>\n );\n}\n\n// ---------- Breadcrumbs --------------------------------------------------\nexport interface BreadcrumbItem {\n label: React.ReactNode;\n href?: string;\n}\n\nexport function Breadcrumbs({ items, className }: { items: BreadcrumbItem[]; className?: string }) {\n return (\n <nav aria-label=\"Breadcrumb\" className={cx('breadcrumbs', className)}>\n <ol>\n {items.map((it, i) => {\n const last = i === items.length - 1;\n return (\n <li key={i}>\n {it.href && !last ? <a href={it.href}>{it.label}</a> : <span aria-current={last ? 'page' : undefined}>{it.label}</span>}\n {!last && <span aria-hidden=\"true\" className=\"breadcrumbs__sep\">/</span>}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n}\n\n// ---------- TablePagination ---------------------------------------------\n// Convenience wrapper that pairs a page-size selector with a Pagination\n// row. Use it under a DataTable when the table is paginated externally.\nimport { Pagination } from './Inputs';\n\nexport interface TablePaginationProps {\n page: number;\n pageSize: number;\n total: number;\n onPageChange: (page: number) => void;\n /** If set, renders a page-size selector. Omit for fixed-size pagination. */\n onPageSizeChange?: (size: number) => void;\n /** Options shown in the page-size selector. Default `[10, 25, 50, 100]`. */\n pageSizeOptions?: readonly number[];\n className?: string;\n}\n\nexport function TablePagination({\n page, pageSize, total, onPageChange,\n onPageSizeChange, pageSizeOptions = [10, 25, 50, 100],\n className,\n}: TablePaginationProps) {\n const t = useLocale();\n const selectId = React.useId();\n return (\n <div className={cx('table-pagination', className)}>\n {onPageSizeChange && (\n <label className=\"table-pagination__size\" htmlFor={selectId}>\n <span>{t['pagination.rowsPerPage']}</span>\n <select\n id={selectId}\n className=\"select\"\n value={pageSize}\n onChange={(e) => onPageSizeChange(Number(e.target.value))}\n >\n {pageSizeOptions.map((n) => (\n <option key={n} value={n}>{n}</option>\n ))}\n </select>\n </label>\n )}\n <Pagination\n page={page}\n pageSize={pageSize}\n total={total}\n onPageChange={onPageChange}\n />\n </div>\n );\n}\n\n// ---------- TableToolbar -------------------------------------------------\n// Barra superior que se compone arriba (o dentro de un wrapper) de un DataTable.\n// Cualquier hijo con className \"grow\" se expande para empujar las acciones al lado.\nexport const TableToolbar = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n function TableToolbar({ className, ...rest }, ref) {\n return <div ref={ref} className={cx('table-toolbar', className)} {...rest} />;\n }\n);\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/DataTable.tsx"],"names":["jsxs","Fragment","cx","jsx","Checkbox","ChevronRight","React","useLocale","rows","rowKey","selectedKeys","onSelectionChange","expandedKeys","onExpandedChange","ChevronUp","ChevronDown","MoreVertical","format","Pagination","TableToolbar"],"mappings":"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","file":"chunk-KW76HGQL.js","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { ChevronUp, ChevronDown, ChevronRight, MoreVertical } from './Icons';\nimport { Checkbox } from './Form';\nimport { useLocale } from '../locale/LocaleProvider';\nimport { format } from '../locale/messages';\n\n// ---------- DataTableRow (memoized) -------------------------------------\n// Extracted as React.memo so unrelated parent re-renders don't churn through\n// every row in the table. Combined with a ref-stable `onToggle`, only the\n// row whose `selected` prop actually changed re-renders on toggle.\ninterface DataTableRowProps<T> {\n row: T;\n rowK: string;\n selected: boolean;\n selectable: boolean;\n selectAriaLabel: string;\n columns: Column<T>[];\n onToggle: (k: string) => void;\n /** Resolved from `rowHref(row)` — makes the row a navigable link. */\n href?: string;\n /** Resolved from `onRowClick(row)` — makes the row activate a callback. */\n onActivate?: () => void;\n /** Accessible name for the stretched row control (e.g. \"Ver Taladro\"). */\n actionLabel?: string;\n /** Full-control escape hatch (see `DataTableProps.renderRow`). */\n renderRow?: (args: {\n row: T;\n cells: React.ReactNode;\n rowKey: string;\n }) => React.ReactNode;\n /** Row expansion (resolved from `DataTableProps.renderExpanded`). */\n expandable?: boolean;\n expanded?: boolean;\n onToggleExpand?: (k: string) => void;\n expandLabel?: string;\n detailId?: string;\n}\n\nfunction DataTableRowImpl<T>({\n row, rowK, selected, selectable, selectAriaLabel, columns, onToggle,\n href, onActivate, actionLabel, renderRow,\n expandable, expanded, onToggleExpand, expandLabel, detailId,\n}: DataTableRowProps<T>) {\n const interactive = !renderRow && (!!href || !!onActivate);\n\n const cells = (\n <>\n {selectable && (\n <td className={cx(interactive && 'data-table__cell--above')}>\n <Checkbox\n checked={selected}\n onChange={() => onToggle(rowK)}\n aria-label={selectAriaLabel}\n />\n </td>\n )}\n {expandable && (\n <td className={cx(interactive && 'data-table__cell--above')}>\n <button\n type=\"button\"\n className=\"data-table__expand-btn\"\n aria-expanded={expanded}\n // Only reference the panel while it exists in the DOM — a\n // collapsed row's aria-controls would point at a missing id.\n aria-controls={expanded ? detailId : undefined}\n aria-label={expandLabel}\n onClick={() => onToggleExpand?.(rowK)}\n >\n <ChevronRight size={16} />\n </button>\n </td>\n )}\n {columns.map((c, ci) => {\n const align = c.align ?? (c.numeric ? 'right' : 'left');\n const value = c.accessor\n ? c.accessor(row)\n : (row as Record<string, unknown>)[c.key] as React.ReactNode;\n // data-label is consumed by the .data-table--cards CSS to surface\n // the column header as an inline label on each row when the table\n // collapses to a card layout on narrow viewports. Non-string\n // headers (e.g. JSX) can't be projected through `attr()` so we\n // omit the attribute and the cell renders without a visible label.\n const label = typeof c.header === 'string' ? c.header : undefined;\n return (\n <td\n key={c.key}\n // `table__align-*` makes alignment authoritative for ANY cell\n // content. `text-align` alone silently fails for a block/flex\n // child (e.g. an action column of buttons → floated left); the\n // class adds the matching `margin` auto so element children\n // honor `align` too. Left cells emit no extra class → byte-\n // identical to pre-1.10.0 (zero regression for the default).\n className={cx(\n c.numeric && 'table__num',\n align !== 'left' && `table__align-${align}`,\n )}\n style={{ textAlign: align }}\n data-label={label}\n >\n {/* Stretched row control: a real <a>/<button> in the first\n data cell, overlaying the whole row (the <tr> is the\n positioned ancestor). Keyboard-operable + SR-labelled +\n valid table markup — no role hacks, no onClick-only div.\n Visually empty; the cells stay the visible content. Other\n interactive cell content opts above it via\n `data-table__cell--above` (stretched-link pattern). */}\n {interactive && ci === 0 && (\n href ? (\n <a\n href={href}\n className=\"data-table__rowlink\"\n aria-label={actionLabel}\n onClick={onActivate}\n />\n ) : (\n <button\n type=\"button\"\n className=\"data-table__rowlink\"\n aria-label={actionLabel}\n onClick={onActivate}\n />\n )\n )}\n {value as React.ReactNode}\n </td>\n );\n })}\n </>\n );\n\n if (renderRow) return <>{renderRow({ row, cells, rowKey: rowK })}</>;\n\n return (\n <tr className={cx(selected && 'is-selected', interactive && 'is-clickable')}>\n {cells}\n </tr>\n );\n}\n\n// Cast preserves the generic signature through React.memo.\nconst DataTableRow = React.memo(DataTableRowImpl) as typeof DataTableRowImpl;\n\n// ---------- DataTable ----------------------------------------------------\nexport interface Column<T> {\n key: string;\n header: React.ReactNode;\n accessor?: (row: T) => React.ReactNode;\n sortable?: boolean;\n align?: 'left' | 'right' | 'center';\n width?: number | string;\n /**\n * Marks the column as numeric: cells get the `.table__num` class\n * (monospace + tabular alignment) and right-align by default.\n */\n numeric?: boolean;\n /**\n * Aggregate cell for this column (a total, a count, a \"Total\" label).\n * When ANY column sets it, the table renders a `<tfoot>` row styled like\n * the header band; in bounded (`maxHeight`) mode it stays pinned to the\n * bottom of the scroll box, so totals remain visible while rows scroll.\n * Aggregating is the consumer's job (the kit never sums for you — rows\n * may be a server page, and the page total ≠ the dataset total).\n * Only rendered with actual rows: the error / loading / empty states\n * have nothing meaningful to total. Hidden in `mobileLayout=\"cards\"`\n * (cells lose their column geometry there, like the header does).\n */\n footer?: React.ReactNode;\n}\n\nexport interface DataTableProps<T> {\n columns: Column<T>[];\n rows: T[];\n rowKey: (row: T) => string;\n sort?: { key: string; dir: 'asc' | 'desc' } | null;\n /**\n * Sorting is uncontrolled inside the table — consumers re-order `rows`\n * in response to `onSortChange`. Stability of equal-keyed rows is the\n * caller's responsibility (use a stable sort like `Array.prototype.sort`\n * in V8/Node ≥ 12, or a tiebreaker on rowKey).\n */\n onSortChange?: (s: { key: string; dir: 'asc' | 'desc' } | null) => void;\n selectable?: boolean;\n selectedKeys?: Set<string>;\n /**\n * \"Select all\" toggles only the rows currently passed to the component.\n * If the consumer paginates externally and only passes the visible page,\n * this selects the page — not the dataset across all pages.\n */\n onSelectionChange?: (keys: Set<string>) => void;\n empty?: React.ReactNode;\n /**\n * Renders an error state in place of the body. Takes precedence over\n * `loading`, `empty`, and rows. Use it when a fetch fails.\n */\n error?: React.ReactNode;\n loading?: boolean;\n /**\n * Keep the table header pinned while rows scroll past it\n * (`position: sticky`). The header sticks to the nearest scrolling\n * ancestor: pair it with `maxHeight` to scroll inside a bounded box, or\n * leave `maxHeight` unset to let the header stick to an outer scroller\n * (a `Modal` body, the page) — one scroll, no nested scrollbar.\n *\n * NOTE: a wide table needs its own horizontal scroll, which only exists in\n * the bounded (`maxHeight`) mode. Without `maxHeight` the wrap is not a\n * scroll container, so a wider-than-container table overflows its parent —\n * use `maxHeight` for wide tables, or keep the table within its width.\n */\n stickyHeader?: boolean;\n /**\n * Cap the table's height and scroll its body inside a bounded box (the\n * wrap becomes the vertical scroll container). Accepts any CSS length\n * (`'70vh'`, `480`, `'30rem'`). Combine with `stickyHeader` for a\n * scroll-region table whose header stays pinned to the box. Leaving this\n * unset (with `stickyHeader`) makes the header stick to an outer scroller\n * instead — see `stickyHeader`.\n */\n maxHeight?: string | number;\n /**\n * Layout for narrow viewports (`<600px`):\n * - `'table'` (default): the table scrolls horizontally inside its wrapper.\n * - `'cards'`: each row collapses to a stacked card with the column\n * header as an inline label per cell. Requires string `header` values\n * for the labels to appear; non-string headers render without a label.\n */\n mobileLayout?: 'table' | 'cards';\n /** Accessible name announced by screen readers (e.g. \"Pedidos abiertos\"). */\n ariaLabel?: string;\n /**\n * Builds the accessible label for the per-row checkbox so screen-reader\n * users can tell rows apart. Defaults to the row's key. Provide this\n * when the key isn't human-readable (e.g. a UUID).\n */\n rowLabel?: (row: T) => string;\n /**\n * Body density. Default `'compact'` (v1.10.0): a readable-dense register\n * (~30px rows, `--text-xs`, single-line cells) — the right default for\n * the data-heavy screens this kit serves (\"default = product\"). Pass\n * `'comfortable'` to opt back into the pre-1.10.0 airy 14px/16px rows\n * (which wrap to two lines).\n */\n density?: 'comfortable' | 'compact';\n /**\n * Makes every row a navigable link. The kit renders a real, keyboard-\n * operable, screen-reader-labelled `<a>` stretched over the row — valid\n * table markup (no `role` hacks, no `asChild` on `<tr>`, never an\n * onClick-only div). One Tab stop per row; Enter activates; the focus\n * ring shows on the row. Additive; combinable with `onRowClick`.\n */\n rowHref?: (row: T) => string;\n /**\n * Makes every row activate a callback (pointer **and** keyboard).\n * Renders a real stretched `<button>` with the same a11y guarantees as\n * `rowHref`. Prefer `rowHref` when the action is navigation.\n */\n onRowClick?: (row: T) => void;\n /**\n * Full-control escape hatch — the render-prop polymorphism the kit uses\n * for data/array-driven components (cf. `AppShell.linkAs`; deliberately\n * NOT `asChild`, which would emit invalid markup on `<tr>`). Receives the\n * row, the kit-rendered `cells`, and the row key; return your own row\n * element (e.g. a framework `<Link>` wrapping a `<tr>`). When set,\n * `rowHref`/`onRowClick` are ignored (you own row interactivity & a11y).\n */\n renderRow?: (args: {\n row: T;\n cells: React.ReactNode;\n rowKey: string;\n }) => React.ReactNode;\n /**\n * Row expansion: renders a detail panel under the row (an order's line\n * items, an audit trail). Setting it adds a chevron toggle column; the\n * open panel is an extra `<tr>` spanning every column, recessed on the\n * header's grey band. Controlled like selection: pair with\n * `expandedKeys`/`onExpandedChange`. The toggle is a real `<button>`\n * (`aria-expanded` + `aria-controls` while open) and stays clickable on\n * interactive rows (above the stretched row link). In\n * `mobileLayout=\"cards\"` the detail renders as its own card under the\n * row's card.\n */\n renderExpanded?: (row: T) => React.ReactNode;\n expandedKeys?: Set<string>;\n onExpandedChange?: (keys: Set<string>) => void;\n /**\n * Toolbar / filter zone that shares the table's rounded surface. When\n * set, the DataTable renders it INSIDE its own border+radius+overflow\n * surface (`.table-surface`): the toolbar is clipped to the radius,\n * there is exactly one divider between it and the header, and the\n * header band's corner-rounding is dropped so the strip is clean in the\n * corner — no card-border + filter-border + header-top stack, no seam.\n * Accepts any node (`<TableToolbar>`, `<FilterBar>`, a custom row). The\n * legacy sibling pattern (`<TableToolbar/><DataTable/>`) still works.\n */\n toolbar?: React.ReactNode;\n /**\n * Surface chrome mode. Default `'card'`: the table draws its own\n * border + radius (and `--table-elevation` if set), the standalone\n * surface. `'flush'`: drops that chrome so the table sits clean inside\n * a parent that already owns the surface (a `<Card>`) without doubling\n * the border or nesting a radius. Use `'flush'` for the embedded-in-Card\n * case; leave the default for standalone tables.\n */\n surface?: 'card' | 'flush';\n className?: string;\n}\n\n/**\n * Tabular data renderer with optional sorting, selection, error/empty/\n * loading states.\n *\n * State priority (only one body state renders at a time):\n * error > loading > empty > rows\n *\n * Known limits (deferred to a later release):\n * - No virtualization; tested up to ~200 rows. For large datasets, plug\n * in react-window/tanstack-virtual around the body rows.\n */\nexport function DataTable<T>({\n columns, rows, rowKey,\n sort, onSortChange,\n selectable, selectedKeys, onSelectionChange,\n empty, error, loading, stickyHeader, maxHeight, mobileLayout = 'table',\n ariaLabel, rowLabel, className,\n density = 'compact', rowHref, onRowClick, renderRow, toolbar,\n renderExpanded, expandedKeys, onExpandedChange,\n surface = 'card',\n}: DataTableProps<T>) {\n const t = useLocale();\n const allSelected = selectable && rows.length > 0 && rows.every((r) => selectedKeys?.has(rowKey(r)));\n const someSelected = selectable && !allSelected && rows.some((r) => selectedKeys?.has(rowKey(r)));\n const headerCbRef = React.useRef<HTMLInputElement>(null);\n React.useEffect(() => {\n if (headerCbRef.current) headerCbRef.current.indeterminate = !!someSelected;\n }, [someSelected]);\n\n // On-scroll header elevation (bounded `maxHeight` + `stickyHeader` only).\n // A zero-height sentinel sits at the top of the inner scroll container; an\n // IntersectionObserver flips `stuck` when it leaves the scroller's top, so\n // the sticky header gains a soft drop shadow once content scrolls beneath\n // it. IO (not a scroll listener) → no per-frame work; SSR/jsdom-safe via\n // the `typeof` guard. Ancestor-stick mode keeps the flush header (the\n // outer scroller isn't ours to observe).\n const scrollRef = React.useRef<HTMLDivElement>(null);\n const sentinelRef = React.useRef<HTMLDivElement>(null);\n const [stuck, setStuck] = React.useState(false);\n const elevatable = stickyHeader && maxHeight != null;\n React.useEffect(() => {\n if (!elevatable) { setStuck(false); return; }\n const root = scrollRef.current;\n const sentinel = sentinelRef.current;\n if (!root || !sentinel || typeof IntersectionObserver === 'undefined') return;\n const io = new IntersectionObserver(\n ([entry]) => setStuck(!entry.isIntersecting),\n { root, threshold: 0 },\n );\n io.observe(sentinel);\n return () => io.disconnect();\n }, [elevatable]);\n\n // Latest-props ref so toggleRow stays referentially stable across selection\n // changes. Without this, every selection update would create a new\n // toggleRow, defeating React.memo on DataTableRow.\n const propsRef = React.useRef({ rows, rowKey, selectedKeys, onSelectionChange, expandedKeys, onExpandedChange });\n propsRef.current = { rows, rowKey, selectedKeys, onSelectionChange, expandedKeys, onExpandedChange };\n\n const toggleAll = React.useCallback(() => {\n const { rows, rowKey, selectedKeys, onSelectionChange } = propsRef.current;\n if (!onSelectionChange) return;\n const allSel = rows.length > 0 && rows.every((r) => selectedKeys?.has(rowKey(r)));\n const next = new Set(selectedKeys);\n if (allSel) rows.forEach((r) => next.delete(rowKey(r)));\n else rows.forEach((r) => next.add(rowKey(r)));\n onSelectionChange(next);\n }, []);\n\n const toggleRow = React.useCallback((k: string) => {\n const { selectedKeys, onSelectionChange } = propsRef.current;\n if (!onSelectionChange) return;\n const next = new Set(selectedKeys);\n if (next.has(k)) next.delete(k); else next.add(k);\n onSelectionChange(next);\n }, []);\n\n const toggleExpand = React.useCallback((k: string) => {\n const { expandedKeys, onExpandedChange } = propsRef.current;\n if (!onExpandedChange) return;\n const next = new Set(expandedKeys);\n if (next.has(k)) next.delete(k); else next.add(k);\n onExpandedChange(next);\n }, []);\n\n const expandable = renderExpanded != null;\n // Stable per-table id base for the detail panels' aria-controls wiring.\n const tableId = React.useId();\n const totalCols = columns.length + (selectable ? 1 : 0) + (expandable ? 1 : 0);\n\n const onSort = (col: Column<T>) => {\n if (!col.sortable || !onSortChange) return;\n if (!sort || sort.key !== col.key) onSortChange({ key: col.key, dir: 'asc' });\n else if (sort.dir === 'asc') onSortChange({ key: col.key, dir: 'desc' });\n else onSortChange(null);\n };\n\n const tableEl = (\n <table\n className={cx(\n 'table data-table',\n density === 'comfortable' && 'table--comfortable',\n )}\n aria-label={ariaLabel}\n >\n <thead>\n <tr>\n {selectable && (\n <th scope=\"col\" style={{ width: 40 }}>\n <Checkbox\n ref={headerCbRef}\n checked={!!allSelected}\n onChange={toggleAll}\n aria-label={t['table.selectAll']}\n />\n </th>\n )}\n {/* Visually empty but properly named: it IS the column header\n of the toggle column (a `td` here would lose the thead band\n and sticky CSS, which target `thead th`). */}\n {expandable && <th scope=\"col\" style={{ width: 36 }} aria-label={t['table.expandColumn']} />}\n {columns.map((c) => {\n const active = sort?.key === c.key;\n const align = c.align ?? (c.numeric ? 'right' : 'left');\n const sortValue = c.sortable\n ? (active ? (sort!.dir === 'asc' ? 'ascending' : 'descending') : 'none')\n : undefined;\n const headerInner = (\n <span className=\"data-table__th\">\n {c.header}\n {c.sortable && (\n <span className=\"data-table__sort\" aria-hidden=\"true\">\n {active ? (sort!.dir === 'asc' ? <ChevronUp size={12} /> : <ChevronDown size={12} />) : <MoreVertical size={12} />}\n </span>\n )}\n </span>\n );\n return (\n <th\n key={c.key}\n scope=\"col\"\n style={{ width: c.width, textAlign: align }}\n aria-sort={sortValue}\n >\n {c.sortable ? (\n <button\n type=\"button\"\n className=\"data-table__sort-btn\"\n onClick={() => onSort(c)}\n >\n {headerInner}\n </button>\n ) : headerInner}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {error ? (\n <tr>\n <td\n colSpan={totalCols}\n className=\"data-table__error\"\n role=\"alert\"\n style={{ padding: 32, textAlign: 'center' }}\n >\n {error}\n </td>\n </tr>\n ) : loading ? (\n Array.from({ length: 5 }).map((_, i) => (\n <tr key={`s${i}`}>\n {selectable && <td><div className=\"skel\" style={{ height: 14 }} /></td>}\n {expandable && <td aria-hidden=\"true\" />}\n {columns.map((c) => <td key={c.key}><div className=\"skel\" style={{ height: 12, width: '70%' }} /></td>)}\n </tr>\n ))\n ) : rows.length === 0 ? (\n <tr>\n <td colSpan={totalCols} style={{ padding: 32 }}>\n {empty ?? <div style={{ textAlign: 'center', color: 'var(--fg-muted)' }}>{t['table.empty']}</div>}\n </td>\n </tr>\n ) : (\n rows.map((r) => {\n const k = rowKey(r);\n const label = rowLabel ? rowLabel(r) : k;\n const href = rowHref?.(r);\n const onActivate = onRowClick ? () => onRowClick(r) : undefined;\n const expanded = expandable && !!expandedKeys?.has(k);\n const detailId = `${tableId}-detail-${k}`;\n return (\n <React.Fragment key={k}>\n <DataTableRow\n row={r}\n rowK={k}\n selected={!!selectedKeys?.has(k)}\n selectable={!!selectable}\n selectAriaLabel={format(t['table.selectRow'], { label })}\n columns={columns}\n onToggle={toggleRow}\n href={href}\n onActivate={onActivate}\n actionLabel={format(t['table.rowAction'], { label })}\n renderRow={renderRow}\n expandable={expandable}\n expanded={expanded}\n onToggleExpand={toggleExpand}\n expandLabel={format(t['table.expandRow'], { label })}\n detailId={detailId}\n />\n {expanded && (\n <tr className=\"data-table__detail\">\n <td colSpan={totalCols} id={detailId}>\n {renderExpanded(r)}\n </td>\n </tr>\n )}\n </React.Fragment>\n );\n })\n )}\n </tbody>\n {columns.some((c) => c.footer != null) && !error && !loading && rows.length > 0 && (\n <tfoot>\n <tr>\n {selectable && <td />}\n {expandable && <td aria-hidden=\"true\" />}\n {columns.map((c) => {\n const align = c.align ?? (c.numeric ? 'right' : 'left');\n return (\n <td\n key={c.key}\n className={cx(\n c.numeric && 'table__num',\n align !== 'left' && `table__align-${align}`,\n )}\n style={{ textAlign: align }}\n >\n {c.footer}\n </td>\n );\n })}\n </tr>\n </tfoot>\n )}\n </table>\n );\n // Bounded mode (`maxHeight`): the table lives in an inner scroll\n // container, while the outer `.table-wrap` keeps the border/radius and\n // `overflow: hidden` clips it cleanly — including the sticky header's\n // paint and the scrollbar corners. (A single element that is BOTH the\n // rounded box AND the sticky scroll container can't clip the sticky paint\n // to its radius in Chrome; splitting the two does, because the outer\n // clipping element is no longer the sticky's scroll container.)\n const wrap = (\n <div\n className={cx(\n 'table-wrap',\n stickyHeader && 'table-wrap--sticky',\n maxHeight != null && 'table-wrap--scroll',\n mobileLayout === 'cards' && 'table-wrap--cards',\n surface === 'flush' && toolbar == null && 'table-wrap--flush',\n className,\n )}\n >\n {maxHeight != null\n ? (\n <div\n ref={scrollRef}\n className={cx('table-wrap__scroll', stuck && 'is-stuck')}\n style={{ maxHeight }}\n >\n {elevatable && <div ref={sentinelRef} className=\"table-wrap__sentinel\" aria-hidden=\"true\" />}\n {tableEl}\n </div>\n )\n : tableEl}\n </div>\n );\n // No toolbar → byte-identical legacy output. With a toolbar, the\n // DataTable owns the single rounded+clipped+bordered surface; the inner\n // .table-wrap defers its border/radius (CSS) and stays the scroll/sticky\n // context, so existing behaviour is untouched.\n return toolbar == null ? wrap : (\n <div className={cx('table-surface', surface === 'flush' && 'table-surface--flush')}>\n <div className=\"table-surface__bar\">{toolbar}</div>\n {wrap}\n </div>\n );\n}\n\n// ---------- Accordion ----------------------------------------------------\ninterface AccordionContextValue {\n open: Set<string>;\n toggle: (id: string) => void;\n multiple: boolean;\n}\nconst AccordionContext = React.createContext<AccordionContextValue | null>(null);\n\nexport interface AccordionProps {\n multiple?: boolean;\n defaultOpen?: string[];\n children: React.ReactNode;\n className?: string;\n}\n\nexport function Accordion({ multiple = false, defaultOpen = [], children, className }: AccordionProps) {\n const [open, setOpen] = React.useState<Set<string>>(new Set(defaultOpen));\n const toggle = (id: string) => {\n setOpen((curr) => {\n const next = new Set(curr);\n if (next.has(id)) next.delete(id);\n else {\n if (!multiple) next.clear();\n next.add(id);\n }\n return next;\n });\n };\n return (\n <AccordionContext.Provider value={{ open, toggle, multiple }}>\n <div className={cx('accordion', className)}>{children}</div>\n </AccordionContext.Provider>\n );\n}\n\nexport function AccordionItem({ id, title, children }: { id: string; title: React.ReactNode; children: React.ReactNode }) {\n const ctx = React.useContext(AccordionContext);\n if (!ctx) throw new Error('<AccordionItem> must be used inside <Accordion>');\n const isOpen = ctx.open.has(id);\n const reactId = React.useId();\n const triggerId = `accordion-trigger-${reactId}`;\n const panelId = `accordion-panel-${reactId}`;\n return (\n <div className={cx('accordion__item', isOpen && 'is-open')}>\n <button\n type=\"button\"\n id={triggerId}\n className=\"accordion__trigger\"\n aria-expanded={isOpen}\n aria-controls={panelId}\n onClick={() => ctx.toggle(id)}\n >\n <span>{title}</span>\n <span className=\"accordion__chev\" aria-hidden=\"true\"><ChevronDown size={14} /></span>\n </button>\n {isOpen && (\n <div\n id={panelId}\n role=\"region\"\n aria-labelledby={triggerId}\n className=\"accordion__panel\"\n >\n {children}\n </div>\n )}\n </div>\n );\n}\n\n// ---------- Breadcrumbs --------------------------------------------------\nexport interface BreadcrumbItem {\n label: React.ReactNode;\n href?: string;\n}\n\nexport function Breadcrumbs({ items, className }: { items: BreadcrumbItem[]; className?: string }) {\n return (\n <nav aria-label=\"Breadcrumb\" className={cx('breadcrumbs', className)}>\n <ol>\n {items.map((it, i) => {\n const last = i === items.length - 1;\n return (\n <li key={i}>\n {it.href && !last ? <a href={it.href}>{it.label}</a> : <span aria-current={last ? 'page' : undefined}>{it.label}</span>}\n {!last && <span aria-hidden=\"true\" className=\"breadcrumbs__sep\">/</span>}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n}\n\n// ---------- TablePagination ---------------------------------------------\n// Convenience wrapper that pairs a page-size selector with a Pagination\n// row. Use it under a DataTable when the table is paginated externally.\nimport { Pagination } from './Inputs';\n\nexport interface TablePaginationProps {\n page: number;\n pageSize: number;\n total: number;\n onPageChange: (page: number) => void;\n /** If set, renders a page-size selector. Omit for fixed-size pagination. */\n onPageSizeChange?: (size: number) => void;\n /** Options shown in the page-size selector. Default `[10, 25, 50, 100]`. */\n pageSizeOptions?: readonly number[];\n className?: string;\n}\n\nexport function TablePagination({\n page, pageSize, total, onPageChange,\n onPageSizeChange, pageSizeOptions = [10, 25, 50, 100],\n className,\n}: TablePaginationProps) {\n const t = useLocale();\n const selectId = React.useId();\n return (\n <div className={cx('table-pagination', className)}>\n {onPageSizeChange && (\n <label className=\"table-pagination__size\" htmlFor={selectId}>\n <span>{t['pagination.rowsPerPage']}</span>\n <select\n id={selectId}\n className=\"select\"\n value={pageSize}\n onChange={(e) => onPageSizeChange(Number(e.target.value))}\n >\n {pageSizeOptions.map((n) => (\n <option key={n} value={n}>{n}</option>\n ))}\n </select>\n </label>\n )}\n <Pagination\n page={page}\n pageSize={pageSize}\n total={total}\n onPageChange={onPageChange}\n />\n </div>\n );\n}\n\n// ---------- TableToolbar -------------------------------------------------\n// Barra superior que se compone arriba (o dentro de un wrapper) de un DataTable.\n// Cualquier hijo con className \"grow\" se expande para empujar las acciones al lado.\nexport const TableToolbar = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n function TableToolbar({ className, ...rest }, ref) {\n return <div ref={ref} className={cx('table-toolbar', className)} {...rest} />;\n }\n);\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Editing.tsx"],"names":["React","useLocale","jsx","Modal","jsxs","Fragment","cx","Checkbox","ChevronRight","ChevronLeft"],"mappings":"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","file":"chunk-NYZXNKMS.js","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { Modal } from './Overlay';\nimport { ChevronLeft, ChevronRight } 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"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/locale/es.ts","../src/locale/LocaleProvider.tsx"],"names":["React"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAEO,IAAM,UAAA,GAA4B;AAAA;AAAA,EAEvC,cAAA,EAAgB,QAAA;AAAA,EAChB,eAAA,EAAiB,UAAA;AAAA,EACjB,gBAAA,EAAkB,WAAA;AAAA,EAClB,cAAA,EAAgB,SAAA;AAAA,EAChB,cAAA,EAAgB,SAAA;AAAA,EAChB,aAAA,EAAe,QAAA;AAAA,EACf,cAAA,EAAgB,UAAA;AAAA,EAChB,gBAAA,EAAkB,UAAA;AAAA,EAClB,eAAA,EAAiB,cAAA;AAAA,EACjB,kBAAA,EAAoB,gBAAA;AAAA;AAAA,EAGpB,aAAA,EAAe,QAAA;AAAA,EACf,cAAA,EAAgB,QAAA;AAAA,EAChB,aAAA,EAAe,QAAA;AAAA;AAAA,EAGf,aAAA,EAAe,WAAA;AAAA,EACf,iBAAA,EAAmB,kBAAA;AAAA,EACnB,iBAAA,EAAmB,qBAAA;AAAA,EACnB,iBAAA,EAAmB,aAAA;AAAA,EACnB,iBAAA,EAAmB,6BAAA;AAAA,EACnB,oBAAA,EAAsB,SAAA;AAAA;AAAA,EAGtB,kBAAA,EAAoB,yBAAA;AAAA,EACpB,qBAAA,EAAuB,YAAA;AAAA,EACvB,qBAAA,EAAuB,eAAA;AAAA;AAAA,EAGvB,aAAA,EAAe,OAAA;AAAA,EACf,cAAA,EAAgB,QAAA;AAAA,EAChB,gBAAA,EAAkB,cAAA;AAAA,EAClB,eAAA,EAAiB,YAAA;AAAA,EACjB,eAAA,EAAiB,KAAA;AAAA,EACjB,mBAAA,EAAqB,MAAA;AAAA,EACrB,kBAAA,EAAoB,WAAA;AAAA,EACpB,uBAAA,EAAyB,CAAC,KAAA,EAAO,KAAA,EAAO,OAAO,QAAA,EAAO,KAAA,EAAO,OAAO,QAAK,CAAA;AAAA,EACzE,qBAAA,EAAuB,CAAC,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,OAAO,KAAK,CAAA;AAAA;AAAA,EAG1G,sBAAA,EAAwB,gBAAA;AAAA,EACxB,4BAAA,EAA8B,iBAAA;AAAA,EAC9B,qBAAA,EAAuB,0BAAA;AAAA,EACvB,qBAAA,EAAuB,gBAAA;AAAA,EACvB,qBAAA,EAAuB,gBAAA;AAAA,EACvB,2BAAA,EAA6B,6BAAA;AAAA,EAC7B,qBAAA,EAAuB,SAAA;AAAA;AAAA,EAGvB,eAAA,EAAiB,SAAA;AAAA,EACjB,eAAA,EAAiB,SAAA;AAAA,EACjB,qBAAA,EAAuB,kBAAA;AAAA,EACvB,qBAAA,EAAuB,oBAAA;AAAA,EACvB,gBAAA,EAAkB,aAAA;AAAA,EAClB,qBAAA,EAAuB,kBAAA;AAAA,EACvB,sBAAA,EAAwB,mBAAA;AAAA;AAAA,EAGxB,oBAAA,EAAsB,aAAA;AAAA,EACtB,mBAAA,EAAqB,WAAA;AAAA,EACrB,yBAAA,EAA2B,uBAAA;AAAA,EAC3B,yBAAA,EAA2B,sBAAA;AAAA,EAC3B,gBAAA,EAAkB,UAAA;AAAA,EAClB,eAAA,EAAiB,QAAA;AAAA,EACjB,YAAA,EAAc,SAAA;AAAA,EACd,YAAA,EAAc,OAAA;AAAA,EACd,aAAA,EAAe,OAAA;AAAA,EACf,YAAA,EAAc,YAAA;AAAA;AAAA,EAGd,qBAAA,EAAuB,cAAA;AAAA,EACvB,uBAAA,EAAyB,cAAA;AAAA,EACzB,oBAAA,EAAsB,WAAA;AAAA,EACtB,uBAAA,EAAyB,sBAAA;AAAA;AAAA,EAGzB,sBAAA,EAAwB,6BAAA;AAAA,EACxB,eAAA,EAAiB,QAAA;AAAA,EACjB,sBAAA,EAAwB,cAAA;AAAA,EACxB,uBAAA,EAAyB,mBAAA;AAAA,EACzB,mBAAA,EAAqB,uBAAA;AAAA,EACrB,oBAAA,EAAsB,iBAAA;AAAA,EACtB,sBAAA,EAAwB,kBAAA;AAAA;AAAA,EAGxB,oBAAA,EAAsB,YAAA;AAAA,EACtB,gBAAA,EAAkB,iBAAA;AAAA,EAClB,cAAA,EAAgB,iBAAA;AAAA,EAChB,cAAA,EAAgB,kBAAA;AAAA,EAChB,eAAA,EAAiB,QAAA;AAAA,EACjB,qBAAA,EAAuB,YAAA;AAAA;AAAA,EAGvB,aAAA,EAAe,eAAA;AAAA,EACf,iBAAA,EAAmB,UAAA;AAAA,EACnB,aAAA,EAAe,QAAA;AAAA;AAAA,EAGf,oBAAA,EAAsB,cAAA;AAAA,EACtB,oBAAA,EAAsB,eAAA;AAAA,EACtB,iBAAA,EAAmB,UAAA;AAAA,EACnB,mBAAA,EAAqB,UAAA;AAAA,EACrB,mBAAA,EAAqB,CAAC,KAAA,EAAO,KAAA,EAAO,UAAO,KAAA,EAAO,KAAA,EAAO,UAAO,KAAK,CAAA;AAAA,EACrE,iBAAA,EAAmB;AAAA,IACjB,OAAA;AAAA,IAAS,SAAA;AAAA,IAAW,OAAA;AAAA,IAAS,OAAA;AAAA,IAAS,MAAA;AAAA,IAAQ,OAAA;AAAA,IAC9C,OAAA;AAAA,IAAS,QAAA;AAAA,IAAU,YAAA;AAAA,IAAc,SAAA;AAAA,IAAW,WAAA;AAAA,IAAa;AAAA,GAC3D;AAAA;AAAA,EAGA,qBAAA,EAAuB,kBAAA;AAAA,EACvB,uBAAA,EAAyB,sBAAA;AAAA,EACzB,oBAAA,EAAsB,mBAAA;AAAA,EACtB,uBAAA,EAAyB,uBAAA;AAAA,EACzB,uBAAA,EAAyB,oBAAA;AAAA,EACzB,iBAAA,EAAmB,iBAAA;AAAA,EACnB,iBAAA,EAAmB,kBAAA;AAAA,EACnB,mBAAA,EAAqB,oBAAA;AAAA,EACrB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,mBAAA,EAAqB,sBAAA;AAAA,EACrB,oBAAA,EAAsB,mBAAA;AAAA,EACtB,sBAAA,EAAwB,CAAC,GAAA,EAAK,GAAA,EAAK,KAAK,GAAA,EAAK,GAAA,EAAK,KAAK,GAAG,CAAA;AAAA,EAC1D,iBAAA,EAAmB,gBAAA;AAAA,EACnB,kBAAA,EAAoB,8BAAA;AAAA;AAAA,EAGpB,kBAAA,EAAoB,eAAA;AAAA,EACpB,iBAAA,EAAmB,oBAAA;AAAA,EACnB,iBAAA,EAAmB,qBAAA;AAAA,EACnB,kBAAA,EAAoB,6BAAA;AAAA,EACpB,wBAAA,EAA0B,qBAAA;AAAA,EAC1B,uBAAA,EAAyB,WAAA;AAAA,EACzB,uBAAA,EAAyB,UAAA;AAAA;AAAA,EAGzB,mBAAA,EAAqB,UAAA;AAAA,EACrB,sBAAA,EAAwB,oBAAA;AAAA,EACxB,sBAAA,EAAwB,mBAAA;AAAA,EACxB,yBAAA,EAA2B,kBAAA;AAAA,EAC3B,qBAAA,EAAuB,eAAA;AAAA,EACvB,sBAAA,EAAwB,qBAAA;AAAA,EACxB,yBAAA,EAA2B,qBAAA;AAAA,EAC3B,sBAAA,EAAwB,SAAA;AAAA,EACxB,oBAAA,EAAsB,UAAA;AAAA,EACtB,oBAAA,EAAsB,2BAAA;AAAA,EACtB,mBAAA,EAAqB,UAAA;AAAA,EACrB,mBAAA,EAAqB,YAAA;AAAA,EACrB,2BAAA,EAA6B,uBAAA;AAAA,EAC7B,uBAAA,EAAyB,uBAAA;AAAA,EACzB,2BAAA,EAA6B,6BAAA;AAAA,EAC7B,yBAAA,EAA2B,WAAA;AAAA,EAC3B,yBAAA,EAA2B,uBAAA;AAAA;AAAA,EAG3B,kBAAA,EAAoB,cAAA;AAAA,EACpB,uBAAA,EAAyB;AAC3B;AC3JA,IAAM,aAAA,GAAsBA,+BAAoC,IAAI,CAAA;AAW7D,SAAS,cAAA,CAAe,EAAE,QAAA,EAAU,QAAA,EAAS,EAAwB;AAC1E,EAAA,MAAM,MAAA,GAAeA,gBAAA,CAAA,OAAA;AAAA,IACnB,MAAO,QAAA,GAAW,EAAE,GAAG,UAAA,EAAY,GAAG,UAAS,GAAI,UAAA;AAAA,IACnD,CAAC,QAAQ;AAAA,GACX;AACA,EAAA,sCAAQ,aAAA,CAAc,QAAA,EAAd,EAAuB,KAAA,EAAO,QAAS,QAAA,EAAS,CAAA;AAC1D;AAOO,SAAS,SAAA,GAA2B;AACzC,EAAA,OAAaA,gBAAA,CAAA,UAAA,CAAW,aAAa,CAAA,IAAK,UAAA;AAC5C","file":"chunk-U2Z6DGHD.js","sourcesContent":["import type { UiKitMessages } from './messages';\n\nexport const esMessages: UiKitMessages = {\n // Generic actions\n 'common.close': 'Cerrar',\n 'common.cancel': 'Cancelar',\n 'common.confirm': 'Confirmar',\n 'common.apply': 'Aplicar',\n 'common.clear': 'Limpiar',\n 'common.edit': 'Editar',\n 'common.empty': 'Vacío',\n 'common.loading': 'Cargando',\n 'common.search': 'Buscar…',\n 'common.noResults': 'Sin resultados',\n\n // Overlay\n 'modal.close': 'Cerrar',\n 'drawer.close': 'Cerrar',\n 'toast.close': 'Cerrar',\n\n // DataTable\n 'table.empty': 'Sin datos',\n 'table.selectAll': 'Seleccionar todo',\n 'table.selectRow': 'Seleccionar {label}',\n 'table.rowAction': 'Ver {label}',\n 'table.expandRow': 'Expandir detalle de {label}',\n 'table.expandColumn': 'Detalle',\n\n // AppShell\n 'appshell.mainNav': 'Navegación principal',\n 'appshell.breadcrumb': 'Breadcrumb',\n 'appshell.toggleMenu': 'Abrir menú',\n\n // TimeAgo\n 'timeAgo.now': 'ahora',\n 'timeAgo.soon': 'pronto',\n 'timeAgo.minAgo': 'hace {n} min',\n 'timeAgo.minIn': 'en {n} min',\n 'timeAgo.today': 'hoy',\n 'timeAgo.yesterday': 'ayer',\n 'timeAgo.tomorrow': 'mañana',\n 'timeAgo.weekdaysShort': ['dom', 'lun', 'mar', 'mié', 'jue', 'vie', 'sáb'],\n 'timeAgo.monthsShort': ['ene', 'feb', 'mar', 'abr', 'may', 'jun', 'jul', 'ago', 'sep', 'oct', 'nov', 'dic'],\n\n // Notifications\n 'notifications.button': 'Notificaciones',\n 'notifications.unreadSuffix': ' ({n} sin leer)',\n 'notifications.empty': 'No tienes notificaciones',\n 'notifications.panel': 'Notificaciones',\n 'notifications.title': 'Notificaciones',\n 'notifications.markAllRead': 'Marcar todas como leídas',\n 'notifications.clear': 'Limpiar',\n\n // Filters\n 'filters.panel': 'Filtros',\n 'filters.clear': 'Limpiar',\n 'filters.bulkActions': 'Acciones en lote',\n 'filters.deselectAll': 'Deseleccionar todo',\n 'filters.sortBy': 'Ordenar por',\n 'filters.selectedOne': '{n} seleccionado',\n 'filters.selectedMany': '{n} seleccionados',\n\n // Editing\n 'transfer.available': 'Disponibles',\n 'transfer.assigned': 'Asignados',\n 'transfer.assignSelected': 'Asignar seleccionados',\n 'transfer.removeSelected': 'Quitar seleccionados',\n 'transfer.empty': 'Vacío',\n 'descList.edit': 'Editar',\n 'diff.label': 'Cambios',\n 'diff.field': 'Campo',\n 'diff.before': 'Antes',\n 'diff.after': 'Después',\n\n // Permissions\n 'permissions.markAll': 'Marcar todos',\n 'permissions.unmarkAll': 'Quitar todos',\n 'permissions.action': 'Acción',\n 'permissions.cellLabel': '{action} para {role}',\n\n // Comments\n 'comments.placeholder': 'Escribe un comentario…',\n 'comments.send': 'Enviar',\n 'comments.internalTag': 'Nota interna',\n 'comments.internalOnly': 'Solo nota interna',\n 'attachments.empty': 'Sin archivos adjuntos',\n 'attachments.remove': 'Eliminar {name}',\n 'attachments.download': 'Descargar {name}',\n\n // Gallery\n 'gallery.thumbnails': 'Miniaturas',\n 'gallery.viewer': 'Visor de imagen',\n 'gallery.prev': 'Imagen anterior',\n 'gallery.next': 'Imagen siguiente',\n 'gallery.close': 'Cerrar',\n 'gallery.imageNumber': 'Imagen {n}',\n\n // Display\n 'alert.close': 'Cerrar alerta',\n 'spinner.loading': 'Cargando',\n 'chip.remove': 'Quitar',\n\n // Display3 — Calendar\n 'calendar.prevMonth': 'Mes anterior',\n 'calendar.nextMonth': 'Mes siguiente',\n 'calendar.expand': 'Expandir',\n 'calendar.collapse': 'Colapsar',\n 'calendar.weekdays': ['Lun', 'Mar', 'Mié', 'Jue', 'Vie', 'Sáb', 'Dom'],\n 'calendar.months': [\n 'Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio',\n 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre',\n ],\n\n // Pickers\n 'picker.openCalendar': 'Abrir calendario',\n 'picker.clearSelection': 'Limpiar selección',\n 'picker.selectRange': 'Seleccionar rango',\n 'picker.searchCommands': 'Buscar comandos…',\n 'picker.commandPalette': 'Paleta de comandos',\n 'picker.prevYear': 'Año anterior',\n 'picker.nextYear': 'Año siguiente',\n 'picker.prevDecade': 'Década anterior',\n 'picker.nextDecade': 'Década siguiente',\n 'picker.selectYear': 'Selecciona el año',\n 'picker.selectMonth': 'Selecciona el mes',\n 'picker.weekdaysShort': ['L', 'M', 'M', 'J', 'V', 'S', 'D'],\n 'combobox.remove': 'Quitar {label}',\n 'fileUpload.title': 'Arrastra archivos o haz clic',\n\n // Inputs\n 'pagination.label': 'Paginación',\n 'pagination.prev': 'Página anterior',\n 'pagination.next': 'Página siguiente',\n 'pagination.range': '{from}–{to} de {total}',\n 'pagination.rowsPerPage': 'Filas por página',\n 'numberInput.decrement': 'Disminuir',\n 'numberInput.increment': 'Aumentar',\n\n // Commerce\n 'commerce.quantity': 'Cantidad',\n 'commerce.decreaseQty': 'Disminuir cantidad',\n 'commerce.increaseQty': 'Aumentar cantidad',\n 'commerce.removeFromCart': 'Quitar del carro',\n 'commerce.removeItem': 'Quitar {name}',\n 'commerce.addFavorite': 'Agregar a favoritos',\n 'commerce.removeFavorite': 'Quitar de favoritos',\n 'commerce.applyCoupon': 'Aplicar',\n 'commerce.cartTitle': 'Tu carro',\n 'commerce.cartEmpty': 'Tu carro está vacío',\n 'commerce.subtotal': 'Subtotal',\n 'commerce.checkout': 'Ir a pagar',\n 'commerce.promoPlaceholder': 'Código promocional',\n 'commerce.promoInvalid': 'Código inválido',\n 'commerce.shippingAchieved': '¡Tienes envío gratis!',\n 'commerce.shippingPrefix': 'Te falta ',\n 'commerce.shippingSuffix': ' para envío gratis',\n\n // Tags input\n 'tagsInput.remove': 'Quitar {tag}',\n 'tagsInput.placeholder': 'Escribe y Enter…',\n};\n","'use client';\nimport * as React from 'react';\nimport type { UiKitMessages } from './messages';\nimport { esMessages } from './es';\n\nconst LocaleContext = React.createContext<UiKitMessages | null>(null);\n\nexport interface LocaleProviderProps {\n /**\n * Partial dict of overrides. Missing keys fall back to `esMessages`,\n * so consumers can translate just a few strings without re-declaring all.\n */\n messages?: Partial<UiKitMessages>;\n children: React.ReactNode;\n}\n\nexport function LocaleProvider({ messages, children }: LocaleProviderProps) {\n const merged = React.useMemo<UiKitMessages>(\n () => (messages ? { ...esMessages, ...messages } : esMessages),\n [messages]\n );\n return <LocaleContext.Provider value={merged}>{children}</LocaleContext.Provider>;\n}\n\n/**\n * Returns the active messages dict. Falls back to `esMessages` when no\n * `<LocaleProvider>` is present in the tree, so components remain usable\n * standalone.\n */\nexport function useLocale(): UiKitMessages {\n return React.useContext(LocaleContext) ?? esMessages;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Editing.tsx"],"names":[],"mappings":"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","file":"chunk-VKVWIEDG.mjs","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { Modal } from './Overlay';\nimport { ChevronLeft, ChevronRight } 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"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/locale/es.ts","../src/locale/LocaleProvider.tsx"],"names":[],"mappings":"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","file":"chunk-WWAUCHWD.mjs","sourcesContent":["import type { UiKitMessages } from './messages';\n\nexport const esMessages: UiKitMessages = {\n // Generic actions\n 'common.close': 'Cerrar',\n 'common.cancel': 'Cancelar',\n 'common.confirm': 'Confirmar',\n 'common.apply': 'Aplicar',\n 'common.clear': 'Limpiar',\n 'common.edit': 'Editar',\n 'common.empty': 'Vacío',\n 'common.loading': 'Cargando',\n 'common.search': 'Buscar…',\n 'common.noResults': 'Sin resultados',\n\n // Overlay\n 'modal.close': 'Cerrar',\n 'drawer.close': 'Cerrar',\n 'toast.close': 'Cerrar',\n\n // DataTable\n 'table.empty': 'Sin datos',\n 'table.selectAll': 'Seleccionar todo',\n 'table.selectRow': 'Seleccionar {label}',\n 'table.rowAction': 'Ver {label}',\n 'table.expandRow': 'Expandir detalle de {label}',\n 'table.expandColumn': 'Detalle',\n\n // AppShell\n 'appshell.mainNav': 'Navegación principal',\n 'appshell.breadcrumb': 'Breadcrumb',\n 'appshell.toggleMenu': 'Abrir menú',\n\n // TimeAgo\n 'timeAgo.now': 'ahora',\n 'timeAgo.soon': 'pronto',\n 'timeAgo.minAgo': 'hace {n} min',\n 'timeAgo.minIn': 'en {n} min',\n 'timeAgo.today': 'hoy',\n 'timeAgo.yesterday': 'ayer',\n 'timeAgo.tomorrow': 'mañana',\n 'timeAgo.weekdaysShort': ['dom', 'lun', 'mar', 'mié', 'jue', 'vie', 'sáb'],\n 'timeAgo.monthsShort': ['ene', 'feb', 'mar', 'abr', 'may', 'jun', 'jul', 'ago', 'sep', 'oct', 'nov', 'dic'],\n\n // Notifications\n 'notifications.button': 'Notificaciones',\n 'notifications.unreadSuffix': ' ({n} sin leer)',\n 'notifications.empty': 'No tienes notificaciones',\n 'notifications.panel': 'Notificaciones',\n 'notifications.title': 'Notificaciones',\n 'notifications.markAllRead': 'Marcar todas como leídas',\n 'notifications.clear': 'Limpiar',\n\n // Filters\n 'filters.panel': 'Filtros',\n 'filters.clear': 'Limpiar',\n 'filters.bulkActions': 'Acciones en lote',\n 'filters.deselectAll': 'Deseleccionar todo',\n 'filters.sortBy': 'Ordenar por',\n 'filters.selectedOne': '{n} seleccionado',\n 'filters.selectedMany': '{n} seleccionados',\n\n // Editing\n 'transfer.available': 'Disponibles',\n 'transfer.assigned': 'Asignados',\n 'transfer.assignSelected': 'Asignar seleccionados',\n 'transfer.removeSelected': 'Quitar seleccionados',\n 'transfer.empty': 'Vacío',\n 'descList.edit': 'Editar',\n 'diff.label': 'Cambios',\n 'diff.field': 'Campo',\n 'diff.before': 'Antes',\n 'diff.after': 'Después',\n\n // Permissions\n 'permissions.markAll': 'Marcar todos',\n 'permissions.unmarkAll': 'Quitar todos',\n 'permissions.action': 'Acción',\n 'permissions.cellLabel': '{action} para {role}',\n\n // Comments\n 'comments.placeholder': 'Escribe un comentario…',\n 'comments.send': 'Enviar',\n 'comments.internalTag': 'Nota interna',\n 'comments.internalOnly': 'Solo nota interna',\n 'attachments.empty': 'Sin archivos adjuntos',\n 'attachments.remove': 'Eliminar {name}',\n 'attachments.download': 'Descargar {name}',\n\n // Gallery\n 'gallery.thumbnails': 'Miniaturas',\n 'gallery.viewer': 'Visor de imagen',\n 'gallery.prev': 'Imagen anterior',\n 'gallery.next': 'Imagen siguiente',\n 'gallery.close': 'Cerrar',\n 'gallery.imageNumber': 'Imagen {n}',\n\n // Display\n 'alert.close': 'Cerrar alerta',\n 'spinner.loading': 'Cargando',\n 'chip.remove': 'Quitar',\n\n // Display3 — Calendar\n 'calendar.prevMonth': 'Mes anterior',\n 'calendar.nextMonth': 'Mes siguiente',\n 'calendar.expand': 'Expandir',\n 'calendar.collapse': 'Colapsar',\n 'calendar.weekdays': ['Lun', 'Mar', 'Mié', 'Jue', 'Vie', 'Sáb', 'Dom'],\n 'calendar.months': [\n 'Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio',\n 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre',\n ],\n\n // Pickers\n 'picker.openCalendar': 'Abrir calendario',\n 'picker.clearSelection': 'Limpiar selección',\n 'picker.selectRange': 'Seleccionar rango',\n 'picker.searchCommands': 'Buscar comandos…',\n 'picker.commandPalette': 'Paleta de comandos',\n 'picker.prevYear': 'Año anterior',\n 'picker.nextYear': 'Año siguiente',\n 'picker.prevDecade': 'Década anterior',\n 'picker.nextDecade': 'Década siguiente',\n 'picker.selectYear': 'Selecciona el año',\n 'picker.selectMonth': 'Selecciona el mes',\n 'picker.weekdaysShort': ['L', 'M', 'M', 'J', 'V', 'S', 'D'],\n 'combobox.remove': 'Quitar {label}',\n 'fileUpload.title': 'Arrastra archivos o haz clic',\n\n // Inputs\n 'pagination.label': 'Paginación',\n 'pagination.prev': 'Página anterior',\n 'pagination.next': 'Página siguiente',\n 'pagination.range': '{from}–{to} de {total}',\n 'pagination.rowsPerPage': 'Filas por página',\n 'numberInput.decrement': 'Disminuir',\n 'numberInput.increment': 'Aumentar',\n\n // Commerce\n 'commerce.quantity': 'Cantidad',\n 'commerce.decreaseQty': 'Disminuir cantidad',\n 'commerce.increaseQty': 'Aumentar cantidad',\n 'commerce.removeFromCart': 'Quitar del carro',\n 'commerce.removeItem': 'Quitar {name}',\n 'commerce.addFavorite': 'Agregar a favoritos',\n 'commerce.removeFavorite': 'Quitar de favoritos',\n 'commerce.applyCoupon': 'Aplicar',\n 'commerce.cartTitle': 'Tu carro',\n 'commerce.cartEmpty': 'Tu carro está vacío',\n 'commerce.subtotal': 'Subtotal',\n 'commerce.checkout': 'Ir a pagar',\n 'commerce.promoPlaceholder': 'Código promocional',\n 'commerce.promoInvalid': 'Código inválido',\n 'commerce.shippingAchieved': '¡Tienes envío gratis!',\n 'commerce.shippingPrefix': 'Te falta ',\n 'commerce.shippingSuffix': ' para envío gratis',\n\n // Tags input\n 'tagsInput.remove': 'Quitar {tag}',\n 'tagsInput.placeholder': 'Escribe y Enter…',\n};\n","'use client';\nimport * as React from 'react';\nimport type { UiKitMessages } from './messages';\nimport { esMessages } from './es';\n\nconst LocaleContext = React.createContext<UiKitMessages | null>(null);\n\nexport interface LocaleProviderProps {\n /**\n * Partial dict of overrides. Missing keys fall back to `esMessages`,\n * so consumers can translate just a few strings without re-declaring all.\n */\n messages?: Partial<UiKitMessages>;\n children: React.ReactNode;\n}\n\nexport function LocaleProvider({ messages, children }: LocaleProviderProps) {\n const merged = React.useMemo<UiKitMessages>(\n () => (messages ? { ...esMessages, ...messages } : esMessages),\n [messages]\n );\n return <LocaleContext.Provider value={merged}>{children}</LocaleContext.Provider>;\n}\n\n/**\n * Returns the active messages dict. Falls back to `esMessages` when no\n * `<LocaleProvider>` is present in the tree, so components remain usable\n * standalone.\n */\nexport function useLocale(): UiKitMessages {\n return React.useContext(LocaleContext) ?? esMessages;\n}\n"]}
|