@misael703/ui 1.6.0 → 1.7.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/README.md +19 -0
- package/dist/{chunk-MUL2FKYF.js → chunk-3CFWQNYF.js} +3 -3
- package/dist/{chunk-MUL2FKYF.js.map → chunk-3CFWQNYF.js.map} +1 -1
- package/dist/{chunk-LKBYMAGV.js → chunk-3VVQIWWG.js} +4 -4
- package/dist/{chunk-LKBYMAGV.js.map → chunk-3VVQIWWG.js.map} +1 -1
- package/dist/{chunk-ZRBVYPKN.js → chunk-3XXTCTFO.js} +7 -7
- package/dist/{chunk-ZRBVYPKN.js.map → chunk-3XXTCTFO.js.map} +1 -1
- package/dist/{chunk-DW3XAXHR.mjs → chunk-4Z63PIAZ.mjs} +4 -4
- package/dist/{chunk-DW3XAXHR.mjs.map → chunk-4Z63PIAZ.mjs.map} +1 -1
- package/dist/{chunk-WLDQP4KD.mjs → chunk-5DWCCPPV.mjs} +3 -3
- package/dist/{chunk-WLDQP4KD.mjs.map → chunk-5DWCCPPV.mjs.map} +1 -1
- package/dist/{chunk-PROKTOL7.js → chunk-6JA4KQU2.js} +5 -5
- package/dist/{chunk-PROKTOL7.js.map → chunk-6JA4KQU2.js.map} +1 -1
- package/dist/{chunk-LIGJBHXU.js → chunk-6TYPG7MA.js} +2 -2
- package/dist/{chunk-LIGJBHXU.js.map → chunk-6TYPG7MA.js.map} +1 -1
- package/dist/{chunk-7D6Y33UY.mjs → chunk-7AD35TKY.mjs} +19 -7
- package/dist/chunk-7AD35TKY.mjs.map +1 -0
- package/dist/{chunk-DJ6MS2WW.js → chunk-7TDM22VA.js} +6 -6
- package/dist/{chunk-DJ6MS2WW.js.map → chunk-7TDM22VA.js.map} +1 -1
- package/dist/{chunk-Z67IZS4P.mjs → chunk-AB6ZXGAB.mjs} +4 -4
- package/dist/{chunk-Z67IZS4P.mjs.map → chunk-AB6ZXGAB.mjs.map} +1 -1
- package/dist/{chunk-S5BIOB34.js → chunk-AYQ7FM6O.js} +21 -9
- package/dist/chunk-AYQ7FM6O.js.map +1 -0
- package/dist/{chunk-QW2CSXPH.mjs → chunk-B4AIJWH5.mjs} +3 -3
- package/dist/{chunk-QW2CSXPH.mjs.map → chunk-B4AIJWH5.mjs.map} +1 -1
- package/dist/{chunk-4P52GDMN.js → chunk-BNE5MWJL.js} +9 -9
- package/dist/{chunk-4P52GDMN.js.map → chunk-BNE5MWJL.js.map} +1 -1
- package/dist/{chunk-EG2NDZDC.js → chunk-BSF3BLLG.js} +9 -9
- package/dist/{chunk-EG2NDZDC.js.map → chunk-BSF3BLLG.js.map} +1 -1
- package/dist/{chunk-TEQ67JKX.js → chunk-CBHWPIHM.js} +8 -2
- package/dist/chunk-CBHWPIHM.js.map +1 -0
- package/dist/{chunk-6RVCYULF.mjs → chunk-DASCOMG5.mjs} +3 -3
- package/dist/{chunk-6RVCYULF.mjs.map → chunk-DASCOMG5.mjs.map} +1 -1
- package/dist/{chunk-IMHLJKYR.mjs → chunk-DCCN5DKJ.mjs} +3 -3
- package/dist/{chunk-IMHLJKYR.mjs.map → chunk-DCCN5DKJ.mjs.map} +1 -1
- package/dist/{chunk-YRACSKAT.js → chunk-DUWKKDMG.js} +10 -10
- package/dist/{chunk-YRACSKAT.js.map → chunk-DUWKKDMG.js.map} +1 -1
- package/dist/{chunk-5KSE4OLY.js → chunk-ENEY7GUY.js} +6 -6
- package/dist/{chunk-5KSE4OLY.js.map → chunk-ENEY7GUY.js.map} +1 -1
- package/dist/{chunk-2JTBLDMK.js → chunk-FEDQKTCX.js} +6 -6
- package/dist/{chunk-2JTBLDMK.js.map → chunk-FEDQKTCX.js.map} +1 -1
- package/dist/{chunk-HVUNNL3A.mjs → chunk-GBHP5WAB.mjs} +4 -4
- package/dist/{chunk-HVUNNL3A.mjs.map → chunk-GBHP5WAB.mjs.map} +1 -1
- package/dist/{chunk-YAORRBMU.js → chunk-HQ6OXFFB.js} +3 -3
- package/dist/{chunk-YAORRBMU.js.map → chunk-HQ6OXFFB.js.map} +1 -1
- package/dist/{chunk-N2Y2KWX5.mjs → chunk-HYPXPSFH.mjs} +3 -3
- package/dist/{chunk-N2Y2KWX5.mjs.map → chunk-HYPXPSFH.mjs.map} +1 -1
- package/dist/{chunk-63HJVJ7O.mjs → chunk-IKQ5QOW5.mjs} +5 -5
- package/dist/{chunk-63HJVJ7O.mjs.map → chunk-IKQ5QOW5.mjs.map} +1 -1
- package/dist/{chunk-KKOJI25C.mjs → chunk-IUL73666.mjs} +2 -2
- package/dist/{chunk-KKOJI25C.mjs.map → chunk-IUL73666.mjs.map} +1 -1
- package/dist/{chunk-UNOPDYA7.js → chunk-JPPRP5R7.js} +8 -8
- package/dist/{chunk-UNOPDYA7.js.map → chunk-JPPRP5R7.js.map} +1 -1
- package/dist/{chunk-3TNBETXR.js → chunk-KJ7UNUTB.js} +6 -6
- package/dist/{chunk-3TNBETXR.js.map → chunk-KJ7UNUTB.js.map} +1 -1
- package/dist/{chunk-W37Y2YFM.mjs → chunk-KR6HECTR.mjs} +3 -3
- package/dist/{chunk-W37Y2YFM.mjs.map → chunk-KR6HECTR.mjs.map} +1 -1
- package/dist/{chunk-WVN5JJVV.js → chunk-LGK6TTB7.js} +3 -3
- package/dist/{chunk-WVN5JJVV.js.map → chunk-LGK6TTB7.js.map} +1 -1
- package/dist/{chunk-VR4OXVKE.js → chunk-MYDEWEFM.js} +3 -3
- package/dist/{chunk-VR4OXVKE.js.map → chunk-MYDEWEFM.js.map} +1 -1
- package/dist/{chunk-JWGK5HKF.mjs → chunk-MYRWQRLW.mjs} +4 -4
- package/dist/{chunk-JWGK5HKF.mjs.map → chunk-MYRWQRLW.mjs.map} +1 -1
- package/dist/{chunk-IALAIASX.js → chunk-N6A4HU6S.js} +9 -9
- package/dist/{chunk-IALAIASX.js.map → chunk-N6A4HU6S.js.map} +1 -1
- package/dist/{chunk-PCRNKITV.mjs → chunk-PWAIOLZH.mjs} +4 -4
- package/dist/{chunk-PCRNKITV.mjs.map → chunk-PWAIOLZH.mjs.map} +1 -1
- package/dist/{chunk-ZRFSTYRL.mjs → chunk-Q4BKGBTV.mjs} +8 -2
- package/dist/chunk-Q4BKGBTV.mjs.map +1 -0
- package/dist/{chunk-UB2XEZ7C.mjs → chunk-QQ5PBPAB.mjs} +4 -4
- package/dist/{chunk-UB2XEZ7C.mjs.map → chunk-QQ5PBPAB.mjs.map} +1 -1
- package/dist/{chunk-YXSKREHS.mjs → chunk-RJMMD7CG.mjs} +5 -5
- package/dist/{chunk-YXSKREHS.mjs.map → chunk-RJMMD7CG.mjs.map} +1 -1
- package/dist/{chunk-X6VCY7MD.mjs → chunk-S6BMFQ6C.mjs} +3 -3
- package/dist/{chunk-X6VCY7MD.mjs.map → chunk-S6BMFQ6C.mjs.map} +1 -1
- package/dist/{chunk-5A3MDLEZ.js → chunk-U2VSTPA2.js} +201 -7
- package/dist/chunk-U2VSTPA2.js.map +1 -0
- package/dist/{chunk-V7MK42GX.js → chunk-UEXRPVM3.js} +3 -3
- package/dist/{chunk-V7MK42GX.js.map → chunk-UEXRPVM3.js.map} +1 -1
- package/dist/{chunk-TI5QCUAV.js → chunk-UMPVB4EY.js} +4 -4
- package/dist/{chunk-TI5QCUAV.js.map → chunk-UMPVB4EY.js.map} +1 -1
- package/dist/{chunk-2S6JJYN7.js → chunk-UPVCT4KW.js} +3 -3
- package/dist/{chunk-2S6JJYN7.js.map → chunk-UPVCT4KW.js.map} +1 -1
- package/dist/{chunk-WUTBLHEB.mjs → chunk-UVYE4Q5P.mjs} +197 -5
- package/dist/chunk-UVYE4Q5P.mjs.map +1 -0
- package/dist/{chunk-OCLBAGNF.mjs → chunk-VE4VSGPR.mjs} +3 -3
- package/dist/{chunk-OCLBAGNF.mjs.map → chunk-VE4VSGPR.mjs.map} +1 -1
- package/dist/{chunk-TZG34EYW.js → chunk-VMC5ZD4O.js} +6 -6
- package/dist/{chunk-TZG34EYW.js.map → chunk-VMC5ZD4O.js.map} +1 -1
- package/dist/{chunk-QI4JT3V3.mjs → chunk-VOWDNWV7.mjs} +3 -3
- package/dist/{chunk-QI4JT3V3.mjs.map → chunk-VOWDNWV7.mjs.map} +1 -1
- package/dist/{chunk-LK2PFMDU.js → chunk-VXKEX7T2.js} +13 -13
- package/dist/{chunk-LK2PFMDU.js.map → chunk-VXKEX7T2.js.map} +1 -1
- package/dist/{chunk-M3Y2AH7S.mjs → chunk-WAGSC4QH.mjs} +4 -4
- package/dist/{chunk-M3Y2AH7S.mjs.map → chunk-WAGSC4QH.mjs.map} +1 -1
- package/dist/{chunk-6PEC4RRO.mjs → chunk-WQFNJVKU.mjs} +4 -4
- package/dist/{chunk-6PEC4RRO.mjs.map → chunk-WQFNJVKU.mjs.map} +1 -1
- package/dist/{chunk-IMFQ55KO.js → chunk-X7O37QLL.js} +7 -7
- package/dist/{chunk-IMFQ55KO.js.map → chunk-X7O37QLL.js.map} +1 -1
- package/dist/{chunk-L3TX6KPP.mjs → chunk-XAT6IHFG.mjs} +5 -5
- package/dist/{chunk-L3TX6KPP.mjs.map → chunk-XAT6IHFG.mjs.map} +1 -1
- package/dist/{chunk-3OVWAAGP.mjs → chunk-XVNKVLZZ.mjs} +5 -5
- package/dist/{chunk-3OVWAAGP.mjs.map → chunk-XVNKVLZZ.mjs.map} +1 -1
- package/dist/{chunk-PXCH5Z76.mjs → chunk-XYKOXQUS.mjs} +4 -4
- package/dist/{chunk-PXCH5Z76.mjs.map → chunk-XYKOXQUS.mjs.map} +1 -1
- package/dist/components/AdvancedPickers.js +9 -9
- package/dist/components/AdvancedPickers.mjs +5 -5
- package/dist/components/AppShell.js +4 -4
- package/dist/components/AppShell.mjs +2 -2
- package/dist/components/Comments.js +8 -8
- package/dist/components/Comments.mjs +5 -5
- package/dist/components/Commerce.js +15 -15
- package/dist/components/Commerce.mjs +4 -4
- package/dist/components/ContextMenu.js +3 -3
- package/dist/components/ContextMenu.mjs +2 -2
- package/dist/components/DataTable.js +10 -10
- package/dist/components/DataTable.mjs +4 -4
- package/dist/components/Display.js +13 -13
- package/dist/components/Display.mjs +2 -2
- package/dist/components/Display2.js +6 -6
- package/dist/components/Display2.mjs +2 -2
- package/dist/components/Display3.js +11 -11
- package/dist/components/Display3.mjs +5 -5
- package/dist/components/Editing.js +9 -9
- package/dist/components/Editing.mjs +4 -4
- package/dist/components/Filters.js +7 -7
- package/dist/components/Filters.mjs +3 -3
- package/dist/components/Gallery.js +5 -5
- package/dist/components/Gallery.mjs +3 -3
- package/dist/components/HoverCard.js +3 -3
- package/dist/components/HoverCard.mjs +2 -2
- 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/Layout.js +20 -20
- package/dist/components/Layout.mjs +3 -3
- package/dist/components/Menubar.js +3 -3
- package/dist/components/Menubar.mjs +2 -2
- package/dist/components/NavigationMenu.js +3 -3
- package/dist/components/NavigationMenu.mjs +2 -2
- 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.d.mts +25 -1
- package/dist/components/Pickers.d.ts +25 -1
- package/dist/components/Pickers.js +15 -7
- package/dist/components/Pickers.mjs +4 -4
- package/dist/components/Popover.js +3 -3
- package/dist/components/Popover.mjs +2 -2
- package/dist/components/Toast.js +4 -4
- package/dist/components/Toast.mjs +2 -2
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +314 -306
- package/dist/index.mjs +37 -37
- package/dist/locale/index.d.mts +6 -0
- package/dist/locale/index.d.ts +6 -0
- package/dist/locale/index.js +6 -6
- package/dist/locale/index.mjs +2 -2
- package/dist/styles.css +1 -1
- package/package.json +1 -1
- package/dist/chunk-5A3MDLEZ.js.map +0 -1
- package/dist/chunk-7D6Y33UY.mjs.map +0 -1
- package/dist/chunk-S5BIOB34.js.map +0 -1
- package/dist/chunk-TEQ67JKX.js.map +0 -1
- package/dist/chunk-WUTBLHEB.mjs.map +0 -1
- package/dist/chunk-ZRFSTYRL.mjs.map +0 -1
|
@@ -107,6 +107,12 @@ var esMessages = {
|
|
|
107
107
|
"picker.selectRange": "Seleccionar rango",
|
|
108
108
|
"picker.searchCommands": "Buscar comandos\u2026",
|
|
109
109
|
"picker.commandPalette": "Paleta de comandos",
|
|
110
|
+
"picker.prevYear": "A\xF1o anterior",
|
|
111
|
+
"picker.nextYear": "A\xF1o siguiente",
|
|
112
|
+
"picker.prevDecade": "D\xE9cada anterior",
|
|
113
|
+
"picker.nextDecade": "D\xE9cada siguiente",
|
|
114
|
+
"picker.selectYear": "Selecciona el a\xF1o",
|
|
115
|
+
"picker.selectMonth": "Selecciona el mes",
|
|
110
116
|
"picker.weekdaysShort": ["L", "M", "M", "J", "V", "S", "D"],
|
|
111
117
|
"combobox.remove": "Quitar {label}",
|
|
112
118
|
"fileUpload.title": "Arrastra archivos o haz clic",
|
|
@@ -153,5 +159,5 @@ function useLocale() {
|
|
|
153
159
|
}
|
|
154
160
|
|
|
155
161
|
export { LocaleProvider, esMessages, useLocale };
|
|
156
|
-
//# sourceMappingURL=chunk-
|
|
157
|
-
//# sourceMappingURL=chunk-
|
|
162
|
+
//# sourceMappingURL=chunk-Q4BKGBTV.mjs.map
|
|
163
|
+
//# sourceMappingURL=chunk-Q4BKGBTV.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/locale/es.ts","../src/locale/LocaleProvider.tsx"],"names":[],"mappings":"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","file":"chunk-Q4BKGBTV.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\n // AppShell\n 'appshell.mainNav': 'Navegación principal',\n 'appshell.expandMenu': 'Expandir menú',\n 'appshell.collapseMenu': 'Colapsar menú',\n 'appshell.expand': 'Expandir',\n 'appshell.collapse': 'Colapsar',\n 'appshell.openMenu': 'Abrir menú',\n 'appshell.breadcrumb': 'Breadcrumb',\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,6 +1,6 @@
|
|
|
1
1
|
import { Checkbox } from './chunk-GVYZAOWU.mjs';
|
|
2
|
-
import { format } from './chunk-
|
|
3
|
-
import { useLocale } from './chunk-
|
|
2
|
+
import { format } from './chunk-IUL73666.mjs';
|
|
3
|
+
import { useLocale } from './chunk-Q4BKGBTV.mjs';
|
|
4
4
|
import { cx } from './chunk-IEPCH3JB.mjs';
|
|
5
5
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
6
6
|
|
|
@@ -68,5 +68,5 @@ function PermissionMatrix({
|
|
|
68
68
|
}
|
|
69
69
|
|
|
70
70
|
export { PermissionMatrix };
|
|
71
|
-
//# sourceMappingURL=chunk-
|
|
72
|
-
//# sourceMappingURL=chunk-
|
|
71
|
+
//# sourceMappingURL=chunk-QQ5PBPAB.mjs.map
|
|
72
|
+
//# sourceMappingURL=chunk-QQ5PBPAB.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Permissions.tsx"],"names":[],"mappings":"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","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/components/Permissions.tsx"],"names":[],"mappings":"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","file":"chunk-QQ5PBPAB.mjs","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { Checkbox } from './Form';\nimport { useLocale } from '../locale/LocaleProvider';\nimport { format } from '../locale/messages';\n\nexport interface PermissionRole { id: string; label: React.ReactNode }\nexport interface PermissionAction { id: string; label: React.ReactNode; description?: React.ReactNode }\n\nexport interface PermissionMatrixProps extends Omit<React.HTMLAttributes<HTMLTableElement>, 'onChange'> {\n roles: PermissionRole[];\n actions: PermissionAction[];\n /** Map de roleId → set de actionIds permitidos */\n value: Record<string, string[]>;\n onChange: (value: Record<string, string[]>) => void;\n readOnly?: boolean;\n}\n\nexport function PermissionMatrix({\n roles, actions, value, onChange, readOnly, className, ...rest\n}: PermissionMatrixProps) {\n const t = useLocale();\n const has = (roleId: string, actionId: string) => (value[roleId] ?? []).includes(actionId);\n\n const toggle = (roleId: string, actionId: string) => {\n if (readOnly) return;\n const current = new Set(value[roleId] ?? []);\n if (current.has(actionId)) current.delete(actionId);\n else current.add(actionId);\n onChange({ ...value, [roleId]: Array.from(current) });\n };\n\n const toggleAllForRole = (roleId: string, allow: boolean) => {\n if (readOnly) return;\n onChange({ ...value, [roleId]: allow ? actions.map((a) => a.id) : [] });\n };\n\n return (\n <div className={cx('permissions', className)}>\n <table className=\"permissions__table\" {...rest}>\n <thead>\n <tr>\n <th scope=\"col\" className=\"permissions__action-col\">{t['permissions.action']}</th>\n {roles.map((r) => {\n const count = (value[r.id] ?? []).length;\n const all = count === actions.length;\n return (\n <th key={r.id} scope=\"col\" className=\"permissions__role-col\">\n <div className=\"permissions__role-head\">\n <span>{r.label}</span>\n {!readOnly && (\n <button\n type=\"button\"\n className=\"permissions__role-toggle\"\n onClick={() => toggleAllForRole(r.id, !all)}\n >\n {all ? t['permissions.unmarkAll'] : t['permissions.markAll']}\n </button>\n )}\n </div>\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {actions.map((a) => (\n <tr key={a.id}>\n <th scope=\"row\" className=\"permissions__action-cell\">\n <div>{a.label}</div>\n {a.description && <div className=\"permissions__action-desc\">{a.description}</div>}\n </th>\n {roles.map((r) => (\n <td key={r.id} className=\"permissions__cell\">\n <Checkbox\n checked={has(r.id, a.id)}\n disabled={readOnly}\n onChange={() => toggle(r.id, a.id)}\n aria-label={format(t['permissions.cellLabel'], {\n action: typeof a.label === 'string' ? a.label : a.id,\n role: typeof r.label === 'string' ? r.label : r.id,\n })}\n />\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { Drawer } from './chunk-
|
|
2
|
-
import { format } from './chunk-
|
|
1
|
+
import { Drawer } from './chunk-7AD35TKY.mjs';
|
|
2
|
+
import { format } from './chunk-IUL73666.mjs';
|
|
3
3
|
import { getBrand } from './chunk-5GEWIK4T.mjs';
|
|
4
|
-
import { useLocale } from './chunk-
|
|
4
|
+
import { useLocale } from './chunk-Q4BKGBTV.mjs';
|
|
5
5
|
import { Star, Minus, Plus, Check, Heart, Trash, X } from './chunk-CIBJKJV3.mjs';
|
|
6
6
|
import { cx } from './chunk-IEPCH3JB.mjs';
|
|
7
7
|
import * as React from 'react';
|
|
@@ -422,5 +422,5 @@ function CompareTable({ items, attributes, onRemove, className, ...rest }) {
|
|
|
422
422
|
}
|
|
423
423
|
|
|
424
424
|
export { AddressForm, CartDrawer, CompareTable, FreeShippingProgress, OrderSummary, PriceDisplay, PromoCodeInput, QuantitySelector, Rating, VariantSelector, WishlistButton };
|
|
425
|
-
//# sourceMappingURL=chunk-
|
|
426
|
-
//# sourceMappingURL=chunk-
|
|
425
|
+
//# sourceMappingURL=chunk-RJMMD7CG.mjs.map
|
|
426
|
+
//# sourceMappingURL=chunk-RJMMD7CG.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Commerce.tsx"],"names":[],"mappings":"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","file":"chunk-YXSKREHS.mjs","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { Drawer } from './Overlay';\nimport { Heart, Minus, Plus, Star, Trash, X, Check } from './Icons';\nimport { getBrand } from '../brand';\nimport { useLocale } from '../locale/LocaleProvider';\nimport { format } from '../locale/messages';\n\n// ---------- Rating ------------------------------------------------------\nexport interface RatingProps {\n value: number; // 0..max\n max?: number; // default 5\n /** Si se pasa, se vuelve interactivo. */\n onChange?: (value: number) => void;\n size?: number;\n /** Permite medias estrellas (display only). */\n allowHalf?: boolean;\n className?: string;\n ariaLabel?: string;\n}\n\nexport function Rating({\n value, max = 5, onChange, size = 16, allowHalf = true, className, ariaLabel,\n}: RatingProps) {\n const isInteractive = !!onChange;\n return (\n <div\n className={cx('rating', isInteractive && 'rating--interactive', className)}\n role={isInteractive ? 'slider' : 'img'}\n aria-label={ariaLabel ?? `${value} de ${max} estrellas`}\n aria-valuenow={isInteractive ? value : undefined}\n aria-valuemin={isInteractive ? 0 : undefined}\n aria-valuemax={isInteractive ? max : undefined}\n >\n {Array.from({ length: max }, (_, i) => {\n const idx = i + 1;\n const fill = value >= idx ? 1 : (allowHalf && value >= idx - 0.5 ? 0.5 : 0);\n return (\n <button\n key={i}\n type=\"button\"\n className={cx('rating__star', fill === 1 && 'is-full', fill === 0.5 && 'is-half')}\n disabled={!isInteractive}\n onClick={() => onChange?.(idx)}\n aria-label={`${idx} ${idx === 1 ? 'estrella' : 'estrellas'}`}\n >\n <Star size={size} />\n </button>\n );\n })}\n </div>\n );\n}\n\n// ---------- PriceDisplay -----------------------------------------------\nexport interface PriceDisplayProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n amount: number;\n /** Precio original tachado (para descuentos). */\n compareAt?: number;\n /** ISO 4217. Default desde `getBrand().currency`. */\n currency?: string;\n /** BCP 47. Default desde `getBrand().locale`. */\n locale?: string;\n size?: 'sm' | 'md' | 'lg' | 'xl';\n /** Muestra \"% off\" si hay compareAt. Default: true. */\n showDiscount?: boolean;\n}\n\nexport function PriceDisplay({\n amount, compareAt, currency, locale,\n size = 'md', showDiscount = true, className, ...rest\n}: PriceDisplayProps) {\n const brand = getBrand();\n const fmt = (n: number) =>\n new Intl.NumberFormat(locale ?? brand.locale, { style: 'currency', currency: currency ?? brand.currency, maximumFractionDigits: 0 }).format(n);\n\n const hasDiscount = compareAt != null && compareAt > amount;\n const discount = hasDiscount ? Math.round(((compareAt - amount) / compareAt) * 100) : 0;\n\n return (\n <div className={cx('price', `price--${size}`, className)} {...rest}>\n <span className=\"price__amount\">{fmt(amount)}</span>\n {hasDiscount && (\n <>\n <span className=\"price__compare\"><del>{fmt(compareAt)}</del></span>\n {showDiscount && discount > 0 && (\n <span className=\"price__discount\">-{discount}%</span>\n )}\n </>\n )}\n </div>\n );\n}\n\n// ---------- QuantitySelector (compacto) --------------------------------\nexport interface QuantitySelectorProps {\n value: number;\n onChange: (v: number) => void;\n min?: number;\n max?: number;\n step?: number;\n disabled?: boolean;\n size?: 'sm' | 'md';\n className?: string;\n id?: string;\n}\n\nexport function QuantitySelector({\n value, onChange, min = 1, max, step = 1, disabled, size = 'md', className, id,\n}: QuantitySelectorProps) {\n const t = useLocale();\n const set = (next: number) => {\n let v = next;\n if (typeof min === 'number') v = Math.max(min, v);\n if (typeof max === 'number') v = Math.min(max, v);\n onChange(v);\n };\n const dec = () => set(value - step);\n const inc = () => set(value + step);\n return (\n <div className={cx('qty', `qty--${size}`, disabled && 'is-disabled', className)}>\n <button\n type=\"button\"\n className=\"qty__btn\"\n aria-label={t['commerce.decreaseQty']}\n onClick={dec}\n disabled={disabled || (typeof min === 'number' && value <= min)}\n >\n <Minus size={14} />\n </button>\n <input\n id={id}\n type=\"number\"\n className=\"qty__input\"\n value={value}\n min={min}\n max={max}\n step={step}\n disabled={disabled}\n onChange={(e) => set(Number(e.target.value))}\n aria-label={t['commerce.quantity']}\n />\n <button\n type=\"button\"\n className=\"qty__btn\"\n aria-label={t['commerce.increaseQty']}\n onClick={inc}\n disabled={disabled || (typeof max === 'number' && value >= max)}\n >\n <Plus size={14} />\n </button>\n </div>\n );\n}\n\n// ---------- VariantSelector --------------------------------------------\nexport interface VariantOption<T = string> {\n value: T;\n label: React.ReactNode;\n disabled?: boolean;\n /** Color hex/rgb para chips de tipo \"color\". */\n swatch?: string;\n}\n\nexport interface VariantSelectorProps<T = string> {\n label?: React.ReactNode;\n options: VariantOption<T>[];\n value: T | null;\n onChange: (value: T) => void;\n /** 'chip' (default), 'swatch' (círculos de color). */\n appearance?: 'chip' | 'swatch';\n className?: string;\n}\n\nexport function VariantSelector<T extends string | number = string>({\n label, options, value, onChange, appearance = 'chip', className,\n}: VariantSelectorProps<T>) {\n return (\n <div className={cx('variants', className)}>\n {label && <div className=\"variants__label\">{label}</div>}\n <div className={cx('variants__options', `variants__options--${appearance}`)} role=\"radiogroup\">\n {options.map((o) => {\n const selected = value === o.value;\n if (appearance === 'swatch') {\n return (\n <button\n key={String(o.value)}\n type=\"button\"\n role=\"radio\"\n aria-checked={selected}\n disabled={o.disabled}\n className={cx('variants__swatch', selected && 'is-selected', o.disabled && 'is-disabled')}\n style={{ background: o.swatch }}\n title={typeof o.label === 'string' ? o.label : String(o.value)}\n aria-label={typeof o.label === 'string' ? o.label : String(o.value)}\n onClick={() => onChange(o.value)}\n >\n {selected && <Check size={14} />}\n </button>\n );\n }\n return (\n <button\n key={String(o.value)}\n type=\"button\"\n role=\"radio\"\n aria-checked={selected}\n disabled={o.disabled}\n className={cx('variants__chip', selected && 'is-selected', o.disabled && 'is-disabled')}\n onClick={() => onChange(o.value)}\n >\n {o.label}\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n\n// ---------- WishlistButton ---------------------------------------------\nexport interface WishlistButtonProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'onChange'> {\n active?: boolean;\n onToggle?: (next: boolean) => void;\n size?: number;\n}\n\nexport function WishlistButton({ active = false, onToggle, size = 20, className, ...rest }: WishlistButtonProps) {\n const t = useLocale();\n return (\n <button\n type=\"button\"\n className={cx('wishlist', active && 'is-active', className)}\n aria-label={active ? t['commerce.removeFavorite'] : t['commerce.addFavorite']}\n aria-pressed={active}\n onClick={() => onToggle?.(!active)}\n {...rest}\n >\n <Heart size={size} />\n </button>\n );\n}\n\n// ---------- PromoCodeInput ---------------------------------------------\nexport interface PromoCodeInputProps {\n /** Validador async. Resuelve con un mensaje de éxito o lanza un Error con el mensaje. */\n onApply: (code: string) => Promise<string>;\n placeholder?: string;\n buttonLabel?: string;\n className?: string;\n id?: string;\n}\n\nexport function PromoCodeInput({\n onApply, placeholder,\n buttonLabel, className, id,\n}: PromoCodeInputProps) {\n const [code, setCode] = React.useState('');\n const [state, setState] = React.useState<'idle' | 'loading' | 'success' | 'error'>('idle');\n const [message, setMessage] = React.useState<string | null>(null);\n const t = useLocale();\n const ph = placeholder ?? t['commerce.promoPlaceholder'];\n const btn = buttonLabel ?? t['commerce.applyCoupon'];\n\n const apply = async () => {\n if (!code.trim()) return;\n setState('loading');\n setMessage(null);\n try {\n const msg = await onApply(code.trim());\n setState('success');\n setMessage(msg);\n } catch (err) {\n setState('error');\n setMessage(err instanceof Error ? err.message : t['commerce.promoInvalid']);\n }\n };\n\n return (\n <div className={cx('promo', state === 'success' && 'is-success', state === 'error' && 'is-error', className)}>\n <div className=\"promo__row\">\n <input\n id={id}\n type=\"text\"\n className=\"input promo__input\"\n value={code}\n placeholder={ph}\n disabled={state === 'loading' || state === 'success'}\n onChange={(e) => { setCode(e.target.value.toUpperCase()); if (state !== 'idle') setState('idle'); }}\n onKeyDown={(e) => e.key === 'Enter' && apply()}\n />\n <button\n type=\"button\"\n className=\"btn btn--primary btn--md\"\n disabled={!code.trim() || state === 'loading' || state === 'success'}\n onClick={apply}\n >\n {state === 'loading' ? <span className=\"spinner spinner--inverse\" aria-hidden=\"true\" /> : btn}\n </button>\n </div>\n {message && <div className={cx('promo__message', `promo__message--${state}`)}>{message}</div>}\n </div>\n );\n}\n\n// ---------- FreeShippingProgress ---------------------------------------\nexport interface FreeShippingProgressProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Subtotal actual del cart. */\n current: number;\n /** Threshold para envío gratis. */\n threshold: number;\n currency?: string;\n locale?: string;\n achievedMessage?: React.ReactNode;\n}\n\nexport function FreeShippingProgress({\n current, threshold, currency, locale,\n achievedMessage,\n className, ...rest\n}: FreeShippingProgressProps) {\n const brand = getBrand();\n const t = useLocale();\n const fmt = (n: number) =>\n new Intl.NumberFormat(locale ?? brand.locale, { style: 'currency', currency: currency ?? brand.currency, maximumFractionDigits: 0 }).format(n);\n\n const pct = Math.min(100, (current / threshold) * 100);\n const remaining = Math.max(0, threshold - current);\n const achieved = current >= threshold;\n const successMsg = achievedMessage ?? t['commerce.shippingAchieved'];\n\n return (\n <div className={cx('shipping-progress', achieved && 'is-achieved', className)} {...rest}>\n <div className=\"shipping-progress__text\">\n {achieved ? successMsg : <>{t['commerce.shippingPrefix']}<strong>{fmt(remaining)}</strong>{t['commerce.shippingSuffix']}</>}\n </div>\n <div className=\"shipping-progress__track\" aria-hidden=\"true\">\n <div className=\"shipping-progress__bar\" style={{ width: `${pct}%` }} />\n </div>\n </div>\n );\n}\n\n// ---------- CartDrawer + line items ------------------------------------\nexport interface CartLineItem {\n id: string;\n name: React.ReactNode;\n variant?: React.ReactNode;\n image?: string;\n unitPrice: number;\n quantity: number;\n}\n\nexport interface CartDrawerProps {\n open: boolean;\n onClose: () => void;\n items: CartLineItem[];\n onQuantityChange?: (id: string, qty: number) => void;\n onRemove?: (id: string) => void;\n onCheckout?: () => void;\n freeShippingThreshold?: number;\n currency?: string;\n locale?: string;\n}\n\nexport function CartDrawer({\n open, onClose, items,\n onQuantityChange, onRemove, onCheckout,\n freeShippingThreshold, currency, locale,\n}: CartDrawerProps) {\n const brand = getBrand();\n const t = useLocale();\n const resolvedCurrency = currency ?? brand.currency;\n const resolvedLocale = locale ?? brand.locale;\n const subtotal = items.reduce((sum, it) => sum + it.unitPrice * it.quantity, 0);\n const fmt = (n: number) =>\n new Intl.NumberFormat(resolvedLocale, { style: 'currency', currency: resolvedCurrency, maximumFractionDigits: 0 }).format(n);\n\n return (\n <Drawer\n open={open}\n onClose={onClose}\n title={t['commerce.cartTitle']}\n footer={\n <div className=\"cart__footer\">\n {freeShippingThreshold != null && (\n <FreeShippingProgress current={subtotal} threshold={freeShippingThreshold} currency={resolvedCurrency} locale={resolvedLocale} />\n )}\n <div className=\"cart__totals\">\n <span>{t['commerce.subtotal']}</span>\n <strong>{fmt(subtotal)}</strong>\n </div>\n <button type=\"button\" className=\"btn btn--primary btn--lg btn--block\" disabled={items.length === 0} onClick={onCheckout}>\n {t['commerce.checkout']}\n </button>\n </div>\n }\n >\n {items.length === 0 ? (\n <div className=\"cart__empty\">{t['commerce.cartEmpty']}</div>\n ) : (\n <ul className=\"cart__list\">\n {items.map((it) => (\n <li key={it.id} className=\"cart__item\">\n <div className=\"cart__item-media\">\n {it.image ? <img src={it.image} alt=\"\" /> : <div className=\"cart__item-placeholder\" />}\n </div>\n <div className=\"cart__item-body\">\n <div className=\"cart__item-name\">{it.name}</div>\n {it.variant && <div className=\"cart__item-variant\">{it.variant}</div>}\n <div className=\"cart__item-price\">{fmt(it.unitPrice)}</div>\n </div>\n <div className=\"cart__item-actions\">\n {onQuantityChange ? (\n <QuantitySelector\n size=\"sm\"\n value={it.quantity}\n onChange={(q) => onQuantityChange(it.id, q)}\n />\n ) : (\n <span className=\"cart__item-qty\">x{it.quantity}</span>\n )}\n {onRemove && (\n <button\n type=\"button\"\n className=\"cart__item-remove\"\n aria-label={t['commerce.removeFromCart']}\n onClick={() => onRemove(it.id)}\n >\n <Trash size={14} />\n </button>\n )}\n </div>\n </li>\n ))}\n </ul>\n )}\n </Drawer>\n );\n}\n\n// ---------- OrderSummary ------------------------------------------------\nexport interface OrderLineRow {\n label: React.ReactNode;\n value: React.ReactNode;\n /** Aplica estilo de total (negrita, más grande). */\n emphasis?: boolean;\n}\n\nexport interface OrderSummaryProps extends Omit<React.HTMLAttributes<HTMLDListElement>, 'title'> {\n rows: OrderLineRow[];\n title?: React.ReactNode;\n}\n\nexport function OrderSummary({ rows, title, className, ...rest }: OrderSummaryProps) {\n return (\n <div className={cx('order-summary', className)}>\n {title && <div className=\"order-summary__title\">{title}</div>}\n <dl className=\"order-summary__list\" {...rest}>\n {rows.map((r, i) => (\n <div key={i} className={cx('order-summary__row', r.emphasis && 'is-emphasis')}>\n <dt>{r.label}</dt>\n <dd>{r.value}</dd>\n </div>\n ))}\n </dl>\n </div>\n );\n}\n\n// ---------- AddressForm (generic field composer) -----------------------\n// The kit doesn't ship country-specific fields. Consumers pass a `fields`\n// array describing which inputs to render and the order. For Chile, that\n// means defining `[{ key: 'rut', ... }, { key: 'comuna', ... }, ...]` in\n// app code. For other markets, define different fields.\n//\n// Layout: each field declares its `width` ('full' | 'half' | 'third').\n// The form renders in a 6-column CSS grid, where 'full' spans 6, 'half'\n// spans 3, and 'third' spans 2. On narrow viewports everything stacks.\n\nexport interface AddressFieldOption {\n value: string;\n label: React.ReactNode;\n}\n\nexport interface AddressField {\n /** Key del campo en el objeto `value`. */\n key: string;\n label: React.ReactNode;\n type?: 'text' | 'select' | 'textarea';\n placeholder?: string;\n /** Solo para `type: 'select'`. */\n options?: readonly AddressFieldOption[];\n /** Placeholder de la opción vacía. Default: 'Selecciona…' (locale: `common.search` no aplica). */\n selectPlaceholder?: string;\n /** Anchura en una grilla de 6 columnas. Default: 'full'. */\n width?: 'full' | 'half' | 'third';\n /** Solo para `type: 'textarea'`. */\n rows?: number;\n}\n\nexport interface AddressFormProps {\n fields: AddressField[];\n value: Record<string, string>;\n onChange: (value: Record<string, string>) => void;\n className?: string;\n}\n\nexport function AddressForm({ fields, value, onChange, className }: AddressFormProps) {\n const reactId = React.useId();\n const set = (key: string, v: string) => onChange({ ...value, [key]: v });\n\n return (\n <div className={cx('address-form', className)}>\n {fields.map((f) => {\n const id = `${reactId}-${f.key}`;\n const width = f.width ?? 'full';\n const v = value[f.key] ?? '';\n return (\n <div key={f.key} className={cx('form-field', `address-form__field--${width}`)}>\n <label className=\"label\" htmlFor={id}>{f.label}</label>\n {f.type === 'select' ? (\n <select\n id={id}\n className=\"select\"\n value={v}\n onChange={(e) => set(f.key, e.target.value)}\n >\n <option value=\"\">{f.selectPlaceholder ?? 'Selecciona…'}</option>\n {f.options?.map((o) => (\n <option key={o.value} value={o.value}>\n {typeof o.label === 'string' ? o.label : o.value}\n </option>\n ))}\n </select>\n ) : f.type === 'textarea' ? (\n <textarea\n id={id}\n className=\"textarea\"\n value={v}\n placeholder={f.placeholder}\n rows={f.rows ?? 2}\n onChange={(e) => set(f.key, e.target.value)}\n />\n ) : (\n <input\n id={id}\n className=\"input\"\n value={v}\n placeholder={f.placeholder}\n onChange={(e) => set(f.key, e.target.value)}\n />\n )}\n </div>\n );\n })}\n </div>\n );\n}\n\n// ---------- CompareTable -----------------------------------------------\nexport interface CompareItem {\n id: string;\n name: React.ReactNode;\n image?: string;\n price?: React.ReactNode;\n}\n\nexport interface CompareAttribute {\n key: string;\n label: React.ReactNode;\n /** Valor por item, indexado por id. */\n values: Record<string, React.ReactNode>;\n}\n\nexport interface CompareTableProps extends React.HTMLAttributes<HTMLTableElement> {\n items: CompareItem[];\n attributes: CompareAttribute[];\n onRemove?: (id: string) => void;\n}\n\nexport function CompareTable({ items, attributes, onRemove, className, ...rest }: CompareTableProps) {\n const t = useLocale();\n return (\n <div className={cx('compare', className)}>\n <table className=\"compare__table\" {...rest}>\n <thead>\n <tr>\n <th />\n {items.map((it) => (\n <th key={it.id} scope=\"col\">\n <div className=\"compare__head\">\n {it.image && <img src={it.image} alt=\"\" className=\"compare__img\" />}\n <div className=\"compare__name\">{it.name}</div>\n {it.price && <div className=\"compare__price\">{it.price}</div>}\n {onRemove && (\n <button\n type=\"button\"\n className=\"compare__remove\"\n aria-label={format(t['commerce.removeItem'], { name: typeof it.name === 'string' ? it.name : 'item' })}\n onClick={() => onRemove(it.id)}\n >\n <X size={14} />\n </button>\n )}\n </div>\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {attributes.map((attr) => (\n <tr key={attr.key}>\n <th scope=\"row\" className=\"compare__attr\">{attr.label}</th>\n {items.map((it) => (\n <td key={it.id} className=\"compare__cell\">{attr.values[it.id] ?? '—'}</td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/Commerce.tsx"],"names":[],"mappings":"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","file":"chunk-RJMMD7CG.mjs","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { Drawer } from './Overlay';\nimport { Heart, Minus, Plus, Star, Trash, X, Check } from './Icons';\nimport { getBrand } from '../brand';\nimport { useLocale } from '../locale/LocaleProvider';\nimport { format } from '../locale/messages';\n\n// ---------- Rating ------------------------------------------------------\nexport interface RatingProps {\n value: number; // 0..max\n max?: number; // default 5\n /** Si se pasa, se vuelve interactivo. */\n onChange?: (value: number) => void;\n size?: number;\n /** Permite medias estrellas (display only). */\n allowHalf?: boolean;\n className?: string;\n ariaLabel?: string;\n}\n\nexport function Rating({\n value, max = 5, onChange, size = 16, allowHalf = true, className, ariaLabel,\n}: RatingProps) {\n const isInteractive = !!onChange;\n return (\n <div\n className={cx('rating', isInteractive && 'rating--interactive', className)}\n role={isInteractive ? 'slider' : 'img'}\n aria-label={ariaLabel ?? `${value} de ${max} estrellas`}\n aria-valuenow={isInteractive ? value : undefined}\n aria-valuemin={isInteractive ? 0 : undefined}\n aria-valuemax={isInteractive ? max : undefined}\n >\n {Array.from({ length: max }, (_, i) => {\n const idx = i + 1;\n const fill = value >= idx ? 1 : (allowHalf && value >= idx - 0.5 ? 0.5 : 0);\n return (\n <button\n key={i}\n type=\"button\"\n className={cx('rating__star', fill === 1 && 'is-full', fill === 0.5 && 'is-half')}\n disabled={!isInteractive}\n onClick={() => onChange?.(idx)}\n aria-label={`${idx} ${idx === 1 ? 'estrella' : 'estrellas'}`}\n >\n <Star size={size} />\n </button>\n );\n })}\n </div>\n );\n}\n\n// ---------- PriceDisplay -----------------------------------------------\nexport interface PriceDisplayProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n amount: number;\n /** Precio original tachado (para descuentos). */\n compareAt?: number;\n /** ISO 4217. Default desde `getBrand().currency`. */\n currency?: string;\n /** BCP 47. Default desde `getBrand().locale`. */\n locale?: string;\n size?: 'sm' | 'md' | 'lg' | 'xl';\n /** Muestra \"% off\" si hay compareAt. Default: true. */\n showDiscount?: boolean;\n}\n\nexport function PriceDisplay({\n amount, compareAt, currency, locale,\n size = 'md', showDiscount = true, className, ...rest\n}: PriceDisplayProps) {\n const brand = getBrand();\n const fmt = (n: number) =>\n new Intl.NumberFormat(locale ?? brand.locale, { style: 'currency', currency: currency ?? brand.currency, maximumFractionDigits: 0 }).format(n);\n\n const hasDiscount = compareAt != null && compareAt > amount;\n const discount = hasDiscount ? Math.round(((compareAt - amount) / compareAt) * 100) : 0;\n\n return (\n <div className={cx('price', `price--${size}`, className)} {...rest}>\n <span className=\"price__amount\">{fmt(amount)}</span>\n {hasDiscount && (\n <>\n <span className=\"price__compare\"><del>{fmt(compareAt)}</del></span>\n {showDiscount && discount > 0 && (\n <span className=\"price__discount\">-{discount}%</span>\n )}\n </>\n )}\n </div>\n );\n}\n\n// ---------- QuantitySelector (compacto) --------------------------------\nexport interface QuantitySelectorProps {\n value: number;\n onChange: (v: number) => void;\n min?: number;\n max?: number;\n step?: number;\n disabled?: boolean;\n size?: 'sm' | 'md';\n className?: string;\n id?: string;\n}\n\nexport function QuantitySelector({\n value, onChange, min = 1, max, step = 1, disabled, size = 'md', className, id,\n}: QuantitySelectorProps) {\n const t = useLocale();\n const set = (next: number) => {\n let v = next;\n if (typeof min === 'number') v = Math.max(min, v);\n if (typeof max === 'number') v = Math.min(max, v);\n onChange(v);\n };\n const dec = () => set(value - step);\n const inc = () => set(value + step);\n return (\n <div className={cx('qty', `qty--${size}`, disabled && 'is-disabled', className)}>\n <button\n type=\"button\"\n className=\"qty__btn\"\n aria-label={t['commerce.decreaseQty']}\n onClick={dec}\n disabled={disabled || (typeof min === 'number' && value <= min)}\n >\n <Minus size={14} />\n </button>\n <input\n id={id}\n type=\"number\"\n className=\"qty__input\"\n value={value}\n min={min}\n max={max}\n step={step}\n disabled={disabled}\n onChange={(e) => set(Number(e.target.value))}\n aria-label={t['commerce.quantity']}\n />\n <button\n type=\"button\"\n className=\"qty__btn\"\n aria-label={t['commerce.increaseQty']}\n onClick={inc}\n disabled={disabled || (typeof max === 'number' && value >= max)}\n >\n <Plus size={14} />\n </button>\n </div>\n );\n}\n\n// ---------- VariantSelector --------------------------------------------\nexport interface VariantOption<T = string> {\n value: T;\n label: React.ReactNode;\n disabled?: boolean;\n /** Color hex/rgb para chips de tipo \"color\". */\n swatch?: string;\n}\n\nexport interface VariantSelectorProps<T = string> {\n label?: React.ReactNode;\n options: VariantOption<T>[];\n value: T | null;\n onChange: (value: T) => void;\n /** 'chip' (default), 'swatch' (círculos de color). */\n appearance?: 'chip' | 'swatch';\n className?: string;\n}\n\nexport function VariantSelector<T extends string | number = string>({\n label, options, value, onChange, appearance = 'chip', className,\n}: VariantSelectorProps<T>) {\n return (\n <div className={cx('variants', className)}>\n {label && <div className=\"variants__label\">{label}</div>}\n <div className={cx('variants__options', `variants__options--${appearance}`)} role=\"radiogroup\">\n {options.map((o) => {\n const selected = value === o.value;\n if (appearance === 'swatch') {\n return (\n <button\n key={String(o.value)}\n type=\"button\"\n role=\"radio\"\n aria-checked={selected}\n disabled={o.disabled}\n className={cx('variants__swatch', selected && 'is-selected', o.disabled && 'is-disabled')}\n style={{ background: o.swatch }}\n title={typeof o.label === 'string' ? o.label : String(o.value)}\n aria-label={typeof o.label === 'string' ? o.label : String(o.value)}\n onClick={() => onChange(o.value)}\n >\n {selected && <Check size={14} />}\n </button>\n );\n }\n return (\n <button\n key={String(o.value)}\n type=\"button\"\n role=\"radio\"\n aria-checked={selected}\n disabled={o.disabled}\n className={cx('variants__chip', selected && 'is-selected', o.disabled && 'is-disabled')}\n onClick={() => onChange(o.value)}\n >\n {o.label}\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n\n// ---------- WishlistButton ---------------------------------------------\nexport interface WishlistButtonProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'onChange'> {\n active?: boolean;\n onToggle?: (next: boolean) => void;\n size?: number;\n}\n\nexport function WishlistButton({ active = false, onToggle, size = 20, className, ...rest }: WishlistButtonProps) {\n const t = useLocale();\n return (\n <button\n type=\"button\"\n className={cx('wishlist', active && 'is-active', className)}\n aria-label={active ? t['commerce.removeFavorite'] : t['commerce.addFavorite']}\n aria-pressed={active}\n onClick={() => onToggle?.(!active)}\n {...rest}\n >\n <Heart size={size} />\n </button>\n );\n}\n\n// ---------- PromoCodeInput ---------------------------------------------\nexport interface PromoCodeInputProps {\n /** Validador async. Resuelve con un mensaje de éxito o lanza un Error con el mensaje. */\n onApply: (code: string) => Promise<string>;\n placeholder?: string;\n buttonLabel?: string;\n className?: string;\n id?: string;\n}\n\nexport function PromoCodeInput({\n onApply, placeholder,\n buttonLabel, className, id,\n}: PromoCodeInputProps) {\n const [code, setCode] = React.useState('');\n const [state, setState] = React.useState<'idle' | 'loading' | 'success' | 'error'>('idle');\n const [message, setMessage] = React.useState<string | null>(null);\n const t = useLocale();\n const ph = placeholder ?? t['commerce.promoPlaceholder'];\n const btn = buttonLabel ?? t['commerce.applyCoupon'];\n\n const apply = async () => {\n if (!code.trim()) return;\n setState('loading');\n setMessage(null);\n try {\n const msg = await onApply(code.trim());\n setState('success');\n setMessage(msg);\n } catch (err) {\n setState('error');\n setMessage(err instanceof Error ? err.message : t['commerce.promoInvalid']);\n }\n };\n\n return (\n <div className={cx('promo', state === 'success' && 'is-success', state === 'error' && 'is-error', className)}>\n <div className=\"promo__row\">\n <input\n id={id}\n type=\"text\"\n className=\"input promo__input\"\n value={code}\n placeholder={ph}\n disabled={state === 'loading' || state === 'success'}\n onChange={(e) => { setCode(e.target.value.toUpperCase()); if (state !== 'idle') setState('idle'); }}\n onKeyDown={(e) => e.key === 'Enter' && apply()}\n />\n <button\n type=\"button\"\n className=\"btn btn--primary btn--md\"\n disabled={!code.trim() || state === 'loading' || state === 'success'}\n onClick={apply}\n >\n {state === 'loading' ? <span className=\"spinner spinner--inverse\" aria-hidden=\"true\" /> : btn}\n </button>\n </div>\n {message && <div className={cx('promo__message', `promo__message--${state}`)}>{message}</div>}\n </div>\n );\n}\n\n// ---------- FreeShippingProgress ---------------------------------------\nexport interface FreeShippingProgressProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Subtotal actual del cart. */\n current: number;\n /** Threshold para envío gratis. */\n threshold: number;\n currency?: string;\n locale?: string;\n achievedMessage?: React.ReactNode;\n}\n\nexport function FreeShippingProgress({\n current, threshold, currency, locale,\n achievedMessage,\n className, ...rest\n}: FreeShippingProgressProps) {\n const brand = getBrand();\n const t = useLocale();\n const fmt = (n: number) =>\n new Intl.NumberFormat(locale ?? brand.locale, { style: 'currency', currency: currency ?? brand.currency, maximumFractionDigits: 0 }).format(n);\n\n const pct = Math.min(100, (current / threshold) * 100);\n const remaining = Math.max(0, threshold - current);\n const achieved = current >= threshold;\n const successMsg = achievedMessage ?? t['commerce.shippingAchieved'];\n\n return (\n <div className={cx('shipping-progress', achieved && 'is-achieved', className)} {...rest}>\n <div className=\"shipping-progress__text\">\n {achieved ? successMsg : <>{t['commerce.shippingPrefix']}<strong>{fmt(remaining)}</strong>{t['commerce.shippingSuffix']}</>}\n </div>\n <div className=\"shipping-progress__track\" aria-hidden=\"true\">\n <div className=\"shipping-progress__bar\" style={{ width: `${pct}%` }} />\n </div>\n </div>\n );\n}\n\n// ---------- CartDrawer + line items ------------------------------------\nexport interface CartLineItem {\n id: string;\n name: React.ReactNode;\n variant?: React.ReactNode;\n image?: string;\n unitPrice: number;\n quantity: number;\n}\n\nexport interface CartDrawerProps {\n open: boolean;\n onClose: () => void;\n items: CartLineItem[];\n onQuantityChange?: (id: string, qty: number) => void;\n onRemove?: (id: string) => void;\n onCheckout?: () => void;\n freeShippingThreshold?: number;\n currency?: string;\n locale?: string;\n}\n\nexport function CartDrawer({\n open, onClose, items,\n onQuantityChange, onRemove, onCheckout,\n freeShippingThreshold, currency, locale,\n}: CartDrawerProps) {\n const brand = getBrand();\n const t = useLocale();\n const resolvedCurrency = currency ?? brand.currency;\n const resolvedLocale = locale ?? brand.locale;\n const subtotal = items.reduce((sum, it) => sum + it.unitPrice * it.quantity, 0);\n const fmt = (n: number) =>\n new Intl.NumberFormat(resolvedLocale, { style: 'currency', currency: resolvedCurrency, maximumFractionDigits: 0 }).format(n);\n\n return (\n <Drawer\n open={open}\n onClose={onClose}\n title={t['commerce.cartTitle']}\n footer={\n <div className=\"cart__footer\">\n {freeShippingThreshold != null && (\n <FreeShippingProgress current={subtotal} threshold={freeShippingThreshold} currency={resolvedCurrency} locale={resolvedLocale} />\n )}\n <div className=\"cart__totals\">\n <span>{t['commerce.subtotal']}</span>\n <strong>{fmt(subtotal)}</strong>\n </div>\n <button type=\"button\" className=\"btn btn--primary btn--lg btn--block\" disabled={items.length === 0} onClick={onCheckout}>\n {t['commerce.checkout']}\n </button>\n </div>\n }\n >\n {items.length === 0 ? (\n <div className=\"cart__empty\">{t['commerce.cartEmpty']}</div>\n ) : (\n <ul className=\"cart__list\">\n {items.map((it) => (\n <li key={it.id} className=\"cart__item\">\n <div className=\"cart__item-media\">\n {it.image ? <img src={it.image} alt=\"\" /> : <div className=\"cart__item-placeholder\" />}\n </div>\n <div className=\"cart__item-body\">\n <div className=\"cart__item-name\">{it.name}</div>\n {it.variant && <div className=\"cart__item-variant\">{it.variant}</div>}\n <div className=\"cart__item-price\">{fmt(it.unitPrice)}</div>\n </div>\n <div className=\"cart__item-actions\">\n {onQuantityChange ? (\n <QuantitySelector\n size=\"sm\"\n value={it.quantity}\n onChange={(q) => onQuantityChange(it.id, q)}\n />\n ) : (\n <span className=\"cart__item-qty\">x{it.quantity}</span>\n )}\n {onRemove && (\n <button\n type=\"button\"\n className=\"cart__item-remove\"\n aria-label={t['commerce.removeFromCart']}\n onClick={() => onRemove(it.id)}\n >\n <Trash size={14} />\n </button>\n )}\n </div>\n </li>\n ))}\n </ul>\n )}\n </Drawer>\n );\n}\n\n// ---------- OrderSummary ------------------------------------------------\nexport interface OrderLineRow {\n label: React.ReactNode;\n value: React.ReactNode;\n /** Aplica estilo de total (negrita, más grande). */\n emphasis?: boolean;\n}\n\nexport interface OrderSummaryProps extends Omit<React.HTMLAttributes<HTMLDListElement>, 'title'> {\n rows: OrderLineRow[];\n title?: React.ReactNode;\n}\n\nexport function OrderSummary({ rows, title, className, ...rest }: OrderSummaryProps) {\n return (\n <div className={cx('order-summary', className)}>\n {title && <div className=\"order-summary__title\">{title}</div>}\n <dl className=\"order-summary__list\" {...rest}>\n {rows.map((r, i) => (\n <div key={i} className={cx('order-summary__row', r.emphasis && 'is-emphasis')}>\n <dt>{r.label}</dt>\n <dd>{r.value}</dd>\n </div>\n ))}\n </dl>\n </div>\n );\n}\n\n// ---------- AddressForm (generic field composer) -----------------------\n// The kit doesn't ship country-specific fields. Consumers pass a `fields`\n// array describing which inputs to render and the order. For Chile, that\n// means defining `[{ key: 'rut', ... }, { key: 'comuna', ... }, ...]` in\n// app code. For other markets, define different fields.\n//\n// Layout: each field declares its `width` ('full' | 'half' | 'third').\n// The form renders in a 6-column CSS grid, where 'full' spans 6, 'half'\n// spans 3, and 'third' spans 2. On narrow viewports everything stacks.\n\nexport interface AddressFieldOption {\n value: string;\n label: React.ReactNode;\n}\n\nexport interface AddressField {\n /** Key del campo en el objeto `value`. */\n key: string;\n label: React.ReactNode;\n type?: 'text' | 'select' | 'textarea';\n placeholder?: string;\n /** Solo para `type: 'select'`. */\n options?: readonly AddressFieldOption[];\n /** Placeholder de la opción vacía. Default: 'Selecciona…' (locale: `common.search` no aplica). */\n selectPlaceholder?: string;\n /** Anchura en una grilla de 6 columnas. Default: 'full'. */\n width?: 'full' | 'half' | 'third';\n /** Solo para `type: 'textarea'`. */\n rows?: number;\n}\n\nexport interface AddressFormProps {\n fields: AddressField[];\n value: Record<string, string>;\n onChange: (value: Record<string, string>) => void;\n className?: string;\n}\n\nexport function AddressForm({ fields, value, onChange, className }: AddressFormProps) {\n const reactId = React.useId();\n const set = (key: string, v: string) => onChange({ ...value, [key]: v });\n\n return (\n <div className={cx('address-form', className)}>\n {fields.map((f) => {\n const id = `${reactId}-${f.key}`;\n const width = f.width ?? 'full';\n const v = value[f.key] ?? '';\n return (\n <div key={f.key} className={cx('form-field', `address-form__field--${width}`)}>\n <label className=\"label\" htmlFor={id}>{f.label}</label>\n {f.type === 'select' ? (\n <select\n id={id}\n className=\"select\"\n value={v}\n onChange={(e) => set(f.key, e.target.value)}\n >\n <option value=\"\">{f.selectPlaceholder ?? 'Selecciona…'}</option>\n {f.options?.map((o) => (\n <option key={o.value} value={o.value}>\n {typeof o.label === 'string' ? o.label : o.value}\n </option>\n ))}\n </select>\n ) : f.type === 'textarea' ? (\n <textarea\n id={id}\n className=\"textarea\"\n value={v}\n placeholder={f.placeholder}\n rows={f.rows ?? 2}\n onChange={(e) => set(f.key, e.target.value)}\n />\n ) : (\n <input\n id={id}\n className=\"input\"\n value={v}\n placeholder={f.placeholder}\n onChange={(e) => set(f.key, e.target.value)}\n />\n )}\n </div>\n );\n })}\n </div>\n );\n}\n\n// ---------- CompareTable -----------------------------------------------\nexport interface CompareItem {\n id: string;\n name: React.ReactNode;\n image?: string;\n price?: React.ReactNode;\n}\n\nexport interface CompareAttribute {\n key: string;\n label: React.ReactNode;\n /** Valor por item, indexado por id. */\n values: Record<string, React.ReactNode>;\n}\n\nexport interface CompareTableProps extends React.HTMLAttributes<HTMLTableElement> {\n items: CompareItem[];\n attributes: CompareAttribute[];\n onRemove?: (id: string) => void;\n}\n\nexport function CompareTable({ items, attributes, onRemove, className, ...rest }: CompareTableProps) {\n const t = useLocale();\n return (\n <div className={cx('compare', className)}>\n <table className=\"compare__table\" {...rest}>\n <thead>\n <tr>\n <th />\n {items.map((it) => (\n <th key={it.id} scope=\"col\">\n <div className=\"compare__head\">\n {it.image && <img src={it.image} alt=\"\" className=\"compare__img\" />}\n <div className=\"compare__name\">{it.name}</div>\n {it.price && <div className=\"compare__price\">{it.price}</div>}\n {onRemove && (\n <button\n type=\"button\"\n className=\"compare__remove\"\n aria-label={format(t['commerce.removeItem'], { name: typeof it.name === 'string' ? it.name : 'item' })}\n onClick={() => onRemove(it.id)}\n >\n <X size={14} />\n </button>\n )}\n </div>\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {attributes.map((attr) => (\n <tr key={attr.key}>\n <th scope=\"row\" className=\"compare__attr\">{attr.label}</th>\n {items.map((it) => (\n <td key={it.id} className=\"compare__cell\">{attr.values[it.id] ?? '—'}</td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useLocale } from './chunk-
|
|
1
|
+
import { useLocale } from './chunk-Q4BKGBTV.mjs';
|
|
2
2
|
import { Info, AlertCircle, AlertTriangle, CheckCircle, X } from './chunk-CIBJKJV3.mjs';
|
|
3
3
|
import { cx } from './chunk-IEPCH3JB.mjs';
|
|
4
4
|
import * as React from 'react';
|
|
@@ -119,5 +119,5 @@ function useToast() {
|
|
|
119
119
|
}
|
|
120
120
|
|
|
121
121
|
export { ToastProvider, useToast };
|
|
122
|
-
//# sourceMappingURL=chunk-
|
|
123
|
-
//# sourceMappingURL=chunk-
|
|
122
|
+
//# sourceMappingURL=chunk-S6BMFQ6C.mjs.map
|
|
123
|
+
//# sourceMappingURL=chunk-S6BMFQ6C.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Toast.tsx"],"names":[],"mappings":"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","file":"chunk-X6VCY7MD.mjs","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { X, CheckCircle, AlertTriangle, AlertCircle, Info } from './Icons';\nimport { useLocale } from '../locale/LocaleProvider';\nimport { cx } from '../utils/cx';\n\nconst VARIANT_ICON = {\n success: CheckCircle,\n warning: AlertTriangle,\n danger: AlertCircle,\n info: Info,\n} as const;\n\n// Exit animation duration. Must match `--duration-exit` and the\n// `.toast.is-closing` keyframes (`toastSlideOut`) in src/styles/index.css.\nconst EXIT_MS = 150;\n\nexport interface ToastItem {\n id: string;\n title?: React.ReactNode;\n description?: React.ReactNode;\n variant?: 'info' | 'success' | 'warning' | 'danger';\n duration?: number;\n}\n\ninterface ToastContextValue {\n toasts: ToastItem[];\n push: (t: Omit<ToastItem, 'id'>) => string;\n dismiss: (id: string) => void;\n}\n\nconst ToastContext = React.createContext<ToastContextValue | null>(null);\n\ninterface ToastTimerState {\n handle: ReturnType<typeof setTimeout>;\n startedAt: number;\n remaining: number;\n}\n\nexport function ToastProvider({ children }: { children: React.ReactNode }) {\n const [toasts, setToasts] = React.useState<ToastItem[]>([]);\n // Toasts in the closing window: still rendered with `is-closing` class so\n // CSS can play the exit animation, but already removed from new-toast\n // accounting (auto-dismiss timer cancelled, can't be paused/resumed).\n const [closingIds, setClosingIds] = React.useState<Set<string>>(new Set());\n // SSR-safe portal gating. Without this, the first client render emits a\n // `toast-stack` div into document.body via createPortal, while the\n // server-rendered HTML doesn't — Next.js App Router flags it as a\n // hydration mismatch. Starting `mounted=false` keeps the first client\n // render identical to the server; the effect flips it true after\n // hydration and the portal mounts on the next pass.\n const [mounted, setMounted] = React.useState(false);\n React.useEffect(() => setMounted(true), []);\n const timers = React.useRef<Map<string, ToastTimerState>>(new Map());\n const exitTimers = React.useRef<Map<string, ReturnType<typeof setTimeout>>>(new Map());\n const locale = useLocale();\n\n const dismiss = React.useCallback((id: string) => {\n const state = timers.current.get(id);\n if (state) {\n clearTimeout(state.handle);\n timers.current.delete(id);\n }\n // Already in the closing window? skip (idempotent).\n if (exitTimers.current.has(id)) return;\n setClosingIds((prev) => {\n const next = new Set(prev);\n next.add(id);\n return next;\n });\n const handle = setTimeout(() => {\n exitTimers.current.delete(id);\n setToasts((list) => list.filter((toast) => toast.id !== id));\n setClosingIds((prev) => {\n if (!prev.has(id)) return prev;\n const next = new Set(prev);\n next.delete(id);\n return next;\n });\n }, EXIT_MS);\n exitTimers.current.set(id, handle);\n }, []);\n\n const push = React.useCallback(\n (t: Omit<ToastItem, 'id'>) => {\n const id = Math.random().toString(36).slice(2);\n const item: ToastItem = { id, duration: 4000, variant: 'info', ...t };\n setToasts((list) => [...list, item]);\n if (item.duration && item.duration > 0) {\n const handle = setTimeout(() => dismiss(id), item.duration);\n timers.current.set(id, { handle, startedAt: Date.now(), remaining: item.duration });\n }\n return id;\n },\n [dismiss]\n );\n\n // Pause auto-dismiss while pointer is over the toast — users reading a\n // multi-line message shouldn't have it disappear mid-read.\n const pause = React.useCallback((id: string) => {\n const state = timers.current.get(id);\n if (!state) return;\n clearTimeout(state.handle);\n const elapsed = Date.now() - state.startedAt;\n const remaining = Math.max(0, state.remaining - elapsed);\n timers.current.set(id, { ...state, remaining });\n }, []);\n\n const resume = React.useCallback((id: string) => {\n const state = timers.current.get(id);\n if (!state) return;\n const handle = setTimeout(() => dismiss(id), state.remaining);\n timers.current.set(id, { handle, startedAt: Date.now(), remaining: state.remaining });\n }, [dismiss]);\n\n React.useEffect(() => {\n const map = timers.current;\n const exits = exitTimers.current;\n return () => {\n map.forEach((state) => clearTimeout(state.handle));\n map.clear();\n exits.forEach((handle) => clearTimeout(handle));\n exits.clear();\n };\n }, []);\n\n // Portal the stack to body so it isn't clipped by ancestor stacking contexts\n // (overflow:hidden, transform, filter on app shell layouts).\n // aria-atomic intentionally omitted: with `false` (default), screen readers\n // announce only newly added toasts instead of re-reading the entire stack.\n const stack = (\n <div className=\"toast-stack\" aria-live=\"polite\">\n {toasts.map((t) => {\n const variant = t.variant ?? 'info';\n const Icon = VARIANT_ICON[variant];\n return (\n <div\n key={t.id}\n className={cx('toast', `toast--${variant}`, closingIds.has(t.id) && 'is-closing')}\n role=\"status\"\n onMouseEnter={() => pause(t.id)}\n onMouseLeave={() => resume(t.id)}\n onFocus={() => pause(t.id)}\n onBlur={() => resume(t.id)}\n >\n <span className=\"toast__icon\" aria-hidden=\"true\"><Icon size={20} /></span>\n <div className=\"toast__body\">\n {t.title && <div className=\"toast__title\">{t.title}</div>}\n {t.description && <div className=\"toast__desc\">{t.description}</div>}\n </div>\n <button type=\"button\" className=\"toast__close\" aria-label={locale['toast.close']} onClick={() => dismiss(t.id)}><X size={16} /></button>\n </div>\n );\n })}\n </div>\n );\n\n // Memoize the provider value so consumers calling useToast() to access\n // only `push`/`dismiss` (the common case) don't re-render on every state\n // change. Without this, every toast push churned every consumer.\n const ctx = React.useMemo(() => ({ toasts, push, dismiss }), [toasts, push, dismiss]);\n\n return (\n <ToastContext.Provider value={ctx}>\n {children}\n {mounted && typeof document !== 'undefined' && createPortal(stack, document.body)}\n </ToastContext.Provider>\n );\n}\n\nexport function useToast() {\n const ctx = React.useContext(ToastContext);\n if (!ctx) throw new Error('useToast must be used inside <ToastProvider>');\n return ctx;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/Toast.tsx"],"names":[],"mappings":"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","file":"chunk-S6BMFQ6C.mjs","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { X, CheckCircle, AlertTriangle, AlertCircle, Info } from './Icons';\nimport { useLocale } from '../locale/LocaleProvider';\nimport { cx } from '../utils/cx';\n\nconst VARIANT_ICON = {\n success: CheckCircle,\n warning: AlertTriangle,\n danger: AlertCircle,\n info: Info,\n} as const;\n\n// Exit animation duration. Must match `--duration-exit` and the\n// `.toast.is-closing` keyframes (`toastSlideOut`) in src/styles/index.css.\nconst EXIT_MS = 150;\n\nexport interface ToastItem {\n id: string;\n title?: React.ReactNode;\n description?: React.ReactNode;\n variant?: 'info' | 'success' | 'warning' | 'danger';\n duration?: number;\n}\n\ninterface ToastContextValue {\n toasts: ToastItem[];\n push: (t: Omit<ToastItem, 'id'>) => string;\n dismiss: (id: string) => void;\n}\n\nconst ToastContext = React.createContext<ToastContextValue | null>(null);\n\ninterface ToastTimerState {\n handle: ReturnType<typeof setTimeout>;\n startedAt: number;\n remaining: number;\n}\n\nexport function ToastProvider({ children }: { children: React.ReactNode }) {\n const [toasts, setToasts] = React.useState<ToastItem[]>([]);\n // Toasts in the closing window: still rendered with `is-closing` class so\n // CSS can play the exit animation, but already removed from new-toast\n // accounting (auto-dismiss timer cancelled, can't be paused/resumed).\n const [closingIds, setClosingIds] = React.useState<Set<string>>(new Set());\n // SSR-safe portal gating. Without this, the first client render emits a\n // `toast-stack` div into document.body via createPortal, while the\n // server-rendered HTML doesn't — Next.js App Router flags it as a\n // hydration mismatch. Starting `mounted=false` keeps the first client\n // render identical to the server; the effect flips it true after\n // hydration and the portal mounts on the next pass.\n const [mounted, setMounted] = React.useState(false);\n React.useEffect(() => setMounted(true), []);\n const timers = React.useRef<Map<string, ToastTimerState>>(new Map());\n const exitTimers = React.useRef<Map<string, ReturnType<typeof setTimeout>>>(new Map());\n const locale = useLocale();\n\n const dismiss = React.useCallback((id: string) => {\n const state = timers.current.get(id);\n if (state) {\n clearTimeout(state.handle);\n timers.current.delete(id);\n }\n // Already in the closing window? skip (idempotent).\n if (exitTimers.current.has(id)) return;\n setClosingIds((prev) => {\n const next = new Set(prev);\n next.add(id);\n return next;\n });\n const handle = setTimeout(() => {\n exitTimers.current.delete(id);\n setToasts((list) => list.filter((toast) => toast.id !== id));\n setClosingIds((prev) => {\n if (!prev.has(id)) return prev;\n const next = new Set(prev);\n next.delete(id);\n return next;\n });\n }, EXIT_MS);\n exitTimers.current.set(id, handle);\n }, []);\n\n const push = React.useCallback(\n (t: Omit<ToastItem, 'id'>) => {\n const id = Math.random().toString(36).slice(2);\n const item: ToastItem = { id, duration: 4000, variant: 'info', ...t };\n setToasts((list) => [...list, item]);\n if (item.duration && item.duration > 0) {\n const handle = setTimeout(() => dismiss(id), item.duration);\n timers.current.set(id, { handle, startedAt: Date.now(), remaining: item.duration });\n }\n return id;\n },\n [dismiss]\n );\n\n // Pause auto-dismiss while pointer is over the toast — users reading a\n // multi-line message shouldn't have it disappear mid-read.\n const pause = React.useCallback((id: string) => {\n const state = timers.current.get(id);\n if (!state) return;\n clearTimeout(state.handle);\n const elapsed = Date.now() - state.startedAt;\n const remaining = Math.max(0, state.remaining - elapsed);\n timers.current.set(id, { ...state, remaining });\n }, []);\n\n const resume = React.useCallback((id: string) => {\n const state = timers.current.get(id);\n if (!state) return;\n const handle = setTimeout(() => dismiss(id), state.remaining);\n timers.current.set(id, { handle, startedAt: Date.now(), remaining: state.remaining });\n }, [dismiss]);\n\n React.useEffect(() => {\n const map = timers.current;\n const exits = exitTimers.current;\n return () => {\n map.forEach((state) => clearTimeout(state.handle));\n map.clear();\n exits.forEach((handle) => clearTimeout(handle));\n exits.clear();\n };\n }, []);\n\n // Portal the stack to body so it isn't clipped by ancestor stacking contexts\n // (overflow:hidden, transform, filter on app shell layouts).\n // aria-atomic intentionally omitted: with `false` (default), screen readers\n // announce only newly added toasts instead of re-reading the entire stack.\n const stack = (\n <div className=\"toast-stack\" aria-live=\"polite\">\n {toasts.map((t) => {\n const variant = t.variant ?? 'info';\n const Icon = VARIANT_ICON[variant];\n return (\n <div\n key={t.id}\n className={cx('toast', `toast--${variant}`, closingIds.has(t.id) && 'is-closing')}\n role=\"status\"\n onMouseEnter={() => pause(t.id)}\n onMouseLeave={() => resume(t.id)}\n onFocus={() => pause(t.id)}\n onBlur={() => resume(t.id)}\n >\n <span className=\"toast__icon\" aria-hidden=\"true\"><Icon size={20} /></span>\n <div className=\"toast__body\">\n {t.title && <div className=\"toast__title\">{t.title}</div>}\n {t.description && <div className=\"toast__desc\">{t.description}</div>}\n </div>\n <button type=\"button\" className=\"toast__close\" aria-label={locale['toast.close']} onClick={() => dismiss(t.id)}><X size={16} /></button>\n </div>\n );\n })}\n </div>\n );\n\n // Memoize the provider value so consumers calling useToast() to access\n // only `push`/`dismiss` (the common case) don't re-render on every state\n // change. Without this, every toast push churned every consumer.\n const ctx = React.useMemo(() => ({ toasts, push, dismiss }), [toasts, push, dismiss]);\n\n return (\n <ToastContext.Provider value={ctx}>\n {children}\n {mounted && typeof document !== 'undefined' && createPortal(stack, document.body)}\n </ToastContext.Provider>\n );\n}\n\nexport function useToast() {\n const ctx = React.useContext(ToastContext);\n if (!ctx) throw new Error('useToast must be used inside <ToastProvider>');\n return ctx;\n}\n"]}
|