@arqel-dev/ui 0.15.0 → 0.16.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 (100) hide show
  1. package/README.md +1 -1
  2. package/dist/{AreaChart-NMQ2RQGA.js → AreaChart-JAZ6LUYG.js} +8 -4
  3. package/dist/AreaChart-JAZ6LUYG.js.map +1 -0
  4. package/dist/ArqelCreatePage-UZAHV4DK.js +8 -0
  5. package/dist/{ArqelCreatePage-MV4JN2MO.js.map → ArqelCreatePage-UZAHV4DK.js.map} +1 -1
  6. package/dist/ArqelDashboardPage-Z5R4XSH4.js +6 -0
  7. package/dist/{ArqelDashboardPage-QK3BYVK3.js.map → ArqelDashboardPage-Z5R4XSH4.js.map} +1 -1
  8. package/dist/ArqelEditPage-RRYFYOTC.js +8 -0
  9. package/dist/{ArqelShowPage-5WWUSYC7.js.map → ArqelEditPage-RRYFYOTC.js.map} +1 -1
  10. package/dist/ArqelIndexPage-J2EUV2PI.js +12 -0
  11. package/dist/{ArqelIndexPage-R6JL5KOH.js.map → ArqelIndexPage-J2EUV2PI.js.map} +1 -1
  12. package/dist/ArqelShowPage-TVCJAV2F.js +6 -0
  13. package/dist/{ArqelEditPage-7J3IS2BR.js.map → ArqelShowPage-TVCJAV2F.js.map} +1 -1
  14. package/dist/{BarChart-KLHKTLO2.js → BarChart-E52NJSJE.js} +8 -4
  15. package/dist/BarChart-E52NJSJE.js.map +1 -0
  16. package/dist/{DonutChart-L56R4QF2.js → DonutChart-IGSF4LEB.js} +3 -3
  17. package/dist/{DonutChart-L56R4QF2.js.map → DonutChart-IGSF4LEB.js.map} +1 -1
  18. package/dist/{FormRenderer-BJBRIkfH.d.ts → FormRenderer-By8fZp4t.d.ts} +2 -0
  19. package/dist/{LineChart-GHMPHFZZ.js → LineChart-RRPGAZON.js} +8 -4
  20. package/dist/LineChart-RRPGAZON.js.map +1 -0
  21. package/dist/PieChart-SGN7V5LQ.js +4 -0
  22. package/dist/{PieChart-T2VQOFPP.js.map → PieChart-SGN7V5LQ.js.map} +1 -1
  23. package/dist/{RadarChart-CSWR5AO7.js → RadarChart-3AOM736J.js} +8 -4
  24. package/dist/RadarChart-3AOM736J.js.map +1 -0
  25. package/dist/{Topbar-DffcNdcJ.d.ts → UserMenu-B5XbC_Gy.d.ts} +24 -4
  26. package/dist/action.js +3 -3
  27. package/dist/{chunk-BJER6TOI.js → chunk-3VSDQCFO.js} +3 -3
  28. package/dist/{chunk-BJER6TOI.js.map → chunk-3VSDQCFO.js.map} +1 -1
  29. package/dist/{chunk-ZAM5TUPP.js → chunk-CMNZLA32.js} +60 -25
  30. package/dist/chunk-CMNZLA32.js.map +1 -0
  31. package/dist/{chunk-CVAMCRLL.js → chunk-EG2DASKR.js} +8 -4
  32. package/dist/chunk-EG2DASKR.js.map +1 -0
  33. package/dist/{chunk-DSULVRB6.js → chunk-GJ2FKAOM.js} +5 -3
  34. package/dist/chunk-GJ2FKAOM.js.map +1 -0
  35. package/dist/{chunk-FV7RESKL.js → chunk-HNUUZEOL.js} +28 -16
  36. package/dist/chunk-HNUUZEOL.js.map +1 -0
  37. package/dist/{chunk-37FLEB4N.js → chunk-IO6RMVUF.js} +8 -4
  38. package/dist/chunk-IO6RMVUF.js.map +1 -0
  39. package/dist/{chunk-N6WLCHQE.js → chunk-Q7WGPKUN.js} +6 -4
  40. package/dist/chunk-Q7WGPKUN.js.map +1 -0
  41. package/dist/{chunk-AZICSFBA.js → chunk-S5UNPCMQ.js} +112 -38
  42. package/dist/chunk-S5UNPCMQ.js.map +1 -0
  43. package/dist/{chunk-MTNFFSVA.js → chunk-SK6H7ARE.js} +5 -3
  44. package/dist/chunk-SK6H7ARE.js.map +1 -0
  45. package/dist/{chunk-FP5R6WED.js → chunk-SLLTFOOS.js} +22 -14
  46. package/dist/chunk-SLLTFOOS.js.map +1 -0
  47. package/dist/{chunk-3HN4ARGG.js → chunk-VKZY6J6G.js} +34 -3
  48. package/dist/chunk-VKZY6J6G.js.map +1 -0
  49. package/dist/{chunk-PSPJA5U6.js → chunk-WMOBLT3Z.js} +10 -5
  50. package/dist/chunk-WMOBLT3Z.js.map +1 -0
  51. package/dist/{chunk-C5H44NSP.js → chunk-WZRPGPLH.js} +10 -5
  52. package/dist/chunk-WZRPGPLH.js.map +1 -0
  53. package/dist/{chunk-N5U2BB6T.js → chunk-X2X6YDOX.js} +102 -28
  54. package/dist/chunk-X2X6YDOX.js.map +1 -0
  55. package/dist/{chunk-4I5S6MH3.js → chunk-X4ZFKOPX.js} +4 -4
  56. package/dist/{chunk-4I5S6MH3.js.map → chunk-X4ZFKOPX.js.map} +1 -1
  57. package/dist/{chunk-UXN67E5L.js → chunk-YQ6KXR3U.js} +8 -10
  58. package/dist/chunk-YQ6KXR3U.js.map +1 -0
  59. package/dist/{chunk-HSDZM4AM.js → chunk-YYQ45W25.js} +37 -24
  60. package/dist/chunk-YYQ45W25.js.map +1 -0
  61. package/dist/flash.js +1 -1
  62. package/dist/form.d.ts +3 -1
  63. package/dist/form.js +1 -1
  64. package/dist/index.d.ts +2 -2
  65. package/dist/index.js +10 -10
  66. package/dist/pages.js +17 -17
  67. package/dist/palette.js +1 -1
  68. package/dist/resource.js +2 -2
  69. package/dist/shell.d.ts +1 -1
  70. package/dist/shell.js +9 -5
  71. package/dist/shell.js.map +1 -1
  72. package/dist/table.js +1 -1
  73. package/dist/utility.js +1 -1
  74. package/dist/widgets.js +2 -2
  75. package/package.json +6 -6
  76. package/dist/AreaChart-NMQ2RQGA.js.map +0 -1
  77. package/dist/ArqelCreatePage-MV4JN2MO.js +0 -8
  78. package/dist/ArqelDashboardPage-QK3BYVK3.js +0 -6
  79. package/dist/ArqelEditPage-7J3IS2BR.js +0 -8
  80. package/dist/ArqelIndexPage-R6JL5KOH.js +0 -12
  81. package/dist/ArqelShowPage-5WWUSYC7.js +0 -6
  82. package/dist/BarChart-KLHKTLO2.js.map +0 -1
  83. package/dist/LineChart-GHMPHFZZ.js.map +0 -1
  84. package/dist/PieChart-T2VQOFPP.js +0 -4
  85. package/dist/RadarChart-CSWR5AO7.js.map +0 -1
  86. package/dist/chunk-37FLEB4N.js.map +0 -1
  87. package/dist/chunk-3HN4ARGG.js.map +0 -1
  88. package/dist/chunk-AZICSFBA.js.map +0 -1
  89. package/dist/chunk-C5H44NSP.js.map +0 -1
  90. package/dist/chunk-CVAMCRLL.js.map +0 -1
  91. package/dist/chunk-DSULVRB6.js.map +0 -1
  92. package/dist/chunk-FP5R6WED.js.map +0 -1
  93. package/dist/chunk-FV7RESKL.js.map +0 -1
  94. package/dist/chunk-HSDZM4AM.js.map +0 -1
  95. package/dist/chunk-MTNFFSVA.js.map +0 -1
  96. package/dist/chunk-N5U2BB6T.js.map +0 -1
  97. package/dist/chunk-N6WLCHQE.js.map +0 -1
  98. package/dist/chunk-PSPJA5U6.js.map +0 -1
  99. package/dist/chunk-UXN67E5L.js.map +0 -1
  100. package/dist/chunk-ZAM5TUPP.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/palette/CommandPalette.tsx"],"names":[],"mappings":"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","file":"chunk-HNUUZEOL.js","sourcesContent":["/**\n * `<CommandPalette>` — global Cmd+K admin command palette.\n *\n * Wraps the `/admin/commands` endpoint shipped by `arqel-dev/core` (CMDPAL-002)\n * with a native `<dialog>`-based modal. No external dialog/combobox library\n * is used: the surface area is small enough that the platform primitives\n * (HTML dialog + ARIA combobox/listbox roles) cover every requirement.\n *\n * Usage: render once at the top of `<AppShell>` — the global Cmd+K /\n * Ctrl+K listener is mounted on `window` while the component is alive.\n */\n\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport { type CSSProperties, useCallback, useEffect, useId, useRef, useState } from 'react';\n\nexport interface PaletteCommand {\n id: string;\n label: string;\n url: string;\n description?: string | null;\n category?: string | null;\n icon?: string | null;\n}\n\nexport interface CommandPaletteProps {\n /** Endpoint that returns `{ commands: PaletteCommand[] }`. */\n endpoint?: string;\n}\n\ninterface RecentEntry {\n id: string;\n count: number;\n lastUsed: number;\n command: PaletteCommand;\n}\n\nconst RECENT_KEY = 'arqel:cmdpal:recent';\nconst RECENT_WINDOW_MS = 30 * 24 * 60 * 60 * 1000; // 30 days\nconst RECENT_LIMIT = 5;\nconst DEBOUNCE_MS = 150;\n\nfunction readRecents(): RecentEntry[] {\n try {\n const raw = globalThis.localStorage?.getItem(RECENT_KEY);\n if (!raw) return [];\n const parsed: unknown = JSON.parse(raw);\n if (!Array.isArray(parsed)) return [];\n const now = Date.now();\n return parsed.filter(\n (e): e is RecentEntry =>\n typeof e === 'object' &&\n e !== null &&\n typeof (e as RecentEntry).id === 'string' &&\n typeof (e as RecentEntry).count === 'number' &&\n typeof (e as RecentEntry).lastUsed === 'number' &&\n now - (e as RecentEntry).lastUsed <= RECENT_WINDOW_MS &&\n typeof (e as RecentEntry).command === 'object',\n );\n } catch {\n return [];\n }\n}\n\nfunction writeRecents(entries: RecentEntry[]): void {\n try {\n globalThis.localStorage?.setItem(RECENT_KEY, JSON.stringify(entries));\n } catch {\n // Ignore quota/serialization failures — recents are best-effort.\n }\n}\n\nfunction recordUsage(command: PaletteCommand): void {\n const entries = readRecents();\n const now = Date.now();\n const idx = entries.findIndex((e) => e.id === command.id);\n if (idx >= 0) {\n const existing = entries[idx];\n if (existing) {\n entries[idx] = {\n ...existing,\n count: existing.count + 1,\n lastUsed: now,\n command,\n };\n }\n } else {\n entries.push({ id: command.id, count: 1, lastUsed: now, command });\n }\n // Prune anything older than the recency window.\n const fresh = entries.filter((e) => now - e.lastUsed <= RECENT_WINDOW_MS);\n writeRecents(fresh);\n}\n\nfunction topRecents(): PaletteCommand[] {\n return readRecents()\n .slice()\n .sort((a, b) => (b.count === a.count ? b.lastUsed - a.lastUsed : b.count - a.count))\n .slice(0, RECENT_LIMIT)\n .map((e) => e.command);\n}\n\ninterface Group {\n /** Stable bucket identity (React key). For uncategorized commands this is\n * the sentinel `__general` so the visible heading can be localized at\n * render without colliding with a real category literally named \"General\". */\n category: string;\n commands: PaletteCommand[];\n}\n\n/** Sentinel bucket ids whose visible heading is resolved via i18n at render. */\nconst GENERAL_CATEGORY = '__general';\nconst RECENT_CATEGORY = '__recent';\n\nfunction groupByCategory(commands: PaletteCommand[]): Group[] {\n const order: string[] = [];\n const buckets = new Map<string, PaletteCommand[]>();\n for (const cmd of commands) {\n const key = cmd.category ?? GENERAL_CATEGORY;\n if (!buckets.has(key)) {\n buckets.set(key, []);\n order.push(key);\n }\n buckets.get(key)?.push(cmd);\n }\n return order.map((category) => ({ category, commands: buckets.get(category) ?? [] }));\n}\n\nfunction flattenGroups(groups: Group[]): PaletteCommand[] {\n return groups.flatMap((g) => g.commands);\n}\n\nconst dialogStyle: CSSProperties = {\n border: 'none',\n borderRadius: '0.75rem',\n padding: 0,\n width: 'min(640px, 92vw)',\n maxHeight: '70vh',\n background: 'var(--background, #fff)',\n color: 'var(--foreground, #111)',\n};\n\nexport function CommandPalette({ endpoint = '/admin/commands' }: CommandPaletteProps) {\n const t = useArqelTranslations();\n const dialogRef = useRef<HTMLDialogElement | null>(null);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const debounceTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [results, setResults] = useState<PaletteCommand[]>([]);\n const [recents, setRecents] = useState<PaletteCommand[]>([]);\n const [highlight, setHighlight] = useState(0);\n\n const titleId = useId();\n const hintId = useId();\n const listId = useId();\n const optBaseId = useId();\n\n const visibleCommands = query.trim().length === 0 ? recents : results;\n const groups =\n query.trim().length === 0 && recents.length > 0\n ? [{ category: RECENT_CATEGORY, commands: recents }]\n : groupByCategory(visibleCommands);\n\n // Resolve the visible heading for a group, localizing the synthetic\n // \"General\"/\"Recent\" buckets while passing real categories through verbatim.\n const categoryLabel = (category: string): string => {\n if (category === GENERAL_CATEGORY) {\n return t('arqel.command_palette.category_general', 'General');\n }\n if (category === RECENT_CATEGORY) {\n return t('arqel.command_palette.category_recent', 'Recent');\n }\n return category;\n };\n const flat = flattenGroups(groups);\n\n // Cmd+K / Ctrl+K global toggle.\n useEffect(() => {\n function onKey(event: KeyboardEvent) {\n const isToggle = (event.key === 'k' || event.key === 'K') && (event.metaKey || event.ctrlKey);\n if (!isToggle) return;\n event.preventDefault();\n setOpen((prev) => !prev);\n }\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, []);\n\n // Sync `open` state with the native <dialog>.\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n if (open && !dialog.open) {\n try {\n dialog.showModal();\n } catch {\n // jsdom or already-open: ignore.\n }\n setRecents(topRecents());\n setQuery('');\n setResults([]);\n setHighlight(0);\n // Defer focus after the dialog is on-screen.\n queueMicrotask(() => inputRef.current?.focus());\n } else if (!open && dialog.open) {\n dialog.close();\n }\n }, [open]);\n\n // Debounced fetch.\n useEffect(() => {\n if (!open) return;\n if (query.trim().length === 0) {\n setResults([]);\n return;\n }\n if (debounceTimer.current) clearTimeout(debounceTimer.current);\n debounceTimer.current = setTimeout(() => {\n const url = `${endpoint}?q=${encodeURIComponent(query)}`;\n fetch(url, { headers: { Accept: 'application/json' } })\n .then((res) => (res.ok ? res.json() : { commands: [] }))\n .then((data: { commands?: PaletteCommand[] }) => {\n setResults(Array.isArray(data?.commands) ? data.commands : []);\n setHighlight(0);\n })\n .catch(() => {\n setResults([]);\n });\n }, DEBOUNCE_MS);\n return () => {\n if (debounceTimer.current) clearTimeout(debounceTimer.current);\n };\n }, [query, open, endpoint]);\n\n const close = useCallback(() => setOpen(false), []);\n\n const execute = useCallback((command: PaletteCommand) => {\n recordUsage(command);\n setOpen(false);\n window.location.assign(command.url);\n }, []);\n\n const onKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n close();\n return;\n }\n if (flat.length === 0) return;\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n setHighlight((h) => (h + 1) % flat.length);\n } else if (event.key === 'ArrowUp') {\n event.preventDefault();\n setHighlight((h) => (h - 1 + flat.length) % flat.length);\n } else if (event.key === 'Enter') {\n event.preventDefault();\n const target = flat[highlight];\n if (target) execute(target);\n }\n },\n [flat, highlight, close, execute],\n );\n\n // Close on backdrop click — dialog click hits the dialog itself, not children.\n const onDialogClick = useCallback(\n (event: React.MouseEvent<HTMLDialogElement>) => {\n if (event.target === dialogRef.current) close();\n },\n [close],\n );\n\n const optionId = (idx: number) => `${optBaseId}-opt-${idx}`;\n const activeOptionId = flat.length > 0 ? optionId(highlight) : undefined;\n\n return (\n // biome-ignore lint/a11y/useKeyWithClickEvents: dialog backdrop click closes; Escape (onCancel) handles keyboard close\n <dialog\n ref={dialogRef}\n aria-labelledby={titleId}\n aria-describedby={hintId}\n onClick={onDialogClick}\n onClose={() => setOpen(false)}\n onCancel={(event) => {\n event.preventDefault();\n close();\n }}\n style={dialogStyle}\n className=\"backdrop:bg-black/40\"\n data-arqel-cmdpal=\"\"\n >\n {/* biome-ignore lint/a11y/noStaticElementInteractions: this wrapper only delegates ArrowUp/Down/Enter/Escape from the combobox input below */}\n <div onKeyDown={onKeyDown} className=\"flex flex-col\">\n <h2 id={titleId} className=\"sr-only\">\n {t('arqel.aria.palette_title', 'Command palette')}\n </h2>\n <input\n ref={inputRef}\n type=\"text\"\n role=\"combobox\"\n aria-expanded={open}\n aria-controls={listId}\n aria-autocomplete=\"list\"\n {...(activeOptionId ? { 'aria-activedescendant': activeOptionId } : {})}\n placeholder={t('palette.placeholder', 'Type a command…')}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n className=\"w-full border-b border-[var(--border,#e5e7eb)] bg-transparent px-4 py-3 text-base outline-none\"\n />\n <div role=\"status\" aria-live=\"polite\" className=\"sr-only\">\n {t('arqel.aria.palette_results', '{one} :count command|{other} :count commands', {\n count: flat.length,\n })}\n </div>\n <ul\n id={listId}\n // biome-ignore lint/a11y/noNoninteractiveElementToInteractiveRole: WAI-ARIA combobox/listbox pattern requires <ul role=\"listbox\">\n role=\"listbox\"\n aria-label={t('arqel.aria.palette_list', 'Commands')}\n className=\"max-h-[50vh] overflow-y-auto py-2\"\n >\n {groups.length === 0 && (\n <li role=\"presentation\" className=\"px-4 py-3 text-sm opacity-60\">\n {t('arqel.palette.no_results', 'No commands found')}\n </li>\n )}\n {groups.map((group) => {\n const startIdx = flat.indexOf(group.commands[0] ?? ({} as PaletteCommand));\n return (\n <li key={group.category} role=\"presentation\">\n <div\n role=\"presentation\"\n className=\"px-4 pt-2 pb-1 text-xs font-semibold uppercase tracking-wide opacity-60\"\n >\n {categoryLabel(group.category)}\n </div>\n <ul role=\"presentation\" className=\"m-0 list-none p-0\">\n {group.commands.map((cmd, j) => {\n const idx = startIdx + j;\n const isActive = idx === highlight;\n return (\n // biome-ignore lint/a11y/useFocusableInteractive: focus stays on combobox; selection via aria-activedescendant\n // biome-ignore lint/a11y/useKeyWithClickEvents: keyboard nav handled by combobox input ArrowUp/Down/Enter handler\n <li\n key={cmd.id}\n id={optionId(idx)}\n // biome-ignore lint/a11y/noNoninteractiveElementToInteractiveRole: WAI-ARIA combobox/listbox pattern requires <li role=\"option\">\n role=\"option\"\n aria-selected={isActive}\n data-active={isActive ? '' : undefined}\n onMouseEnter={() => setHighlight(idx)}\n onClick={() => execute(cmd)}\n className={\n 'flex cursor-pointer items-center gap-3 px-4 py-2 text-sm ' +\n (isActive ? 'bg-[var(--accent,#f1f5f9)]' : '')\n }\n >\n <span className=\"flex-1\">{cmd.label}</span>\n {cmd.description ? (\n <span className=\"text-xs opacity-60\">{cmd.description}</span>\n ) : null}\n </li>\n );\n })}\n </ul>\n </li>\n );\n })}\n </ul>\n <footer\n id={hintId}\n className=\"flex items-center gap-3 border-t border-[var(--border,#e5e7eb)] px-4 py-2 text-xs opacity-70\"\n >\n <span>{t('arqel.palette.hint_navigate', '↑↓ navigate')}</span>\n <span>{t('arqel.palette.hint_select', '↵ select')}</span>\n <span>{t('arqel.palette.hint_close', 'esc close')}</span>\n </footer>\n </div>\n </dialog>\n );\n}\n"]}
@@ -1,7 +1,8 @@
1
1
  import { PageHeader } from './chunk-MXUXMHOK.js';
2
2
  import { FormActions } from './chunk-MZMYV43C.js';
3
- import { FormRenderer } from './chunk-ZAM5TUPP.js';
3
+ import { FormRenderer } from './chunk-CMNZLA32.js';
4
4
  import { useArqelForm } from '@arqel-dev/hooks';
5
+ import { useArqelTranslations } from '@arqel-dev/react/utils';
5
6
  import { usePage, router } from '@inertiajs/react';
6
7
  import { jsxs, jsx } from 'react/jsx-runtime';
7
8
 
@@ -14,6 +15,7 @@ var FALLBACK_SCHEMA = {
14
15
  };
15
16
  function ArqelCreatePage() {
16
17
  const page = usePage();
18
+ const t = useArqelTranslations();
17
19
  const props = page.props;
18
20
  const fields = props.fields ?? [];
19
21
  const schema = props.form ?? FALLBACK_SCHEMA;
@@ -26,8 +28,10 @@ function ArqelCreatePage() {
26
28
  preserveScroll: true
27
29
  });
28
30
  };
31
+ const label = props.resource?.label ?? t("arqel.pages.fallback", "record");
32
+ const createTitle = t("arqel.pages.create", `Create ${label}`, { label });
29
33
  return /* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
30
- /* @__PURE__ */ jsx(PageHeader, { title: `Create ${props.resource?.label ?? "record"}`, description: null }),
34
+ /* @__PURE__ */ jsx(PageHeader, { title: createTitle, description: null }),
31
35
  /* @__PURE__ */ jsxs("form", { onSubmit: submit, className: "space-y-6", children: [
32
36
  /* @__PURE__ */ jsx(
33
37
  FormRenderer,
@@ -45,5 +49,5 @@ function ArqelCreatePage() {
45
49
  }
46
50
 
47
51
  export { ArqelCreatePage };
48
- //# sourceMappingURL=chunk-37FLEB4N.js.map
49
- //# sourceMappingURL=chunk-37FLEB4N.js.map
52
+ //# sourceMappingURL=chunk-IO6RMVUF.js.map
53
+ //# sourceMappingURL=chunk-IO6RMVUF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/pages/ArqelCreatePage.tsx"],"names":[],"mappings":";;;;;;;;AAoBA,IAAM,eAAA,GAA8B;AAAA,EAClC,QAAQ,EAAC;AAAA,EACT,OAAA,EAAS,CAAA;AAAA,EACT,KAAA,EAAO,IAAA;AAAA,EACP,MAAA,EAAQ,KAAA;AAAA,EACR,QAAA,EAAU;AACZ,CAAA;AASe,SAAR,eAAA,GAAgD;AACrD,EAAA,MAAM,OAAO,OAAA,EAAQ;AACrB,EAAA,MAAM,IAAI,oBAAA,EAAqB;AAC/B,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,EAAA,MAAM,MAAA,GAAU,KAAA,CAAM,MAAA,IAAU,EAAC;AACjC,EAAA,MAAM,MAAA,GAAU,MAA2C,IAAA,IAAQ,eAAA;AAEnE,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,EAAE,MAAA,EAAQ,CAAA;AAEpC,EAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAuB;AACrC,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,QAAA,EAAU,IAAA,IAAQ,EAAA;AACrC,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,QAAA,EAAU,SAAA,IAAa,QAAA;AAC9C,IAAA,MAAA,CAAO,KAAK,CAAA,EAAG,QAAQ,IAAI,IAAI,CAAA,CAAA,EAAI,KAAK,IAAA,EAA+B;AAAA,MACrE,cAAA,EAAgB;AAAA,KACjB,CAAA;AAAA,EACH,CAAA;AAKA,EAAA,MAAM,QAAQ,KAAA,CAAM,QAAA,EAAU,KAAA,IAAS,CAAA,CAAE,wBAAwB,QAAQ,CAAA;AACzE,EAAA,MAAM,WAAA,GAAc,EAAE,oBAAA,EAAsB,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA,EAAI,EAAE,OAAO,CAAA;AAExE,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAO,WAAA,EAAa,WAAA,EAAa,IAAA,EAAM,CAAA;AAAA,oBACnD,IAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAU,MAAA,EAAQ,WAAU,WAAA,EAChC,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,MAAA;AAAA,UACA,MAAA;AAAA,UACA,QAAQ,IAAA,CAAK,IAAA;AAAA,UACb,UAAU,CAAC,IAAA,EAAM,UAAU,IAAA,CAAK,OAAA,CAAQ,MAAM,KAAK,CAAA;AAAA,UACnD,QAAQ,IAAA,CAAK;AAAA;AAAA,OACf;AAAA,sBACA,GAAA,CAAC,WAAA,EAAA,EAAY,UAAA,EAAY,IAAA,CAAK,UAAA,EAAY,UAAU,MAAM,MAAA,CAAO,OAAA,CAAQ,IAAA,EAAK,EAAG;AAAA,KAAA,EACnF;AAAA,GAAA,EACF,CAAA;AAEJ","file":"chunk-IO6RMVUF.js","sourcesContent":["/**\n * Default Inertia page for `arqel::create`.\n *\n * Renders a `<FormRenderer>` over the schema/fields the server\n * emits (with `record: null`). Submission goes through Inertia's\n * `useForm` via `useArqelForm` from `@arqel-dev/hooks` — this page is\n * just the layout shell.\n */\n\nimport { useArqelForm } from '@arqel-dev/hooks';\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport type { FieldSchema } from '@arqel-dev/types/fields';\nimport type { FormSchema } from '@arqel-dev/types/forms';\nimport type { ResourceCreateProps } from '@arqel-dev/types/resources';\nimport { router, usePage } from '@inertiajs/react';\nimport type { FormEvent, JSX } from 'react';\nimport { FormActions } from '../form/FormActions.js';\nimport { FormRenderer } from '../form/FormRenderer.js';\nimport { PageHeader } from '../utility/PageHeader.js';\n\nconst FALLBACK_SCHEMA: FormSchema = {\n schema: [],\n columns: 1,\n model: null,\n inline: false,\n disabled: false,\n};\n\ninterface ArqelFormShape {\n data: Record<string, unknown>;\n setData: (name: string, value: unknown) => void;\n errors: Record<string, string[]>;\n processing: boolean;\n}\n\nexport default function ArqelCreatePage(): JSX.Element {\n const page = usePage();\n const t = useArqelTranslations();\n const props = page.props as unknown as ResourceCreateProps;\n const fields = (props.fields ?? []) as FieldSchema[];\n const schema = (props as unknown as { form?: FormSchema }).form ?? FALLBACK_SCHEMA;\n\n const form = useArqelForm({ fields }) as unknown as ArqelFormShape;\n\n const submit = (e: FormEvent): void => {\n e.preventDefault();\n const slug = props.resource?.slug ?? '';\n const basePath = props.resource?.panelPath ?? '/admin';\n router.post(`${basePath}/${slug}`, form.data as Record<string, never>, {\n preserveScroll: true,\n });\n };\n\n // Pre-interpolate the label into the English fallback so the title stays\n // correct even when the `arqel.pages.create` key is absent from the shared\n // dictionary (the hook does not re-interpolate a raw fallback).\n const label = props.resource?.label ?? t('arqel.pages.fallback', 'record');\n const createTitle = t('arqel.pages.create', `Create ${label}`, { label });\n\n return (\n <div className=\"space-y-6\">\n <PageHeader title={createTitle} description={null} />\n <form onSubmit={submit} className=\"space-y-6\">\n <FormRenderer\n schema={schema}\n fields={fields}\n values={form.data}\n onChange={(name, value) => form.setData(name, value)}\n errors={form.errors}\n />\n <FormActions processing={form.processing} onCancel={() => window.history.back()} />\n </form>\n </div>\n );\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  import { PageHeader } from './chunk-MXUXMHOK.js';
2
- import { FormRenderer } from './chunk-ZAM5TUPP.js';
2
+ import { FormRenderer } from './chunk-CMNZLA32.js';
3
+ import { useArqelTranslations } from '@arqel-dev/react/utils';
3
4
  import { usePage } from '@inertiajs/react';
4
5
  import { jsxs, jsx } from 'react/jsx-runtime';
5
6
 
@@ -12,6 +13,7 @@ var FALLBACK_SCHEMA = {
12
13
  };
13
14
  function ArqelShowPage() {
14
15
  const page = usePage();
16
+ const t = useArqelTranslations();
15
17
  const props = page.props;
16
18
  const fields = props.fields ?? [];
17
19
  const values = {};
@@ -27,7 +29,7 @@ function ArqelShowPage() {
27
29
  /* @__PURE__ */ jsx(
28
30
  PageHeader,
29
31
  {
30
- title: props.recordTitle ?? props.resource?.label ?? "Record",
32
+ title: props.recordTitle ?? props.resource?.label ?? t("arqel.pages.record", "Record"),
31
33
  description: props.recordSubtitle ?? null
32
34
  }
33
35
  ),
@@ -46,5 +48,5 @@ function ArqelShowPage() {
46
48
  }
47
49
 
48
50
  export { ArqelShowPage };
49
- //# sourceMappingURL=chunk-N6WLCHQE.js.map
50
- //# sourceMappingURL=chunk-N6WLCHQE.js.map
51
+ //# sourceMappingURL=chunk-Q7WGPKUN.js.map
52
+ //# sourceMappingURL=chunk-Q7WGPKUN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/pages/ArqelShowPage.tsx"],"names":[],"mappings":";;;;;;AAiBA,IAAM,eAAA,GAA8B;AAAA,EAClC,QAAQ,EAAC;AAAA,EACT,OAAA,EAAS,CAAA;AAAA,EACT,KAAA,EAAO,IAAA;AAAA,EACP,MAAA,EAAQ,KAAA;AAAA,EACR,QAAA,EAAU;AACZ,CAAA;AAEe,SAAR,aAAA,GAAuF;AAC5F,EAAA,MAAM,OAAO,OAAA,EAAQ;AACrB,EAAA,MAAM,IAAI,oBAAA,EAAqB;AAC/B,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,EAAA,MAAM,MAAA,GAAU,KAAA,CAAM,MAAA,IAAU,EAAC;AAIjC,EAAA,MAAM,SAAkC,EAAC;AACzC,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AACnB,IAAA,IAAI,OAAO,SAAS,QAAA,IAAY,KAAA,CAAM,WAAW,IAAA,IAAQ,OAAO,KAAA,CAAM,MAAA,KAAW,QAAA,EAAU;AACzF,MAAA,MAAA,CAAO,IAAI,CAAA,GAAK,KAAA,CAAM,MAAA,CAAmC,IAAI,CAAA;AAAA,IAC/D;AAAA,EACF;AAEA,EAAA,MAAM,eAAgB,KAAA,CAA2C,IAAA;AACjE,EAAA,MAAM,SAAqB,YAAA,GAAe,EAAE,GAAG,YAAA,EAAc,QAAA,EAAU,MAAK,GAAI,eAAA;AAEhF,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,MAAM,WAAA,IAAe,KAAA,CAAM,UAAU,KAAA,IAAS,CAAA,CAAE,sBAAsB,QAAQ,CAAA;AAAA,QACrF,WAAA,EAAa,MAAM,cAAA,IAAkB;AAAA;AAAA,KACvC;AAAA,oBACA,GAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,MAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA;AAAA,QACA,UAAU,MAAM;AAAA,QAEhB,CAAA;AAAA,QACA,QAAQ;AAAC;AAAA;AACX,GAAA,EACF,CAAA;AAEJ","file":"chunk-Q7WGPKUN.js","sourcesContent":["/**\n * Default Inertia page for `arqel::show`.\n *\n * Read-only render of the record. Re-uses `<FormRenderer>` with\n * every field forced to disabled — keeps a single rendering path\n * for create/edit/show without a parallel \"DetailRenderer\" stack.\n */\n\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport type { FieldSchema } from '@arqel-dev/types/fields';\nimport type { FormSchema } from '@arqel-dev/types/forms';\nimport type { RecordType, ResourceDetailProps } from '@arqel-dev/types/resources';\nimport { usePage } from '@inertiajs/react';\nimport type { JSX } from 'react';\nimport { FormRenderer } from '../form/FormRenderer.js';\nimport { PageHeader } from '../utility/PageHeader.js';\n\nconst FALLBACK_SCHEMA: FormSchema = {\n schema: [],\n columns: 1,\n model: null,\n inline: false,\n disabled: true,\n};\n\nexport default function ArqelShowPage<TRecord extends RecordType = RecordType>(): JSX.Element {\n const page = usePage();\n const t = useArqelTranslations();\n const props = page.props as unknown as ResourceDetailProps<TRecord>;\n const fields = (props.fields ?? []) as FieldSchema[];\n\n // Seed values from the record so FormRenderer has something to\n // display. Detail mode disables every field.\n const values: Record<string, unknown> = {};\n for (const field of fields) {\n const name = field.name;\n if (typeof name === 'string' && props.record !== null && typeof props.record === 'object') {\n values[name] = (props.record as Record<string, unknown>)[name];\n }\n }\n\n const declaredForm = (props as unknown as { form?: FormSchema }).form;\n const schema: FormSchema = declaredForm ? { ...declaredForm, disabled: true } : FALLBACK_SCHEMA;\n\n return (\n <div className=\"space-y-6\">\n <PageHeader\n title={props.recordTitle ?? props.resource?.label ?? t('arqel.pages.record', 'Record')}\n description={props.recordSubtitle ?? null}\n />\n <FormRenderer\n schema={schema}\n fields={fields}\n values={values}\n onChange={() => {\n // No-op — show pages are read-only.\n }}\n errors={{}}\n />\n </div>\n );\n}\n"]}
@@ -1,10 +1,10 @@
1
1
  import { resolveLucideIcon } from './chunk-RMPOR2YZ.js';
2
2
  import { Button } from './chunk-H23VX3RR.js';
3
3
  import { cn } from './chunk-B7ULUJVO.js';
4
+ import { useArqelTranslations, useArqelLocale } from '@arqel-dev/react/utils';
4
5
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
5
6
  import { useReactTable, getCoreRowModel, flexRender } from '@tanstack/react-table';
6
7
  import { useRef, useMemo, useCallback } from 'react';
7
- import { useArqelTranslations } from '@arqel-dev/react/utils';
8
8
 
9
9
  function TableCell({ column, value }) {
10
10
  switch (column.type) {
@@ -95,46 +95,93 @@ function BadgeCell({ column, value }) {
95
95
  );
96
96
  }
97
97
  function BooleanCell({ column, value }) {
98
+ const t = useArqelTranslations();
98
99
  const truthy = Boolean(value);
99
- return /* @__PURE__ */ jsx("span", { role: "img", "aria-label": truthy ? "true" : "false", children: truthy ? column.props.trueIcon ?? "\u2713" : column.props.falseIcon ?? "\u2014" });
100
+ const ariaLabel = truthy ? t("table.boolean.true_label", "true") : t("table.boolean.false_label", "false");
101
+ return /* @__PURE__ */ jsx("span", { role: "img", "aria-label": ariaLabel, children: truthy ? column.props.trueIcon ?? "\u2713" : column.props.falseIcon ?? "\u2014" });
100
102
  }
101
103
  function DateCell({ column, value }) {
104
+ const locale = useArqelLocale();
102
105
  if (!value) return /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "\u2014" });
103
106
  const raw = String(value);
104
107
  const date = new Date(raw);
105
108
  if (Number.isNaN(date.getTime())) return /* @__PURE__ */ jsx("span", { children: raw });
109
+ const timeZone = column.props.timezone || void 0;
106
110
  if (column.props.mode === "since") {
107
- return /* @__PURE__ */ jsx("time", { dateTime: date.toISOString(), children: formatRelative(date) });
111
+ return /* @__PURE__ */ jsx("time", { dateTime: date.toISOString(), children: formatRelative(date, locale) });
108
112
  }
109
113
  if (column.props.mode === "datetime") {
110
- return /* @__PURE__ */ jsx("time", { dateTime: date.toISOString(), children: date.toLocaleString() });
114
+ return /* @__PURE__ */ jsx("time", { dateTime: date.toISOString(), children: formatDate(date, locale, "datetime", timeZone) });
115
+ }
116
+ return /* @__PURE__ */ jsx("time", { dateTime: date.toISOString(), children: formatDate(date, locale, "date", timeZone) });
117
+ }
118
+ function formatDate(date, locale, mode, timeZone) {
119
+ const options = mode === "datetime" ? { dateStyle: "medium", timeStyle: "short" } : { dateStyle: "medium" };
120
+ if (timeZone !== void 0) options.timeZone = timeZone;
121
+ try {
122
+ return new Intl.DateTimeFormat(locale, options).format(date);
123
+ } catch {
124
+ if (timeZone !== void 0) {
125
+ const { timeZone: _drop, ...rest } = options;
126
+ return new Intl.DateTimeFormat(locale, rest).format(date);
127
+ }
128
+ return mode === "datetime" ? date.toISOString() : date.toISOString().slice(0, 10);
111
129
  }
112
- return /* @__PURE__ */ jsx("time", { dateTime: date.toISOString(), children: date.toLocaleDateString() });
113
130
  }
114
- function formatRelative(date) {
131
+ function formatRelative(date, locale) {
115
132
  const seconds = Math.round((Date.now() - date.getTime()) / 1e3);
116
- if (seconds < 60) return `${seconds}s ago`;
133
+ const rtf = new Intl.RelativeTimeFormat(locale, { numeric: "auto" });
134
+ const absSeconds = Math.abs(seconds);
135
+ if (absSeconds < 60) return rtf.format(-seconds, "second");
117
136
  const minutes = Math.round(seconds / 60);
118
- if (minutes < 60) return `${minutes}m ago`;
137
+ if (Math.abs(minutes) < 60) return rtf.format(-minutes, "minute");
119
138
  const hours = Math.round(minutes / 60);
120
- if (hours < 24) return `${hours}h ago`;
139
+ if (Math.abs(hours) < 24) return rtf.format(-hours, "hour");
121
140
  const days = Math.round(hours / 24);
122
- return `${days}d ago`;
141
+ return rtf.format(-days, "day");
123
142
  }
124
143
  function NumberCell({ column, value }) {
144
+ const locale = useArqelLocale();
125
145
  if (value === null || value === void 0) return /* @__PURE__ */ jsx("span", { children: "\u2014" });
126
146
  const num = typeof value === "number" ? value : Number(value);
127
147
  if (Number.isNaN(num)) return /* @__PURE__ */ jsx("span", { children: asString(value) });
128
- const formatted = num.toFixed(column.props.decimals ?? 0);
129
- const [whole, dec] = formatted.split(".");
130
- const safeWhole = whole ?? "0";
148
+ if (column.props.currency) {
149
+ try {
150
+ const formatted = new Intl.NumberFormat(locale, {
151
+ style: "currency",
152
+ currency: column.props.currency,
153
+ ...column.props.decimals !== void 0 ? {
154
+ minimumFractionDigits: column.props.decimals,
155
+ maximumFractionDigits: column.props.decimals
156
+ } : {}
157
+ }).format(num);
158
+ return /* @__PURE__ */ jsxs("span", { children: [
159
+ column.props.prefix ?? "",
160
+ formatted,
161
+ column.props.suffix ?? ""
162
+ ] });
163
+ } catch {
164
+ }
165
+ }
166
+ const decimals = column.props.decimals ?? 0;
131
167
  const ts = column.props.thousandsSeparator;
132
- const finalWhole = ts ? safeWhole.replace(/\B(?=(\d{3})+(?!\d))/g, ts) : safeWhole;
133
- const ds = column.props.decimalSeparator ?? ".";
168
+ const ds = column.props.decimalSeparator;
169
+ let body;
170
+ if (ts === void 0 && ds === void 0) {
171
+ body = new Intl.NumberFormat(locale, {
172
+ minimumFractionDigits: decimals,
173
+ maximumFractionDigits: decimals
174
+ }).format(num);
175
+ } else {
176
+ const formatted = num.toFixed(decimals);
177
+ const [whole, dec] = formatted.split(".");
178
+ const safeWhole = whole ?? "0";
179
+ const finalWhole = ts ? safeWhole.replace(/\B(?=(\d{3})+(?!\d))/g, ts) : safeWhole;
180
+ body = dec ? `${finalWhole}${ds ?? "."}${dec}` : finalWhole;
181
+ }
134
182
  return /* @__PURE__ */ jsxs("span", { children: [
135
183
  column.props.prefix ?? "",
136
- finalWhole,
137
- dec ? `${ds}${dec}` : "",
184
+ body,
138
185
  column.props.suffix ?? ""
139
186
  ] });
140
187
  }
@@ -182,6 +229,7 @@ function DataTable({
182
229
  emptyState,
183
230
  className
184
231
  }) {
232
+ const t = useArqelTranslations();
185
233
  const lastClickedIndexRef = useRef(null);
186
234
  const visibleColumns = useMemo(() => columns.filter((col) => !col.hidden), [columns]);
187
235
  const tableColumns = useMemo(
@@ -241,7 +289,7 @@ function DataTable({
241
289
  "input",
242
290
  {
243
291
  type: "checkbox",
244
- "aria-label": "Select all rows",
292
+ "aria-label": t("table.bulk.select_all_rows", "Select all rows"),
245
293
  checked: allSelected,
246
294
  ref: (el) => {
247
295
  if (el) el.indeterminate = someSelected;
@@ -288,7 +336,14 @@ function DataTable({
288
336
  header.id
289
337
  );
290
338
  }),
291
- rowActions && /* @__PURE__ */ jsx("th", { scope: "col", className: "w-24 px-3 py-2 text-right", "aria-label": "Actions" })
339
+ rowActions && /* @__PURE__ */ jsx(
340
+ "th",
341
+ {
342
+ scope: "col",
343
+ className: "w-24 px-3 py-2 text-right",
344
+ "aria-label": t("table.column.actions", "Actions")
345
+ }
346
+ )
292
347
  ] }, group.id)) }),
293
348
  /* @__PURE__ */ jsxs("tbody", { children: [
294
349
  loading && /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx(
@@ -296,7 +351,7 @@ function DataTable({
296
351
  {
297
352
  colSpan: visibleColumns.length + (enableSelection ? 1 : 0) + (rowActions ? 1 : 0),
298
353
  className: "px-3 py-4 text-center text-muted-foreground",
299
- children: "Loading\u2026"
354
+ children: t("table.loading", "Loading\u2026")
300
355
  }
301
356
  ) }),
302
357
  !loading && records.length === 0 && /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx(
@@ -304,7 +359,7 @@ function DataTable({
304
359
  {
305
360
  colSpan: visibleColumns.length + (enableSelection ? 1 : 0) + (rowActions ? 1 : 0),
306
361
  className: "px-3 py-8 text-center text-muted-foreground",
307
- children: emptyState ?? "No records found."
362
+ children: emptyState ?? t("table.empty", "No records found.")
308
363
  }
309
364
  ) }),
310
365
  !loading && table.getRowModel().rows.map((row, index) => {
@@ -320,7 +375,9 @@ function DataTable({
320
375
  "input",
321
376
  {
322
377
  type: "checkbox",
323
- "aria-label": `Select row ${record.id}`,
378
+ "aria-label": t("table.bulk.select_row", `Select row ${record.id}`, {
379
+ id: String(record.id)
380
+ }),
324
381
  checked,
325
382
  onChange: (event) => {
326
383
  const native = event.nativeEvent;
@@ -377,12 +434,13 @@ function DataCards({
377
434
  loading,
378
435
  emptyState
379
436
  }) {
437
+ const t = useArqelTranslations();
380
438
  const cardColumns = columns.filter((col) => !col.hiddenOnMobile);
381
439
  if (loading) {
382
- return /* @__PURE__ */ jsx("div", { className: "px-3 py-4 text-center text-muted-foreground md:hidden", children: "Loading\u2026" });
440
+ return /* @__PURE__ */ jsx("div", { className: "px-3 py-4 text-center text-muted-foreground md:hidden", children: t("table.loading", "Loading\u2026") });
383
441
  }
384
442
  if (rows.length === 0) {
385
- return /* @__PURE__ */ jsx("div", { className: "px-3 py-8 text-center text-muted-foreground md:hidden", children: emptyState ?? "No records found." });
443
+ return /* @__PURE__ */ jsx("div", { className: "px-3 py-8 text-center text-muted-foreground md:hidden", children: emptyState ?? t("table.empty", "No records found.") });
386
444
  }
387
445
  return /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-3 md:hidden", children: rows.map((row, index) => {
388
446
  const record = row.original;
@@ -399,7 +457,9 @@ function DataCards({
399
457
  "input",
400
458
  {
401
459
  type: "checkbox",
402
- "aria-label": `Select row ${record.id}`,
460
+ "aria-label": t("table.bulk.select_row", `Select row ${record.id}`, {
461
+ id: String(record.id)
462
+ }),
403
463
  className: "size-5",
404
464
  checked,
405
465
  onChange: (event) => {
@@ -444,7 +504,7 @@ function TableFilters({
444
504
  return v !== void 0 && v !== null && v !== "" ? acc + 1 : acc;
445
505
  }, 0);
446
506
  return /* @__PURE__ */ jsxs("fieldset", { className: cn("flex flex-wrap items-end gap-2 border-0 p-0", className), children: [
447
- /* @__PURE__ */ jsx("legend", { className: "sr-only", children: "Filters" }),
507
+ /* @__PURE__ */ jsx("legend", { className: "sr-only", children: t("table.filters.legend", "Filters") }),
448
508
  filters.map((filter) => /* @__PURE__ */ jsx(
449
509
  FilterControl,
450
510
  {
@@ -567,8 +627,8 @@ function TernaryFilter({
567
627
  },
568
628
  children: [
569
629
  /* @__PURE__ */ jsx("option", { value: "all", children: filter.props.allLabel ?? t("table.filters.all", "All") }),
570
- /* @__PURE__ */ jsx("option", { value: "true", children: filter.props.trueLabel ?? "Yes" }),
571
- /* @__PURE__ */ jsx("option", { value: "false", children: filter.props.falseLabel ?? "No" })
630
+ /* @__PURE__ */ jsx("option", { value: "true", children: filter.props.trueLabel ?? t("table.filters.yes", "Yes") }),
631
+ /* @__PURE__ */ jsx("option", { value: "false", children: filter.props.falseLabel ?? t("table.filters.no", "No") })
572
632
  ]
573
633
  }
574
634
  )
@@ -582,8 +642,13 @@ function TablePagination({
582
642
  className
583
643
  }) {
584
644
  const t = useArqelTranslations();
585
- const from = (meta.currentPage - 1) * meta.perPage + 1;
586
- const to = Math.min(meta.currentPage * meta.perPage, meta.total);
645
+ const locale = useArqelLocale();
646
+ const numberFormatter = useMemo(() => new Intl.NumberFormat(locale), [locale]);
647
+ const fromRaw = (meta.currentPage - 1) * meta.perPage + 1;
648
+ const toRaw = Math.min(meta.currentPage * meta.perPage, meta.total);
649
+ const from = numberFormatter.format(fromRaw);
650
+ const to = numberFormatter.format(toRaw);
651
+ const total = numberFormatter.format(meta.total);
587
652
  const isFirst = meta.currentPage <= 1;
588
653
  const isLast = meta.currentPage >= meta.lastPage;
589
654
  return /* @__PURE__ */ jsxs(
@@ -593,9 +658,16 @@ function TablePagination({
593
658
  "flex flex-wrap items-center justify-between gap-2 border-t border-border px-3 py-2 text-sm",
594
659
  className
595
660
  ),
596
- "aria-label": "Pagination",
661
+ "aria-label": t("table.pagination.label", "Pagination"),
597
662
  children: [
598
- /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: meta.total === 0 ? t("table.empty", "No results") : `${from}\u2013${to} of ${meta.total}` }),
663
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: meta.total === 0 ? t("table.empty", "No records found.") : t(
664
+ "table.pagination.showing",
665
+ // Fallback is rendered verbatim when the key is missing, so it must
666
+ // already carry the interpolated values (the replacements map only
667
+ // applies to a resolved dictionary string).
668
+ `Showing ${from} to ${to} of ${total} results`,
669
+ { from, to, total }
670
+ ) }),
599
671
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
600
672
  onPerPageChange && /* @__PURE__ */ jsxs("label", { className: "flex items-center gap-1 text-xs text-muted-foreground", children: [
601
673
  t("table.per_page", "Per page"),
@@ -622,9 +694,9 @@ function TablePagination({
622
694
  }
623
695
  ),
624
696
  /* @__PURE__ */ jsxs("span", { className: "text-xs text-muted-foreground", children: [
625
- meta.currentPage,
697
+ numberFormatter.format(meta.currentPage),
626
698
  " / ",
627
- meta.lastPage
699
+ numberFormatter.format(meta.lastPage)
628
700
  ] }),
629
701
  /* @__PURE__ */ jsx(
630
702
  Button,
@@ -661,9 +733,11 @@ function TableToolbar({
661
733
  "section",
662
734
  {
663
735
  className: "flex flex-wrap items-center gap-2 rounded-sm border border-border bg-muted px-3 py-2",
664
- "aria-label": "Bulk actions",
736
+ "aria-label": t("table.bulk.label", "Bulk actions"),
665
737
  children: [
666
- /* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: t("table.bulk.selected", `${selectedCount} selected`, { count: selectedCount }) }),
738
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: t("table.bulk.selected", "{one} :count selected|{other} :count selected", {
739
+ count: selectedCount
740
+ }) }),
667
741
  /* @__PURE__ */ jsxs("div", { className: "ml-auto flex flex-wrap items-center gap-2", children: [
668
742
  bulkActions,
669
743
  onClearSelection && /* @__PURE__ */ jsx(
@@ -683,5 +757,5 @@ function TableToolbar({
683
757
  }
684
758
 
685
759
  export { DataTable, TableCell, TableFilters, TablePagination, TableToolbar };
686
- //# sourceMappingURL=chunk-AZICSFBA.js.map
687
- //# sourceMappingURL=chunk-AZICSFBA.js.map
760
+ //# sourceMappingURL=chunk-S5UNPCMQ.js.map
761
+ //# sourceMappingURL=chunk-S5UNPCMQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/table/cells.tsx","../src/table/DataTable.tsx","../src/table/TableFilters.tsx","../src/table/TablePagination.tsx","../src/table/TableToolbar.tsx"],"names":["useArqelTranslations","jsx","jsxs","useArqelLocale","useMemo"],"mappings":";;;;;;;;AA8BO,SAAS,SAAA,CAAU,EAAE,MAAA,EAAQ,KAAA,EAAM,EAAc;AACtD,EAAA,QAAQ,OAAO,IAAA;AAAM,IACnB,KAAK,MAAA;AACH,MAAA,uBAAO,GAAA,CAAC,QAAA,EAAA,EAAS,MAAA,EAAgB,KAAA,EAAc,CAAA;AAAA,IACjD,KAAK,OAAA;AACH,MAAA,uBAAO,GAAA,CAAC,SAAA,EAAA,EAAU,MAAA,EAAgB,KAAA,EAAc,CAAA;AAAA,IAClD,KAAK,SAAA;AACH,MAAA,uBAAO,GAAA,CAAC,WAAA,EAAA,EAAY,MAAA,EAAgB,KAAA,EAAc,CAAA;AAAA,IACpD,KAAK,MAAA;AACH,MAAA,uBAAO,GAAA,CAAC,QAAA,EAAA,EAAS,MAAA,EAAgB,KAAA,EAAc,CAAA;AAAA,IACjD,KAAK,QAAA;AACH,MAAA,uBAAO,GAAA,CAAC,UAAA,EAAA,EAAW,MAAA,EAAgB,KAAA,EAAc,CAAA;AAAA,IACnD,KAAK,MAAA;AACH,MAAA,uBAAO,GAAA,CAAC,YAAS,MAAA,EAAgB,CAAA;AAAA,IACnC,KAAK,OAAA;AACH,MAAA,uBAAO,GAAA,CAAC,SAAA,EAAA,EAAU,MAAA,EAAgB,KAAA,EAAc,CAAA;AAAA,IAClD,KAAK,cAAA;AACH,MAAA,uBAAO,GAAA,CAAC,gBAAA,EAAA,EAAiB,MAAA,EAAgB,KAAA,EAAc,CAAA;AAAA,IACzD,KAAK,UAAA;AACH,MAAA,uBAAO,GAAA,CAAC,YAAA,EAAA,EAAa,MAAA,EAAgB,KAAA,EAAc,CAAA;AAAA;AAEzD;AAEA,SAAS,SAAS,KAAA,EAAwB;AACxC,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW,OAAO,EAAA;AAClD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,EAAA,IAAI,OAAO,UAAU,QAAA,IAAY,OAAO,UAAU,SAAA,EAAW,OAAO,OAAO,KAAK,CAAA;AAChF,EAAA,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAC7B;AAEA,SAAS,QAAA,CAAS,EAAE,MAAA,EAAQ,KAAA,EAAM,EAAiD;AACjF,EAAA,MAAM,GAAA,GAAM,SAAS,KAAK,CAAA;AAC1B,EAAA,MAAM,YACJ,MAAA,CAAO,KAAA,CAAM,QAAA,IAAY,GAAA,CAAI,SAAS,MAAA,CAAO,KAAA,CAAM,QAAA,GAC/C,CAAA,EAAG,IAAI,KAAA,CAAM,CAAA,EAAG,OAAO,KAAA,CAAM,QAAQ,CAAC,CAAA,MAAA,CAAA,GACtC,GAAA;AACN,EAAA,uBACE,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,MAAA,CAAO,KAAA,CAAM,MAAA,KAAW,MAAA,IAAU,WAAA;AAAA,QAClC,MAAA,CAAO,KAAA,CAAM,MAAA,KAAW,QAAA,IAAY;AAAA,OACtC;AAAA,MAEC,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ;AASA,IAAM,iBAAA,GAA4C;AAAA,EAChD,IAAA,EAAM,0BAAA;AAAA,EACN,KAAA,EAAO,sEAAA;AAAA,EACP,IAAA,EAAM,kEAAA;AAAA,EACN,GAAA,EAAK,8DAAA;AAAA,EACL,MAAA,EAAQ,0EAAA;AAAA,EACR,KAAA,EAAO,sEAAA;AAAA,EACP,MAAA,EAAQ,0EAAA;AAAA,EACR,IAAA,EAAM,kEAAA;AAAA,EACN,KAAA,EAAO,sEAAA;AAAA,EACP,OAAA,EAAS,8EAAA;AAAA,EACT,IAAA,EAAM,kEAAA;AAAA,EACN,IAAA,EAAM,kEAAA;AAAA,EACN,GAAA,EAAK,8DAAA;AAAA,EACL,IAAA,EAAM,kEAAA;AAAA,EACN,MAAA,EAAQ,0EAAA;AAAA,EACR,MAAA,EAAQ,0EAAA;AAAA,EACR,MAAA,EAAQ,0EAAA;AAAA,EACR,OAAA,EAAS,8EAAA;AAAA,EACT,IAAA,EAAM,kEAAA;AAAA,EACN,IAAA,EAAM;AACR,CAAA;AAEA,IAAM,iBAAA,GAAoB,0BAAA;AAE1B,SAAS,SAAA,CAAU,EAAE,MAAA,EAAQ,KAAA,EAAM,EAAkD;AACnF,EAAA,MAAM,GAAA,GAAM,SAAS,KAAK,CAAA;AAC1B,EAAA,MAAM,MAAA,GAAS,OAAO,KAAA,CAAM,OAAA,EAAS,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,KAAK,CAAA;AAClE,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,GAAA;AAE/B,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,KAAA,CAAM,MAAA,GAAS,GAAG,CAAA;AAC5C,EAAA,MAAM,UAAA,GAAc,UAAA,IAAc,iBAAA,CAAkB,UAAU,CAAA,IAAM,iBAAA;AAEpE,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,KAAA,CAAM,KAAA,GAAQ,GAAG,CAAA;AACzC,EAAA,MAAM,IAAA,GAAO,QAAA,GAAW,iBAAA,CAAkB,QAAQ,CAAA,GAAI,MAAA;AAEtD,EAAA,uBACE,IAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,gEAAA;AAAA,QACA,MAAA,CAAO,KAAA,CAAM,IAAA,GAAO,cAAA,GAAiB,YAAA;AAAA,QACrC;AAAA,OACF;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,IAAA,uBAAQ,IAAA,EAAA,EAAK,SAAA,EAAU,iBAAA,EAAkB,aAAA,EAAW,MAAC,CAAA,GAAK,IAAA;AAAA,QAC1D;AAAA;AAAA;AAAA,GACH;AAEJ;AAEA,SAAS,WAAA,CAAY,EAAE,MAAA,EAAQ,KAAA,EAAM,EAAoD;AACvF,EAAA,MAAM,IAAI,oBAAA,EAAqB;AAC/B,EAAA,MAAM,MAAA,GAAS,QAAQ,KAAK,CAAA;AAG5B,EAAA,MAAM,SAAA,GAAY,SACd,CAAA,CAAE,0BAAA,EAA4B,MAAM,CAAA,GACpC,CAAA,CAAE,6BAA6B,OAAO,CAAA;AAC1C,EAAA,uBACE,GAAA,CAAC,MAAA,EAAA,EAAK,IAAA,EAAK,KAAA,EAAM,cAAY,SAAA,EAC1B,QAAA,EAAA,MAAA,GAAU,MAAA,CAAO,KAAA,CAAM,QAAA,IAAY,QAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,aAAa,QAAA,EACxE,CAAA;AAEJ;AAEA,SAAS,QAAA,CAAS,EAAE,MAAA,EAAQ,KAAA,EAAM,EAAiD;AAGjF,EAAA,MAAM,SAAS,cAAA,EAAe;AAC9B,EAAA,IAAI,CAAC,KAAA,EAAO,2BAAQ,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAwB,QAAA,EAAA,QAAA,EAAC,CAAA;AAC5D,EAAA,MAAM,GAAA,GAAM,OAAO,KAAK,CAAA;AACxB,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,GAAG,CAAA;AACzB,EAAA,IAAI,MAAA,CAAO,MAAM,IAAA,CAAK,OAAA,EAAS,CAAA,EAAG,uBAAO,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,GAAA,EAAI,CAAA;AAGpD,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,KAAA,CAAM,QAAA,IAAY,MAAA;AAC1C,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,IAAA,KAAS,OAAA,EAAS;AACjC,IAAA,uBAAO,GAAA,CAAC,UAAK,QAAA,EAAU,IAAA,CAAK,aAAY,EAAI,QAAA,EAAA,cAAA,CAAe,IAAA,EAAM,MAAM,CAAA,EAAE,CAAA;AAAA,EAC3E;AACA,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,IAAA,KAAS,UAAA,EAAY;AACpC,IAAA,uBACE,GAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAU,IAAA,CAAK,WAAA,EAAY,EAAI,QAAA,EAAA,UAAA,CAAW,IAAA,EAAM,MAAA,EAAQ,UAAA,EAAY,QAAQ,CAAA,EAAE,CAAA;AAAA,EAExF;AACA,EAAA,uBAAO,GAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAU,IAAA,CAAK,WAAA,EAAY,EAAI,QAAA,EAAA,UAAA,CAAW,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,QAAQ,CAAA,EAAE,CAAA;AACzF;AAEA,SAAS,UAAA,CACP,IAAA,EACA,MAAA,EACA,IAAA,EACA,QAAA,EACQ;AACR,EAAA,MAAM,OAAA,GACJ,IAAA,KAAS,UAAA,GAAa,EAAE,SAAA,EAAW,QAAA,EAAU,SAAA,EAAW,OAAA,EAAQ,GAAI,EAAE,SAAA,EAAW,QAAA,EAAS;AAC5F,EAAA,IAAI,QAAA,KAAa,MAAA,EAAW,OAAA,CAAQ,QAAA,GAAW,QAAA;AAC/C,EAAA,IAAI;AACF,IAAA,OAAO,IAAI,IAAA,CAAK,cAAA,CAAe,QAAQ,OAAO,CAAA,CAAE,OAAO,IAAI,CAAA;AAAA,EAC7D,CAAA,CAAA,MAAQ;AAEN,IAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,MAAA,MAAM,EAAE,QAAA,EAAU,KAAA,EAAO,GAAG,MAAK,GAAI,OAAA;AACrC,MAAA,OAAO,IAAI,IAAA,CAAK,cAAA,CAAe,QAAQ,IAAI,CAAA,CAAE,OAAO,IAAI,CAAA;AAAA,IAC1D;AACA,IAAA,OAAO,IAAA,KAAS,UAAA,GAAa,IAAA,CAAK,WAAA,EAAY,GAAI,KAAK,WAAA,EAAY,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,EAClF;AACF;AAEA,SAAS,cAAA,CAAe,MAAY,MAAA,EAAwB;AAC1D,EAAA,MAAM,OAAA,GAAU,KAAK,KAAA,CAAA,CAAO,IAAA,CAAK,KAAI,GAAI,IAAA,CAAK,OAAA,EAAQ,IAAK,GAAI,CAAA;AAC/D,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,kBAAA,CAAmB,QAAQ,EAAE,OAAA,EAAS,QAAQ,CAAA;AAEnE,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA;AACnC,EAAA,IAAI,aAAa,EAAA,EAAI,OAAO,IAAI,MAAA,CAAO,CAAC,SAAS,QAAQ,CAAA;AACzD,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AACvC,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA,GAAI,EAAA,SAAW,GAAA,CAAI,MAAA,CAAO,CAAC,OAAA,EAAS,QAAQ,CAAA;AAChE,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AACrC,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,EAAA,SAAW,GAAA,CAAI,MAAA,CAAO,CAAC,KAAA,EAAO,MAAM,CAAA;AAC1D,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,EAAE,CAAA;AAClC,EAAA,OAAO,GAAA,CAAI,MAAA,CAAO,CAAC,IAAA,EAAM,KAAK,CAAA;AAChC;AAEA,SAAS,UAAA,CAAW,EAAE,MAAA,EAAQ,KAAA,EAAM,EAAmD;AACrF,EAAA,MAAM,SAAS,cAAA,EAAe;AAC9B,EAAA,IAAI,UAAU,IAAA,IAAQ,KAAA,KAAU,QAAW,uBAAO,GAAA,CAAC,UAAK,QAAA,EAAA,QAAA,EAAC,CAAA;AACzD,EAAA,MAAM,MAAM,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,OAAO,KAAK,CAAA;AAC5D,EAAA,IAAI,MAAA,CAAO,MAAM,GAAG,CAAA,yBAAU,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,QAAA,CAAS,KAAK,CAAA,EAAE,CAAA;AAIrD,EAAA,IAAI,MAAA,CAAO,MAAM,QAAA,EAAU;AACzB,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ;AAAA,QAC9C,KAAA,EAAO,UAAA;AAAA,QACP,QAAA,EAAU,OAAO,KAAA,CAAM,QAAA;AAAA,QACvB,GAAI,MAAA,CAAO,KAAA,CAAM,QAAA,KAAa,KAAA,CAAA,GAC1B;AAAA,UACE,qBAAA,EAAuB,OAAO,KAAA,CAAM,QAAA;AAAA,UACpC,qBAAA,EAAuB,OAAO,KAAA,CAAM;AAAA,YAEtC;AAAC,OACN,CAAA,CAAE,MAAA,CAAO,GAAG,CAAA;AACb,MAAA,4BACG,MAAA,EAAA,EACE,QAAA,EAAA;AAAA,QAAA,MAAA,CAAO,MAAM,MAAA,IAAU,EAAA;AAAA,QACvB,SAAA;AAAA,QACA,MAAA,CAAO,MAAM,MAAA,IAAU;AAAA,OAAA,EAC1B,CAAA;AAAA,IAEJ,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,KAAA,CAAM,QAAA,IAAY,CAAA;AAG1C,EAAA,MAAM,EAAA,GAAK,OAAO,KAAA,CAAM,kBAAA;AACxB,EAAA,MAAM,EAAA,GAAK,OAAO,KAAA,CAAM,gBAAA;AACxB,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,EAAA,KAAO,MAAA,IAAa,EAAA,KAAO,MAAA,EAAW;AACxC,IAAA,IAAA,GAAO,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ;AAAA,MACnC,qBAAA,EAAuB,QAAA;AAAA,MACvB,qBAAA,EAAuB;AAAA,KACxB,CAAA,CAAE,MAAA,CAAO,GAAG,CAAA;AAAA,EACf,CAAA,MAAO;AACL,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,OAAA,CAAQ,QAAQ,CAAA;AACtC,IAAA,MAAM,CAAC,KAAA,EAAO,GAAG,CAAA,GAAI,SAAA,CAAU,MAAM,GAAG,CAAA;AACxC,IAAA,MAAM,YAAY,KAAA,IAAS,GAAA;AAC3B,IAAA,MAAM,aAAa,EAAA,GAAK,SAAA,CAAU,OAAA,CAAQ,uBAAA,EAAyB,EAAE,CAAA,GAAI,SAAA;AACzE,IAAA,IAAA,GAAO,GAAA,GAAM,GAAG,UAAU,CAAA,EAAG,MAAM,GAAG,CAAA,EAAG,GAAG,CAAA,CAAA,GAAK,UAAA;AAAA,EACnD;AACA,EAAA,4BACG,MAAA,EAAA,EACE,QAAA,EAAA;AAAA,IAAA,MAAA,CAAO,MAAM,MAAA,IAAU,EAAA;AAAA,IACvB,IAAA;AAAA,IACA,MAAA,CAAO,MAAM,MAAA,IAAU;AAAA,GAAA,EAC1B,CAAA;AAEJ;AAEA,SAAS,QAAA,CAAS,EAAE,MAAA,EAAO,EAAiC;AAC1D,EAAA,uBACE,GAAA,CAAC,MAAA,EAAA,EAAK,IAAA,EAAK,KAAA,EAAM,cAAY,MAAA,CAAO,KAAA,CAAM,IAAA,EAAM,KAAA,EAAO,MAAA,CAAO,KAAA,CAAM,IAAA,EACjE,QAAA,EAAA,MAAA,CAAO,MAAM,IAAA,EAChB,CAAA;AAEJ;AAEA,SAAS,SAAA,CAAU,EAAE,MAAA,EAAQ,KAAA,EAAM,EAAkD;AACnF,EAAA,MAAM,GAAA,GAAM,SAAS,KAAK,CAAA;AAC1B,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,IAAA,IAAQ,EAAA;AAClC,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,GAAA,EAAI,EAAA;AAAA,MACJ,KAAA,EAAO,EAAE,KAAA,EAAO,IAAA,EAAM,QAAQ,IAAA,EAAK;AAAA,MACnC,WAAW,EAAA,CAAG,MAAA,CAAO,MAAM,KAAA,KAAU,UAAA,GAAa,iBAAiB,SAAS;AAAA;AAAA,GAC9E;AAEJ;AAEA,SAAS,gBAAA,CAAiB,EAAE,MAAA,EAAQ,KAAA,EAAM,EAAyD;AACjG,EAAA,IAAI,UAAU,IAAA,IAAQ,KAAA,KAAU,QAAW,uBAAO,GAAA,CAAC,UAAK,QAAA,EAAA,QAAA,EAAC,CAAA;AACzD,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,IAAA,GAAQ,KAAA,CAAkC,MAAA,CAAO,KAAA,CAAM,SAAS,CAAA;AACtE,IAAA,uBAAO,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,QAAA,CAAS,IAAI,CAAA,EAAE,CAAA;AAAA,EAC/B;AACA,EAAA,uBAAO,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,QAAA,CAAS,KAAK,CAAA,EAAE,CAAA;AAChC;AAEA,SAAS,YAAA,CAAa,EAAE,MAAA,EAAQ,KAAA,EAAM,EAAqD;AACzF,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AACzC,IAAA,2BAAQ,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAyB,QAAA,EAAA,MAAA,CAAO,KAAA,CAAM,eAAe,QAAA,EAAI,CAAA;AAAA,EAClF;AACA,EAAA,uBAAO,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,QAAA,CAAS,KAAK,CAAA,EAAE,CAAA;AAChC;ACxPO,SAAS,SAAA,CAA2C;AAAA,EACzD,OAAA;AAAA,EACA,OAAA;AAAA,EACA,eAAA,GAAkB,KAAA;AAAA,EAClB,cAAc,EAAC;AAAA,EACf,iBAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,YAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,UAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,IAAIA,oBAAAA,EAAqB;AAC/B,EAAA,MAAM,mBAAA,GAAsB,OAAsB,IAAI,CAAA;AAEtD,EAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,MAAM,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAA,KAAQ,CAAC,GAAA,CAAI,MAAM,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEpF,EAAA,MAAM,YAAA,GAAe,OAAA;AAAA,IACnB,MACE,cAAA,CAAe,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,MAC3B,IAAI,GAAA,CAAI,IAAA;AAAA,MACR,UAAA,EAAY,CAAC,GAAA,KAAS,GAAA,CAAgC,IAAI,IAAI,CAAA;AAAA,MAC9D,MAAA,EAAQ,MAAM,GAAA,CAAI,KAAA,IAAS,GAAA,CAAI,IAAA;AAAA,MAC/B,IAAA,EAAM,CAAC,IAAA,qBAASC,GAAAA,CAAC,SAAA,EAAA,EAAU,MAAA,EAAQ,GAAA,EAAK,KAAA,EAAO,IAAA,CAAK,QAAA,EAAS,EAAG,CAAA;AAAA,MAChE,eAAe,GAAA,CAAI;AAAA,KACrB,CAAE,CAAA;AAAA,IACJ,CAAC,cAAc;AAAA,GACjB;AAEA,EAAA,MAAM,QAAQ,aAAA,CAAc;AAAA,IAC1B,IAAA,EAAM,OAAA;AAAA,IACN,OAAA,EAAS,YAAA;AAAA,IACT,iBAAiB,eAAA;AAAgB,GAClC,CAAA;AAED,EAAA,MAAM,cACJ,eAAA,IAAmB,OAAA,CAAQ,SAAS,CAAA,IAAK,WAAA,CAAY,WAAW,OAAA,CAAQ,MAAA;AAC1E,EAAA,MAAM,eACJ,eAAA,IAAmB,WAAA,CAAY,SAAS,CAAA,IAAK,WAAA,CAAY,SAAS,OAAA,CAAQ,MAAA;AAE5E,EAAA,MAAM,SAAA,GAAY,YAAY,MAAM;AAClC,IAAA,IAAI,CAAC,iBAAA,EAAmB;AACxB,IAAA,IAAI,WAAA,EAAa,iBAAA,CAAkB,EAAE,CAAA;AAAA,2BACd,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AAAA,EACjD,CAAA,EAAG,CAAC,WAAA,EAAa,OAAA,EAAS,iBAAiB,CAAC,CAAA;AAE5C,EAAA,MAAM,SAAA,GAAY,WAAA;AAAA,IAChB,CAAC,EAAA,EAAW,KAAA,EAAe,QAAA,KAAsB;AAC/C,MAAA,IAAI,CAAC,iBAAA,EAAmB;AAMxB,MAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAW,WAAW,CAAA;AACtC,MAAA,MAAM,YAAY,mBAAA,CAAoB,OAAA;AAEtC,MAAA,IAAI,QAAA,IAAY,cAAc,IAAA,EAAM;AAClC,QAAA,MAAM,CAAC,IAAA,EAAM,EAAE,CAAA,GAAI,SAAA,GAAY,KAAA,GAAQ,CAAC,SAAA,EAAW,KAAK,CAAA,GAAI,CAAC,KAAA,EAAO,SAAS,CAAA;AAC7E,QAAA,MAAM,YAAA,GAAe,CAAC,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA;AAChC,QAAA,KAAA,IAAS,CAAA,GAAI,IAAA,EAAM,CAAA,IAAK,EAAA,EAAI,CAAA,EAAA,EAAK;AAC/B,UAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,CAAC,CAAA,EAAG,EAAA;AAC1B,UAAA,IAAI,UAAU,MAAA,EAAW;AACzB,UAAA,IAAI,YAAA,EAAc,GAAA,CAAI,GAAA,CAAI,KAAK,CAAA;AAAA,eAC1B,GAAA,CAAI,OAAO,KAAK,CAAA;AAAA,QACvB;AAAA,MACF,CAAA,MAAA,IAAW,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA,EAAG;AACtB,QAAA,GAAA,CAAI,OAAO,EAAE,CAAA;AAAA,MACf,CAAA,MAAO;AACL,QAAA,GAAA,CAAI,IAAI,EAAE,CAAA;AAAA,MACZ;AAEA,MAAA,mBAAA,CAAoB,OAAA,GAAU,KAAA;AAC9B,MAAA,iBAAA,CAAkB,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,IACnC,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,WAAA,EAAa,iBAAiB;AAAA,GAC1C;AAEA,EAAA,MAAM,mBAAA,GAAsB,CAAC,UAAA,KAA6C;AACxE,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,YAAY,OAAO,IAAA;AAChD,IAAA,OAAO,IAAA,CAAK,SAAA,KAAc,MAAA,GAAS,MAAA,GAAS,KAAA;AAAA,EAC9C,CAAA;AAEA,EAAA,uBACEC,KAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,gDAAA,EAAkD,SAAS,CAAA,EAC5E,QAAA,kBAAAC,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,gCAAA,EACf,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,4BAAA,EACd,gBAAM,eAAA,EAAgB,CAAE,GAAA,CAAI,CAAC,KAAA,qBAC5BC,IAAAA,CAAC,IAAA,EAAA,EAAkB,WAAU,wBAAA,EAC1B,QAAA,EAAA;AAAA,QAAA,eAAA,oBACCD,GAAAA,CAAC,IAAA,EAAA,EAAG,OAAM,KAAA,EAAM,SAAA,EAAU,4BACxB,QAAA,kBAAAA,GAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,UAAA;AAAA,YACL,YAAA,EAAY,CAAA,CAAE,4BAAA,EAA8B,iBAAiB,CAAA;AAAA,YAC7D,OAAA,EAAS,WAAA;AAAA,YACT,GAAA,EAAK,CAAC,EAAA,KAAO;AACX,cAAA,IAAI,EAAA,KAAO,aAAA,GAAgB,YAAA;AAAA,YAC7B,CAAA;AAAA,YACA,QAAA,EAAU;AAAA;AAAA,SACZ,EACF,CAAA;AAAA,QAED,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AAC7B,UAAA,MAAM,GAAA,GAAM,eAAe,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA;AAClE,UAAA,MAAM,QAAA,GAAW,KAAK,QAAA,IAAY,YAAA;AAClC,UAAA,MAAM,SAAA,GAAY,mBAAA,CAAoB,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA;AACtD,UAAA,uBACEA,GAAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cAEC,KAAA,EAAM,KAAA;AAAA,cACN,SAAA,EAAW,EAAA;AAAA,gBACT,uDAAA;AAAA,gBACA,GAAA,EAAK,UAAU,QAAA,IAAY,aAAA;AAAA,gBAC3B,GAAA,EAAK,UAAU,KAAA,IAAS,YAAA;AAAA,gBACxB,KAAK,cAAA,IAAkB;AAAA,eACzB;AAAA,cACA,aACE,SAAA,KAAc,KAAA,GACV,WAAA,GACA,SAAA,KAAc,SACZ,YAAA,GACA,MAAA;AAAA,cAGP,qCACCC,IAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,QAAA;AAAA,kBACL,SAAA,EAAW,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAKT,iFAAA;AAAA,oBACA,GAAA,EAAK,UAAU,QAAA,IAAY,gBAAA;AAAA,oBAC3B,GAAA,EAAK,UAAU,KAAA,IAAS;AAAA,mBAC1B;AAAA,kBACA,OAAA,EAAS,MACP,YAAA,CAAa,MAAA,CAAO,OAAO,EAAA,EAAI,SAAA,KAAc,KAAA,GAAQ,MAAA,GAAS,KAAK,CAAA;AAAA,kBAGpE,QAAA,EAAA;AAAA,oBAAA,UAAA,CAAW,OAAO,MAAA,CAAO,SAAA,CAAU,MAAA,EAAQ,MAAA,CAAO,YAAY,CAAA;AAAA,oCAC/DD,GAAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAY,MAAA,EACf,QAAA,EAAA,SAAA,KAAc,KAAA,GAAQ,QAAA,GAAM,SAAA,KAAc,MAAA,GAAS,QAAA,GAAM,QAAA,EAC5D;AAAA;AAAA;AAAA,eACF,GAEA,WAAW,MAAA,CAAO,MAAA,CAAO,UAAU,MAAA,EAAQ,MAAA,CAAO,YAAY;AAAA,aAAA;AAAA,YAtC3D,MAAA,CAAO;AAAA,WAwCd;AAAA,QAEJ,CAAC,CAAA;AAAA,QACA,8BACCA,GAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,KAAA;AAAA,YACN,SAAA,EAAU,2BAAA;AAAA,YACV,YAAA,EAAY,CAAA,CAAE,sBAAA,EAAwB,SAAS;AAAA;AAAA;AACjD,OAAA,EAAA,EApEK,KAAA,CAAM,EAsEf,CACD,CAAA,EACH,CAAA;AAAA,sBACAC,KAAC,OAAA,EAAA,EACE,QAAA,EAAA;AAAA,QAAA,OAAA,oBACCD,GAAAA,CAAC,IAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,SAAS,cAAA,CAAe,MAAA,IAAU,kBAAkB,CAAA,GAAI,CAAA,CAAA,IAAM,aAAa,CAAA,GAAI,CAAA,CAAA;AAAA,YAC/E,SAAA,EAAU,6CAAA;AAAA,YAET,QAAA,EAAA,CAAA,CAAE,iBAAiB,eAAU;AAAA;AAAA,SAChC,EACF,CAAA;AAAA,QAED,CAAC,WAAW,OAAA,CAAQ,MAAA,KAAW,qBAC9BA,GAAAA,CAAC,QACC,QAAA,kBAAAA,GAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,SAAS,cAAA,CAAe,MAAA,IAAU,kBAAkB,CAAA,GAAI,CAAA,CAAA,IAAM,aAAa,CAAA,GAAI,CAAA,CAAA;AAAA,YAC/E,SAAA,EAAU,6CAAA;AAAA,YAET,QAAA,EAAA,UAAA,IAAc,CAAA,CAAE,aAAA,EAAe,mBAAmB;AAAA;AAAA,SACrD,EACF,CAAA;AAAA,QAED,CAAC,WACA,KAAA,CAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,KAAA,KAAU;AAC3C,UAAA,MAAM,SAAS,GAAA,CAAI,QAAA;AACnB,UAAA,MAAM,OAAA,GAAU,WAAA,CAAY,QAAA,CAAS,MAAA,CAAO,EAAE,CAAA;AAC9C,UAAA,uBACEC,IAAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cAEC,iBAAe,OAAA,IAAW,MAAA;AAAA,cAC1B,SAAA,EAAW,EAAA,CAAG,wBAAA,EAA0B,OAAA,IAAW,UAAU,CAAA;AAAA,cAE5D,QAAA,EAAA;AAAA,gBAAA,eAAA,oBACCD,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,kBACZ,QAAA,kBAAAA,GAAAA;AAAA,kBAAC,OAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,UAAA;AAAA,oBACL,cAAY,CAAA,CAAE,uBAAA,EAAyB,CAAA,WAAA,EAAc,MAAA,CAAO,EAAE,CAAA,CAAA,EAAI;AAAA,sBAChE,EAAA,EAAI,MAAA,CAAO,MAAA,CAAO,EAAE;AAAA,qBACrB,CAAA;AAAA,oBACD,OAAA;AAAA,oBACA,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,sBAAA,MAAM,SAAS,KAAA,CAAM,WAAA;AACrB,sBAAA,SAAA,CAAU,MAAA,CAAO,EAAA,EAAI,KAAA,EAAO,MAAA,CAAO,aAAa,IAAI,CAAA;AAAA,oBACtD;AAAA;AAAA,iBACF,EACF,CAAA;AAAA,gBAED,GAAA,CAAI,eAAA,EAAgB,CAAE,GAAA,CAAI,CAAC,IAAA,KAAS;AACnC,kBAAA,MAAM,GAAA,GAAM,eAAe,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,IAAA,CAAK,MAAA,CAAO,EAAE,CAAA;AAChE,kBAAA,uBACEA,GAAAA;AAAA,oBAAC,IAAA;AAAA,oBAAA;AAAA,sBAEC,SAAA,EAAW,EAAA;AAAA,wBACT,WAAA;AAAA,wBACA,GAAA,EAAK,UAAU,QAAA,IAAY,aAAA;AAAA,wBAC3B,GAAA,EAAK,UAAU,KAAA,IAAS,YAAA;AAAA,wBACxB,KAAK,cAAA,IAAkB;AAAA,uBACzB;AAAA,sBAEC,qBAAW,IAAA,CAAK,MAAA,CAAO,UAAU,IAAA,EAAM,IAAA,CAAK,YAAY;AAAA,qBAAA;AAAA,oBARpD,IAAA,CAAK;AAAA,mBASZ;AAAA,gBAEJ,CAAC,CAAA;AAAA,gBACA,UAAA,oBACCA,GAAAA,CAAC,IAAA,EAAA,EAAG,WAAU,2BAAA,EAA6B,QAAA,EAAA,UAAA,CAAW,MAAM,CAAA,EAAE;AAAA;AAAA,aAAA;AAAA,YApC3D,GAAA,CAAI;AAAA,WAsCX;AAAA,QAEJ,CAAC;AAAA,OAAA,EACL;AAAA,KAAA,EACF,CAAA,EACF,CAAA;AAAA,oBACAA,GAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,cAAA;AAAA,QACT,IAAA,EAAM,KAAA,CAAM,WAAA,EAAY,CAAE,IAAA;AAAA,QAC1B,eAAA;AAAA,QACA,WAAA;AAAA,QACA,WAAA,EAAa,SAAA;AAAA,QACb,UAAA;AAAA,QACA,OAAA;AAAA,QACA;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;AAaA,SAAS,SAAA,CAA2C;AAAA,EAClD,OAAA;AAAA,EACA,IAAA;AAAA,EACA,eAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,IAAID,oBAAAA,EAAqB;AAG/B,EAAA,MAAM,cAAc,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAA,KAAQ,CAAC,IAAI,cAAc,CAAA;AAE/D,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,uBACEC,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yDACZ,QAAA,EAAA,CAAA,CAAE,eAAA,EAAiB,eAAU,CAAA,EAChC,CAAA;AAAA,EAEJ;AACA,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA,uBACEA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yDACZ,QAAA,EAAA,UAAA,IAAc,CAAA,CAAE,aAAA,EAAe,mBAAmB,CAAA,EACrD,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCACZ,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,KAAA,KAAU;AACxB,IAAA,MAAM,SAAS,GAAA,CAAI,QAAA;AACnB,IAAA,MAAM,OAAA,GAAU,WAAA,CAAY,QAAA,CAAS,MAAA,CAAO,EAAE,CAAA;AAC9C,IAAA,uBACEC,IAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QAEC,sBAAA,EAAqB,EAAA;AAAA,QACrB,iBAAe,OAAA,IAAW,MAAA;AAAA,QAC1B,SAAA,EAAW,EAAA,CAAG,6CAAA,EAA+C,OAAA,IAAW,UAAU,CAAA;AAAA,QAEhF,QAAA,EAAA;AAAA,UAAA,CAAA,eAAA,IAAmB,UAAA,qBACnBA,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8CAAA,EACZ,QAAA,EAAA;AAAA,YAAA,eAAA,mBACCD,GAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,+EACf,QAAA,kBAAAA,GAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,UAAA;AAAA,gBACL,cAAY,CAAA,CAAE,uBAAA,EAAyB,CAAA,WAAA,EAAc,MAAA,CAAO,EAAE,CAAA,CAAA,EAAI;AAAA,kBAChE,EAAA,EAAI,MAAA,CAAO,MAAA,CAAO,EAAE;AAAA,iBACrB,CAAA;AAAA,gBACD,SAAA,EAAU,QAAA;AAAA,gBACV,OAAA;AAAA,gBACA,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,kBAAA,MAAM,SAAS,KAAA,CAAM,WAAA;AACrB,kBAAA,WAAA,CAAY,MAAA,CAAO,EAAA,EAAI,KAAA,EAAO,MAAA,CAAO,aAAa,IAAI,CAAA;AAAA,gBACxD;AAAA;AAAA,aACF,EACF,CAAA,mBAEAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA;AAAA,YAEP,UAAA,mBAAaA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,SAAA,EAAW,QAAA,EAAA,UAAA,CAAW,MAAM,CAAA,EAAE,CAAA,GAAS;AAAA,WAAA,EACtE,CAAA;AAAA,0BAEFA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,qDAAA,EACX,QAAA,EAAA,WAAA,CAAY,GAAA,CAAI,CAAC,GAAA,qBAChBC,IAAAA,CAAC,KAAA,EAAA,EAAmB,WAAU,UAAA,EAC5B,QAAA,EAAA;AAAA,4BAAAD,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,qCAAqC,QAAA,EAAA,GAAA,CAAI,KAAA,IAAS,IAAI,IAAA,EAAK,CAAA;AAAA,4BACzEA,GAAAA;AAAA,cAAC,IAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW,EAAA;AAAA,kBACT,qBAAA;AAAA,kBACA,GAAA,CAAI,UAAU,KAAA,IAAS,YAAA;AAAA,kBACvB,GAAA,CAAI,UAAU,QAAA,IAAY;AAAA,iBAC5B;AAAA,gBAEA,QAAA,kBAAAA,IAAC,SAAA,EAAA,EAAU,MAAA,EAAQ,KAAK,KAAA,EAAQ,MAAA,CAAmC,GAAA,CAAI,IAAI,CAAA,EAAG;AAAA;AAAA;AAChF,WAAA,EAAA,EAVQ,GAAA,CAAI,IAWd,CACD,CAAA,EACH;AAAA;AAAA,OAAA;AAAA,MA3CK,GAAA,CAAI;AAAA,KA4CX;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ;AClXO,SAAS,YAAA,CAAa;AAAA,EAC3B,OAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAAsB;AACpB,EAAA,MAAM,IAAID,oBAAAA,EAAqB;AAC/B,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEjC,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM;AAC7C,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAA,CAAE,IAAI,CAAA;AACvB,IAAA,OAAO,MAAM,MAAA,IAAa,CAAA,KAAM,QAAQ,CAAA,KAAM,EAAA,GAAK,MAAM,CAAA,GAAI,GAAA;AAAA,EAC/D,GAAG,CAAC,CAAA;AAEJ,EAAA,uBACEE,IAAAA,CAAC,UAAA,EAAA,EAAS,WAAW,EAAA,CAAG,6CAAA,EAA+C,SAAS,CAAA,EAC9E,QAAA,EAAA;AAAA,oBAAAD,IAAC,QAAA,EAAA,EAAO,SAAA,EAAU,WAAW,QAAA,EAAA,CAAA,CAAE,sBAAA,EAAwB,SAAS,CAAA,EAAE,CAAA;AAAA,IACjE,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACZA,GAAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QAEC,MAAA;AAAA,QACA,KAAA,EAAO,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AAAA,QACzB,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,MAAA,CAAO,MAAM,CAAC;AAAA,OAAA;AAAA,MAHnC,MAAA,CAAO;AAAA,KAKf,CAAA;AAAA,IACA,WAAA,GAAc,KAAK,UAAA,oBAClBA,IAAC,MAAA,EAAA,EAAO,OAAA,EAAQ,SAAQ,IAAA,EAAK,IAAA,EAAK,SAAS,UAAA,EACxC,QAAA,EAAA,CAAA,CAAE,uBAAuB,CAAA,eAAA,EAAkB,WAAW,KAAK,EAAE,KAAA,EAAO,WAAA,EAAa,CAAA,EACpF;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAEA,SAAS,aAAA,CAAc;AAAA,EACrB,MAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,QAAQ,OAAO,IAAA;AAAM,IACnB,KAAK,QAAA;AACH,MAAA,uBAAOA,GAAAA,CAAC,YAAA,EAAA,EAAa,MAAA,EAAgB,OAAc,QAAA,EAAoB,CAAA;AAAA,IACzE,KAAK,aAAA;AACH,MAAA,uBAAOA,GAAAA,CAAC,iBAAA,EAAA,EAAkB,MAAA,EAAgB,OAAc,QAAA,EAAoB,CAAA;AAAA,IAC9E,KAAK,MAAA;AACH,MAAA,uBAAOA,GAAAA,CAAC,UAAA,EAAA,EAAW,MAAA,EAAgB,OAAc,QAAA,EAAoB,CAAA;AAAA,IACvE,KAAK,SAAA;AACH,MAAA,uBAAOA,GAAAA,CAAC,aAAA,EAAA,EAAc,MAAA,EAAgB,OAAc,QAAA,EAAoB,CAAA;AAAA,IAC1E,KAAK,WAAA;AAAA,IACL,KAAK,OAAA;AACH,MAAA,OAAO,IAAA;AAAA;AAEb;AAEA,SAAS,cAAA,GAAiB;AACxB,EAAA,OAAO,EAAA;AAAA;AAAA,IAEL,qDAAA;AAAA,IACA,4BAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,YAAA,CAAa;AAAA,EACpB,MAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,MAAM,IAAID,oBAAAA,EAAqB;AAC/B,EAAA,uBACEE,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,mDAAA,EACd,QAAA,EAAA;AAAA,IAAA,MAAA,CAAO,SAAS,MAAA,CAAO,IAAA;AAAA,oBACxBA,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,WAAW,cAAA,EAAe;AAAA,QAC1B,OAAO,KAAA,KAAU,MAAA,IAAa,UAAU,IAAA,GAAO,EAAA,GAAK,OAAO,KAAK,CAAA;AAAA,QAChE,QAAA,EAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,MAAA,CAAO,KAAA,KAAU,EAAA,GAAK,IAAA,GAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AAAA,QAEvE,QAAA,EAAA;AAAA,0BAAAD,IAAC,QAAA,EAAA,EAAO,KAAA,EAAM,IAAI,QAAA,EAAA,CAAA,CAAE,mBAAA,EAAqB,KAAK,CAAA,EAAE,CAAA;AAAA,UAC/C,OAAO,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,wBACzBA,GAAAA,CAAC,QAAA,EAAA,EAAuB,KAAA,EAAO,IAAI,KAAA,EAChC,QAAA,EAAA,GAAA,CAAI,KAAA,EAAA,EADM,GAAA,CAAI,KAEjB,CACD;AAAA;AAAA;AAAA;AACH,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,iBAAA,CAAkB;AAAA,EACzB,MAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,MAAM,MAAM,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAK,QAAmC,EAAC;AACxE,EAAA,uBACEC,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,mDAAA,EACd,QAAA,EAAA;AAAA,IAAA,MAAA,CAAO,SAAS,MAAA,CAAO,IAAA;AAAA,oBACxBD,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,QAAA,EAAQ,IAAA;AAAA,QACR,SAAA,EAAW,EAAA,CAAG,cAAA,EAAe,EAAG,yCAAyC,CAAA;AAAA,QACzE,KAAA,EAAO,GAAA,CAAI,GAAA,CAAI,MAAM,CAAA;AAAA,QACrB,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,UAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,CAAA,CAAE,OAAO,eAAA,EAAiB,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAA;AAChE,UAAA,QAAA,CAAS,IAAA,CAAK,MAAA,KAAW,CAAA,GAAI,IAAA,GAAO,IAAI,CAAA;AAAA,QAC1C,CAAA;AAAA,QAEC,iBAAO,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,wBACzBA,GAAAA,CAAC,QAAA,EAAA,EAAuB,KAAA,EAAO,IAAI,KAAA,EAChC,QAAA,EAAA,GAAA,CAAI,KAAA,EAAA,EADM,GAAA,CAAI,KAEjB,CACD;AAAA;AAAA;AACH,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,UAAA,CAAW;AAAA,EAClB,MAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,uBACEC,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,mDAAA,EACd,QAAA,EAAA;AAAA,IAAA,MAAA,CAAO,SAAS,MAAA,CAAO,IAAA;AAAA,oBACxBD,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,MAAA;AAAA,QACL,WAAW,cAAA,EAAe;AAAA,QAC1B,KAAA,EAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,EAAA;AAAA,QAC3C,QAAA,EAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,MAAA,CAAO,KAAA,KAAU,EAAA,GAAK,IAAA,GAAO,CAAA,CAAE,MAAA,CAAO,KAAK;AAAA;AAAA;AACzE,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,aAAA,CAAc;AAAA,EACrB,MAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,MAAM,IAAID,oBAAAA,EAAqB;AAC/B,EAAA,MAAM,UAAU,KAAA,KAAU,MAAA,IAAa,UAAU,IAAA,GAAO,KAAA,GAAQ,OAAO,KAAK,CAAA;AAC5E,EAAA,uBACEE,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,mDAAA,EACd,QAAA,EAAA;AAAA,IAAA,MAAA,CAAO,SAAS,MAAA,CAAO,IAAA;AAAA,oBACxBA,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,WAAW,cAAA,EAAe;AAAA,QAC1B,KAAA,EAAO,OAAA;AAAA,QACP,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,UAAA,MAAM,CAAA,GAAI,EAAE,MAAA,CAAO,KAAA;AACnB,UAAA,QAAA,CAAS,CAAA,KAAM,KAAA,GAAQ,IAAA,GAAO,CAAC,CAAA;AAAA,QACjC,CAAA;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,KAAA,EAAO,QAAA,EAAA,MAAA,CAAO,MAAM,QAAA,IAAY,CAAA,CAAE,mBAAA,EAAqB,KAAK,CAAA,EAAE,CAAA;AAAA,0BAC5EA,GAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,MAAA,EAAQ,QAAA,EAAA,MAAA,CAAO,KAAA,CAAM,SAAA,IAAa,CAAA,CAAE,mBAAA,EAAqB,KAAK,CAAA,EAAE,CAAA;AAAA,0BAC9EA,GAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,OAAA,EAAS,QAAA,EAAA,MAAA,CAAO,KAAA,CAAM,UAAA,IAAc,CAAA,CAAE,kBAAA,EAAoB,IAAI,CAAA,EAAE;AAAA;AAAA;AAAA;AAChF,GAAA,EACF,CAAA;AAEJ;AC3LO,SAAS,eAAA,CAAgB;AAAA,EAC9B,IAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,cAAA,GAAiB,CAAC,EAAA,EAAI,EAAA,EAAI,IAAI,GAAG,CAAA;AAAA,EACjC;AACF,CAAA,EAAyB;AACvB,EAAA,MAAM,IAAID,oBAAAA,EAAqB;AAC/B,EAAA,MAAM,SAASG,cAAAA,EAAe;AAC9B,EAAA,MAAM,eAAA,GAAkBC,OAAAA,CAAQ,MAAM,IAAI,IAAA,CAAK,aAAa,MAAM,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAC7E,EAAA,MAAM,OAAA,GAAA,CAAW,IAAA,CAAK,WAAA,GAAc,CAAA,IAAK,KAAK,OAAA,GAAU,CAAA;AACxD,EAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,IAAA,CAAK,cAAc,IAAA,CAAK,OAAA,EAAS,KAAK,KAAK,CAAA;AAGlE,EAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,MAAA,CAAO,OAAO,CAAA;AAC3C,EAAA,MAAM,EAAA,GAAK,eAAA,CAAgB,MAAA,CAAO,KAAK,CAAA;AACvC,EAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAC/C,EAAA,MAAM,OAAA,GAAU,KAAK,WAAA,IAAe,CAAA;AACpC,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,QAAA;AAExC,EAAA,uBACEF,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,4FAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,YAAA,EAAY,CAAA,CAAE,wBAAA,EAA0B,YAAY,CAAA;AAAA,MAEpD,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EACb,QAAA,EAAA,IAAA,CAAK,UAAU,CAAA,GACZ,CAAA,CAAE,aAAA,EAAe,mBAAmB,CAAA,GACpC,CAAA;AAAA,UACE,0BAAA;AAAA;AAAA;AAAA;AAAA,UAIA,CAAA,QAAA,EAAW,IAAI,CAAA,IAAA,EAAO,EAAE,OAAO,KAAK,CAAA,QAAA,CAAA;AAAA,UACpC,EAAE,IAAA,EAAM,EAAA,EAAI,KAAA;AAAM,SACpB,EACN,CAAA;AAAA,wBACAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACZ,QAAA,EAAA;AAAA,UAAA,eAAA,oBACCA,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,uDAAA,EACd,QAAA,EAAA;AAAA,YAAA,CAAA,CAAE,kBAAkB,UAAU,CAAA;AAAA,4BAE/BD,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,wEAAA;AAAA,gBACV,OAAO,IAAA,CAAK,OAAA;AAAA,gBACZ,QAAA,EAAU,CAAC,CAAA,KAAM,eAAA,CAAgB,OAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,gBAEtD,QAAA,EAAA,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,qBACnBA,GAAAA,CAAC,QAAA,EAAA,EAAe,KAAA,EAAO,CAAA,EACpB,QAAA,EAAA,CAAA,EAAA,EADU,CAEb,CACD;AAAA;AAAA;AACH,WAAA,EACF,CAAA;AAAA,0BAIFA,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,SAAA;AAAA,cACR,IAAA,EAAK,IAAA;AAAA,cACL,SAAA,EAAU,aAAA;AAAA,cACV,QAAA,EAAU,OAAA;AAAA,cACV,OAAA,EAAS,MAAM,YAAA,CAAa,IAAA,CAAK,cAAc,CAAC,CAAA;AAAA,cAChD,YAAA,EAAY,CAAA,CAAE,gCAAA,EAAkC,eAAe,CAAA;AAAA,cAE9D,QAAA,EAAA,CAAA,CAAE,6BAA6B,MAAM;AAAA;AAAA,WACxC;AAAA,0BACAC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EACb,QAAA,EAAA;AAAA,YAAA,eAAA,CAAgB,MAAA,CAAO,KAAK,WAAW,CAAA;AAAA,YAAE,KAAA;AAAA,YAAI,eAAA,CAAgB,MAAA,CAAO,IAAA,CAAK,QAAQ;AAAA,WAAA,EACpF,CAAA;AAAA,0BACAD,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,SAAA;AAAA,cACR,IAAA,EAAK,IAAA;AAAA,cACL,SAAA,EAAU,aAAA;AAAA,cACV,QAAA,EAAU,MAAA;AAAA,cACV,OAAA,EAAS,MAAM,YAAA,CAAa,IAAA,CAAK,cAAc,CAAC,CAAA;AAAA,cAChD,YAAA,EAAY,CAAA,CAAE,4BAAA,EAA8B,WAAW,CAAA;AAAA,cAEtD,QAAA,EAAA,CAAA,CAAE,yBAAyB,MAAM;AAAA;AAAA;AACpC,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;ACtFO,SAAS,YAAA,CAAa;AAAA,EAC3B,MAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA,GAAgB,CAAA;AAAA,EAChB,WAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF,CAAA,EAAsB;AACpB,EAAA,MAAM,IAAID,oBAAAA,EAAqB;AAC/B,EAAA,uBACEE,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,EAAA,CAAG,+BAAA,EAAiC,SAAS,CAAA,EAC3D,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EACZ,QAAA,EAAA;AAAA,MAAA,MAAA;AAAA,MACA;AAAA,KAAA,EACH,CAAA;AAAA,IACC,aAAA,GAAgB,qBACfA,IAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,sFAAA;AAAA,QACV,YAAA,EAAY,CAAA,CAAE,kBAAA,EAAoB,cAAc,CAAA;AAAA,QAEhD,QAAA,EAAA;AAAA,0BAAAD,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA,CAAA,CAAE,uBAAuB,+CAAA,EAAiD;AAAA,YACzE,KAAA,EAAO;AAAA,WACR,CAAA,EACH,CAAA;AAAA,0BACAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2CAAA,EACZ,QAAA,EAAA;AAAA,YAAA,WAAA;AAAA,YACA,oCACCD,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,SAAA,EAAU,+CAAA;AAAA,gBACV,OAAA,EAAS,gBAAA;AAAA,gBAER,QAAA,EAAA,CAAA,CAAE,oBAAoB,OAAO;AAAA;AAAA;AAChC,WAAA,EAEJ;AAAA;AAAA;AAAA;AACF,GAAA,EAEJ,CAAA;AAEJ","file":"chunk-S5UNPCMQ.js","sourcesContent":["/**\n * Column cell renderers — one per `ColumnType` discriminant.\n *\n * `<TableCell column={column} value={...} record={...} />` dispatches on\n * `column.type` so DataTable stays free of polymorphic rendering. Cells\n * never reach into the network themselves; everything they need comes\n * from props serialised server-side.\n */\n\nimport { useArqelLocale, useArqelTranslations } from '@arqel-dev/react/utils';\nimport type {\n BadgeColumnSchema,\n BooleanColumnSchema,\n ColumnSchema,\n ComputedColumnSchema,\n DateColumnSchema,\n IconColumnSchema,\n ImageColumnSchema,\n NumberColumnSchema,\n RelationshipColumnSchema,\n TextColumnSchema,\n} from '@arqel-dev/types/tables';\nimport { cn } from '../utils/cn.js';\nimport { resolveLucideIcon } from '../utils/icon.js';\n\nexport interface CellProps {\n column: ColumnSchema;\n value: unknown;\n}\n\nexport function TableCell({ column, value }: CellProps) {\n switch (column.type) {\n case 'text':\n return <TextCell column={column} value={value} />;\n case 'badge':\n return <BadgeCell column={column} value={value} />;\n case 'boolean':\n return <BooleanCell column={column} value={value} />;\n case 'date':\n return <DateCell column={column} value={value} />;\n case 'number':\n return <NumberCell column={column} value={value} />;\n case 'icon':\n return <IconCell column={column} />;\n case 'image':\n return <ImageCell column={column} value={value} />;\n case 'relationship':\n return <RelationshipCell column={column} value={value} />;\n case 'computed':\n return <ComputedCell column={column} value={value} />;\n }\n}\n\nfunction asString(value: unknown): string {\n if (value === null || value === undefined) return '';\n if (typeof value === 'string') return value;\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n return JSON.stringify(value);\n}\n\nfunction TextCell({ column, value }: { column: TextColumnSchema; value: unknown }) {\n const str = asString(value);\n const truncated =\n column.props.truncate && str.length > column.props.truncate\n ? `${str.slice(0, column.props.truncate)}…`\n : str;\n return (\n <span\n className={cn(\n column.props.weight === 'bold' && 'font-bold',\n column.props.weight === 'medium' && 'font-medium',\n )}\n >\n {truncated}\n </span>\n );\n}\n\n/**\n * Colour token → Tailwind classes for `BadgeColumn::colors()`.\n *\n * Tokens mirror the values the PHP producer emits (e.g. `'green'`,\n * `'yellow'`, `'blue'`). Classes are written out in full so Tailwind's\n * JIT can statically discover them. Unknown tokens fall back to muted.\n */\nconst BADGE_COLOR_CLASS: Record<string, string> = {\n gray: 'bg-muted text-foreground',\n slate: 'bg-slate-100 text-slate-800 dark:bg-slate-800/40 dark:text-slate-200',\n zinc: 'bg-zinc-100 text-zinc-800 dark:bg-zinc-800/40 dark:text-zinc-200',\n red: 'bg-red-100 text-red-800 dark:bg-red-900/40 dark:text-red-200',\n orange: 'bg-orange-100 text-orange-800 dark:bg-orange-900/40 dark:text-orange-200',\n amber: 'bg-amber-100 text-amber-800 dark:bg-amber-900/40 dark:text-amber-200',\n yellow: 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900/40 dark:text-yellow-200',\n lime: 'bg-lime-100 text-lime-800 dark:bg-lime-900/40 dark:text-lime-200',\n green: 'bg-green-100 text-green-800 dark:bg-green-900/40 dark:text-green-200',\n emerald: 'bg-emerald-100 text-emerald-800 dark:bg-emerald-900/40 dark:text-emerald-200',\n teal: 'bg-teal-100 text-teal-800 dark:bg-teal-900/40 dark:text-teal-200',\n cyan: 'bg-cyan-100 text-cyan-800 dark:bg-cyan-900/40 dark:text-cyan-200',\n sky: 'bg-sky-100 text-sky-800 dark:bg-sky-900/40 dark:text-sky-200',\n blue: 'bg-blue-100 text-blue-800 dark:bg-blue-900/40 dark:text-blue-200',\n indigo: 'bg-indigo-100 text-indigo-800 dark:bg-indigo-900/40 dark:text-indigo-200',\n violet: 'bg-violet-100 text-violet-800 dark:bg-violet-900/40 dark:text-violet-200',\n purple: 'bg-purple-100 text-purple-800 dark:bg-purple-900/40 dark:text-purple-200',\n fuchsia: 'bg-fuchsia-100 text-fuchsia-800 dark:bg-fuchsia-900/40 dark:text-fuchsia-200',\n pink: 'bg-pink-100 text-pink-800 dark:bg-pink-900/40 dark:text-pink-200',\n rose: 'bg-rose-100 text-rose-800 dark:bg-rose-900/40 dark:text-rose-200',\n};\n\nconst BADGE_MUTED_CLASS = 'bg-muted text-foreground';\n\nfunction BadgeCell({ column, value }: { column: BadgeColumnSchema; value: unknown }) {\n const key = asString(value);\n const option = column.props.options?.find((o) => o.value === value);\n const label = option?.label ?? key;\n\n const colorToken = column.props.colors?.[key];\n const colorClass = (colorToken && BADGE_COLOR_CLASS[colorToken]) || BADGE_MUTED_CLASS;\n\n const iconName = column.props.icons?.[key];\n const Icon = iconName ? resolveLucideIcon(iconName) : undefined;\n\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium',\n column.props.pill ? 'rounded-full' : 'rounded-sm',\n colorClass,\n )}\n >\n {Icon ? <Icon className=\"size-3 shrink-0\" aria-hidden /> : null}\n {label}\n </span>\n );\n}\n\nfunction BooleanCell({ column, value }: { column: BooleanColumnSchema; value: unknown }) {\n const t = useArqelTranslations();\n const truthy = Boolean(value);\n // The glyph stays language-neutral; only the screen-reader accessible name is\n // localized so a pt-BR viewer hears \"sim\"/\"não\" instead of \"true\"/\"false\".\n const ariaLabel = truthy\n ? t('table.boolean.true_label', 'true')\n : t('table.boolean.false_label', 'false');\n return (\n <span role=\"img\" aria-label={ariaLabel}>\n {truthy ? (column.props.trueIcon ?? '✓') : (column.props.falseIcon ?? '—')}\n </span>\n );\n}\n\nfunction DateCell({ column, value }: { column: DateColumnSchema; value: unknown }) {\n // Active panel locale (BCP-47), so dates format in the viewer's locale rather\n // than the runtime default (commonly en-US 'MM/DD/YYYY').\n const locale = useArqelLocale();\n if (!value) return <span className=\"text-muted-foreground\">—</span>;\n const raw = String(value);\n const date = new Date(raw);\n if (Number.isNaN(date.getTime())) return <span>{raw}</span>;\n // `timezone` is honoured when the server emits it; an invalid zone would make\n // `Intl` throw, so fall back to the runtime zone defensively.\n const timeZone = column.props.timezone || undefined;\n if (column.props.mode === 'since') {\n return <time dateTime={date.toISOString()}>{formatRelative(date, locale)}</time>;\n }\n if (column.props.mode === 'datetime') {\n return (\n <time dateTime={date.toISOString()}>{formatDate(date, locale, 'datetime', timeZone)}</time>\n );\n }\n return <time dateTime={date.toISOString()}>{formatDate(date, locale, 'date', timeZone)}</time>;\n}\n\nfunction formatDate(\n date: Date,\n locale: string,\n mode: 'date' | 'datetime',\n timeZone: string | undefined,\n): string {\n const options: Intl.DateTimeFormatOptions =\n mode === 'datetime' ? { dateStyle: 'medium', timeStyle: 'short' } : { dateStyle: 'medium' };\n if (timeZone !== undefined) options.timeZone = timeZone;\n try {\n return new Intl.DateTimeFormat(locale, options).format(date);\n } catch {\n // Invalid timezone (or other Intl error) — retry without it.\n if (timeZone !== undefined) {\n const { timeZone: _drop, ...rest } = options;\n return new Intl.DateTimeFormat(locale, rest).format(date);\n }\n return mode === 'datetime' ? date.toISOString() : date.toISOString().slice(0, 10);\n }\n}\n\nfunction formatRelative(date: Date, locale: string): string {\n const seconds = Math.round((Date.now() - date.getTime()) / 1000);\n const rtf = new Intl.RelativeTimeFormat(locale, { numeric: 'auto' });\n // Negative values render as \"X ago\"; the elapsed time is always in the past.\n const absSeconds = Math.abs(seconds);\n if (absSeconds < 60) return rtf.format(-seconds, 'second');\n const minutes = Math.round(seconds / 60);\n if (Math.abs(minutes) < 60) return rtf.format(-minutes, 'minute');\n const hours = Math.round(minutes / 60);\n if (Math.abs(hours) < 24) return rtf.format(-hours, 'hour');\n const days = Math.round(hours / 24);\n return rtf.format(-days, 'day');\n}\n\nfunction NumberCell({ column, value }: { column: NumberColumnSchema; value: unknown }) {\n const locale = useArqelLocale();\n if (value === null || value === undefined) return <span>—</span>;\n const num = typeof value === 'number' ? value : Number(value);\n if (Number.isNaN(num)) return <span>{asString(value)}</span>;\n\n // `money($currency)` → render through `Intl.NumberFormat` in the active locale\n // so the currency symbol, grouping and decimals follow the viewer's panel.\n if (column.props.currency) {\n try {\n const formatted = new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: column.props.currency,\n ...(column.props.decimals !== undefined\n ? {\n minimumFractionDigits: column.props.decimals,\n maximumFractionDigits: column.props.decimals,\n }\n : {}),\n }).format(num);\n return (\n <span>\n {column.props.prefix ?? ''}\n {formatted}\n {column.props.suffix ?? ''}\n </span>\n );\n } catch {\n // Unknown currency code — fall through to the plain numeric path below.\n }\n }\n\n const decimals = column.props.decimals ?? 0;\n // Explicit separators win (developer override). Otherwise group/decimal in the\n // active locale via Intl instead of the previous en-US-shaped raw output.\n const ts = column.props.thousandsSeparator;\n const ds = column.props.decimalSeparator;\n let body: string;\n if (ts === undefined && ds === undefined) {\n body = new Intl.NumberFormat(locale, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n }).format(num);\n } else {\n const formatted = num.toFixed(decimals);\n const [whole, dec] = formatted.split('.');\n const safeWhole = whole ?? '0';\n const finalWhole = ts ? safeWhole.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ts) : safeWhole;\n body = dec ? `${finalWhole}${ds ?? '.'}${dec}` : finalWhole;\n }\n return (\n <span>\n {column.props.prefix ?? ''}\n {body}\n {column.props.suffix ?? ''}\n </span>\n );\n}\n\nfunction IconCell({ column }: { column: IconColumnSchema }) {\n return (\n <span role=\"img\" aria-label={column.props.icon} title={column.props.icon}>\n {column.props.icon}\n </span>\n );\n}\n\nfunction ImageCell({ column, value }: { column: ImageColumnSchema; value: unknown }) {\n const src = asString(value);\n if (!src) return null;\n const size = column.props.size ?? 32;\n return (\n <img\n src={src}\n alt=\"\"\n style={{ width: size, height: size }}\n className={cn(column.props.shape === 'circular' ? 'rounded-full' : 'rounded')}\n />\n );\n}\n\nfunction RelationshipCell({ column, value }: { column: RelationshipColumnSchema; value: unknown }) {\n if (value === null || value === undefined) return <span>—</span>;\n if (typeof value === 'object') {\n const attr = (value as Record<string, unknown>)[column.props.attribute];\n return <span>{asString(attr)}</span>;\n }\n return <span>{asString(value)}</span>;\n}\n\nfunction ComputedCell({ column, value }: { column: ComputedColumnSchema; value: unknown }) {\n if (value === null || value === undefined) {\n return <span className=\"text-muted-foreground\">{column.props.placeholder ?? '—'}</span>;\n }\n return <span>{asString(value)}</span>;\n}\n","/**\n * `<DataTable>` — generic table built on TanStack Table v8.\n *\n * Columns come from `ColumnSchema[]` (server-emitted). Two structural\n * extras live outside the schema list: a leading selection checkbox\n * (when `enableSelection`) and a trailing actions cell (when\n * `rowActions` resolver is provided).\n *\n * Selection model is controlled — pass `selectedIds` + `onSelectionChange`\n * — so callers (ResourceIndex, custom dashboards) keep ownership. Shift+\n * click on a row checkbox selects the range from the last clicked row,\n * matching the canonical Filament/Linear UX.\n */\n\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport type { ColumnSchema, SortDirection, TableSort } from '@arqel-dev/types/tables';\nimport {\n type ColumnDef,\n flexRender,\n getCoreRowModel,\n type Row,\n useReactTable,\n} from '@tanstack/react-table';\nimport type { ReactNode } from 'react';\nimport { useCallback, useMemo, useRef } from 'react';\nimport { cn } from '../utils/cn.js';\nimport { TableCell } from './cells.js';\n\ntype RowId = string | number;\n\nexport interface DataTableRecord {\n id: RowId;\n [key: string]: unknown;\n}\n\nexport interface DataTableProps<TRecord extends DataTableRecord> {\n columns: ColumnSchema[];\n records: TRecord[];\n\n enableSelection?: boolean;\n selectedIds?: ReadonlyArray<RowId>;\n onSelectionChange?: ((ids: RowId[]) => void) | undefined;\n\n sort?: TableSort | null;\n onSortChange?: ((column: string, direction: SortDirection) => void) | undefined;\n\n rowActions?: ((record: TRecord) => ReactNode) | undefined;\n\n loading?: boolean;\n emptyState?: ReactNode;\n\n className?: string;\n}\n\nexport function DataTable<TRecord extends DataTableRecord>({\n columns,\n records,\n enableSelection = false,\n selectedIds = [],\n onSelectionChange,\n sort = null,\n onSortChange,\n rowActions,\n loading = false,\n emptyState,\n className,\n}: DataTableProps<TRecord>) {\n const t = useArqelTranslations();\n const lastClickedIndexRef = useRef<number | null>(null);\n\n const visibleColumns = useMemo(() => columns.filter((col) => !col.hidden), [columns]);\n\n const tableColumns = useMemo<ColumnDef<TRecord>[]>(\n () =>\n visibleColumns.map((col) => ({\n id: col.name,\n accessorFn: (row) => (row as Record<string, unknown>)[col.name],\n header: () => col.label ?? col.name,\n cell: (info) => <TableCell column={col} value={info.getValue()} />,\n enableSorting: col.sortable,\n })),\n [visibleColumns],\n );\n\n const table = useReactTable({\n data: records,\n columns: tableColumns,\n getCoreRowModel: getCoreRowModel(),\n });\n\n const allSelected =\n enableSelection && records.length > 0 && selectedIds.length === records.length;\n const someSelected =\n enableSelection && selectedIds.length > 0 && selectedIds.length < records.length;\n\n const toggleAll = useCallback(() => {\n if (!onSelectionChange) return;\n if (allSelected) onSelectionChange([]);\n else onSelectionChange(records.map((r) => r.id));\n }, [allSelected, records, onSelectionChange]);\n\n const toggleRow = useCallback(\n (id: RowId, index: number, shiftKey: boolean) => {\n if (!onSelectionChange) return;\n // `index` is the row's position in the core row-model, which today equals the\n // `records` prop order (only getCoreRowModel is wired — no client sort/filter\n // row model). The shift-range loop resolves ids from `records[i]`, so this\n // holds only while that ordering parity is true; revisit if a client-side\n // sorted/filtered row model is added.\n const set = new Set<RowId>(selectedIds);\n const lastIndex = lastClickedIndexRef.current;\n\n if (shiftKey && lastIndex !== null) {\n const [from, to] = lastIndex < index ? [lastIndex, index] : [index, lastIndex];\n const shouldSelect = !set.has(id);\n for (let i = from; i <= to; i++) {\n const rowId = records[i]?.id;\n if (rowId === undefined) continue;\n if (shouldSelect) set.add(rowId);\n else set.delete(rowId);\n }\n } else if (set.has(id)) {\n set.delete(id);\n } else {\n set.add(id);\n }\n\n lastClickedIndexRef.current = index;\n onSelectionChange(Array.from(set));\n },\n [records, selectedIds, onSelectionChange],\n );\n\n const headerSortDirection = (columnName: string): SortDirection | null => {\n if (!sort || sort.column !== columnName) return null;\n return sort.direction === 'desc' ? 'desc' : 'asc';\n };\n\n return (\n <>\n <div className={cn('hidden w-full min-w-0 overflow-x-auto md:block', className)}>\n <table className=\"w-full border-collapse text-sm\">\n <thead className=\"sticky top-0 bg-background\">\n {table.getHeaderGroups().map((group) => (\n <tr key={group.id} className=\"border-b border-border\">\n {enableSelection && (\n <th scope=\"col\" className=\"w-10 px-3 py-2 text-left\">\n <input\n type=\"checkbox\"\n aria-label={t('table.bulk.select_all_rows', 'Select all rows')}\n checked={allSelected}\n ref={(el) => {\n if (el) el.indeterminate = someSelected;\n }}\n onChange={toggleAll}\n />\n </th>\n )}\n {group.headers.map((header) => {\n const col = visibleColumns.find((c) => c.name === header.column.id);\n const sortable = col?.sortable && onSortChange;\n const direction = headerSortDirection(header.column.id);\n return (\n <th\n key={header.id}\n scope=\"col\"\n className={cn(\n 'px-3 py-2 text-left font-medium text-muted-foreground',\n col?.align === 'center' && 'text-center',\n col?.align === 'end' && 'text-right',\n col?.hiddenOnMobile && 'hidden md:table-cell',\n )}\n aria-sort={\n direction === 'asc'\n ? 'ascending'\n : direction === 'desc'\n ? 'descending'\n : 'none'\n }\n >\n {sortable ? (\n <button\n type=\"button\"\n className={cn(\n // -mx-3 px-3 stretches the button across the cell's\n // horizontal padding; min-h-11 + w-full give a ≥44px\n // touch target on mobile (WCAG 2.5.5) without changing\n // the header's visual density.\n '-mx-3 inline-flex min-h-11 w-full items-center gap-1 px-3 hover:text-foreground',\n col?.align === 'center' && 'justify-center',\n col?.align === 'end' && 'justify-end',\n )}\n onClick={() =>\n onSortChange(header.column.id, direction === 'asc' ? 'desc' : 'asc')\n }\n >\n {flexRender(header.column.columnDef.header, header.getContext())}\n <span aria-hidden=\"true\">\n {direction === 'asc' ? '▲' : direction === 'desc' ? '▼' : '↕'}\n </span>\n </button>\n ) : (\n flexRender(header.column.columnDef.header, header.getContext())\n )}\n </th>\n );\n })}\n {rowActions && (\n <th\n scope=\"col\"\n className=\"w-24 px-3 py-2 text-right\"\n aria-label={t('table.column.actions', 'Actions')}\n />\n )}\n </tr>\n ))}\n </thead>\n <tbody>\n {loading && (\n <tr>\n <td\n colSpan={visibleColumns.length + (enableSelection ? 1 : 0) + (rowActions ? 1 : 0)}\n className=\"px-3 py-4 text-center text-muted-foreground\"\n >\n {t('table.loading', 'Loading…')}\n </td>\n </tr>\n )}\n {!loading && records.length === 0 && (\n <tr>\n <td\n colSpan={visibleColumns.length + (enableSelection ? 1 : 0) + (rowActions ? 1 : 0)}\n className=\"px-3 py-8 text-center text-muted-foreground\"\n >\n {emptyState ?? t('table.empty', 'No records found.')}\n </td>\n </tr>\n )}\n {!loading &&\n table.getRowModel().rows.map((row, index) => {\n const record = row.original;\n const checked = selectedIds.includes(record.id);\n return (\n <tr\n key={row.id}\n data-selected={checked || undefined}\n className={cn('border-b border-border', checked && 'bg-muted')}\n >\n {enableSelection && (\n <td className=\"w-10 px-3 py-2\">\n <input\n type=\"checkbox\"\n aria-label={t('table.bulk.select_row', `Select row ${record.id}`, {\n id: String(record.id),\n })}\n checked={checked}\n onChange={(event) => {\n const native = event.nativeEvent as MouseEvent;\n toggleRow(record.id, index, native.shiftKey === true);\n }}\n />\n </td>\n )}\n {row.getVisibleCells().map((cell) => {\n const col = visibleColumns.find((c) => c.name === cell.column.id);\n return (\n <td\n key={cell.id}\n className={cn(\n 'px-3 py-2',\n col?.align === 'center' && 'text-center',\n col?.align === 'end' && 'text-right',\n col?.hiddenOnMobile && 'hidden md:table-cell',\n )}\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </td>\n );\n })}\n {rowActions && (\n <td className=\"w-24 px-3 py-2 text-right\">{rowActions(record)}</td>\n )}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n <DataCards\n columns={visibleColumns}\n rows={table.getRowModel().rows}\n enableSelection={enableSelection}\n selectedIds={selectedIds}\n onToggleRow={toggleRow}\n rowActions={rowActions}\n loading={loading}\n emptyState={emptyState}\n />\n </>\n );\n}\n\ninterface DataCardsProps<TRecord extends DataTableRecord> {\n columns: ColumnSchema[];\n rows: Row<TRecord>[];\n enableSelection: boolean;\n selectedIds: ReadonlyArray<RowId>;\n onToggleRow: (id: RowId, index: number, shiftKey: boolean) => void;\n rowActions?: ((record: TRecord) => ReactNode) | undefined;\n loading: boolean;\n emptyState?: ReactNode;\n}\n\nfunction DataCards<TRecord extends DataTableRecord>({\n columns,\n rows,\n enableSelection,\n selectedIds,\n onToggleRow,\n rowActions,\n loading,\n emptyState,\n}: DataCardsProps<TRecord>) {\n const t = useArqelTranslations();\n // hiddenOnMobile columns are dropped from the card body (same intent as the\n // table hiding them at < md).\n const cardColumns = columns.filter((col) => !col.hiddenOnMobile);\n\n if (loading) {\n return (\n <div className=\"px-3 py-4 text-center text-muted-foreground md:hidden\">\n {t('table.loading', 'Loading…')}\n </div>\n );\n }\n if (rows.length === 0) {\n return (\n <div className=\"px-3 py-8 text-center text-muted-foreground md:hidden\">\n {emptyState ?? t('table.empty', 'No records found.')}\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-3 md:hidden\">\n {rows.map((row, index) => {\n const record = row.original;\n const checked = selectedIds.includes(record.id);\n return (\n <article\n key={row.id}\n data-arqel-data-card=\"\"\n data-selected={checked || undefined}\n className={cn('rounded-lg border border-border p-4 text-sm', checked && 'bg-muted')}\n >\n {(enableSelection || rowActions) && (\n <div className=\"mb-3 flex items-center justify-between gap-2\">\n {enableSelection ? (\n <label className=\"-m-2.5 inline-flex size-11 cursor-pointer items-center justify-center p-2.5\">\n <input\n type=\"checkbox\"\n aria-label={t('table.bulk.select_row', `Select row ${record.id}`, {\n id: String(record.id),\n })}\n className=\"size-5\"\n checked={checked}\n onChange={(event) => {\n const native = event.nativeEvent as MouseEvent;\n onToggleRow(record.id, index, native.shiftKey === true);\n }}\n />\n </label>\n ) : (\n <span />\n )}\n {rowActions ? <div className=\"ml-auto\">{rowActions(record)}</div> : null}\n </div>\n )}\n <dl className=\"grid grid-cols-[minmax(0,auto)_1fr] gap-x-3 gap-y-2\">\n {cardColumns.map((col) => (\n <div key={col.name} className=\"contents\">\n <dt className=\"font-medium text-muted-foreground\">{col.label ?? col.name}</dt>\n <dd\n className={cn(\n 'min-w-0 break-words',\n col.align === 'end' && 'text-right',\n col.align === 'center' && 'text-center',\n )}\n >\n <TableCell column={col} value={(record as Record<string, unknown>)[col.name]} />\n </dd>\n </div>\n ))}\n </dl>\n </article>\n );\n })}\n </div>\n );\n}\n","/**\n * `<TableFilters>` — renders one input per `FilterSchema` and emits\n * a single `onChange(name, value)` callback. Active values render as\n * dismissible chips so users can read state without re-opening menus.\n *\n * Phase 1 covers the four most-used filter types (select, multiSelect,\n * text, ternary). dateRange / scope land alongside FieldRenderer in\n * UI-004, where the date primitives ship.\n */\n\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport type {\n FilterSchema,\n MultiSelectFilterSchema,\n SelectFilterSchema,\n TernaryFilterSchema,\n TextFilterSchema,\n} from '@arqel-dev/types/tables';\nimport { Button } from '../action/Button.js';\nimport { cn } from '../utils/cn.js';\n\nexport interface TableFiltersProps {\n filters: FilterSchema[];\n values: Record<string, unknown>;\n onChange: (name: string, value: unknown) => void;\n onClearAll?: (() => void) | undefined;\n className?: string | undefined;\n}\n\nexport function TableFilters({\n filters,\n values,\n onChange,\n onClearAll,\n className,\n}: TableFiltersProps) {\n const t = useArqelTranslations();\n if (filters.length === 0) return null;\n\n const activeCount = filters.reduce((acc, f) => {\n const v = values[f.name];\n return v !== undefined && v !== null && v !== '' ? acc + 1 : acc;\n }, 0);\n\n return (\n <fieldset className={cn('flex flex-wrap items-end gap-2 border-0 p-0', className)}>\n <legend className=\"sr-only\">{t('table.filters.legend', 'Filters')}</legend>\n {filters.map((filter) => (\n <FilterControl\n key={filter.name}\n filter={filter}\n value={values[filter.name]}\n onChange={(v) => onChange(filter.name, v)}\n />\n ))}\n {activeCount > 0 && onClearAll && (\n <Button variant=\"ghost\" size=\"sm\" onClick={onClearAll}>\n {t('table.filters.clear', `Clear filters (${activeCount})`, { count: activeCount })}\n </Button>\n )}\n </fieldset>\n );\n}\n\nfunction FilterControl({\n filter,\n value,\n onChange,\n}: {\n filter: FilterSchema;\n value: unknown;\n onChange: (value: unknown) => void;\n}) {\n switch (filter.type) {\n case 'select':\n return <SelectFilter filter={filter} value={value} onChange={onChange} />;\n case 'multiSelect':\n return <MultiSelectFilter filter={filter} value={value} onChange={onChange} />;\n case 'text':\n return <TextFilter filter={filter} value={value} onChange={onChange} />;\n case 'ternary':\n return <TernaryFilter filter={filter} value={value} onChange={onChange} />;\n case 'dateRange':\n case 'scope':\n return null;\n }\n}\n\nfunction controlClasses() {\n return cn(\n // 44px touch target on mobile (WCAG 2.5.5); dense 36px on >=md.\n 'h-11 rounded-sm border border-[var(--input)] md:h-9',\n 'bg-background px-3 text-sm',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n );\n}\n\nfunction SelectFilter({\n filter,\n value,\n onChange,\n}: {\n filter: SelectFilterSchema;\n value: unknown;\n onChange: (value: unknown) => void;\n}) {\n const t = useArqelTranslations();\n return (\n <label className=\"flex flex-col gap-1 text-xs text-muted-foreground\">\n {filter.label ?? filter.name}\n <select\n className={controlClasses()}\n value={value === undefined || value === null ? '' : String(value)}\n onChange={(e) => onChange(e.target.value === '' ? null : e.target.value)}\n >\n <option value=\"\">{t('table.filters.all', 'All')}</option>\n {filter.props.options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </label>\n );\n}\n\nfunction MultiSelectFilter({\n filter,\n value,\n onChange,\n}: {\n filter: MultiSelectFilterSchema;\n value: unknown;\n onChange: (value: unknown) => void;\n}) {\n const arr = Array.isArray(value) ? (value as Array<string | number>) : [];\n return (\n <label className=\"flex flex-col gap-1 text-xs text-muted-foreground\">\n {filter.label ?? filter.name}\n <select\n multiple\n className={cn(controlClasses(), 'h-auto min-h-11 py-1 md:min-h-[2.25rem]')}\n value={arr.map(String)}\n onChange={(e) => {\n const next = Array.from(e.target.selectedOptions, (o) => o.value);\n onChange(next.length === 0 ? null : next);\n }}\n >\n {filter.props.options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </label>\n );\n}\n\nfunction TextFilter({\n filter,\n value,\n onChange,\n}: {\n filter: TextFilterSchema;\n value: unknown;\n onChange: (value: unknown) => void;\n}) {\n return (\n <label className=\"flex flex-col gap-1 text-xs text-muted-foreground\">\n {filter.label ?? filter.name}\n <input\n type=\"text\"\n className={controlClasses()}\n value={typeof value === 'string' ? value : ''}\n onChange={(e) => onChange(e.target.value === '' ? null : e.target.value)}\n />\n </label>\n );\n}\n\nfunction TernaryFilter({\n filter,\n value,\n onChange,\n}: {\n filter: TernaryFilterSchema;\n value: unknown;\n onChange: (value: unknown) => void;\n}) {\n const t = useArqelTranslations();\n const current = value === undefined || value === null ? 'all' : String(value);\n return (\n <label className=\"flex flex-col gap-1 text-xs text-muted-foreground\">\n {filter.label ?? filter.name}\n <select\n className={controlClasses()}\n value={current}\n onChange={(e) => {\n const v = e.target.value;\n onChange(v === 'all' ? null : v);\n }}\n >\n <option value=\"all\">{filter.props.allLabel ?? t('table.filters.all', 'All')}</option>\n <option value=\"true\">{filter.props.trueLabel ?? t('table.filters.yes', 'Yes')}</option>\n <option value=\"false\">{filter.props.falseLabel ?? t('table.filters.no', 'No')}</option>\n </select>\n </label>\n );\n}\n","/**\n * `<TablePagination>` — prev/next + range + per-page picker.\n *\n * Stateless: parent owns `currentPage` / `perPage` and handles transitions\n * (typically via Inertia `router.get` with `preserveState: true`).\n */\n\nimport { useArqelLocale, useArqelTranslations } from '@arqel-dev/react/utils';\nimport type { PaginationMeta } from '@arqel-dev/types/resources';\nimport { useMemo } from 'react';\nimport { Button } from '../action/Button.js';\nimport { cn } from '../utils/cn.js';\n\nexport interface TablePaginationProps {\n meta: PaginationMeta;\n onPageChange: (page: number) => void;\n onPerPageChange?: ((perPage: number) => void) | undefined;\n perPageOptions?: number[];\n className?: string;\n}\n\nexport function TablePagination({\n meta,\n onPageChange,\n onPerPageChange,\n perPageOptions = [10, 25, 50, 100],\n className,\n}: TablePaginationProps) {\n const t = useArqelTranslations();\n const locale = useArqelLocale();\n const numberFormatter = useMemo(() => new Intl.NumberFormat(locale), [locale]);\n const fromRaw = (meta.currentPage - 1) * meta.perPage + 1;\n const toRaw = Math.min(meta.currentPage * meta.perPage, meta.total);\n // Interpolated counts are locale number-grouped (12,345 / 12.345) before they\n // reach the translator, whose applyReplacements does plain String() substitution.\n const from = numberFormatter.format(fromRaw);\n const to = numberFormatter.format(toRaw);\n const total = numberFormatter.format(meta.total);\n const isFirst = meta.currentPage <= 1;\n const isLast = meta.currentPage >= meta.lastPage;\n\n return (\n <nav\n className={cn(\n 'flex flex-wrap items-center justify-between gap-2 border-t border-border px-3 py-2 text-sm',\n className,\n )}\n aria-label={t('table.pagination.label', 'Pagination')}\n >\n <span className=\"text-muted-foreground\">\n {meta.total === 0\n ? t('table.empty', 'No records found.')\n : t(\n 'table.pagination.showing',\n // Fallback is rendered verbatim when the key is missing, so it must\n // already carry the interpolated values (the replacements map only\n // applies to a resolved dictionary string).\n `Showing ${from} to ${to} of ${total} results`,\n { from, to, total },\n )}\n </span>\n <div className=\"flex items-center gap-2\">\n {onPerPageChange && (\n <label className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n {t('table.per_page', 'Per page')}\n {/* 44px touch target on mobile (WCAG 2.5.5); dense 32px on >=md. */}\n <select\n className=\"h-11 rounded-sm border border-[var(--input)] bg-background px-2 md:h-8\"\n value={meta.perPage}\n onChange={(e) => onPerPageChange(Number(e.target.value))}\n >\n {perPageOptions.map((n) => (\n <option key={n} value={n}>\n {n}\n </option>\n ))}\n </select>\n </label>\n )}\n {/* Buttons use size=\"sm\" (h-8) for the dense desktop bar; the responsive\n h-11 override lifts them to a 44px touch target below md. */}\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-11 md:h-8\"\n disabled={isFirst}\n onClick={() => onPageChange(meta.currentPage - 1)}\n aria-label={t('table.pagination.previous_page', 'Previous page')}\n >\n {t('table.pagination.previous', 'Prev')}\n </Button>\n <span className=\"text-xs text-muted-foreground\">\n {numberFormatter.format(meta.currentPage)} / {numberFormatter.format(meta.lastPage)}\n </span>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-11 md:h-8\"\n disabled={isLast}\n onClick={() => onPageChange(meta.currentPage + 1)}\n aria-label={t('table.pagination.next_page', 'Next page')}\n >\n {t('table.pagination.next', 'Next')}\n </Button>\n </div>\n </nav>\n );\n}\n","/**\n * `<TableToolbar>` — search input + filters + bulk-action bar slot.\n *\n * The bulk-action bar appears only when `selectedCount > 0`. ResourceIndex\n * passes `bulkActions` rendered as a row of buttons; the toolbar just\n * positions them.\n */\n\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport type { ReactNode } from 'react';\nimport { cn } from '../utils/cn.js';\n\nexport interface TableToolbarProps {\n search?: ReactNode;\n filters?: ReactNode;\n selectedCount?: number;\n bulkActions?: ReactNode;\n onClearSelection?: (() => void) | undefined;\n className?: string;\n}\n\nexport function TableToolbar({\n search,\n filters,\n selectedCount = 0,\n bulkActions,\n onClearSelection,\n className,\n}: TableToolbarProps) {\n const t = useArqelTranslations();\n return (\n <div className={cn('flex flex-col gap-3 px-3 py-3', className)}>\n <div className=\"flex flex-wrap items-end gap-2\">\n {search}\n {filters}\n </div>\n {selectedCount > 0 && (\n <section\n className=\"flex flex-wrap items-center gap-2 rounded-sm border border-border bg-muted px-3 py-2\"\n aria-label={t('table.bulk.label', 'Bulk actions')}\n >\n <span className=\"text-sm font-medium\">\n {t('table.bulk.selected', '{one} :count selected|{other} :count selected', {\n count: selectedCount,\n })}\n </span>\n <div className=\"ml-auto flex flex-wrap items-center gap-2\">\n {bulkActions}\n {onClearSelection && (\n <button\n type=\"button\"\n className=\"text-sm text-muted-foreground hover:underline\"\n onClick={onClearSelection}\n >\n {t('table.bulk.clear', 'Clear')}\n </button>\n )}\n </div>\n </section>\n )}\n </div>\n );\n}\n"]}