@modern-admin/web 0.3.5 → 0.4.1

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 (174) hide show
  1. package/README.md +42 -0
  2. package/dist/config/runtime-config.d.ts +84 -0
  3. package/dist/config/runtime-config.js +19 -0
  4. package/dist/config/vite.d.ts +84 -0
  5. package/dist/config/vite.js +166 -0
  6. package/dist/lib/index.js +0 -1
  7. package/dist/lib/index.js.map +1 -1
  8. package/dist/lib/mount.d.ts.map +1 -1
  9. package/dist/standalone/assets/{action-component-host-CXIbN-8V.js → action-component-host-BrEZDHZt.js} +2 -2
  10. package/dist/standalone/assets/action-component-host-BrEZDHZt.js.br +0 -0
  11. package/dist/standalone/assets/action-component-host-BrEZDHZt.js.gz +0 -0
  12. package/dist/standalone/assets/{action-component-host-CXIbN-8V.js.map → action-component-host-BrEZDHZt.js.map} +1 -1
  13. package/dist/standalone/assets/{action-page-OsWfKQ6C.js → action-page-Bx7kzeK7.js} +2 -2
  14. package/dist/standalone/assets/action-page-Bx7kzeK7.js.br +0 -0
  15. package/dist/standalone/assets/action-page-Bx7kzeK7.js.gz +0 -0
  16. package/dist/standalone/assets/{action-page-OsWfKQ6C.js.map → action-page-Bx7kzeK7.js.map} +1 -1
  17. package/dist/standalone/assets/{ai-assistant-widget-Bt4Z7Fmr.js → ai-assistant-widget-BbIXVrSu.js} +2 -2
  18. package/dist/standalone/assets/ai-assistant-widget-BbIXVrSu.js.br +0 -0
  19. package/dist/standalone/assets/ai-assistant-widget-BbIXVrSu.js.gz +0 -0
  20. package/dist/standalone/assets/{ai-assistant-widget-Bt4Z7Fmr.js.map → ai-assistant-widget-BbIXVrSu.js.map} +1 -1
  21. package/dist/standalone/assets/{audit-log-page-2wuGiWg-.js → audit-log-page-BoZh23oQ.js} +2 -2
  22. package/dist/standalone/assets/audit-log-page-BoZh23oQ.js.br +0 -0
  23. package/dist/standalone/assets/audit-log-page-BoZh23oQ.js.gz +0 -0
  24. package/dist/standalone/assets/{audit-log-page-2wuGiWg-.js.map → audit-log-page-BoZh23oQ.js.map} +1 -1
  25. package/dist/standalone/assets/{calendar-BZVUWakC.js → calendar-nvD_z7KQ.js} +2 -2
  26. package/dist/standalone/assets/calendar-nvD_z7KQ.js.br +0 -0
  27. package/dist/standalone/assets/calendar-nvD_z7KQ.js.gz +0 -0
  28. package/dist/standalone/assets/{calendar-BZVUWakC.js.map → calendar-nvD_z7KQ.js.map} +1 -1
  29. package/dist/standalone/assets/{chart-widget-BtJb6YXV.js → chart-widget-YeCL7jdB.js} +2 -2
  30. package/dist/standalone/assets/chart-widget-YeCL7jdB.js.br +0 -0
  31. package/dist/standalone/assets/chart-widget-YeCL7jdB.js.gz +0 -0
  32. package/dist/standalone/assets/{chart-widget-BtJb6YXV.js.map → chart-widget-YeCL7jdB.js.map} +1 -1
  33. package/dist/standalone/assets/{command-BNF_evMy.js → command-Sb0xL-se.js} +2 -2
  34. package/dist/standalone/assets/command-Sb0xL-se.js.br +0 -0
  35. package/dist/standalone/assets/command-Sb0xL-se.js.gz +0 -0
  36. package/dist/standalone/assets/{command-BNF_evMy.js.map → command-Sb0xL-se.js.map} +1 -1
  37. package/dist/standalone/assets/date-picker-C4HcgidQ.js +2 -0
  38. package/dist/standalone/assets/date-picker-C4HcgidQ.js.br +0 -0
  39. package/dist/standalone/assets/date-picker-C4HcgidQ.js.gz +0 -0
  40. package/dist/standalone/assets/date-picker-C4HcgidQ.js.map +1 -0
  41. package/dist/standalone/assets/{edit-page-DCRB9Y_q.js → edit-page-CW7-FAPC.js} +2 -2
  42. package/dist/standalone/assets/edit-page-CW7-FAPC.js.br +0 -0
  43. package/dist/standalone/assets/edit-page-CW7-FAPC.js.gz +0 -0
  44. package/dist/standalone/assets/{edit-page-DCRB9Y_q.js.map → edit-page-CW7-FAPC.js.map} +1 -1
  45. package/dist/standalone/assets/{empty-DAEAjFd3.js → empty-Cposcczv.js} +2 -2
  46. package/dist/standalone/assets/empty-Cposcczv.js.br +0 -0
  47. package/dist/standalone/assets/empty-Cposcczv.js.gz +0 -0
  48. package/dist/standalone/assets/{empty-DAEAjFd3.js.map → empty-Cposcczv.js.map} +1 -1
  49. package/dist/standalone/assets/{global-search-dialog-HMLztOho.js → global-search-dialog-DLv_nIvM.js} +2 -2
  50. package/dist/standalone/assets/global-search-dialog-DLv_nIvM.js.br +0 -0
  51. package/dist/standalone/assets/global-search-dialog-DLv_nIvM.js.gz +0 -0
  52. package/dist/standalone/assets/{global-search-dialog-HMLztOho.js.map → global-search-dialog-DLv_nIvM.js.map} +1 -1
  53. package/dist/standalone/assets/{heavy-fields-ZuqfOFMv.js → heavy-fields-BiCEgD2L.js} +2 -2
  54. package/dist/standalone/assets/heavy-fields-BiCEgD2L.js.br +0 -0
  55. package/dist/standalone/assets/heavy-fields-BiCEgD2L.js.gz +0 -0
  56. package/dist/standalone/assets/{heavy-fields-ZuqfOFMv.js.map → heavy-fields-BiCEgD2L.js.map} +1 -1
  57. package/dist/standalone/assets/{home-page-HmheewiP.js → home-page-BSz1wGk0.js} +3 -3
  58. package/dist/standalone/assets/home-page-BSz1wGk0.js.br +0 -0
  59. package/dist/standalone/assets/home-page-BSz1wGk0.js.gz +0 -0
  60. package/dist/standalone/assets/{home-page-HmheewiP.js.map → home-page-BSz1wGk0.js.map} +1 -1
  61. package/dist/standalone/assets/{icon-registry-BV44--RL.js → icon-registry-BQU4fIc4.js} +2 -2
  62. package/dist/standalone/assets/icon-registry-BQU4fIc4.js.br +0 -0
  63. package/dist/standalone/assets/{icon-registry-BV44--RL.js.gz → icon-registry-BQU4fIc4.js.gz} +0 -0
  64. package/dist/standalone/assets/{icon-registry-BV44--RL.js.map → icon-registry-BQU4fIc4.js.map} +1 -1
  65. package/dist/standalone/assets/index-BL8keDxQ.js +15 -0
  66. package/dist/standalone/assets/index-BL8keDxQ.js.br +0 -0
  67. package/dist/standalone/assets/index-BL8keDxQ.js.gz +0 -0
  68. package/dist/standalone/assets/{index-t4woXGa-.js.map → index-BL8keDxQ.js.map} +1 -1
  69. package/dist/standalone/assets/{json-editor-sGw4fDoj.js → json-editor-CAIgxYb3.js} +2 -2
  70. package/dist/standalone/assets/json-editor-CAIgxYb3.js.br +0 -0
  71. package/dist/standalone/assets/json-editor-CAIgxYb3.js.gz +0 -0
  72. package/dist/standalone/assets/{json-editor-sGw4fDoj.js.map → json-editor-CAIgxYb3.js.map} +1 -1
  73. package/dist/standalone/assets/{property-renderer-DyCwdVkh.js → property-renderer-B8Md-EqW.js} +4 -4
  74. package/dist/standalone/assets/property-renderer-B8Md-EqW.js.br +0 -0
  75. package/dist/standalone/assets/property-renderer-B8Md-EqW.js.gz +0 -0
  76. package/dist/standalone/assets/property-renderer-B8Md-EqW.js.map +1 -0
  77. package/dist/standalone/assets/{reference-Dfd804y3.js → reference-WPaf6IdD.js} +2 -2
  78. package/dist/standalone/assets/reference-WPaf6IdD.js.br +0 -0
  79. package/dist/standalone/assets/reference-WPaf6IdD.js.gz +0 -0
  80. package/dist/standalone/assets/{reference-Dfd804y3.js.map → reference-WPaf6IdD.js.map} +1 -1
  81. package/dist/standalone/assets/{revisions-button-DXZAh2Lu.js → revisions-button-0WtL6bsZ.js} +2 -2
  82. package/dist/standalone/assets/revisions-button-0WtL6bsZ.js.br +0 -0
  83. package/dist/standalone/assets/revisions-button-0WtL6bsZ.js.gz +0 -0
  84. package/dist/standalone/assets/{revisions-button-DXZAh2Lu.js.map → revisions-button-0WtL6bsZ.js.map} +1 -1
  85. package/dist/standalone/assets/{select-BWf6walM.js → select-CR4acjX0.js} +2 -2
  86. package/dist/standalone/assets/select-CR4acjX0.js.br +0 -0
  87. package/dist/standalone/assets/select-CR4acjX0.js.gz +0 -0
  88. package/dist/standalone/assets/{select-BWf6walM.js.map → select-CR4acjX0.js.map} +1 -1
  89. package/dist/standalone/assets/{settings-page-Co7sWbbL.js → settings-page-DtguXLAP.js} +2 -2
  90. package/dist/standalone/assets/settings-page-DtguXLAP.js.br +0 -0
  91. package/dist/standalone/assets/settings-page-DtguXLAP.js.gz +0 -0
  92. package/dist/standalone/assets/{settings-page-Co7sWbbL.js.map → settings-page-DtguXLAP.js.map} +1 -1
  93. package/dist/standalone/assets/{show-page-D-_vldWV.js → show-page-Dnox2NwO.js} +2 -2
  94. package/dist/standalone/assets/show-page-Dnox2NwO.js.br +0 -0
  95. package/dist/standalone/assets/show-page-Dnox2NwO.js.gz +0 -0
  96. package/dist/standalone/assets/{show-page-D-_vldWV.js.map → show-page-Dnox2NwO.js.map} +1 -1
  97. package/dist/standalone/assets/{tabs-khcHka8W.js → tabs-DUS8e6dR.js} +2 -2
  98. package/dist/standalone/assets/tabs-DUS8e6dR.js.br +0 -0
  99. package/dist/standalone/assets/tabs-DUS8e6dR.js.gz +0 -0
  100. package/dist/standalone/assets/{tabs-khcHka8W.js.map → tabs-DUS8e6dR.js.map} +1 -1
  101. package/dist/standalone/assets/{value-format-CPnbnlE6.js → value-format-Cgau0meh.js} +2 -2
  102. package/dist/standalone/assets/value-format-Cgau0meh.js.br +0 -0
  103. package/dist/standalone/assets/{value-format-CPnbnlE6.js.gz → value-format-Cgau0meh.js.gz} +0 -0
  104. package/dist/standalone/assets/{value-format-CPnbnlE6.js.map → value-format-Cgau0meh.js.map} +1 -1
  105. package/dist/standalone/assets/{wizard-create-page-CFwMs8E3.js → wizard-create-page-v2-Aw8Oj.js} +2 -2
  106. package/dist/standalone/assets/wizard-create-page-v2-Aw8Oj.js.br +0 -0
  107. package/dist/standalone/assets/wizard-create-page-v2-Aw8Oj.js.gz +0 -0
  108. package/dist/standalone/assets/{wizard-create-page-CFwMs8E3.js.map → wizard-create-page-v2-Aw8Oj.js.map} +1 -1
  109. package/dist/standalone/assets/{zod-BbfEBA4A.js → zod-BrelKLfy.js} +2 -2
  110. package/dist/standalone/assets/zod-BrelKLfy.js.br +0 -0
  111. package/dist/standalone/assets/zod-BrelKLfy.js.gz +0 -0
  112. package/dist/standalone/assets/{zod-BbfEBA4A.js.map → zod-BrelKLfy.js.map} +1 -1
  113. package/dist/standalone/index.html +4 -4
  114. package/dist/standalone/index.html.br +0 -0
  115. package/dist/standalone/index.html.gz +0 -0
  116. package/package.json +28 -6
  117. package/src/mount.tsx +8 -2
  118. package/src/standalone.tsx +1 -0
  119. package/src/vite.ts +219 -0
  120. package/vite.config.ts +13 -104
  121. package/dist/standalone/assets/action-component-host-CXIbN-8V.js.br +0 -0
  122. package/dist/standalone/assets/action-component-host-CXIbN-8V.js.gz +0 -0
  123. package/dist/standalone/assets/action-page-OsWfKQ6C.js.br +0 -0
  124. package/dist/standalone/assets/action-page-OsWfKQ6C.js.gz +0 -0
  125. package/dist/standalone/assets/ai-assistant-widget-Bt4Z7Fmr.js.br +0 -0
  126. package/dist/standalone/assets/ai-assistant-widget-Bt4Z7Fmr.js.gz +0 -0
  127. package/dist/standalone/assets/audit-log-page-2wuGiWg-.js.br +0 -0
  128. package/dist/standalone/assets/audit-log-page-2wuGiWg-.js.gz +0 -0
  129. package/dist/standalone/assets/calendar-BZVUWakC.js.br +0 -0
  130. package/dist/standalone/assets/calendar-BZVUWakC.js.gz +0 -0
  131. package/dist/standalone/assets/chart-widget-BtJb6YXV.js.br +0 -0
  132. package/dist/standalone/assets/chart-widget-BtJb6YXV.js.gz +0 -0
  133. package/dist/standalone/assets/command-BNF_evMy.js.br +0 -0
  134. package/dist/standalone/assets/command-BNF_evMy.js.gz +0 -0
  135. package/dist/standalone/assets/date-picker-LfbUehd1.js +0 -2
  136. package/dist/standalone/assets/date-picker-LfbUehd1.js.br +0 -0
  137. package/dist/standalone/assets/date-picker-LfbUehd1.js.gz +0 -0
  138. package/dist/standalone/assets/date-picker-LfbUehd1.js.map +0 -1
  139. package/dist/standalone/assets/edit-page-DCRB9Y_q.js.br +0 -0
  140. package/dist/standalone/assets/edit-page-DCRB9Y_q.js.gz +0 -0
  141. package/dist/standalone/assets/empty-DAEAjFd3.js.br +0 -0
  142. package/dist/standalone/assets/empty-DAEAjFd3.js.gz +0 -0
  143. package/dist/standalone/assets/global-search-dialog-HMLztOho.js.br +0 -0
  144. package/dist/standalone/assets/global-search-dialog-HMLztOho.js.gz +0 -0
  145. package/dist/standalone/assets/heavy-fields-ZuqfOFMv.js.br +0 -0
  146. package/dist/standalone/assets/heavy-fields-ZuqfOFMv.js.gz +0 -0
  147. package/dist/standalone/assets/home-page-HmheewiP.js.br +0 -0
  148. package/dist/standalone/assets/home-page-HmheewiP.js.gz +0 -0
  149. package/dist/standalone/assets/icon-registry-BV44--RL.js.br +0 -0
  150. package/dist/standalone/assets/index-t4woXGa-.js +0 -15
  151. package/dist/standalone/assets/index-t4woXGa-.js.br +0 -0
  152. package/dist/standalone/assets/index-t4woXGa-.js.gz +0 -0
  153. package/dist/standalone/assets/json-editor-sGw4fDoj.js.br +0 -0
  154. package/dist/standalone/assets/json-editor-sGw4fDoj.js.gz +0 -0
  155. package/dist/standalone/assets/property-renderer-DyCwdVkh.js.br +0 -0
  156. package/dist/standalone/assets/property-renderer-DyCwdVkh.js.gz +0 -0
  157. package/dist/standalone/assets/property-renderer-DyCwdVkh.js.map +0 -1
  158. package/dist/standalone/assets/reference-Dfd804y3.js.br +0 -0
  159. package/dist/standalone/assets/reference-Dfd804y3.js.gz +0 -0
  160. package/dist/standalone/assets/revisions-button-DXZAh2Lu.js.br +0 -0
  161. package/dist/standalone/assets/revisions-button-DXZAh2Lu.js.gz +0 -0
  162. package/dist/standalone/assets/select-BWf6walM.js.br +0 -0
  163. package/dist/standalone/assets/select-BWf6walM.js.gz +0 -0
  164. package/dist/standalone/assets/settings-page-Co7sWbbL.js.br +0 -0
  165. package/dist/standalone/assets/settings-page-Co7sWbbL.js.gz +0 -0
  166. package/dist/standalone/assets/show-page-D-_vldWV.js.br +0 -0
  167. package/dist/standalone/assets/show-page-D-_vldWV.js.gz +0 -0
  168. package/dist/standalone/assets/tabs-khcHka8W.js.br +0 -0
  169. package/dist/standalone/assets/tabs-khcHka8W.js.gz +0 -0
  170. package/dist/standalone/assets/value-format-CPnbnlE6.js.br +0 -0
  171. package/dist/standalone/assets/wizard-create-page-CFwMs8E3.js.br +0 -0
  172. package/dist/standalone/assets/wizard-create-page-CFwMs8E3.js.gz +0 -0
  173. package/dist/standalone/assets/zod-BbfEBA4A.js.br +0 -0
  174. package/dist/standalone/assets/zod-BbfEBA4A.js.gz +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"mappings":"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","names":[],"ignoreList":[5,6],"sources":["../../../../ui/src/components/media-preview.tsx","../../../../ui/src/components/combobox.tsx","../../../../ui/src/components/key-value-editor.tsx","../../../../ui/src/components/file-input.tsx","../../../../ui/src/components/multi-file-input.tsx","../../../../../node_modules/.bun/@tanstack+table-core@8.21.3/node_modules/@tanstack/table-core/build/lib/index.mjs","../../../../../node_modules/.bun/@tanstack+react-table@8.21.3+7492c01c6988791b/node_modules/@tanstack/react-table/build/lib/index.mjs","../../../../react/src/export.ts","../../../../react/src/pages/export-dialog.tsx","../../../../react/src/pages/filter-codecs.ts","../../../../react/src/relations.ts","../../../../react/src/action-guard.ts","../../../../react/src/action-launcher.tsx","../../../../react/src/pages/list-page.tsx","../../../../react/src/components/reference-multi-table-dialog.tsx","../../../../react/src/property-renderer.tsx"],"sourcesContent":["// MediaPreview — opens a dialog with an image/video preview and a download\n// button. Used by the `previewMedia` property type to render HTTP(S) URLs to\n// remote photos/videos as a \"Preview\" button instead of raw text.\n\nimport * as React from 'react'\nimport { Download, Eye, ExternalLink, Loader2, AlertCircle } from 'lucide-react'\nimport { cn } from '../lib/utils.js'\nimport { Button } from './button.js'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from './dialog.js'\n\nexport type MediaKind = 'image' | 'video' | 'audio' | 'unknown'\n\nconst IMAGE_EXT = /\\.(jpe?g|png|gif|webp|avif|bmp|svg|ico|heic|heif)(\\?|#|$)/i\nconst VIDEO_EXT = /\\.(mp4|webm|mov|m4v|ogv|avi|mkv)(\\?|#|$)/i\nconst AUDIO_EXT = /\\.(mp3|wav|ogg|m4a|aac|flac)(\\?|#|$)/i\n\nexport function detectMediaKind(url: string): MediaKind {\n if (!url) return 'unknown'\n if (IMAGE_EXT.test(url)) return 'image'\n if (VIDEO_EXT.test(url)) return 'video'\n if (AUDIO_EXT.test(url)) return 'audio'\n return 'unknown'\n}\n\n/**\n * Probes the Content-Type of `url` when extension-based detection returns\n * 'unknown'. Runs only when `enabled` is true (dialog has been opened).\n *\n * Strategy:\n * 1. HEAD request — reads Content-Type header (works for same-origin or\n * CORS-enabled APIs like public avatar services).\n * 2. Image constructor fallback — handles servers that block HEAD but allow\n * img GET (bypasses CORS for image fetches by design).\n *\n * Returns [resolvedKind, isLoading].\n */\nfunction useProbeMediaKind(\n url: string,\n kindOverride: MediaKind | undefined,\n enabled: boolean,\n): [MediaKind, boolean] {\n const byExt = React.useMemo(() => detectMediaKind(url), [url])\n const [kind, setKind] = React.useState<MediaKind>(kindOverride ?? byExt)\n const [loading, setLoading] = React.useState(false)\n\n // Keep kind in sync when url or kindOverride changes (e.g. parent re-renders).\n React.useEffect(() => {\n setKind(kindOverride ?? detectMediaKind(url))\n setLoading(false)\n }, [url, kindOverride])\n\n React.useEffect(() => {\n if (!enabled) return\n if (kindOverride) return\n if (byExt !== 'unknown') return\n if (!url.startsWith('http')) return\n\n let cancelled = false\n const controller = new AbortController()\n setLoading(true)\n\n const resolve = (k: MediaKind) => {\n if (cancelled) return\n setKind(k)\n setLoading(false)\n }\n\n // Image constructor fallback — works even when HEAD is CORS-blocked.\n const tryImage = () => {\n const img = new window.Image()\n img.onload = () => resolve('image')\n img.onerror = () => resolve('unknown')\n img.src = url\n }\n\n fetch(url, { method: 'HEAD', signal: controller.signal })\n .then((res) => {\n const ct = res.headers.get('content-type') ?? ''\n if (ct.startsWith('image/')) resolve('image')\n else if (ct.startsWith('video/')) resolve('video')\n else if (ct.startsWith('audio/')) resolve('audio')\n else tryImage()\n })\n .catch(() => {\n if (!cancelled) tryImage()\n })\n\n return () => {\n cancelled = true\n controller.abort()\n }\n }, [url, kindOverride, byExt, enabled])\n\n return [kind, loading]\n}\n\nexport interface MediaPreviewProps {\n /** Media URL. Should be a fully-qualified HTTP(S) URL. */\n url: string\n /** Optional override for the auto-detected media kind. */\n kind?: MediaKind\n /** Suggested file name for the download. Falls back to URL pathname. */\n downloadName?: string\n /** Strings (already-translated) to render in the UI. */\n labels?: {\n preview?: string\n download?: string\n downloadError?: string\n openInNewTab?: string\n title?: string\n description?: string\n cannotPreview?: string\n }\n /** Show the URL as secondary text next to the trigger. */\n showUrl?: boolean\n /** Variant of the trigger button. Defaults to 'outline'. */\n triggerVariant?: 'default' | 'outline' | 'secondary' | 'ghost' | 'link'\n /** Size of the trigger button. Defaults to 'sm'. */\n triggerSize?: 'default' | 'sm' | 'lg' | 'icon'\n className?: string\n}\n\nexport function MediaPreview({\n url,\n kind: kindProp,\n downloadName,\n labels,\n showUrl = false,\n triggerVariant = 'outline',\n triggerSize = 'sm',\n className,\n}: MediaPreviewProps): React.ReactElement {\n const [open, setOpen] = React.useState(false)\n const [kind, kindLoading] = useProbeMediaKind(url, kindProp, open)\n const [downloading, setDownloading] = React.useState(false)\n const [downloadError, setDownloadError] = React.useState(false)\n\n const previewLabel = labels?.preview ?? 'Preview'\n const downloadLabel = labels?.download ?? 'Download'\n const openLabel = labels?.openInNewTab ?? 'Open in new tab'\n const titleLabel = labels?.title ?? previewLabel\n const cannotLabel = labels?.cannotPreview ?? 'Preview is unavailable for this media type.'\n\n const inferredName = React.useMemo(() => {\n if (downloadName) return downloadName\n try {\n const u = new URL(url)\n const last = u.pathname.split('/').filter(Boolean).pop()\n return last || 'download'\n } catch {\n return 'download'\n }\n }, [downloadName, url])\n\n // Force a file download via fetch → blob → blob URL. The <a download> attribute\n // is silently ignored by browsers for cross-origin URLs, so we always use the\n // blob approach. Falls back to window.open if fetch fails (e.g. no CORS).\n const handleDownload = async () => {\n setDownloadError(false)\n setDownloading(true)\n try {\n const res = await fetch(url)\n const blob = await res.blob()\n const blobUrl = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = blobUrl\n a.download = inferredName\n document.body.appendChild(a)\n a.click()\n document.body.removeChild(a)\n URL.revokeObjectURL(blobUrl)\n } catch {\n setDownloadError(true)\n } finally {\n setDownloading(false)\n }\n }\n\n // Stop click propagation so that events from the Dialog portal (which bubble\n // through the React component tree, not the DOM) do not reach parent row\n // click handlers and trigger unintended navigation (e.g. list-page TableRow\n // opening edit on backdrop/dialog click).\n const stopClick = (e: React.MouseEvent) => e.stopPropagation()\n\n return (\n <div className={cn('inline-flex items-center gap-2', className)} onClick={stopClick}>\n <Button\n type=\"button\"\n variant={triggerVariant}\n size={triggerSize}\n onClick={() => setOpen(true)}\n disabled={!url}\n >\n <Eye className=\"size-4\" />\n <span>{previewLabel}</span>\n </Button>\n\n {showUrl && url ? (\n <span\n className=\"max-w-[24rem] truncate text-xs text-muted-foreground\"\n title={url}\n >\n {url}\n </span>\n ) : null}\n\n <Dialog open={open} onOpenChange={setOpen}>\n <DialogContent className=\"max-w-3xl\">\n <DialogHeader>\n <DialogTitle>{titleLabel}</DialogTitle>\n {labels?.description ? (\n <DialogDescription>{labels.description}</DialogDescription>\n ) : (\n <DialogDescription className=\"break-all text-xs\">{url}</DialogDescription>\n )}\n </DialogHeader>\n\n <div className=\"flex max-h-[70vh] items-center justify-center overflow-auto rounded-md border border-border bg-muted/30 p-2\">\n {kindLoading ? (\n <Loader2 className=\"size-8 animate-spin text-muted-foreground\" />\n ) : kind === 'image' ? (\n <img\n src={url}\n alt={inferredName}\n className=\"max-h-[68vh] w-auto max-w-full object-contain\"\n />\n ) : kind === 'video' ? (\n <video\n src={url}\n controls\n className=\"max-h-[68vh] w-full max-w-full\"\n />\n ) : kind === 'audio' ? (\n <audio src={url} controls className=\"w-full\" />\n ) : (\n <div className=\"p-6 text-center text-sm text-muted-foreground\">\n {cannotLabel}\n </div>\n )}\n </div>\n\n <DialogFooter>\n {downloadError && (\n <span className=\"flex items-center gap-1.5 text-xs text-destructive\">\n <AlertCircle className=\"size-3.5\" />\n {labels?.downloadError ?? 'Download failed'}\n </span>\n )}\n <Button asChild variant=\"ghost\" size=\"sm\">\n <a href={url} target=\"_blank\" rel=\"noopener noreferrer\">\n <ExternalLink className=\"size-4\" />\n <span>{openLabel}</span>\n </a>\n </Button>\n <Button\n variant=\"default\"\n size=\"sm\"\n disabled={downloading}\n onClick={() => { void handleDownload() }}\n >\n {downloading\n ? <Loader2 className=\"size-4 animate-spin\" />\n : <Download className=\"size-4\" />}\n <span>{downloadLabel}</span>\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </div>\n )\n}\n","// Combobox — free-text autocomplete input.\n//\n// Distinct from `ReferenceCombobox` (in @modern-admin/react) which strictly\n// constrains the value to an existing referenced record. This primitive is\n// permissive: the user may type any string, and the suggestion list is\n// purely advisory. Suggestions can be:\n// • static (declared per field, e.g. enum-like hints), or\n// • dynamic (loaded by the parent — e.g. distinct values pulled from a\n// resource's column). The component itself is i18n-unaware and does\n// no fetching: callers feed `suggestions` and toggle `loading`.\n//\n// Behaviour:\n// • The input is fully controlled (`value` / `onChange`).\n// • Suggestions filter as you type: case-insensitive substring match\n// against label and value.\n// • Down/Up cycle highlight; Enter commits the highlighted item or\n// keeps the typed value if none is highlighted.\n// • Escape closes the panel; click-outside closes it (handled by Radix\n// Popover). Selecting an item sets the input value and closes.\n//\n// Mobile-first: the panel matches the input width via the\n// `--radix-popover-trigger-width` CSS var.\n//\n// i18n: optional `labels` prop with English defaults. The React layer is\n// expected to translate and feed them in.\n\nimport * as React from 'react'\nimport { ChevronDown, Loader2 } from 'lucide-react'\nimport { cn } from '../lib/utils.js'\nimport { Input } from './input.js'\nimport {\n Popover,\n PopoverAnchor,\n PopoverContent,\n} from './popover.js'\n\n/** Each suggestion may be a bare string (used as both value + label) or\n * an explicit `{ value, label }` pair. */\nexport type ComboboxSuggestion = string | { value: string; label: string }\n\nexport interface ComboboxLabels {\n /** Shown while `loading` is true and the panel is open. Default: 'Loading…'. */\n loading?: string\n /**\n * Shown when the panel is open, the user has typed something, but no\n * suggestion matches. Default: 'No matches — press Enter to keep what\n * you typed.' Use `{value}` to interpolate the current input value.\n */\n noMatches?: string\n /** Visually-hidden trigger label for screen readers. Default: 'Toggle suggestions'. */\n toggleSuggestions?: string\n}\n\nexport interface ComboboxProps {\n /** Current input value. */\n value: string\n /** Called on every keystroke and on suggestion pick. */\n onChange(next: string): void\n /** Called when the input loses focus (after the picker closes). */\n onBlur?(): void\n /** Static or pre-loaded suggestion list. May change while `loading`. */\n suggestions?: ReadonlyArray<ComboboxSuggestion>\n /** When true and the panel is open, render a small spinner. */\n loading?: boolean\n /** Disables the input and prevents the panel from opening. */\n disabled?: boolean\n placeholder?: string\n /** Forwarded to the `<input>` for accessibility (paired with a `<label>`). */\n id?: string\n 'aria-label'?: string\n className?: string\n /**\n * Maximum suggestions to render after filtering. Default: 50. Keeps the\n * panel snappy when callers pass thousands of distinct values.\n */\n maxItems?: number\n labels?: ComboboxLabels\n}\n\nconst defaultLabels: Required<ComboboxLabels> = {\n loading: 'Loading…',\n noMatches: 'No matches — press Enter to keep \"{value}\".',\n toggleSuggestions: 'Toggle suggestions',\n}\n\n/** Normalise a `ComboboxSuggestion` into `{ value, label }`. */\nconst normalise = (s: ComboboxSuggestion): { value: string; label: string } =>\n typeof s === 'string' ? { value: s, label: s } : s\n\n/** Case-insensitive substring match on label OR value. */\nconst matchesQuery = (\n s: { value: string; label: string },\n q: string,\n): boolean => {\n if (!q) return true\n const needle = q.toLowerCase()\n return (\n s.label.toLowerCase().includes(needle) ||\n s.value.toLowerCase().includes(needle)\n )\n}\n\nexport function Combobox({\n value,\n onChange,\n onBlur,\n suggestions,\n loading,\n disabled,\n placeholder,\n id,\n 'aria-label': ariaLabel,\n className,\n maxItems = 50,\n labels,\n}: ComboboxProps): React.ReactElement {\n const l = { ...defaultLabels, ...labels }\n const [focused, setFocused] = React.useState(false)\n const [highlight, setHighlight] = React.useState(0)\n\n const items = React.useMemo(() => {\n const all = (suggestions ?? []).map(normalise)\n return all.filter((s) => matchesQuery(s, value)).slice(0, maxItems)\n }, [suggestions, value, maxItems])\n\n // Reset highlight whenever the filtered set changes — otherwise the\n // index can point past the end after typing a more specific query.\n React.useEffect(() => {\n setHighlight(0)\n }, [items.length])\n\n // Open whenever the input is focused AND there's something to show\n // (either matching items or a loading spinner). Empty + non-loading =\n // no panel, so the component degrades to a plain input.\n const open =\n !disabled && focused && (items.length > 0 || Boolean(loading))\n\n const commit = (s: { value: string; label: string }): void => {\n onChange(s.value)\n setFocused(false)\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>): void => {\n if (!open) return\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n setHighlight((h) => Math.min(h + 1, items.length - 1))\n } else if (e.key === 'ArrowUp') {\n e.preventDefault()\n setHighlight((h) => Math.max(h - 1, 0))\n } else if (e.key === 'Enter') {\n const picked = items[highlight]\n if (picked) {\n e.preventDefault()\n commit(picked)\n }\n } else if (e.key === 'Escape') {\n setFocused(false)\n }\n }\n\n return (\n <Popover open={open}>\n <PopoverAnchor asChild>\n <div className={cn('relative', className)}>\n <Input\n id={id}\n type=\"text\"\n value={value}\n placeholder={placeholder}\n disabled={disabled}\n aria-label={ariaLabel}\n aria-autocomplete=\"list\"\n aria-expanded={open}\n autoComplete=\"off\"\n className=\"pr-8\"\n onFocus={() => setFocused(true)}\n onBlur={() => {\n // Defer so a click on a suggestion (which fires after blur)\n // can still commit before we close the panel.\n setTimeout(() => {\n setFocused(false)\n onBlur?.()\n }, 120)\n }}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={handleKeyDown}\n />\n {/* Trailing affordance: spinner while loading, otherwise a chevron\n hint that suggestions exist. Pure decoration — focusing the\n input is what opens the panel. */}\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-y-0 right-2 flex items-center text-muted-foreground\"\n >\n {loading ? (\n <Loader2 className=\"size-4 animate-spin\" />\n ) : (\n <ChevronDown className=\"size-4 opacity-50\" />\n )}\n </span>\n </div>\n </PopoverAnchor>\n <PopoverContent\n align=\"start\"\n sideOffset={4}\n // Prevent Radix from stealing focus from the input when the panel\n // opens — otherwise typing would move focus to the popover root.\n onOpenAutoFocus={(e) => e.preventDefault()}\n // Allow clicks inside the panel without closing the popover before\n // the click handler on the option fires.\n onInteractOutside={(e) => {\n // The blur handler closes the panel; nothing more to do here.\n // Preventing the default keeps Radix from re-toggling internal state.\n e.preventDefault()\n }}\n className=\"w-[var(--radix-popover-trigger-width)] p-1\"\n >\n {loading && items.length === 0 ? (\n <div className=\"px-2 py-2 text-sm text-muted-foreground\">\n {l.loading}\n </div>\n ) : items.length === 0 ? (\n <div className=\"px-2 py-2 text-sm text-muted-foreground\">\n {l.noMatches.replace('{value}', value)}\n </div>\n ) : (\n <ul role=\"listbox\" className=\"max-h-60 overflow-y-auto\">\n {items.map((s, i) => {\n const active = i === highlight\n return (\n <li\n key={s.value}\n role=\"option\"\n aria-selected={active}\n // Use mousedown (fires before input blur) so the click\n // commits the value before the panel closes.\n onMouseDown={(e) => {\n e.preventDefault()\n commit(s)\n }}\n onMouseEnter={() => setHighlight(i)}\n className={cn(\n 'cursor-pointer rounded-sm px-2 py-1.5 text-sm',\n active\n ? 'bg-accent text-accent-foreground'\n : 'text-foreground',\n )}\n >\n <span className=\"truncate\">{s.label}</span>\n {s.label !== s.value ? (\n <span className=\"ml-2 text-xs text-muted-foreground\">\n {s.value}\n </span>\n ) : null}\n </li>\n )\n })}\n </ul>\n )}\n </PopoverContent>\n </Popover>\n )\n}\n","// KeyValueEditor + KeyValueView — a friendly alternative to JsonEditor for\n// JSON columns with a *fixed* set of keys.\n//\n// Instead of showing the raw JSON (`{ \"locale\": \"en\", \"featured\": true }`)\n// the editor renders one row per declared key, each with a normal form\n// input typed appropriately (string, number, boolean, textarea, select).\n// No braces, no quotes, no parse errors — the user just edits the values.\n//\n// The component is i18n-unaware: it accepts an optional `labels` prop with\n// English fallbacks so it works standalone in tests/Storybook. The\n// `packages/react` layer translates and feeds them in.\n//\n// Mobile-first: each row stacks label-above-input on narrow screens and\n// switches to a two-column label/input layout from `sm:` upwards.\n\nimport * as React from 'react'\nimport { cn } from '../lib/utils.js'\nimport { Input } from './input.js'\nimport { Textarea } from './textarea.js'\nimport { Switch } from './switch.js'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from './select.js'\nimport { Combobox, type ComboboxLabels, type ComboboxSuggestion } from './combobox.js'\nimport { InfoTooltip } from './info-tooltip.js'\n\n/** Built-in editor types. Resource code may pass a string; unknown values\n * fall back to a plain string input. */\nexport type KeyValueFieldType =\n | 'string'\n | 'number'\n | 'boolean'\n | 'textarea'\n | 'select'\n | 'autocomplete'\n\n/** One declared key inside the JSON object. */\nexport interface KeyValueFieldSpec {\n /** JSON key on the underlying object. */\n key: string\n /** Visible label. Defaults to the key. */\n label?: string\n /** Editor kind. Default: `'string'`. */\n type?: KeyValueFieldType\n /** Helper text shown under the input. */\n description?: string\n /** Placeholder for text/number inputs. */\n placeholder?: string\n /** Visual `*` marker; required-ness is enforced by the form layer. */\n isRequired?: boolean\n /**\n * Enum source for `type: 'select'` and static suggestions for\n * `type: 'autocomplete'`. Either a list of strings (used both as value\n * and label) or `{ value, label }` objects.\n */\n availableValues?: ReadonlyArray<string | { value: string; label: string }>\n /**\n * For `type: 'autocomplete'`: pull dynamic suggestions from the named\n * field of records of another resource (e.g. `users.email`). Resolved\n * by the `packages/react` layer before render — KeyValueEditor itself\n * never fetches, the loaded values arrive via `suggestionsByKey`.\n */\n suggestionsResource?: string\n /** Path of the field on `suggestionsResource` to project. */\n suggestionsField?: string\n}\n\n/** English-default labels surfaced through `labels` for i18n. */\nexport interface KeyValueEditorLabels {\n /** Placeholder shown in the empty `select` slot. Default: '—'. */\n emptyOption?: string\n /** Visually-hidden / fallback label suffix when a row has no `label`. */\n fieldLabelFallback?: (key: string) => string\n /** Forwarded to the inner `Combobox` for autocomplete fields. */\n combobox?: ComboboxLabels\n}\n\nexport interface KeyValueEditorProps {\n /** Declared key set. Order is preserved on screen. */\n fields: ReadonlyArray<KeyValueFieldSpec>\n /** Current value. Anything that is not a plain object is treated as `{}`. */\n value: unknown\n /** Emits a fresh JSON object on every change. */\n onChange(next: Record<string, unknown>): void\n onBlur?(): void\n disabled?: boolean\n className?: string\n labels?: KeyValueEditorLabels\n /**\n * Pre-loaded suggestions per autocomplete field, keyed by `field.key`.\n * The editor stays i18n-/network-unaware: callers (e.g. the React\n * property renderer) load values from the database and feed them in.\n */\n suggestionsByKey?: Readonly<Record<string, ReadonlyArray<ComboboxSuggestion>>>\n /** Per-key loading flags to render a spinner while suggestions stream in. */\n suggestionsLoadingByKey?: Readonly<Record<string, boolean>>\n}\n\nconst defaultLabels: Required<Omit<KeyValueEditorLabels, 'combobox'>> &\n Pick<KeyValueEditorLabels, 'combobox'> = {\n emptyOption: '—',\n fieldLabelFallback: (key) => key,\n }\n\nconst toRecord = (value: unknown): Record<string, unknown> => {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n return value as Record<string, unknown>\n }\n return {}\n}\n\nconst normaliseAvailableValues = (\n raw: KeyValueFieldSpec['availableValues'],\n): Array<{ value: string; label: string }> => {\n if (!raw) return []\n return raw.map((v) => (typeof v === 'string' ? { value: v, label: v } : v))\n}\n\nconst SENTINEL_EMPTY = '__kv_empty__'\n\nexport function KeyValueEditor({\n fields,\n value,\n onChange,\n onBlur,\n disabled,\n className,\n labels,\n suggestionsByKey,\n suggestionsLoadingByKey,\n}: KeyValueEditorProps): React.ReactElement {\n const l = { ...defaultLabels, ...labels }\n const obj = toRecord(value)\n\n // Replace `key` with `next` and emit a brand-new object so callers using\n // referential equality (e.g. RHF) detect the change.\n const set = (key: string, next: unknown): void => {\n const out: Record<string, unknown> = { ...obj }\n if (next === null || next === undefined) {\n delete out[key]\n } else {\n out[key] = next\n }\n onChange(out)\n }\n\n return (\n <div\n className={cn(\n 'divide-y divide-border rounded-md border border-border bg-card',\n className,\n )}\n >\n {fields.map((f) => {\n const fieldType: KeyValueFieldType = f.type ?? 'string'\n const label = f.label ?? l.fieldLabelFallback(f.key)\n const inputId = `kv-${f.key}`\n const raw = obj[f.key]\n\n let control: React.ReactElement\n if (fieldType === 'boolean') {\n control = (\n <Switch\n id={inputId}\n checked={Boolean(raw)}\n onCheckedChange={(v) => set(f.key, Boolean(v))}\n disabled={disabled}\n aria-label={label}\n />\n )\n } else if (fieldType === 'number') {\n control = (\n <Input\n id={inputId}\n type=\"number\"\n inputMode=\"decimal\"\n value={raw == null ? '' : String(raw)}\n placeholder={f.placeholder}\n disabled={disabled}\n onBlur={onBlur}\n onChange={(e) => {\n const v = e.target.value\n if (v === '') return set(f.key, null)\n const n = Number(v)\n set(f.key, Number.isFinite(n) ? n : v)\n }}\n aria-label={label}\n />\n )\n } else if (fieldType === 'textarea') {\n control = (\n <Textarea\n id={inputId}\n value={raw == null ? '' : String(raw)}\n placeholder={f.placeholder}\n disabled={disabled}\n onBlur={onBlur}\n onChange={(e) =>\n set(f.key, e.target.value === '' ? null : e.target.value)\n }\n rows={3}\n aria-label={label}\n />\n )\n } else if (fieldType === 'select') {\n const opts = normaliseAvailableValues(f.availableValues)\n const current = raw == null || raw === '' ? SENTINEL_EMPTY : String(raw)\n control = (\n <Select\n value={current}\n onValueChange={(v) => set(f.key, v === SENTINEL_EMPTY ? null : v)}\n disabled={disabled}\n >\n <SelectTrigger id={inputId} aria-label={label}>\n <SelectValue placeholder={l.emptyOption} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={SENTINEL_EMPTY}>{l.emptyOption}</SelectItem>\n {opts.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )\n } else if (fieldType === 'autocomplete') {\n // Combine static `availableValues` declared on the field with\n // any dynamic values pre-loaded by the parent (e.g. distinct\n // values from a DB column). Dedupe by `value` so a static hint\n // and a DB row that share a value collapse to a single item.\n const fromStatic = normaliseAvailableValues(f.availableValues)\n const fromDynamic = suggestionsByKey?.[f.key] ?? []\n const seen = new Set<string>()\n const merged: ComboboxSuggestion[] = []\n for (const s of [...fromStatic, ...fromDynamic]) {\n const v = typeof s === 'string' ? s : s.value\n if (seen.has(v)) continue\n seen.add(v)\n merged.push(s)\n }\n control = (\n <Combobox\n id={inputId}\n value={raw == null ? '' : String(raw)}\n onChange={(v) => set(f.key, v === '' ? null : v)}\n onBlur={onBlur}\n suggestions={merged}\n loading={suggestionsLoadingByKey?.[f.key]}\n disabled={disabled}\n placeholder={f.placeholder}\n aria-label={label}\n labels={labels?.combobox}\n />\n )\n } else {\n // string (default)\n control = (\n <Input\n id={inputId}\n type=\"text\"\n value={raw == null ? '' : String(raw)}\n placeholder={f.placeholder}\n disabled={disabled}\n onBlur={onBlur}\n onChange={(e) =>\n set(f.key, e.target.value === '' ? null : e.target.value)\n }\n aria-label={label}\n />\n )\n }\n\n return (\n <div\n key={f.key}\n className=\"flex flex-col gap-1.5 p-3 sm:flex-row sm:items-start sm:gap-4\"\n >\n <label\n htmlFor={inputId}\n className=\"flex shrink-0 items-center gap-1 text-sm font-medium text-foreground sm:w-44 sm:pt-2\"\n >\n <span className=\"truncate\">{label}</span>\n {f.description ? (\n <InfoTooltip content={f.description} ariaLabel={f.description} />\n ) : null}\n {f.isRequired ? (\n <span aria-hidden=\"true\" className=\"text-destructive\">\n *\n </span>\n ) : null}\n </label>\n <div className=\"min-w-0 flex-1\">\n {control}\n </div>\n </div>\n )\n })}\n </div>\n )\n}\n\n// ─── Read-only view ──────────────────────────────────────────────────────────\n\nexport interface KeyValueViewLabels {\n /** Placeholder for missing values. Default: '—'. */\n emptyValue?: string\n /** Field label fallback when a spec entry has no `label`. */\n fieldLabelFallback?: (key: string) => string\n /** Boolean true label. Default: 'Yes'. */\n trueLabel?: string\n /** Boolean false label. Default: 'No'. */\n falseLabel?: string\n}\n\nexport interface KeyValueViewProps {\n fields: ReadonlyArray<KeyValueFieldSpec>\n value: unknown\n className?: string\n /**\n * `'inline'` collapses all fields into a single comma-separated row used\n * by the list view. `'block'` (default) renders a vertical key/value\n * table for the show view.\n */\n variant?: 'inline' | 'block'\n labels?: KeyValueViewLabels\n}\n\nconst defaultViewLabels: Required<KeyValueViewLabels> = {\n emptyValue: '—',\n fieldLabelFallback: (key) => key,\n trueLabel: 'Yes',\n falseLabel: 'No',\n}\n\nconst stringifyDisplay = (\n raw: unknown,\n field: KeyValueFieldSpec,\n l: Required<KeyValueViewLabels>,\n): string => {\n if (raw == null || raw === '') return l.emptyValue\n if (field.type === 'boolean') return raw ? l.trueLabel : l.falseLabel\n if (\n (field.type === 'select' || field.type === 'autocomplete') &&\n field.availableValues\n ) {\n const opts = normaliseAvailableValues(field.availableValues)\n const match = opts.find((o) => o.value === String(raw))\n return match?.label ?? String(raw)\n }\n if (typeof raw === 'object') {\n try {\n return JSON.stringify(raw)\n } catch {\n return String(raw)\n }\n }\n return String(raw)\n}\n\nexport function KeyValueView({\n fields,\n value,\n className,\n variant = 'block',\n labels,\n}: KeyValueViewProps): React.ReactElement {\n const l = { ...defaultViewLabels, ...labels }\n const obj = toRecord(value)\n\n if (variant === 'inline') {\n const parts = fields\n .map((f) => {\n const raw = obj[f.key]\n if (raw == null || raw === '') return null\n const label = f.label ?? l.fieldLabelFallback(f.key)\n return `${label}: ${stringifyDisplay(raw, f, l)}`\n })\n .filter((s): s is string => s !== null)\n return (\n <span\n className={cn(\n 'line-clamp-1 max-w-[24rem] truncate text-xs text-muted-foreground',\n className,\n )}\n title={parts.join(', ') || undefined}\n >\n {parts.length > 0 ? parts.join(', ') : l.emptyValue}\n </span>\n )\n }\n\n return (\n <dl\n className={cn(\n 'divide-y divide-border rounded-md border border-border bg-muted/30 text-sm',\n className,\n )}\n >\n {fields.map((f) => {\n const label = f.label ?? l.fieldLabelFallback(f.key)\n const text = stringifyDisplay(obj[f.key], f, l)\n return (\n <div\n key={f.key}\n className=\"flex flex-col gap-0.5 p-3 sm:flex-row sm:items-baseline sm:gap-4\"\n >\n <dt className=\"shrink-0 text-xs font-medium uppercase tracking-wide text-muted-foreground sm:w-44\">\n {label}\n </dt>\n <dd className=\"min-w-0 flex-1 break-words text-foreground\">\n {text}\n </dd>\n </div>\n )\n })}\n </dl>\n )\n}\n","/**\n * FileInput — styled file picker with optional drag-and-drop, current-file\n * display, and a remove button. Purely presentational: upload logic lives in\n * the `packages/react` property renderer.\n *\n * Mobile-first: full-width by default, tap-friendly hit areas.\n */\n\nimport * as React from 'react'\nimport { Upload, X, FileText, Loader2 } from 'lucide-react'\nimport { cn } from '../lib/utils.js'\nimport { Button } from './button.js'\n\nexport interface FileInputLabels {\n /** Dropzone aria-label. Default: \"Choose file\". */\n chooseFile?: string\n /** Drop zone hint before the link. Default: \"Drag and drop or\". */\n dragAndDrop?: string\n /** Link text when no file selected. Default: \"choose a file\". */\n chooseAFile?: string\n /** Upload spinner text (no filename). Default: \"Uploading…\". */\n uploading?: string\n /** Upload spinner text with filename — `{name}` is replaced. Default: \"Uploading {name}…\". */\n uploadingFile?: string\n /** Remove button aria-label. Default: \"Remove file\". */\n removeFile?: string\n}\n\nexport interface FileInputProps {\n /** Current stored value (storage key or URL). Shown as the \"current file\". */\n value?: string | null\n /** Human-readable display name for the current file. Falls back to `value`. */\n displayName?: string | null\n /** Public URL used for image thumbnail previews. */\n previewUrl?: string | null\n /** HTML `accept` attribute (e.g. `'image/*'` or `'.pdf,.docx'`). */\n accept?: string\n /** Whether a file is currently being uploaded. Shows a spinner. */\n uploading?: boolean\n /** Upload progress 0–100 (overrides the spinner with a determinate bar when set). */\n uploadProgress?: number\n /** Local file name shown next to the progress indicator. */\n uploadingName?: string\n /** Upload error message. */\n error?: string\n disabled?: boolean\n className?: string\n /** Translated UI labels. All optional — English strings are the defaults. */\n labels?: FileInputLabels\n /** Called when the user picks a new file. */\n onFileSelect: (file: File) => void\n /** Called when the user removes the current file. */\n onRemove?: () => void\n}\n\nexport function FileInput({\n value,\n displayName,\n previewUrl,\n accept,\n uploading = false,\n uploadProgress,\n uploadingName,\n error,\n disabled = false,\n className,\n labels,\n onFileSelect,\n onRemove,\n}: FileInputProps): React.ReactElement {\n const l = {\n chooseFile: labels?.chooseFile ?? 'Choose file',\n dragAndDrop: labels?.dragAndDrop ?? 'Drag and drop or',\n chooseAFile: labels?.chooseAFile ?? 'choose a file',\n uploading: labels?.uploading ?? 'Uploading…',\n uploadingFile: labels?.uploadingFile ?? 'Uploading {name}…',\n removeFile: labels?.removeFile ?? 'Remove file',\n }\n const inputRef = React.useRef<HTMLInputElement>(null)\n const [isDragging, setIsDragging] = React.useState(false)\n\n const handleFiles = (files: FileList | null) => {\n const first = files?.[0]\n if (!first || disabled || uploading) return\n onFileSelect(first)\n }\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) =>\n handleFiles(e.target.files)\n\n const handleDrop = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault()\n setIsDragging(false)\n handleFiles(e.dataTransfer.files)\n }\n\n const handleDragOver = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault()\n if (!disabled && !uploading) setIsDragging(true)\n }\n\n const handleDragLeave = () => setIsDragging(false)\n\n const label = displayName || (value ? value.split('/').pop() : null)\n\n // Detect image for thumbnail preview\n const isImage =\n previewUrl\n ? /\\.(jpe?g|png|gif|webp|avif|svg|bmp)(\\?|$)/i.test(previewUrl)\n : false\n\n return (\n <div className={cn('w-full space-y-2', className)}>\n {/* Drop zone / trigger */}\n <div\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-label={l.chooseFile}\n onClick={() => !disabled && !uploading && inputRef.current?.click()}\n onKeyDown={(e) => {\n if ((e.key === 'Enter' || e.key === ' ') && !disabled && !uploading) {\n e.preventDefault()\n inputRef.current?.click()\n }\n }}\n onDrop={handleDrop}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n className={cn(\n 'flex min-h-[5rem] w-full cursor-pointer flex-col items-center justify-center gap-2 rounded-md border-2 border-dashed border-border bg-muted/30 px-4 py-6 text-center transition-colors',\n 'hover:border-primary/50 hover:bg-muted/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n isDragging && 'border-primary bg-primary/5',\n (disabled || uploading) && 'cursor-not-allowed opacity-60',\n )}\n >\n {uploading ? (\n <div className=\"flex w-full max-w-sm flex-col items-center gap-2\">\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Loader2 className=\"size-5 animate-spin\" />\n <span className=\"truncate\" title={uploadingName ?? undefined}>\n {uploadingName\n ? l.uploadingFile.replace('{name}', uploadingName)\n : l.uploading}\n </span>\n </div>\n {uploadProgress != null && (\n <div className=\"flex w-full items-center gap-2\">\n <div\n className=\"h-1.5 flex-1 overflow-hidden rounded-full bg-muted\"\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={uploadProgress}\n >\n <div\n className=\"h-full rounded-full bg-primary transition-[width] duration-150 ease-out\"\n style={{ width: `${uploadProgress}%` }}\n />\n </div>\n <span className=\"w-10 shrink-0 text-right text-xs tabular-nums text-muted-foreground\">\n {uploadProgress}%\n </span>\n </div>\n )}\n </div>\n ) : (\n <>\n <Upload className=\"size-6 text-muted-foreground\" />\n <span className=\"text-sm font-medium text-foreground\">\n <span className=\"hidden sm:inline\">{l.dragAndDrop} </span>\n <span className=\"text-primary underline-offset-2 hover:underline\">\n {l.chooseAFile}\n </span>\n </span>\n {accept && (\n <span className=\"text-xs text-muted-foreground\">{accept}</span>\n )}\n </>\n )}\n </div>\n\n {/* Current file row */}\n {value && !uploading && (\n <div className=\"flex items-center gap-2 rounded-md border border-border bg-background px-3 py-2\">\n {isImage && previewUrl ? (\n <img\n src={previewUrl}\n alt={label ?? 'preview'}\n className=\"size-10 shrink-0 rounded object-cover\"\n />\n ) : (\n <FileText className=\"size-5 shrink-0 text-muted-foreground\" />\n )}\n <span className=\"min-w-0 flex-1 truncate text-sm text-foreground\" title={label ?? value}>\n {label ?? value}\n </span>\n {onRemove && !disabled && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7 shrink-0 text-muted-foreground hover:text-destructive\"\n aria-label={l.removeFile}\n onClick={(e) => {\n e.stopPropagation()\n onRemove()\n }}\n >\n <X className=\"size-4\" />\n </Button>\n )}\n </div>\n )}\n\n {/* Error message */}\n {error && (\n <p className=\"text-sm text-destructive\">{error}</p>\n )}\n\n {/* Hidden native input */}\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n className=\"sr-only\"\n onChange={handleInputChange}\n disabled={disabled || uploading}\n tabIndex={-1}\n aria-hidden\n />\n </div>\n )\n}\n","/**\n * MultiFileInput — drag-and-drop file picker that accepts multiple files at\n * once and renders a list of currently-attached files with per-file remove\n * controls. Mirrors `FileInput` but works on an array of values.\n *\n * Purely presentational — upload + cancel logic lives in the\n * `packages/react` property renderer.\n */\n\nimport * as React from 'react'\nimport { Upload, X, FileText, Loader2 } from 'lucide-react'\nimport { cn } from '../lib/utils.js'\nimport { Button } from './button.js'\n\nexport interface MultiFileInputItem {\n /** Storage key (or URL). */\n value: string\n /** Optional public URL used for image thumbnails. */\n previewUrl?: string | null\n /** Optional display name. Falls back to the last path segment of `value`. */\n displayName?: string | null\n}\n\n/** In-progress upload — rendered as a separate row with progress / error. */\nexport interface MultiFileInputPendingItem {\n /** Stable identifier for the pending row (e.g. `crypto.randomUUID()`). */\n id: string\n /** Display name (typically the local file name). */\n name: string\n /** 0–100. `undefined` while the request is queued or finished. */\n progress?: number\n /** Status text — when present, replaces the progress bar. */\n status?: 'queued' | 'uploading' | 'error'\n /** Error message to render when `status === 'error'`. */\n error?: string\n}\n\nexport interface MultiFileInputLabels {\n /** Dropzone aria-label. Default: \"Choose files\". */\n chooseFiles?: string\n /** Drop zone hint before the link. Default: \"Drag and drop or\". */\n dragAndDrop?: string\n /** Link text when no files selected. Default: \"choose files\". */\n chooseLink?: string\n /** Link text when files already exist. Default: \"add more files\". */\n addMoreLink?: string\n /** Upload spinner text. Default: \"Uploading…\". */\n uploading?: string\n /** Remove button aria-label. Default: \"Remove file\". */\n removeFile?: string\n /** Fallback error when pending item has no message. Default: \"Upload failed\". */\n uploadFailed?: string\n /** Dismiss error button aria-label. Default: \"Dismiss\". */\n dismiss?: string\n}\n\nexport interface MultiFileInputProps {\n /** Currently attached files. */\n items: ReadonlyArray<MultiFileInputItem>\n /** Files currently being uploaded — rendered below the persisted list. */\n pendingItems?: ReadonlyArray<MultiFileInputPendingItem>\n /** HTML `accept` attribute (e.g. `'image/*'` or `'.pdf,.docx'`). */\n accept?: string\n /**\n * Whether files are currently being uploaded. Shows a spinner in the\n * dropzone. Ignored when `pendingItems` is non-empty (the per-item\n * progress rows take over the role of the dropzone spinner).\n */\n uploading?: boolean\n /** Upload error message. */\n error?: string\n disabled?: boolean\n className?: string\n /** Translated UI labels. All optional — English strings are the defaults. */\n labels?: MultiFileInputLabels\n /** Called when the user picks one or more new files. */\n onFilesSelect: (files: File[]) => void\n /** Called when the user removes the file at the given index. */\n onRemove: (index: number) => void\n /** Called when the user dismisses an errored pending item. */\n onPendingDismiss?: (id: string) => void\n}\n\nconst isImageUrl = (url: string | null | undefined): boolean =>\n !!url && /\\.(jpe?g|png|gif|webp|avif|svg|bmp)(\\?|$)/i.test(url)\n\nexport function MultiFileInput({\n items,\n pendingItems,\n accept,\n uploading = false,\n error,\n disabled = false,\n className,\n labels,\n onFilesSelect,\n onRemove,\n onPendingDismiss,\n}: MultiFileInputProps): React.ReactElement {\n const l = {\n chooseFiles: labels?.chooseFiles ?? 'Choose files',\n dragAndDrop: labels?.dragAndDrop ?? 'Drag and drop or',\n chooseLink: labels?.chooseLink ?? 'choose files',\n addMoreLink: labels?.addMoreLink ?? 'add more files',\n uploading: labels?.uploading ?? 'Uploading…',\n removeFile: labels?.removeFile ?? 'Remove file',\n uploadFailed: labels?.uploadFailed ?? 'Upload failed',\n dismiss: labels?.dismiss ?? 'Dismiss',\n }\n const inputRef = React.useRef<HTMLInputElement>(null)\n const [isDragging, setIsDragging] = React.useState(false)\n const hasPending = (pendingItems?.length ?? 0) > 0\n // The dropzone spinner is redundant when individual progress rows are\n // already on screen — only show it for batch uploads that don't supply\n // per-item progress.\n const showSpinner = uploading && !hasPending\n\n const handleFiles = (files: FileList | null): void => {\n if (!files || files.length === 0 || disabled) return\n onFilesSelect(Array.from(files))\n }\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>): void => {\n handleFiles(e.target.files)\n // Allow re-selecting the same file again immediately after removing it.\n e.target.value = ''\n }\n\n const handleDrop = (e: React.DragEvent<HTMLDivElement>): void => {\n e.preventDefault()\n setIsDragging(false)\n handleFiles(e.dataTransfer.files)\n }\n\n const handleDragOver = (e: React.DragEvent<HTMLDivElement>): void => {\n e.preventDefault()\n if (!disabled) setIsDragging(true)\n }\n\n const handleDragLeave = (): void => setIsDragging(false)\n\n return (\n <div className={cn('w-full space-y-2', className)}>\n {/* Drop zone / trigger */}\n <div\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-label={l.chooseFiles}\n onClick={() => !disabled && inputRef.current?.click()}\n onKeyDown={(e) => {\n if ((e.key === 'Enter' || e.key === ' ') && !disabled) {\n e.preventDefault()\n inputRef.current?.click()\n }\n }}\n onDrop={handleDrop}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n className={cn(\n 'flex min-h-[5rem] w-full cursor-pointer flex-col items-center justify-center gap-2 rounded-md border-2 border-dashed border-border bg-muted/30 px-4 py-6 text-center transition-colors',\n 'hover:border-primary/50 hover:bg-muted/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n isDragging && 'border-primary bg-primary/5',\n disabled && 'cursor-not-allowed opacity-60',\n )}\n >\n {showSpinner ? (\n <>\n <Loader2 className=\"size-6 animate-spin text-muted-foreground\" />\n <span className=\"text-sm text-muted-foreground\">{l.uploading}</span>\n </>\n ) : (\n <>\n <Upload className=\"size-6 text-muted-foreground\" />\n <span className=\"text-sm font-medium text-foreground\">\n <span className=\"hidden sm:inline\">{l.dragAndDrop} </span>\n <span className=\"text-primary underline-offset-2 hover:underline\">\n {items.length > 0 ? l.addMoreLink : l.chooseLink}\n </span>\n </span>\n {accept && (\n <span className=\"text-xs text-muted-foreground\">{accept}</span>\n )}\n </>\n )}\n </div>\n\n {/* Current file list */}\n {items.length > 0 && (\n <ul className=\"space-y-1\">\n {items.map((item, idx) => {\n const label = item.displayName || (item.value ? item.value.split('/').pop() : null)\n const showImage = isImageUrl(item.previewUrl)\n return (\n <li\n key={`${item.value}-${idx}`}\n className=\"flex items-center gap-2 rounded-md border border-border bg-background px-3 py-2\"\n >\n {showImage && item.previewUrl ? (\n <img\n src={item.previewUrl}\n alt={label ?? 'preview'}\n className=\"size-10 shrink-0 rounded object-cover\"\n />\n ) : (\n <FileText className=\"size-5 shrink-0 text-muted-foreground\" />\n )}\n <span\n className=\"min-w-0 flex-1 truncate text-sm text-foreground\"\n title={label ?? item.value}\n >\n {label ?? item.value}\n </span>\n {!disabled && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7 shrink-0 text-muted-foreground hover:text-destructive\"\n aria-label={l.removeFile}\n onClick={(e) => {\n e.stopPropagation()\n onRemove(idx)\n }}\n >\n <X className=\"size-4\" />\n </Button>\n )}\n </li>\n )\n })}\n </ul>\n )}\n\n {/* In-progress uploads */}\n {hasPending && (\n <ul className=\"space-y-1\">\n {pendingItems!.map((p) => (\n <li\n key={p.id}\n className={cn(\n 'flex items-center gap-3 rounded-md border bg-background px-3 py-2',\n p.status === 'error' ? 'border-destructive/50' : 'border-border',\n )}\n >\n {p.status === 'error' ? (\n <FileText className=\"size-5 shrink-0 text-destructive\" />\n ) : (\n <Loader2 className=\"size-5 shrink-0 animate-spin text-muted-foreground\" />\n )}\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-sm text-foreground\" title={p.name}>\n {p.name}\n </div>\n {p.status === 'error' ? (\n <div className=\"text-xs text-destructive\" role=\"alert\">\n {p.error || l.uploadFailed}\n </div>\n ) : (\n <div className=\"mt-1 flex items-center gap-2\">\n <div\n className=\"h-1.5 flex-1 overflow-hidden rounded-full bg-muted\"\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={p.progress ?? 0}\n >\n <div\n className=\"h-full rounded-full bg-primary transition-[width] duration-150 ease-out\"\n style={{ width: `${p.progress ?? 0}%` }}\n />\n </div>\n <span className=\"w-10 shrink-0 text-right text-xs tabular-nums text-muted-foreground\">\n {p.progress != null ? `${p.progress}%` : '…'}\n </span>\n </div>\n )}\n </div>\n {p.status === 'error' && onPendingDismiss && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7 shrink-0 text-muted-foreground hover:text-destructive\"\n aria-label={l.dismiss}\n onClick={(e) => {\n e.stopPropagation()\n onPendingDismiss(p.id)\n }}\n >\n <X className=\"size-4\" />\n </Button>\n )}\n </li>\n ))}\n </ul>\n )}\n\n {/* Error message */}\n {error && <p className=\"text-sm text-destructive\">{error}</p>}\n\n {/* Hidden native input */}\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n multiple\n className=\"sr-only\"\n onChange={handleInputChange}\n disabled={disabled}\n tabIndex={-1}\n aria-hidden\n />\n </div>\n )\n}\n","/**\n * table-core\n *\n * Copyright (c) TanStack\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.md file in the root directory of this source tree.\n *\n * @license MIT\n */\n// type Person = {\n// firstName: string\n// lastName: string\n// age: number\n// visits: number\n// status: string\n// progress: number\n// createdAt: Date\n// nested: {\n// foo: [\n// {\n// bar: 'bar'\n// }\n// ]\n// bar: { subBar: boolean }[]\n// baz: {\n// foo: 'foo'\n// bar: {\n// baz: 'baz'\n// }\n// }\n// }\n// }\n\n// const test: DeepKeys<Person> = 'nested.foo.0.bar'\n// const test2: DeepKeys<Person> = 'nested.bar'\n\n// const helper = createColumnHelper<Person>()\n\n// helper.accessor('nested.foo', {\n// cell: info => info.getValue(),\n// })\n\n// helper.accessor('nested.foo.0.bar', {\n// cell: info => info.getValue(),\n// })\n\n// helper.accessor('nested.bar', {\n// cell: info => info.getValue(),\n// })\n\nfunction createColumnHelper() {\n return {\n accessor: (accessor, column) => {\n return typeof accessor === 'function' ? {\n ...column,\n accessorFn: accessor\n } : {\n ...column,\n accessorKey: accessor\n };\n },\n display: column => column,\n group: column => column\n };\n}\n\n// Is this type a tuple?\n\n// If this type is a tuple, what indices are allowed?\n\n///\n\nfunction functionalUpdate(updater, input) {\n return typeof updater === 'function' ? updater(input) : updater;\n}\nfunction noop() {\n //\n}\nfunction makeStateUpdater(key, instance) {\n return updater => {\n instance.setState(old => {\n return {\n ...old,\n [key]: functionalUpdate(updater, old[key])\n };\n });\n };\n}\nfunction isFunction(d) {\n return d instanceof Function;\n}\nfunction isNumberArray(d) {\n return Array.isArray(d) && d.every(val => typeof val === 'number');\n}\nfunction flattenBy(arr, getChildren) {\n const flat = [];\n const recurse = subArr => {\n subArr.forEach(item => {\n flat.push(item);\n const children = getChildren(item);\n if (children != null && children.length) {\n recurse(children);\n }\n });\n };\n recurse(arr);\n return flat;\n}\nfunction memo(getDeps, fn, opts) {\n let deps = [];\n let result;\n return depArgs => {\n let depTime;\n if (opts.key && opts.debug) depTime = Date.now();\n const newDeps = getDeps(depArgs);\n const depsChanged = newDeps.length !== deps.length || newDeps.some((dep, index) => deps[index] !== dep);\n if (!depsChanged) {\n return result;\n }\n deps = newDeps;\n let resultTime;\n if (opts.key && opts.debug) resultTime = Date.now();\n result = fn(...newDeps);\n opts == null || opts.onChange == null || opts.onChange(result);\n if (opts.key && opts.debug) {\n if (opts != null && opts.debug()) {\n const depEndTime = Math.round((Date.now() - depTime) * 100) / 100;\n const resultEndTime = Math.round((Date.now() - resultTime) * 100) / 100;\n const resultFpsPercentage = resultEndTime / 16;\n const pad = (str, num) => {\n str = String(str);\n while (str.length < num) {\n str = ' ' + str;\n }\n return str;\n };\n console.info(`%c⏱ ${pad(resultEndTime, 5)} /${pad(depEndTime, 5)} ms`, `\n font-size: .6rem;\n font-weight: bold;\n color: hsl(${Math.max(0, Math.min(120 - 120 * resultFpsPercentage, 120))}deg 100% 31%);`, opts == null ? void 0 : opts.key);\n }\n }\n return result;\n };\n}\nfunction getMemoOptions(tableOptions, debugLevel, key, onChange) {\n return {\n debug: () => {\n var _tableOptions$debugAl;\n return (_tableOptions$debugAl = tableOptions == null ? void 0 : tableOptions.debugAll) != null ? _tableOptions$debugAl : tableOptions[debugLevel];\n },\n key: process.env.NODE_ENV === 'development' && key,\n onChange\n };\n}\n\nfunction createCell(table, row, column, columnId) {\n const getRenderValue = () => {\n var _cell$getValue;\n return (_cell$getValue = cell.getValue()) != null ? _cell$getValue : table.options.renderFallbackValue;\n };\n const cell = {\n id: `${row.id}_${column.id}`,\n row,\n column,\n getValue: () => row.getValue(columnId),\n renderValue: getRenderValue,\n getContext: memo(() => [table, column, row, cell], (table, column, row, cell) => ({\n table,\n column,\n row,\n cell: cell,\n getValue: cell.getValue,\n renderValue: cell.renderValue\n }), getMemoOptions(table.options, 'debugCells', 'cell.getContext'))\n };\n table._features.forEach(feature => {\n feature.createCell == null || feature.createCell(cell, column, row, table);\n }, {});\n return cell;\n}\n\nfunction createColumn(table, columnDef, depth, parent) {\n var _ref, _resolvedColumnDef$id;\n const defaultColumn = table._getDefaultColumnDef();\n const resolvedColumnDef = {\n ...defaultColumn,\n ...columnDef\n };\n const accessorKey = resolvedColumnDef.accessorKey;\n let id = (_ref = (_resolvedColumnDef$id = resolvedColumnDef.id) != null ? _resolvedColumnDef$id : accessorKey ? typeof String.prototype.replaceAll === 'function' ? accessorKey.replaceAll('.', '_') : accessorKey.replace(/\\./g, '_') : undefined) != null ? _ref : typeof resolvedColumnDef.header === 'string' ? resolvedColumnDef.header : undefined;\n let accessorFn;\n if (resolvedColumnDef.accessorFn) {\n accessorFn = resolvedColumnDef.accessorFn;\n } else if (accessorKey) {\n // Support deep accessor keys\n if (accessorKey.includes('.')) {\n accessorFn = originalRow => {\n let result = originalRow;\n for (const key of accessorKey.split('.')) {\n var _result;\n result = (_result = result) == null ? void 0 : _result[key];\n if (process.env.NODE_ENV !== 'production' && result === undefined) {\n console.warn(`\"${key}\" in deeply nested key \"${accessorKey}\" returned undefined.`);\n }\n }\n return result;\n };\n } else {\n accessorFn = originalRow => originalRow[resolvedColumnDef.accessorKey];\n }\n }\n if (!id) {\n if (process.env.NODE_ENV !== 'production') {\n throw new Error(resolvedColumnDef.accessorFn ? `Columns require an id when using an accessorFn` : `Columns require an id when using a non-string header`);\n }\n throw new Error();\n }\n let column = {\n id: `${String(id)}`,\n accessorFn,\n parent: parent,\n depth,\n columnDef: resolvedColumnDef,\n columns: [],\n getFlatColumns: memo(() => [true], () => {\n var _column$columns;\n return [column, ...((_column$columns = column.columns) == null ? void 0 : _column$columns.flatMap(d => d.getFlatColumns()))];\n }, getMemoOptions(table.options, 'debugColumns', 'column.getFlatColumns')),\n getLeafColumns: memo(() => [table._getOrderColumnsFn()], orderColumns => {\n var _column$columns2;\n if ((_column$columns2 = column.columns) != null && _column$columns2.length) {\n let leafColumns = column.columns.flatMap(column => column.getLeafColumns());\n return orderColumns(leafColumns);\n }\n return [column];\n }, getMemoOptions(table.options, 'debugColumns', 'column.getLeafColumns'))\n };\n for (const feature of table._features) {\n feature.createColumn == null || feature.createColumn(column, table);\n }\n\n // Yes, we have to convert table to unknown, because we know more than the compiler here.\n return column;\n}\n\nconst debug = 'debugHeaders';\n//\n\nfunction createHeader(table, column, options) {\n var _options$id;\n const id = (_options$id = options.id) != null ? _options$id : column.id;\n let header = {\n id,\n column,\n index: options.index,\n isPlaceholder: !!options.isPlaceholder,\n placeholderId: options.placeholderId,\n depth: options.depth,\n subHeaders: [],\n colSpan: 0,\n rowSpan: 0,\n headerGroup: null,\n getLeafHeaders: () => {\n const leafHeaders = [];\n const recurseHeader = h => {\n if (h.subHeaders && h.subHeaders.length) {\n h.subHeaders.map(recurseHeader);\n }\n leafHeaders.push(h);\n };\n recurseHeader(header);\n return leafHeaders;\n },\n getContext: () => ({\n table,\n header: header,\n column\n })\n };\n table._features.forEach(feature => {\n feature.createHeader == null || feature.createHeader(header, table);\n });\n return header;\n}\nconst Headers = {\n createTable: table => {\n // Header Groups\n\n table.getHeaderGroups = memo(() => [table.getAllColumns(), table.getVisibleLeafColumns(), table.getState().columnPinning.left, table.getState().columnPinning.right], (allColumns, leafColumns, left, right) => {\n var _left$map$filter, _right$map$filter;\n const leftColumns = (_left$map$filter = left == null ? void 0 : left.map(columnId => leafColumns.find(d => d.id === columnId)).filter(Boolean)) != null ? _left$map$filter : [];\n const rightColumns = (_right$map$filter = right == null ? void 0 : right.map(columnId => leafColumns.find(d => d.id === columnId)).filter(Boolean)) != null ? _right$map$filter : [];\n const centerColumns = leafColumns.filter(column => !(left != null && left.includes(column.id)) && !(right != null && right.includes(column.id)));\n const headerGroups = buildHeaderGroups(allColumns, [...leftColumns, ...centerColumns, ...rightColumns], table);\n return headerGroups;\n }, getMemoOptions(table.options, debug, 'getHeaderGroups'));\n table.getCenterHeaderGroups = memo(() => [table.getAllColumns(), table.getVisibleLeafColumns(), table.getState().columnPinning.left, table.getState().columnPinning.right], (allColumns, leafColumns, left, right) => {\n leafColumns = leafColumns.filter(column => !(left != null && left.includes(column.id)) && !(right != null && right.includes(column.id)));\n return buildHeaderGroups(allColumns, leafColumns, table, 'center');\n }, getMemoOptions(table.options, debug, 'getCenterHeaderGroups'));\n table.getLeftHeaderGroups = memo(() => [table.getAllColumns(), table.getVisibleLeafColumns(), table.getState().columnPinning.left], (allColumns, leafColumns, left) => {\n var _left$map$filter2;\n const orderedLeafColumns = (_left$map$filter2 = left == null ? void 0 : left.map(columnId => leafColumns.find(d => d.id === columnId)).filter(Boolean)) != null ? _left$map$filter2 : [];\n return buildHeaderGroups(allColumns, orderedLeafColumns, table, 'left');\n }, getMemoOptions(table.options, debug, 'getLeftHeaderGroups'));\n table.getRightHeaderGroups = memo(() => [table.getAllColumns(), table.getVisibleLeafColumns(), table.getState().columnPinning.right], (allColumns, leafColumns, right) => {\n var _right$map$filter2;\n const orderedLeafColumns = (_right$map$filter2 = right == null ? void 0 : right.map(columnId => leafColumns.find(d => d.id === columnId)).filter(Boolean)) != null ? _right$map$filter2 : [];\n return buildHeaderGroups(allColumns, orderedLeafColumns, table, 'right');\n }, getMemoOptions(table.options, debug, 'getRightHeaderGroups'));\n\n // Footer Groups\n\n table.getFooterGroups = memo(() => [table.getHeaderGroups()], headerGroups => {\n return [...headerGroups].reverse();\n }, getMemoOptions(table.options, debug, 'getFooterGroups'));\n table.getLeftFooterGroups = memo(() => [table.getLeftHeaderGroups()], headerGroups => {\n return [...headerGroups].reverse();\n }, getMemoOptions(table.options, debug, 'getLeftFooterGroups'));\n table.getCenterFooterGroups = memo(() => [table.getCenterHeaderGroups()], headerGroups => {\n return [...headerGroups].reverse();\n }, getMemoOptions(table.options, debug, 'getCenterFooterGroups'));\n table.getRightFooterGroups = memo(() => [table.getRightHeaderGroups()], headerGroups => {\n return [...headerGroups].reverse();\n }, getMemoOptions(table.options, debug, 'getRightFooterGroups'));\n\n // Flat Headers\n\n table.getFlatHeaders = memo(() => [table.getHeaderGroups()], headerGroups => {\n return headerGroups.map(headerGroup => {\n return headerGroup.headers;\n }).flat();\n }, getMemoOptions(table.options, debug, 'getFlatHeaders'));\n table.getLeftFlatHeaders = memo(() => [table.getLeftHeaderGroups()], left => {\n return left.map(headerGroup => {\n return headerGroup.headers;\n }).flat();\n }, getMemoOptions(table.options, debug, 'getLeftFlatHeaders'));\n table.getCenterFlatHeaders = memo(() => [table.getCenterHeaderGroups()], left => {\n return left.map(headerGroup => {\n return headerGroup.headers;\n }).flat();\n }, getMemoOptions(table.options, debug, 'getCenterFlatHeaders'));\n table.getRightFlatHeaders = memo(() => [table.getRightHeaderGroups()], left => {\n return left.map(headerGroup => {\n return headerGroup.headers;\n }).flat();\n }, getMemoOptions(table.options, debug, 'getRightFlatHeaders'));\n\n // Leaf Headers\n\n table.getCenterLeafHeaders = memo(() => [table.getCenterFlatHeaders()], flatHeaders => {\n return flatHeaders.filter(header => {\n var _header$subHeaders;\n return !((_header$subHeaders = header.subHeaders) != null && _header$subHeaders.length);\n });\n }, getMemoOptions(table.options, debug, 'getCenterLeafHeaders'));\n table.getLeftLeafHeaders = memo(() => [table.getLeftFlatHeaders()], flatHeaders => {\n return flatHeaders.filter(header => {\n var _header$subHeaders2;\n return !((_header$subHeaders2 = header.subHeaders) != null && _header$subHeaders2.length);\n });\n }, getMemoOptions(table.options, debug, 'getLeftLeafHeaders'));\n table.getRightLeafHeaders = memo(() => [table.getRightFlatHeaders()], flatHeaders => {\n return flatHeaders.filter(header => {\n var _header$subHeaders3;\n return !((_header$subHeaders3 = header.subHeaders) != null && _header$subHeaders3.length);\n });\n }, getMemoOptions(table.options, debug, 'getRightLeafHeaders'));\n table.getLeafHeaders = memo(() => [table.getLeftHeaderGroups(), table.getCenterHeaderGroups(), table.getRightHeaderGroups()], (left, center, right) => {\n var _left$0$headers, _left$, _center$0$headers, _center$, _right$0$headers, _right$;\n return [...((_left$0$headers = (_left$ = left[0]) == null ? void 0 : _left$.headers) != null ? _left$0$headers : []), ...((_center$0$headers = (_center$ = center[0]) == null ? void 0 : _center$.headers) != null ? _center$0$headers : []), ...((_right$0$headers = (_right$ = right[0]) == null ? void 0 : _right$.headers) != null ? _right$0$headers : [])].map(header => {\n return header.getLeafHeaders();\n }).flat();\n }, getMemoOptions(table.options, debug, 'getLeafHeaders'));\n }\n};\nfunction buildHeaderGroups(allColumns, columnsToGroup, table, headerFamily) {\n var _headerGroups$0$heade, _headerGroups$;\n // Find the max depth of the columns:\n // build the leaf column row\n // build each buffer row going up\n // placeholder for non-existent level\n // real column for existing level\n\n let maxDepth = 0;\n const findMaxDepth = function (columns, depth) {\n if (depth === void 0) {\n depth = 1;\n }\n maxDepth = Math.max(maxDepth, depth);\n columns.filter(column => column.getIsVisible()).forEach(column => {\n var _column$columns;\n if ((_column$columns = column.columns) != null && _column$columns.length) {\n findMaxDepth(column.columns, depth + 1);\n }\n }, 0);\n };\n findMaxDepth(allColumns);\n let headerGroups = [];\n const createHeaderGroup = (headersToGroup, depth) => {\n // The header group we are creating\n const headerGroup = {\n depth,\n id: [headerFamily, `${depth}`].filter(Boolean).join('_'),\n headers: []\n };\n\n // The parent columns we're going to scan next\n const pendingParentHeaders = [];\n\n // Scan each column for parents\n headersToGroup.forEach(headerToGroup => {\n // What is the latest (last) parent column?\n\n const latestPendingParentHeader = [...pendingParentHeaders].reverse()[0];\n const isLeafHeader = headerToGroup.column.depth === headerGroup.depth;\n let column;\n let isPlaceholder = false;\n if (isLeafHeader && headerToGroup.column.parent) {\n // The parent header is new\n column = headerToGroup.column.parent;\n } else {\n // The parent header is repeated\n column = headerToGroup.column;\n isPlaceholder = true;\n }\n if (latestPendingParentHeader && (latestPendingParentHeader == null ? void 0 : latestPendingParentHeader.column) === column) {\n // This column is repeated. Add it as a sub header to the next batch\n latestPendingParentHeader.subHeaders.push(headerToGroup);\n } else {\n // This is a new header. Let's create it\n const header = createHeader(table, column, {\n id: [headerFamily, depth, column.id, headerToGroup == null ? void 0 : headerToGroup.id].filter(Boolean).join('_'),\n isPlaceholder,\n placeholderId: isPlaceholder ? `${pendingParentHeaders.filter(d => d.column === column).length}` : undefined,\n depth,\n index: pendingParentHeaders.length\n });\n\n // Add the headerToGroup as a subHeader of the new header\n header.subHeaders.push(headerToGroup);\n // Add the new header to the pendingParentHeaders to get grouped\n // in the next batch\n pendingParentHeaders.push(header);\n }\n headerGroup.headers.push(headerToGroup);\n headerToGroup.headerGroup = headerGroup;\n });\n headerGroups.push(headerGroup);\n if (depth > 0) {\n createHeaderGroup(pendingParentHeaders, depth - 1);\n }\n };\n const bottomHeaders = columnsToGroup.map((column, index) => createHeader(table, column, {\n depth: maxDepth,\n index\n }));\n createHeaderGroup(bottomHeaders, maxDepth - 1);\n headerGroups.reverse();\n\n // headerGroups = headerGroups.filter(headerGroup => {\n // return !headerGroup.headers.every(header => header.isPlaceholder)\n // })\n\n const recurseHeadersForSpans = headers => {\n const filteredHeaders = headers.filter(header => header.column.getIsVisible());\n return filteredHeaders.map(header => {\n let colSpan = 0;\n let rowSpan = 0;\n let childRowSpans = [0];\n if (header.subHeaders && header.subHeaders.length) {\n childRowSpans = [];\n recurseHeadersForSpans(header.subHeaders).forEach(_ref => {\n let {\n colSpan: childColSpan,\n rowSpan: childRowSpan\n } = _ref;\n colSpan += childColSpan;\n childRowSpans.push(childRowSpan);\n });\n } else {\n colSpan = 1;\n }\n const minChildRowSpan = Math.min(...childRowSpans);\n rowSpan = rowSpan + minChildRowSpan;\n header.colSpan = colSpan;\n header.rowSpan = rowSpan;\n return {\n colSpan,\n rowSpan\n };\n });\n };\n recurseHeadersForSpans((_headerGroups$0$heade = (_headerGroups$ = headerGroups[0]) == null ? void 0 : _headerGroups$.headers) != null ? _headerGroups$0$heade : []);\n return headerGroups;\n}\n\nconst createRow = (table, id, original, rowIndex, depth, subRows, parentId) => {\n let row = {\n id,\n index: rowIndex,\n original,\n depth,\n parentId,\n _valuesCache: {},\n _uniqueValuesCache: {},\n getValue: columnId => {\n if (row._valuesCache.hasOwnProperty(columnId)) {\n return row._valuesCache[columnId];\n }\n const column = table.getColumn(columnId);\n if (!(column != null && column.accessorFn)) {\n return undefined;\n }\n row._valuesCache[columnId] = column.accessorFn(row.original, rowIndex);\n return row._valuesCache[columnId];\n },\n getUniqueValues: columnId => {\n if (row._uniqueValuesCache.hasOwnProperty(columnId)) {\n return row._uniqueValuesCache[columnId];\n }\n const column = table.getColumn(columnId);\n if (!(column != null && column.accessorFn)) {\n return undefined;\n }\n if (!column.columnDef.getUniqueValues) {\n row._uniqueValuesCache[columnId] = [row.getValue(columnId)];\n return row._uniqueValuesCache[columnId];\n }\n row._uniqueValuesCache[columnId] = column.columnDef.getUniqueValues(row.original, rowIndex);\n return row._uniqueValuesCache[columnId];\n },\n renderValue: columnId => {\n var _row$getValue;\n return (_row$getValue = row.getValue(columnId)) != null ? _row$getValue : table.options.renderFallbackValue;\n },\n subRows: subRows != null ? subRows : [],\n getLeafRows: () => flattenBy(row.subRows, d => d.subRows),\n getParentRow: () => row.parentId ? table.getRow(row.parentId, true) : undefined,\n getParentRows: () => {\n let parentRows = [];\n let currentRow = row;\n while (true) {\n const parentRow = currentRow.getParentRow();\n if (!parentRow) break;\n parentRows.push(parentRow);\n currentRow = parentRow;\n }\n return parentRows.reverse();\n },\n getAllCells: memo(() => [table.getAllLeafColumns()], leafColumns => {\n return leafColumns.map(column => {\n return createCell(table, row, column, column.id);\n });\n }, getMemoOptions(table.options, 'debugRows', 'getAllCells')),\n _getAllCellsByColumnId: memo(() => [row.getAllCells()], allCells => {\n return allCells.reduce((acc, cell) => {\n acc[cell.column.id] = cell;\n return acc;\n }, {});\n }, getMemoOptions(table.options, 'debugRows', 'getAllCellsByColumnId'))\n };\n for (let i = 0; i < table._features.length; i++) {\n const feature = table._features[i];\n feature == null || feature.createRow == null || feature.createRow(row, table);\n }\n return row;\n};\n\n//\n\nconst ColumnFaceting = {\n createColumn: (column, table) => {\n column._getFacetedRowModel = table.options.getFacetedRowModel && table.options.getFacetedRowModel(table, column.id);\n column.getFacetedRowModel = () => {\n if (!column._getFacetedRowModel) {\n return table.getPreFilteredRowModel();\n }\n return column._getFacetedRowModel();\n };\n column._getFacetedUniqueValues = table.options.getFacetedUniqueValues && table.options.getFacetedUniqueValues(table, column.id);\n column.getFacetedUniqueValues = () => {\n if (!column._getFacetedUniqueValues) {\n return new Map();\n }\n return column._getFacetedUniqueValues();\n };\n column._getFacetedMinMaxValues = table.options.getFacetedMinMaxValues && table.options.getFacetedMinMaxValues(table, column.id);\n column.getFacetedMinMaxValues = () => {\n if (!column._getFacetedMinMaxValues) {\n return undefined;\n }\n return column._getFacetedMinMaxValues();\n };\n }\n};\n\nconst includesString = (row, columnId, filterValue) => {\n var _filterValue$toString, _row$getValue;\n const search = filterValue == null || (_filterValue$toString = filterValue.toString()) == null ? void 0 : _filterValue$toString.toLowerCase();\n return Boolean((_row$getValue = row.getValue(columnId)) == null || (_row$getValue = _row$getValue.toString()) == null || (_row$getValue = _row$getValue.toLowerCase()) == null ? void 0 : _row$getValue.includes(search));\n};\nincludesString.autoRemove = val => testFalsey(val);\nconst includesStringSensitive = (row, columnId, filterValue) => {\n var _row$getValue2;\n return Boolean((_row$getValue2 = row.getValue(columnId)) == null || (_row$getValue2 = _row$getValue2.toString()) == null ? void 0 : _row$getValue2.includes(filterValue));\n};\nincludesStringSensitive.autoRemove = val => testFalsey(val);\nconst equalsString = (row, columnId, filterValue) => {\n var _row$getValue3;\n return ((_row$getValue3 = row.getValue(columnId)) == null || (_row$getValue3 = _row$getValue3.toString()) == null ? void 0 : _row$getValue3.toLowerCase()) === (filterValue == null ? void 0 : filterValue.toLowerCase());\n};\nequalsString.autoRemove = val => testFalsey(val);\nconst arrIncludes = (row, columnId, filterValue) => {\n var _row$getValue4;\n return (_row$getValue4 = row.getValue(columnId)) == null ? void 0 : _row$getValue4.includes(filterValue);\n};\narrIncludes.autoRemove = val => testFalsey(val);\nconst arrIncludesAll = (row, columnId, filterValue) => {\n return !filterValue.some(val => {\n var _row$getValue5;\n return !((_row$getValue5 = row.getValue(columnId)) != null && _row$getValue5.includes(val));\n });\n};\narrIncludesAll.autoRemove = val => testFalsey(val) || !(val != null && val.length);\nconst arrIncludesSome = (row, columnId, filterValue) => {\n return filterValue.some(val => {\n var _row$getValue6;\n return (_row$getValue6 = row.getValue(columnId)) == null ? void 0 : _row$getValue6.includes(val);\n });\n};\narrIncludesSome.autoRemove = val => testFalsey(val) || !(val != null && val.length);\nconst equals = (row, columnId, filterValue) => {\n return row.getValue(columnId) === filterValue;\n};\nequals.autoRemove = val => testFalsey(val);\nconst weakEquals = (row, columnId, filterValue) => {\n return row.getValue(columnId) == filterValue;\n};\nweakEquals.autoRemove = val => testFalsey(val);\nconst inNumberRange = (row, columnId, filterValue) => {\n let [min, max] = filterValue;\n const rowValue = row.getValue(columnId);\n return rowValue >= min && rowValue <= max;\n};\ninNumberRange.resolveFilterValue = val => {\n let [unsafeMin, unsafeMax] = val;\n let parsedMin = typeof unsafeMin !== 'number' ? parseFloat(unsafeMin) : unsafeMin;\n let parsedMax = typeof unsafeMax !== 'number' ? parseFloat(unsafeMax) : unsafeMax;\n let min = unsafeMin === null || Number.isNaN(parsedMin) ? -Infinity : parsedMin;\n let max = unsafeMax === null || Number.isNaN(parsedMax) ? Infinity : parsedMax;\n if (min > max) {\n const temp = min;\n min = max;\n max = temp;\n }\n return [min, max];\n};\ninNumberRange.autoRemove = val => testFalsey(val) || testFalsey(val[0]) && testFalsey(val[1]);\n\n// Export\n\nconst filterFns = {\n includesString,\n includesStringSensitive,\n equalsString,\n arrIncludes,\n arrIncludesAll,\n arrIncludesSome,\n equals,\n weakEquals,\n inNumberRange\n};\n// Utils\n\nfunction testFalsey(val) {\n return val === undefined || val === null || val === '';\n}\n\n//\n\nconst ColumnFiltering = {\n getDefaultColumnDef: () => {\n return {\n filterFn: 'auto'\n };\n },\n getInitialState: state => {\n return {\n columnFilters: [],\n ...state\n };\n },\n getDefaultOptions: table => {\n return {\n onColumnFiltersChange: makeStateUpdater('columnFilters', table),\n filterFromLeafRows: false,\n maxLeafRowFilterDepth: 100\n };\n },\n createColumn: (column, table) => {\n column.getAutoFilterFn = () => {\n const firstRow = table.getCoreRowModel().flatRows[0];\n const value = firstRow == null ? void 0 : firstRow.getValue(column.id);\n if (typeof value === 'string') {\n return filterFns.includesString;\n }\n if (typeof value === 'number') {\n return filterFns.inNumberRange;\n }\n if (typeof value === 'boolean') {\n return filterFns.equals;\n }\n if (value !== null && typeof value === 'object') {\n return filterFns.equals;\n }\n if (Array.isArray(value)) {\n return filterFns.arrIncludes;\n }\n return filterFns.weakEquals;\n };\n column.getFilterFn = () => {\n var _table$options$filter, _table$options$filter2;\n return isFunction(column.columnDef.filterFn) ? column.columnDef.filterFn : column.columnDef.filterFn === 'auto' ? column.getAutoFilterFn() : // @ts-ignore\n (_table$options$filter = (_table$options$filter2 = table.options.filterFns) == null ? void 0 : _table$options$filter2[column.columnDef.filterFn]) != null ? _table$options$filter : filterFns[column.columnDef.filterFn];\n };\n column.getCanFilter = () => {\n var _column$columnDef$ena, _table$options$enable, _table$options$enable2;\n return ((_column$columnDef$ena = column.columnDef.enableColumnFilter) != null ? _column$columnDef$ena : true) && ((_table$options$enable = table.options.enableColumnFilters) != null ? _table$options$enable : true) && ((_table$options$enable2 = table.options.enableFilters) != null ? _table$options$enable2 : true) && !!column.accessorFn;\n };\n column.getIsFiltered = () => column.getFilterIndex() > -1;\n column.getFilterValue = () => {\n var _table$getState$colum;\n return (_table$getState$colum = table.getState().columnFilters) == null || (_table$getState$colum = _table$getState$colum.find(d => d.id === column.id)) == null ? void 0 : _table$getState$colum.value;\n };\n column.getFilterIndex = () => {\n var _table$getState$colum2, _table$getState$colum3;\n return (_table$getState$colum2 = (_table$getState$colum3 = table.getState().columnFilters) == null ? void 0 : _table$getState$colum3.findIndex(d => d.id === column.id)) != null ? _table$getState$colum2 : -1;\n };\n column.setFilterValue = value => {\n table.setColumnFilters(old => {\n const filterFn = column.getFilterFn();\n const previousFilter = old == null ? void 0 : old.find(d => d.id === column.id);\n const newFilter = functionalUpdate(value, previousFilter ? previousFilter.value : undefined);\n\n //\n if (shouldAutoRemoveFilter(filterFn, newFilter, column)) {\n var _old$filter;\n return (_old$filter = old == null ? void 0 : old.filter(d => d.id !== column.id)) != null ? _old$filter : [];\n }\n const newFilterObj = {\n id: column.id,\n value: newFilter\n };\n if (previousFilter) {\n var _old$map;\n return (_old$map = old == null ? void 0 : old.map(d => {\n if (d.id === column.id) {\n return newFilterObj;\n }\n return d;\n })) != null ? _old$map : [];\n }\n if (old != null && old.length) {\n return [...old, newFilterObj];\n }\n return [newFilterObj];\n });\n };\n },\n createRow: (row, _table) => {\n row.columnFilters = {};\n row.columnFiltersMeta = {};\n },\n createTable: table => {\n table.setColumnFilters = updater => {\n const leafColumns = table.getAllLeafColumns();\n const updateFn = old => {\n var _functionalUpdate;\n return (_functionalUpdate = functionalUpdate(updater, old)) == null ? void 0 : _functionalUpdate.filter(filter => {\n const column = leafColumns.find(d => d.id === filter.id);\n if (column) {\n const filterFn = column.getFilterFn();\n if (shouldAutoRemoveFilter(filterFn, filter.value, column)) {\n return false;\n }\n }\n return true;\n });\n };\n table.options.onColumnFiltersChange == null || table.options.onColumnFiltersChange(updateFn);\n };\n table.resetColumnFilters = defaultState => {\n var _table$initialState$c, _table$initialState;\n table.setColumnFilters(defaultState ? [] : (_table$initialState$c = (_table$initialState = table.initialState) == null ? void 0 : _table$initialState.columnFilters) != null ? _table$initialState$c : []);\n };\n table.getPreFilteredRowModel = () => table.getCoreRowModel();\n table.getFilteredRowModel = () => {\n if (!table._getFilteredRowModel && table.options.getFilteredRowModel) {\n table._getFilteredRowModel = table.options.getFilteredRowModel(table);\n }\n if (table.options.manualFiltering || !table._getFilteredRowModel) {\n return table.getPreFilteredRowModel();\n }\n return table._getFilteredRowModel();\n };\n }\n};\nfunction shouldAutoRemoveFilter(filterFn, value, column) {\n return (filterFn && filterFn.autoRemove ? filterFn.autoRemove(value, column) : false) || typeof value === 'undefined' || typeof value === 'string' && !value;\n}\n\nconst sum = (columnId, _leafRows, childRows) => {\n // It's faster to just add the aggregations together instead of\n // process leaf nodes individually\n return childRows.reduce((sum, next) => {\n const nextValue = next.getValue(columnId);\n return sum + (typeof nextValue === 'number' ? nextValue : 0);\n }, 0);\n};\nconst min = (columnId, _leafRows, childRows) => {\n let min;\n childRows.forEach(row => {\n const value = row.getValue(columnId);\n if (value != null && (min > value || min === undefined && value >= value)) {\n min = value;\n }\n });\n return min;\n};\nconst max = (columnId, _leafRows, childRows) => {\n let max;\n childRows.forEach(row => {\n const value = row.getValue(columnId);\n if (value != null && (max < value || max === undefined && value >= value)) {\n max = value;\n }\n });\n return max;\n};\nconst extent = (columnId, _leafRows, childRows) => {\n let min;\n let max;\n childRows.forEach(row => {\n const value = row.getValue(columnId);\n if (value != null) {\n if (min === undefined) {\n if (value >= value) min = max = value;\n } else {\n if (min > value) min = value;\n if (max < value) max = value;\n }\n }\n });\n return [min, max];\n};\nconst mean = (columnId, leafRows) => {\n let count = 0;\n let sum = 0;\n leafRows.forEach(row => {\n let value = row.getValue(columnId);\n if (value != null && (value = +value) >= value) {\n ++count, sum += value;\n }\n });\n if (count) return sum / count;\n return;\n};\nconst median = (columnId, leafRows) => {\n if (!leafRows.length) {\n return;\n }\n const values = leafRows.map(row => row.getValue(columnId));\n if (!isNumberArray(values)) {\n return;\n }\n if (values.length === 1) {\n return values[0];\n }\n const mid = Math.floor(values.length / 2);\n const nums = values.sort((a, b) => a - b);\n return values.length % 2 !== 0 ? nums[mid] : (nums[mid - 1] + nums[mid]) / 2;\n};\nconst unique = (columnId, leafRows) => {\n return Array.from(new Set(leafRows.map(d => d.getValue(columnId))).values());\n};\nconst uniqueCount = (columnId, leafRows) => {\n return new Set(leafRows.map(d => d.getValue(columnId))).size;\n};\nconst count = (_columnId, leafRows) => {\n return leafRows.length;\n};\nconst aggregationFns = {\n sum,\n min,\n max,\n extent,\n mean,\n median,\n unique,\n uniqueCount,\n count\n};\n\n//\n\nconst ColumnGrouping = {\n getDefaultColumnDef: () => {\n return {\n aggregatedCell: props => {\n var _toString, _props$getValue;\n return (_toString = (_props$getValue = props.getValue()) == null || _props$getValue.toString == null ? void 0 : _props$getValue.toString()) != null ? _toString : null;\n },\n aggregationFn: 'auto'\n };\n },\n getInitialState: state => {\n return {\n grouping: [],\n ...state\n };\n },\n getDefaultOptions: table => {\n return {\n onGroupingChange: makeStateUpdater('grouping', table),\n groupedColumnMode: 'reorder'\n };\n },\n createColumn: (column, table) => {\n column.toggleGrouping = () => {\n table.setGrouping(old => {\n // Find any existing grouping for this column\n if (old != null && old.includes(column.id)) {\n return old.filter(d => d !== column.id);\n }\n return [...(old != null ? old : []), column.id];\n });\n };\n column.getCanGroup = () => {\n var _column$columnDef$ena, _table$options$enable;\n return ((_column$columnDef$ena = column.columnDef.enableGrouping) != null ? _column$columnDef$ena : true) && ((_table$options$enable = table.options.enableGrouping) != null ? _table$options$enable : true) && (!!column.accessorFn || !!column.columnDef.getGroupingValue);\n };\n column.getIsGrouped = () => {\n var _table$getState$group;\n return (_table$getState$group = table.getState().grouping) == null ? void 0 : _table$getState$group.includes(column.id);\n };\n column.getGroupedIndex = () => {\n var _table$getState$group2;\n return (_table$getState$group2 = table.getState().grouping) == null ? void 0 : _table$getState$group2.indexOf(column.id);\n };\n column.getToggleGroupingHandler = () => {\n const canGroup = column.getCanGroup();\n return () => {\n if (!canGroup) return;\n column.toggleGrouping();\n };\n };\n column.getAutoAggregationFn = () => {\n const firstRow = table.getCoreRowModel().flatRows[0];\n const value = firstRow == null ? void 0 : firstRow.getValue(column.id);\n if (typeof value === 'number') {\n return aggregationFns.sum;\n }\n if (Object.prototype.toString.call(value) === '[object Date]') {\n return aggregationFns.extent;\n }\n };\n column.getAggregationFn = () => {\n var _table$options$aggreg, _table$options$aggreg2;\n if (!column) {\n throw new Error();\n }\n return isFunction(column.columnDef.aggregationFn) ? column.columnDef.aggregationFn : column.columnDef.aggregationFn === 'auto' ? column.getAutoAggregationFn() : (_table$options$aggreg = (_table$options$aggreg2 = table.options.aggregationFns) == null ? void 0 : _table$options$aggreg2[column.columnDef.aggregationFn]) != null ? _table$options$aggreg : aggregationFns[column.columnDef.aggregationFn];\n };\n },\n createTable: table => {\n table.setGrouping = updater => table.options.onGroupingChange == null ? void 0 : table.options.onGroupingChange(updater);\n table.resetGrouping = defaultState => {\n var _table$initialState$g, _table$initialState;\n table.setGrouping(defaultState ? [] : (_table$initialState$g = (_table$initialState = table.initialState) == null ? void 0 : _table$initialState.grouping) != null ? _table$initialState$g : []);\n };\n table.getPreGroupedRowModel = () => table.getFilteredRowModel();\n table.getGroupedRowModel = () => {\n if (!table._getGroupedRowModel && table.options.getGroupedRowModel) {\n table._getGroupedRowModel = table.options.getGroupedRowModel(table);\n }\n if (table.options.manualGrouping || !table._getGroupedRowModel) {\n return table.getPreGroupedRowModel();\n }\n return table._getGroupedRowModel();\n };\n },\n createRow: (row, table) => {\n row.getIsGrouped = () => !!row.groupingColumnId;\n row.getGroupingValue = columnId => {\n if (row._groupingValuesCache.hasOwnProperty(columnId)) {\n return row._groupingValuesCache[columnId];\n }\n const column = table.getColumn(columnId);\n if (!(column != null && column.columnDef.getGroupingValue)) {\n return row.getValue(columnId);\n }\n row._groupingValuesCache[columnId] = column.columnDef.getGroupingValue(row.original);\n return row._groupingValuesCache[columnId];\n };\n row._groupingValuesCache = {};\n },\n createCell: (cell, column, row, table) => {\n cell.getIsGrouped = () => column.getIsGrouped() && column.id === row.groupingColumnId;\n cell.getIsPlaceholder = () => !cell.getIsGrouped() && column.getIsGrouped();\n cell.getIsAggregated = () => {\n var _row$subRows;\n return !cell.getIsGrouped() && !cell.getIsPlaceholder() && !!((_row$subRows = row.subRows) != null && _row$subRows.length);\n };\n }\n};\nfunction orderColumns(leafColumns, grouping, groupedColumnMode) {\n if (!(grouping != null && grouping.length) || !groupedColumnMode) {\n return leafColumns;\n }\n const nonGroupingColumns = leafColumns.filter(col => !grouping.includes(col.id));\n if (groupedColumnMode === 'remove') {\n return nonGroupingColumns;\n }\n const groupingColumns = grouping.map(g => leafColumns.find(col => col.id === g)).filter(Boolean);\n return [...groupingColumns, ...nonGroupingColumns];\n}\n\n//\n\nconst ColumnOrdering = {\n getInitialState: state => {\n return {\n columnOrder: [],\n ...state\n };\n },\n getDefaultOptions: table => {\n return {\n onColumnOrderChange: makeStateUpdater('columnOrder', table)\n };\n },\n createColumn: (column, table) => {\n column.getIndex = memo(position => [_getVisibleLeafColumns(table, position)], columns => columns.findIndex(d => d.id === column.id), getMemoOptions(table.options, 'debugColumns', 'getIndex'));\n column.getIsFirstColumn = position => {\n var _columns$;\n const columns = _getVisibleLeafColumns(table, position);\n return ((_columns$ = columns[0]) == null ? void 0 : _columns$.id) === column.id;\n };\n column.getIsLastColumn = position => {\n var _columns;\n const columns = _getVisibleLeafColumns(table, position);\n return ((_columns = columns[columns.length - 1]) == null ? void 0 : _columns.id) === column.id;\n };\n },\n createTable: table => {\n table.setColumnOrder = updater => table.options.onColumnOrderChange == null ? void 0 : table.options.onColumnOrderChange(updater);\n table.resetColumnOrder = defaultState => {\n var _table$initialState$c;\n table.setColumnOrder(defaultState ? [] : (_table$initialState$c = table.initialState.columnOrder) != null ? _table$initialState$c : []);\n };\n table._getOrderColumnsFn = memo(() => [table.getState().columnOrder, table.getState().grouping, table.options.groupedColumnMode], (columnOrder, grouping, groupedColumnMode) => columns => {\n // Sort grouped columns to the start of the column list\n // before the headers are built\n let orderedColumns = [];\n\n // If there is no order, return the normal columns\n if (!(columnOrder != null && columnOrder.length)) {\n orderedColumns = columns;\n } else {\n const columnOrderCopy = [...columnOrder];\n\n // If there is an order, make a copy of the columns\n const columnsCopy = [...columns];\n\n // And make a new ordered array of the columns\n\n // Loop over the columns and place them in order into the new array\n while (columnsCopy.length && columnOrderCopy.length) {\n const targetColumnId = columnOrderCopy.shift();\n const foundIndex = columnsCopy.findIndex(d => d.id === targetColumnId);\n if (foundIndex > -1) {\n orderedColumns.push(columnsCopy.splice(foundIndex, 1)[0]);\n }\n }\n\n // If there are any columns left, add them to the end\n orderedColumns = [...orderedColumns, ...columnsCopy];\n }\n return orderColumns(orderedColumns, grouping, groupedColumnMode);\n }, getMemoOptions(table.options, 'debugTable', '_getOrderColumnsFn'));\n }\n};\n\n//\n\nconst getDefaultColumnPinningState = () => ({\n left: [],\n right: []\n});\nconst ColumnPinning = {\n getInitialState: state => {\n return {\n columnPinning: getDefaultColumnPinningState(),\n ...state\n };\n },\n getDefaultOptions: table => {\n return {\n onColumnPinningChange: makeStateUpdater('columnPinning', table)\n };\n },\n createColumn: (column, table) => {\n column.pin = position => {\n const columnIds = column.getLeafColumns().map(d => d.id).filter(Boolean);\n table.setColumnPinning(old => {\n var _old$left3, _old$right3;\n if (position === 'right') {\n var _old$left, _old$right;\n return {\n left: ((_old$left = old == null ? void 0 : old.left) != null ? _old$left : []).filter(d => !(columnIds != null && columnIds.includes(d))),\n right: [...((_old$right = old == null ? void 0 : old.right) != null ? _old$right : []).filter(d => !(columnIds != null && columnIds.includes(d))), ...columnIds]\n };\n }\n if (position === 'left') {\n var _old$left2, _old$right2;\n return {\n left: [...((_old$left2 = old == null ? void 0 : old.left) != null ? _old$left2 : []).filter(d => !(columnIds != null && columnIds.includes(d))), ...columnIds],\n right: ((_old$right2 = old == null ? void 0 : old.right) != null ? _old$right2 : []).filter(d => !(columnIds != null && columnIds.includes(d)))\n };\n }\n return {\n left: ((_old$left3 = old == null ? void 0 : old.left) != null ? _old$left3 : []).filter(d => !(columnIds != null && columnIds.includes(d))),\n right: ((_old$right3 = old == null ? void 0 : old.right) != null ? _old$right3 : []).filter(d => !(columnIds != null && columnIds.includes(d)))\n };\n });\n };\n column.getCanPin = () => {\n const leafColumns = column.getLeafColumns();\n return leafColumns.some(d => {\n var _d$columnDef$enablePi, _ref, _table$options$enable;\n return ((_d$columnDef$enablePi = d.columnDef.enablePinning) != null ? _d$columnDef$enablePi : true) && ((_ref = (_table$options$enable = table.options.enableColumnPinning) != null ? _table$options$enable : table.options.enablePinning) != null ? _ref : true);\n });\n };\n column.getIsPinned = () => {\n const leafColumnIds = column.getLeafColumns().map(d => d.id);\n const {\n left,\n right\n } = table.getState().columnPinning;\n const isLeft = leafColumnIds.some(d => left == null ? void 0 : left.includes(d));\n const isRight = leafColumnIds.some(d => right == null ? void 0 : right.includes(d));\n return isLeft ? 'left' : isRight ? 'right' : false;\n };\n column.getPinnedIndex = () => {\n var _table$getState$colum, _table$getState$colum2;\n const position = column.getIsPinned();\n return position ? (_table$getState$colum = (_table$getState$colum2 = table.getState().columnPinning) == null || (_table$getState$colum2 = _table$getState$colum2[position]) == null ? void 0 : _table$getState$colum2.indexOf(column.id)) != null ? _table$getState$colum : -1 : 0;\n };\n },\n createRow: (row, table) => {\n row.getCenterVisibleCells = memo(() => [row._getAllVisibleCells(), table.getState().columnPinning.left, table.getState().columnPinning.right], (allCells, left, right) => {\n const leftAndRight = [...(left != null ? left : []), ...(right != null ? right : [])];\n return allCells.filter(d => !leftAndRight.includes(d.column.id));\n }, getMemoOptions(table.options, 'debugRows', 'getCenterVisibleCells'));\n row.getLeftVisibleCells = memo(() => [row._getAllVisibleCells(), table.getState().columnPinning.left], (allCells, left) => {\n const cells = (left != null ? left : []).map(columnId => allCells.find(cell => cell.column.id === columnId)).filter(Boolean).map(d => ({\n ...d,\n position: 'left'\n }));\n return cells;\n }, getMemoOptions(table.options, 'debugRows', 'getLeftVisibleCells'));\n row.getRightVisibleCells = memo(() => [row._getAllVisibleCells(), table.getState().columnPinning.right], (allCells, right) => {\n const cells = (right != null ? right : []).map(columnId => allCells.find(cell => cell.column.id === columnId)).filter(Boolean).map(d => ({\n ...d,\n position: 'right'\n }));\n return cells;\n }, getMemoOptions(table.options, 'debugRows', 'getRightVisibleCells'));\n },\n createTable: table => {\n table.setColumnPinning = updater => table.options.onColumnPinningChange == null ? void 0 : table.options.onColumnPinningChange(updater);\n table.resetColumnPinning = defaultState => {\n var _table$initialState$c, _table$initialState;\n return table.setColumnPinning(defaultState ? getDefaultColumnPinningState() : (_table$initialState$c = (_table$initialState = table.initialState) == null ? void 0 : _table$initialState.columnPinning) != null ? _table$initialState$c : getDefaultColumnPinningState());\n };\n table.getIsSomeColumnsPinned = position => {\n var _pinningState$positio;\n const pinningState = table.getState().columnPinning;\n if (!position) {\n var _pinningState$left, _pinningState$right;\n return Boolean(((_pinningState$left = pinningState.left) == null ? void 0 : _pinningState$left.length) || ((_pinningState$right = pinningState.right) == null ? void 0 : _pinningState$right.length));\n }\n return Boolean((_pinningState$positio = pinningState[position]) == null ? void 0 : _pinningState$positio.length);\n };\n table.getLeftLeafColumns = memo(() => [table.getAllLeafColumns(), table.getState().columnPinning.left], (allColumns, left) => {\n return (left != null ? left : []).map(columnId => allColumns.find(column => column.id === columnId)).filter(Boolean);\n }, getMemoOptions(table.options, 'debugColumns', 'getLeftLeafColumns'));\n table.getRightLeafColumns = memo(() => [table.getAllLeafColumns(), table.getState().columnPinning.right], (allColumns, right) => {\n return (right != null ? right : []).map(columnId => allColumns.find(column => column.id === columnId)).filter(Boolean);\n }, getMemoOptions(table.options, 'debugColumns', 'getRightLeafColumns'));\n table.getCenterLeafColumns = memo(() => [table.getAllLeafColumns(), table.getState().columnPinning.left, table.getState().columnPinning.right], (allColumns, left, right) => {\n const leftAndRight = [...(left != null ? left : []), ...(right != null ? right : [])];\n return allColumns.filter(d => !leftAndRight.includes(d.id));\n }, getMemoOptions(table.options, 'debugColumns', 'getCenterLeafColumns'));\n }\n};\n\nfunction safelyAccessDocument(_document) {\n return _document || (typeof document !== 'undefined' ? document : null);\n}\n\n//\n\n//\n\nconst defaultColumnSizing = {\n size: 150,\n minSize: 20,\n maxSize: Number.MAX_SAFE_INTEGER\n};\nconst getDefaultColumnSizingInfoState = () => ({\n startOffset: null,\n startSize: null,\n deltaOffset: null,\n deltaPercentage: null,\n isResizingColumn: false,\n columnSizingStart: []\n});\nconst ColumnSizing = {\n getDefaultColumnDef: () => {\n return defaultColumnSizing;\n },\n getInitialState: state => {\n return {\n columnSizing: {},\n columnSizingInfo: getDefaultColumnSizingInfoState(),\n ...state\n };\n },\n getDefaultOptions: table => {\n return {\n columnResizeMode: 'onEnd',\n columnResizeDirection: 'ltr',\n onColumnSizingChange: makeStateUpdater('columnSizing', table),\n onColumnSizingInfoChange: makeStateUpdater('columnSizingInfo', table)\n };\n },\n createColumn: (column, table) => {\n column.getSize = () => {\n var _column$columnDef$min, _ref, _column$columnDef$max;\n const columnSize = table.getState().columnSizing[column.id];\n return Math.min(Math.max((_column$columnDef$min = column.columnDef.minSize) != null ? _column$columnDef$min : defaultColumnSizing.minSize, (_ref = columnSize != null ? columnSize : column.columnDef.size) != null ? _ref : defaultColumnSizing.size), (_column$columnDef$max = column.columnDef.maxSize) != null ? _column$columnDef$max : defaultColumnSizing.maxSize);\n };\n column.getStart = memo(position => [position, _getVisibleLeafColumns(table, position), table.getState().columnSizing], (position, columns) => columns.slice(0, column.getIndex(position)).reduce((sum, column) => sum + column.getSize(), 0), getMemoOptions(table.options, 'debugColumns', 'getStart'));\n column.getAfter = memo(position => [position, _getVisibleLeafColumns(table, position), table.getState().columnSizing], (position, columns) => columns.slice(column.getIndex(position) + 1).reduce((sum, column) => sum + column.getSize(), 0), getMemoOptions(table.options, 'debugColumns', 'getAfter'));\n column.resetSize = () => {\n table.setColumnSizing(_ref2 => {\n let {\n [column.id]: _,\n ...rest\n } = _ref2;\n return rest;\n });\n };\n column.getCanResize = () => {\n var _column$columnDef$ena, _table$options$enable;\n return ((_column$columnDef$ena = column.columnDef.enableResizing) != null ? _column$columnDef$ena : true) && ((_table$options$enable = table.options.enableColumnResizing) != null ? _table$options$enable : true);\n };\n column.getIsResizing = () => {\n return table.getState().columnSizingInfo.isResizingColumn === column.id;\n };\n },\n createHeader: (header, table) => {\n header.getSize = () => {\n let sum = 0;\n const recurse = header => {\n if (header.subHeaders.length) {\n header.subHeaders.forEach(recurse);\n } else {\n var _header$column$getSiz;\n sum += (_header$column$getSiz = header.column.getSize()) != null ? _header$column$getSiz : 0;\n }\n };\n recurse(header);\n return sum;\n };\n header.getStart = () => {\n if (header.index > 0) {\n const prevSiblingHeader = header.headerGroup.headers[header.index - 1];\n return prevSiblingHeader.getStart() + prevSiblingHeader.getSize();\n }\n return 0;\n };\n header.getResizeHandler = _contextDocument => {\n const column = table.getColumn(header.column.id);\n const canResize = column == null ? void 0 : column.getCanResize();\n return e => {\n if (!column || !canResize) {\n return;\n }\n e.persist == null || e.persist();\n if (isTouchStartEvent(e)) {\n // lets not respond to multiple touches (e.g. 2 or 3 fingers)\n if (e.touches && e.touches.length > 1) {\n return;\n }\n }\n const startSize = header.getSize();\n const columnSizingStart = header ? header.getLeafHeaders().map(d => [d.column.id, d.column.getSize()]) : [[column.id, column.getSize()]];\n const clientX = isTouchStartEvent(e) ? Math.round(e.touches[0].clientX) : e.clientX;\n const newColumnSizing = {};\n const updateOffset = (eventType, clientXPos) => {\n if (typeof clientXPos !== 'number') {\n return;\n }\n table.setColumnSizingInfo(old => {\n var _old$startOffset, _old$startSize;\n const deltaDirection = table.options.columnResizeDirection === 'rtl' ? -1 : 1;\n const deltaOffset = (clientXPos - ((_old$startOffset = old == null ? void 0 : old.startOffset) != null ? _old$startOffset : 0)) * deltaDirection;\n const deltaPercentage = Math.max(deltaOffset / ((_old$startSize = old == null ? void 0 : old.startSize) != null ? _old$startSize : 0), -0.999999);\n old.columnSizingStart.forEach(_ref3 => {\n let [columnId, headerSize] = _ref3;\n newColumnSizing[columnId] = Math.round(Math.max(headerSize + headerSize * deltaPercentage, 0) * 100) / 100;\n });\n return {\n ...old,\n deltaOffset,\n deltaPercentage\n };\n });\n if (table.options.columnResizeMode === 'onChange' || eventType === 'end') {\n table.setColumnSizing(old => ({\n ...old,\n ...newColumnSizing\n }));\n }\n };\n const onMove = clientXPos => updateOffset('move', clientXPos);\n const onEnd = clientXPos => {\n updateOffset('end', clientXPos);\n table.setColumnSizingInfo(old => ({\n ...old,\n isResizingColumn: false,\n startOffset: null,\n startSize: null,\n deltaOffset: null,\n deltaPercentage: null,\n columnSizingStart: []\n }));\n };\n const contextDocument = safelyAccessDocument(_contextDocument);\n const mouseEvents = {\n moveHandler: e => onMove(e.clientX),\n upHandler: e => {\n contextDocument == null || contextDocument.removeEventListener('mousemove', mouseEvents.moveHandler);\n contextDocument == null || contextDocument.removeEventListener('mouseup', mouseEvents.upHandler);\n onEnd(e.clientX);\n }\n };\n const touchEvents = {\n moveHandler: e => {\n if (e.cancelable) {\n e.preventDefault();\n e.stopPropagation();\n }\n onMove(e.touches[0].clientX);\n return false;\n },\n upHandler: e => {\n var _e$touches$;\n contextDocument == null || contextDocument.removeEventListener('touchmove', touchEvents.moveHandler);\n contextDocument == null || contextDocument.removeEventListener('touchend', touchEvents.upHandler);\n if (e.cancelable) {\n e.preventDefault();\n e.stopPropagation();\n }\n onEnd((_e$touches$ = e.touches[0]) == null ? void 0 : _e$touches$.clientX);\n }\n };\n const passiveIfSupported = passiveEventSupported() ? {\n passive: false\n } : false;\n if (isTouchStartEvent(e)) {\n contextDocument == null || contextDocument.addEventListener('touchmove', touchEvents.moveHandler, passiveIfSupported);\n contextDocument == null || contextDocument.addEventListener('touchend', touchEvents.upHandler, passiveIfSupported);\n } else {\n contextDocument == null || contextDocument.addEventListener('mousemove', mouseEvents.moveHandler, passiveIfSupported);\n contextDocument == null || contextDocument.addEventListener('mouseup', mouseEvents.upHandler, passiveIfSupported);\n }\n table.setColumnSizingInfo(old => ({\n ...old,\n startOffset: clientX,\n startSize,\n deltaOffset: 0,\n deltaPercentage: 0,\n columnSizingStart,\n isResizingColumn: column.id\n }));\n };\n };\n },\n createTable: table => {\n table.setColumnSizing = updater => table.options.onColumnSizingChange == null ? void 0 : table.options.onColumnSizingChange(updater);\n table.setColumnSizingInfo = updater => table.options.onColumnSizingInfoChange == null ? void 0 : table.options.onColumnSizingInfoChange(updater);\n table.resetColumnSizing = defaultState => {\n var _table$initialState$c;\n table.setColumnSizing(defaultState ? {} : (_table$initialState$c = table.initialState.columnSizing) != null ? _table$initialState$c : {});\n };\n table.resetHeaderSizeInfo = defaultState => {\n var _table$initialState$c2;\n table.setColumnSizingInfo(defaultState ? getDefaultColumnSizingInfoState() : (_table$initialState$c2 = table.initialState.columnSizingInfo) != null ? _table$initialState$c2 : getDefaultColumnSizingInfoState());\n };\n table.getTotalSize = () => {\n var _table$getHeaderGroup, _table$getHeaderGroup2;\n return (_table$getHeaderGroup = (_table$getHeaderGroup2 = table.getHeaderGroups()[0]) == null ? void 0 : _table$getHeaderGroup2.headers.reduce((sum, header) => {\n return sum + header.getSize();\n }, 0)) != null ? _table$getHeaderGroup : 0;\n };\n table.getLeftTotalSize = () => {\n var _table$getLeftHeaderG, _table$getLeftHeaderG2;\n return (_table$getLeftHeaderG = (_table$getLeftHeaderG2 = table.getLeftHeaderGroups()[0]) == null ? void 0 : _table$getLeftHeaderG2.headers.reduce((sum, header) => {\n return sum + header.getSize();\n }, 0)) != null ? _table$getLeftHeaderG : 0;\n };\n table.getCenterTotalSize = () => {\n var _table$getCenterHeade, _table$getCenterHeade2;\n return (_table$getCenterHeade = (_table$getCenterHeade2 = table.getCenterHeaderGroups()[0]) == null ? void 0 : _table$getCenterHeade2.headers.reduce((sum, header) => {\n return sum + header.getSize();\n }, 0)) != null ? _table$getCenterHeade : 0;\n };\n table.getRightTotalSize = () => {\n var _table$getRightHeader, _table$getRightHeader2;\n return (_table$getRightHeader = (_table$getRightHeader2 = table.getRightHeaderGroups()[0]) == null ? void 0 : _table$getRightHeader2.headers.reduce((sum, header) => {\n return sum + header.getSize();\n }, 0)) != null ? _table$getRightHeader : 0;\n };\n }\n};\nlet passiveSupported = null;\nfunction passiveEventSupported() {\n if (typeof passiveSupported === 'boolean') return passiveSupported;\n let supported = false;\n try {\n const options = {\n get passive() {\n supported = true;\n return false;\n }\n };\n const noop = () => {};\n window.addEventListener('test', noop, options);\n window.removeEventListener('test', noop);\n } catch (err) {\n supported = false;\n }\n passiveSupported = supported;\n return passiveSupported;\n}\nfunction isTouchStartEvent(e) {\n return e.type === 'touchstart';\n}\n\n//\n\nconst ColumnVisibility = {\n getInitialState: state => {\n return {\n columnVisibility: {},\n ...state\n };\n },\n getDefaultOptions: table => {\n return {\n onColumnVisibilityChange: makeStateUpdater('columnVisibility', table)\n };\n },\n createColumn: (column, table) => {\n column.toggleVisibility = value => {\n if (column.getCanHide()) {\n table.setColumnVisibility(old => ({\n ...old,\n [column.id]: value != null ? value : !column.getIsVisible()\n }));\n }\n };\n column.getIsVisible = () => {\n var _ref, _table$getState$colum;\n const childColumns = column.columns;\n return (_ref = childColumns.length ? childColumns.some(c => c.getIsVisible()) : (_table$getState$colum = table.getState().columnVisibility) == null ? void 0 : _table$getState$colum[column.id]) != null ? _ref : true;\n };\n column.getCanHide = () => {\n var _column$columnDef$ena, _table$options$enable;\n return ((_column$columnDef$ena = column.columnDef.enableHiding) != null ? _column$columnDef$ena : true) && ((_table$options$enable = table.options.enableHiding) != null ? _table$options$enable : true);\n };\n column.getToggleVisibilityHandler = () => {\n return e => {\n column.toggleVisibility == null || column.toggleVisibility(e.target.checked);\n };\n };\n },\n createRow: (row, table) => {\n row._getAllVisibleCells = memo(() => [row.getAllCells(), table.getState().columnVisibility], cells => {\n return cells.filter(cell => cell.column.getIsVisible());\n }, getMemoOptions(table.options, 'debugRows', '_getAllVisibleCells'));\n row.getVisibleCells = memo(() => [row.getLeftVisibleCells(), row.getCenterVisibleCells(), row.getRightVisibleCells()], (left, center, right) => [...left, ...center, ...right], getMemoOptions(table.options, 'debugRows', 'getVisibleCells'));\n },\n createTable: table => {\n const makeVisibleColumnsMethod = (key, getColumns) => {\n return memo(() => [getColumns(), getColumns().filter(d => d.getIsVisible()).map(d => d.id).join('_')], columns => {\n return columns.filter(d => d.getIsVisible == null ? void 0 : d.getIsVisible());\n }, getMemoOptions(table.options, 'debugColumns', key));\n };\n table.getVisibleFlatColumns = makeVisibleColumnsMethod('getVisibleFlatColumns', () => table.getAllFlatColumns());\n table.getVisibleLeafColumns = makeVisibleColumnsMethod('getVisibleLeafColumns', () => table.getAllLeafColumns());\n table.getLeftVisibleLeafColumns = makeVisibleColumnsMethod('getLeftVisibleLeafColumns', () => table.getLeftLeafColumns());\n table.getRightVisibleLeafColumns = makeVisibleColumnsMethod('getRightVisibleLeafColumns', () => table.getRightLeafColumns());\n table.getCenterVisibleLeafColumns = makeVisibleColumnsMethod('getCenterVisibleLeafColumns', () => table.getCenterLeafColumns());\n table.setColumnVisibility = updater => table.options.onColumnVisibilityChange == null ? void 0 : table.options.onColumnVisibilityChange(updater);\n table.resetColumnVisibility = defaultState => {\n var _table$initialState$c;\n table.setColumnVisibility(defaultState ? {} : (_table$initialState$c = table.initialState.columnVisibility) != null ? _table$initialState$c : {});\n };\n table.toggleAllColumnsVisible = value => {\n var _value;\n value = (_value = value) != null ? _value : !table.getIsAllColumnsVisible();\n table.setColumnVisibility(table.getAllLeafColumns().reduce((obj, column) => ({\n ...obj,\n [column.id]: !value ? !(column.getCanHide != null && column.getCanHide()) : value\n }), {}));\n };\n table.getIsAllColumnsVisible = () => !table.getAllLeafColumns().some(column => !(column.getIsVisible != null && column.getIsVisible()));\n table.getIsSomeColumnsVisible = () => table.getAllLeafColumns().some(column => column.getIsVisible == null ? void 0 : column.getIsVisible());\n table.getToggleAllColumnsVisibilityHandler = () => {\n return e => {\n var _target;\n table.toggleAllColumnsVisible((_target = e.target) == null ? void 0 : _target.checked);\n };\n };\n }\n};\nfunction _getVisibleLeafColumns(table, position) {\n return !position ? table.getVisibleLeafColumns() : position === 'center' ? table.getCenterVisibleLeafColumns() : position === 'left' ? table.getLeftVisibleLeafColumns() : table.getRightVisibleLeafColumns();\n}\n\n//\n\nconst GlobalFaceting = {\n createTable: table => {\n table._getGlobalFacetedRowModel = table.options.getFacetedRowModel && table.options.getFacetedRowModel(table, '__global__');\n table.getGlobalFacetedRowModel = () => {\n if (table.options.manualFiltering || !table._getGlobalFacetedRowModel) {\n return table.getPreFilteredRowModel();\n }\n return table._getGlobalFacetedRowModel();\n };\n table._getGlobalFacetedUniqueValues = table.options.getFacetedUniqueValues && table.options.getFacetedUniqueValues(table, '__global__');\n table.getGlobalFacetedUniqueValues = () => {\n if (!table._getGlobalFacetedUniqueValues) {\n return new Map();\n }\n return table._getGlobalFacetedUniqueValues();\n };\n table._getGlobalFacetedMinMaxValues = table.options.getFacetedMinMaxValues && table.options.getFacetedMinMaxValues(table, '__global__');\n table.getGlobalFacetedMinMaxValues = () => {\n if (!table._getGlobalFacetedMinMaxValues) {\n return;\n }\n return table._getGlobalFacetedMinMaxValues();\n };\n }\n};\n\n//\n\nconst GlobalFiltering = {\n getInitialState: state => {\n return {\n globalFilter: undefined,\n ...state\n };\n },\n getDefaultOptions: table => {\n return {\n onGlobalFilterChange: makeStateUpdater('globalFilter', table),\n globalFilterFn: 'auto',\n getColumnCanGlobalFilter: column => {\n var _table$getCoreRowMode;\n const value = (_table$getCoreRowMode = table.getCoreRowModel().flatRows[0]) == null || (_table$getCoreRowMode = _table$getCoreRowMode._getAllCellsByColumnId()[column.id]) == null ? void 0 : _table$getCoreRowMode.getValue();\n return typeof value === 'string' || typeof value === 'number';\n }\n };\n },\n createColumn: (column, table) => {\n column.getCanGlobalFilter = () => {\n var _column$columnDef$ena, _table$options$enable, _table$options$enable2, _table$options$getCol;\n return ((_column$columnDef$ena = column.columnDef.enableGlobalFilter) != null ? _column$columnDef$ena : true) && ((_table$options$enable = table.options.enableGlobalFilter) != null ? _table$options$enable : true) && ((_table$options$enable2 = table.options.enableFilters) != null ? _table$options$enable2 : true) && ((_table$options$getCol = table.options.getColumnCanGlobalFilter == null ? void 0 : table.options.getColumnCanGlobalFilter(column)) != null ? _table$options$getCol : true) && !!column.accessorFn;\n };\n },\n createTable: table => {\n table.getGlobalAutoFilterFn = () => {\n return filterFns.includesString;\n };\n table.getGlobalFilterFn = () => {\n var _table$options$filter, _table$options$filter2;\n const {\n globalFilterFn: globalFilterFn\n } = table.options;\n return isFunction(globalFilterFn) ? globalFilterFn : globalFilterFn === 'auto' ? table.getGlobalAutoFilterFn() : (_table$options$filter = (_table$options$filter2 = table.options.filterFns) == null ? void 0 : _table$options$filter2[globalFilterFn]) != null ? _table$options$filter : filterFns[globalFilterFn];\n };\n table.setGlobalFilter = updater => {\n table.options.onGlobalFilterChange == null || table.options.onGlobalFilterChange(updater);\n };\n table.resetGlobalFilter = defaultState => {\n table.setGlobalFilter(defaultState ? undefined : table.initialState.globalFilter);\n };\n }\n};\n\n//\n\nconst RowExpanding = {\n getInitialState: state => {\n return {\n expanded: {},\n ...state\n };\n },\n getDefaultOptions: table => {\n return {\n onExpandedChange: makeStateUpdater('expanded', table),\n paginateExpandedRows: true\n };\n },\n createTable: table => {\n let registered = false;\n let queued = false;\n table._autoResetExpanded = () => {\n var _ref, _table$options$autoRe;\n if (!registered) {\n table._queue(() => {\n registered = true;\n });\n return;\n }\n if ((_ref = (_table$options$autoRe = table.options.autoResetAll) != null ? _table$options$autoRe : table.options.autoResetExpanded) != null ? _ref : !table.options.manualExpanding) {\n if (queued) return;\n queued = true;\n table._queue(() => {\n table.resetExpanded();\n queued = false;\n });\n }\n };\n table.setExpanded = updater => table.options.onExpandedChange == null ? void 0 : table.options.onExpandedChange(updater);\n table.toggleAllRowsExpanded = expanded => {\n if (expanded != null ? expanded : !table.getIsAllRowsExpanded()) {\n table.setExpanded(true);\n } else {\n table.setExpanded({});\n }\n };\n table.resetExpanded = defaultState => {\n var _table$initialState$e, _table$initialState;\n table.setExpanded(defaultState ? {} : (_table$initialState$e = (_table$initialState = table.initialState) == null ? void 0 : _table$initialState.expanded) != null ? _table$initialState$e : {});\n };\n table.getCanSomeRowsExpand = () => {\n return table.getPrePaginationRowModel().flatRows.some(row => row.getCanExpand());\n };\n table.getToggleAllRowsExpandedHandler = () => {\n return e => {\n e.persist == null || e.persist();\n table.toggleAllRowsExpanded();\n };\n };\n table.getIsSomeRowsExpanded = () => {\n const expanded = table.getState().expanded;\n return expanded === true || Object.values(expanded).some(Boolean);\n };\n table.getIsAllRowsExpanded = () => {\n const expanded = table.getState().expanded;\n\n // If expanded is true, save some cycles and return true\n if (typeof expanded === 'boolean') {\n return expanded === true;\n }\n if (!Object.keys(expanded).length) {\n return false;\n }\n\n // If any row is not expanded, return false\n if (table.getRowModel().flatRows.some(row => !row.getIsExpanded())) {\n return false;\n }\n\n // They must all be expanded :shrug:\n return true;\n };\n table.getExpandedDepth = () => {\n let maxDepth = 0;\n const rowIds = table.getState().expanded === true ? Object.keys(table.getRowModel().rowsById) : Object.keys(table.getState().expanded);\n rowIds.forEach(id => {\n const splitId = id.split('.');\n maxDepth = Math.max(maxDepth, splitId.length);\n });\n return maxDepth;\n };\n table.getPreExpandedRowModel = () => table.getSortedRowModel();\n table.getExpandedRowModel = () => {\n if (!table._getExpandedRowModel && table.options.getExpandedRowModel) {\n table._getExpandedRowModel = table.options.getExpandedRowModel(table);\n }\n if (table.options.manualExpanding || !table._getExpandedRowModel) {\n return table.getPreExpandedRowModel();\n }\n return table._getExpandedRowModel();\n };\n },\n createRow: (row, table) => {\n row.toggleExpanded = expanded => {\n table.setExpanded(old => {\n var _expanded;\n const exists = old === true ? true : !!(old != null && old[row.id]);\n let oldExpanded = {};\n if (old === true) {\n Object.keys(table.getRowModel().rowsById).forEach(rowId => {\n oldExpanded[rowId] = true;\n });\n } else {\n oldExpanded = old;\n }\n expanded = (_expanded = expanded) != null ? _expanded : !exists;\n if (!exists && expanded) {\n return {\n ...oldExpanded,\n [row.id]: true\n };\n }\n if (exists && !expanded) {\n const {\n [row.id]: _,\n ...rest\n } = oldExpanded;\n return rest;\n }\n return old;\n });\n };\n row.getIsExpanded = () => {\n var _table$options$getIsR;\n const expanded = table.getState().expanded;\n return !!((_table$options$getIsR = table.options.getIsRowExpanded == null ? void 0 : table.options.getIsRowExpanded(row)) != null ? _table$options$getIsR : expanded === true || (expanded == null ? void 0 : expanded[row.id]));\n };\n row.getCanExpand = () => {\n var _table$options$getRow, _table$options$enable, _row$subRows;\n return (_table$options$getRow = table.options.getRowCanExpand == null ? void 0 : table.options.getRowCanExpand(row)) != null ? _table$options$getRow : ((_table$options$enable = table.options.enableExpanding) != null ? _table$options$enable : true) && !!((_row$subRows = row.subRows) != null && _row$subRows.length);\n };\n row.getIsAllParentsExpanded = () => {\n let isFullyExpanded = true;\n let currentRow = row;\n while (isFullyExpanded && currentRow.parentId) {\n currentRow = table.getRow(currentRow.parentId, true);\n isFullyExpanded = currentRow.getIsExpanded();\n }\n return isFullyExpanded;\n };\n row.getToggleExpandedHandler = () => {\n const canExpand = row.getCanExpand();\n return () => {\n if (!canExpand) return;\n row.toggleExpanded();\n };\n };\n }\n};\n\n//\n\nconst defaultPageIndex = 0;\nconst defaultPageSize = 10;\nconst getDefaultPaginationState = () => ({\n pageIndex: defaultPageIndex,\n pageSize: defaultPageSize\n});\nconst RowPagination = {\n getInitialState: state => {\n return {\n ...state,\n pagination: {\n ...getDefaultPaginationState(),\n ...(state == null ? void 0 : state.pagination)\n }\n };\n },\n getDefaultOptions: table => {\n return {\n onPaginationChange: makeStateUpdater('pagination', table)\n };\n },\n createTable: table => {\n let registered = false;\n let queued = false;\n table._autoResetPageIndex = () => {\n var _ref, _table$options$autoRe;\n if (!registered) {\n table._queue(() => {\n registered = true;\n });\n return;\n }\n if ((_ref = (_table$options$autoRe = table.options.autoResetAll) != null ? _table$options$autoRe : table.options.autoResetPageIndex) != null ? _ref : !table.options.manualPagination) {\n if (queued) return;\n queued = true;\n table._queue(() => {\n table.resetPageIndex();\n queued = false;\n });\n }\n };\n table.setPagination = updater => {\n const safeUpdater = old => {\n let newState = functionalUpdate(updater, old);\n return newState;\n };\n return table.options.onPaginationChange == null ? void 0 : table.options.onPaginationChange(safeUpdater);\n };\n table.resetPagination = defaultState => {\n var _table$initialState$p;\n table.setPagination(defaultState ? getDefaultPaginationState() : (_table$initialState$p = table.initialState.pagination) != null ? _table$initialState$p : getDefaultPaginationState());\n };\n table.setPageIndex = updater => {\n table.setPagination(old => {\n let pageIndex = functionalUpdate(updater, old.pageIndex);\n const maxPageIndex = typeof table.options.pageCount === 'undefined' || table.options.pageCount === -1 ? Number.MAX_SAFE_INTEGER : table.options.pageCount - 1;\n pageIndex = Math.max(0, Math.min(pageIndex, maxPageIndex));\n return {\n ...old,\n pageIndex\n };\n });\n };\n table.resetPageIndex = defaultState => {\n var _table$initialState$p2, _table$initialState;\n table.setPageIndex(defaultState ? defaultPageIndex : (_table$initialState$p2 = (_table$initialState = table.initialState) == null || (_table$initialState = _table$initialState.pagination) == null ? void 0 : _table$initialState.pageIndex) != null ? _table$initialState$p2 : defaultPageIndex);\n };\n table.resetPageSize = defaultState => {\n var _table$initialState$p3, _table$initialState2;\n table.setPageSize(defaultState ? defaultPageSize : (_table$initialState$p3 = (_table$initialState2 = table.initialState) == null || (_table$initialState2 = _table$initialState2.pagination) == null ? void 0 : _table$initialState2.pageSize) != null ? _table$initialState$p3 : defaultPageSize);\n };\n table.setPageSize = updater => {\n table.setPagination(old => {\n const pageSize = Math.max(1, functionalUpdate(updater, old.pageSize));\n const topRowIndex = old.pageSize * old.pageIndex;\n const pageIndex = Math.floor(topRowIndex / pageSize);\n return {\n ...old,\n pageIndex,\n pageSize\n };\n });\n };\n //deprecated\n table.setPageCount = updater => table.setPagination(old => {\n var _table$options$pageCo;\n let newPageCount = functionalUpdate(updater, (_table$options$pageCo = table.options.pageCount) != null ? _table$options$pageCo : -1);\n if (typeof newPageCount === 'number') {\n newPageCount = Math.max(-1, newPageCount);\n }\n return {\n ...old,\n pageCount: newPageCount\n };\n });\n table.getPageOptions = memo(() => [table.getPageCount()], pageCount => {\n let pageOptions = [];\n if (pageCount && pageCount > 0) {\n pageOptions = [...new Array(pageCount)].fill(null).map((_, i) => i);\n }\n return pageOptions;\n }, getMemoOptions(table.options, 'debugTable', 'getPageOptions'));\n table.getCanPreviousPage = () => table.getState().pagination.pageIndex > 0;\n table.getCanNextPage = () => {\n const {\n pageIndex\n } = table.getState().pagination;\n const pageCount = table.getPageCount();\n if (pageCount === -1) {\n return true;\n }\n if (pageCount === 0) {\n return false;\n }\n return pageIndex < pageCount - 1;\n };\n table.previousPage = () => {\n return table.setPageIndex(old => old - 1);\n };\n table.nextPage = () => {\n return table.setPageIndex(old => {\n return old + 1;\n });\n };\n table.firstPage = () => {\n return table.setPageIndex(0);\n };\n table.lastPage = () => {\n return table.setPageIndex(table.getPageCount() - 1);\n };\n table.getPrePaginationRowModel = () => table.getExpandedRowModel();\n table.getPaginationRowModel = () => {\n if (!table._getPaginationRowModel && table.options.getPaginationRowModel) {\n table._getPaginationRowModel = table.options.getPaginationRowModel(table);\n }\n if (table.options.manualPagination || !table._getPaginationRowModel) {\n return table.getPrePaginationRowModel();\n }\n return table._getPaginationRowModel();\n };\n table.getPageCount = () => {\n var _table$options$pageCo2;\n return (_table$options$pageCo2 = table.options.pageCount) != null ? _table$options$pageCo2 : Math.ceil(table.getRowCount() / table.getState().pagination.pageSize);\n };\n table.getRowCount = () => {\n var _table$options$rowCou;\n return (_table$options$rowCou = table.options.rowCount) != null ? _table$options$rowCou : table.getPrePaginationRowModel().rows.length;\n };\n }\n};\n\n//\n\nconst getDefaultRowPinningState = () => ({\n top: [],\n bottom: []\n});\nconst RowPinning = {\n getInitialState: state => {\n return {\n rowPinning: getDefaultRowPinningState(),\n ...state\n };\n },\n getDefaultOptions: table => {\n return {\n onRowPinningChange: makeStateUpdater('rowPinning', table)\n };\n },\n createRow: (row, table) => {\n row.pin = (position, includeLeafRows, includeParentRows) => {\n const leafRowIds = includeLeafRows ? row.getLeafRows().map(_ref => {\n let {\n id\n } = _ref;\n return id;\n }) : [];\n const parentRowIds = includeParentRows ? row.getParentRows().map(_ref2 => {\n let {\n id\n } = _ref2;\n return id;\n }) : [];\n const rowIds = new Set([...parentRowIds, row.id, ...leafRowIds]);\n table.setRowPinning(old => {\n var _old$top3, _old$bottom3;\n if (position === 'bottom') {\n var _old$top, _old$bottom;\n return {\n top: ((_old$top = old == null ? void 0 : old.top) != null ? _old$top : []).filter(d => !(rowIds != null && rowIds.has(d))),\n bottom: [...((_old$bottom = old == null ? void 0 : old.bottom) != null ? _old$bottom : []).filter(d => !(rowIds != null && rowIds.has(d))), ...Array.from(rowIds)]\n };\n }\n if (position === 'top') {\n var _old$top2, _old$bottom2;\n return {\n top: [...((_old$top2 = old == null ? void 0 : old.top) != null ? _old$top2 : []).filter(d => !(rowIds != null && rowIds.has(d))), ...Array.from(rowIds)],\n bottom: ((_old$bottom2 = old == null ? void 0 : old.bottom) != null ? _old$bottom2 : []).filter(d => !(rowIds != null && rowIds.has(d)))\n };\n }\n return {\n top: ((_old$top3 = old == null ? void 0 : old.top) != null ? _old$top3 : []).filter(d => !(rowIds != null && rowIds.has(d))),\n bottom: ((_old$bottom3 = old == null ? void 0 : old.bottom) != null ? _old$bottom3 : []).filter(d => !(rowIds != null && rowIds.has(d)))\n };\n });\n };\n row.getCanPin = () => {\n var _ref3;\n const {\n enableRowPinning,\n enablePinning\n } = table.options;\n if (typeof enableRowPinning === 'function') {\n return enableRowPinning(row);\n }\n return (_ref3 = enableRowPinning != null ? enableRowPinning : enablePinning) != null ? _ref3 : true;\n };\n row.getIsPinned = () => {\n const rowIds = [row.id];\n const {\n top,\n bottom\n } = table.getState().rowPinning;\n const isTop = rowIds.some(d => top == null ? void 0 : top.includes(d));\n const isBottom = rowIds.some(d => bottom == null ? void 0 : bottom.includes(d));\n return isTop ? 'top' : isBottom ? 'bottom' : false;\n };\n row.getPinnedIndex = () => {\n var _ref4, _visiblePinnedRowIds$;\n const position = row.getIsPinned();\n if (!position) return -1;\n const visiblePinnedRowIds = (_ref4 = position === 'top' ? table.getTopRows() : table.getBottomRows()) == null ? void 0 : _ref4.map(_ref5 => {\n let {\n id\n } = _ref5;\n return id;\n });\n return (_visiblePinnedRowIds$ = visiblePinnedRowIds == null ? void 0 : visiblePinnedRowIds.indexOf(row.id)) != null ? _visiblePinnedRowIds$ : -1;\n };\n },\n createTable: table => {\n table.setRowPinning = updater => table.options.onRowPinningChange == null ? void 0 : table.options.onRowPinningChange(updater);\n table.resetRowPinning = defaultState => {\n var _table$initialState$r, _table$initialState;\n return table.setRowPinning(defaultState ? getDefaultRowPinningState() : (_table$initialState$r = (_table$initialState = table.initialState) == null ? void 0 : _table$initialState.rowPinning) != null ? _table$initialState$r : getDefaultRowPinningState());\n };\n table.getIsSomeRowsPinned = position => {\n var _pinningState$positio;\n const pinningState = table.getState().rowPinning;\n if (!position) {\n var _pinningState$top, _pinningState$bottom;\n return Boolean(((_pinningState$top = pinningState.top) == null ? void 0 : _pinningState$top.length) || ((_pinningState$bottom = pinningState.bottom) == null ? void 0 : _pinningState$bottom.length));\n }\n return Boolean((_pinningState$positio = pinningState[position]) == null ? void 0 : _pinningState$positio.length);\n };\n table._getPinnedRows = (visibleRows, pinnedRowIds, position) => {\n var _table$options$keepPi;\n const rows = ((_table$options$keepPi = table.options.keepPinnedRows) != null ? _table$options$keepPi : true) ?\n //get all rows that are pinned even if they would not be otherwise visible\n //account for expanded parent rows, but not pagination or filtering\n (pinnedRowIds != null ? pinnedRowIds : []).map(rowId => {\n const row = table.getRow(rowId, true);\n return row.getIsAllParentsExpanded() ? row : null;\n }) :\n //else get only visible rows that are pinned\n (pinnedRowIds != null ? pinnedRowIds : []).map(rowId => visibleRows.find(row => row.id === rowId));\n return rows.filter(Boolean).map(d => ({\n ...d,\n position\n }));\n };\n table.getTopRows = memo(() => [table.getRowModel().rows, table.getState().rowPinning.top], (allRows, topPinnedRowIds) => table._getPinnedRows(allRows, topPinnedRowIds, 'top'), getMemoOptions(table.options, 'debugRows', 'getTopRows'));\n table.getBottomRows = memo(() => [table.getRowModel().rows, table.getState().rowPinning.bottom], (allRows, bottomPinnedRowIds) => table._getPinnedRows(allRows, bottomPinnedRowIds, 'bottom'), getMemoOptions(table.options, 'debugRows', 'getBottomRows'));\n table.getCenterRows = memo(() => [table.getRowModel().rows, table.getState().rowPinning.top, table.getState().rowPinning.bottom], (allRows, top, bottom) => {\n const topAndBottom = new Set([...(top != null ? top : []), ...(bottom != null ? bottom : [])]);\n return allRows.filter(d => !topAndBottom.has(d.id));\n }, getMemoOptions(table.options, 'debugRows', 'getCenterRows'));\n }\n};\n\n//\n\nconst RowSelection = {\n getInitialState: state => {\n return {\n rowSelection: {},\n ...state\n };\n },\n getDefaultOptions: table => {\n return {\n onRowSelectionChange: makeStateUpdater('rowSelection', table),\n enableRowSelection: true,\n enableMultiRowSelection: true,\n enableSubRowSelection: true\n // enableGroupingRowSelection: false,\n // isAdditiveSelectEvent: (e: unknown) => !!e.metaKey,\n // isInclusiveSelectEvent: (e: unknown) => !!e.shiftKey,\n };\n },\n createTable: table => {\n table.setRowSelection = updater => table.options.onRowSelectionChange == null ? void 0 : table.options.onRowSelectionChange(updater);\n table.resetRowSelection = defaultState => {\n var _table$initialState$r;\n return table.setRowSelection(defaultState ? {} : (_table$initialState$r = table.initialState.rowSelection) != null ? _table$initialState$r : {});\n };\n table.toggleAllRowsSelected = value => {\n table.setRowSelection(old => {\n value = typeof value !== 'undefined' ? value : !table.getIsAllRowsSelected();\n const rowSelection = {\n ...old\n };\n const preGroupedFlatRows = table.getPreGroupedRowModel().flatRows;\n\n // We don't use `mutateRowIsSelected` here for performance reasons.\n // All of the rows are flat already, so it wouldn't be worth it\n if (value) {\n preGroupedFlatRows.forEach(row => {\n if (!row.getCanSelect()) {\n return;\n }\n rowSelection[row.id] = true;\n });\n } else {\n preGroupedFlatRows.forEach(row => {\n delete rowSelection[row.id];\n });\n }\n return rowSelection;\n });\n };\n table.toggleAllPageRowsSelected = value => table.setRowSelection(old => {\n const resolvedValue = typeof value !== 'undefined' ? value : !table.getIsAllPageRowsSelected();\n const rowSelection = {\n ...old\n };\n table.getRowModel().rows.forEach(row => {\n mutateRowIsSelected(rowSelection, row.id, resolvedValue, true, table);\n });\n return rowSelection;\n });\n\n // addRowSelectionRange: rowId => {\n // const {\n // rows,\n // rowsById,\n // options: { selectGroupingRows, selectSubRows },\n // } = table\n\n // const findSelectedRow = (rows: Row[]) => {\n // let found\n // rows.find(d => {\n // if (d.getIsSelected()) {\n // found = d\n // return true\n // }\n // const subFound = findSelectedRow(d.subRows || [])\n // if (subFound) {\n // found = subFound\n // return true\n // }\n // return false\n // })\n // return found\n // }\n\n // const firstRow = findSelectedRow(rows) || rows[0]\n // const lastRow = rowsById[rowId]\n\n // let include = false\n // const selectedRowIds = {}\n\n // const addRow = (row: Row) => {\n // mutateRowIsSelected(selectedRowIds, row.id, true, {\n // rowsById,\n // selectGroupingRows: selectGroupingRows!,\n // selectSubRows: selectSubRows!,\n // })\n // }\n\n // table.rows.forEach(row => {\n // const isFirstRow = row.id === firstRow.id\n // const isLastRow = row.id === lastRow.id\n\n // if (isFirstRow || isLastRow) {\n // if (!include) {\n // include = true\n // } else if (include) {\n // addRow(row)\n // include = false\n // }\n // }\n\n // if (include) {\n // addRow(row)\n // }\n // })\n\n // table.setRowSelection(selectedRowIds)\n // },\n table.getPreSelectedRowModel = () => table.getCoreRowModel();\n table.getSelectedRowModel = memo(() => [table.getState().rowSelection, table.getCoreRowModel()], (rowSelection, rowModel) => {\n if (!Object.keys(rowSelection).length) {\n return {\n rows: [],\n flatRows: [],\n rowsById: {}\n };\n }\n return selectRowsFn(table, rowModel);\n }, getMemoOptions(table.options, 'debugTable', 'getSelectedRowModel'));\n table.getFilteredSelectedRowModel = memo(() => [table.getState().rowSelection, table.getFilteredRowModel()], (rowSelection, rowModel) => {\n if (!Object.keys(rowSelection).length) {\n return {\n rows: [],\n flatRows: [],\n rowsById: {}\n };\n }\n return selectRowsFn(table, rowModel);\n }, getMemoOptions(table.options, 'debugTable', 'getFilteredSelectedRowModel'));\n table.getGroupedSelectedRowModel = memo(() => [table.getState().rowSelection, table.getSortedRowModel()], (rowSelection, rowModel) => {\n if (!Object.keys(rowSelection).length) {\n return {\n rows: [],\n flatRows: [],\n rowsById: {}\n };\n }\n return selectRowsFn(table, rowModel);\n }, getMemoOptions(table.options, 'debugTable', 'getGroupedSelectedRowModel'));\n\n ///\n\n // getGroupingRowCanSelect: rowId => {\n // const row = table.getRow(rowId)\n\n // if (!row) {\n // throw new Error()\n // }\n\n // if (typeof table.options.enableGroupingRowSelection === 'function') {\n // return table.options.enableGroupingRowSelection(row)\n // }\n\n // return table.options.enableGroupingRowSelection ?? false\n // },\n\n table.getIsAllRowsSelected = () => {\n const preGroupedFlatRows = table.getFilteredRowModel().flatRows;\n const {\n rowSelection\n } = table.getState();\n let isAllRowsSelected = Boolean(preGroupedFlatRows.length && Object.keys(rowSelection).length);\n if (isAllRowsSelected) {\n if (preGroupedFlatRows.some(row => row.getCanSelect() && !rowSelection[row.id])) {\n isAllRowsSelected = false;\n }\n }\n return isAllRowsSelected;\n };\n table.getIsAllPageRowsSelected = () => {\n const paginationFlatRows = table.getPaginationRowModel().flatRows.filter(row => row.getCanSelect());\n const {\n rowSelection\n } = table.getState();\n let isAllPageRowsSelected = !!paginationFlatRows.length;\n if (isAllPageRowsSelected && paginationFlatRows.some(row => !rowSelection[row.id])) {\n isAllPageRowsSelected = false;\n }\n return isAllPageRowsSelected;\n };\n table.getIsSomeRowsSelected = () => {\n var _table$getState$rowSe;\n const totalSelected = Object.keys((_table$getState$rowSe = table.getState().rowSelection) != null ? _table$getState$rowSe : {}).length;\n return totalSelected > 0 && totalSelected < table.getFilteredRowModel().flatRows.length;\n };\n table.getIsSomePageRowsSelected = () => {\n const paginationFlatRows = table.getPaginationRowModel().flatRows;\n return table.getIsAllPageRowsSelected() ? false : paginationFlatRows.filter(row => row.getCanSelect()).some(d => d.getIsSelected() || d.getIsSomeSelected());\n };\n table.getToggleAllRowsSelectedHandler = () => {\n return e => {\n table.toggleAllRowsSelected(e.target.checked);\n };\n };\n table.getToggleAllPageRowsSelectedHandler = () => {\n return e => {\n table.toggleAllPageRowsSelected(e.target.checked);\n };\n };\n },\n createRow: (row, table) => {\n row.toggleSelected = (value, opts) => {\n const isSelected = row.getIsSelected();\n table.setRowSelection(old => {\n var _opts$selectChildren;\n value = typeof value !== 'undefined' ? value : !isSelected;\n if (row.getCanSelect() && isSelected === value) {\n return old;\n }\n const selectedRowIds = {\n ...old\n };\n mutateRowIsSelected(selectedRowIds, row.id, value, (_opts$selectChildren = opts == null ? void 0 : opts.selectChildren) != null ? _opts$selectChildren : true, table);\n return selectedRowIds;\n });\n };\n row.getIsSelected = () => {\n const {\n rowSelection\n } = table.getState();\n return isRowSelected(row, rowSelection);\n };\n row.getIsSomeSelected = () => {\n const {\n rowSelection\n } = table.getState();\n return isSubRowSelected(row, rowSelection) === 'some';\n };\n row.getIsAllSubRowsSelected = () => {\n const {\n rowSelection\n } = table.getState();\n return isSubRowSelected(row, rowSelection) === 'all';\n };\n row.getCanSelect = () => {\n var _table$options$enable;\n if (typeof table.options.enableRowSelection === 'function') {\n return table.options.enableRowSelection(row);\n }\n return (_table$options$enable = table.options.enableRowSelection) != null ? _table$options$enable : true;\n };\n row.getCanSelectSubRows = () => {\n var _table$options$enable2;\n if (typeof table.options.enableSubRowSelection === 'function') {\n return table.options.enableSubRowSelection(row);\n }\n return (_table$options$enable2 = table.options.enableSubRowSelection) != null ? _table$options$enable2 : true;\n };\n row.getCanMultiSelect = () => {\n var _table$options$enable3;\n if (typeof table.options.enableMultiRowSelection === 'function') {\n return table.options.enableMultiRowSelection(row);\n }\n return (_table$options$enable3 = table.options.enableMultiRowSelection) != null ? _table$options$enable3 : true;\n };\n row.getToggleSelectedHandler = () => {\n const canSelect = row.getCanSelect();\n return e => {\n var _target;\n if (!canSelect) return;\n row.toggleSelected((_target = e.target) == null ? void 0 : _target.checked);\n };\n };\n }\n};\nconst mutateRowIsSelected = (selectedRowIds, id, value, includeChildren, table) => {\n var _row$subRows;\n const row = table.getRow(id, true);\n\n // const isGrouped = row.getIsGrouped()\n\n // if ( // TODO: enforce grouping row selection rules\n // !isGrouped ||\n // (isGrouped && table.options.enableGroupingRowSelection)\n // ) {\n if (value) {\n if (!row.getCanMultiSelect()) {\n Object.keys(selectedRowIds).forEach(key => delete selectedRowIds[key]);\n }\n if (row.getCanSelect()) {\n selectedRowIds[id] = true;\n }\n } else {\n delete selectedRowIds[id];\n }\n // }\n\n if (includeChildren && (_row$subRows = row.subRows) != null && _row$subRows.length && row.getCanSelectSubRows()) {\n row.subRows.forEach(row => mutateRowIsSelected(selectedRowIds, row.id, value, includeChildren, table));\n }\n};\nfunction selectRowsFn(table, rowModel) {\n const rowSelection = table.getState().rowSelection;\n const newSelectedFlatRows = [];\n const newSelectedRowsById = {};\n\n // Filters top level and nested rows\n const recurseRows = function (rows, depth) {\n return rows.map(row => {\n var _row$subRows2;\n const isSelected = isRowSelected(row, rowSelection);\n if (isSelected) {\n newSelectedFlatRows.push(row);\n newSelectedRowsById[row.id] = row;\n }\n if ((_row$subRows2 = row.subRows) != null && _row$subRows2.length) {\n row = {\n ...row,\n subRows: recurseRows(row.subRows)\n };\n }\n if (isSelected) {\n return row;\n }\n }).filter(Boolean);\n };\n return {\n rows: recurseRows(rowModel.rows),\n flatRows: newSelectedFlatRows,\n rowsById: newSelectedRowsById\n };\n}\nfunction isRowSelected(row, selection) {\n var _selection$row$id;\n return (_selection$row$id = selection[row.id]) != null ? _selection$row$id : false;\n}\nfunction isSubRowSelected(row, selection, table) {\n var _row$subRows3;\n if (!((_row$subRows3 = row.subRows) != null && _row$subRows3.length)) return false;\n let allChildrenSelected = true;\n let someSelected = false;\n row.subRows.forEach(subRow => {\n // Bail out early if we know both of these\n if (someSelected && !allChildrenSelected) {\n return;\n }\n if (subRow.getCanSelect()) {\n if (isRowSelected(subRow, selection)) {\n someSelected = true;\n } else {\n allChildrenSelected = false;\n }\n }\n\n // Check row selection of nested subrows\n if (subRow.subRows && subRow.subRows.length) {\n const subRowChildrenSelected = isSubRowSelected(subRow, selection);\n if (subRowChildrenSelected === 'all') {\n someSelected = true;\n } else if (subRowChildrenSelected === 'some') {\n someSelected = true;\n allChildrenSelected = false;\n } else {\n allChildrenSelected = false;\n }\n }\n });\n return allChildrenSelected ? 'all' : someSelected ? 'some' : false;\n}\n\nconst reSplitAlphaNumeric = /([0-9]+)/gm;\nconst alphanumeric = (rowA, rowB, columnId) => {\n return compareAlphanumeric(toString(rowA.getValue(columnId)).toLowerCase(), toString(rowB.getValue(columnId)).toLowerCase());\n};\nconst alphanumericCaseSensitive = (rowA, rowB, columnId) => {\n return compareAlphanumeric(toString(rowA.getValue(columnId)), toString(rowB.getValue(columnId)));\n};\n\n// The text filter is more basic (less numeric support)\n// but is much faster\nconst text = (rowA, rowB, columnId) => {\n return compareBasic(toString(rowA.getValue(columnId)).toLowerCase(), toString(rowB.getValue(columnId)).toLowerCase());\n};\n\n// The text filter is more basic (less numeric support)\n// but is much faster\nconst textCaseSensitive = (rowA, rowB, columnId) => {\n return compareBasic(toString(rowA.getValue(columnId)), toString(rowB.getValue(columnId)));\n};\nconst datetime = (rowA, rowB, columnId) => {\n const a = rowA.getValue(columnId);\n const b = rowB.getValue(columnId);\n\n // Can handle nullish values\n // Use > and < because == (and ===) doesn't work with\n // Date objects (would require calling getTime()).\n return a > b ? 1 : a < b ? -1 : 0;\n};\nconst basic = (rowA, rowB, columnId) => {\n return compareBasic(rowA.getValue(columnId), rowB.getValue(columnId));\n};\n\n// Utils\n\nfunction compareBasic(a, b) {\n return a === b ? 0 : a > b ? 1 : -1;\n}\nfunction toString(a) {\n if (typeof a === 'number') {\n if (isNaN(a) || a === Infinity || a === -Infinity) {\n return '';\n }\n return String(a);\n }\n if (typeof a === 'string') {\n return a;\n }\n return '';\n}\n\n// Mixed sorting is slow, but very inclusive of many edge cases.\n// It handles numbers, mixed alphanumeric combinations, and even\n// null, undefined, and Infinity\nfunction compareAlphanumeric(aStr, bStr) {\n // Split on number groups, but keep the delimiter\n // Then remove falsey split values\n const a = aStr.split(reSplitAlphaNumeric).filter(Boolean);\n const b = bStr.split(reSplitAlphaNumeric).filter(Boolean);\n\n // While\n while (a.length && b.length) {\n const aa = a.shift();\n const bb = b.shift();\n const an = parseInt(aa, 10);\n const bn = parseInt(bb, 10);\n const combo = [an, bn].sort();\n\n // Both are string\n if (isNaN(combo[0])) {\n if (aa > bb) {\n return 1;\n }\n if (bb > aa) {\n return -1;\n }\n continue;\n }\n\n // One is a string, one is a number\n if (isNaN(combo[1])) {\n return isNaN(an) ? -1 : 1;\n }\n\n // Both are numbers\n if (an > bn) {\n return 1;\n }\n if (bn > an) {\n return -1;\n }\n }\n return a.length - b.length;\n}\n\n// Exports\n\nconst sortingFns = {\n alphanumeric,\n alphanumericCaseSensitive,\n text,\n textCaseSensitive,\n datetime,\n basic\n};\n\n//\n\nconst RowSorting = {\n getInitialState: state => {\n return {\n sorting: [],\n ...state\n };\n },\n getDefaultColumnDef: () => {\n return {\n sortingFn: 'auto',\n sortUndefined: 1\n };\n },\n getDefaultOptions: table => {\n return {\n onSortingChange: makeStateUpdater('sorting', table),\n isMultiSortEvent: e => {\n return e.shiftKey;\n }\n };\n },\n createColumn: (column, table) => {\n column.getAutoSortingFn = () => {\n const firstRows = table.getFilteredRowModel().flatRows.slice(10);\n let isString = false;\n for (const row of firstRows) {\n const value = row == null ? void 0 : row.getValue(column.id);\n if (Object.prototype.toString.call(value) === '[object Date]') {\n return sortingFns.datetime;\n }\n if (typeof value === 'string') {\n isString = true;\n if (value.split(reSplitAlphaNumeric).length > 1) {\n return sortingFns.alphanumeric;\n }\n }\n }\n if (isString) {\n return sortingFns.text;\n }\n return sortingFns.basic;\n };\n column.getAutoSortDir = () => {\n const firstRow = table.getFilteredRowModel().flatRows[0];\n const value = firstRow == null ? void 0 : firstRow.getValue(column.id);\n if (typeof value === 'string') {\n return 'asc';\n }\n return 'desc';\n };\n column.getSortingFn = () => {\n var _table$options$sortin, _table$options$sortin2;\n if (!column) {\n throw new Error();\n }\n return isFunction(column.columnDef.sortingFn) ? column.columnDef.sortingFn : column.columnDef.sortingFn === 'auto' ? column.getAutoSortingFn() : (_table$options$sortin = (_table$options$sortin2 = table.options.sortingFns) == null ? void 0 : _table$options$sortin2[column.columnDef.sortingFn]) != null ? _table$options$sortin : sortingFns[column.columnDef.sortingFn];\n };\n column.toggleSorting = (desc, multi) => {\n // if (column.columns.length) {\n // column.columns.forEach((c, i) => {\n // if (c.id) {\n // table.toggleColumnSorting(c.id, undefined, multi || !!i)\n // }\n // })\n // return\n // }\n\n // this needs to be outside of table.setSorting to be in sync with rerender\n const nextSortingOrder = column.getNextSortingOrder();\n const hasManualValue = typeof desc !== 'undefined' && desc !== null;\n table.setSorting(old => {\n // Find any existing sorting for this column\n const existingSorting = old == null ? void 0 : old.find(d => d.id === column.id);\n const existingIndex = old == null ? void 0 : old.findIndex(d => d.id === column.id);\n let newSorting = [];\n\n // What should we do with this sort action?\n let sortAction;\n let nextDesc = hasManualValue ? desc : nextSortingOrder === 'desc';\n\n // Multi-mode\n if (old != null && old.length && column.getCanMultiSort() && multi) {\n if (existingSorting) {\n sortAction = 'toggle';\n } else {\n sortAction = 'add';\n }\n } else {\n // Normal mode\n if (old != null && old.length && existingIndex !== old.length - 1) {\n sortAction = 'replace';\n } else if (existingSorting) {\n sortAction = 'toggle';\n } else {\n sortAction = 'replace';\n }\n }\n\n // Handle toggle states that will remove the sorting\n if (sortAction === 'toggle') {\n // If we are \"actually\" toggling (not a manual set value), should we remove the sorting?\n if (!hasManualValue) {\n // Is our intention to remove?\n if (!nextSortingOrder) {\n sortAction = 'remove';\n }\n }\n }\n if (sortAction === 'add') {\n var _table$options$maxMul;\n newSorting = [...old, {\n id: column.id,\n desc: nextDesc\n }];\n // Take latest n columns\n newSorting.splice(0, newSorting.length - ((_table$options$maxMul = table.options.maxMultiSortColCount) != null ? _table$options$maxMul : Number.MAX_SAFE_INTEGER));\n } else if (sortAction === 'toggle') {\n // This flips (or sets) the\n newSorting = old.map(d => {\n if (d.id === column.id) {\n return {\n ...d,\n desc: nextDesc\n };\n }\n return d;\n });\n } else if (sortAction === 'remove') {\n newSorting = old.filter(d => d.id !== column.id);\n } else {\n newSorting = [{\n id: column.id,\n desc: nextDesc\n }];\n }\n return newSorting;\n });\n };\n column.getFirstSortDir = () => {\n var _ref, _column$columnDef$sor;\n const sortDescFirst = (_ref = (_column$columnDef$sor = column.columnDef.sortDescFirst) != null ? _column$columnDef$sor : table.options.sortDescFirst) != null ? _ref : column.getAutoSortDir() === 'desc';\n return sortDescFirst ? 'desc' : 'asc';\n };\n column.getNextSortingOrder = multi => {\n var _table$options$enable, _table$options$enable2;\n const firstSortDirection = column.getFirstSortDir();\n const isSorted = column.getIsSorted();\n if (!isSorted) {\n return firstSortDirection;\n }\n if (isSorted !== firstSortDirection && ((_table$options$enable = table.options.enableSortingRemoval) != null ? _table$options$enable : true) && (\n // If enableSortRemove, enable in general\n multi ? (_table$options$enable2 = table.options.enableMultiRemove) != null ? _table$options$enable2 : true : true) // If multi, don't allow if enableMultiRemove))\n ) {\n return false;\n }\n return isSorted === 'desc' ? 'asc' : 'desc';\n };\n column.getCanSort = () => {\n var _column$columnDef$ena, _table$options$enable3;\n return ((_column$columnDef$ena = column.columnDef.enableSorting) != null ? _column$columnDef$ena : true) && ((_table$options$enable3 = table.options.enableSorting) != null ? _table$options$enable3 : true) && !!column.accessorFn;\n };\n column.getCanMultiSort = () => {\n var _ref2, _column$columnDef$ena2;\n return (_ref2 = (_column$columnDef$ena2 = column.columnDef.enableMultiSort) != null ? _column$columnDef$ena2 : table.options.enableMultiSort) != null ? _ref2 : !!column.accessorFn;\n };\n column.getIsSorted = () => {\n var _table$getState$sorti;\n const columnSort = (_table$getState$sorti = table.getState().sorting) == null ? void 0 : _table$getState$sorti.find(d => d.id === column.id);\n return !columnSort ? false : columnSort.desc ? 'desc' : 'asc';\n };\n column.getSortIndex = () => {\n var _table$getState$sorti2, _table$getState$sorti3;\n return (_table$getState$sorti2 = (_table$getState$sorti3 = table.getState().sorting) == null ? void 0 : _table$getState$sorti3.findIndex(d => d.id === column.id)) != null ? _table$getState$sorti2 : -1;\n };\n column.clearSorting = () => {\n //clear sorting for just 1 column\n table.setSorting(old => old != null && old.length ? old.filter(d => d.id !== column.id) : []);\n };\n column.getToggleSortingHandler = () => {\n const canSort = column.getCanSort();\n return e => {\n if (!canSort) return;\n e.persist == null || e.persist();\n column.toggleSorting == null || column.toggleSorting(undefined, column.getCanMultiSort() ? table.options.isMultiSortEvent == null ? void 0 : table.options.isMultiSortEvent(e) : false);\n };\n };\n },\n createTable: table => {\n table.setSorting = updater => table.options.onSortingChange == null ? void 0 : table.options.onSortingChange(updater);\n table.resetSorting = defaultState => {\n var _table$initialState$s, _table$initialState;\n table.setSorting(defaultState ? [] : (_table$initialState$s = (_table$initialState = table.initialState) == null ? void 0 : _table$initialState.sorting) != null ? _table$initialState$s : []);\n };\n table.getPreSortedRowModel = () => table.getGroupedRowModel();\n table.getSortedRowModel = () => {\n if (!table._getSortedRowModel && table.options.getSortedRowModel) {\n table._getSortedRowModel = table.options.getSortedRowModel(table);\n }\n if (table.options.manualSorting || !table._getSortedRowModel) {\n return table.getPreSortedRowModel();\n }\n return table._getSortedRowModel();\n };\n }\n};\n\nconst builtInFeatures = [Headers, ColumnVisibility, ColumnOrdering, ColumnPinning, ColumnFaceting, ColumnFiltering, GlobalFaceting,\n//depends on ColumnFaceting\nGlobalFiltering,\n//depends on ColumnFiltering\nRowSorting, ColumnGrouping,\n//depends on RowSorting\nRowExpanding, RowPagination, RowPinning, RowSelection, ColumnSizing];\n\n//\n\nfunction createTable(options) {\n var _options$_features, _options$initialState;\n if (process.env.NODE_ENV !== 'production' && (options.debugAll || options.debugTable)) {\n console.info('Creating Table Instance...');\n }\n const _features = [...builtInFeatures, ...((_options$_features = options._features) != null ? _options$_features : [])];\n let table = {\n _features\n };\n const defaultOptions = table._features.reduce((obj, feature) => {\n return Object.assign(obj, feature.getDefaultOptions == null ? void 0 : feature.getDefaultOptions(table));\n }, {});\n const mergeOptions = options => {\n if (table.options.mergeOptions) {\n return table.options.mergeOptions(defaultOptions, options);\n }\n return {\n ...defaultOptions,\n ...options\n };\n };\n const coreInitialState = {};\n let initialState = {\n ...coreInitialState,\n ...((_options$initialState = options.initialState) != null ? _options$initialState : {})\n };\n table._features.forEach(feature => {\n var _feature$getInitialSt;\n initialState = (_feature$getInitialSt = feature.getInitialState == null ? void 0 : feature.getInitialState(initialState)) != null ? _feature$getInitialSt : initialState;\n });\n const queued = [];\n let queuedTimeout = false;\n const coreInstance = {\n _features,\n options: {\n ...defaultOptions,\n ...options\n },\n initialState,\n _queue: cb => {\n queued.push(cb);\n if (!queuedTimeout) {\n queuedTimeout = true;\n\n // Schedule a microtask to run the queued callbacks after\n // the current call stack (render, etc) has finished.\n Promise.resolve().then(() => {\n while (queued.length) {\n queued.shift()();\n }\n queuedTimeout = false;\n }).catch(error => setTimeout(() => {\n throw error;\n }));\n }\n },\n reset: () => {\n table.setState(table.initialState);\n },\n setOptions: updater => {\n const newOptions = functionalUpdate(updater, table.options);\n table.options = mergeOptions(newOptions);\n },\n getState: () => {\n return table.options.state;\n },\n setState: updater => {\n table.options.onStateChange == null || table.options.onStateChange(updater);\n },\n _getRowId: (row, index, parent) => {\n var _table$options$getRow;\n return (_table$options$getRow = table.options.getRowId == null ? void 0 : table.options.getRowId(row, index, parent)) != null ? _table$options$getRow : `${parent ? [parent.id, index].join('.') : index}`;\n },\n getCoreRowModel: () => {\n if (!table._getCoreRowModel) {\n table._getCoreRowModel = table.options.getCoreRowModel(table);\n }\n return table._getCoreRowModel();\n },\n // The final calls start at the bottom of the model,\n // expanded rows, which then work their way up\n\n getRowModel: () => {\n return table.getPaginationRowModel();\n },\n //in next version, we should just pass in the row model as the optional 2nd arg\n getRow: (id, searchAll) => {\n let row = (searchAll ? table.getPrePaginationRowModel() : table.getRowModel()).rowsById[id];\n if (!row) {\n row = table.getCoreRowModel().rowsById[id];\n if (!row) {\n if (process.env.NODE_ENV !== 'production') {\n throw new Error(`getRow could not find row with ID: ${id}`);\n }\n throw new Error();\n }\n }\n return row;\n },\n _getDefaultColumnDef: memo(() => [table.options.defaultColumn], defaultColumn => {\n var _defaultColumn;\n defaultColumn = (_defaultColumn = defaultColumn) != null ? _defaultColumn : {};\n return {\n header: props => {\n const resolvedColumnDef = props.header.column.columnDef;\n if (resolvedColumnDef.accessorKey) {\n return resolvedColumnDef.accessorKey;\n }\n if (resolvedColumnDef.accessorFn) {\n return resolvedColumnDef.id;\n }\n return null;\n },\n // footer: props => props.header.column.id,\n cell: props => {\n var _props$renderValue$to, _props$renderValue;\n return (_props$renderValue$to = (_props$renderValue = props.renderValue()) == null || _props$renderValue.toString == null ? void 0 : _props$renderValue.toString()) != null ? _props$renderValue$to : null;\n },\n ...table._features.reduce((obj, feature) => {\n return Object.assign(obj, feature.getDefaultColumnDef == null ? void 0 : feature.getDefaultColumnDef());\n }, {}),\n ...defaultColumn\n };\n }, getMemoOptions(options, 'debugColumns', '_getDefaultColumnDef')),\n _getColumnDefs: () => table.options.columns,\n getAllColumns: memo(() => [table._getColumnDefs()], columnDefs => {\n const recurseColumns = function (columnDefs, parent, depth) {\n if (depth === void 0) {\n depth = 0;\n }\n return columnDefs.map(columnDef => {\n const column = createColumn(table, columnDef, depth, parent);\n const groupingColumnDef = columnDef;\n column.columns = groupingColumnDef.columns ? recurseColumns(groupingColumnDef.columns, column, depth + 1) : [];\n return column;\n });\n };\n return recurseColumns(columnDefs);\n }, getMemoOptions(options, 'debugColumns', 'getAllColumns')),\n getAllFlatColumns: memo(() => [table.getAllColumns()], allColumns => {\n return allColumns.flatMap(column => {\n return column.getFlatColumns();\n });\n }, getMemoOptions(options, 'debugColumns', 'getAllFlatColumns')),\n _getAllFlatColumnsById: memo(() => [table.getAllFlatColumns()], flatColumns => {\n return flatColumns.reduce((acc, column) => {\n acc[column.id] = column;\n return acc;\n }, {});\n }, getMemoOptions(options, 'debugColumns', 'getAllFlatColumnsById')),\n getAllLeafColumns: memo(() => [table.getAllColumns(), table._getOrderColumnsFn()], (allColumns, orderColumns) => {\n let leafColumns = allColumns.flatMap(column => column.getLeafColumns());\n return orderColumns(leafColumns);\n }, getMemoOptions(options, 'debugColumns', 'getAllLeafColumns')),\n getColumn: columnId => {\n const column = table._getAllFlatColumnsById()[columnId];\n if (process.env.NODE_ENV !== 'production' && !column) {\n console.error(`[Table] Column with id '${columnId}' does not exist.`);\n }\n return column;\n }\n };\n Object.assign(table, coreInstance);\n for (let index = 0; index < table._features.length; index++) {\n const feature = table._features[index];\n feature == null || feature.createTable == null || feature.createTable(table);\n }\n return table;\n}\n\nfunction getCoreRowModel() {\n return table => memo(() => [table.options.data], data => {\n const rowModel = {\n rows: [],\n flatRows: [],\n rowsById: {}\n };\n const accessRows = function (originalRows, depth, parentRow) {\n if (depth === void 0) {\n depth = 0;\n }\n const rows = [];\n for (let i = 0; i < originalRows.length; i++) {\n // This could be an expensive check at scale, so we should move it somewhere else, but where?\n // if (!id) {\n // if (process.env.NODE_ENV !== 'production') {\n // throw new Error(`getRowId expected an ID, but got ${id}`)\n // }\n // }\n\n // Make the row\n const row = createRow(table, table._getRowId(originalRows[i], i, parentRow), originalRows[i], i, depth, undefined, parentRow == null ? void 0 : parentRow.id);\n\n // Keep track of every row in a flat array\n rowModel.flatRows.push(row);\n // Also keep track of every row by its ID\n rowModel.rowsById[row.id] = row;\n // Push table row into parent\n rows.push(row);\n\n // Get the original subrows\n if (table.options.getSubRows) {\n var _row$originalSubRows;\n row.originalSubRows = table.options.getSubRows(originalRows[i], i);\n\n // Then recursively access them\n if ((_row$originalSubRows = row.originalSubRows) != null && _row$originalSubRows.length) {\n row.subRows = accessRows(row.originalSubRows, depth + 1, row);\n }\n }\n }\n return rows;\n };\n rowModel.rows = accessRows(data);\n return rowModel;\n }, getMemoOptions(table.options, 'debugTable', 'getRowModel', () => table._autoResetPageIndex()));\n}\n\nfunction getExpandedRowModel() {\n return table => memo(() => [table.getState().expanded, table.getPreExpandedRowModel(), table.options.paginateExpandedRows], (expanded, rowModel, paginateExpandedRows) => {\n if (!rowModel.rows.length || expanded !== true && !Object.keys(expanded != null ? expanded : {}).length) {\n return rowModel;\n }\n if (!paginateExpandedRows) {\n // Only expand rows at this point if they are being paginated\n return rowModel;\n }\n return expandRows(rowModel);\n }, getMemoOptions(table.options, 'debugTable', 'getExpandedRowModel'));\n}\nfunction expandRows(rowModel) {\n const expandedRows = [];\n const handleRow = row => {\n var _row$subRows;\n expandedRows.push(row);\n if ((_row$subRows = row.subRows) != null && _row$subRows.length && row.getIsExpanded()) {\n row.subRows.forEach(handleRow);\n }\n };\n rowModel.rows.forEach(handleRow);\n return {\n rows: expandedRows,\n flatRows: rowModel.flatRows,\n rowsById: rowModel.rowsById\n };\n}\n\nfunction getFacetedMinMaxValues() {\n return (table, columnId) => memo(() => {\n var _table$getColumn;\n return [(_table$getColumn = table.getColumn(columnId)) == null ? void 0 : _table$getColumn.getFacetedRowModel()];\n }, facetedRowModel => {\n if (!facetedRowModel) return undefined;\n const uniqueValues = facetedRowModel.flatRows.flatMap(flatRow => {\n var _flatRow$getUniqueVal;\n return (_flatRow$getUniqueVal = flatRow.getUniqueValues(columnId)) != null ? _flatRow$getUniqueVal : [];\n }).map(Number).filter(value => !Number.isNaN(value));\n if (!uniqueValues.length) return;\n let facetedMinValue = uniqueValues[0];\n let facetedMaxValue = uniqueValues[uniqueValues.length - 1];\n for (const value of uniqueValues) {\n if (value < facetedMinValue) facetedMinValue = value;else if (value > facetedMaxValue) facetedMaxValue = value;\n }\n return [facetedMinValue, facetedMaxValue];\n }, getMemoOptions(table.options, 'debugTable', 'getFacetedMinMaxValues'));\n}\n\nfunction filterRows(rows, filterRowImpl, table) {\n if (table.options.filterFromLeafRows) {\n return filterRowModelFromLeafs(rows, filterRowImpl, table);\n }\n return filterRowModelFromRoot(rows, filterRowImpl, table);\n}\nfunction filterRowModelFromLeafs(rowsToFilter, filterRow, table) {\n var _table$options$maxLea;\n const newFilteredFlatRows = [];\n const newFilteredRowsById = {};\n const maxDepth = (_table$options$maxLea = table.options.maxLeafRowFilterDepth) != null ? _table$options$maxLea : 100;\n const recurseFilterRows = function (rowsToFilter, depth) {\n if (depth === void 0) {\n depth = 0;\n }\n const rows = [];\n\n // Filter from children up first\n for (let i = 0; i < rowsToFilter.length; i++) {\n var _row$subRows;\n let row = rowsToFilter[i];\n const newRow = createRow(table, row.id, row.original, row.index, row.depth, undefined, row.parentId);\n newRow.columnFilters = row.columnFilters;\n if ((_row$subRows = row.subRows) != null && _row$subRows.length && depth < maxDepth) {\n newRow.subRows = recurseFilterRows(row.subRows, depth + 1);\n row = newRow;\n if (filterRow(row) && !newRow.subRows.length) {\n rows.push(row);\n newFilteredRowsById[row.id] = row;\n newFilteredFlatRows.push(row);\n continue;\n }\n if (filterRow(row) || newRow.subRows.length) {\n rows.push(row);\n newFilteredRowsById[row.id] = row;\n newFilteredFlatRows.push(row);\n continue;\n }\n } else {\n row = newRow;\n if (filterRow(row)) {\n rows.push(row);\n newFilteredRowsById[row.id] = row;\n newFilteredFlatRows.push(row);\n }\n }\n }\n return rows;\n };\n return {\n rows: recurseFilterRows(rowsToFilter),\n flatRows: newFilteredFlatRows,\n rowsById: newFilteredRowsById\n };\n}\nfunction filterRowModelFromRoot(rowsToFilter, filterRow, table) {\n var _table$options$maxLea2;\n const newFilteredFlatRows = [];\n const newFilteredRowsById = {};\n const maxDepth = (_table$options$maxLea2 = table.options.maxLeafRowFilterDepth) != null ? _table$options$maxLea2 : 100;\n\n // Filters top level and nested rows\n const recurseFilterRows = function (rowsToFilter, depth) {\n if (depth === void 0) {\n depth = 0;\n }\n // Filter from parents downward first\n\n const rows = [];\n\n // Apply the filter to any subRows\n for (let i = 0; i < rowsToFilter.length; i++) {\n let row = rowsToFilter[i];\n const pass = filterRow(row);\n if (pass) {\n var _row$subRows2;\n if ((_row$subRows2 = row.subRows) != null && _row$subRows2.length && depth < maxDepth) {\n const newRow = createRow(table, row.id, row.original, row.index, row.depth, undefined, row.parentId);\n newRow.subRows = recurseFilterRows(row.subRows, depth + 1);\n row = newRow;\n }\n rows.push(row);\n newFilteredFlatRows.push(row);\n newFilteredRowsById[row.id] = row;\n }\n }\n return rows;\n };\n return {\n rows: recurseFilterRows(rowsToFilter),\n flatRows: newFilteredFlatRows,\n rowsById: newFilteredRowsById\n };\n}\n\nfunction getFacetedRowModel() {\n return (table, columnId) => memo(() => [table.getPreFilteredRowModel(), table.getState().columnFilters, table.getState().globalFilter, table.getFilteredRowModel()], (preRowModel, columnFilters, globalFilter) => {\n if (!preRowModel.rows.length || !(columnFilters != null && columnFilters.length) && !globalFilter) {\n return preRowModel;\n }\n const filterableIds = [...columnFilters.map(d => d.id).filter(d => d !== columnId), globalFilter ? '__global__' : undefined].filter(Boolean);\n const filterRowsImpl = row => {\n // Horizontally filter rows through each column\n for (let i = 0; i < filterableIds.length; i++) {\n if (row.columnFilters[filterableIds[i]] === false) {\n return false;\n }\n }\n return true;\n };\n return filterRows(preRowModel.rows, filterRowsImpl, table);\n }, getMemoOptions(table.options, 'debugTable', 'getFacetedRowModel'));\n}\n\nfunction getFacetedUniqueValues() {\n return (table, columnId) => memo(() => {\n var _table$getColumn;\n return [(_table$getColumn = table.getColumn(columnId)) == null ? void 0 : _table$getColumn.getFacetedRowModel()];\n }, facetedRowModel => {\n if (!facetedRowModel) return new Map();\n let facetedUniqueValues = new Map();\n for (let i = 0; i < facetedRowModel.flatRows.length; i++) {\n const values = facetedRowModel.flatRows[i].getUniqueValues(columnId);\n for (let j = 0; j < values.length; j++) {\n const value = values[j];\n if (facetedUniqueValues.has(value)) {\n var _facetedUniqueValues$;\n facetedUniqueValues.set(value, ((_facetedUniqueValues$ = facetedUniqueValues.get(value)) != null ? _facetedUniqueValues$ : 0) + 1);\n } else {\n facetedUniqueValues.set(value, 1);\n }\n }\n }\n return facetedUniqueValues;\n }, getMemoOptions(table.options, 'debugTable', `getFacetedUniqueValues_${columnId}`));\n}\n\nfunction getFilteredRowModel() {\n return table => memo(() => [table.getPreFilteredRowModel(), table.getState().columnFilters, table.getState().globalFilter], (rowModel, columnFilters, globalFilter) => {\n if (!rowModel.rows.length || !(columnFilters != null && columnFilters.length) && !globalFilter) {\n for (let i = 0; i < rowModel.flatRows.length; i++) {\n rowModel.flatRows[i].columnFilters = {};\n rowModel.flatRows[i].columnFiltersMeta = {};\n }\n return rowModel;\n }\n const resolvedColumnFilters = [];\n const resolvedGlobalFilters = [];\n (columnFilters != null ? columnFilters : []).forEach(d => {\n var _filterFn$resolveFilt;\n const column = table.getColumn(d.id);\n if (!column) {\n return;\n }\n const filterFn = column.getFilterFn();\n if (!filterFn) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(`Could not find a valid 'column.filterFn' for column with the ID: ${column.id}.`);\n }\n return;\n }\n resolvedColumnFilters.push({\n id: d.id,\n filterFn,\n resolvedValue: (_filterFn$resolveFilt = filterFn.resolveFilterValue == null ? void 0 : filterFn.resolveFilterValue(d.value)) != null ? _filterFn$resolveFilt : d.value\n });\n });\n const filterableIds = (columnFilters != null ? columnFilters : []).map(d => d.id);\n const globalFilterFn = table.getGlobalFilterFn();\n const globallyFilterableColumns = table.getAllLeafColumns().filter(column => column.getCanGlobalFilter());\n if (globalFilter && globalFilterFn && globallyFilterableColumns.length) {\n filterableIds.push('__global__');\n globallyFilterableColumns.forEach(column => {\n var _globalFilterFn$resol;\n resolvedGlobalFilters.push({\n id: column.id,\n filterFn: globalFilterFn,\n resolvedValue: (_globalFilterFn$resol = globalFilterFn.resolveFilterValue == null ? void 0 : globalFilterFn.resolveFilterValue(globalFilter)) != null ? _globalFilterFn$resol : globalFilter\n });\n });\n }\n let currentColumnFilter;\n let currentGlobalFilter;\n\n // Flag the prefiltered row model with each filter state\n for (let j = 0; j < rowModel.flatRows.length; j++) {\n const row = rowModel.flatRows[j];\n row.columnFilters = {};\n if (resolvedColumnFilters.length) {\n for (let i = 0; i < resolvedColumnFilters.length; i++) {\n currentColumnFilter = resolvedColumnFilters[i];\n const id = currentColumnFilter.id;\n\n // Tag the row with the column filter state\n row.columnFilters[id] = currentColumnFilter.filterFn(row, id, currentColumnFilter.resolvedValue, filterMeta => {\n row.columnFiltersMeta[id] = filterMeta;\n });\n }\n }\n if (resolvedGlobalFilters.length) {\n for (let i = 0; i < resolvedGlobalFilters.length; i++) {\n currentGlobalFilter = resolvedGlobalFilters[i];\n const id = currentGlobalFilter.id;\n // Tag the row with the first truthy global filter state\n if (currentGlobalFilter.filterFn(row, id, currentGlobalFilter.resolvedValue, filterMeta => {\n row.columnFiltersMeta[id] = filterMeta;\n })) {\n row.columnFilters.__global__ = true;\n break;\n }\n }\n if (row.columnFilters.__global__ !== true) {\n row.columnFilters.__global__ = false;\n }\n }\n }\n const filterRowsImpl = row => {\n // Horizontally filter rows through each column\n for (let i = 0; i < filterableIds.length; i++) {\n if (row.columnFilters[filterableIds[i]] === false) {\n return false;\n }\n }\n return true;\n };\n\n // Filter final rows using all of the active filters\n return filterRows(rowModel.rows, filterRowsImpl, table);\n }, getMemoOptions(table.options, 'debugTable', 'getFilteredRowModel', () => table._autoResetPageIndex()));\n}\n\nfunction getGroupedRowModel() {\n return table => memo(() => [table.getState().grouping, table.getPreGroupedRowModel()], (grouping, rowModel) => {\n if (!rowModel.rows.length || !grouping.length) {\n rowModel.rows.forEach(row => {\n row.depth = 0;\n row.parentId = undefined;\n });\n return rowModel;\n }\n\n // Filter the grouping list down to columns that exist\n const existingGrouping = grouping.filter(columnId => table.getColumn(columnId));\n const groupedFlatRows = [];\n const groupedRowsById = {};\n // const onlyGroupedFlatRows: Row[] = [];\n // const onlyGroupedRowsById: Record<RowId, Row> = {};\n // const nonGroupedFlatRows: Row[] = [];\n // const nonGroupedRowsById: Record<RowId, Row> = {};\n\n // Recursively group the data\n const groupUpRecursively = function (rows, depth, parentId) {\n if (depth === void 0) {\n depth = 0;\n }\n // Grouping depth has been been met\n // Stop grouping and simply rewrite thd depth and row relationships\n if (depth >= existingGrouping.length) {\n return rows.map(row => {\n row.depth = depth;\n groupedFlatRows.push(row);\n groupedRowsById[row.id] = row;\n if (row.subRows) {\n row.subRows = groupUpRecursively(row.subRows, depth + 1, row.id);\n }\n return row;\n });\n }\n const columnId = existingGrouping[depth];\n\n // Group the rows together for this level\n const rowGroupsMap = groupBy(rows, columnId);\n\n // Perform aggregations for each group\n const aggregatedGroupedRows = Array.from(rowGroupsMap.entries()).map((_ref, index) => {\n let [groupingValue, groupedRows] = _ref;\n let id = `${columnId}:${groupingValue}`;\n id = parentId ? `${parentId}>${id}` : id;\n\n // First, Recurse to group sub rows before aggregation\n const subRows = groupUpRecursively(groupedRows, depth + 1, id);\n subRows.forEach(subRow => {\n subRow.parentId = id;\n });\n\n // Flatten the leaf rows of the rows in this group\n const leafRows = depth ? flattenBy(groupedRows, row => row.subRows) : groupedRows;\n const row = createRow(table, id, leafRows[0].original, index, depth, undefined, parentId);\n Object.assign(row, {\n groupingColumnId: columnId,\n groupingValue,\n subRows,\n leafRows,\n getValue: columnId => {\n // Don't aggregate columns that are in the grouping\n if (existingGrouping.includes(columnId)) {\n if (row._valuesCache.hasOwnProperty(columnId)) {\n return row._valuesCache[columnId];\n }\n if (groupedRows[0]) {\n var _groupedRows$0$getVal;\n row._valuesCache[columnId] = (_groupedRows$0$getVal = groupedRows[0].getValue(columnId)) != null ? _groupedRows$0$getVal : undefined;\n }\n return row._valuesCache[columnId];\n }\n if (row._groupingValuesCache.hasOwnProperty(columnId)) {\n return row._groupingValuesCache[columnId];\n }\n\n // Aggregate the values\n const column = table.getColumn(columnId);\n const aggregateFn = column == null ? void 0 : column.getAggregationFn();\n if (aggregateFn) {\n row._groupingValuesCache[columnId] = aggregateFn(columnId, leafRows, groupedRows);\n return row._groupingValuesCache[columnId];\n }\n }\n });\n subRows.forEach(subRow => {\n groupedFlatRows.push(subRow);\n groupedRowsById[subRow.id] = subRow;\n // if (subRow.getIsGrouped?.()) {\n // onlyGroupedFlatRows.push(subRow);\n // onlyGroupedRowsById[subRow.id] = subRow;\n // } else {\n // nonGroupedFlatRows.push(subRow);\n // nonGroupedRowsById[subRow.id] = subRow;\n // }\n });\n return row;\n });\n return aggregatedGroupedRows;\n };\n const groupedRows = groupUpRecursively(rowModel.rows, 0);\n groupedRows.forEach(subRow => {\n groupedFlatRows.push(subRow);\n groupedRowsById[subRow.id] = subRow;\n // if (subRow.getIsGrouped?.()) {\n // onlyGroupedFlatRows.push(subRow);\n // onlyGroupedRowsById[subRow.id] = subRow;\n // } else {\n // nonGroupedFlatRows.push(subRow);\n // nonGroupedRowsById[subRow.id] = subRow;\n // }\n });\n return {\n rows: groupedRows,\n flatRows: groupedFlatRows,\n rowsById: groupedRowsById\n };\n }, getMemoOptions(table.options, 'debugTable', 'getGroupedRowModel', () => {\n table._queue(() => {\n table._autoResetExpanded();\n table._autoResetPageIndex();\n });\n }));\n}\nfunction groupBy(rows, columnId) {\n const groupMap = new Map();\n return rows.reduce((map, row) => {\n const resKey = `${row.getGroupingValue(columnId)}`;\n const previous = map.get(resKey);\n if (!previous) {\n map.set(resKey, [row]);\n } else {\n previous.push(row);\n }\n return map;\n }, groupMap);\n}\n\nfunction getPaginationRowModel(opts) {\n return table => memo(() => [table.getState().pagination, table.getPrePaginationRowModel(), table.options.paginateExpandedRows ? undefined : table.getState().expanded], (pagination, rowModel) => {\n if (!rowModel.rows.length) {\n return rowModel;\n }\n const {\n pageSize,\n pageIndex\n } = pagination;\n let {\n rows,\n flatRows,\n rowsById\n } = rowModel;\n const pageStart = pageSize * pageIndex;\n const pageEnd = pageStart + pageSize;\n rows = rows.slice(pageStart, pageEnd);\n let paginatedRowModel;\n if (!table.options.paginateExpandedRows) {\n paginatedRowModel = expandRows({\n rows,\n flatRows,\n rowsById\n });\n } else {\n paginatedRowModel = {\n rows,\n flatRows,\n rowsById\n };\n }\n paginatedRowModel.flatRows = [];\n const handleRow = row => {\n paginatedRowModel.flatRows.push(row);\n if (row.subRows.length) {\n row.subRows.forEach(handleRow);\n }\n };\n paginatedRowModel.rows.forEach(handleRow);\n return paginatedRowModel;\n }, getMemoOptions(table.options, 'debugTable', 'getPaginationRowModel'));\n}\n\nfunction getSortedRowModel() {\n return table => memo(() => [table.getState().sorting, table.getPreSortedRowModel()], (sorting, rowModel) => {\n if (!rowModel.rows.length || !(sorting != null && sorting.length)) {\n return rowModel;\n }\n const sortingState = table.getState().sorting;\n const sortedFlatRows = [];\n\n // Filter out sortings that correspond to non existing columns\n const availableSorting = sortingState.filter(sort => {\n var _table$getColumn;\n return (_table$getColumn = table.getColumn(sort.id)) == null ? void 0 : _table$getColumn.getCanSort();\n });\n const columnInfoById = {};\n availableSorting.forEach(sortEntry => {\n const column = table.getColumn(sortEntry.id);\n if (!column) return;\n columnInfoById[sortEntry.id] = {\n sortUndefined: column.columnDef.sortUndefined,\n invertSorting: column.columnDef.invertSorting,\n sortingFn: column.getSortingFn()\n };\n });\n const sortData = rows => {\n // This will also perform a stable sorting using the row index\n // if needed.\n const sortedData = rows.map(row => ({\n ...row\n }));\n sortedData.sort((rowA, rowB) => {\n for (let i = 0; i < availableSorting.length; i += 1) {\n var _sortEntry$desc;\n const sortEntry = availableSorting[i];\n const columnInfo = columnInfoById[sortEntry.id];\n const sortUndefined = columnInfo.sortUndefined;\n const isDesc = (_sortEntry$desc = sortEntry == null ? void 0 : sortEntry.desc) != null ? _sortEntry$desc : false;\n let sortInt = 0;\n\n // All sorting ints should always return in ascending order\n if (sortUndefined) {\n const aValue = rowA.getValue(sortEntry.id);\n const bValue = rowB.getValue(sortEntry.id);\n const aUndefined = aValue === undefined;\n const bUndefined = bValue === undefined;\n if (aUndefined || bUndefined) {\n if (sortUndefined === 'first') return aUndefined ? -1 : 1;\n if (sortUndefined === 'last') return aUndefined ? 1 : -1;\n sortInt = aUndefined && bUndefined ? 0 : aUndefined ? sortUndefined : -sortUndefined;\n }\n }\n if (sortInt === 0) {\n sortInt = columnInfo.sortingFn(rowA, rowB, sortEntry.id);\n }\n\n // If sorting is non-zero, take care of desc and inversion\n if (sortInt !== 0) {\n if (isDesc) {\n sortInt *= -1;\n }\n if (columnInfo.invertSorting) {\n sortInt *= -1;\n }\n return sortInt;\n }\n }\n return rowA.index - rowB.index;\n });\n\n // If there are sub-rows, sort them\n sortedData.forEach(row => {\n var _row$subRows;\n sortedFlatRows.push(row);\n if ((_row$subRows = row.subRows) != null && _row$subRows.length) {\n row.subRows = sortData(row.subRows);\n }\n });\n return sortedData;\n };\n return {\n rows: sortData(rowModel.rows),\n flatRows: sortedFlatRows,\n rowsById: rowModel.rowsById\n };\n }, getMemoOptions(table.options, 'debugTable', 'getSortedRowModel', () => table._autoResetPageIndex()));\n}\n\nexport { ColumnFaceting, ColumnFiltering, ColumnGrouping, ColumnOrdering, ColumnPinning, ColumnSizing, ColumnVisibility, GlobalFaceting, GlobalFiltering, Headers, RowExpanding, RowPagination, RowPinning, RowSelection, RowSorting, _getVisibleLeafColumns, aggregationFns, buildHeaderGroups, createCell, createColumn, createColumnHelper, createRow, createTable, defaultColumnSizing, expandRows, filterFns, flattenBy, functionalUpdate, getCoreRowModel, getExpandedRowModel, getFacetedMinMaxValues, getFacetedRowModel, getFacetedUniqueValues, getFilteredRowModel, getGroupedRowModel, getMemoOptions, getPaginationRowModel, getSortedRowModel, isFunction, isNumberArray, isRowSelected, isSubRowSelected, makeStateUpdater, memo, noop, orderColumns, passiveEventSupported, reSplitAlphaNumeric, selectRowsFn, shouldAutoRemoveFilter, sortingFns };\n//# sourceMappingURL=index.mjs.map\n","/**\n * react-table\n *\n * Copyright (c) TanStack\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.md file in the root directory of this source tree.\n *\n * @license MIT\n */\nimport * as React from 'react';\nimport { createTable } from '@tanstack/table-core';\nexport * from '@tanstack/table-core';\n\n//\n\n/**\n * If rendering headers, cells, or footers with custom markup, use flexRender instead of `cell.getValue()` or `cell.renderValue()`.\n */\nfunction flexRender(Comp, props) {\n return !Comp ? null : isReactComponent(Comp) ? /*#__PURE__*/React.createElement(Comp, props) : Comp;\n}\nfunction isReactComponent(component) {\n return isClassComponent(component) || typeof component === 'function' || isExoticComponent(component);\n}\nfunction isClassComponent(component) {\n return typeof component === 'function' && (() => {\n const proto = Object.getPrototypeOf(component);\n return proto.prototype && proto.prototype.isReactComponent;\n })();\n}\nfunction isExoticComponent(component) {\n return typeof component === 'object' && typeof component.$$typeof === 'symbol' && ['react.memo', 'react.forward_ref'].includes(component.$$typeof.description);\n}\nfunction useReactTable(options) {\n // Compose in the generic options to the user options\n const resolvedOptions = {\n state: {},\n // Dummy state\n onStateChange: () => {},\n // noop\n renderFallbackValue: null,\n ...options\n };\n\n // Create a new table and store it in state\n const [tableRef] = React.useState(() => ({\n current: createTable(resolvedOptions)\n }));\n\n // By default, manage table state here using the table's initial state\n const [state, setState] = React.useState(() => tableRef.current.initialState);\n\n // Compose the default state above with any user state. This will allow the user\n // to only control a subset of the state if desired.\n tableRef.current.setOptions(prev => ({\n ...prev,\n ...options,\n state: {\n ...state,\n ...options.state\n },\n // Similarly, we'll maintain both our internal state and any user-provided\n // state.\n onStateChange: updater => {\n setState(updater);\n options.onStateChange == null || options.onStateChange(updater);\n }\n }));\n return tableRef.current;\n}\n\nexport { flexRender, useReactTable };\n//# sourceMappingURL=index.mjs.map\n","// Client-side export helpers.\n//\n// Pulls every record matching the current list query by paginating with a\n// large pageSize, then serializes to CSV or JSON and triggers a browser\n// download. Pure functions live here so they're trivially unit-testable;\n// the dialog UI in pages/export-dialog.tsx wires them together.\n\nimport type { AdminClient } from './client.js'\nimport type { ListQuery, PropertyJSON, RecordJSON } from './types.js'\n\nexport type ExportFormat = 'csv' | 'json'\n\nexport interface FetchAllOptions {\n /** Page size used for each list request. */\n batchSize?: number\n /** Optional progress callback: `(loaded, total)`. */\n onProgress?(loaded: number, total: number): void\n /** AbortSignal — drop pagination loop on cancel. */\n signal?: AbortSignal\n}\n\n/**\n * Page through `client.list()` until exhausted, returning every record that\n * matches the same filters/sorting as the current list view. `query.page`\n * and `query.perPage` are overwritten — pass the user's filters/sorting only.\n */\nexport async function fetchAllRecords(\n client: AdminClient,\n resourceId: string,\n query: ListQuery | undefined,\n opts: FetchAllOptions = {},\n): Promise<RecordJSON[]> {\n // Backend caps `perPage` at 200 (see listQueryZ in @modern-admin/nest).\n const batchSize = opts.batchSize ?? 200\n const baseQuery: ListQuery = { ...(query ?? {}), perPage: batchSize, page: 1 }\n const all: RecordJSON[] = []\n let total: number\n for (let page = 1; ; page++) {\n if (opts.signal?.aborted) throw new DOMException('Aborted', 'AbortError')\n const res = await client.list(resourceId, { ...baseQuery, page })\n total = res.meta.total\n all.push(...res.records)\n opts.onProgress?.(all.length, total)\n if (res.records.length < batchSize) break\n if (all.length >= total) break\n }\n return all\n}\n\n/** Escape a single CSV field per RFC 4180 (wrap in quotes when needed). */\nexport function csvEscape(value: unknown): string {\n if (value == null) return ''\n let str: string\n if (typeof value === 'string') str = value\n else if (typeof value === 'number' || typeof value === 'boolean') str = String(value)\n else if (value instanceof Date) str = value.toISOString()\n else str = JSON.stringify(value)\n // Quote if it contains comma, quote, CR or LF.\n if (/[\",\\r\\n]/.test(str)) {\n return `\"${str.replace(/\"/g, '\"\"')}\"`\n }\n return str\n}\n\nexport interface SerializeOptions {\n /** Properties to export in this order. Defaults to union of keys in `records`. */\n properties?: PropertyJSON[]\n /** When provided, the active list query is embedded as a comment at the top\n * of the exported file so the export is self-documenting:\n * – CSV: `# Query: {...}` line before the header row\n * – JSON: `// Query: {...}` line before the JSON array */\n query?: ListQuery\n}\n\n/** Build a CSV document for the given records. UTF-8 BOM for Excel friendliness. */\nexport function recordsToCsv(records: RecordJSON[], opts: SerializeOptions = {}): string {\n const columns = opts.properties\n ? opts.properties.map((p) => ({ path: p.path, label: p.label }))\n : columnsFromRecords(records)\n const header = columns.map((c) => csvEscape(c.label)).join(',')\n const lines = records.map((r) =>\n columns.map((c) => csvEscape(r.params[c.path])).join(','),\n )\n const queryComment = opts.query\n ? `# Query: ${JSON.stringify(opts.query)}\\r\\n`\n : ''\n return `\\uFEFF${queryComment}${[header, ...lines].join('\\r\\n')}`\n}\n\n/** Build a pretty-printed JSON document for the given records.\n * When `opts.query` is set, a `// Query: ...` comment is prepended so the\n * export is self-documenting (JSONC — understood by VS Code, TypeScript, etc.) */\nexport function recordsToJson(records: RecordJSON[], opts: SerializeOptions = {}): string {\n const paths = opts.properties?.map((p) => p.path)\n const items = records.map((r) => {\n if (!paths) return { id: r.id, ...r.params }\n const row: Record<string, unknown> = { id: r.id }\n for (const p of paths) row[p] = r.params[p]\n return row\n })\n const json = JSON.stringify(items, null, 2)\n return opts.query ? `// Query: ${JSON.stringify(opts.query)}\\n${json}` : json\n}\n\nfunction columnsFromRecords(records: RecordJSON[]): { path: string; label: string }[] {\n const seen = new Set<string>()\n const out: { path: string; label: string }[] = []\n for (const r of records) {\n for (const k of Object.keys(r.params)) {\n if (seen.has(k)) continue\n seen.add(k)\n out.push({ path: k, label: k })\n }\n }\n return out\n}\n\n/** Trigger a browser download for the given text payload. */\nexport function downloadText(filename: string, mime: string, body: string): void {\n if (typeof window === 'undefined') return\n const blob = new Blob([body], { type: `${mime};charset=utf-8` })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = filename\n document.body.appendChild(a)\n a.click()\n a.remove()\n // Revoke after a tick so Safari has time to start the download.\n window.setTimeout(() => URL.revokeObjectURL(url), 1000)\n}\n\n/** Build a stable filename like `users-20260506-143015.csv`. */\nexport function exportFilename(resourceId: string, format: ExportFormat, now: Date = new Date()): string {\n const pad = (n: number) => String(n).padStart(2, '0')\n const stamp =\n `${now.getFullYear()}${pad(now.getMonth() + 1)}${pad(now.getDate())}` +\n `-${pad(now.getHours())}${pad(now.getMinutes())}${pad(now.getSeconds())}`\n return `${resourceId}-${stamp}.${format}`\n}\n","// Export dialog: lets the user download all records matching the current\n// list filters/sorting as CSV or JSON. Rendered inside a generic <Dialog>\n// via useDialogs().open() — the parent passes resourceId + visible\n// properties + the active ListQuery.\n\nimport * as React from 'react'\nimport {\n Button,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@modern-admin/ui'\nimport { Download, FileJson, FileSpreadsheet, X } from 'lucide-react'\nimport { useAdminClient } from '../provider.js'\nimport { useI18n } from '../i18n.js'\nimport { useNotify } from '../notify.js'\nimport {\n downloadText,\n exportFilename,\n fetchAllRecords,\n recordsToCsv,\n recordsToJson,\n type ExportFormat,\n} from '../export.js'\nimport type { ListQuery, PropertyJSON } from '../types.js'\n\nexport interface ExportDialogProps {\n resourceId: string\n resourceLabel: string\n properties: PropertyJSON[]\n query: ListQuery | undefined\n onClose(): void\n}\n\nexport function ExportDialog({\n resourceId,\n resourceLabel,\n properties,\n query,\n onClose,\n}: ExportDialogProps): React.ReactElement {\n const client = useAdminClient()\n const { t } = useI18n()\n const notify = useNotify()\n const [busy, setBusy] = React.useState<ExportFormat | null>(null)\n const [progress, setProgress] = React.useState<{ loaded: number; total: number } | null>(null)\n const abortRef = React.useRef<AbortController | null>(null)\n\n React.useEffect(() => {\n return () => abortRef.current?.abort()\n }, [])\n\n const run = async (format: ExportFormat): Promise<void> => {\n if (busy) return\n setBusy(format)\n setProgress({ loaded: 0, total: 0 })\n const ctrl = new AbortController()\n abortRef.current = ctrl\n try {\n const records = await fetchAllRecords(client, resourceId, query, {\n signal: ctrl.signal,\n onProgress: (loaded, total) => setProgress({ loaded, total }),\n })\n const body =\n format === 'csv'\n ? recordsToCsv(records, { properties, query })\n : recordsToJson(records, { properties, query })\n const mime = format === 'csv' ? 'text/csv' : 'application/json'\n downloadText(exportFilename(resourceId, format), mime, body)\n notify.success({ key: 'export:exported', params: { count: records.length } })\n onClose()\n } catch (err) {\n if ((err as { name?: string }).name === 'AbortError') return\n notify.error(\n { key: 'export:exportFailed' },\n { description: err instanceof Error ? err.message : String(err) },\n )\n } finally {\n setBusy(null)\n setProgress(null)\n abortRef.current = null\n }\n }\n\n return (\n <>\n <DialogHeader>\n <DialogTitle>{t('export:title')}</DialogTitle>\n <DialogDescription>\n {t('export:description', { resource: resourceLabel })}\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"grid grid-cols-1 gap-2 sm:grid-cols-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n className=\"h-auto justify-start gap-3 py-3\"\n disabled={!!busy}\n onClick={() => run('csv')}\n >\n <FileSpreadsheet className=\"size-5 shrink-0\" />\n <div className=\"min-w-0 flex flex-col items-start text-left overflow-hidden\">\n <span className=\"font-medium\">CSV</span>\n <span className=\"text-xs text-muted-foreground truncate w-full\">\n {t('export:csvHint')}\n </span>\n </div>\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n className=\"h-auto justify-start gap-3 py-3\"\n disabled={!!busy}\n onClick={() => run('json')}\n >\n <FileJson className=\"size-5 shrink-0\" />\n <div className=\"min-w-0 flex flex-col items-start text-left overflow-hidden\">\n <span className=\"font-medium\">JSON</span>\n <span className=\"text-xs text-muted-foreground truncate w-full\">\n {t('export:jsonHint')}\n </span>\n </div>\n </Button>\n </div>\n\n {busy && (\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Download className=\"size-4 animate-pulse\" />\n <span>\n {progress && progress.total > 0\n ? t('export:progress', { loaded: progress.loaded, total: progress.total })\n : t('export:downloading')}\n </span>\n </div>\n )}\n\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={() => {\n abortRef.current?.abort()\n onClose()\n }}\n >\n <X className=\"size-4\" />\n {busy ? t('common:cancel') : t('common:close')}\n </Button>\n </DialogFooter>\n </>\n )\n}\n","// Filter operator codecs for the list page.\n//\n// Operators are encoded in the filter value string as `OPERATOR:VALUE`, which\n// travels through the URL hash / controlled query state. These pure functions\n// are the single boundary between that wire format and the structured\n// `{ op, val }` / `{ op, from, to }` shapes the filter UIs work with. Kept\n// framework-free so they're unit-testable without React.\n\n// ─── String filters ─────────────────────────────────────────────────────────\n// Legacy values (no prefix) default to `co` (contains) for strings.\n\nexport type StringFilterOp =\n | 'co'\n | 'nco'\n | 'sw'\n | 'ew'\n | 'eq'\n | 'neq'\n | 'empty'\n | 'nempty'\n | 'in'\n\nconst STRING_OPS: ReadonlySet<string> = new Set(['co', 'nco', 'sw', 'ew', 'eq', 'neq', 'empty', 'nempty', 'in'])\nexport const ALL_STRING_OPS: StringFilterOp[] = ['co', 'nco', 'sw', 'ew', 'in', 'empty', 'nempty']\nexport const NULLARY_OPS: ReadonlySet<string> = new Set(['empty', 'nempty'])\n\n/** Max distinct values for which a string filter defaults to \"is one of\"\n * (checkbox list). Fields with more choices default to \"contains\". */\nexport const ONE_OF_DEFAULT_MAX = 10\n\nexport function parseFilterString(raw: string): { op: StringFilterOp; val: string } {\n if (!raw) return { op: 'co', val: '' }\n const colonIdx = raw.indexOf(':')\n if (colonIdx === -1) return { op: 'co', val: raw }\n const prefix = raw.slice(0, colonIdx)\n if (STRING_OPS.has(prefix)) return { op: prefix as StringFilterOp, val: raw.slice(colonIdx + 1) }\n return { op: 'co', val: raw }\n}\n\nexport function encodeFilter(op: StringFilterOp, val: string): string {\n if (op === 'empty' || op === 'nempty') return `${op}:`\n // Unchecking the last item in the \"Is one of\" picker ⇒ no filter.\n // We deliberately do NOT emit `in:` here: it would survive\n // `setDraftFilter`'s empty-string guard and ship a phantom\n // `filters[col]=in:` URL param (and a \"1 active filter\" badge) while\n // the adapter layer drops the clause anyway. The operator resets to\n // `co` on close, but `StringFilterField`'s auto-switch re-promotes\n // low-cardinality fields back to `in` the next time the panel opens.\n if (op === 'in') return val ? `in:${val}` : ''\n if (!val) return ''\n return `${op}:${val}`\n}\n\n// ─── Numeric filters ─────────────────────────────────────────────────────────\n\nexport type NumericFilterOp = 'eq' | 'neq' | 'gt' | 'lt' | 'between' | 'empty' | 'nempty'\n\nconst NUMERIC_OP_SET = new Set<string>(['eq', 'neq', 'gt', 'lt', 'between', 'empty', 'nempty'])\nexport const ALL_NUMERIC_OPS: NumericFilterOp[] = ['eq', 'neq', 'gt', 'lt', 'between', 'empty', 'nempty']\nexport const NUMERIC_NULLARY: ReadonlySet<string> = new Set(['empty', 'nempty'])\n\nexport function parseNumericFilter(raw: string): { op: NumericFilterOp; from: string; to: string } {\n if (!raw) return { op: 'eq', from: '', to: '' }\n const colonIdx = raw.indexOf(':')\n if (colonIdx === -1) return { op: 'eq', from: raw, to: '' }\n const prefix = raw.slice(0, colonIdx)\n if (!NUMERIC_OP_SET.has(prefix)) return { op: 'eq', from: raw, to: '' }\n const rest = raw.slice(colonIdx + 1)\n if (prefix === 'between') {\n const commaIdx = rest.indexOf(',')\n return commaIdx !== -1\n ? { op: 'between', from: rest.slice(0, commaIdx), to: rest.slice(commaIdx + 1) }\n : { op: 'between', from: rest, to: '' }\n }\n return { op: prefix as NumericFilterOp, from: rest, to: '' }\n}\n\nexport function encodeNumericFilter(op: NumericFilterOp, from: string, to: string): string {\n if (op === 'empty' || op === 'nempty') return `${op}:`\n if (op === 'between') return (from || to) ? `between:${from},${to}` : ''\n return from ? `${op}:${from}` : ''\n}\n","import type { PropertyJSON, RelatedResource, ResourceJSON } from './types.js'\n\n/**\n * Prisma/ORM reverse one-to-many relation fields arrive as array references.\n * Their values are usually not included in record/list payloads, so rendering\n * them as normal fields produces empty placeholders. They belong in related\n * record tables instead.\n */\nexport const isToManyReferenceProperty = (property: PropertyJSON): boolean =>\n property.type === 'reference' && property.isArray && property.reference !== null\n\n/**\n * Properties to render for a given view, in the right order.\n *\n * When `order` (the resource's `propertyOrder[view]`) is supplied it is the\n * authority: the backend already resolved visibility + `listProperties` +\n * `position`, so we simply resolve each path against `properties` (which may be\n * shorter, having had per-record-inaccessible fields stripped) preserving that\n * order. Reverse to-many references are still filtered out — they belong in the\n * related-records section, not as columns.\n *\n * Without `order` (older API servers) we fall back to the legacy behaviour:\n * filter by `visibility[view]` in the payload's own order.\n */\nexport const visibleRecordProperties = (\n properties: ReadonlyArray<PropertyJSON>,\n view: 'list' | 'show' | 'edit' | 'filter',\n order?: ReadonlyArray<string>,\n): PropertyJSON[] => {\n if (order) {\n const byPath = new Map(properties.map((property) => [property.path, property]))\n return order\n .map((path) => byPath.get(path))\n .filter(\n (property): property is PropertyJSON =>\n property !== undefined && !isToManyReferenceProperty(property),\n )\n }\n return properties.filter((property) =>\n property.visibility[view] && !isToManyReferenceProperty(property),\n )\n}\n\nconst relatedKey = (related: RelatedResource): string =>\n `${related.resourceId}::${related.foreignKey}`\n\nexport const resolveRelatedResources = (\n resource: ResourceJSON,\n allResources: ReadonlyArray<ResourceJSON>,\n): RelatedResource[] => {\n const byId = new Map(allResources.map((item) => [item.id, item]))\n const result = [...(resource.relatedResources ?? [])]\n const seen = new Set(result.map(relatedKey))\n\n for (const property of resource.properties) {\n if (!isToManyReferenceProperty(property) || !property.reference) continue\n // Point-hide: a to-many reference property that's hidden from the `show`\n // view opts its auto-discovered tab out of the related-records section.\n // Explicitly-configured `relatedResources` are unaffected — they're an\n // intentional opt-in and carry no backing property visibility.\n if (property.visibility.show === false) continue\n\n const target = byId.get(property.reference)\n if (!target) continue\n\n const foreignKey = target.properties.find((candidate) =>\n !candidate.isArray && candidate.reference === resource.id,\n )\n if (!foreignKey) continue\n\n const related: RelatedResource = {\n resourceId: target.id,\n foreignKey: foreignKey.path,\n label: property.label,\n }\n const key = relatedKey(related)\n if (seen.has(key)) continue\n\n seen.add(key)\n result.push(related)\n }\n\n return result\n}\n","import type { ActionDescriptor } from './types.js'\nimport type { ConfirmOptions, DialogsApi } from './dialogs.js'\n\n/**\n * If `action.guard` is set, shows a confirm dialog with that text as the\n * description before proceeding. Returns `true` if the action should run\n * (no guard configured, or user clicked Confirm), `false` if cancelled.\n *\n * Usage at an invoke call-site:\n * if (!await confirmGuard(action, dialogs)) return\n * invoke.mutate(...)\n */\nexport async function confirmGuard(\n action: Pick<ActionDescriptor, 'guard'>,\n dialogs: Pick<DialogsApi, 'confirm'>,\n extra?: Omit<ConfirmOptions, 'description'>,\n): Promise<boolean> {\n if (!action.guard) return true\n return dialogs.confirm({ description: action.guard, ...extra })\n}\n","// Launch strategy for custom actions.\n//\n// An action with no `component` is a one-click operation: the menu fires it\n// straight at the API. An action *with* a `component` renders its own UI\n// first — a page by default (deep-linkable, room for a real form), or a\n// modal when the action opts in with `custom.showAs: 'dialog'`.\n//\n// Both presentations render the same `<ActionComponentHost/>`, so the only\n// thing that varies here is the container.\n\nimport * as React from 'react'\nimport { DialogHeader, DialogTitle } from '@modern-admin/ui'\nimport { useDialogs } from './dialogs.js'\nimport { useNavigate } from './router.js'\nimport { getActionLabel } from './action-menu.js'\nimport { ActionComponentHost } from './components/action-component-host.js'\nimport type { ActionDescriptor } from './types.js'\n\n/** True when the action renders its own UI instead of firing on click. */\nexport const hasActionComponent = (action: ActionDescriptor): boolean =>\n typeof action.component === 'string' && action.component.length > 0\n\nexport interface LaunchActionOptions {\n /** Record id for `actionType: 'record'` actions. */\n recordId?: string\n /** Selection for `actionType: 'bulk'` actions. */\n recordIds?: string[]\n /** Fired after each successful invoke — only observable in dialog mode,\n * since navigating away unmounts the caller. */\n onSuccess?(): void\n}\n\n/**\n * Opens a custom action's component. Callers should gate on\n * `hasActionComponent(action)` first and fall back to their direct-invoke\n * path when it returns false.\n */\nexport type OpenActionComponent = (\n action: ActionDescriptor,\n options?: LaunchActionOptions,\n) => void\n\nexport const useActionLauncher = (resourceId: string): OpenActionComponent => {\n const dialogs = useDialogs()\n const navigate = useNavigate()\n\n return React.useCallback(\n (action: ActionDescriptor, options: LaunchActionOptions = {}) => {\n const { recordId, recordIds, onSuccess } = options\n if (action.custom?.showAs === 'dialog') {\n void dialogs.open({\n className: 'sm:max-w-2xl',\n render: ({ close }) => (\n <>\n <DialogHeader>\n <DialogTitle>{getActionLabel(action)}</DialogTitle>\n </DialogHeader>\n <ActionComponentHost\n resourceId={resourceId}\n actionName={action.name}\n {...(recordId !== undefined ? { recordId } : {})}\n {...(recordIds !== undefined ? { recordIds } : {})}\n {...(onSuccess !== undefined ? { onSuccess } : {})}\n onClose={() => close()}\n />\n </>\n ),\n })\n return\n }\n navigate({\n name: 'action',\n resourceId,\n actionName: action.name,\n ...(recordId !== undefined ? { recordId } : {}),\n ...(recordIds !== undefined ? { recordIds } : {}),\n })\n },\n [dialogs, navigate, resourceId],\n )\n}\n","// List page powered by @tanstack/react-table. Server-side sorting / filtering\n// / pagination — TanStack just handles state + UI. Each visible PropertyJSON\n// becomes a column; reference cells link to the related record's show page,\n// id cells link to their own show page, and clicking anywhere else in a row\n// opens edit. A toolbar offers global search, per-column filters and column\n// visibility, plus a paginator with page-size selector.\n\nimport * as React from 'react'\nimport {\n type ColumnDef,\n type ColumnFiltersState,\n type ColumnSizingState,\n flexRender,\n getCoreRowModel,\n type RowSelectionState,\n type SortingState,\n useReactTable,\n type VisibilityState,\n} from '@tanstack/react-table'\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Checkbox,\n cn,\n DatePicker,\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Empty,\n EmptyContent,\n EmptyDescription,\n EmptyHeader,\n EmptyMedia,\n EmptyTitle,\n Input,\n Kbd,\n Label,\n Popover,\n PopoverContent,\n PopoverTrigger,\n ScrollArea,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Sheet,\n SheetContent,\n SheetHeader,\n SheetTitle,\n Skeleton,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@modern-admin/ui'\nimport {\n ArrowDown,\n ArrowUp,\n ArrowUpDown,\n ChevronLeft,\n ChevronRight,\n ChevronsLeft,\n ChevronsRight,\n Download,\n Eye,\n Inbox,\n ListFilter,\n MoreHorizontal,\n Pencil,\n Plus,\n RefreshCw,\n Search,\n SlidersHorizontal,\n Trash2,\n X,\n Zap,\n} from 'lucide-react'\nimport {\n useBulkDeleteRecords,\n useDeleteRecord,\n useDistinctValues,\n useInvokeBulkAction,\n useInvokeRecordAction,\n useInvokeResourceAction,\n useRecords,\n useResource,\n} from '../hooks.js'\nimport { PropertyDisplay } from '../property-renderer.js'\nimport { ReferenceCombobox, ReferenceLink, ReferenceLinkList } from '../reference.js'\nimport {\n Link,\n type ListQueryState,\n useNavigate,\n useOpenInNewTab,\n useRoute,\n} from '../router.js'\nimport { useI18n } from '../i18n.js'\nimport { useNotify } from '../notify.js'\nimport { useDialogs } from '../dialogs.js'\nimport { useHotkey } from '../use-hotkey.js'\nimport { homeCrumb, PageBreadcrumbs } from '../breadcrumbs.js'\nimport { ExportDialog } from './export-dialog.js'\nimport {\n ALL_NUMERIC_OPS,\n ALL_STRING_OPS,\n encodeFilter,\n encodeNumericFilter,\n type NumericFilterOp,\n NUMERIC_NULLARY,\n NULLARY_OPS,\n ONE_OF_DEFAULT_MAX,\n parseFilterString,\n parseNumericFilter,\n type StringFilterOp,\n} from './filter-codecs.js'\nimport {\n ActionMenu,\n ActionMenuItems,\n isActionAllowedForRecord,\n visibleRecordActions,\n} from '../action-menu.js'\nimport { visibleRecordProperties } from '../relations.js'\nimport type {\n ActionDescriptor,\n ListQuery,\n PropertyJSON,\n RecordJSON,\n} from '../types.js'\nimport { confirmGuard } from '../action-guard.js'\nimport { showActionNotice } from '../action-notice.js'\nimport { hasActionComponent, useActionLauncher } from '../action-launcher.js'\n\nconst PAGE_SIZES = [10, 20, 50, 100] as const\n\n// Cycling widths for skeleton cells — varied so rows don't look identical.\nconst SKEL_WIDTHS = ['w-16', 'w-24', 'w-20', 'w-32', 'w-14', 'w-28', 'w-18', 'w-22'] as const\n\n/** Attach click-and-drag horizontal scrolling to a scroll container.\n *\n * Used on the table wrapper and the pagination buttons row so users on a\n * mouse can drag horizontally without first scrolling to the native scroll-\n * bar. Mouse-only — touch devices already get smooth native momentum\n * scrolling. Engages only after a small movement threshold so plain clicks\n * on rows/buttons still fire, and swallows the synthetic post-drag click to\n * avoid accidental navigation. Returns a cleanup function. */\nfunction attachDragScroll(el: HTMLElement): () => void {\n const DRAG_THRESHOLD = 5\n let startX = 0\n let startScrollLeft = 0\n let pointerId: number | null = null\n let dragging = false\n let armed = false\n\n const onPointerDown = (e: PointerEvent) => {\n if (e.pointerType !== 'mouse') return\n const target = e.target as HTMLElement | null\n if (!target) return\n if (e.button !== 0) return\n if (\n target.closest(\n 'button, a, input, label, [role=\"checkbox\"], [role=\"menuitem\"], [data-resize-handle], [contenteditable=\"true\"]',\n )\n )\n return\n if (el.scrollWidth <= el.clientWidth) return\n armed = true\n dragging = false\n pointerId = e.pointerId\n startX = e.clientX\n startScrollLeft = el.scrollLeft\n }\n\n const onPointerMove = (e: PointerEvent) => {\n if (!armed || pointerId !== e.pointerId) return\n const dx = e.clientX - startX\n if (!dragging) {\n if (Math.abs(dx) < DRAG_THRESHOLD) return\n dragging = true\n el.setPointerCapture(pointerId)\n el.style.cursor = 'grabbing'\n el.style.userSelect = 'none'\n }\n el.scrollLeft = startScrollLeft - dx\n e.preventDefault()\n }\n\n const endDrag = (e: PointerEvent) => {\n if (pointerId !== e.pointerId) return\n armed = false\n if (dragging) {\n dragging = false\n if (el.hasPointerCapture(pointerId)) el.releasePointerCapture(pointerId)\n el.style.cursor = ''\n el.style.userSelect = ''\n const swallow = (ev: MouseEvent) => {\n ev.stopPropagation()\n ev.preventDefault()\n }\n el.addEventListener('click', swallow, { capture: true, once: true })\n }\n pointerId = null\n }\n\n el.addEventListener('pointerdown', onPointerDown)\n el.addEventListener('pointermove', onPointerMove)\n el.addEventListener('pointerup', endDrag)\n el.addEventListener('pointercancel', endDrag)\n return () => {\n el.removeEventListener('pointerdown', onPointerDown)\n el.removeEventListener('pointermove', onPointerMove)\n el.removeEventListener('pointerup', endDrag)\n el.removeEventListener('pointercancel', endDrag)\n }\n}\n\n/** Reasonable starting width per property type. Users can resize from there\n * and the chosen widths are persisted per-resource in localStorage. */\nfunction defaultColumnSize(property: PropertyJSON): number {\n if (property.isId) return 100\n switch (property.type) {\n case 'boolean':\n return 110\n case 'date':\n return 140\n case 'datetime':\n return 180\n case 'number':\n case 'float':\n case 'money':\n case 'currency':\n return 120\n case 'color':\n return 140\n case 'reference':\n return 200\n case 'richtext':\n case 'textarea':\n return 320\n default:\n return 200\n }\n}\n\nconst COLUMN_SIZE_STORAGE_PREFIX = 'modern-admin:colSizes:'\n\n// Internal system columns (_select, _actions) must never have their sizes\n// persisted — their widths are determined by the layout logic, not the user.\nconst isSystemCol = (id: string) => id.startsWith('_')\n\nfunction loadColumnSizing(resourceId: string): ColumnSizingState {\n if (typeof window === 'undefined') return {}\n try {\n const raw = window.localStorage.getItem(COLUMN_SIZE_STORAGE_PREFIX + resourceId)\n if (!raw) return {}\n const parsed = JSON.parse(raw) as ColumnSizingState\n return Object.fromEntries(Object.entries(parsed).filter(([k]) => !isSystemCol(k)))\n } catch {\n return {}\n }\n}\n\nfunction saveColumnSizing(resourceId: string, sizing: ColumnSizingState): void {\n if (typeof window === 'undefined') return\n try {\n const toSave = Object.fromEntries(Object.entries(sizing).filter(([k]) => !isSystemCol(k)))\n window.localStorage.setItem(COLUMN_SIZE_STORAGE_PREFIX + resourceId, JSON.stringify(toSave))\n } catch { /* quota / private mode — ignore */\n }\n}\n\n/** Toggles for individual chrome / toolbar pieces. All default to `true`. */\nexport interface ResourceListFeatures {\n breadcrumbs?: boolean\n title?: boolean\n refresh?: boolean\n filters?: boolean\n columns?: boolean\n export?: boolean\n create?: boolean\n bulk?: boolean\n /** Toolbar-level \"Actions\" dropdown for resource-scoped custom actions. */\n actions?: boolean\n /** Per-column filter popovers in the table header. */\n headerFilters?: boolean\n /** Wrap table + toolbar in a Card. Set false when embedding inside another card. */\n card?: boolean\n}\n\nexport interface ResourceListPageProps {\n resourceId: string\n /** When provided, the table runs in \"controlled\" mode: query state comes\n * from props instead of the URL hash. Both `query` and `onQueryChange`\n * must be supplied together. */\n query?: ListQueryState\n onQueryChange?: (next: ListQueryState) => void\n /** Filters always applied to the data query but hidden from the filter UI\n * and never written to the URL. Used to embed the list as a related-records\n * view filtered by a parent record's id. */\n lockedFilters?: Record<string, string>\n features?: ResourceListFeatures\n /** When provided, row selection is controlled from outside. The\n * internal bulk action bar should be hidden (`features.bulk = false`)\n * in this mode — the parent is consuming the selection. */\n selectedIds?: ReadonlyArray<string>\n onSelectionChange?: (next: string[]) => void\n /** Disable row click → edit and link cells. Used by the picker dialog\n * so clicking a row just toggles selection. */\n disableRowNavigation?: boolean\n /** In embedded mode (`card: false`), whether the internal scroll container\n * and paginator carry their own horizontal padding (`px-6`). Defaults to\n * true — correct for the picker dialog whose body has no padding. Set to\n * false when the host already pads the list (e.g. the related-records tabs\n * embed inside a `CardContent`), otherwise the two paddings stack and the\n * table no longer spans the block's full width. */\n embedPadding?: boolean\n}\n\nexport function ResourceListPage({\n resourceId,\n query: controlledQuery,\n onQueryChange,\n lockedFilters,\n features,\n selectedIds: controlledSelectedIds,\n onSelectionChange,\n disableRowNavigation,\n embedPadding = true,\n}: ResourceListPageProps): React.ReactElement {\n const resource = useResource(resourceId)\n const navigate = useNavigate()\n const openInNewTab = useOpenInNewTab()\n const route = useRoute()\n const remove = useDeleteRecord(resourceId)\n const bulkRemove = useBulkDeleteRecords(resourceId)\n const invokeRecord = useInvokeRecordAction(resourceId)\n const invokeBulk = useInvokeBulkAction(resourceId)\n const invokeResource = useInvokeResourceAction(resourceId)\n const { t } = useI18n()\n const notify = useNotify()\n const dialogs = useDialogs()\n const openActionComponent = useActionLauncher(resourceId)\n\n const isSelectionControlled = controlledSelectedIds !== undefined && onSelectionChange !== undefined\n const [internalRowSelection, setInternalRowSelection] = React.useState<RowSelectionState>({})\n const controlledRowSelection = React.useMemo<RowSelectionState>(() => {\n if (!isSelectionControlled) return {}\n const next: RowSelectionState = {}\n for (const id of controlledSelectedIds!) next[id] = true\n return next\n }, [isSelectionControlled, controlledSelectedIds])\n const rowSelection = isSelectionControlled ? controlledRowSelection : internalRowSelection\n const setRowSelection = React.useCallback(\n (\n updater:\n | RowSelectionState\n | ((prev: RowSelectionState) => RowSelectionState),\n ) => {\n if (isSelectionControlled) {\n const prev = controlledRowSelection\n const next = typeof updater === 'function'\n ? (updater as (p: RowSelectionState) => RowSelectionState)(prev)\n : updater\n onSelectionChange!(Object.keys(next).filter((id) => next[id]))\n return\n }\n setInternalRowSelection(updater)\n },\n [isSelectionControlled, controlledRowSelection, onSelectionChange],\n )\n\n const isControlled = controlledQuery !== undefined && onQueryChange !== undefined\n const f = React.useMemo(\n () => ({\n breadcrumbs: features?.breadcrumbs ?? true,\n title: features?.title ?? true,\n refresh: features?.refresh ?? true,\n filters: features?.filters ?? true,\n columns: features?.columns ?? true,\n export: features?.export ?? true,\n create: features?.create ?? true,\n bulk: features?.bulk ?? true,\n actions: features?.actions ?? true,\n headerFilters: features?.headerFilters ?? true,\n card: features?.card ?? true,\n }),\n [features],\n )\n\n // ── URL-driven (or prop-driven) query state ──\n // In standalone mode, filters/page/perPage/sortBy/direction live in the URL\n // hash (`?page=2&perPage=50&sortBy=name&direction=asc&filters[email]=ada`)\n // so they survive refresh, back, and link sharing. In embedded mode, the\n // parent component owns the same state shape and passes it via `query`.\n const urlQuery = React.useMemo<ListQueryState>(\n () =>\n isControlled\n ? (controlledQuery ?? {})\n : ((route.name === 'list' && route.query) || {}),\n [isControlled, controlledQuery, route],\n )\n\n const sorting = React.useMemo<SortingState>(\n () =>\n urlQuery.sortBy\n ? [{ id: urlQuery.sortBy, desc: urlQuery.direction === 'desc' }]\n : [],\n [urlQuery.sortBy, urlQuery.direction],\n )\n const columnFilters = React.useMemo<ColumnFiltersState>(\n () =>\n urlQuery.filters\n ? Object.entries(urlQuery.filters).map(([id, value]) => ({ id, value }))\n : [],\n [urlQuery.filters],\n )\n const pagination = React.useMemo(\n () => ({\n pageIndex: (urlQuery.page ?? 1) - 1,\n pageSize: urlQuery.perPage ?? 20,\n }),\n [urlQuery.page, urlQuery.perPage],\n )\n\n const [columnVisibility, setColumnVisibility] = React.useState<VisibilityState>({})\n const [columnSizing, setColumnSizing] = React.useState<ColumnSizingState>(() =>\n loadColumnSizing(resourceId),\n )\n // Reload + persist coherently. When resourceId changes we reload first\n // (and skip saving the old state under the new key); on subsequent updates\n // we persist the user's resize choices.\n const lastResourceIdRef = React.useRef(resourceId)\n React.useEffect(() => {\n if (lastResourceIdRef.current !== resourceId) {\n lastResourceIdRef.current = resourceId\n setColumnSizing(loadColumnSizing(resourceId))\n return\n }\n saveColumnSizing(resourceId, columnSizing)\n }, [resourceId, columnSizing])\n\n // Track the wrapper width so the last visible column can flex to fill any\n // leftover space (mirrors unitify's \"distribute remaining space\" pattern\n // without re-layouting all columns on every observe).\n const [wrapperWidth, setWrapperWidth] = React.useState(0)\n const roRef = React.useRef<ResizeObserver | null>(null)\n const dragCleanupRef = React.useRef<(() => void) | null>(null)\n const lastWidthRef = React.useRef(0)\n\n // The width feeds every column's rendered pixel size, so a naive\n // `setWrapperWidth` per observation re-renders the whole table. Anything\n // that animates the wrapper's width — notably the sidebar's 200ms\n // collapse/expand transition — therefore fired a full table render on every\n // frame and blocked the main thread for ~150-240ms, visibly stalling the\n // animation. Two guards: drop sub-pixel/no-op observations, and schedule the\n // update as a non-urgent transition so React can abandon the intermediate\n // renders and only commit the settled width.\n const commitWrapperWidth = React.useCallback((raw: number) => {\n const w = Math.round(raw)\n if (w === lastWidthRef.current) return\n lastWidthRef.current = w\n React.startTransition(() => setWrapperWidth(w))\n }, [])\n // Callback ref: re-attaches ResizeObserver and click-and-drag handlers\n // whenever the wrapper mounts. (Plain useRef + useEffect runs only once,\n // so if the wrapper is initially unmounted due to conditional rendering,\n // the observer never attaches.)\n const tableWrapperRef = React.useCallback((el: HTMLDivElement | null) => {\n if (roRef.current) {\n roRef.current.disconnect()\n roRef.current = null\n }\n if (dragCleanupRef.current) {\n dragCleanupRef.current()\n dragCleanupRef.current = null\n }\n if (!el) return\n const ro = new ResizeObserver((entries) => {\n commitWrapperWidth(entries[0]?.contentRect.width ?? 0)\n })\n ro.observe(el)\n roRef.current = ro\n commitWrapperWidth(el.clientWidth)\n dragCleanupRef.current = attachDragScroll(el)\n }, [commitWrapperWidth])\n\n const updateUrlQuery = React.useCallback(\n (changes: Partial<ListQueryState>) => {\n const merged: ListQueryState = { ...urlQuery, ...changes }\n const next: ListQueryState = {}\n if (merged.page && merged.page > 1) next.page = merged.page\n if (merged.perPage && merged.perPage !== 20) next.perPage = merged.perPage\n if (merged.sortBy) next.sortBy = merged.sortBy\n if (merged.direction) next.direction = merged.direction\n if (merged.filters && Object.keys(merged.filters).length > 0) next.filters = merged.filters\n if (isControlled) {\n onQueryChange!(next)\n return\n }\n navigate({\n name: 'list',\n resourceId,\n ...(Object.keys(next).length > 0 ? { query: next } : {}),\n })\n },\n [isControlled, onQueryChange, navigate, resourceId, urlQuery],\n )\n\n const handleSortingChange = React.useCallback(\n (updater: SortingState | ((prev: SortingState) => SortingState)) => {\n const next = typeof updater === 'function' ? updater(sorting) : updater\n const first = next[0]\n updateUrlQuery({\n sortBy: first?.id,\n direction: first ? (first.desc ? 'desc' : 'asc') : undefined,\n page: 1,\n })\n },\n [sorting, updateUrlQuery],\n )\n\n const handleFilterChange = React.useCallback(\n (\n updater:\n | ColumnFiltersState\n | ((prev: ColumnFiltersState) => ColumnFiltersState),\n ) => {\n const next = typeof updater === 'function' ? updater(columnFilters) : updater\n const filters: Record<string, string> = {}\n for (const f of next) {\n if (f.value != null && f.value !== '') filters[f.id] = String(f.value)\n }\n updateUrlQuery({\n filters: Object.keys(filters).length > 0 ? filters : undefined,\n page: 1,\n })\n },\n [columnFilters, updateUrlQuery],\n )\n\n // Ref so column header popovers can read latest filter state without being\n // in the `columns` useMemo dependency array (which would recreate all columns\n // on every filter change).\n const columnFiltersRef = React.useRef(columnFilters)\n React.useEffect(() => {\n columnFiltersRef.current = columnFilters\n }, [columnFilters])\n\n const handleColumnFilterApply = React.useCallback(\n (updates: Record<string, string>) => {\n const next = columnFiltersRef.current.filter((f) => !(f.id in updates))\n for (const [id, value] of Object.entries(updates)) {\n if (value) next.push({ id, value })\n }\n handleFilterChange(next)\n },\n [handleFilterChange],\n )\n\n const handlePaginationChange = React.useCallback(\n (\n updater:\n | { pageIndex: number; pageSize: number }\n | ((prev: { pageIndex: number; pageSize: number }) => {\n pageIndex: number\n pageSize: number\n }),\n ) => {\n const next = typeof updater === 'function' ? updater(pagination) : updater\n updateUrlQuery({\n page: next.pageIndex + 1,\n perPage: next.pageSize,\n })\n },\n [pagination, updateUrlQuery],\n )\n\n const query = React.useMemo<ListQuery>(() => {\n // Locked filters are merged in but never written to URL or column state.\n const mergedFilters = { ...(lockedFilters ?? {}), ...(urlQuery.filters ?? {}) }\n return {\n page: urlQuery.page ?? 1,\n perPage: urlQuery.perPage ?? 20,\n ...(urlQuery.sortBy\n ? {\n sortBy: urlQuery.sortBy,\n ...(urlQuery.direction ? { direction: urlQuery.direction } : {}),\n }\n : {}),\n ...(Object.keys(mergedFilters).length > 0 ? { filters: mergedFilters } : {}),\n }\n }, [\n urlQuery.page,\n urlQuery.perPage,\n urlQuery.sortBy,\n urlQuery.direction,\n urlQuery.filters,\n lockedFilters,\n ])\n\n const records = useRecords(resourceId, query)\n\n const visible = React.useMemo<PropertyJSON[]>(() => {\n const all = resource\n ? visibleRecordProperties(resource.properties, 'list', resource.propertyOrder?.list)\n : []\n // Drop columns pinned by lockedFilters — they're identical for every row.\n if (lockedFilters && Object.keys(lockedFilters).length > 0) {\n return all.filter((p) => !(p.path in lockedFilters))\n }\n return all\n }, [resource, lockedFilters])\n\n const { customResourceActions, customRecordActions, customBulkActions } = React.useMemo(() => {\n const builtInActionNames = new Set([\n 'list',\n 'show',\n 'new',\n 'edit',\n 'delete',\n 'bulkDelete',\n 'search',\n 'values',\n ])\n const actions = resource?.actions ?? []\n return {\n customResourceActions: actions.filter(\n (a) => a.actionType === 'resource' && !builtInActionNames.has(a.name),\n ),\n customRecordActions: actions.filter(\n (a) => a.actionType === 'record' && !builtInActionNames.has(a.name),\n ),\n customBulkActions: actions.filter(\n (a) => a.actionType === 'bulk' && !builtInActionNames.has(a.name),\n ),\n }\n }, [resource])\n\n // Delete + custom-action handlers are identical for the desktop table rows\n // and the mobile record cards, so both surfaces share these factories rather\n // than each carrying its own copy of the confirm-dialog / mutate plumbing.\n const makeDeleteHandler = React.useCallback(\n (record: RecordJSON) => async () => {\n const ok = await dialogs.confirm({\n title: t('common:confirmDelete'),\n description: record.title || record.id,\n confirmLabel: t('common:delete'),\n destructive: true,\n })\n if (!ok) return\n remove.mutate(record.id, {\n onSuccess: () => notify.success({ key: 'toast:deleted' }),\n onError: (err) =>\n notify.error(\n { key: 'toast:deleteFailed' },\n { description: err instanceof Error ? err.message : String(err) },\n ),\n })\n },\n [dialogs, t, remove, notify],\n )\n\n const makeInvokeRecordHandler = React.useCallback(\n (record: RecordJSON) => async (action: ActionDescriptor) => {\n // Actions with their own UI collect a payload first; the guard runs\n // inside that flow (or not at all — the component is the confirmation).\n if (hasActionComponent(action)) {\n openActionComponent(action, { recordId: record.id })\n return\n }\n if (!await confirmGuard(action, dialogs)) return\n invokeRecord.mutate(\n { recordId: record.id, actionName: action.name },\n {\n onSuccess: (res) => showActionNotice(notify, res.notice),\n onError: (err) => notify.error({ message: err.message }),\n },\n )\n },\n [dialogs, invokeRecord, notify, openActionComponent],\n )\n\n const showSelectColumn = f.bulk || isSelectionControlled\n const columns = React.useMemo<ColumnDef<RecordJSON>[]>(() => {\n const cols: ColumnDef<RecordJSON>[] = []\n if (showSelectColumn) {\n cols.push({\n id: '_select',\n enableSorting: false,\n enableHiding: false,\n enableResizing: false,\n size: 40,\n minSize: 0,\n header: ({ table }) => {\n const all = table.getIsAllPageRowsSelected()\n const some = table.getIsSomePageRowsSelected()\n return (\n <Checkbox\n checked={all ? true : some ? 'indeterminate' : false}\n onCheckedChange={(v) => table.toggleAllPageRowsSelected(!!v)}\n aria-label={t('common:selectAll')}\n />\n )\n },\n cell: ({ row }) => (\n <Checkbox\n checked={row.getIsSelected()}\n onCheckedChange={(v) => row.toggleSelected(!!v)}\n onClick={(e) => e.stopPropagation()}\n aria-label={t('common:selectRow')}\n />\n ),\n })\n }\n cols.push(...visible.map<ColumnDef<RecordJSON>>((property) => ({\n id: property.path,\n accessorFn: (row) => row.params[property.path],\n size: defaultColumnSize(property),\n minSize: 80,\n header: ({ column }) => (\n <div className=\"flex items-center gap-0.5\">\n <SortHeader\n property={property}\n state={\n column.getIsSorted() === 'asc'\n ? 'asc'\n : column.getIsSorted() === 'desc'\n ? 'desc'\n : 'none'\n }\n onSort={() => {\n if (!property.isSortable) return\n const cur = column.getIsSorted()\n if (cur === false) column.toggleSorting(false)\n else if (cur === 'asc') column.toggleSorting(true)\n else column.clearSorting()\n }}\n />\n {f.headerFilters && (\n <ColumnFilterPopover\n property={property}\n getFilters={() => columnFiltersRef.current}\n onApply={handleColumnFilterApply}\n resourceId={resourceId}\n t={t}\n />\n )}\n </div>\n ),\n enableSorting: property.isSortable,\n cell: ({ row }) => (\n <CellContent\n resourceId={resourceId}\n recordId={row.original.id}\n property={property}\n value={row.original.params[property.path]}\n populated={row.original.populated}\n />\n ),\n })))\n if (!disableRowNavigation) cols.push({\n id: '_actions',\n header: () => null,\n enableSorting: false,\n enableHiding: false,\n enableResizing: false,\n size: 44,\n minSize: 0,\n cell: ({ row }) => (\n <RowActions\n t={t}\n record={row.original}\n customActions={customRecordActions}\n onView={() =>\n navigate({ name: 'show', resourceId, recordId: row.original.id })\n }\n onEdit={() =>\n navigate({ name: 'edit', resourceId, recordId: row.original.id })\n }\n onDelete={makeDeleteHandler(row.original)}\n onInvokeAction={makeInvokeRecordHandler(row.original)}\n />\n ),\n })\n return cols\n }, [\n visible,\n resourceId,\n navigate,\n t,\n handleColumnFilterApply,\n f.headerFilters,\n showSelectColumn,\n disableRowNavigation,\n customRecordActions,\n makeDeleteHandler,\n makeInvokeRecordHandler,\n ])\n\n const total = records.data?.meta.total ?? 0\n const pageCount = Math.max(1, Math.ceil(total / pagination.pageSize))\n\n const table = useReactTable({\n data: records.data?.records ?? [],\n columns,\n pageCount,\n state: { sorting, columnFilters, columnVisibility, pagination, rowSelection, columnSizing },\n onSortingChange: handleSortingChange,\n onColumnFiltersChange: handleFilterChange,\n onColumnVisibilityChange: setColumnVisibility,\n onColumnSizingChange: setColumnSizing,\n onPaginationChange: handlePaginationChange,\n onRowSelectionChange: setRowSelection,\n enableRowSelection: true,\n manualSorting: true,\n manualFiltering: true,\n manualPagination: true,\n enableColumnResizing: true,\n // 'onEnd' commits the new size only when the user releases the handle,\n // avoiding a re-render storm that 'onChange' triggers on every mousemove.\n columnResizeMode: 'onEnd',\n defaultColumn: { minSize: 80, size: 200, maxSize: 800 },\n getCoreRowModel: getCoreRowModel(),\n getRowId: (row) => row.id,\n })\n\n // Selection lives at the page level (we always know the IDs from rowSelection\n // keys because getRowId returns row.id). The bulk-delete button shows\n // whenever the user has at least one row selected.\n const selectedIds = React.useMemo(() => Object.keys(rowSelection), [rowSelection])\n const selectedCount = selectedIds.length\n // An empty result set has two flavours. When there are NO active filters the\n // resource is genuinely empty, so we swap the whole toolbar for a \"create your\n // first record\" empty state. When filters ARE active the resource may well\n // hold records — the current filters just match none — so we must KEEP the\n // toolbar (and its filter button) reachable, otherwise the user is stranded\n // with no way to relax the filters. This bites the related-records embed,\n // where a filter that matches nothing would otherwise hide the filter button.\n const isEmpty = !records.isPending && !records.isError && total === 0\n const hasActiveFilters = columnFilters.length > 0\n const showStandaloneEmptyState = isEmpty && !hasActiveFilters\n const showFilteredEmptyState = isEmpty && hasActiveFilters\n // Skeletons appear only on the true first load, where `placeholderData:\n // keepPreviousData` has nothing to hold. Page/sort/filter changes and\n // background invalidations keep the prior rows on screen (isFetching, not\n // isPending) so the table never blanks out from under the user.\n const showSkeletons = records.isPending\n\n // ── Keyboard shortcuts ──\n // Plain `n` creates, `r` refreshes, `f` opens the filters drawer.\n // Bare-key bindings are skipped while typing in inputs. Ctrl+N would\n // be the conventional choice for \"new\" but every major browser\n // reserves it for \"new window\" and won't surrender the keydown, so we\n // settle for a single-letter binding consistent with `r` / `f`.\n useHotkey(\n 'n',\n () => {\n navigate({ name: 'new', resourceId })\n },\n { enabled: f.create, description: t('common:new') },\n )\n useHotkey(\n 'r',\n () => {\n if (!records.isFetching) records.refetch()\n },\n { enabled: f.refresh, description: t('common:refresh') },\n )\n const handleBulkDelete = React.useCallback(async () => {\n const ok = await dialogs.confirm({\n title: t('common:bulkDeleteConfirm', { count: selectedCount }),\n confirmLabel: t('common:delete'),\n destructive: true,\n })\n if (!ok) return\n bulkRemove.mutate(selectedIds, {\n onSuccess: () => {\n setRowSelection({})\n notify.success({ key: 'toast:bulkDeleted', params: { count: selectedCount } })\n },\n onError: (err) =>\n notify.error(\n { key: 'toast:bulkDeleteFailed' },\n { description: err instanceof Error ? err.message : String(err) },\n ),\n })\n }, [bulkRemove, dialogs, notify, selectedCount, selectedIds, setRowSelection, t])\n\n if (!resource) {\n return (\n <Card>\n <CardContent className=\"p-6\">\n <Skeleton className=\"h-6 w-1/3\"/>\n </CardContent>\n </Card>\n )\n }\n\n const showCustomResourceActions = f.actions && customResourceActions.length > 0\n const hasToolbarActions = !showStandaloneEmptyState && (\n f.refresh || f.filters || f.columns || f.export || f.create || showCustomResourceActions\n )\n const hasHeader = f.title || hasToolbarActions || (!showStandaloneEmptyState && visible.some((p) => p.isSortable))\n\n // CardHeader/Content add their own padding. When `card: false` we're embedded\n // inside another container that already provides spacing, so use a bare div\n // wrapper to avoid compounding paddings.\n const HeaderEl = f.card ? CardHeader : 'div'\n const ContentEl = f.card ? CardContent : 'div'\n const headerCls = cn(\n 'flex flex-col items-start gap-3 sm:flex-row sm:items-center sm:justify-between sm:gap-4',\n !f.card && 'mb-3',\n )\n\n const inner = (\n <>\n {/* The trigger + panel normally live together inside the toolbar (see\n `FilterControl`), which keeps the open/close state out of this\n component so toggling doesn't re-render the whole list body. The\n toolbar is suppressed in the standalone empty state, so mount a\n trigger-less instance here to keep the `F` hotkey working. */}\n {f.filters && !hasToolbarActions && (\n <FilterControl\n showTrigger={false}\n properties={visible}\n filters={columnFilters}\n onChange={handleFilterChange}\n resourceId={resourceId}\n t={t}\n />\n )}\n {hasHeader && (\n <HeaderEl className={headerCls}>\n {f.title ? <CardTitle>{resource.name}</CardTitle> : <span/>}\n {hasToolbarActions && (\n <div className=\"flex w-full flex-wrap items-center justify-end gap-2 sm:w-auto\">\n {f.refresh && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => records.refetch()}\n disabled={records.isFetching}\n aria-label={t('common:refresh')}\n >\n <RefreshCw className={records.isFetching ? 'size-4 animate-spin' : 'size-4'}/>\n </Button>\n </TooltipTrigger>\n <TooltipContent className=\"flex items-center gap-1.5\">\n <span>{t('common:refresh')}</span>\n <Kbd>R</Kbd>\n </TooltipContent>\n </Tooltip>\n )}\n {f.filters && (\n <FilterControl\n showTrigger\n properties={visible}\n filters={columnFilters}\n onChange={handleFilterChange}\n resourceId={resourceId}\n t={t}\n />\n )}\n {f.columns && (\n <ColumnVisibilityMenu table={table} properties={visible} t={t}/>\n )}\n {f.export && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() =>\n dialogs.open({\n render: ({ close }) => (\n <ExportDialog\n resourceId={resourceId}\n resourceLabel={resource.name}\n properties={visible}\n query={query}\n onClose={() => close()}\n />\n ),\n })\n }\n >\n <Download className=\"size-4\"/>\n <span className=\"hidden sm:inline\">{t('common:export')}</span>\n </Button>\n )}\n {showCustomResourceActions && (\n <ActionMenu\n actions={customResourceActions}\n onAction={async (action) => {\n if (hasActionComponent(action)) {\n openActionComponent(action)\n return\n }\n if (!await confirmGuard(action, dialogs)) return\n invokeResource.mutate(\n { actionName: action.name },\n {\n onSuccess: (res) => showActionNotice(notify, res.notice),\n onError: (err) => notify.error({ message: err.message }),\n },\n )\n }}\n t={t}\n trigger={(\n <Button variant=\"outline\" size=\"sm\" disabled={invokeResource.isPending}>\n <Zap className=\"size-4\"/>\n <span className=\"hidden sm:inline\">{t('common:actions')}</span>\n </Button>\n )}\n />\n )}\n {f.create && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button size=\"sm\" onClick={() => navigate({ name: 'new', resourceId })}>\n <Plus className=\"size-4\"/>\n <span className=\"hidden sm:inline\">{t('common:new')}</span>\n </Button>\n </TooltipTrigger>\n <TooltipContent className=\"flex items-center gap-1.5\">\n <span>{t('common:new')}</span>\n <Kbd>N</Kbd>\n </TooltipContent>\n </Tooltip>\n )}\n </div>\n )}\n {/* Mobile-only sort selector — desktop uses column header clicks */}\n {visible.some((p) => p.isSortable) && (\n <div className=\"flex w-full items-center gap-2 sm:hidden\">\n <ArrowUpDown className=\"size-4 shrink-0 text-muted-foreground\"/>\n <Select\n value={\n sorting[0]\n ? `${sorting[0].id}:${sorting[0].desc ? 'desc' : 'asc'}`\n : '_none_'\n }\n onValueChange={(v) => {\n if (v === '_none_') {\n handleSortingChange([])\n return\n }\n const sep = v.lastIndexOf(':')\n handleSortingChange([{ id: v.slice(0, sep), desc: v.slice(sep + 1) === 'desc' }])\n }}\n >\n <SelectTrigger className=\"h-8 flex-1\">\n <SelectValue placeholder={t('common:sortBy')}/>\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"_none_\">{t('common:sortBy')}: —</SelectItem>\n {visible\n .filter((p) => p.isSortable)\n .flatMap((p) => [\n <SelectItem key={`${p.path}:asc`} value={`${p.path}:asc`}>\n {p.label} ↑\n </SelectItem>,\n <SelectItem key={`${p.path}:desc`} value={`${p.path}:desc`}>\n {p.label} ↓\n </SelectItem>,\n ])}\n </SelectContent>\n </Select>\n </div>\n )}\n </HeaderEl>\n )}\n <ContentEl className=\"flex flex-1 flex-col gap-2 sm:gap-3\">\n {showStandaloneEmptyState ? (\n <Empty>\n <EmptyHeader>\n <EmptyMedia>\n <Inbox/>\n </EmptyMedia>\n <EmptyTitle>{t('common:noRecords')}</EmptyTitle>\n {f.create && (\n <EmptyDescription>\n {t('common:noRecordsHint', { resource: resource.name })}\n </EmptyDescription>\n )}\n </EmptyHeader>\n {f.create && (\n <EmptyContent>\n <Button size=\"sm\" onClick={() => navigate({ name: 'new', resourceId })}>\n <Plus className=\"size-4\"/>\n {t('common:new')}\n </Button>\n </EmptyContent>\n )}\n </Empty>\n ) : showFilteredEmptyState ? (\n // Filters are active but match nothing. The toolbar (with its filter\n // button) stays visible above, so here we only offer a quick reset.\n <Empty>\n <EmptyHeader>\n <EmptyMedia>\n <ListFilter/>\n </EmptyMedia>\n <EmptyTitle>{t('common:noMatchingRecords')}</EmptyTitle>\n </EmptyHeader>\n <EmptyContent>\n <Button variant=\"outline\" size=\"sm\" onClick={() => handleFilterChange([])}>\n <X className=\"size-4\"/>\n {t('common:clearFilters')}\n </Button>\n </EmptyContent>\n </Empty>\n ) : (\n <>\n {/* Bulk action bar — only visible when at least one row is selected.\n Sits above the list so the user can act on the selection without\n having to scroll. Mirrors a typical email-client multi-select. */}\n {f.bulk && selectedCount > 0 && (\n <div\n className=\"flex flex-row items-center justify-between gap-2 rounded-md border border-primary/30 bg-primary/5 px-3 py-2\">\n <div className=\"min-w-0 truncate text-sm font-medium\">\n {t('common:selectedCount', { count: selectedCount })}\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setRowSelection({})}\n disabled={bulkRemove.isPending}\n >\n <X className=\"size-4\"/>\n <span className=\"hidden sm:inline\">{t('common:clearSelection')}</span>\n </Button>\n {customBulkActions.length > 0 && (\n <ActionMenu\n actions={customBulkActions}\n onAction={async (action) => {\n if (hasActionComponent(action)) {\n // The component collects the payload and runs the\n // action itself; clearing the selection is deferred\n // until it actually succeeds.\n openActionComponent(action, {\n recordIds: selectedIds,\n onSuccess: () => setRowSelection({}),\n })\n return\n }\n if (!await confirmGuard(action, dialogs)) return\n invokeBulk.mutate(\n { actionName: action.name, ids: selectedIds },\n {\n onSuccess: (res) => {\n setRowSelection({})\n showActionNotice(notify, res.notice)\n },\n onError: (err) => notify.error({ message: err.message }),\n },\n )\n }}\n t={t}\n trigger={(\n <Button variant=\"outline\" size=\"sm\" disabled={invokeBulk.isPending}>\n <Zap className=\"size-4\"/>\n <span className=\"hidden sm:inline\">{t('common:actions')}</span>\n </Button>\n )}\n />\n )}\n <Button\n variant=\"destructive\"\n size=\"sm\"\n onClick={handleBulkDelete}\n disabled={bulkRemove.isPending}\n >\n <Trash2 className=\"size-4\"/>\n <span className=\"hidden sm:inline\">{t('common:deleteSelected')}</span>\n </Button>\n </div>\n </div>\n )}\n {/* Mobile: card-per-record stack. Hidden ≥ sm. */}\n <div className=\"space-y-2 sm:hidden\">\n {showSkeletons && Array.from({ length: pagination.pageSize }, (_, i) => (\n <div key={`skel-card-${i}`} className=\"rounded-lg border border-border bg-card p-3\">\n <div className=\"flex items-start gap-3\">\n <Skeleton className=\"mt-1 h-4 w-4 flex-none rounded\"/>\n <div className=\"flex-1 space-y-2\">\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 space-y-1.5\">\n <Skeleton className=\"h-4 w-32\"/>\n <Skeleton className=\"h-3 w-16\"/>\n </div>\n <Skeleton className=\"h-7 w-7 shrink-0 rounded\"/>\n </div>\n <div className=\"mt-3 grid grid-cols-2 gap-x-3 gap-y-2\">\n {Array.from({ length: 4 }, (_, j) => (\n <div key={j} className=\"space-y-1\">\n <Skeleton className=\"h-2.5 w-14\"/>\n <Skeleton className={`h-4 ${SKEL_WIDTHS[(i * 3 + j) % SKEL_WIDTHS.length]}`}/>\n </div>\n ))}\n </div>\n </div>\n </div>\n </div>\n ))}\n {!showSkeletons && records.isError && (\n <div className=\"rounded-md border border-border px-4 py-8 text-left text-destructive\">\n {t('common:loadFailed', { error: String(records.error) })}\n </div>\n )}\n {!showSkeletons && table.getRowModel().rows.map((row) => (\n <RecordCard\n key={row.id}\n record={row.original}\n properties={visible.filter((p) =>\n table.getColumn(p.path)?.getIsVisible() ?? true,\n )}\n resourceId={resourceId}\n showSelect={showSelectColumn}\n selected={row.getIsSelected()}\n onToggleSelect={(v) => row.toggleSelected(v)}\n onView={() => navigate({ name: 'show', resourceId, recordId: row.original.id })}\n onEdit={() => navigate({ name: 'edit', resourceId, recordId: row.original.id })}\n onDelete={makeDeleteHandler(row.original)}\n customActions={customRecordActions}\n onInvokeAction={makeInvokeRecordHandler(row.original)}\n t={t}\n />\n ))}\n </div>\n\n {/* Desktop: tabular layout. Hidden < sm.\n `cursor-grab` is a hint that the table can be dragged\n horizontally; the actual drag handlers live in\n `tableWrapperRef`. The grip on column resize handles takes\n precedence (cursor-col-resize is set on a child) so users\n still get the right cursor while resizing. */}\n <div\n ref={tableWrapperRef}\n className=\"relative hidden cursor-grab overflow-x-auto rounded-md border border-border sm:block\"\n >\n {(() => {\n // Distribute leftover wrapper space proportionally across data columns\n // so the table always fills the full wrapper width.\n // _select and _actions keep their fixed sizes; only data columns stretch.\n const leafCols = table.getVisibleLeafColumns()\n const totalSize = table.getCenterTotalSize()\n const wrapperW = wrapperWidth > 0 ? wrapperWidth : totalSize\n const extra = Math.max(0, wrapperW - totalSize)\n\n // _select (checkbox) and _actions stay fixed-width; only data\n // columns participate in proportional stretch.\n const fixedIds = new Set(['_select', '_actions'])\n const stretchCols = leafCols.filter((c) => !fixedIds.has(c.id))\n const stretchBaseTotal = stretchCols.reduce((s, c) => s + c.getSize(), 0)\n\n // Pre-compute each column's rendered pixel width (base + proportional boost).\n const renderedWidth = new Map<string, number>(\n leafCols.map((c) => [c.id, c.getSize()]),\n )\n if (extra > 0 && stretchBaseTotal > 0) {\n let assigned = 0\n stretchCols.forEach((c, i) => {\n const share =\n i === stretchCols.length - 1\n ? extra - assigned\n : Math.floor((extra * c.getSize()) / stretchBaseTotal)\n renderedWidth.set(c.id, c.getSize() + share)\n assigned += share\n })\n }\n\n const renderedTotal = totalSize + extra\n const sizeOf = (colId: string, base: number): number =>\n renderedWidth.get(colId) ?? base\n\n // Resize guide: compute left offset using rendered (boosted) widths.\n const resizingHeader = table.getHeaderGroups()\n .flatMap((hg) => hg.headers)\n .find((h) => h.column.getIsResizing())\n const deltaOffset = table.getState().columnSizingInfo.deltaOffset ?? 0\n const resizeLeft = resizingHeader\n ? leafCols\n .slice(\n 0,\n leafCols.findIndex((c) => c.id === resizingHeader.column.id) + 1,\n )\n .reduce((s, c) => s + (renderedWidth.get(c.id) ?? c.getSize()), 0) +\n deltaOffset\n : 0\n\n return (\n <div className=\"relative\" style={{ width: renderedTotal }}>\n {/* Use a raw <table> instead of the shadcn <Table> wrapper:\n <Table> renders an internal <div className=\"overflow-auto\">\n which becomes the containing block for sticky cells, pinning\n them to the off-screen right edge of the full table width\n rather than the visible scroll area. */}\n <table\n className=\"w-full caption-bottom text-sm\"\n style={{ tableLayout: 'fixed', width: renderedTotal }}\n >\n <TableHeader>\n {table.getHeaderGroups().map((hg) => (\n <TableRow key={hg.id}>\n {hg.headers.map((header) => (\n <TableHead\n key={header.id}\n style={{ width: sizeOf(header.column.id, header.getSize()) }}\n className={cn(\n 'relative select-none',\n header.column.id === '_actions' &&\n 'sticky right-0 z-20 bg-muted px-1 shadow-[-4px_0_8px_-6px_rgba(0,0,0,0.15)]',\n )}\n >\n {header.isPlaceholder\n ? null\n : flexRender(header.column.columnDef.header, header.getContext())}\n {header.column.getCanResize() && (\n <div\n data-resize-handle=\"\"\n onMouseDown={header.getResizeHandler()}\n onTouchStart={header.getResizeHandler()}\n onClick={(e) => e.stopPropagation()}\n onDoubleClick={() => header.column.resetSize()}\n className={cn(\n 'absolute right-0 top-0 z-10 h-full w-1.5 cursor-col-resize touch-none select-none bg-transparent hover:bg-primary/40',\n header.column.getIsResizing() && 'bg-primary',\n )}\n aria-hidden=\"true\"\n />\n )}\n </TableHead>\n ))}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n {showSkeletons ? (\n Array.from({ length: pagination.pageSize }, (_, i) => (\n // `aria-busy` marks these as placeholders: one is\n // rendered per page slot, so anything counting\n // rows (assistive tech, tests) would otherwise\n // read a full page of data that hasn't arrived.\n <TableRow\n key={`skel-${i}`}\n aria-busy=\"true\"\n className=\"pointer-events-none\"\n >\n {table.getVisibleLeafColumns().map((col, j) => (\n <TableCell\n key={col.id}\n style={{ width: sizeOf(col.id, col.getSize()) }}\n className={cn(\n col.id === '_actions' &&\n 'sticky right-0 z-10 bg-card px-1 shadow-[-4px_0_8px_-6px_rgba(0,0,0,0.15)]',\n )}\n >\n {col.id === '_select' ? (\n <Skeleton className=\"h-4 w-4 rounded\"/>\n ) : col.id === '_actions' ? (\n <Skeleton className=\"h-8 w-8 rounded\"/>\n ) : (\n <Skeleton className={`h-4 ${SKEL_WIDTHS[(i * 3 + j) % SKEL_WIDTHS.length]}`}/>\n )}\n </TableCell>\n ))}\n </TableRow>\n ))\n ) : records.isError ? (\n <TableRow>\n <TableCell colSpan={columns.length} className=\"py-8\">\n <div className=\"sticky left-4 w-fit text-destructive\">\n {t('common:loadFailed', { error: String(records.error) })}\n </div>\n </TableCell>\n </TableRow>\n ) : (\n table.getRowModel().rows.map((row) => (\n <TableRow\n key={row.id}\n data-state={row.getIsSelected() && 'selected'}\n className=\"group cursor-pointer\"\n onClick={(e) => {\n const target = e.target as HTMLElement\n if (target.closest('a, button, [role=\"menuitem\"], [role=\"checkbox\"]')) return\n if (disableRowNavigation) {\n row.toggleSelected(!row.getIsSelected())\n return\n }\n navigate({ name: 'edit', resourceId, recordId: row.original.id })\n }}\n onAuxClick={(e) => {\n if (e.button !== 1) return\n const target = e.target as HTMLElement\n if (target.closest('a, button, [role=\"menuitem\"]')) return\n if (disableRowNavigation) return\n e.preventDefault()\n openInNewTab({ name: 'edit', resourceId, recordId: row.original.id })\n }}\n onMouseDown={(e) => {\n if (e.button === 1) {\n const target = e.target as HTMLElement\n if (target.closest('a, button, [role=\"menuitem\"]')) return\n e.preventDefault()\n }\n }}\n >\n {row.getVisibleCells().map((cell) => (\n <TableCell\n key={cell.id}\n style={{ width: sizeOf(cell.column.id, cell.column.getSize()) }}\n className={cn(\n 'overflow-hidden',\n cell.column.id === '_actions' &&\n 'sticky right-0 z-10 bg-card px-1 shadow-[-4px_0_8px_-6px_rgba(0,0,0,0.15)] group-hover:bg-muted group-data-[state=selected]:bg-muted',\n )}\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </TableCell>\n ))}\n </TableRow>\n ))\n )}\n </TableBody>\n </table>\n {/* Vertical guide line follows the cursor while a column is being\n resized. Position is computed from rendered (boosted) widths. */}\n {resizingHeader && (\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute top-0 z-20 h-full w-px bg-primary\"\n style={{ left: resizeLeft }}\n />\n )}\n </div>\n )\n })()}\n </div>\n </>\n )}\n </ContentEl>\n </>\n )\n\n return (\n <div className={cn('flex flex-col', f.card ? 'min-h-full' : 'h-full')}>\n {f.breadcrumbs && (\n <PageBreadcrumbs\n className=\"mb-2 sm:mb-4\"\n items={[homeCrumb(t('common:home')), { label: resource.name }]}\n />\n )}\n {f.card ? (\n <Card className=\"flex flex-1 flex-col\">{inner}</Card>\n ) : (\n // Embedded mode (e.g. picker dialog): the table area scrolls\n // internally so the paginator below can sit flush at the host's\n // bottom edge, full-width, without a scrollbar gutter eating its\n // right side. `min-h-0` is required for `flex-1 overflow-y-auto`\n // inside a flex column to actually constrain its height. Horizontal\n // + top padding lives on the scroll container — the paginator is\n // a sibling so it stays edge-to-edge.\n <div\n className={cn(\n 'flex min-h-0 flex-1 flex-col',\n // `embedPadding` doubles as the \"self-contained scroll box\" flag:\n // the picker dialog is a fixed-height host, so the table area\n // scrolls internally (`overflow-y-auto`) with its own padding.\n // The related-records embed flows in the page — no internal\n // vertical scroll, no padding — so the host scrollbar is the\n // only one and the vertical gutter here disappears.\n embedPadding && 'overflow-y-auto px-6 pt-4',\n )}\n >\n {inner}\n </div>\n )}\n {!isEmpty && (\n // Standalone page mode: sticky at the page-wrapper level so the\n // paginator pins to the viewport bottom while the user scrolls\n // through the list. The bar extends edge-to-edge via negative\n // margins that exactly cancel the main scroll-container padding\n // (`px-4 sm:px-6`) so it sits flush against the screen edges with\n // no visible gutter. Right padding (`pr-14 sm:pr-16`) reserves\n // space for the floating AI assistant widget (`fixed bottom-4\n // right-4`, ~40px wide) so pagination buttons never slide under\n // it. A top shadow lifts the bar visually off the table when the\n // user is mid-scroll.\n //\n // Embedded mode (`card: false`, e.g. picker dialog): plain flex\n // child below the scrollable table area. No sticky, no scrollbar\n // gutter interference — the bar spans the host's full width and\n // sits directly above whatever the host renders next (e.g.\n // DialogFooter).\n <div\n className={cn(\n 'border-t border-border bg-card py-3',\n f.card\n ? 'sticky bottom-0 -mb-px z-20 -mx-2 mt-0 px-2 pr-14 shadow-[0_-4px_8px_-6px_rgba(0,0,0,0.08)] sm:-mx-6 sm:px-6 sm:pr-16'\n : cn('shrink-0', embedPadding && 'px-6'),\n )}\n >\n <Paginator table={table} total={total} t={t}/>\n </div>\n )}\n </div>\n )\n}\n\nfunction SortHeader({\n property,\n state,\n onSort,\n}: {\n property: PropertyJSON\n state: 'none' | 'asc' | 'desc'\n onSort(): void\n}): React.ReactElement {\n if (!property.isSortable) {\n return <span className=\"font-semibold\">{property.label}</span>\n }\n const Icon = state === 'asc' ? ArrowUp : state === 'desc' ? ArrowDown : ArrowUpDown\n return (\n <button\n type=\"button\"\n onClick={onSort}\n className=\"-ml-2 inline-flex h-8 items-center gap-1 rounded-md px-2 font-semibold hover:bg-accent hover:text-accent-foreground\"\n >\n {property.label}\n <Icon className=\"size-3.5 opacity-60\"/>\n </button>\n )\n}\n\nfunction CellContent({\n resourceId,\n recordId,\n property,\n value,\n populated,\n}: {\n resourceId: string\n recordId: string\n property: PropertyJSON\n value: unknown\n populated?: Record<string, unknown>\n}): React.ReactElement {\n if (property.isId) {\n return (\n <Link\n to={{ name: 'show', resourceId, recordId }}\n className=\"font-mono text-sm font-medium text-foreground hover:underline\"\n onClick={(e) => e.stopPropagation()}\n >\n {String(value ?? '')}\n </Link>\n )\n }\n // m2m properties also set `reference` + `isArray`, but their value is an\n // array of `{ id, ...extras }` objects — not scalar FKs. Hand them off to\n // PropertyDisplay so its dedicated `case 'm2m'` branch can extract ids.\n if (property.reference && property.type !== 'm2m' && value != null && value !== '') {\n if (property.isArray) {\n const ids = Array.isArray(value) ? (value as Array<string | number>) : []\n return (\n <ReferenceLinkList\n resourceId={property.reference}\n recordIds={ids}\n populated={populated}\n populatedKeyPrefix={property.path}\n />\n )\n }\n // The list endpoint pre-populates scalar references in batch\n // (`record.populated[property.path]`), so we hand the inline record to\n // <ReferenceLink> and avoid the per-row `show` request.\n const populatedRecord = populated?.[property.path] as\n | { id?: string; title?: string }\n | undefined\n return (\n <ReferenceLink\n resourceId={property.reference}\n recordId={value as string | number}\n populated={populatedRecord}\n />\n )\n }\n return <PropertyDisplay property={property} value={value} view=\"list\" populated={populated}/>\n}\n\nfunction RowActions({\n record,\n onView,\n onEdit,\n onDelete,\n onInvokeAction,\n customActions = [],\n t,\n}: {\n /** Drives per-row visibility via `record.recordActions` — the server's\n * `isVisible`/`isAccessible` verdict for this specific row. */\n record: RecordJSON\n onView(): void\n onEdit(): void\n onDelete(): void\n onInvokeAction?(action: ActionDescriptor): void\n customActions?: ActionDescriptor[]\n t: (key: string, params?: Record<string, string | number>) => string\n}): React.ReactElement {\n const rowActions = visibleRecordActions(customActions, record)\n const canShow = isActionAllowedForRecord('show', record)\n const canEdit = isActionAllowedForRecord('edit', record)\n const canDelete = isActionAllowedForRecord('delete', record)\n return (\n <div className=\"flex justify-end\" onClick={(e) => e.stopPropagation()}>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"size-8\">\n <MoreHorizontal className=\"size-4\"/>\n <span className=\"sr-only\">{t('common:openMenu')}</span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuLabel>{t('common:actions')}</DropdownMenuLabel>\n {canShow && (\n <DropdownMenuItem onSelect={onView}>\n <Eye className=\"size-4\"/> {t('common:show')}\n </DropdownMenuItem>\n )}\n {canEdit && (\n <DropdownMenuItem onSelect={onEdit}>\n <Pencil className=\"size-4\"/> {t('common:edit')}\n </DropdownMenuItem>\n )}\n {rowActions.length > 0 && (\n <>\n <DropdownMenuSeparator/>\n <ActionMenuItems\n actions={rowActions}\n onAction={(action) => onInvokeAction?.(action)}\n />\n </>\n )}\n {canDelete && (\n <>\n <DropdownMenuSeparator/>\n <DropdownMenuItem onSelect={onDelete} className=\"text-destructive focus:text-destructive\">\n <Trash2 className=\"size-4\"/> {t('common:delete')}\n </DropdownMenuItem>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n )\n}\n\nfunction ColumnVisibilityMenu<TData>({\n table,\n properties,\n t,\n}: {\n table: ReturnType<typeof useReactTable<TData>>\n properties: PropertyJSON[]\n t: (key: string, params?: Record<string, string | number>) => string\n}): React.ReactElement {\n const labelMap = new Map(properties.map((p) => [p.path, p.label]))\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" size=\"sm\">\n <SlidersHorizontal className=\"size-4\"/>\n <span className=\"hidden sm:inline\">{t('common:columns')}</span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-48\">\n <DropdownMenuLabel>{t('common:toggleColumns')}</DropdownMenuLabel>\n <DropdownMenuSeparator/>\n {table\n .getAllColumns()\n .filter((c) => c.getCanHide())\n .map((column) => (\n <DropdownMenuCheckboxItem\n key={column.id}\n checked={column.getIsVisible()}\n onCheckedChange={(v) => column.toggleVisibility(!!v)}\n onSelect={(e) => e.preventDefault()}\n >\n {labelMap.get(column.id) ?? column.id}\n </DropdownMenuCheckboxItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\n/** Sliding window of up to `windowSize` page indices centred on `pageIndex`. */\nfunction getPageRange(pageIndex: number, pageCount: number, windowSize = 10): number[] {\n if (pageCount <= 0) return []\n const half = Math.floor(windowSize / 2)\n let start = pageIndex - half\n let end = start + windowSize\n if (start < 0) {\n start = 0\n end = windowSize\n }\n if (end > pageCount) {\n end = pageCount\n start = Math.max(0, end - windowSize)\n }\n return Array.from({ length: end - start }, (_, i) => start + i)\n}\n\nfunction Paginator<TData>({\n table,\n total,\n t,\n}: {\n table: ReturnType<typeof useReactTable<TData>>\n total: number\n t: (key: string, params?: Record<string, string | number>) => string\n}): React.ReactElement {\n const { pageIndex, pageSize } = table.getState().pagination\n const pageCount = table.getPageCount()\n const pages = getPageRange(pageIndex, pageCount)\n // Click-and-drag horizontal scroll on the page-buttons row, mirroring the\n // table wrapper. Callback ref returns a cleanup so React 19 detaches the\n // pointer listeners automatically when the row unmounts.\n const paginationScrollRef = React.useCallback((el: HTMLDivElement | null) => {\n if (!el) return\n return attachDragScroll(el)\n }, [])\n const perPageSelect = (\n <Select\n value={String(pageSize)}\n onValueChange={(v) => table.setPageSize(Number(v))}\n >\n <SelectTrigger className=\"h-8 w-[72px]\">\n <SelectValue/>\n </SelectTrigger>\n <SelectContent>\n {PAGE_SIZES.map((s) => (\n <SelectItem key={s} value={String(s)}>\n {s}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )\n return (\n <div className=\"flex w-full min-w-0 flex-col gap-3 px-1 sm:flex-row sm:items-center sm:justify-between\">\n {/* Top row on mobile (records count + per-page select side-by-side);\n on desktop just the records-count label on the left. */}\n <div className=\"flex items-center justify-between gap-3 sm:justify-start\">\n <div className=\"text-sm text-muted-foreground\">\n {t('common:recordsCount', { count: total })}\n </div>\n {/* Mobile-only per-page select inline with records count. */}\n <div className=\"sm:hidden\">{perPageSelect}</div>\n </div>\n {/* `min-w-0` on the right block is critical: without it, the flex item\n takes its content's intrinsic width on mobile (the buttons row is\n ~460px) and overflows the panel to the left. */}\n <div className=\"flex min-w-0 flex-col items-center gap-2 sm:flex-row\">\n {/* Desktop-only per-page label + select next to the pagination buttons. */}\n <div className=\"hidden items-center gap-2 sm:flex\">\n <span className=\"text-sm text-muted-foreground\">\n {t('common:rowsPerPage')}\n </span>\n {perPageSelect}\n </div>\n {/* Page navigation — scrollable + drag-scrollable on narrow screens.\n `max-w-full` clamps to parent width so overflow-x-auto actually\n activates; without it the inner buttons row would expand the\n container instead of scrolling internally. `cursor-grab` hints the\n drag affordance; buttons keep their own `cursor-pointer`. */}\n <div ref={paginationScrollRef} className=\"max-w-full cursor-grab overflow-x-auto\">\n <div className=\"flex items-center gap-1\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => table.setPageIndex(0)}\n disabled={!table.getCanPreviousPage()}\n aria-label={t('common:firstPage')}\n >\n <ChevronsLeft className=\"size-4\"/>\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n aria-label={t('common:previousPage')}\n >\n <ChevronLeft className=\"size-4\"/>\n </Button>\n {pages.map((p) => (\n <Button\n key={p}\n variant={p === pageIndex ? 'default' : 'outline'}\n size=\"sm\"\n className=\"text-xs\"\n onClick={() => table.setPageIndex(p)}\n aria-current={p === pageIndex ? 'page' : undefined}\n >\n {p + 1}\n </Button>\n ))}\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n aria-label={t('common:nextPage')}\n >\n <ChevronRight className=\"size-4\"/>\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => table.setPageIndex(pageCount - 1)}\n disabled={!table.getCanNextPage()}\n aria-label={t('common:lastPage')}\n >\n <ChevronsRight className=\"size-4\"/>\n </Button>\n </div>\n </div>\n </div>\n </div>\n )\n}\n\n// ─── Numeric filter with operator selector ────────────────────────────────────\n\nfunction NumericFilterField({\n value,\n onChange,\n t,\n}: {\n value: string\n onChange(v: unknown): void\n t: (key: string, params?: Record<string, string | number>) => string\n}): React.ReactElement {\n const parsed = parseNumericFilter(value)\n const [op, setOp] = React.useState<NumericFilterOp>(parsed.op)\n const [from, setFrom] = React.useState(parsed.from)\n const [to, setTo] = React.useState(parsed.to)\n\n React.useEffect(() => {\n const next = parseNumericFilter(value)\n setOp(next.op)\n setFrom(next.from)\n setTo(next.to)\n }, [value])\n\n const emit = (nextOp: NumericFilterOp, nextFrom: string, nextTo: string) => {\n setOp(nextOp)\n setFrom(nextFrom)\n setTo(nextTo)\n onChange(encodeNumericFilter(nextOp, nextFrom, nextTo))\n }\n\n const handleOpChange = (nextOp: NumericFilterOp) => {\n if (NUMERIC_NULLARY.has(nextOp)) {\n emit(nextOp, '', '')\n } else {\n emit(nextOp, from, nextOp === 'between' ? to : '')\n }\n }\n\n return (\n <div className=\"space-y-2\">\n <Select value={op} onValueChange={(v) => handleOpChange(v as NumericFilterOp)}>\n <SelectTrigger className=\"h-7 text-xs\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {ALL_NUMERIC_OPS.map((o) => (\n <SelectItem key={o} value={o} className=\"text-xs\">\n {t(`filter:op.${o}`)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {op === 'between' ? (\n <div className=\"flex gap-2\">\n <Input\n type=\"number\"\n className=\"h-8\"\n value={from}\n placeholder={t('common:from')}\n onChange={(e) => emit('between', e.target.value, to)}\n />\n <Input\n type=\"number\"\n className=\"h-8\"\n value={to}\n placeholder={t('common:to')}\n onChange={(e) => emit('between', from, e.target.value)}\n />\n </div>\n ) : !NUMERIC_NULLARY.has(op) ? (\n <Input\n type=\"number\"\n className=\"h-8\"\n value={from}\n placeholder={t('common:any')}\n onChange={(e) => emit(op, e.target.value, '')}\n />\n ) : null}\n </div>\n )\n}\n\n// ─── Filter trigger + panel ──────────────────────────────────────────────────\n\n/** How many filter fields the panel mounts per frame. Sized so a chunk fits\n * comfortably in one frame's budget while still filling the visible part of\n * the panel on the first couple of frames. */\nconst FILTER_FIELD_MOUNT_CHUNK = 3\n\n/** Owns the filter sheet's open state, the `F` hotkey and (optionally) the\n * toolbar trigger button.\n *\n * The state deliberately lives here rather than in `ResourceListPage`: the\n * list body is a large tree (a full table plus the mobile card list), so a\n * toggle stored on the page re-rendered all of it *before* Radix could mount\n * the sheet, delaying the slide-in by 110-200ms. Keeping it in this leaf means\n * opening the panel only re-renders the trigger and the panel itself.\n *\n * Colocating the trigger with the panel is safe because the sheet renders\n * through a portal, so its position in this tree doesn't affect its layout. */\nfunction FilterControl({\n showTrigger,\n properties,\n filters,\n onChange,\n resourceId,\n t,\n}: {\n showTrigger: boolean\n properties: PropertyJSON[]\n filters: ColumnFiltersState\n onChange(next: ColumnFiltersState): void\n resourceId: string\n t: (key: string, params?: Record<string, string | number>) => string\n}): React.ReactElement {\n const [open, setOpen] = React.useState(false)\n useHotkey('f', () => setOpen((v) => !v), { description: t('common:filters') })\n\n return (\n <>\n {showTrigger && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" onClick={() => setOpen(true)}>\n <ListFilter className=\"size-4\"/>\n <span className=\"hidden sm:inline\">{t('common:filters')}</span>\n {filters.length > 0 && (\n <Badge className=\"ml-1 h-5 rounded-full px-1.5 text-xs\">\n {filters.length}\n </Badge>\n )}\n </Button>\n </TooltipTrigger>\n <TooltipContent className=\"flex items-center gap-1.5\">\n <span>{t('common:filters')}</span>\n <Kbd>F</Kbd>\n </TooltipContent>\n </Tooltip>\n )}\n <FilterPanel\n open={open}\n onOpenChange={setOpen}\n properties={properties}\n filters={filters}\n onChange={onChange}\n resourceId={resourceId}\n t={t}\n />\n </>\n )\n}\n\n// ─── Filter panel (side sheet) ───────────────────────────────────────────────\n\nfunction FilterPanel({\n open,\n onOpenChange,\n properties,\n filters,\n onChange,\n resourceId,\n t,\n}: {\n open: boolean\n onOpenChange(open: boolean): void\n properties: PropertyJSON[]\n filters: ColumnFiltersState\n onChange(next: ColumnFiltersState): void\n resourceId: string\n t: (key: string, params?: Record<string, string | number>) => string\n}): React.ReactElement {\n const [draft, setDraft] = React.useState<ColumnFiltersState>(filters)\n React.useEffect(() => {\n if (open) setDraft(filters)\n }, [open, filters])\n const draftMap = new Map(draft.map((f) => [f.id, f.value]))\n\n // Every FilterField mounts a Select/Popover primitive and, for low-cardinality\n // string fields, a full checkbox list of distinct values — ~830 DOM nodes and\n // ~170ms of render for a typical resource. Mounting them all in one pass\n // stalled the sheet's slide-in: first while blocking the click handler, then\n // (once deferred) as a single un-interruptible commit mid-animation.\n //\n // So they mount a few per frame instead. Fields not yet mounted render as\n // skeletons of the same shape, and the whole list is in the DOM within a\n // handful of frames — no field is permanently withheld, which keeps\n // find-in-page and label-based queries working.\n const [mountedCount, setMountedCount] = React.useState(0)\n React.useEffect(() => {\n if (!open) {\n setMountedCount(0)\n return\n }\n if (mountedCount >= properties.length) return\n const id = requestAnimationFrame(() => {\n React.startTransition(() => {\n setMountedCount((n) => Math.min(n + FILTER_FIELD_MOUNT_CHUNK, properties.length))\n })\n })\n return () => cancelAnimationFrame(id)\n }, [open, mountedCount, properties.length])\n\n const setDraftFilter = (id: string, value: unknown) => {\n const without = draft.filter((f) => f.id !== id)\n setDraft(value != null && value !== '' ? [...without, { id, value }] : without)\n }\n\n const handleApply = () => {\n onChange(draft)\n onOpenChange(false)\n }\n\n const handleClearAll = () => {\n setDraft([])\n onChange([])\n }\n\n return (\n <Sheet open={open} onOpenChange={onOpenChange}>\n <SheetContent\n side=\"right\"\n className=\"flex w-full flex-col gap-0 p-0 sm:max-w-md\"\n aria-describedby={undefined}\n >\n <SheetHeader\n className=\"flex-none flex-row items-center justify-between space-y-0 border-b border-border px-4 py-3 pr-12\">\n <div className=\"flex items-center gap-2\">\n <SheetTitle>{t('common:filters')}</SheetTitle>\n {draft.length > 0 && (\n <Badge className=\"h-5 rounded-full px-1.5 text-xs\">{draft.length}</Badge>\n )}\n </div>\n {draft.length > 0 && (\n <Button variant=\"ghost\" size=\"sm\" onClick={handleClearAll}>\n {t('common:clearAll')}\n </Button>\n )}\n </SheetHeader>\n\n <ScrollArea className=\"min-h-0 flex-1\">\n <div className=\"space-y-5 px-4 py-4\">\n {properties.map((p, i) =>\n i < mountedCount ? (\n <FilterField\n key={p.path}\n property={p}\n value={draftMap.get(p.path) as string | undefined}\n onChange={(v) => setDraftFilter(p.path, v)}\n valueFrom={draftMap.get(p.path + '~~from') as string | undefined}\n valueTo={draftMap.get(p.path + '~~to') as string | undefined}\n onChangeFrom={(v) => setDraftFilter(p.path + '~~from', v)}\n onChangeTo={(v) => setDraftFilter(p.path + '~~to', v)}\n resourceId={resourceId}\n t={t}\n />\n ) : (\n <div key={p.path} className=\"space-y-1.5\">\n <Skeleton className=\"h-4 w-24\"/>\n <Skeleton className=\"h-8 w-full\"/>\n </div>\n ),\n )}\n </div>\n </ScrollArea>\n\n <div className=\"flex flex-none border-t border-border p-4\">\n <Button className=\"w-full\" onClick={handleApply}>\n {t('common:applyFilters')}\n </Button>\n </div>\n </SheetContent>\n </Sheet>\n )\n}\n\n// ─── Filter field (generic wrapper per property) ─────────────────────────────\n\nfunction FilterField({\n property,\n value,\n onChange,\n valueFrom,\n valueTo,\n onChangeFrom,\n onChangeTo,\n resourceId,\n t,\n}: {\n property: PropertyJSON\n value: string | undefined\n onChange(v: unknown): void\n valueFrom?: string\n valueTo?: string\n onChangeFrom?(v: unknown): void\n onChangeTo?(v: unknown): void\n resourceId: string\n t: (key: string, params?: Record<string, string | number>) => string\n}): React.ReactElement {\n const isDateType = property.type === 'date' || property.type === 'datetime'\n return (\n <div className=\"space-y-1.5\">\n <Label className=\"text-sm font-medium\">{property.label}</Label>\n {isDateType ? (\n <DateRangeFilter\n mode={property.type as 'date' | 'datetime'}\n from={valueFrom}\n to={valueTo}\n onFromChange={onChangeFrom ?? onChange}\n onToChange={onChangeTo ?? onChange}\n t={t}\n />\n ) : (\n <FilterInput\n property={property}\n value={value ?? ''}\n onChange={onChange}\n resourceId={resourceId}\n t={t}\n />\n )}\n </div>\n )\n}\n\nfunction DateRangeFilter({\n mode,\n from,\n to,\n onFromChange,\n onToChange,\n t,\n}: {\n mode: 'date' | 'datetime'\n from: string | undefined\n to: string | undefined\n onFromChange(v: unknown): void\n onToChange(v: unknown): void\n t: (key: string, params?: Record<string, string | number>) => string\n}): React.ReactElement {\n return (\n <div className=\"space-y-2\">\n <div className=\"space-y-1\">\n <span className=\"text-xs text-muted-foreground\">{t('common:from')}</span>\n <DatePicker\n mode={mode}\n value={from ?? ''}\n onChange={(v) => onFromChange(v)}\n ariaLabel={t('common:from')}\n />\n </div>\n <div className=\"space-y-1\">\n <span className=\"text-xs text-muted-foreground\">{t('common:to')}</span>\n <DatePicker\n mode={mode}\n value={to ?? ''}\n onChange={(v) => onToChange(v)}\n ariaLabel={t('common:to')}\n />\n </div>\n </div>\n )\n}\n\n// ─── Filter input (dispatches to type-specific UIs) ──────────────────────────\n\nfunction FilterInput({\n property,\n value,\n onChange,\n resourceId,\n t,\n}: {\n property: PropertyJSON\n value: string\n onChange(v: unknown): void\n resourceId: string\n t: (key: string, params?: Record<string, string | number>) => string\n}): React.ReactElement {\n // Reference field → combobox backed by the referenced resource's search action\n if (property.reference && !property.isArray) {\n return (\n <ReferenceCombobox\n referenceResourceId={property.reference}\n value={value || null}\n onChange={(v) => onChange(v ?? '')}\n placeholder={t('common:any')}\n />\n )\n }\n\n // Enum / available values → Select\n if (property.availableValues?.length) {\n return (\n <Select value={value || '_any_'} onValueChange={(v) => onChange(v === '_any_' ? '' : v)}>\n <SelectTrigger className=\"h-8\">\n <SelectValue placeholder={t('common:any')}/>\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"_any_\">{t('common:any')}</SelectItem>\n {property.availableValues.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )\n }\n\n switch (property.type) {\n case 'boolean':\n return (\n <Select value={value || '_any_'} onValueChange={(v) => onChange(v === '_any_' ? '' : v)}>\n <SelectTrigger className=\"h-8\">\n <SelectValue placeholder={t('common:any')}/>\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"_any_\">{t('common:any')}</SelectItem>\n <SelectItem value=\"true\">{t('common:yes')}</SelectItem>\n <SelectItem value=\"false\">{t('common:no')}</SelectItem>\n </SelectContent>\n </Select>\n )\n case 'number':\n case 'float':\n case 'money':\n case 'currency':\n return (\n <NumericFilterField\n value={value}\n onChange={onChange}\n t={t}\n />\n )\n default:\n return (\n <StringFilterField\n property={property}\n value={value}\n onChange={onChange}\n resourceId={resourceId}\n t={t}\n />\n )\n }\n}\n\n// ─── String filter with operator selector + value picker ─────────────────────\n\nfunction StringFilterField({\n property,\n value,\n onChange,\n resourceId,\n t,\n}: {\n property: PropertyJSON\n value: string\n onChange(v: unknown): void\n resourceId: string\n t: (key: string, params?: Record<string, string | number>) => string\n}): React.ReactElement {\n const parsed = parseFilterString(value)\n const [op, setOp] = React.useState<StringFilterOp>(parsed.op)\n const [val, setVal] = React.useState(parsed.val)\n\n // Sync local state when external value changes (e.g. from URL update).\n React.useEffect(() => {\n const next = parseFilterString(value)\n setOp(next.op)\n setVal(next.val)\n }, [value])\n\n // Auto-detect: fetch distinct values to see if field is low-cardinality.\n const { data: distinctData } = useDistinctValues(resourceId, property.path, {\n limit: 101,\n })\n const isLowCardinality = distinctData != null && !distinctData.hasMore\n const distinctValues = distinctData?.values ?? []\n\n // Default to \"is one of\" only for fields with few distinct values; fields with\n // more choices default to \"contains\" (free-text) since a long checkbox list is\n // unwieldy.\n const shouldDefaultToOneOf = isLowCardinality && distinctValues.length <= ONE_OF_DEFAULT_MAX\n\n // If few distinct values, no existing filter, and default op (co with empty\n // val): auto-switch to \"is one of\" mode to match Metabase behavior.\n const autoSwitchedRef = React.useRef(false)\n React.useEffect(() => {\n if (autoSwitchedRef.current) return\n if (shouldDefaultToOneOf && !value && op === 'co' && val === '') {\n autoSwitchedRef.current = true\n setOp('in')\n }\n }, [shouldDefaultToOneOf, value, op, val])\n\n const emit = (nextOp: StringFilterOp, nextVal: string) => {\n setOp(nextOp)\n setVal(nextVal)\n onChange(encodeFilter(nextOp, nextVal))\n }\n\n const handleOpChange = (nextOp: StringFilterOp) => {\n if (NULLARY_OPS.has(nextOp)) {\n emit(nextOp, '')\n } else if (nextOp === 'in') {\n // Switching to multi-select: clear text value\n emit(nextOp, '')\n } else {\n // Switching from multi-select to text: clear value\n emit(nextOp, op === 'in' ? '' : val)\n }\n }\n\n return (\n <div className=\"space-y-2\">\n {/* Operator selector */}\n <Select value={op} onValueChange={(v) => handleOpChange(v as StringFilterOp)}>\n <SelectTrigger className=\"h-7 text-xs\">\n <SelectValue/>\n </SelectTrigger>\n <SelectContent>\n {ALL_STRING_OPS.map((o) => (\n <SelectItem key={o} value={o} className=\"text-xs\">\n {t(`filter:op.${o}`)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n\n {/* Value input based on operator */}\n {op === 'in' ? (\n <FilterValuePicker\n resourceId={resourceId}\n field={property.path}\n selected={val ? val.split(',') : []}\n onChange={(selected) => emit('in', selected.join(','))}\n preloadedValues={isLowCardinality ? distinctValues : undefined}\n t={t}\n />\n ) : !NULLARY_OPS.has(op) ? (\n <Input\n className=\"h-8\"\n value={val}\n placeholder={t('common:filterPlaceholder')}\n onChange={(e) => emit(op, e.target.value)}\n />\n ) : null}\n </div>\n )\n}\n\n// ─── Value picker (checkbox list with search, Metabase-style) ────────────────\n\nfunction FilterValuePicker({\n resourceId,\n field,\n selected,\n onChange,\n preloadedValues,\n t,\n}: {\n resourceId: string\n field: string\n selected: string[]\n onChange(selected: string[]): void\n /** Pre-fetched values for low-cardinality fields (avoids duplicate request). */\n preloadedValues?: string[]\n t: (key: string, params?: Record<string, string | number>) => string\n}): React.ReactElement {\n const [search, setSearch] = React.useState('')\n const selectedSet = React.useMemo(() => new Set(selected), [selected])\n\n // Fetch values from server (skipped when preloaded values are available).\n const needsServerSearch = preloadedValues == null\n const { data: serverData, isLoading } = useDistinctValues(\n resourceId,\n field,\n { search: needsServerSearch ? search : undefined, limit: 100, enabled: needsServerSearch },\n )\n\n // Client-side filter when using preloaded values, falling back to the\n // server-fetched distinct values otherwise.\n const displayValues = React.useMemo(() => {\n const allValues = preloadedValues ?? serverData?.values ?? []\n if (!preloadedValues || !search) return allValues\n const lower = search.toLowerCase()\n return allValues.filter((v) => v.toLowerCase().includes(lower))\n }, [preloadedValues, serverData?.values, search])\n\n const toggle = (val: string) => {\n if (selectedSet.has(val)) {\n onChange(selected.filter((v) => v !== val))\n } else {\n onChange([...selected, val])\n }\n }\n\n const handleSelectAll = () => {\n const allSelected = displayValues.length > 0 && displayValues.every((v) => selectedSet.has(v))\n if (allSelected) {\n // Deselect all currently visible values\n const visibleSet = new Set(displayValues)\n onChange(selected.filter((v) => !visibleSet.has(v)))\n } else {\n const allSet = new Set([...selected, ...displayValues])\n onChange(Array.from(allSet))\n }\n }\n\n return (\n <div className=\"space-y-2\">\n {/* Search input */}\n <div className=\"relative\">\n <Search\n className=\"pointer-events-none absolute left-2 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground\"/>\n <Input\n className=\"h-7 pl-7 text-xs\"\n value={search}\n placeholder={t('filter:searchValues')}\n onChange={(e) => setSearch(e.target.value)}\n />\n </div>\n\n {/* Select all */}\n {displayValues.length > 0 && (\n <div\n role=\"checkbox\"\n aria-checked={\n displayValues.length > 0 && displayValues.every((v) => selectedSet.has(v))\n ? true\n : displayValues.some((v) => selectedSet.has(v))\n ? 'mixed'\n : false\n }\n tabIndex={0}\n className=\"flex w-full cursor-pointer items-center gap-2 rounded px-1 py-0.5 text-xs text-muted-foreground hover:text-foreground\"\n onClick={handleSelectAll}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleSelectAll()\n }\n }}\n >\n <Checkbox\n className=\"pointer-events-none size-3.5\"\n tabIndex={-1}\n aria-hidden=\"true\"\n checked={\n displayValues.length > 0 && displayValues.every((v) => selectedSet.has(v))\n ? true\n : displayValues.some((v) => selectedSet.has(v))\n ? 'indeterminate'\n : false\n }\n />\n {t('filter:selectAll')}\n </div>\n )}\n\n {/* Value list */}\n <div className=\"max-h-48 overflow-y-auto\">\n <div className=\"space-y-0.5\">\n {isLoading && !preloadedValues ? (\n <div className=\"py-2 text-center text-xs text-muted-foreground\">\n {t('common:loading')}\n </div>\n ) : displayValues.length === 0 ? (\n <div className=\"py-2 text-center text-xs text-muted-foreground\">\n {t('filter:noValues')}\n </div>\n ) : (\n displayValues.map((v) => (\n <div\n key={v}\n role=\"checkbox\"\n aria-checked={selectedSet.has(v)}\n tabIndex={0}\n className=\"flex w-full cursor-pointer items-center gap-2 rounded px-1 py-0.5 text-left text-sm hover:bg-accent\"\n onClick={() => toggle(v)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n toggle(v)\n }\n }}\n >\n <Checkbox className=\"pointer-events-none size-3.5\" tabIndex={-1} aria-hidden=\"true\" checked={selectedSet.has(v)}/>\n <span className=\"truncate\">{v}</span>\n </div>\n ))\n )}\n </div>\n </div>\n\n {/* Selected count */}\n {selected.length > 0 && (\n <div className=\"text-xs text-muted-foreground\">\n {t('common:selectedCount', { count: selected.length })}\n </div>\n )}\n </div>\n )\n}\n\n// ─── Per-column filter popover in table header ───────────────────────────────\n// A magnifying-glass icon sits next to the sort label. Clicking it opens a\n// Popover with the same full filter controls as the side panel (FilterField).\n// The icon is highlighted when a filter for this column is active.\nfunction ColumnFilterPopover({\n property,\n getFilters,\n onApply,\n resourceId,\n t,\n}: {\n property: PropertyJSON\n getFilters(): ColumnFiltersState\n onApply(updates: Record<string, string>): void\n resourceId: string\n t: (key: string, params?: Record<string, string | number>) => string\n}): React.ReactElement {\n const [open, setOpen] = React.useState(false)\n const isDateType = property.type === 'date' || property.type === 'datetime'\n\n const [value, setValue] = React.useState('')\n const [valueFrom, setValueFrom] = React.useState('')\n const [valueTo, setValueTo] = React.useState('')\n\n // Initialise draft from current URL filters each time the popover opens.\n React.useEffect(() => {\n if (!open) return\n const map = new Map(getFilters().map((f) => [f.id, String(f.value ?? '')]))\n if (isDateType) {\n setValueFrom(map.get(property.path + '~~from') ?? '')\n setValueTo(map.get(property.path + '~~to') ?? '')\n } else {\n setValue(map.get(property.path) ?? '')\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open])\n\n // Icon is highlighted when any filter for this property is set.\n const isActive = (() => {\n const map = new Map(getFilters().map((f) => [f.id, String(f.value ?? '')]))\n return isDateType\n ? !!(map.get(property.path + '~~from') || map.get(property.path + '~~to'))\n : !!map.get(property.path)\n })()\n\n const handleApply = () => {\n const updates: Record<string, string> = {}\n if (isDateType) {\n updates[property.path + '~~from'] = valueFrom\n updates[property.path + '~~to'] = valueTo\n } else {\n updates[property.path] = value\n }\n onApply(updates)\n setOpen(false)\n }\n\n const handleClear = () => {\n const updates: Record<string, string> = {}\n if (isDateType) {\n updates[property.path + '~~from'] = ''\n updates[property.path + '~~to'] = ''\n } else {\n updates[property.path] = ''\n }\n onApply(updates)\n setOpen(false)\n }\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className={cn(\n 'inline-flex h-6 w-6 shrink-0 items-center justify-center rounded hover:bg-accent',\n isActive ? 'text-primary' : 'text-muted-foreground opacity-50 hover:opacity-100',\n )}\n aria-label={t('common:filter', { label: property.label })}\n >\n <ListFilter className=\"size-3.5\"/>\n </button>\n </PopoverTrigger>\n <PopoverContent className=\"w-72 border-border p-3\" align=\"start\">\n <div className=\"space-y-3\">\n <FilterField\n property={property}\n value={value}\n onChange={(v) => setValue(String(v ?? ''))}\n valueFrom={valueFrom}\n valueTo={valueTo}\n onChangeFrom={(v) => setValueFrom(String(v ?? ''))}\n onChangeTo={(v) => setValueTo(String(v ?? ''))}\n resourceId={resourceId}\n t={t}\n />\n <div className=\"flex gap-2\">\n <Button size=\"sm\" className=\"flex-1\" onClick={handleApply}>\n {t('common:apply')}\n </Button>\n <Button size=\"sm\" variant=\"outline\" onClick={handleClear}>\n {t('common:clear')}\n </Button>\n </div>\n </div>\n </PopoverContent>\n </Popover>\n )\n}\n\n// ─── Mobile record card ──────────────────────────────────────────────────────\n// Renders a single record as a tap-to-edit card with a header (avatar + title +\n// id), a 2-column grid of property values, and a contextual menu.\nfunction RecordCard({\n record,\n properties,\n resourceId,\n showSelect,\n selected,\n onToggleSelect,\n onView,\n onEdit,\n onDelete,\n customActions = [],\n onInvokeAction,\n t,\n}: {\n record: RecordJSON\n properties: PropertyJSON[]\n resourceId: string\n showSelect: boolean\n selected: boolean\n onToggleSelect(value: boolean): void\n onView(): void\n onEdit(): void\n onDelete(): void\n customActions?: ActionDescriptor[]\n onInvokeAction?(action: ActionDescriptor): void\n t: (key: string, params?: Record<string, string | number>) => string\n}): React.ReactElement {\n const openInNewTab = useOpenInNewTab()\n const idProperty = properties.find((p) => p.isId)\n const titleProperty = properties.find((p) => !p.isId && p.type === 'string')\n const titleText =\n record.title ||\n (titleProperty ? String(record.params[titleProperty.path] ?? '') : '') ||\n `#${record.id}`\n\n // Body shows non-id, non-title properties. On mobile we want maximum\n // information density, so render up to 8 — enough to surface most fields\n // without scrolling each card.\n const bodyProps = properties\n .filter((p) => !p.isId && p.path !== titleProperty?.path)\n .slice(0, 8)\n\n // Card uses a clickable div (not <button>) because it nests interactive\n // children (the RowActions DropdownMenuTrigger and reference links). HTML\n // forbids button-in-button. Behavior is mirrored from the desktop TableRow.\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Enter' || e.key === ' ') {\n const target = e.target as HTMLElement\n if (target.closest('a, button, [role=\"menuitem\"]')) return\n e.preventDefault()\n onEdit()\n }\n }\n const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {\n const target = e.target as HTMLElement\n if (target.closest('a, button, [role=\"menuitem\"]')) return\n onEdit()\n }\n const handleAuxClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (e.button !== 1) return\n const target = e.target as HTMLElement\n if (target.closest('a, button, [role=\"menuitem\"]')) return\n e.preventDefault()\n openInNewTab({ name: 'edit', resourceId, recordId: record.id })\n }\n const handleMouseDown = (e: React.MouseEvent<HTMLDivElement>) => {\n if (e.button !== 1) return\n const target = e.target as HTMLElement\n if (target.closest('a, button, [role=\"menuitem\"]')) return\n e.preventDefault()\n }\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={handleClick}\n onAuxClick={handleAuxClick}\n onMouseDown={handleMouseDown}\n onKeyDown={handleKeyDown}\n data-state={selected ? 'selected' : undefined}\n className=\"block w-full cursor-pointer rounded-lg border border-border bg-card p-2.5 text-left transition-colors hover:bg-accent/40 focus:outline-none focus-visible:ring-2 focus-visible:ring-ring data-[state=selected]:border-primary/50 data-[state=selected]:bg-primary/5\"\n >\n <div className=\"flex items-start gap-2\">\n {showSelect && (\n <div\n className=\"flex flex-none items-center pt-0.5\"\n onClick={(e) => e.stopPropagation()}\n >\n <Checkbox\n checked={selected}\n onCheckedChange={(v) => onToggleSelect(!!v)}\n aria-label={t('common:selectRow')}\n />\n </div>\n )}\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-sm font-semibold leading-tight\">{titleText}</div>\n {idProperty && (\n <div className=\"truncate text-[11px] leading-tight text-muted-foreground\">\n #{String(record.params[idProperty.path] ?? record.id)}\n </div>\n )}\n </div>\n <RowActions\n record={record}\n onView={onView}\n onEdit={onEdit}\n onDelete={onDelete}\n customActions={customActions}\n onInvokeAction={onInvokeAction}\n t={t}\n />\n </div>\n {bodyProps.length > 0 && (\n <div className=\"mt-2 grid grid-cols-2 gap-x-2 gap-y-1.5\">\n {bodyProps.map((p) => (\n <div key={p.path} className=\"min-w-0\">\n <div className=\"truncate text-[10px] uppercase tracking-wide leading-tight text-muted-foreground\">\n {p.label}\n </div>\n <div className=\"truncate text-sm leading-tight\">\n <CellContent\n resourceId={resourceId}\n recordId={record.id}\n property={p}\n value={record.params[p.path]}\n populated={record.populated}\n />\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n </div>\n )\n}\n","// Picker dialog for many-to-many relation fields. Opens a modal containing\n// the embedded ResourceListPage of the referenced resource in \"picker\" mode\n// (controlled row selection, no row navigation, no toolbar create/export).\n// The dialog inherits the full list UX — sorting, filtering, header\n// filters, column visibility, pagination — so users can find records the\n// same way they would on the main list page.\n//\n// Selection inside the dialog is staged locally and only committed to the\n// outer form on Save, so the user can cancel without polluting the value.\n//\n// Used as an alternative to ReferenceMultiCombobox for m2m and\n// reference-array fields. Renders existing selections as removable chips\n// above the trigger button — same chip pattern as ReferenceMultiCombobox.\n\nimport * as React from 'react'\nimport {\n Badge,\n Button,\n Dialog,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n cn,\n} from '@modern-admin/ui'\nimport { Plus, X } from 'lucide-react'\nimport { useQueries } from '@tanstack/react-query'\nimport { useAdminClient } from '../provider.js'\nimport { useI18n } from '../i18n.js'\nimport { useResource } from '../hooks.js'\nimport { ResourceListPage } from '../pages/list-page.js'\nimport type { ListQueryState } from '../router.js'\n\nexport interface ReferenceMultiTableDialogProps {\n referenceResourceId: string\n value: ReadonlyArray<string | number> | null | undefined\n onChange(next: Array<string | number>): void\n disabled?: boolean\n /** Label for the trigger button. Defaults to \"Pick records\". */\n triggerLabel?: string\n className?: string\n}\n\nexport function ReferenceMultiTableDialog({\n referenceResourceId,\n value,\n onChange,\n disabled,\n triggerLabel,\n className,\n}: ReferenceMultiTableDialogProps): React.ReactElement {\n const { t } = useI18n()\n const client = useAdminClient()\n const resource = useResource(referenceResourceId)\n\n const committedIds = React.useMemo(\n () => (value ?? []).map(String),\n [value],\n )\n\n const [open, setOpen] = React.useState(false)\n // Staged selection inside the dialog. Reset to committed value each time\n // the dialog opens so a previous Cancel doesn't leak state.\n const [stagedIds, setStagedIds] = React.useState<string[]>(() => committedIds)\n React.useEffect(() => {\n if (open) setStagedIds(committedIds)\n }, [open, committedIds])\n\n // Embedded list page keeps its own page/sort/filter state. Reset to\n // page 1 each open so each pick session starts fresh.\n const [query, setQuery] = React.useState<ListQueryState>({ perPage: 10 })\n React.useEffect(() => {\n if (open) setQuery({ perPage: 10 })\n }, [open])\n\n // Resolve chip labels by fetching each currently-committed record. Sharing\n // the query key with ReferenceLink keeps the cache warm — already-visible\n // chips render instantly.\n const titleQueries = useQueries({\n queries: committedIds.map((id) => ({\n queryKey: ['modern-admin', referenceResourceId, 'show', id],\n queryFn: () => client.show(referenceResourceId, id),\n staleTime: 30_000,\n })),\n })\n const chips = React.useMemo(\n () =>\n committedIds.map((id, i) => {\n const title = titleQueries[i]?.data?.record?.title\n return { id, label: title ? `${title} <${id}>` : `#${id}` }\n }),\n [committedIds, titleQueries],\n )\n\n const remove = (id: string): void => {\n onChange(committedIds.filter((x) => x !== id))\n }\n\n const handleSave = (): void => {\n onChange(stagedIds)\n setOpen(false)\n }\n\n const handleCancel = (): void => {\n setOpen(false)\n }\n\n const resolvedTriggerLabel =\n triggerLabel ??\n (committedIds.length > 0\n ? t('common:managePickRecords', { count: committedIds.length })\n : t('common:pickRecords'))\n\n return (\n <div className={cn('space-y-2', className)}>\n {chips.length > 0 && (\n <div className=\"flex flex-wrap gap-1\">\n {chips.map((c) => (\n <Badge key={c.id} variant=\"secondary\" className=\"gap-1 pr-1\">\n <span className=\"truncate\" title={c.label}>{c.label}</span>\n <button\n type=\"button\"\n aria-label={t('common:removeItem', { title: c.label })}\n disabled={disabled}\n onClick={() => remove(c.id)}\n className=\"rounded-sm opacity-60 hover:opacity-100\"\n >\n <X className=\"size-3\" />\n </button>\n </Badge>\n ))}\n </div>\n )}\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={disabled}\n onClick={() => setOpen(true)}\n className=\"w-full justify-start font-normal\"\n >\n <Plus className=\"size-4\" />\n <span className=\"truncate\">{resolvedTriggerLabel}</span>\n </Button>\n\n <Dialog open={open} onOpenChange={setOpen}>\n <DialogContent\n // Wide layout so the embedded table has room. Cap height and let\n // the body scroll independently of the footer.\n className=\"flex max-h-[90vh] w-[95vw] max-w-5xl flex-col gap-0 p-0\"\n >\n <DialogHeader className=\"border-b border-border px-6 py-4\">\n <DialogTitle>\n {t('common:pickRecordsFrom', { name: resource?.name ?? referenceResourceId })}\n </DialogTitle>\n </DialogHeader>\n {/* The list page is in embedded mode (`card: false`) so it\n manages its own internal scroll: the table area scrolls,\n the paginator sits below as a flush full-width bar. The\n body wrapper itself does NOT scroll, and `overflow-hidden`\n guarantees its children cannot bleed visually past the\n flex-1 box (and onto the DialogFooter below). */}\n <div className=\"flex min-h-0 flex-1 flex-col overflow-hidden\">\n <ResourceListPage\n resourceId={referenceResourceId}\n query={query}\n onQueryChange={setQuery}\n selectedIds={stagedIds}\n onSelectionChange={setStagedIds}\n disableRowNavigation\n features={{\n breadcrumbs: false,\n title: false,\n create: false,\n export: false,\n bulk: false,\n actions: false,\n card: false,\n }}\n />\n </div>\n <DialogFooter className=\"gap-2 border-t border-border px-6 py-4\">\n <div className=\"mr-auto text-sm text-muted-foreground self-center\">\n {t('common:selectedCount', { count: stagedIds.length })}\n </div>\n <Button variant=\"outline\" type=\"button\" onClick={handleCancel}>\n {t('common:cancel')}\n </Button>\n <Button type=\"button\" onClick={handleSave}>\n {t('common:save')}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </div>\n )\n}\n","// Property-type rendering: maps a PropertyJSON.type to display + form widgets.\n// Custom components registered via ComponentLoader take precedence.\n\nimport * as React from 'react'\nimport {\n Button,\n Input,\n PasswordInput,\n Textarea,\n Badge,\n FileInput,\n MultiFileInput,\n type MultiFileInputPendingItem,\n Switch,\n DatePicker,\n JsonEditor,\n JsonView,\n KeyValueEditor,\n KeyValueView,\n MediaPreview,\n type RichtextEditorProps,\n RichtextRender,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@modern-admin/ui'\nimport { Check, Copy } from 'lucide-react'\nimport { uuidv7 } from '@modern-admin/core'\nimport { useQueries } from '@tanstack/react-query'\nimport type {\n KeyValueFieldSpec,\n PropertyDisplayProps,\n PropertyEditorProps,\n PropertyJSON,\n} from './types.js'\nimport { getPropertyExtension } from './extension-registry.js'\nimport { useAdminContext, useAdminClient } from './provider.js'\nimport { useI18n } from './i18n.js'\nimport { useNotify } from './notify.js'\nimport {\n ReferenceCombobox,\n ReferenceLink,\n ReferenceLinkList,\n ReferenceMultiCombobox,\n} from './reference.js'\nimport { ReferenceMultiTableDialog } from './components/reference-multi-table-dialog.js'\nimport { useResource } from './hooks.js'\n\n// The tiptap-based editor lives in its own async chunk (see heavy-fields.ts)\n// so record forms without richtext/markdown properties never pay for it.\n// The skeleton mirrors the editor's footprint to avoid layout shift.\nconst RichtextEditorImpl = React.lazy(() =>\n import('./heavy-fields.js').then((m) => ({ default: m.RichtextEditor })),\n)\n\nfunction LazyRichtextEditor(props: RichtextEditorProps): React.ReactElement {\n return (\n <React.Suspense\n fallback={\n <div\n role=\"status\"\n aria-busy=\"true\"\n className=\"min-h-40 w-full animate-pulse rounded-md border border-border bg-muted/30\"\n />\n }\n >\n <RichtextEditorImpl {...props} />\n </React.Suspense>\n )\n}\n\nexport const formatDate = (value: unknown, withTime = false): string => {\n if (value == null) return ''\n const pad = (n: number): string => String(n).padStart(2, '0')\n const render = (d: Date): string => {\n // datetime → YYYY-MM-DD HH:MM in the viewer's local timezone (minute\n // precision). We build the string from the local Date accessors rather\n // than toISOString(), which is always UTC.\n if (withTime) {\n return (\n `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ` +\n `${pad(d.getHours())}:${pad(d.getMinutes())}`\n )\n }\n // date-only → YYYY-MM-DD. Extract in UTC so a midnight-UTC calendar date\n // is not shifted to the previous day in negative-offset timezones.\n return d.toISOString().slice(0, 10)\n }\n if (value instanceof Date) {\n if (Number.isNaN(value.getTime())) return String(value)\n return render(value)\n }\n const d = new Date(String(value))\n if (Number.isNaN(d.getTime())) return String(value)\n return render(d)\n}\n\nexport const formatMoneyValue = (\n value: unknown,\n currency?: string,\n locale?: string,\n): string => {\n const amount = typeof value === 'number' ? value : Number(value)\n if (!Number.isFinite(amount)) return String(value ?? '')\n try {\n if (!currency) {\n return new Intl.NumberFormat(locale, {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }).format(amount)\n }\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }).format(amount)\n } catch {\n return amount.toFixed(2)\n }\n}\n\nconst normalizeHexColor = (value: unknown): string | null => {\n if (typeof value !== 'string') return null\n const trimmed = value.trim()\n return /^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.test(trimmed) ? trimmed : null\n}\n\nfunction CopiableDisplay({\n text,\n children,\n}: {\n text: string\n children: React.ReactNode\n}): React.ReactElement {\n const { t } = useI18n()\n const notify = useNotify()\n const [copied, setCopied] = React.useState(false)\n\n React.useEffect(() => {\n if (!copied) return\n const timer = window.setTimeout(() => setCopied(false), 3_000)\n return () => window.clearTimeout(timer)\n }, [copied])\n\n const onCopy = async (): Promise<void> => {\n try {\n await navigator.clipboard.writeText(text)\n setCopied(true)\n } catch {\n notify.error({ key: 'settings:apiKeys.notice.copyFailed' })\n }\n }\n\n return (\n <span className=\"inline-flex max-w-full items-center gap-2 align-middle\">\n <span className=\"min-w-0\">{children}</span>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7 shrink-0\"\n onClick={() => void onCopy()}\n aria-label={copied ? t('settings:apiKeys.created.copied') : t('settings:apiKeys.created.copy')}\n >\n {copied ? <Check className=\"size-4 text-emerald-600\" /> : <Copy className=\"size-4\" />}\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n {copied ? t('settings:apiKeys.created.copied') : t('settings:apiKeys.created.copy')}\n </TooltipContent>\n </Tooltip>\n </span>\n )\n}\n\n// PropertyDisplayProps is defined in types.ts (shared with extension-registry).\n// Re-exported here for backwards compat.\nexport type { PropertyDisplayProps } from './types.js'\n\nfunction ListCellText({ children }: { children: React.ReactNode }): React.ReactElement {\n return (\n <span\n className=\"max-w-full overflow-hidden break-words text-foreground\"\n style={{\n display: '-webkit-box',\n WebkitBoxOrient: 'vertical',\n WebkitLineClamp: 5,\n whiteSpace: 'pre-wrap',\n }}\n >\n {children}\n </span>\n )\n}\n\nexport function PropertyDisplay({ property, value, view = 'list', populated }: PropertyDisplayProps): React.ReactElement | null {\n const { components } = useAdminContext()\n const { t, locale } = useI18n()\n const copiable = view === 'show' && (property.isId === true || property.custom?.copiable === true)\n const withCopy = (content: React.ReactElement): React.ReactElement =>\n copiable ? <CopiableDisplay text={String(value)}>{content}</CopiableDisplay> : content\n const componentName = property.components?.[view]\n if (componentName && components?.has(componentName)) {\n const Custom = components.get(componentName)!\n return <Custom property={property} value={value} view={view} />\n }\n if (value == null || value === '') return <span className=\"text-muted-foreground\">—</span>\n switch (property.type) {\n case 'boolean':\n return <Badge variant={value ? 'default' : 'outline'}>{value ? t('common:yes') : t('common:no')}</Badge>\n case 'date':\n case 'datetime': {\n const withTime = property.type === 'datetime'\n const formatted = formatDate(value, withTime)\n return withCopy(view === 'list' ? <ListCellText>{formatted}</ListCellText> : <span>{formatted}</span>)\n }\n case 'money': {\n const currency = typeof property.custom?.currency === 'string'\n ? property.custom.currency\n : undefined\n return withCopy(\n view === 'list'\n ? <ListCellText>{formatMoneyValue(value, currency, locale)}</ListCellText>\n : <span>{formatMoneyValue(value, currency, locale)}</span>,\n )\n }\n case 'json':\n case 'mixed':\n case 'key-value':\n if (property.keyValueFields?.length) {\n return (\n <KeyValueView\n fields={property.keyValueFields}\n value={value}\n variant={view === 'list' ? 'inline' : 'block'}\n labels={{\n emptyValue: '—',\n trueLabel: t('common:yes'),\n falseLabel: t('common:no'),\n }}\n />\n )\n }\n return <JsonView value={value} inline={view === 'list'} />\n\n case 'reference':\n if (property.reference) {\n if (property.isArray) {\n const ids = Array.isArray(value)\n ? (value as Array<string | number>)\n : []\n return (\n <ReferenceLinkList\n resourceId={property.reference}\n recordIds={ids}\n populated={populated}\n populatedKeyPrefix={property.path}\n />\n )\n }\n const populatedRecord = populated?.[property.path] as\n | { id?: string; title?: string }\n | undefined\n return (\n <ReferenceLink\n resourceId={property.reference}\n recordId={value as string | number}\n showIcon={view === 'show'}\n populated={populatedRecord}\n />\n )\n }\n return <Badge variant=\"secondary\">{String(value)}</Badge>\n case 'm2m': {\n const items = Array.isArray(value) ? (value as Array<Record<string, unknown>>) : []\n const m2m = property.custom?.m2m as\n | { reference: string; extraFields?: string[] }\n | undefined\n const reference = m2m?.reference ?? property.reference\n const ids = items.map((i) => String(i.id ?? ''))\n if (!reference) return <span className=\"text-muted-foreground\">—</span>\n if (items.length === 0) return <span className=\"text-muted-foreground\">—</span>\n const extras = m2m?.extraFields ?? []\n if (view === 'list' || extras.length === 0) {\n return (\n <ReferenceLinkList\n resourceId={reference}\n recordIds={ids}\n populated={populated}\n populatedKeyPrefix={property.path}\n />\n )\n }\n return (\n <div className=\"space-y-1\">\n {items.map((it) => {\n const populatedRef = populated?.[`${property.path}.${it.id}`] as\n | { id?: string; title?: string }\n | undefined\n return (\n <div key={String(it.id)} className=\"flex flex-wrap items-center gap-x-3 gap-y-1\">\n <ReferenceLink\n resourceId={reference}\n recordId={String(it.id)}\n populated={populatedRef}\n />\n {extras.map((f) =>\n it[f] != null && it[f] !== '' ? (\n <span key={f} className=\"text-xs text-muted-foreground\">\n {f}:{' '}\n <span className=\"text-foreground\">{String(it[f])}</span>\n </span>\n ) : null,\n )}\n </div>\n )\n })}\n </div>\n )\n }\n case 'richtext':\n if (view === 'show') {\n return <RichtextRender value={String(value)} format=\"html\" />\n }\n // List view: strip HTML tags for a compact preview.\n return (\n <ListCellText>\n {String(value).replace(/<[^>]*>/g, ' ').replace(/\\s+/g, ' ').trim()}\n </ListCellText>\n )\n case 'markdown':\n if (view === 'show') {\n return <RichtextRender value={String(value)} format=\"markdown\" />\n }\n return (\n <ListCellText>\n {String(value).replace(/[#>*_`~-]/g, '').replace(/\\s+/g, ' ').trim()}\n </ListCellText>\n )\n case 'textarea':\n return withCopy(\n view === 'show'\n ? <span className=\"whitespace-pre-wrap text-foreground\">{String(value)}</span>\n : <ListCellText>{String(value)}</ListCellText>,\n )\n case 'color': {\n const color = normalizeHexColor(value)\n if (!color) {\n return withCopy(view === 'list' ? <ListCellText>{String(value)}</ListCellText> : <span>{String(value)}</span>)\n }\n return withCopy(\n <span className=\"inline-flex items-center gap-2\">\n <span className=\"size-3 rounded-full border border-border\" style={{ backgroundColor: color }} />\n <span>{color.toUpperCase()}</span>\n </span>,\n )\n }\n case 'previewMedia': {\n const url = String(value)\n const labels = {\n preview: t('common:preview'),\n download: t('common:download'),\n openInNewTab: t('common:openInNewTab'),\n title: property.label || t('common:preview'),\n }\n return (\n <MediaPreview\n url={url}\n labels={labels}\n showUrl={view === 'show'}\n triggerSize=\"sm\"\n triggerVariant=\"outline\"\n />\n )\n }\n case 'file': {\n const template = property.custom?.uploadUrlTemplate as string | undefined\n const renderOne = (rawKey: string, idx?: number): React.ReactElement => {\n const url = template\n ? template.replace('{key}', rawKey)\n : rawKey.startsWith('http')\n ? rawKey\n : null\n const filename = rawKey.split('/').pop() ?? rawKey\n if (url) {\n const labels = {\n preview: t('common:preview'),\n download: t('common:download'),\n openInNewTab: t('common:openInNewTab'),\n title: filename,\n }\n return (\n <MediaPreview\n key={idx ?? rawKey}\n url={url}\n downloadName={filename}\n labels={labels}\n showUrl={view === 'show'}\n triggerSize=\"sm\"\n triggerVariant=\"outline\"\n />\n )\n }\n return (\n <span key={idx ?? rawKey} className=\"text-sm text-muted-foreground\">\n {filename}\n </span>\n )\n }\n if (Array.isArray(value)) {\n const arr = value as Array<unknown>\n if (arr.length === 0) return <span className=\"text-muted-foreground\">—</span>\n return (\n <div className=\"flex flex-wrap items-center gap-2\">\n {arr.map((v, i) => renderOne(String(v), i))}\n </div>\n )\n }\n return renderOne(String(value))\n }\n default: {\n // Check the extension registry for a custom type before falling back to plain text.\n const ext = getPropertyExtension(property.type)\n if (ext) return <ext.display property={property} value={value} view={view} populated={populated} />\n return withCopy(view === 'list' ? <ListCellText>{String(value)}</ListCellText> : <span>{String(value)}</span>)\n }\n }\n}\n\n// PropertyEditorProps is defined in types.ts (shared with extension-registry).\n// Re-exported here for backwards compat.\nexport type { PropertyEditorProps } from './types.js'\n\n// ─── File upload editor ───────────────────────────────────────────────────────\n\ninterface FilePropertyEditorProps {\n property: PropertyJSON\n value: unknown\n onChange(next: unknown): void\n disabled?: boolean\n resourceId?: string\n}\n\n/** Build the public URL for a stored key, using `{key}` substitution. */\nconst urlForKey = (key: string, template: string | undefined): string | null => {\n if (template) return template.replace('{key}', key)\n if (key.startsWith('http')) return key\n return null\n}\n\n/**\n * Local pending state for one in-flight upload. A small `id` (set on first\n * insertion and never re-used) keys the React row so progress updates do not\n * disturb the list ordering.\n */\ninterface PendingUpload {\n id: string\n name: string\n progress: number\n status: 'queued' | 'uploading' | 'error'\n error?: string\n}\n\nconst newPendingId = (): string => uuidv7()\n\nfunction FilePropertyEditor({\n property,\n value,\n onChange,\n disabled,\n resourceId,\n}: FilePropertyEditorProps): React.ReactElement {\n const client = useAdminClient()\n const { t } = useI18n()\n const isArray = Boolean(property.isArray)\n const [pending, setPending] = React.useState<PendingUpload[]>([])\n const [uploadError, setUploadError] = React.useState<string | null>(null)\n\n // Map of key → freshly-uploaded URL (so we can render previews without\n // waiting for the form to re-fetch), and the set of keys that were uploaded\n // in this editing session and have not yet been \"saved\" by submitting the\n // form. The latter is used to fire `cancelUpload` when the user removes a\n // pending file before saving.\n const [uploadedUrls, setUploadedUrls] = React.useState<Record<string, string>>({})\n const pendingKeysRef = React.useRef<Set<string>>(new Set())\n\n const template = property.custom?.uploadUrlTemplate as string | undefined\n const accept =\n (property.custom?.uploadMimeTypes as string[] | null | undefined)?.join(',') ?? undefined\n\n // Normalise current value into an array of keys for uniform handling.\n const currentKeys: string[] = React.useMemo(() => {\n if (isArray) {\n return Array.isArray(value)\n ? (value as unknown[]).flatMap((v) => (v == null || v === '' ? [] : [String(v)]))\n : []\n }\n return value == null || value === '' ? [] : [String(value)]\n }, [value, isArray])\n\n const currentKeysRef = React.useRef(currentKeys)\n React.useEffect(() => {\n currentKeysRef.current = currentKeys\n }, [currentKeys])\n\n const cancelIfPending = React.useCallback(\n (key: string): void => {\n if (!resourceId) return\n if (!pendingKeysRef.current.has(key)) return\n pendingKeysRef.current.delete(key)\n void client.cancelUpload(resourceId, property.path, key).catch(() => {\n // Best-effort — server-side TTL sweeper handles missed cancellations.\n })\n },\n [client, resourceId, property.path],\n )\n\n const startUploads = async (files: File[]): Promise<void> => {\n if (!resourceId) {\n setUploadError('resourceId is required for file upload')\n return\n }\n setUploadError(null)\n // For single-value fields, only the first file matters; the rest are\n // dropped before they ever hit the network.\n const accepted = isArray ? files : files.slice(0, 1)\n if (accepted.length === 0) return\n // Pre-allocate one pending row per file; the index correlates with the\n // upload index used by per-item callbacks.\n const ids = accepted.map(() => newPendingId())\n setPending((prev) => [\n ...prev,\n ...accepted.map((f, i) => ({\n id: ids[i]!,\n name: f.name,\n progress: 0,\n status: 'queued' as const,\n })),\n ])\n\n await client.uploadFiles(resourceId, property.path, accepted, {\n concurrency: 3,\n onItemStart: (i) => {\n setPending((prev) =>\n prev.map((p) => (p.id === ids[i] ? { ...p, status: 'uploading' } : p)),\n )\n },\n onItemProgress: (i, _f, p) => {\n setPending((prev) =>\n prev.map((row) => (row.id === ids[i] ? { ...row, progress: p.percent } : row)),\n )\n },\n onItemComplete: (i, _f, info) => {\n setPending((prev) => prev.filter((p) => p.id !== ids[i]))\n setUploadedUrls((u) => ({ ...u, [info.key]: info.url }))\n pendingKeysRef.current.add(info.key)\n if (isArray) {\n const next = [...currentKeysRef.current, info.key]\n currentKeysRef.current = next\n onChange(next)\n } else {\n // Single value: cancel any previously-staged key being replaced.\n for (const old of currentKeysRef.current) cancelIfPending(old)\n currentKeysRef.current = [info.key]\n onChange(info.key)\n }\n },\n onItemError: (i, _f, err) => {\n setPending((prev) =>\n prev.map((p) =>\n p.id === ids[i] ? { ...p, status: 'error', error: err.message } : p,\n ),\n )\n },\n })\n }\n\n const dismissPending = (id: string): void => {\n setPending((prev) => prev.filter((p) => p.id !== id))\n }\n\n const removeAt = (index: number): void => {\n const key = currentKeys[index]\n if (key) cancelIfPending(key)\n if (isArray) {\n const next = currentKeys.filter((_, i) => i !== index)\n onChange(next)\n } else {\n onChange(null)\n }\n setUploadError(null)\n }\n\n const stillUploading = pending.some((p) => p.status !== 'error')\n\n if (isArray) {\n const items = currentKeys.map((key) => ({\n value: key,\n previewUrl: uploadedUrls[key] ?? urlForKey(key, template),\n }))\n const pendingItems: MultiFileInputPendingItem[] = pending.map((p) => ({\n id: p.id,\n name: p.name,\n progress: p.status === 'error' ? undefined : p.progress,\n status: p.status,\n error: p.error,\n }))\n return (\n <MultiFileInput\n items={items}\n pendingItems={pendingItems}\n accept={accept}\n error={uploadError ?? undefined}\n disabled={disabled}\n labels={{\n chooseFiles: t('common:chooseFiles'),\n dragAndDrop: t('common:dragAndDrop'),\n chooseLink: t('common:chooseAFile'),\n addMoreLink: t('common:addMoreFiles'),\n uploading: t('common:uploading'),\n removeFile: t('common:removeFile'),\n uploadFailed: t('common:uploadFailed'),\n dismiss: t('common:dismiss'),\n }}\n onFilesSelect={(files) => {\n void startUploads(files)\n }}\n onRemove={removeAt}\n onPendingDismiss={dismissPending}\n />\n )\n }\n\n const storedKey = currentKeys[0] ?? null\n const previewUrl = storedKey ? (uploadedUrls[storedKey] ?? urlForKey(storedKey, template)) : null\n // For single-value fields we surface the latest in-flight upload's progress\n // through the simple FileInput's `uploading` flag. The detailed progress UI\n // lives in MultiFileInput.\n const activePending = pending.find((p) => p.status === 'uploading') ?? pending.find((p) => p.status === 'queued')\n const erroredPending = pending.find((p) => p.status === 'error')\n return (\n <FileInput\n value={storedKey}\n previewUrl={previewUrl}\n accept={accept}\n uploading={stillUploading}\n uploadProgress={activePending?.progress}\n uploadingName={activePending?.name}\n error={uploadError ?? erroredPending?.error ?? undefined}\n disabled={disabled}\n labels={{\n chooseFile: t('common:chooseFile'),\n dragAndDrop: t('common:dragAndDrop'),\n chooseAFile: t('common:chooseAFile'),\n uploading: t('common:uploading'),\n uploadingFile: t('common:uploadingFile'),\n removeFile: t('common:removeFile'),\n }}\n onFileSelect={(f) => {\n void startUploads([f])\n }}\n onRemove={() => removeAt(0)}\n />\n )\n}\n\n// ─── M2M editor ───────────────────────────────────────────────────────────────\n\ninterface M2MItemValue extends Record<string, unknown> {\n id: string\n}\n\n/**\n * Editor for many-to-many properties registered by `m2mFeature`. Wraps the\n * existing `ReferenceMultiCombobox` for picking referenced records, then\n * (when the relation has extra junction columns) renders a per-item row of\n * nested `PropertyEditor`s — one per extra field, typed from the junction\n * resource's own property declarations.\n */\nfunction M2MPropertyEditor({\n property,\n value,\n onChange,\n disabled,\n}: PropertyEditorProps): React.ReactElement {\n const m2m = property.custom?.m2m as\n | {\n reference: string\n through: string\n extraFields?: string[]\n }\n | undefined\n const junction = useResource(m2m?.through)\n if (!m2m?.reference) return <span className=\"text-muted-foreground\">—</span>\n const items: M2MItemValue[] = Array.isArray(value)\n ? (value as Array<Record<string, unknown>>).flatMap((entry) => {\n if (entry == null) return []\n if (typeof entry === 'string' || typeof entry === 'number') {\n return [{ id: String(entry) }]\n }\n if (typeof entry === 'object' && entry.id != null) {\n return [{ ...entry, id: String((entry as { id: unknown }).id) }]\n }\n return []\n })\n : []\n const ids = items.map((i) => String(i.id))\n const extras = m2m.extraFields ?? []\n\n const setIds = (nextIds: Array<string | number>): void => {\n const byId = new Map<string, M2MItemValue>(items.map((i) => [String(i.id), i]))\n const next = nextIds.map((rawId) => {\n const id = String(rawId)\n return byId.get(id) ?? ({ id } as M2MItemValue)\n })\n onChange(next)\n }\n\n const updateItem = (id: string, field: string, val: unknown): void => {\n onChange(items.map((it) => (String(it.id) === id ? { ...it, [field]: val } : it)))\n }\n\n // m2m relations are typically large tables, so default to the table-driven\n // dialog picker. Opt back into the combobox via `m2m.picker = 'combobox'`.\n const Picker =\n (m2m as { picker?: string } | undefined)?.picker === 'combobox'\n ? ReferenceMultiCombobox\n : ReferenceMultiTableDialog\n return (\n <div className=\"space-y-3\">\n <Picker\n referenceResourceId={m2m.reference}\n value={ids}\n onChange={setIds}\n disabled={disabled}\n />\n {extras.length > 0 && items.length > 0 ? (\n <div className=\"space-y-1.5\">\n {items.map((item) => (\n <div\n key={item.id}\n className=\"rounded-md border border-border bg-muted/30 px-2.5 py-2\"\n >\n {/* Mobile: stack reference link above the extras row.\n ≥sm: reference link gets a fixed-width slot on the left,\n extras flow inline on the right so we don't waste space. */}\n <div className=\"flex flex-col gap-2 sm:flex-row sm:items-start sm:gap-3\">\n <div className=\"min-w-0 sm:w-32 sm:shrink-0 sm:pt-1.5\">\n <ReferenceLink resourceId={m2m.reference} recordId={item.id} showIcon />\n </div>\n <div\n className={\n 'grid min-w-0 flex-1 gap-2 ' +\n (extras.length > 1 ? 'sm:grid-cols-2' : '')\n }\n >\n {extras.map((f) => {\n const junctionProp = junction?.properties.find((p) => p.path === f)\n const synthetic: PropertyJSON = junctionProp ?? {\n path: f,\n label: f,\n type: 'string',\n isId: false,\n isSortable: false,\n isRequired: false,\n isDisabled: false,\n isArray: false,\n reference: null,\n availableValues: null,\n components: {},\n visibility: { list: false, show: true, edit: true, filter: false },\n position: 1,\n custom: {},\n }\n return (\n <div key={f} className=\"flex items-center gap-2\">\n <label className=\"w-16 shrink-0 text-xs font-medium text-muted-foreground sm:w-auto\">\n {synthetic.label}\n </label>\n <div className=\"min-w-0 flex-1\">\n <PropertyEditor\n property={synthetic}\n value={item[f]}\n onChange={(v) => updateItem(String(item.id), f, v)}\n disabled={disabled}\n />\n </div>\n </div>\n )\n })}\n </div>\n </div>\n </div>\n ))}\n </div>\n ) : null}\n </div>\n )\n}\n\n// ─── KeyValue editor wrapper that resolves DB-bound autocomplete sources ────\n\n/**\n * Loads dynamic autocomplete suggestions for `keyValueFields[i].type ===\n * 'autocomplete'` fields that declare a `suggestionsResource` +\n * `suggestionsField` binding, then forwards everything to KeyValueEditor.\n *\n * Static suggestions (declared via `availableValues` on the field) are\n * already supported inside the editor itself — this wrapper only handles\n * the network-fetch side, so the UI primitive stays i18n- and\n * client-unaware.\n */\nfunction KeyValueEditorWithSuggestions({\n fields,\n value,\n onChange,\n disabled,\n}: {\n fields: ReadonlyArray<KeyValueFieldSpec>\n value: unknown\n onChange(next: Record<string, unknown>): void\n disabled?: boolean\n}): React.ReactElement {\n const client = useAdminClient()\n const { t } = useI18n()\n\n // Identify just the fields that need a network fetch. The order is\n // stable across renders (driven by the `fields` prop array) so the\n // `useQueries` array length is stable too.\n const dynamic = React.useMemo(\n () =>\n fields.filter(\n (f): f is KeyValueFieldSpec & {\n suggestionsResource: string\n suggestionsField: string\n } =>\n f.type === 'autocomplete' &&\n !!f.suggestionsResource &&\n !!f.suggestionsField,\n ),\n [fields],\n )\n\n const queries = useQueries({\n queries: dynamic.map((f) => ({\n queryKey: [\n 'modern-admin',\n 'fieldSuggestions',\n f.suggestionsResource,\n f.suggestionsField,\n 200,\n ] as const,\n queryFn: async (): Promise<string[]> => {\n const res = await client.list(f.suggestionsResource, { perPage: 200 })\n const seen = new Set<string>()\n const out: string[] = []\n for (const r of res.records) {\n const raw = r.params?.[f.suggestionsField]\n if (raw == null || raw === '') continue\n const v = String(raw)\n if (seen.has(v)) continue\n seen.add(v)\n out.push(v)\n }\n out.sort((a, b) => a.localeCompare(b))\n return out\n },\n staleTime: 60_000,\n })),\n })\n\n const suggestionsByKey: Record<string, string[]> = {}\n const suggestionsLoadingByKey: Record<string, boolean> = {}\n dynamic.forEach((f, i) => {\n suggestionsByKey[f.key] = queries[i]?.data ?? []\n suggestionsLoadingByKey[f.key] = queries[i]?.isLoading ?? false\n })\n\n return (\n <KeyValueEditor\n fields={fields}\n value={value}\n onChange={onChange}\n disabled={disabled}\n suggestionsByKey={suggestionsByKey}\n suggestionsLoadingByKey={suggestionsLoadingByKey}\n labels={{\n combobox: {\n loading: t('common:loading'),\n // KeyValueEditor's combobox label inherits the field label; this\n // is the empty-state message inside the dropdown.\n noMatches: t('keyValue:noMatches'),\n },\n }}\n />\n )\n}\n\n// ─── Generic property editor ──────────────────────────────────────────────────\n\nexport function PropertyEditor({\n property,\n value,\n onChange,\n disabled,\n resourceId,\n}: PropertyEditorProps): React.ReactElement {\n const { components } = useAdminContext()\n const { t } = useI18n()\n const componentName = property.components?.edit\n if (componentName && components?.has(componentName)) {\n const Custom = components.get(componentName)!\n return <Custom property={property} value={value} onChange={onChange} disabled={disabled} />\n }\n const stringValue = value == null ? '' : String(value)\n if (property.type === 'm2m') {\n return (\n <M2MPropertyEditor\n property={property}\n value={value}\n onChange={onChange}\n disabled={disabled}\n resourceId={resourceId}\n />\n )\n }\n if (property.reference) {\n if (property.isArray) {\n const arr = Array.isArray(value)\n ? (value as Array<string | number>)\n : []\n // Opt into the table-driven dialog picker via `custom.picker = 'dialog'`;\n // default stays as the compact combobox for plain reference arrays.\n const pickerKind = (property.custom as { picker?: string } | undefined)?.picker\n const ArrayPicker =\n pickerKind === 'dialog' ? ReferenceMultiTableDialog : ReferenceMultiCombobox\n return (\n <ArrayPicker\n referenceResourceId={property.reference}\n value={arr}\n onChange={(next) => onChange(next)}\n disabled={disabled}\n />\n )\n }\n return (\n <ReferenceCombobox\n referenceResourceId={property.reference}\n value={value as string | number | null | undefined}\n onChange={(next) => onChange(next)}\n disabled={disabled}\n />\n )\n }\n if (property.availableValues?.length) {\n return (\n <Select\n value={stringValue}\n onValueChange={(v) => onChange(v === '_empty_' ? '' : v)}\n disabled={disabled}\n >\n <SelectTrigger>\n <SelectValue placeholder=\"—\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"_empty_\">—</SelectItem>\n {property.availableValues.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )\n }\n switch (property.type) {\n case 'boolean':\n return (\n <Switch\n checked={Boolean(value)}\n onCheckedChange={(v) => onChange(Boolean(v))}\n disabled={disabled}\n />\n )\n case 'json':\n case 'mixed':\n case 'key-value':\n if (property.keyValueFields?.length) {\n return (\n <KeyValueEditorWithSuggestions\n fields={property.keyValueFields}\n value={value}\n onChange={(next) => onChange(next)}\n disabled={disabled}\n />\n )\n }\n return (\n <JsonEditor\n value={value}\n onChange={onChange}\n disabled={disabled}\n formatLabel={t('common:format')}\n invalidLabel={t('common:invalidJson')}\n />\n )\n case 'number':\n case 'float':\n case 'currency':\n case 'money':\n return (\n <Input\n type=\"number\"\n inputMode=\"decimal\"\n step=\"0.01\"\n value={stringValue}\n onChange={(e) => onChange(e.target.value === '' ? null : Number(e.target.value))}\n disabled={disabled}\n />\n )\n case 'date':\n return (\n <DatePicker\n mode=\"date\"\n value={value == null ? '' : String(value)}\n onChange={(v) => onChange(v === '' ? null : v)}\n disabled={disabled}\n ariaLabel={property.label}\n openCalendarLabel={t('common:openCalendar')}\n timeLabel={t('common:time')}\n />\n )\n case 'datetime':\n case 'datetime-local':\n return (\n <DatePicker\n mode=\"datetime\"\n value={value == null ? '' : String(value)}\n onChange={(v) => onChange(v === '' ? null : v)}\n disabled={disabled}\n ariaLabel={property.label}\n openCalendarLabel={t('common:openCalendar')}\n timeLabel={t('common:time')}\n />\n )\n case 'richtext':\n return (\n <LazyRichtextEditor\n value={stringValue}\n onChange={(v) => onChange(v)}\n format=\"html\"\n disabled={disabled}\n ariaLabelledBy={property.label}\n labels={{\n bold: t('richtext:bold'),\n italic: t('richtext:italic'),\n strikethrough: t('richtext:strikethrough'),\n inlineCode: t('richtext:inlineCode'),\n heading: t('richtext:heading'),\n bulletList: t('richtext:bulletList'),\n numberedList: t('richtext:numberedList'),\n blockquote: t('richtext:blockquote'),\n horizontalRule: t('richtext:horizontalRule'),\n insertLink: t('richtext:insertLink'),\n undo: t('richtext:undo'),\n redo: t('richtext:redo'),\n source: t('richtext:source'),\n splitView: t('richtext:splitView'),\n visualEditor: t('richtext:visualEditor'),\n fullscreen: t('richtext:fullscreen'),\n exitFullscreen: t('richtext:exitFullscreen'),\n urlPrompt: t('richtext:urlPrompt'),\n }}\n />\n )\n case 'markdown':\n return (\n <LazyRichtextEditor\n value={stringValue}\n onChange={(v) => onChange(v)}\n format=\"markdown\"\n disabled={disabled}\n ariaLabelledBy={property.label}\n labels={{\n bold: t('richtext:bold'),\n italic: t('richtext:italic'),\n strikethrough: t('richtext:strikethrough'),\n inlineCode: t('richtext:inlineCode'),\n heading: t('richtext:heading'),\n bulletList: t('richtext:bulletList'),\n numberedList: t('richtext:numberedList'),\n blockquote: t('richtext:blockquote'),\n horizontalRule: t('richtext:horizontalRule'),\n insertLink: t('richtext:insertLink'),\n undo: t('richtext:undo'),\n redo: t('richtext:redo'),\n source: t('richtext:source'),\n splitView: t('richtext:splitView'),\n visualEditor: t('richtext:visualEditor'),\n fullscreen: t('richtext:fullscreen'),\n exitFullscreen: t('richtext:exitFullscreen'),\n urlPrompt: t('richtext:urlPrompt'),\n }}\n />\n )\n case 'textarea':\n return (\n <Textarea\n value={stringValue}\n onChange={(e) => onChange(e.target.value)}\n disabled={disabled}\n rows={5}\n />\n )\n case 'password':\n return (\n <PasswordInput\n value={stringValue}\n onChange={(e) => onChange(e.target.value)}\n disabled={disabled}\n toggleLabel={{\n show: t('common:showPassword'),\n hide: t('common:hidePassword'),\n }}\n />\n )\n case 'file':\n return (\n <FilePropertyEditor\n property={property}\n value={value}\n onChange={onChange}\n disabled={disabled}\n resourceId={resourceId}\n />\n )\n case 'previewMedia':\n return (\n <Input\n type=\"url\"\n inputMode=\"url\"\n placeholder=\"https://…\"\n value={stringValue}\n onChange={(e) => onChange(e.target.value)}\n disabled={disabled}\n />\n )\n case 'color':\n return (\n <div className=\"flex items-center gap-3\">\n <Input\n type=\"color\"\n className=\"h-10 w-14 rounded-md p-1\"\n value={normalizeHexColor(value) ?? '#000000'}\n onChange={(e) => onChange(e.target.value)}\n disabled={disabled}\n />\n <Input\n value={stringValue}\n placeholder=\"#000000\"\n onChange={(e) => onChange(e.target.value)}\n disabled={disabled}\n />\n </div>\n )\n default: {\n // Check the extension registry for a custom type before falling back to a plain text input.\n const ext = getPropertyExtension(property.type)\n if (ext) return <ext.editor property={property} value={value} onChange={onChange} disabled={disabled} resourceId={resourceId} />\n return (\n <Input\n value={stringValue}\n onChange={(e) => onChange(e.target.value)}\n disabled={disabled}\n />\n )\n }\n }\n}\n"],"file":"property-renderer-DyCwdVkh.js"}