@misael703/ui 1.44.0 → 1.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/dist/{chunk-UOWBU443.js → chunk-3CKTSEVN.js} +3 -3
  2. package/dist/{chunk-UOWBU443.js.map → chunk-3CKTSEVN.js.map} +1 -1
  3. package/dist/{chunk-JHSQYS7K.mjs → chunk-4KZODE2N.mjs} +24 -11
  4. package/dist/chunk-4KZODE2N.mjs.map +1 -0
  5. package/dist/{chunk-UKVNZHD3.mjs → chunk-BKERVGDJ.mjs} +3 -3
  6. package/dist/{chunk-UKVNZHD3.mjs.map → chunk-BKERVGDJ.mjs.map} +1 -1
  7. package/dist/{chunk-C7UG47HQ.js → chunk-BZSOS7QT.js} +3 -3
  8. package/dist/{chunk-C7UG47HQ.js.map → chunk-BZSOS7QT.js.map} +1 -1
  9. package/dist/{chunk-3JYYZOEJ.mjs → chunk-C3A6EWSR.mjs} +3 -3
  10. package/dist/{chunk-3JYYZOEJ.mjs.map → chunk-C3A6EWSR.mjs.map} +1 -1
  11. package/dist/chunk-CTOPKHEE.js +31 -0
  12. package/dist/chunk-CTOPKHEE.js.map +1 -0
  13. package/dist/{chunk-F3PTSBHH.js → chunk-DWLTIERK.js} +3 -3
  14. package/dist/{chunk-F3PTSBHH.js.map → chunk-DWLTIERK.js.map} +1 -1
  15. package/dist/{chunk-565UJQ2M.js → chunk-H4EL7J2O.js} +4 -4
  16. package/dist/{chunk-565UJQ2M.js.map → chunk-H4EL7J2O.js.map} +1 -1
  17. package/dist/{chunk-JFYTJUT3.js → chunk-OPTRFVFT.js} +24 -11
  18. package/dist/chunk-OPTRFVFT.js.map +1 -0
  19. package/dist/{chunk-VOSVV3LL.mjs → chunk-PJA77NAF.mjs} +3 -3
  20. package/dist/{chunk-VOSVV3LL.mjs.map → chunk-PJA77NAF.mjs.map} +1 -1
  21. package/dist/{chunk-FD3Y5IP7.mjs → chunk-UQJMVWM5.mjs} +3 -3
  22. package/dist/{chunk-FD3Y5IP7.mjs.map → chunk-UQJMVWM5.mjs.map} +1 -1
  23. package/dist/{chunk-JJ54RD36.js → chunk-WA4OHLWQ.js} +4 -4
  24. package/dist/{chunk-JJ54RD36.js.map → chunk-WA4OHLWQ.js.map} +1 -1
  25. package/dist/{chunk-7HYCP6SX.mjs → chunk-WGBFNPIT.mjs} +3 -3
  26. package/dist/{chunk-7HYCP6SX.mjs.map → chunk-WGBFNPIT.mjs.map} +1 -1
  27. package/dist/{chunk-YVTAAWIT.js → chunk-WRXBBJZ6.js} +3 -3
  28. package/dist/{chunk-YVTAAWIT.js.map → chunk-WRXBBJZ6.js.map} +1 -1
  29. package/dist/chunk-WYOJ7YRQ.mjs +28 -0
  30. package/dist/chunk-WYOJ7YRQ.mjs.map +1 -0
  31. package/dist/{chunk-63LUAWJS.mjs → chunk-ZXKYAHSH.mjs} +3 -3
  32. package/dist/{chunk-63LUAWJS.mjs.map → chunk-ZXKYAHSH.mjs.map} +1 -1
  33. package/dist/cl/index.d.mts +26 -0
  34. package/dist/cl/index.d.ts +26 -0
  35. package/dist/cl/index.js +40 -0
  36. package/dist/cl/index.js.map +1 -0
  37. package/dist/cl/index.mjs +36 -0
  38. package/dist/cl/index.mjs.map +1 -0
  39. package/dist/components/AdvancedPickers.js +6 -6
  40. package/dist/components/AdvancedPickers.mjs +2 -2
  41. package/dist/components/AppShell.js +4 -4
  42. package/dist/components/AppShell.mjs +2 -2
  43. package/dist/components/Commerce.js +14 -14
  44. package/dist/components/Commerce.mjs +3 -3
  45. package/dist/components/DataTable.js +8 -8
  46. package/dist/components/DataTable.mjs +2 -2
  47. package/dist/components/Editing.js +8 -8
  48. package/dist/components/Editing.mjs +3 -3
  49. package/dist/components/Layout.d.mts +1 -1
  50. package/dist/components/Layout.d.ts +1 -1
  51. package/dist/components/Overlay.js +4 -4
  52. package/dist/components/Overlay.mjs +2 -2
  53. package/dist/components/Pickers.d.mts +19 -1
  54. package/dist/components/Pickers.d.ts +19 -1
  55. package/dist/components/Pickers.js +8 -6
  56. package/dist/components/Pickers.mjs +3 -1
  57. package/dist/hooks/index.js +5 -5
  58. package/dist/hooks/index.mjs +1 -1
  59. package/dist/index.d.mts +1 -0
  60. package/dist/index.d.ts +1 -0
  61. package/dist/index.js +139 -130
  62. package/dist/index.mjs +16 -15
  63. package/dist/styles.css +1 -1
  64. package/dist/utils/format.d.mts +24 -0
  65. package/dist/utils/format.d.ts +24 -0
  66. package/dist/utils/format.js +18 -0
  67. package/dist/utils/format.js.map +1 -0
  68. package/dist/utils/format.mjs +5 -0
  69. package/dist/utils/format.mjs.map +1 -0
  70. package/package.json +11 -1
  71. package/dist/chunk-JFYTJUT3.js.map +0 -1
  72. package/dist/chunk-JHSQYS7K.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/DataTable.tsx"],"names":["rows","rowKey","selectedKeys","onSelectionChange","TableToolbar"],"mappings":"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","file":"chunk-UKVNZHD3.mjs","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { ChevronUp, ChevronDown, 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}\n\nfunction DataTableRowImpl<T>({\n row, rowK, selected, selectable, selectAriaLabel, columns, onToggle,\n href, onActivate, actionLabel, renderRow,\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 {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\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 * 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 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 });\n propsRef.current = { rows, rowKey, selectedKeys, onSelectionChange };\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 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 {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={columns.length + (selectable ? 1 : 0)}\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 {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={columns.length + (selectable ? 1 : 0)} 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 return (\n <DataTableRow\n key={k}\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 />\n );\n })\n )}\n </tbody>\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
+ {"version":3,"sources":["../src/components/DataTable.tsx"],"names":["rows","rowKey","selectedKeys","onSelectionChange","TableToolbar"],"mappings":"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","file":"chunk-BKERVGDJ.mjs","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { ChevronUp, ChevronDown, 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}\n\nfunction DataTableRowImpl<T>({\n row, rowK, selected, selectable, selectAriaLabel, columns, onToggle,\n href, onActivate, actionLabel, renderRow,\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 {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\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 * 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 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 });\n propsRef.current = { rows, rowKey, selectedKeys, onSelectionChange };\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 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 {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={columns.length + (selectable ? 1 : 0)}\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 {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={columns.length + (selectable ? 1 : 0)} 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 return (\n <DataTableRow\n key={k}\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 />\n );\n })\n )}\n </tbody>\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,9 +1,9 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
+ var chunkD2H4VZVL_js = require('./chunk-D2H4VZVL.js');
4
5
  var chunkNPXEZCTA_js = require('./chunk-NPXEZCTA.js');
5
6
  var chunk55P5FA5Q_js = require('./chunk-55P5FA5Q.js');
6
- var chunkD2H4VZVL_js = require('./chunk-D2H4VZVL.js');
7
7
  var chunkUBSBSZPB_js = require('./chunk-UBSBSZPB.js');
8
8
  var chunkC4AKMVDZ_js = require('./chunk-C4AKMVDZ.js');
9
9
  var chunkPASF6T4H_js = require('./chunk-PASF6T4H.js');
@@ -216,5 +216,5 @@ function PageHeader({ title, description, breadcrumbs, actions, meta, className
216
216
 
217
217
  exports.AppShell = AppShell;
218
218
  exports.PageHeader = PageHeader;
219
- //# sourceMappingURL=chunk-C7UG47HQ.js.map
220
- //# sourceMappingURL=chunk-C7UG47HQ.js.map
219
+ //# sourceMappingURL=chunk-BZSOS7QT.js.map
220
+ //# sourceMappingURL=chunk-BZSOS7QT.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/AppShell.tsx"],"names":["React","NavItemNode","cx","jsxs","Fragment","jsx","useLocale","useEscape","useFocusTrap","useScrollLock","MenuIcon"],"mappings":"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","file":"chunk-C7UG47HQ.js","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { useLocale } from '../locale/LocaleProvider';\nimport { useFocusTrap, useEscape, useScrollLock } from '../hooks';\nimport { MenuIcon } from './Icons';\n\n// ---------- AppShell (full-width header + sidebar + content) ------------\n// Designed to drop into a Next.js app/layout.tsx as a Client Component shell.\n//\n// v1.31 BREAKING: the kit no longer exposes a `side` layout. Only the\n// `top` shape exists: a full-width header above the body, three header\n// slots (left/center/right), a sidebar below for navigation, and a content\n// area that owns its own scroll. The `headerLayout` prop is removed.\n\nexport interface NavItem {\n id: string;\n label: React.ReactNode;\n icon?: React.ReactNode;\n href?: string;\n active?: boolean;\n badge?: React.ReactNode;\n onSelect?: () => void;\n children?: NavItem[];\n}\n\nexport interface NavSection {\n id?: string;\n label?: React.ReactNode;\n items: NavItem[];\n}\n\nexport type AppShellTheme = 'default' | 'brand';\n\n/**\n * Collapse API handed to header-slot render-props so a consumer-placed control\n * (e.g. a hamburger in `header.left`) can drive the sidebar — crucially in\n * **uncontrolled** mode, where there is no built-in toggle affordance. This\n * is what lets `persistKey` (uncontrolled) coexist with a custom header\n * trigger: the kit owns the state + persistence, the consumer owns the\n * trigger's look and placement.\n *\n * `toggle()` is DWIM by viewport: on desktop it flips `collapsed` (the\n * rail/hide state); below 900px it flips an overlay drawer instead — same\n * single click handler regardless of breakpoint.\n */\nexport interface AppShellHeaderApi {\n /** Current collapsed state. */\n collapsed: boolean;\n /** Flip the collapsed state on desktop, or the drawer in mobile. */\n toggle: () => void;\n /** Set the collapsed state explicitly. */\n setCollapsed: (collapsed: boolean) => void;\n}\n\n/**\n * A header slot: a static node, or a render-prop receiving {@link AppShellHeaderApi}.\n * The function form is the only way to toggle an uncontrolled shell from the\n * header (no built-in toggle exists).\n */\nexport type AppShellHeaderSlot =\n | React.ReactNode\n | ((api: AppShellHeaderApi) => React.ReactNode);\n\nexport interface AppShellHeader {\n /** Left slot — typically a menu/hamburger trigger or back action. */\n left?: AppShellHeaderSlot;\n /** Center slot — typically the brand (Logo). Lands at the true viewport centre. */\n center?: AppShellHeaderSlot;\n /** Right slot — notifications, user avatar, utilities. */\n right?: AppShellHeaderSlot;\n}\n\n/**\n * AppShell props.\n *\n * @example\n * <AppShell\n * sections={sections}\n * header={{\n * left: ({ toggle }) => <button onClick={toggle}>Menu</button>,\n * center: <Logo />,\n * right: <Avatar />,\n * }}\n * >\n * {children}\n * </AppShell>\n */\nexport interface AppShellProps {\n /**\n * Navigation sections that populate the sidebar. Omit (or pass an empty\n * array) to render a **top-bar-only** shell — no sidebar at all, body\n * collapses to a single column. Use when the app is flat-route (no panel\n * nav), e.g. a kiosk/checkout flow.\n */\n sections?: NavSection[];\n /** Slot at the bottom of the sidebar (version label, env tag, etc.). */\n footer?: React.ReactNode;\n /** Initial collapsed state (uncontrolled). */\n defaultCollapsed?: boolean;\n /** Controlled collapsed state — pair with `onCollapsedChange`. */\n collapsed?: boolean;\n /** Called when `collapsed` flips (controlled mode handshake). */\n onCollapsedChange?: (c: boolean) => void;\n /**\n * Persist the collapsed state in `localStorage[persistKey]` so it survives\n * reloads. Opt-in: omit it and the shell keeps the default behaviour (resets\n * to `defaultCollapsed` on each mount). SSR-safe — the initial render still\n * uses `defaultCollapsed` (no hydration mismatch); the stored value is read\n * after mount, so a differing value may flash for one frame. Ignored in\n * controlled mode (when `collapsed` is provided): the host owns persistence.\n */\n persistKey?: string;\n children: React.ReactNode;\n className?: string;\n /**\n * Sidebar color theme:\n * - `default` (light): claro, mejor para apps data-heavy de uso prolongado.\n * - `brand`: superficie azul de marca con texto blanco. Mayor brand recall.\n *\n * The header band's theme is `headerTheme`, defaulting to this value so\n * `theme=\"brand\"` tints both bands by default.\n */\n theme?: AppShellTheme;\n /**\n * Header band theme, independent of the sidebar (`theme`). Defaults to\n * `theme`. Set `theme=\"default\" headerTheme=\"brand\"` for a branded top\n * bar over a neutral, legible sidebar — common in data-heavy admin apps.\n */\n headerTheme?: AppShellTheme;\n /**\n * Collapse to an icon rail (72px) instead of hiding the sidebar entirely.\n * Default `false` → `collapsed` hides the sidebar (slides off-screen).\n * `true` → `collapsed` keeps a 72px rail showing the nav icons (labels\n * hidden, active-item bar kept).\n */\n collapsedRail?: boolean;\n /**\n * Render the kit's standard menu toggle (hamburger) at the start of\n * `header.left`. Default trigger for the drawer (mobile) / collapsed\n * state (desktop), so consumers don't need the `header.left`\n * render-prop just to get a working toggle. The render-prop remains\n * available — when both are provided, the kit toggle renders first\n * and the consumer's slot content renders after it. Ignored when\n * `sections` is empty (top-bar-only shell).\n */\n showMenuToggle?: boolean;\n /** Slots for the full-width header. */\n header?: AppShellHeader;\n /** Render-prop for navigation links so the host app can use Next.js Link, etc. */\n linkAs?: (item: NavItem, content: React.ReactNode, className: string) => React.ReactNode;\n}\n\n// Recursive nav item, memoized so a single item's parent re-render doesn't\n// churn through every other item in the tree. Stability of `linkAs` and\n// `onCloseMobile` is the parent's responsibility (we stabilize\n// `onCloseMobile` via useCallback below; consumers should memoize `linkAs`\n// if they care about avoiding renders, but for typical Next.js Link usage\n// the inline arrow is rarely a hot path).\ninterface NavItemNodeProps {\n item: NavItem;\n depth: number;\n linkAs?: AppShellProps['linkAs'];\n onCloseMobile: () => void;\n}\n\nconst NavItemNode = React.memo(function NavItemNode({\n item, depth, linkAs, onCloseMobile,\n}: NavItemNodeProps) {\n const klass = cx('appshell__navitem', item.active && 'is-active', `appshell__navitem--depth-${depth}`);\n const inner = (\n <>\n {item.icon && <span className=\"appshell__navicon\" aria-hidden=\"true\">{item.icon}</span>}\n <span className=\"appshell__navlabel\">{item.label}</span>\n {item.badge && <span className=\"appshell__navbadge\">{item.badge}</span>}\n </>\n );\n const node = item.href && linkAs\n ? linkAs(item, inner, klass)\n : (\n <a\n href={item.href ?? '#'}\n className={klass}\n aria-current={item.active ? 'page' : undefined}\n onClick={(e) => {\n if (!item.href) e.preventDefault();\n item.onSelect?.();\n onCloseMobile();\n }}\n >\n {inner}\n </a>\n );\n return (\n <li>\n {node}\n {item.children && item.children.length > 0 && (\n <ul className=\"appshell__navchildren\">\n {item.children.map((c) => (\n <NavItemNode key={c.id} item={c} depth={depth + 1} linkAs={linkAs} onCloseMobile={onCloseMobile} />\n ))}\n </ul>\n )}\n </li>\n );\n});\n\n/**\n * Mobile drawer breakpoint. Below this, `toggle()` flips an overlay drawer\n * (`is-mobile-open`) instead of the desktop collapse — see CSS\n * `@media (max-width: 900px)` for the visual shape. Kept in sync with that\n * media query; if you change one, change both.\n */\nconst MOBILE_BREAKPOINT = '(max-width: 900px)';\n\n// Stable id for `aria-controls` on the built-in menu toggle. Static (not\n// per-instance via useId) because a page only renders one AppShell; if a\n// host ever ships two, the duplicate id is the lesser problem vs. losing\n// SSR/CSR id stability for the toggle's aria-controls handshake.\nconst SIDEBAR_ID = 'appshell-sidebar';\n\nexport function AppShell({\n sections = [],\n footer,\n defaultCollapsed = false,\n collapsed: ctrlCollapsed,\n onCollapsedChange,\n persistKey,\n children,\n className,\n theme = 'default',\n headerTheme: ctrlHeaderTheme,\n collapsedRail = false,\n showMenuToggle = false,\n header,\n linkAs,\n}: AppShellProps) {\n const t = useLocale();\n const [internalCollapsed, setInternalCollapsed] = React.useState(defaultCollapsed);\n const collapsed = ctrlCollapsed ?? internalCollapsed;\n // Header band themes independently of the sidebar; defaults to `theme`\n // so `theme=\"brand\"` keeps tinting both bands.\n const headerTheme = ctrlHeaderTheme ?? theme;\n const hasSidebar = sections.length > 0;\n\n // SSR-safe persistence: the initial render uses `defaultCollapsed` (server\n // and first client render agree → no hydration mismatch), then we sync from\n // localStorage after mount. Only in uncontrolled mode; reads can throw\n // (Safari private mode), so they're guarded. Runs once per persistKey.\n React.useEffect(() => {\n if (persistKey == null || ctrlCollapsed !== undefined) return;\n try {\n const stored = window.localStorage.getItem(persistKey);\n if (stored === '0' || stored === '1') setInternalCollapsed(stored === '1');\n } catch {\n /* localStorage unavailable — keep defaultCollapsed */\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- sync once at mount; ctrlCollapsed read intentionally not tracked\n }, [persistKey]);\n\n const setCollapsed = (v: boolean) => {\n if (ctrlCollapsed === undefined) setInternalCollapsed(v);\n if (persistKey != null && ctrlCollapsed === undefined) {\n try {\n window.localStorage.setItem(persistKey, v ? '1' : '0');\n } catch {\n /* localStorage unavailable — persistence is best-effort */\n }\n }\n onCollapsedChange?.(v);\n };\n\n const [mobileOpen, setMobileOpen] = React.useState(false);\n // Track whether matchMedia says we are below the mobile breakpoint. State\n // (not ref) so React re-renders when it flips — `aria-hidden` on the\n // closed mobile drawer is derived from this, and a ref-only value would\n // never land on the DOM (the ref update doesn't trigger a re-render).\n // Initial render uses `false` (SSR-safe; matchMedia is browser-only) and\n // the effect corrects it post-mount. The listener also clears\n // `mobileOpen` when the user resizes back into desktop, so a stale-open\n // drawer doesn't ghost.\n const [isMobile, setIsMobile] = React.useState(false);\n React.useEffect(() => {\n if (typeof window === 'undefined' || !window.matchMedia) return;\n const mql = window.matchMedia(MOBILE_BREAKPOINT);\n setIsMobile(mql.matches);\n const onChange = (e: MediaQueryListEvent) => {\n setIsMobile(e.matches);\n if (!e.matches) setMobileOpen(false);\n };\n mql.addEventListener('change', onChange);\n return () => mql.removeEventListener('change', onChange);\n }, []);\n\n // Mirror `collapsed` to `mobileOpen` in mobile: any flip of `collapsed`\n // (e.g. a controlled consumer's static hamburger that calls setCollapsed\n // directly instead of going through `headerApi.toggle()`) opens/closes\n // the drawer. Without this sync, a controlled consumer's button reads as\n // dead in mobile — flipping `collapsed` is invisible because the aside\n // is a fixed overlay that ignores collapsed in mobile.\n //\n // Semantics: `collapsed=true` means \"menu hidden\" in BOTH viewports\n // (rail/hide on desktop, drawer-closed on mobile). The DWIM `toggle()`\n // for the render-prop API still does its mobileOpen flip directly, but\n // any out-of-band `collapsed` change also propagates here.\n //\n // Initial render must NOT auto-open the drawer just because\n // `collapsed=false` happens to be the default — track previous value\n // and only mirror when it actually changes.\n const prevCollapsed = React.useRef(collapsed);\n React.useEffect(() => {\n if (!isMobile) return;\n if (prevCollapsed.current === collapsed) return;\n prevCollapsed.current = collapsed;\n setMobileOpen(!collapsed);\n }, [isMobile, collapsed]);\n\n // ESC closes the drawer (only active while open — no leaked listener).\n const closeMobileDrawer = React.useCallback(() => setMobileOpen(false), []);\n useEscape(mobileOpen, closeMobileDrawer);\n // Focus trap inside the open drawer: focuses the first nav link on open,\n // cycles Tab/Shift+Tab within, restores focus to the trigger on close.\n // Same hook used by Modal/Drawer — single source of truth for the trap.\n const drawerRef = React.useRef<HTMLDivElement>(null);\n useFocusTrap(drawerRef, mobileOpen);\n // Lock body scroll while the drawer is open so the content behind the\n // scrim doesn't drift on touch. Shares a global counter with Modal/Drawer\n // (kit-wide nesting safe).\n useScrollLock(mobileOpen);\n\n // The DWIM toggle: mobile flips the drawer, desktop flips `collapsed`.\n // Same API surface (`headerApi.toggle`) — the consumer's hamburger keeps\n // its single click handler regardless of viewport.\n const headerApi: AppShellHeaderApi = {\n collapsed,\n toggle: () => {\n if (isMobile) setMobileOpen((o) => !o);\n else setCollapsed(!collapsed);\n },\n setCollapsed,\n };\n const slot = (s: AppShellHeaderSlot): React.ReactNode =>\n typeof s === 'function' ? (s as (api: AppShellHeaderApi) => React.ReactNode)(headerApi) : s;\n\n return (\n <div className={cx(\n 'appshell', `appshell--${theme}`, 'appshell--header-top', `appshell--header-${headerTheme}`,\n collapsedRail && 'appshell--rail',\n !hasSidebar && 'appshell--no-nav',\n collapsed && 'is-collapsed',\n mobileOpen && 'is-mobile-open',\n className,\n )}>\n {/* On a brand header the band is dark, so re-scope foreground tokens\n via data-tone=\"inverse\" — anything inside (Avatar, badges, links)\n becomes band-aware automatically without per-call-site colors. */}\n <header className=\"appshell__header\" role=\"banner\" data-tone={headerTheme === 'brand' ? 'inverse' : undefined}>\n <div className=\"appshell__header-left\">\n {showMenuToggle && hasSidebar && (\n <button\n type=\"button\"\n className=\"appshell__menu-toggle\"\n aria-label={t['appshell.toggleMenu']}\n aria-expanded={isMobile ? mobileOpen : !collapsed}\n aria-controls={SIDEBAR_ID}\n onClick={headerApi.toggle}\n >\n <MenuIcon size={20} />\n </button>\n )}\n {slot(header?.left)}\n </div>\n <div className=\"appshell__header-center\">{slot(header?.center)}</div>\n <div className=\"appshell__header-right\">{slot(header?.right)}</div>\n </header>\n <div className=\"appshell__body\">\n {hasSidebar && (\n <aside\n ref={drawerRef}\n id={SIDEBAR_ID}\n className=\"appshell__sidebar\"\n aria-label={t['appshell.mainNav']}\n /* Closed mobile drawer: hide from assistive tech so a screen\n reader doesn't tab through 30 offscreen links. */\n aria-hidden={isMobile && !mobileOpen ? true : undefined}\n >\n <nav className=\"appshell__nav\">\n {sections.map((s, i) => (\n <div key={s.id ?? i} className=\"appshell__navsection\">\n {s.label && <div className=\"appshell__navlabel-section\">{s.label}</div>}\n <ul>{s.items.map((it) => (\n <NavItemNode key={it.id} item={it} depth={0} linkAs={linkAs} onCloseMobile={closeMobileDrawer} />\n ))}</ul>\n </div>\n ))}\n </nav>\n {footer != null && (\n <div className=\"appshell__sidebar-foot\">{footer}</div>\n )}\n </aside>\n )}\n <main className=\"appshell__content\" role=\"main\">{children}</main>\n {/* Scrim is a child of the body so it MATCHES the body's exact\n bounds via `position: absolute; inset: 0` — not a sibling of\n the body using viewport-relative math, which couldn't keep up\n when the actual header height drifted from the\n `--appshell-header-height` var (e.g., 73 rendered vs 56 in the\n var). Click-anywhere-out closes. */}\n {mobileOpen && (\n <div\n className=\"appshell__scrim\"\n onClick={closeMobileDrawer}\n aria-hidden=\"true\"\n />\n )}\n </div>\n </div>\n );\n}\n\n// ---------- PageHeader --------------------------------------------------\nexport interface PageHeaderProps {\n title: React.ReactNode;\n description?: React.ReactNode;\n breadcrumbs?: Array<{ label: React.ReactNode; href?: string }>;\n actions?: React.ReactNode;\n meta?: React.ReactNode;\n className?: string;\n}\n\nexport function PageHeader({ title, description, breadcrumbs, actions, meta, className }: PageHeaderProps) {\n const t = useLocale();\n return (\n <div className={cx('page-header', className)}>\n {breadcrumbs && breadcrumbs.length > 0 && (\n <nav className=\"page-header__crumbs\" aria-label={t['appshell.breadcrumb']}>\n <ol>\n {breadcrumbs.map((c, i) => (\n <li key={i}>\n {c.href ? <a href={c.href}>{c.label}</a> : <span aria-current=\"page\">{c.label}</span>}\n {i < breadcrumbs.length - 1 && <span className=\"page-header__crumb-sep\" aria-hidden=\"true\">/</span>}\n </li>\n ))}\n </ol>\n </nav>\n )}\n <div className=\"page-header__row\">\n <div className=\"page-header__title-wrap\">\n <h1 className=\"page-header__title\">{title}</h1>\n {description && <p className=\"page-header__desc\">{description}</p>}\n </div>\n {actions && <div className=\"page-header__actions\">{actions}</div>}\n </div>\n {meta && <div className=\"page-header__meta\">{meta}</div>}\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/AppShell.tsx"],"names":["React","NavItemNode","cx","jsxs","Fragment","jsx","useLocale","useEscape","useFocusTrap","useScrollLock","MenuIcon"],"mappings":"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","file":"chunk-BZSOS7QT.js","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { useLocale } from '../locale/LocaleProvider';\nimport { useFocusTrap, useEscape, useScrollLock } from '../hooks';\nimport { MenuIcon } from './Icons';\n\n// ---------- AppShell (full-width header + sidebar + content) ------------\n// Designed to drop into a Next.js app/layout.tsx as a Client Component shell.\n//\n// v1.31 BREAKING: the kit no longer exposes a `side` layout. Only the\n// `top` shape exists: a full-width header above the body, three header\n// slots (left/center/right), a sidebar below for navigation, and a content\n// area that owns its own scroll. The `headerLayout` prop is removed.\n\nexport interface NavItem {\n id: string;\n label: React.ReactNode;\n icon?: React.ReactNode;\n href?: string;\n active?: boolean;\n badge?: React.ReactNode;\n onSelect?: () => void;\n children?: NavItem[];\n}\n\nexport interface NavSection {\n id?: string;\n label?: React.ReactNode;\n items: NavItem[];\n}\n\nexport type AppShellTheme = 'default' | 'brand';\n\n/**\n * Collapse API handed to header-slot render-props so a consumer-placed control\n * (e.g. a hamburger in `header.left`) can drive the sidebar — crucially in\n * **uncontrolled** mode, where there is no built-in toggle affordance. This\n * is what lets `persistKey` (uncontrolled) coexist with a custom header\n * trigger: the kit owns the state + persistence, the consumer owns the\n * trigger's look and placement.\n *\n * `toggle()` is DWIM by viewport: on desktop it flips `collapsed` (the\n * rail/hide state); below 900px it flips an overlay drawer instead — same\n * single click handler regardless of breakpoint.\n */\nexport interface AppShellHeaderApi {\n /** Current collapsed state. */\n collapsed: boolean;\n /** Flip the collapsed state on desktop, or the drawer in mobile. */\n toggle: () => void;\n /** Set the collapsed state explicitly. */\n setCollapsed: (collapsed: boolean) => void;\n}\n\n/**\n * A header slot: a static node, or a render-prop receiving {@link AppShellHeaderApi}.\n * The function form is the only way to toggle an uncontrolled shell from the\n * header (no built-in toggle exists).\n */\nexport type AppShellHeaderSlot =\n | React.ReactNode\n | ((api: AppShellHeaderApi) => React.ReactNode);\n\nexport interface AppShellHeader {\n /** Left slot — typically a menu/hamburger trigger or back action. */\n left?: AppShellHeaderSlot;\n /** Center slot — typically the brand (Logo). Lands at the true viewport centre. */\n center?: AppShellHeaderSlot;\n /** Right slot — notifications, user avatar, utilities. */\n right?: AppShellHeaderSlot;\n}\n\n/**\n * AppShell props.\n *\n * @example\n * <AppShell\n * sections={sections}\n * header={{\n * left: ({ toggle }) => <button onClick={toggle}>Menu</button>,\n * center: <Logo />,\n * right: <Avatar />,\n * }}\n * >\n * {children}\n * </AppShell>\n */\nexport interface AppShellProps {\n /**\n * Navigation sections that populate the sidebar. Omit (or pass an empty\n * array) to render a **top-bar-only** shell — no sidebar at all, body\n * collapses to a single column. Use when the app is flat-route (no panel\n * nav), e.g. a kiosk/checkout flow.\n */\n sections?: NavSection[];\n /** Slot at the bottom of the sidebar (version label, env tag, etc.). */\n footer?: React.ReactNode;\n /** Initial collapsed state (uncontrolled). */\n defaultCollapsed?: boolean;\n /** Controlled collapsed state — pair with `onCollapsedChange`. */\n collapsed?: boolean;\n /** Called when `collapsed` flips (controlled mode handshake). */\n onCollapsedChange?: (c: boolean) => void;\n /**\n * Persist the collapsed state in `localStorage[persistKey]` so it survives\n * reloads. Opt-in: omit it and the shell keeps the default behaviour (resets\n * to `defaultCollapsed` on each mount). SSR-safe — the initial render still\n * uses `defaultCollapsed` (no hydration mismatch); the stored value is read\n * after mount, so a differing value may flash for one frame. Ignored in\n * controlled mode (when `collapsed` is provided): the host owns persistence.\n */\n persistKey?: string;\n children: React.ReactNode;\n className?: string;\n /**\n * Sidebar color theme:\n * - `default` (light): claro, mejor para apps data-heavy de uso prolongado.\n * - `brand`: superficie azul de marca con texto blanco. Mayor brand recall.\n *\n * The header band's theme is `headerTheme`, defaulting to this value so\n * `theme=\"brand\"` tints both bands by default.\n */\n theme?: AppShellTheme;\n /**\n * Header band theme, independent of the sidebar (`theme`). Defaults to\n * `theme`. Set `theme=\"default\" headerTheme=\"brand\"` for a branded top\n * bar over a neutral, legible sidebar — common in data-heavy admin apps.\n */\n headerTheme?: AppShellTheme;\n /**\n * Collapse to an icon rail (72px) instead of hiding the sidebar entirely.\n * Default `false` → `collapsed` hides the sidebar (slides off-screen).\n * `true` → `collapsed` keeps a 72px rail showing the nav icons (labels\n * hidden, active-item bar kept).\n */\n collapsedRail?: boolean;\n /**\n * Render the kit's standard menu toggle (hamburger) at the start of\n * `header.left`. Default trigger for the drawer (mobile) / collapsed\n * state (desktop), so consumers don't need the `header.left`\n * render-prop just to get a working toggle. The render-prop remains\n * available — when both are provided, the kit toggle renders first\n * and the consumer's slot content renders after it. Ignored when\n * `sections` is empty (top-bar-only shell).\n */\n showMenuToggle?: boolean;\n /** Slots for the full-width header. */\n header?: AppShellHeader;\n /** Render-prop for navigation links so the host app can use Next.js Link, etc. */\n linkAs?: (item: NavItem, content: React.ReactNode, className: string) => React.ReactNode;\n}\n\n// Recursive nav item, memoized so a single item's parent re-render doesn't\n// churn through every other item in the tree. Stability of `linkAs` and\n// `onCloseMobile` is the parent's responsibility (we stabilize\n// `onCloseMobile` via useCallback below; consumers should memoize `linkAs`\n// if they care about avoiding renders, but for typical Next.js Link usage\n// the inline arrow is rarely a hot path).\ninterface NavItemNodeProps {\n item: NavItem;\n depth: number;\n linkAs?: AppShellProps['linkAs'];\n onCloseMobile: () => void;\n}\n\nconst NavItemNode = React.memo(function NavItemNode({\n item, depth, linkAs, onCloseMobile,\n}: NavItemNodeProps) {\n const klass = cx('appshell__navitem', item.active && 'is-active', `appshell__navitem--depth-${depth}`);\n const inner = (\n <>\n {item.icon && <span className=\"appshell__navicon\" aria-hidden=\"true\">{item.icon}</span>}\n <span className=\"appshell__navlabel\">{item.label}</span>\n {item.badge && <span className=\"appshell__navbadge\">{item.badge}</span>}\n </>\n );\n const node = item.href && linkAs\n ? linkAs(item, inner, klass)\n : (\n <a\n href={item.href ?? '#'}\n className={klass}\n aria-current={item.active ? 'page' : undefined}\n onClick={(e) => {\n if (!item.href) e.preventDefault();\n item.onSelect?.();\n onCloseMobile();\n }}\n >\n {inner}\n </a>\n );\n return (\n <li>\n {node}\n {item.children && item.children.length > 0 && (\n <ul className=\"appshell__navchildren\">\n {item.children.map((c) => (\n <NavItemNode key={c.id} item={c} depth={depth + 1} linkAs={linkAs} onCloseMobile={onCloseMobile} />\n ))}\n </ul>\n )}\n </li>\n );\n});\n\n/**\n * Mobile drawer breakpoint. Below this, `toggle()` flips an overlay drawer\n * (`is-mobile-open`) instead of the desktop collapse — see CSS\n * `@media (max-width: 900px)` for the visual shape. Kept in sync with that\n * media query; if you change one, change both.\n */\nconst MOBILE_BREAKPOINT = '(max-width: 900px)';\n\n// Stable id for `aria-controls` on the built-in menu toggle. Static (not\n// per-instance via useId) because a page only renders one AppShell; if a\n// host ever ships two, the duplicate id is the lesser problem vs. losing\n// SSR/CSR id stability for the toggle's aria-controls handshake.\nconst SIDEBAR_ID = 'appshell-sidebar';\n\nexport function AppShell({\n sections = [],\n footer,\n defaultCollapsed = false,\n collapsed: ctrlCollapsed,\n onCollapsedChange,\n persistKey,\n children,\n className,\n theme = 'default',\n headerTheme: ctrlHeaderTheme,\n collapsedRail = false,\n showMenuToggle = false,\n header,\n linkAs,\n}: AppShellProps) {\n const t = useLocale();\n const [internalCollapsed, setInternalCollapsed] = React.useState(defaultCollapsed);\n const collapsed = ctrlCollapsed ?? internalCollapsed;\n // Header band themes independently of the sidebar; defaults to `theme`\n // so `theme=\"brand\"` keeps tinting both bands.\n const headerTheme = ctrlHeaderTheme ?? theme;\n const hasSidebar = sections.length > 0;\n\n // SSR-safe persistence: the initial render uses `defaultCollapsed` (server\n // and first client render agree → no hydration mismatch), then we sync from\n // localStorage after mount. Only in uncontrolled mode; reads can throw\n // (Safari private mode), so they're guarded. Runs once per persistKey.\n React.useEffect(() => {\n if (persistKey == null || ctrlCollapsed !== undefined) return;\n try {\n const stored = window.localStorage.getItem(persistKey);\n if (stored === '0' || stored === '1') setInternalCollapsed(stored === '1');\n } catch {\n /* localStorage unavailable — keep defaultCollapsed */\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- sync once at mount; ctrlCollapsed read intentionally not tracked\n }, [persistKey]);\n\n const setCollapsed = (v: boolean) => {\n if (ctrlCollapsed === undefined) setInternalCollapsed(v);\n if (persistKey != null && ctrlCollapsed === undefined) {\n try {\n window.localStorage.setItem(persistKey, v ? '1' : '0');\n } catch {\n /* localStorage unavailable — persistence is best-effort */\n }\n }\n onCollapsedChange?.(v);\n };\n\n const [mobileOpen, setMobileOpen] = React.useState(false);\n // Track whether matchMedia says we are below the mobile breakpoint. State\n // (not ref) so React re-renders when it flips — `aria-hidden` on the\n // closed mobile drawer is derived from this, and a ref-only value would\n // never land on the DOM (the ref update doesn't trigger a re-render).\n // Initial render uses `false` (SSR-safe; matchMedia is browser-only) and\n // the effect corrects it post-mount. The listener also clears\n // `mobileOpen` when the user resizes back into desktop, so a stale-open\n // drawer doesn't ghost.\n const [isMobile, setIsMobile] = React.useState(false);\n React.useEffect(() => {\n if (typeof window === 'undefined' || !window.matchMedia) return;\n const mql = window.matchMedia(MOBILE_BREAKPOINT);\n setIsMobile(mql.matches);\n const onChange = (e: MediaQueryListEvent) => {\n setIsMobile(e.matches);\n if (!e.matches) setMobileOpen(false);\n };\n mql.addEventListener('change', onChange);\n return () => mql.removeEventListener('change', onChange);\n }, []);\n\n // Mirror `collapsed` to `mobileOpen` in mobile: any flip of `collapsed`\n // (e.g. a controlled consumer's static hamburger that calls setCollapsed\n // directly instead of going through `headerApi.toggle()`) opens/closes\n // the drawer. Without this sync, a controlled consumer's button reads as\n // dead in mobile — flipping `collapsed` is invisible because the aside\n // is a fixed overlay that ignores collapsed in mobile.\n //\n // Semantics: `collapsed=true` means \"menu hidden\" in BOTH viewports\n // (rail/hide on desktop, drawer-closed on mobile). The DWIM `toggle()`\n // for the render-prop API still does its mobileOpen flip directly, but\n // any out-of-band `collapsed` change also propagates here.\n //\n // Initial render must NOT auto-open the drawer just because\n // `collapsed=false` happens to be the default — track previous value\n // and only mirror when it actually changes.\n const prevCollapsed = React.useRef(collapsed);\n React.useEffect(() => {\n if (!isMobile) return;\n if (prevCollapsed.current === collapsed) return;\n prevCollapsed.current = collapsed;\n setMobileOpen(!collapsed);\n }, [isMobile, collapsed]);\n\n // ESC closes the drawer (only active while open — no leaked listener).\n const closeMobileDrawer = React.useCallback(() => setMobileOpen(false), []);\n useEscape(mobileOpen, closeMobileDrawer);\n // Focus trap inside the open drawer: focuses the first nav link on open,\n // cycles Tab/Shift+Tab within, restores focus to the trigger on close.\n // Same hook used by Modal/Drawer — single source of truth for the trap.\n const drawerRef = React.useRef<HTMLDivElement>(null);\n useFocusTrap(drawerRef, mobileOpen);\n // Lock body scroll while the drawer is open so the content behind the\n // scrim doesn't drift on touch. Shares a global counter with Modal/Drawer\n // (kit-wide nesting safe).\n useScrollLock(mobileOpen);\n\n // The DWIM toggle: mobile flips the drawer, desktop flips `collapsed`.\n // Same API surface (`headerApi.toggle`) — the consumer's hamburger keeps\n // its single click handler regardless of viewport.\n const headerApi: AppShellHeaderApi = {\n collapsed,\n toggle: () => {\n if (isMobile) setMobileOpen((o) => !o);\n else setCollapsed(!collapsed);\n },\n setCollapsed,\n };\n const slot = (s: AppShellHeaderSlot): React.ReactNode =>\n typeof s === 'function' ? (s as (api: AppShellHeaderApi) => React.ReactNode)(headerApi) : s;\n\n return (\n <div className={cx(\n 'appshell', `appshell--${theme}`, 'appshell--header-top', `appshell--header-${headerTheme}`,\n collapsedRail && 'appshell--rail',\n !hasSidebar && 'appshell--no-nav',\n collapsed && 'is-collapsed',\n mobileOpen && 'is-mobile-open',\n className,\n )}>\n {/* On a brand header the band is dark, so re-scope foreground tokens\n via data-tone=\"inverse\" — anything inside (Avatar, badges, links)\n becomes band-aware automatically without per-call-site colors. */}\n <header className=\"appshell__header\" role=\"banner\" data-tone={headerTheme === 'brand' ? 'inverse' : undefined}>\n <div className=\"appshell__header-left\">\n {showMenuToggle && hasSidebar && (\n <button\n type=\"button\"\n className=\"appshell__menu-toggle\"\n aria-label={t['appshell.toggleMenu']}\n aria-expanded={isMobile ? mobileOpen : !collapsed}\n aria-controls={SIDEBAR_ID}\n onClick={headerApi.toggle}\n >\n <MenuIcon size={20} />\n </button>\n )}\n {slot(header?.left)}\n </div>\n <div className=\"appshell__header-center\">{slot(header?.center)}</div>\n <div className=\"appshell__header-right\">{slot(header?.right)}</div>\n </header>\n <div className=\"appshell__body\">\n {hasSidebar && (\n <aside\n ref={drawerRef}\n id={SIDEBAR_ID}\n className=\"appshell__sidebar\"\n aria-label={t['appshell.mainNav']}\n /* Closed mobile drawer: hide from assistive tech so a screen\n reader doesn't tab through 30 offscreen links. */\n aria-hidden={isMobile && !mobileOpen ? true : undefined}\n >\n <nav className=\"appshell__nav\">\n {sections.map((s, i) => (\n <div key={s.id ?? i} className=\"appshell__navsection\">\n {s.label && <div className=\"appshell__navlabel-section\">{s.label}</div>}\n <ul>{s.items.map((it) => (\n <NavItemNode key={it.id} item={it} depth={0} linkAs={linkAs} onCloseMobile={closeMobileDrawer} />\n ))}</ul>\n </div>\n ))}\n </nav>\n {footer != null && (\n <div className=\"appshell__sidebar-foot\">{footer}</div>\n )}\n </aside>\n )}\n <main className=\"appshell__content\" role=\"main\">{children}</main>\n {/* Scrim is a child of the body so it MATCHES the body's exact\n bounds via `position: absolute; inset: 0` — not a sibling of\n the body using viewport-relative math, which couldn't keep up\n when the actual header height drifted from the\n `--appshell-header-height` var (e.g., 73 rendered vs 56 in the\n var). Click-anywhere-out closes. */}\n {mobileOpen && (\n <div\n className=\"appshell__scrim\"\n onClick={closeMobileDrawer}\n aria-hidden=\"true\"\n />\n )}\n </div>\n </div>\n );\n}\n\n// ---------- PageHeader --------------------------------------------------\nexport interface PageHeaderProps {\n title: React.ReactNode;\n description?: React.ReactNode;\n breadcrumbs?: Array<{ label: React.ReactNode; href?: string }>;\n actions?: React.ReactNode;\n meta?: React.ReactNode;\n className?: string;\n}\n\nexport function PageHeader({ title, description, breadcrumbs, actions, meta, className }: PageHeaderProps) {\n const t = useLocale();\n return (\n <div className={cx('page-header', className)}>\n {breadcrumbs && breadcrumbs.length > 0 && (\n <nav className=\"page-header__crumbs\" aria-label={t['appshell.breadcrumb']}>\n <ol>\n {breadcrumbs.map((c, i) => (\n <li key={i}>\n {c.href ? <a href={c.href}>{c.label}</a> : <span aria-current=\"page\">{c.label}</span>}\n {i < breadcrumbs.length - 1 && <span className=\"page-header__crumb-sep\" aria-hidden=\"true\">/</span>}\n </li>\n ))}\n </ol>\n </nav>\n )}\n <div className=\"page-header__row\">\n <div className=\"page-header__title-wrap\">\n <h1 className=\"page-header__title\">{title}</h1>\n {description && <p className=\"page-header__desc\">{description}</p>}\n </div>\n {actions && <div className=\"page-header__actions\">{actions}</div>}\n </div>\n {meta && <div className=\"page-header__meta\">{meta}</div>}\n </div>\n );\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  'use client';
2
- import { Modal } from './chunk-VOSVV3LL.mjs';
2
+ import { Modal } from './chunk-PJA77NAF.mjs';
3
3
  import { Checkbox } from './chunk-SUQLII3F.mjs';
4
4
  import { useLocale } from './chunk-SXAGF7EG.mjs';
5
5
  import { ChevronRight, ChevronLeft } from './chunk-BJGMROKL.mjs';
@@ -168,5 +168,5 @@ function TransferList({
168
168
  }
169
169
 
170
170
  export { ConfirmDialog, DescriptionList, DescriptionListItem, DiffViewer, TransferList };
171
- //# sourceMappingURL=chunk-3JYYZOEJ.mjs.map
172
- //# sourceMappingURL=chunk-3JYYZOEJ.mjs.map
171
+ //# sourceMappingURL=chunk-C3A6EWSR.mjs.map
172
+ //# sourceMappingURL=chunk-C3A6EWSR.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Editing.tsx"],"names":[],"mappings":"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","file":"chunk-3JYYZOEJ.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
+ {"version":3,"sources":["../src/components/Editing.tsx"],"names":[],"mappings":"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","file":"chunk-C3A6EWSR.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"]}
@@ -0,0 +1,31 @@
1
+ 'use client';
2
+ 'use strict';
3
+
4
+ var chunk3PXYCXDW_js = require('./chunk-3PXYCXDW.js');
5
+
6
+ // src/utils/format.ts
7
+ var cache = /* @__PURE__ */ new Map();
8
+ function getFormatter(locale, options) {
9
+ const key = locale + JSON.stringify(options);
10
+ let nf = cache.get(key);
11
+ if (!nf) {
12
+ nf = new Intl.NumberFormat(locale, options);
13
+ cache.set(key, nf);
14
+ }
15
+ return nf;
16
+ }
17
+ function formatCurrency(value, opts = {}) {
18
+ const brand = chunk3PXYCXDW_js.getBrand();
19
+ const { currency = brand.currency, locale = brand.locale, ...digits } = opts;
20
+ return getFormatter(locale, { style: "currency", currency, ...digits }).format(value);
21
+ }
22
+ function formatNumber(value, opts = {}) {
23
+ const brand = chunk3PXYCXDW_js.getBrand();
24
+ const { locale = brand.locale, ...digits } = opts;
25
+ return getFormatter(locale, digits).format(value);
26
+ }
27
+
28
+ exports.formatCurrency = formatCurrency;
29
+ exports.formatNumber = formatNumber;
30
+ //# sourceMappingURL=chunk-CTOPKHEE.js.map
31
+ //# sourceMappingURL=chunk-CTOPKHEE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/format.ts"],"names":["getBrand"],"mappings":";;;;;AAYA,IAAM,KAAA,uBAAY,GAAA,EAA+B;AAEjD,SAAS,YAAA,CAAa,QAAgB,OAAA,EAAsD;AAC1F,EAAA,MAAM,GAAA,GAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAC3C,EAAA,IAAI,EAAA,GAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AACtB,EAAA,IAAI,CAAC,EAAA,EAAI;AACP,IAAA,EAAA,GAAK,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ,OAAO,CAAA;AAC1C,IAAA,KAAA,CAAM,GAAA,CAAI,KAAK,EAAE,CAAA;AAAA,EACnB;AACA,EAAA,OAAO,EAAA;AACT;AAgBO,SAAS,cAAA,CAAe,KAAA,EAAe,IAAA,GAA8B,EAAC,EAAW;AACtF,EAAA,MAAM,QAAQA,yBAAA,EAAS;AACvB,EAAA,MAAM,EAAE,WAAW,KAAA,CAAM,QAAA,EAAU,SAAS,KAAA,CAAM,MAAA,EAAQ,GAAG,MAAA,EAAO,GAAI,IAAA;AACxE,EAAA,OAAO,YAAA,CAAa,MAAA,EAAQ,EAAE,KAAA,EAAO,UAAA,EAAY,QAAA,EAAU,GAAG,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AACtF;AAUO,SAAS,YAAA,CAAa,KAAA,EAAe,IAAA,GAA4B,EAAC,EAAW;AAClF,EAAA,MAAM,QAAQA,yBAAA,EAAS;AACvB,EAAA,MAAM,EAAE,MAAA,GAAS,KAAA,CAAM,MAAA,EAAQ,GAAG,QAAO,GAAI,IAAA;AAC7C,EAAA,OAAO,YAAA,CAAa,MAAA,EAAQ,MAAM,CAAA,CAAE,OAAO,KAAK,CAAA;AAClD","file":"chunk-CTOPKHEE.js","sourcesContent":["import { getBrand } from '../brand';\n\n/**\n * Formatters numéricos del kit. Wrappers finos sobre Intl.NumberFormat que\n * leen los defaults de `getBrand()` (currency/locale), igual que MoneyInput.\n * El core no asume país: CLP/es-CL son solo el default configurable.\n *\n * Las instancias de Intl.NumberFormat se cachean por combinación resuelta:\n * construirlas es caro (~100x más que .format()) y el caso de uso típico es\n * una celda por fila en tablas grandes. Las combos reales por app son pocas,\n * así que el Map no necesita evicción.\n */\nconst cache = new Map<string, Intl.NumberFormat>();\n\nfunction getFormatter(locale: string, options: Intl.NumberFormatOptions): Intl.NumberFormat {\n const key = locale + JSON.stringify(options);\n let nf = cache.get(key);\n if (!nf) {\n nf = new Intl.NumberFormat(locale, options);\n cache.set(key, nf);\n }\n return nf;\n}\n\nexport interface FormatCurrencyOptions {\n /** Código ISO 4217. Default: `getBrand().currency`. */\n currency?: string;\n /** Locale BCP 47. Default: `getBrand().locale`. */\n locale?: string;\n /**\n * Por defecto Intl usa los decimales propios de la moneda\n * (CLP → 0, USD → 2). Override solo si necesitas forzarlos.\n */\n minimumFractionDigits?: number;\n maximumFractionDigits?: number;\n}\n\n/** Formatea un monto como moneda: `formatCurrency(1234567)` → `\"$1.234.567\"` (CLP/es-CL). */\nexport function formatCurrency(value: number, opts: FormatCurrencyOptions = {}): string {\n const brand = getBrand();\n const { currency = brand.currency, locale = brand.locale, ...digits } = opts;\n return getFormatter(locale, { style: 'currency', currency, ...digits }).format(value);\n}\n\nexport interface FormatNumberOptions {\n /** Locale BCP 47. Default: `getBrand().locale`. */\n locale?: string;\n minimumFractionDigits?: number;\n maximumFractionDigits?: number;\n}\n\n/** Formatea un número con separador de miles del locale: `formatNumber(1234567)` → `\"1.234.567\"` (es-CL). */\nexport function formatNumber(value: number, opts: FormatNumberOptions = {}): string {\n const brand = getBrand();\n const { locale = brand.locale, ...digits } = opts;\n return getFormatter(locale, digits).format(value);\n}\n"]}
@@ -1,10 +1,10 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
+ var chunkD2H4VZVL_js = require('./chunk-D2H4VZVL.js');
4
5
  var chunkFL4ZCWUF_js = require('./chunk-FL4ZCWUF.js');
5
6
  var chunkNPXEZCTA_js = require('./chunk-NPXEZCTA.js');
6
7
  var chunk55P5FA5Q_js = require('./chunk-55P5FA5Q.js');
7
- var chunkD2H4VZVL_js = require('./chunk-D2H4VZVL.js');
8
8
  var chunkUBSBSZPB_js = require('./chunk-UBSBSZPB.js');
9
9
  var chunkC4AKMVDZ_js = require('./chunk-C4AKMVDZ.js');
10
10
  var chunkPASF6T4H_js = require('./chunk-PASF6T4H.js');
@@ -146,5 +146,5 @@ function Drawer({
146
146
 
147
147
  exports.Drawer = Drawer;
148
148
  exports.Modal = Modal;
149
- //# sourceMappingURL=chunk-F3PTSBHH.js.map
150
- //# sourceMappingURL=chunk-F3PTSBHH.js.map
149
+ //# sourceMappingURL=chunk-DWLTIERK.js.map
150
+ //# sourceMappingURL=chunk-DWLTIERK.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Overlay.tsx"],"names":["React","useLocale","useDelayedUnmount","useEscape","useFocusTrap","useScrollLock","createPortal","jsx","cx","jsxs","X"],"mappings":"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","file":"chunk-F3PTSBHH.js","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { cx } from '../utils/cx';\nimport { X } from './Icons';\nimport { useLocale } from '../locale/LocaleProvider';\nimport { useDelayedUnmount } from '../hooks/useDelayedUnmount';\nimport { useFocusTrap, useEscape, useScrollLock } from '../hooks';\n\n// Exit animation duration in ms. Must match `--duration-exit` and the\n// `is-closing` keyframes in src/styles/index.css (`.modal-backdrop`,\n// `.drawer-backdrop`).\nconst EXIT_MS = 150;\n\nexport interface OverlayProps {\n open: boolean;\n onClose: () => void;\n title?: React.ReactNode;\n children?: React.ReactNode;\n footer?: React.ReactNode;\n size?: 'sm' | 'md' | 'lg';\n closeOnBackdrop?: boolean;\n closeOnEsc?: boolean;\n className?: string;\n}\n\nexport function Modal({\n open, onClose, title, children, footer, size = 'md',\n closeOnBackdrop = true, closeOnEsc = true, className,\n}: OverlayProps) {\n const ref = React.useRef<HTMLDivElement>(null);\n // True only when the press both started AND ended on the backdrop itself.\n // Fixes: press inside (e.g. text-selecting in an input) released over the\n // backdrop must NOT dismiss.\n const downOnBackdrop = React.useRef(false);\n const titleId = React.useId();\n const t = useLocale();\n // useDelayedUnmount keeps the DOM mounted during exit animation. The\n // a11y/scroll-lock hooks still consume `open` (the user's intent), not\n // `mounted` — we don't want to trap focus or block scroll while\n // animating out.\n const { mounted, closing } = useDelayedUnmount(open, EXIT_MS);\n useEscape(open, onClose, closeOnEsc);\n useFocusTrap(ref, open);\n useScrollLock(open);\n if (!mounted || typeof document === 'undefined') return null;\n return createPortal(\n <div\n className={cx('modal-backdrop', closing && 'is-closing')}\n onMouseDown={(e) => { downOnBackdrop.current = e.target === e.currentTarget; }}\n onClick={(e) => {\n if (closeOnBackdrop && downOnBackdrop.current && e.target === e.currentTarget) onClose();\n downOnBackdrop.current = false;\n }}\n >\n <div\n ref={ref}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n className={cx('modal', `modal--${size}`, closing && 'is-closing', className)}\n >\n {title && (\n <div className=\"modal__header\">\n <div id={titleId} className=\"modal__title\">{title}</div>\n <button type=\"button\" className=\"modal__close\" onClick={onClose} aria-label={t['modal.close']}><X size={18} /></button>\n </div>\n )}\n <div className=\"modal__body\">{children}</div>\n {footer && <div className=\"modal__footer\">{footer}</div>}\n </div>\n </div>,\n document.body\n );\n}\n\nexport interface DrawerProps extends OverlayProps {\n side?: 'left' | 'right';\n}\n\nexport function Drawer({\n open, onClose, title, children, footer, side = 'right',\n closeOnBackdrop = true, closeOnEsc = true, className,\n}: DrawerProps) {\n const ref = React.useRef<HTMLDivElement>(null);\n // True only when the press both started AND ended on the backdrop itself.\n // Fixes: press inside (e.g. text-selecting in an input) released over the\n // backdrop must NOT dismiss.\n const downOnBackdrop = React.useRef(false);\n const titleId = React.useId();\n const t = useLocale();\n const { mounted, closing } = useDelayedUnmount(open, EXIT_MS);\n useEscape(open, onClose, closeOnEsc);\n useFocusTrap(ref, open);\n useScrollLock(open);\n if (!mounted || typeof document === 'undefined') return null;\n return createPortal(\n <div\n className={cx('drawer-backdrop', closing && 'is-closing')}\n onMouseDown={(e) => { downOnBackdrop.current = e.target === e.currentTarget; }}\n onClick={(e) => {\n if (closeOnBackdrop && downOnBackdrop.current && e.target === e.currentTarget) onClose();\n downOnBackdrop.current = false;\n }}\n >\n <div\n ref={ref}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n className={cx('drawer', `drawer--${side}`, closing && 'is-closing', className)}\n >\n {title && (\n <div className=\"drawer__header\">\n <div id={titleId} className=\"drawer__title\">{title}</div>\n <button type=\"button\" className=\"drawer__close\" onClick={onClose} aria-label={t['drawer.close']}><X size={18} /></button>\n </div>\n )}\n <div className=\"drawer__body\">{children}</div>\n {footer && <div className=\"drawer__footer\">{footer}</div>}\n </div>\n </div>,\n document.body\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/Overlay.tsx"],"names":["React","useLocale","useDelayedUnmount","useEscape","useFocusTrap","useScrollLock","createPortal","jsx","cx","jsxs","X"],"mappings":"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","file":"chunk-DWLTIERK.js","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { cx } from '../utils/cx';\nimport { X } from './Icons';\nimport { useLocale } from '../locale/LocaleProvider';\nimport { useDelayedUnmount } from '../hooks/useDelayedUnmount';\nimport { useFocusTrap, useEscape, useScrollLock } from '../hooks';\n\n// Exit animation duration in ms. Must match `--duration-exit` and the\n// `is-closing` keyframes in src/styles/index.css (`.modal-backdrop`,\n// `.drawer-backdrop`).\nconst EXIT_MS = 150;\n\nexport interface OverlayProps {\n open: boolean;\n onClose: () => void;\n title?: React.ReactNode;\n children?: React.ReactNode;\n footer?: React.ReactNode;\n size?: 'sm' | 'md' | 'lg';\n closeOnBackdrop?: boolean;\n closeOnEsc?: boolean;\n className?: string;\n}\n\nexport function Modal({\n open, onClose, title, children, footer, size = 'md',\n closeOnBackdrop = true, closeOnEsc = true, className,\n}: OverlayProps) {\n const ref = React.useRef<HTMLDivElement>(null);\n // True only when the press both started AND ended on the backdrop itself.\n // Fixes: press inside (e.g. text-selecting in an input) released over the\n // backdrop must NOT dismiss.\n const downOnBackdrop = React.useRef(false);\n const titleId = React.useId();\n const t = useLocale();\n // useDelayedUnmount keeps the DOM mounted during exit animation. The\n // a11y/scroll-lock hooks still consume `open` (the user's intent), not\n // `mounted` — we don't want to trap focus or block scroll while\n // animating out.\n const { mounted, closing } = useDelayedUnmount(open, EXIT_MS);\n useEscape(open, onClose, closeOnEsc);\n useFocusTrap(ref, open);\n useScrollLock(open);\n if (!mounted || typeof document === 'undefined') return null;\n return createPortal(\n <div\n className={cx('modal-backdrop', closing && 'is-closing')}\n onMouseDown={(e) => { downOnBackdrop.current = e.target === e.currentTarget; }}\n onClick={(e) => {\n if (closeOnBackdrop && downOnBackdrop.current && e.target === e.currentTarget) onClose();\n downOnBackdrop.current = false;\n }}\n >\n <div\n ref={ref}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n className={cx('modal', `modal--${size}`, closing && 'is-closing', className)}\n >\n {title && (\n <div className=\"modal__header\">\n <div id={titleId} className=\"modal__title\">{title}</div>\n <button type=\"button\" className=\"modal__close\" onClick={onClose} aria-label={t['modal.close']}><X size={18} /></button>\n </div>\n )}\n <div className=\"modal__body\">{children}</div>\n {footer && <div className=\"modal__footer\">{footer}</div>}\n </div>\n </div>,\n document.body\n );\n}\n\nexport interface DrawerProps extends OverlayProps {\n side?: 'left' | 'right';\n}\n\nexport function Drawer({\n open, onClose, title, children, footer, side = 'right',\n closeOnBackdrop = true, closeOnEsc = true, className,\n}: DrawerProps) {\n const ref = React.useRef<HTMLDivElement>(null);\n // True only when the press both started AND ended on the backdrop itself.\n // Fixes: press inside (e.g. text-selecting in an input) released over the\n // backdrop must NOT dismiss.\n const downOnBackdrop = React.useRef(false);\n const titleId = React.useId();\n const t = useLocale();\n const { mounted, closing } = useDelayedUnmount(open, EXIT_MS);\n useEscape(open, onClose, closeOnEsc);\n useFocusTrap(ref, open);\n useScrollLock(open);\n if (!mounted || typeof document === 'undefined') return null;\n return createPortal(\n <div\n className={cx('drawer-backdrop', closing && 'is-closing')}\n onMouseDown={(e) => { downOnBackdrop.current = e.target === e.currentTarget; }}\n onClick={(e) => {\n if (closeOnBackdrop && downOnBackdrop.current && e.target === e.currentTarget) onClose();\n downOnBackdrop.current = false;\n }}\n >\n <div\n ref={ref}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n className={cx('drawer', `drawer--${side}`, closing && 'is-closing', className)}\n >\n {title && (\n <div className=\"drawer__header\">\n <div id={titleId} className=\"drawer__title\">{title}</div>\n <button type=\"button\" className=\"drawer__close\" onClick={onClose} aria-label={t['drawer.close']}><X size={18} /></button>\n </div>\n )}\n <div className=\"drawer__body\">{children}</div>\n {footer && <div className=\"drawer__footer\">{footer}</div>}\n </div>\n </div>,\n document.body\n );\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunkF3PTSBHH_js = require('./chunk-F3PTSBHH.js');
4
+ var chunkDWLTIERK_js = require('./chunk-DWLTIERK.js');
5
5
  var chunk6SSTTJV4_js = require('./chunk-6SSTTJV4.js');
6
6
  var chunkUBSBSZPB_js = require('./chunk-UBSBSZPB.js');
7
7
  var chunkC4AKMVDZ_js = require('./chunk-C4AKMVDZ.js');
@@ -55,7 +55,7 @@ function ConfirmDialog({
55
55
  }
56
56
  };
57
57
  return /* @__PURE__ */ jsxRuntime.jsx(
58
- chunkF3PTSBHH_js.Modal,
58
+ chunkDWLTIERK_js.Modal,
59
59
  {
60
60
  open,
61
61
  onClose,
@@ -194,5 +194,5 @@ exports.DescriptionList = DescriptionList;
194
194
  exports.DescriptionListItem = DescriptionListItem;
195
195
  exports.DiffViewer = DiffViewer;
196
196
  exports.TransferList = TransferList;
197
- //# sourceMappingURL=chunk-565UJQ2M.js.map
198
- //# sourceMappingURL=chunk-565UJQ2M.js.map
197
+ //# sourceMappingURL=chunk-H4EL7J2O.js.map
198
+ //# sourceMappingURL=chunk-H4EL7J2O.js.map