@freighttech/ui 0.13.18

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 (1477) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +31 -0
  3. package/dist/backend/AppShell.js +1289 -0
  4. package/dist/backend/AppShell.js.map +7 -0
  5. package/dist/backend/BackendChromeProvider.js +83 -0
  6. package/dist/backend/BackendChromeProvider.js.map +7 -0
  7. package/dist/backend/BackendPageSurface.js +19 -0
  8. package/dist/backend/BackendPageSurface.js.map +7 -0
  9. package/dist/backend/CollapsibleNavSection.js +149 -0
  10. package/dist/backend/CollapsibleNavSection.js.map +7 -0
  11. package/dist/backend/ContextHelp.js +33 -0
  12. package/dist/backend/ContextHelp.js.map +7 -0
  13. package/dist/backend/CrudForm.js +3163 -0
  14. package/dist/backend/CrudForm.js.map +7 -0
  15. package/dist/backend/DataTable.js +2091 -0
  16. package/dist/backend/DataTable.js.map +7 -0
  17. package/dist/backend/EmptyState.js +52 -0
  18. package/dist/backend/EmptyState.js.map +7 -0
  19. package/dist/backend/FilterBar.js +147 -0
  20. package/dist/backend/FilterBar.js.map +7 -0
  21. package/dist/backend/FilterOverlay.js +337 -0
  22. package/dist/backend/FilterOverlay.js.map +7 -0
  23. package/dist/backend/FlashMessages.js +158 -0
  24. package/dist/backend/FlashMessages.js.map +7 -0
  25. package/dist/backend/HtmlRichTextEditor.js +129 -0
  26. package/dist/backend/HtmlRichTextEditor.js.map +7 -0
  27. package/dist/backend/IntegrationsButton.js +25 -0
  28. package/dist/backend/IntegrationsButton.js.map +7 -0
  29. package/dist/backend/JsonBuilder.js +323 -0
  30. package/dist/backend/JsonBuilder.js.map +7 -0
  31. package/dist/backend/JsonDisplay.js +207 -0
  32. package/dist/backend/JsonDisplay.js.map +7 -0
  33. package/dist/backend/NextStepCallout.js +79 -0
  34. package/dist/backend/NextStepCallout.js.map +7 -0
  35. package/dist/backend/Page.js +27 -0
  36. package/dist/backend/Page.js.map +7 -0
  37. package/dist/backend/PerspectiveSidebar.js +456 -0
  38. package/dist/backend/PerspectiveSidebar.js.map +7 -0
  39. package/dist/backend/ProfileDropdown.js +341 -0
  40. package/dist/backend/ProfileDropdown.js.map +7 -0
  41. package/dist/backend/RowActions.js +155 -0
  42. package/dist/backend/RowActions.js.map +7 -0
  43. package/dist/backend/SectionHeader.js +74 -0
  44. package/dist/backend/SectionHeader.js.map +7 -0
  45. package/dist/backend/SettingsButton.js +25 -0
  46. package/dist/backend/SettingsButton.js.map +7 -0
  47. package/dist/backend/Sidebar.js +510 -0
  48. package/dist/backend/Sidebar.js.map +7 -0
  49. package/dist/backend/Sidebar.stories.js +166 -0
  50. package/dist/backend/Sidebar.stories.js.map +7 -0
  51. package/dist/backend/TruncatedCell.js +92 -0
  52. package/dist/backend/TruncatedCell.js.map +7 -0
  53. package/dist/backend/UserMenu.js +146 -0
  54. package/dist/backend/UserMenu.js.map +7 -0
  55. package/dist/backend/ValueIcons.js +34 -0
  56. package/dist/backend/ValueIcons.js.map +7 -0
  57. package/dist/backend/WebhookSetupGuide.js +79 -0
  58. package/dist/backend/WebhookSetupGuide.js.map +7 -0
  59. package/dist/backend/charts/BarChart.js +154 -0
  60. package/dist/backend/charts/BarChart.js.map +7 -0
  61. package/dist/backend/charts/ChartUtils.js +141 -0
  62. package/dist/backend/charts/ChartUtils.js.map +7 -0
  63. package/dist/backend/charts/ComboChart.js +261 -0
  64. package/dist/backend/charts/ComboChart.js.map +7 -0
  65. package/dist/backend/charts/ComboChart.stories.js +88 -0
  66. package/dist/backend/charts/ComboChart.stories.js.map +7 -0
  67. package/dist/backend/charts/KpiCard.js +96 -0
  68. package/dist/backend/charts/KpiCard.js.map +7 -0
  69. package/dist/backend/charts/LineChart.js +165 -0
  70. package/dist/backend/charts/LineChart.js.map +7 -0
  71. package/dist/backend/charts/PieChart.js +121 -0
  72. package/dist/backend/charts/PieChart.js.map +7 -0
  73. package/dist/backend/charts/ScatterChart.js +320 -0
  74. package/dist/backend/charts/ScatterChart.js.map +7 -0
  75. package/dist/backend/charts/TopNTable.js +91 -0
  76. package/dist/backend/charts/TopNTable.js.map +7 -0
  77. package/dist/backend/charts/WaterfallChart.js +136 -0
  78. package/dist/backend/charts/WaterfallChart.js.map +7 -0
  79. package/dist/backend/charts/index.js +30 -0
  80. package/dist/backend/charts/index.js.map +7 -0
  81. package/dist/backend/columns/ColumnChooserPanel.js +244 -0
  82. package/dist/backend/columns/ColumnChooserPanel.js.map +7 -0
  83. package/dist/backend/confirm-dialog/ConfirmDialog.js +214 -0
  84. package/dist/backend/confirm-dialog/ConfirmDialog.js.map +7 -0
  85. package/dist/backend/confirm-dialog/index.js +7 -0
  86. package/dist/backend/confirm-dialog/index.js.map +7 -0
  87. package/dist/backend/confirm-dialog/useConfirmDialog.js +113 -0
  88. package/dist/backend/confirm-dialog/useConfirmDialog.js.map +7 -0
  89. package/dist/backend/custom-fields/FieldDefinitionsEditor.js +1352 -0
  90. package/dist/backend/custom-fields/FieldDefinitionsEditor.js.map +7 -0
  91. package/dist/backend/custom-fields/FieldDefinitionsManager.js +332 -0
  92. package/dist/backend/custom-fields/FieldDefinitionsManager.js.map +7 -0
  93. package/dist/backend/dashboard/DashboardScreen.js +598 -0
  94. package/dist/backend/dashboard/DashboardScreen.js.map +7 -0
  95. package/dist/backend/dashboard/index.js +5 -0
  96. package/dist/backend/dashboard/index.js.map +7 -0
  97. package/dist/backend/dashboard/widgetRegistry.js +55 -0
  98. package/dist/backend/dashboard/widgetRegistry.js.map +7 -0
  99. package/dist/backend/date-range/DateRangeSelect.js +39 -0
  100. package/dist/backend/date-range/DateRangeSelect.js.map +7 -0
  101. package/dist/backend/date-range/InlineDateRangeSelect.js +42 -0
  102. package/dist/backend/date-range/InlineDateRangeSelect.js.map +7 -0
  103. package/dist/backend/date-range/InlineGranularitySelect.js +40 -0
  104. package/dist/backend/date-range/InlineGranularitySelect.js.map +7 -0
  105. package/dist/backend/date-range/dateRanges.js +176 -0
  106. package/dist/backend/date-range/dateRanges.js.map +7 -0
  107. package/dist/backend/date-range/index.js +25 -0
  108. package/dist/backend/date-range/index.js.map +7 -0
  109. package/dist/backend/detail/AccessDeniedMessage.js +28 -0
  110. package/dist/backend/detail/AccessDeniedMessage.js.map +7 -0
  111. package/dist/backend/detail/ActivitiesSection.js +947 -0
  112. package/dist/backend/detail/ActivitiesSection.js.map +7 -0
  113. package/dist/backend/detail/AddressEditor.js +417 -0
  114. package/dist/backend/detail/AddressEditor.js.map +7 -0
  115. package/dist/backend/detail/AddressTiles.js +441 -0
  116. package/dist/backend/detail/AddressTiles.js.map +7 -0
  117. package/dist/backend/detail/AddressesSection.js +274 -0
  118. package/dist/backend/detail/AddressesSection.js.map +7 -0
  119. package/dist/backend/detail/AttachmentDeleteDialog.js +41 -0
  120. package/dist/backend/detail/AttachmentDeleteDialog.js.map +7 -0
  121. package/dist/backend/detail/AttachmentMetadataDialog.js +519 -0
  122. package/dist/backend/detail/AttachmentMetadataDialog.js.map +7 -0
  123. package/dist/backend/detail/AttachmentVisualPreview.js +132 -0
  124. package/dist/backend/detail/AttachmentVisualPreview.js.map +7 -0
  125. package/dist/backend/detail/AttachmentsSection.js +281 -0
  126. package/dist/backend/detail/AttachmentsSection.js.map +7 -0
  127. package/dist/backend/detail/CustomDataSection.js +575 -0
  128. package/dist/backend/detail/CustomDataSection.js.map +7 -0
  129. package/dist/backend/detail/DetailFieldsSection.js +85 -0
  130. package/dist/backend/detail/DetailFieldsSection.js.map +7 -0
  131. package/dist/backend/detail/ErrorMessage.js +28 -0
  132. package/dist/backend/detail/ErrorMessage.js.map +7 -0
  133. package/dist/backend/detail/InlineEditors.js +697 -0
  134. package/dist/backend/detail/InlineEditors.js.map +7 -0
  135. package/dist/backend/detail/LoadingMessage.js +14 -0
  136. package/dist/backend/detail/LoadingMessage.js.map +7 -0
  137. package/dist/backend/detail/NotesSection.js +1022 -0
  138. package/dist/backend/detail/NotesSection.js.map +7 -0
  139. package/dist/backend/detail/TabEmptyState.js +25 -0
  140. package/dist/backend/detail/TabEmptyState.js.map +7 -0
  141. package/dist/backend/detail/TagsSection.js +375 -0
  142. package/dist/backend/detail/TagsSection.js.map +7 -0
  143. package/dist/backend/detail/addressFormat.js +77 -0
  144. package/dist/backend/detail/addressFormat.js.map +7 -0
  145. package/dist/backend/detail/index.js +36 -0
  146. package/dist/backend/detail/index.js.map +7 -0
  147. package/dist/backend/devtools/UmesDevToolsPanel.js +109 -0
  148. package/dist/backend/devtools/UmesDevToolsPanel.js.map +7 -0
  149. package/dist/backend/devtools/components/ConflictWarnings.js +32 -0
  150. package/dist/backend/devtools/components/ConflictWarnings.js.map +7 -0
  151. package/dist/backend/devtools/components/EnricherTiming.js +46 -0
  152. package/dist/backend/devtools/components/EnricherTiming.js.map +7 -0
  153. package/dist/backend/devtools/components/EventFlow.js +34 -0
  154. package/dist/backend/devtools/components/EventFlow.js.map +7 -0
  155. package/dist/backend/devtools/components/ExtensionPointList.js +58 -0
  156. package/dist/backend/devtools/components/ExtensionPointList.js.map +7 -0
  157. package/dist/backend/devtools/components/InterceptorActivity.js +36 -0
  158. package/dist/backend/devtools/components/InterceptorActivity.js.map +7 -0
  159. package/dist/backend/devtools/index.js +7 -0
  160. package/dist/backend/devtools/index.js.map +7 -0
  161. package/dist/backend/devtools/useUmesDevTools.js +125 -0
  162. package/dist/backend/devtools/useUmesDevTools.js.map +7 -0
  163. package/dist/backend/document-viewer/RegionOverlay.js +92 -0
  164. package/dist/backend/document-viewer/RegionOverlay.js.map +7 -0
  165. package/dist/backend/document-viewer/index.js +6 -0
  166. package/dist/backend/document-viewer/index.js.map +7 -0
  167. package/dist/backend/dynamic-grid/DynamicGrid.js +130 -0
  168. package/dist/backend/dynamic-grid/DynamicGrid.js.map +7 -0
  169. package/dist/backend/dynamic-grid/adapters.js +34 -0
  170. package/dist/backend/dynamic-grid/adapters.js.map +7 -0
  171. package/dist/backend/dynamic-grid/components/GridCell.js +149 -0
  172. package/dist/backend/dynamic-grid/components/GridCell.js.map +7 -0
  173. package/dist/backend/dynamic-grid/components/GridRow.js +32 -0
  174. package/dist/backend/dynamic-grid/components/GridRow.js.map +7 -0
  175. package/dist/backend/dynamic-grid/hooks/useGridKeyboardNav.js +115 -0
  176. package/dist/backend/dynamic-grid/hooks/useGridKeyboardNav.js.map +7 -0
  177. package/dist/backend/dynamic-grid/index.js +9 -0
  178. package/dist/backend/dynamic-grid/index.js.map +7 -0
  179. package/dist/backend/dynamic-grid/types.js +1 -0
  180. package/dist/backend/dynamic-grid/types.js.map +7 -0
  181. package/dist/backend/dynamic-table/DynamicTable.js +2607 -0
  182. package/dist/backend/dynamic-table/DynamicTable.js.map +7 -0
  183. package/dist/backend/dynamic-table/DynamicTable.stories.js +233 -0
  184. package/dist/backend/dynamic-table/DynamicTable.stories.js.map +7 -0
  185. package/dist/backend/dynamic-table/components/ActiveFilterChips.js +60 -0
  186. package/dist/backend/dynamic-table/components/ActiveFilterChips.js.map +7 -0
  187. package/dist/backend/dynamic-table/components/BulkActionsBar.js +58 -0
  188. package/dist/backend/dynamic-table/components/BulkActionsBar.js.map +7 -0
  189. package/dist/backend/dynamic-table/components/Cell.js +155 -0
  190. package/dist/backend/dynamic-table/components/Cell.js.map +7 -0
  191. package/dist/backend/dynamic-table/components/CellCommentDialog.js +726 -0
  192. package/dist/backend/dynamic-table/components/CellCommentDialog.js.map +7 -0
  193. package/dist/backend/dynamic-table/components/CellCommentHoverPopup.js +77 -0
  194. package/dist/backend/dynamic-table/components/CellCommentHoverPopup.js.map +7 -0
  195. package/dist/backend/dynamic-table/components/ColumnFilterPopover.js +485 -0
  196. package/dist/backend/dynamic-table/components/ColumnFilterPopover.js.map +7 -0
  197. package/dist/backend/dynamic-table/components/ColumnHeaderMenu.js +173 -0
  198. package/dist/backend/dynamic-table/components/ColumnHeaderMenu.js.map +7 -0
  199. package/dist/backend/dynamic-table/components/ColumnHeaders.js +528 -0
  200. package/dist/backend/dynamic-table/components/ColumnHeaders.js.map +7 -0
  201. package/dist/backend/dynamic-table/components/CompactLabelCell.js +64 -0
  202. package/dist/backend/dynamic-table/components/CompactLabelCell.js.map +7 -0
  203. package/dist/backend/dynamic-table/components/ConfigureViewFields.js +139 -0
  204. package/dist/backend/dynamic-table/components/ConfigureViewFields.js.map +7 -0
  205. package/dist/backend/dynamic-table/components/ConfigureViewFilters.js +305 -0
  206. package/dist/backend/dynamic-table/components/ConfigureViewFilters.js.map +7 -0
  207. package/dist/backend/dynamic-table/components/ConfigureViewFormatting.js +169 -0
  208. package/dist/backend/dynamic-table/components/ConfigureViewFormatting.js.map +7 -0
  209. package/dist/backend/dynamic-table/components/ConfigureViewFormulas.js +298 -0
  210. package/dist/backend/dynamic-table/components/ConfigureViewFormulas.js.map +7 -0
  211. package/dist/backend/dynamic-table/components/ConfigureViewGrouping.js +224 -0
  212. package/dist/backend/dynamic-table/components/ConfigureViewGrouping.js.map +7 -0
  213. package/dist/backend/dynamic-table/components/ConfigureViewLinkedColumns.js +167 -0
  214. package/dist/backend/dynamic-table/components/ConfigureViewLinkedColumns.js.map +7 -0
  215. package/dist/backend/dynamic-table/components/ConfigureViewPanel.js +592 -0
  216. package/dist/backend/dynamic-table/components/ConfigureViewPanel.js.map +7 -0
  217. package/dist/backend/dynamic-table/components/ConfigureViewRollups.js +269 -0
  218. package/dist/backend/dynamic-table/components/ConfigureViewRollups.js.map +7 -0
  219. package/dist/backend/dynamic-table/components/ConfigureViewSorting.js +107 -0
  220. package/dist/backend/dynamic-table/components/ConfigureViewSorting.js.map +7 -0
  221. package/dist/backend/dynamic-table/components/ContextMenu.js +91 -0
  222. package/dist/backend/dynamic-table/components/ContextMenu.js.map +7 -0
  223. package/dist/backend/dynamic-table/components/DateCell.js +80 -0
  224. package/dist/backend/dynamic-table/components/DateCell.js.map +7 -0
  225. package/dist/backend/dynamic-table/components/Debugger.js +311 -0
  226. package/dist/backend/dynamic-table/components/Debugger.js.map +7 -0
  227. package/dist/backend/dynamic-table/components/DensityControl.js +289 -0
  228. package/dist/backend/dynamic-table/components/DensityControl.js.map +7 -0
  229. package/dist/backend/dynamic-table/components/EmptyState.js +42 -0
  230. package/dist/backend/dynamic-table/components/EmptyState.js.map +7 -0
  231. package/dist/backend/dynamic-table/components/EntitySearchEditor.js +369 -0
  232. package/dist/backend/dynamic-table/components/EntitySearchEditor.js.map +7 -0
  233. package/dist/backend/dynamic-table/components/ExportMenu.js +63 -0
  234. package/dist/backend/dynamic-table/components/ExportMenu.js.map +7 -0
  235. package/dist/backend/dynamic-table/components/FilterDatePicker.js +165 -0
  236. package/dist/backend/dynamic-table/components/FilterDatePicker.js.map +7 -0
  237. package/dist/backend/dynamic-table/components/FilterValueInput.js +200 -0
  238. package/dist/backend/dynamic-table/components/FilterValueInput.js.map +7 -0
  239. package/dist/backend/dynamic-table/components/FooterTotalsRow.js +165 -0
  240. package/dist/backend/dynamic-table/components/FooterTotalsRow.js.map +7 -0
  241. package/dist/backend/dynamic-table/components/FullscreenOverlay.js +51 -0
  242. package/dist/backend/dynamic-table/components/FullscreenOverlay.js.map +7 -0
  243. package/dist/backend/dynamic-table/components/GroupHeaderRow.js +108 -0
  244. package/dist/backend/dynamic-table/components/GroupHeaderRow.js.map +7 -0
  245. package/dist/backend/dynamic-table/components/GroupSummaryRow.js +134 -0
  246. package/dist/backend/dynamic-table/components/GroupSummaryRow.js.map +7 -0
  247. package/dist/backend/dynamic-table/components/ImportPanel.js +341 -0
  248. package/dist/backend/dynamic-table/components/ImportPanel.js.map +7 -0
  249. package/dist/backend/dynamic-table/components/ImportPreviewGrid.js +114 -0
  250. package/dist/backend/dynamic-table/components/ImportPreviewGrid.js.map +7 -0
  251. package/dist/backend/dynamic-table/components/LoadErrorState.js +23 -0
  252. package/dist/backend/dynamic-table/components/LoadErrorState.js.map +7 -0
  253. package/dist/backend/dynamic-table/components/MentionPopup.js +149 -0
  254. package/dist/backend/dynamic-table/components/MentionPopup.js.map +7 -0
  255. package/dist/backend/dynamic-table/components/PerspectiveDeleteDialog.js +57 -0
  256. package/dist/backend/dynamic-table/components/PerspectiveDeleteDialog.js.map +7 -0
  257. package/dist/backend/dynamic-table/components/PerspectivePublishDialog.js +100 -0
  258. package/dist/backend/dynamic-table/components/PerspectivePublishDialog.js.map +7 -0
  259. package/dist/backend/dynamic-table/components/PerspectiveTabMenu.js +159 -0
  260. package/dist/backend/dynamic-table/components/PerspectiveTabMenu.js.map +7 -0
  261. package/dist/backend/dynamic-table/components/PerspectiveTabs.js +319 -0
  262. package/dist/backend/dynamic-table/components/PerspectiveTabs.js.map +7 -0
  263. package/dist/backend/dynamic-table/components/PerspectiveTemplateMenu.js +90 -0
  264. package/dist/backend/dynamic-table/components/PerspectiveTemplateMenu.js.map +7 -0
  265. package/dist/backend/dynamic-table/components/RowHeaderCell.js +58 -0
  266. package/dist/backend/dynamic-table/components/RowHeaderCell.js.map +7 -0
  267. package/dist/backend/dynamic-table/components/SearchBar.js +221 -0
  268. package/dist/backend/dynamic-table/components/SearchBar.js.map +7 -0
  269. package/dist/backend/dynamic-table/components/SelectMenu.js +186 -0
  270. package/dist/backend/dynamic-table/components/SelectMenu.js.map +7 -0
  271. package/dist/backend/dynamic-table/components/StaleDataBar.js +26 -0
  272. package/dist/backend/dynamic-table/components/StaleDataBar.js.map +7 -0
  273. package/dist/backend/dynamic-table/components/TableDeleteDialog.js +48 -0
  274. package/dist/backend/dynamic-table/components/TableDeleteDialog.js.map +7 -0
  275. package/dist/backend/dynamic-table/components/TablePagination.js +69 -0
  276. package/dist/backend/dynamic-table/components/TablePagination.js.map +7 -0
  277. package/dist/backend/dynamic-table/components/TableSkeleton.js +43 -0
  278. package/dist/backend/dynamic-table/components/TableSkeleton.js.map +7 -0
  279. package/dist/backend/dynamic-table/components/ToolbarOverflow.js +204 -0
  280. package/dist/backend/dynamic-table/components/ToolbarOverflow.js.map +7 -0
  281. package/dist/backend/dynamic-table/components/ViewModeSwitch.js +50 -0
  282. package/dist/backend/dynamic-table/components/ViewModeSwitch.js.map +7 -0
  283. package/dist/backend/dynamic-table/components/VirtualRow.js +214 -0
  284. package/dist/backend/dynamic-table/components/VirtualRow.js.map +7 -0
  285. package/dist/backend/dynamic-table/components/editors.js +1483 -0
  286. package/dist/backend/dynamic-table/components/editors.js.map +7 -0
  287. package/dist/backend/dynamic-table/components/renderers.js +131 -0
  288. package/dist/backend/dynamic-table/components/renderers.js.map +7 -0
  289. package/dist/backend/dynamic-table/events/events.js +73 -0
  290. package/dist/backend/dynamic-table/events/events.js.map +7 -0
  291. package/dist/backend/dynamic-table/formula/check.js +243 -0
  292. package/dist/backend/dynamic-table/formula/check.js.map +7 -0
  293. package/dist/backend/dynamic-table/formula/evaluate.js +302 -0
  294. package/dist/backend/dynamic-table/formula/evaluate.js.map +7 -0
  295. package/dist/backend/dynamic-table/formula/functions.js +602 -0
  296. package/dist/backend/dynamic-table/formula/functions.js.map +7 -0
  297. package/dist/backend/dynamic-table/formula/index.js +47 -0
  298. package/dist/backend/dynamic-table/formula/index.js.map +7 -0
  299. package/dist/backend/dynamic-table/formula/parse.js +293 -0
  300. package/dist/backend/dynamic-table/formula/parse.js.map +7 -0
  301. package/dist/backend/dynamic-table/formula/types.js +24 -0
  302. package/dist/backend/dynamic-table/formula/types.js.map +7 -0
  303. package/dist/backend/dynamic-table/handlers/cellWrites.js +143 -0
  304. package/dist/backend/dynamic-table/handlers/cellWrites.js.map +7 -0
  305. package/dist/backend/dynamic-table/handlers/index.js +504 -0
  306. package/dist/backend/dynamic-table/handlers/index.js.map +7 -0
  307. package/dist/backend/dynamic-table/handlers/perspectiveHandlers.js +377 -0
  308. package/dist/backend/dynamic-table/handlers/perspectiveHandlers.js.map +7 -0
  309. package/dist/backend/dynamic-table/hooks/index.js +524 -0
  310. package/dist/backend/dynamic-table/hooks/index.js.map +7 -0
  311. package/dist/backend/dynamic-table/hooks/useAbbreviations.js +19 -0
  312. package/dist/backend/dynamic-table/hooks/useAbbreviations.js.map +7 -0
  313. package/dist/backend/dynamic-table/hooks/useAnnotations.js +115 -0
  314. package/dist/backend/dynamic-table/hooks/useAnnotations.js.map +7 -0
  315. package/dist/backend/dynamic-table/hooks/useColumnVirtualizer.js +155 -0
  316. package/dist/backend/dynamic-table/hooks/useColumnVirtualizer.js.map +7 -0
  317. package/dist/backend/dynamic-table/hooks/useColumnWidthPersistence.js +135 -0
  318. package/dist/backend/dynamic-table/hooks/useColumnWidthPersistence.js.map +7 -0
  319. package/dist/backend/dynamic-table/hooks/useDensityPreference.js +203 -0
  320. package/dist/backend/dynamic-table/hooks/useDensityPreference.js.map +7 -0
  321. package/dist/backend/dynamic-table/hooks/useDynamicTablePage.js +1005 -0
  322. package/dist/backend/dynamic-table/hooks/useDynamicTablePage.js.map +7 -0
  323. package/dist/backend/dynamic-table/hooks/useEscapeLayer.js +32 -0
  324. package/dist/backend/dynamic-table/hooks/useEscapeLayer.js.map +7 -0
  325. package/dist/backend/dynamic-table/hooks/useGrouping.js +256 -0
  326. package/dist/backend/dynamic-table/hooks/useGrouping.js.map +7 -0
  327. package/dist/backend/dynamic-table/hooks/useSuggestionFetch.js +63 -0
  328. package/dist/backend/dynamic-table/hooks/useSuggestionFetch.js.map +7 -0
  329. package/dist/backend/dynamic-table/hooks/useTableDateFormat.js +11 -0
  330. package/dist/backend/dynamic-table/hooks/useTableDateFormat.js.map +7 -0
  331. package/dist/backend/dynamic-table/index.js +476 -0
  332. package/dist/backend/dynamic-table/index.js.map +7 -0
  333. package/dist/backend/dynamic-table/registry/ContentRegistryContext.js +126 -0
  334. package/dist/backend/dynamic-table/registry/ContentRegistryContext.js.map +7 -0
  335. package/dist/backend/dynamic-table/registry/TableRegistryContext.js +43 -0
  336. package/dist/backend/dynamic-table/registry/TableRegistryContext.js.map +7 -0
  337. package/dist/backend/dynamic-table/registry/filterAccessibleTables.js +13 -0
  338. package/dist/backend/dynamic-table/registry/filterAccessibleTables.js.map +7 -0
  339. package/dist/backend/dynamic-table/registry/index.js +44 -0
  340. package/dist/backend/dynamic-table/registry/index.js.map +7 -0
  341. package/dist/backend/dynamic-table/registry/lazyTable.js +55 -0
  342. package/dist/backend/dynamic-table/registry/lazyTable.js.map +7 -0
  343. package/dist/backend/dynamic-table/registry/types.js +1 -0
  344. package/dist/backend/dynamic-table/registry/types.js.map +7 -0
  345. package/dist/backend/dynamic-table/registry/widgetCatalog.js +96 -0
  346. package/dist/backend/dynamic-table/registry/widgetCatalog.js.map +7 -0
  347. package/dist/backend/dynamic-table/server/aggregate.js +261 -0
  348. package/dist/backend/dynamic-table/server/aggregate.js.map +7 -0
  349. package/dist/backend/dynamic-table/server/dateWindows.js +105 -0
  350. package/dist/backend/dynamic-table/server/dateWindows.js.map +7 -0
  351. package/dist/backend/dynamic-table/server/filterParser.js +97 -0
  352. package/dist/backend/dynamic-table/server/filterParser.js.map +7 -0
  353. package/dist/backend/dynamic-table/server/filterSuggestions.js +70 -0
  354. package/dist/backend/dynamic-table/server/filterSuggestions.js.map +7 -0
  355. package/dist/backend/dynamic-table/server/index.js +47 -0
  356. package/dist/backend/dynamic-table/server/index.js.map +7 -0
  357. package/dist/backend/dynamic-table/server/makeDynamicTableRoute.js +270 -0
  358. package/dist/backend/dynamic-table/server/makeDynamicTableRoute.js.map +7 -0
  359. package/dist/backend/dynamic-table/split-view/ContentPicker.js +171 -0
  360. package/dist/backend/dynamic-table/split-view/ContentPicker.js.map +7 -0
  361. package/dist/backend/dynamic-table/split-view/EmptySlot.js +47 -0
  362. package/dist/backend/dynamic-table/split-view/EmptySlot.js.map +7 -0
  363. package/dist/backend/dynamic-table/split-view/SplitViewHost.js +863 -0
  364. package/dist/backend/dynamic-table/split-view/SplitViewHost.js.map +7 -0
  365. package/dist/backend/dynamic-table/split-view/WidgetPane.js +280 -0
  366. package/dist/backend/dynamic-table/split-view/WidgetPane.js.map +7 -0
  367. package/dist/backend/dynamic-table/split-view/WorkspaceFilterBar.js +524 -0
  368. package/dist/backend/dynamic-table/split-view/WorkspaceFilterBar.js.map +7 -0
  369. package/dist/backend/dynamic-table/split-view/index.js +61 -0
  370. package/dist/backend/dynamic-table/split-view/index.js.map +7 -0
  371. package/dist/backend/dynamic-table/split-view/layoutPersistence.js +91 -0
  372. package/dist/backend/dynamic-table/split-view/layoutPersistence.js.map +7 -0
  373. package/dist/backend/dynamic-table/split-view/sharedCriteria.js +62 -0
  374. package/dist/backend/dynamic-table/split-view/sharedCriteria.js.map +7 -0
  375. package/dist/backend/dynamic-table/split-view/types.js +426 -0
  376. package/dist/backend/dynamic-table/split-view/types.js.map +7 -0
  377. package/dist/backend/dynamic-table/split-view/useSplitViewLayouts.js +79 -0
  378. package/dist/backend/dynamic-table/split-view/useSplitViewLayouts.js.map +7 -0
  379. package/dist/backend/dynamic-table/store/index.js +611 -0
  380. package/dist/backend/dynamic-table/store/index.js.map +7 -0
  381. package/dist/backend/dynamic-table/styles/ContextMenu.css.js +2 -0
  382. package/dist/backend/dynamic-table/styles/DynamicTable.css.js +2 -0
  383. package/dist/backend/dynamic-table/styles/DynamicTable.v2.css.js +2 -0
  384. package/dist/backend/dynamic-table/styles/SearchBar.css.js +2 -0
  385. package/dist/backend/dynamic-table/styles/dateCell.css.js +2 -0
  386. package/dist/backend/dynamic-table/styles/density.css.js +2 -0
  387. package/dist/backend/dynamic-table/types/density.js +29 -0
  388. package/dist/backend/dynamic-table/types/density.js.map +7 -0
  389. package/dist/backend/dynamic-table/types/filters.js +124 -0
  390. package/dist/backend/dynamic-table/types/filters.js.map +7 -0
  391. package/dist/backend/dynamic-table/types/grouping.js +34 -0
  392. package/dist/backend/dynamic-table/types/grouping.js.map +7 -0
  393. package/dist/backend/dynamic-table/types/import.js +7 -0
  394. package/dist/backend/dynamic-table/types/import.js.map +7 -0
  395. package/dist/backend/dynamic-table/types/index.js +46 -0
  396. package/dist/backend/dynamic-table/types/index.js.map +7 -0
  397. package/dist/backend/dynamic-table/types/perspective.js +79 -0
  398. package/dist/backend/dynamic-table/types/perspective.js.map +7 -0
  399. package/dist/backend/dynamic-table/types/rollup.js +13 -0
  400. package/dist/backend/dynamic-table/types/rollup.js.map +7 -0
  401. package/dist/backend/dynamic-table/utils/abbreviations.js +228 -0
  402. package/dist/backend/dynamic-table/utils/abbreviations.js.map +7 -0
  403. package/dist/backend/dynamic-table/utils/anchoredPosition.js +21 -0
  404. package/dist/backend/dynamic-table/utils/anchoredPosition.js.map +7 -0
  405. package/dist/backend/dynamic-table/utils/badgeAutoFit.js +35 -0
  406. package/dist/backend/dynamic-table/utils/badgeAutoFit.js.map +7 -0
  407. package/dist/backend/dynamic-table/utils/clipboard.js +172 -0
  408. package/dist/backend/dynamic-table/utils/clipboard.js.map +7 -0
  409. package/dist/backend/dynamic-table/utils/coerceCellValue.js +52 -0
  410. package/dist/backend/dynamic-table/utils/coerceCellValue.js.map +7 -0
  411. package/dist/backend/dynamic-table/utils/colorAdjacency.js +27 -0
  412. package/dist/backend/dynamic-table/utils/colorAdjacency.js.map +7 -0
  413. package/dist/backend/dynamic-table/utils/columnFill.js +36 -0
  414. package/dist/backend/dynamic-table/utils/columnFill.js.map +7 -0
  415. package/dist/backend/dynamic-table/utils/columnSpacerStyle.js +21 -0
  416. package/dist/backend/dynamic-table/utils/columnSpacerStyle.js.map +7 -0
  417. package/dist/backend/dynamic-table/utils/columnWindow.js +293 -0
  418. package/dist/backend/dynamic-table/utils/columnWindow.js.map +7 -0
  419. package/dist/backend/dynamic-table/utils/conditionalFormat.js +188 -0
  420. package/dist/backend/dynamic-table/utils/conditionalFormat.js.map +7 -0
  421. package/dist/backend/dynamic-table/utils/exportTable.js +82 -0
  422. package/dist/backend/dynamic-table/utils/exportTable.js.map +7 -0
  423. package/dist/backend/dynamic-table/utils/fillGeometry.js +92 -0
  424. package/dist/backend/dynamic-table/utils/fillGeometry.js.map +7 -0
  425. package/dist/backend/dynamic-table/utils/fillPatterns.js +241 -0
  426. package/dist/backend/dynamic-table/utils/fillPatterns.js.map +7 -0
  427. package/dist/backend/dynamic-table/utils/formatAggregate.js +82 -0
  428. package/dist/backend/dynamic-table/utils/formatAggregate.js.map +7 -0
  429. package/dist/backend/dynamic-table/utils/formatDateCompact.js +508 -0
  430. package/dist/backend/dynamic-table/utils/formatDateCompact.js.map +7 -0
  431. package/dist/backend/dynamic-table/utils/formatLabelCompact.js +312 -0
  432. package/dist/backend/dynamic-table/utils/formatLabelCompact.js.map +7 -0
  433. package/dist/backend/dynamic-table/utils/formulaColumns.js +158 -0
  434. package/dist/backend/dynamic-table/utils/formulaColumns.js.map +7 -0
  435. package/dist/backend/dynamic-table/utils/importMapping.js +118 -0
  436. package/dist/backend/dynamic-table/utils/importMapping.js.map +7 -0
  437. package/dist/backend/dynamic-table/utils/importParse.js +121 -0
  438. package/dist/backend/dynamic-table/utils/importParse.js.map +7 -0
  439. package/dist/backend/dynamic-table/utils/lookupColumns.js +28 -0
  440. package/dist/backend/dynamic-table/utils/lookupColumns.js.map +7 -0
  441. package/dist/backend/dynamic-table/utils/perspectiveTransforms.js +191 -0
  442. package/dist/backend/dynamic-table/utils/perspectiveTransforms.js.map +7 -0
  443. package/dist/backend/dynamic-table/utils/rollupColumns.js +81 -0
  444. package/dist/backend/dynamic-table/utils/rollupColumns.js.map +7 -0
  445. package/dist/backend/dynamic-table/validators/index.js +36 -0
  446. package/dist/backend/dynamic-table/validators/index.js.map +7 -0
  447. package/dist/backend/fields/registry.generated.js +8 -0
  448. package/dist/backend/fields/registry.generated.js.map +7 -0
  449. package/dist/backend/fields/registry.js +29 -0
  450. package/dist/backend/fields/registry.js.map +7 -0
  451. package/dist/backend/filters/AdvancedFilterBuilder.js +280 -0
  452. package/dist/backend/filters/AdvancedFilterBuilder.js.map +7 -0
  453. package/dist/backend/forms/ActionsDropdown.js +160 -0
  454. package/dist/backend/forms/ActionsDropdown.js.map +7 -0
  455. package/dist/backend/forms/FormActionButtons.js +59 -0
  456. package/dist/backend/forms/FormActionButtons.js.map +7 -0
  457. package/dist/backend/forms/FormFooter.js +18 -0
  458. package/dist/backend/forms/FormFooter.js.map +7 -0
  459. package/dist/backend/forms/FormHeader.js +125 -0
  460. package/dist/backend/forms/FormHeader.js.map +7 -0
  461. package/dist/backend/forms/index.js +11 -0
  462. package/dist/backend/forms/index.js.map +7 -0
  463. package/dist/backend/hooks/useAdvancedFilter.js +64 -0
  464. package/dist/backend/hooks/useAdvancedFilter.js.map +7 -0
  465. package/dist/backend/indexes/PartialIndexBanner.js +74 -0
  466. package/dist/backend/indexes/PartialIndexBanner.js.map +7 -0
  467. package/dist/backend/indexes/store.js +62 -0
  468. package/dist/backend/indexes/store.js.map +7 -0
  469. package/dist/backend/injection/ComponentOverrideProvider.js +55 -0
  470. package/dist/backend/injection/ComponentOverrideProvider.js.map +7 -0
  471. package/dist/backend/injection/InjectedField.js +166 -0
  472. package/dist/backend/injection/InjectedField.js.map +7 -0
  473. package/dist/backend/injection/InjectionSpot.js +323 -0
  474. package/dist/backend/injection/InjectionSpot.js.map +7 -0
  475. package/dist/backend/injection/InjectionWizard.js +256 -0
  476. package/dist/backend/injection/InjectionWizard.js.map +7 -0
  477. package/dist/backend/injection/PageInjectionBoundary.js +26 -0
  478. package/dist/backend/injection/PageInjectionBoundary.js.map +7 -0
  479. package/dist/backend/injection/SseEventIndicator.js +8 -0
  480. package/dist/backend/injection/SseEventIndicator.js.map +7 -0
  481. package/dist/backend/injection/StatusBadgeInjectionSpot.js +34 -0
  482. package/dist/backend/injection/StatusBadgeInjectionSpot.js.map +7 -0
  483. package/dist/backend/injection/StatusBadgeRenderer.js +58 -0
  484. package/dist/backend/injection/StatusBadgeRenderer.js.map +7 -0
  485. package/dist/backend/injection/WidgetSharedState.js +49 -0
  486. package/dist/backend/injection/WidgetSharedState.js.map +7 -0
  487. package/dist/backend/injection/WizardInjectionSpot.js +30 -0
  488. package/dist/backend/injection/WizardInjectionSpot.js.map +7 -0
  489. package/dist/backend/injection/eventBridge.js +129 -0
  490. package/dist/backend/injection/eventBridge.js.map +7 -0
  491. package/dist/backend/injection/helpers.js +26 -0
  492. package/dist/backend/injection/helpers.js.map +7 -0
  493. package/dist/backend/injection/mergeMenuItems.js +49 -0
  494. package/dist/backend/injection/mergeMenuItems.js.map +7 -0
  495. package/dist/backend/injection/mutationEvents.js +20 -0
  496. package/dist/backend/injection/mutationEvents.js.map +7 -0
  497. package/dist/backend/injection/resolveInjectedIcon.js +23 -0
  498. package/dist/backend/injection/resolveInjectedIcon.js.map +7 -0
  499. package/dist/backend/injection/spotIds.js +72 -0
  500. package/dist/backend/injection/spotIds.js.map +7 -0
  501. package/dist/backend/injection/useAppEvent.js +35 -0
  502. package/dist/backend/injection/useAppEvent.js.map +7 -0
  503. package/dist/backend/injection/useGuardedMutation.js +71 -0
  504. package/dist/backend/injection/useGuardedMutation.js.map +7 -0
  505. package/dist/backend/injection/useInjectedMenuItems.js +49 -0
  506. package/dist/backend/injection/useInjectedMenuItems.js.map +7 -0
  507. package/dist/backend/injection/useInjectionDataWidgets.js +36 -0
  508. package/dist/backend/injection/useInjectionDataWidgets.js.map +7 -0
  509. package/dist/backend/injection/useOperationProgress.js +64 -0
  510. package/dist/backend/injection/useOperationProgress.js.map +7 -0
  511. package/dist/backend/injection/useRegisteredComponent.js +89 -0
  512. package/dist/backend/injection/useRegisteredComponent.js.map +7 -0
  513. package/dist/backend/injection/useWidgetSharedState.js +26 -0
  514. package/dist/backend/injection/useWidgetSharedState.js.map +7 -0
  515. package/dist/backend/injection/visibility-utils.js +29 -0
  516. package/dist/backend/injection/visibility-utils.js.map +7 -0
  517. package/dist/backend/injection/widgetRegistry.js +55 -0
  518. package/dist/backend/injection/widgetRegistry.js.map +7 -0
  519. package/dist/backend/inputs/ComboboxInput.js +228 -0
  520. package/dist/backend/inputs/ComboboxInput.js.map +7 -0
  521. package/dist/backend/inputs/DatePicker.js +148 -0
  522. package/dist/backend/inputs/DatePicker.js.map +7 -0
  523. package/dist/backend/inputs/DateTimePicker.js +188 -0
  524. package/dist/backend/inputs/DateTimePicker.js.map +7 -0
  525. package/dist/backend/inputs/EventPatternInput.js +38 -0
  526. package/dist/backend/inputs/EventPatternInput.js.map +7 -0
  527. package/dist/backend/inputs/EventSelect.js +115 -0
  528. package/dist/backend/inputs/EventSelect.js.map +7 -0
  529. package/dist/backend/inputs/LookupSelect.js +197 -0
  530. package/dist/backend/inputs/LookupSelect.js.map +7 -0
  531. package/dist/backend/inputs/PhoneNumberField.js +133 -0
  532. package/dist/backend/inputs/PhoneNumberField.js.map +7 -0
  533. package/dist/backend/inputs/SwitchableMarkdownInput.js +73 -0
  534. package/dist/backend/inputs/SwitchableMarkdownInput.js.map +7 -0
  535. package/dist/backend/inputs/TagsInput.js +258 -0
  536. package/dist/backend/inputs/TagsInput.js.map +7 -0
  537. package/dist/backend/inputs/TimeInput.js +132 -0
  538. package/dist/backend/inputs/TimeInput.js.map +7 -0
  539. package/dist/backend/inputs/TimePicker.js +105 -0
  540. package/dist/backend/inputs/TimePicker.js.map +7 -0
  541. package/dist/backend/inputs/index.js +12 -0
  542. package/dist/backend/inputs/index.js.map +7 -0
  543. package/dist/backend/markdown/MarkdownContent.js +20 -0
  544. package/dist/backend/markdown/MarkdownContent.js.map +7 -0
  545. package/dist/backend/markdown/index.js +3 -0
  546. package/dist/backend/markdown/index.js.map +7 -0
  547. package/dist/backend/markdown/useMarkdownRemarkPlugins.js +33 -0
  548. package/dist/backend/markdown/useMarkdownRemarkPlugins.js.map +7 -0
  549. package/dist/backend/messages/MessageComposer.js +158 -0
  550. package/dist/backend/messages/MessageComposer.js.map +7 -0
  551. package/dist/backend/messages/MessageObjectDetail.js +81 -0
  552. package/dist/backend/messages/MessageObjectDetail.js.map +7 -0
  553. package/dist/backend/messages/MessageObjectPreview.js +48 -0
  554. package/dist/backend/messages/MessageObjectPreview.js.map +7 -0
  555. package/dist/backend/messages/MessageObjectRecordPicker.js +89 -0
  556. package/dist/backend/messages/MessageObjectRecordPicker.js.map +7 -0
  557. package/dist/backend/messages/MessagePrioritySelector.js +74 -0
  558. package/dist/backend/messages/MessagePrioritySelector.js.map +7 -0
  559. package/dist/backend/messages/MessagesIcon.js +22 -0
  560. package/dist/backend/messages/MessagesIcon.js.map +7 -0
  561. package/dist/backend/messages/SendObjectMessageDialog.js +65 -0
  562. package/dist/backend/messages/SendObjectMessageDialog.js.map +7 -0
  563. package/dist/backend/messages/index.js +17 -0
  564. package/dist/backend/messages/index.js.map +7 -0
  565. package/dist/backend/messages/message-compose-form-groups.js +333 -0
  566. package/dist/backend/messages/message-compose-form-groups.js.map +7 -0
  567. package/dist/backend/messages/message-composer.types.js +1 -0
  568. package/dist/backend/messages/message-composer.types.js.map +7 -0
  569. package/dist/backend/messages/message-priority.js +40 -0
  570. package/dist/backend/messages/message-priority.js.map +7 -0
  571. package/dist/backend/messages/useMessageCompose.js +488 -0
  572. package/dist/backend/messages/useMessageCompose.js.map +7 -0
  573. package/dist/backend/messages/useMessageComposeOperations.js +163 -0
  574. package/dist/backend/messages/useMessageComposeOperations.js.map +7 -0
  575. package/dist/backend/messages/useMessagesPoll.js +79 -0
  576. package/dist/backend/messages/useMessagesPoll.js.map +7 -0
  577. package/dist/backend/notifications/NotificationBell.js +83 -0
  578. package/dist/backend/notifications/NotificationBell.js.map +7 -0
  579. package/dist/backend/notifications/NotificationCountBadge.js +9 -0
  580. package/dist/backend/notifications/NotificationCountBadge.js.map +7 -0
  581. package/dist/backend/notifications/NotificationDispatcher.js +165 -0
  582. package/dist/backend/notifications/NotificationDispatcher.js.map +7 -0
  583. package/dist/backend/notifications/NotificationItem.js +187 -0
  584. package/dist/backend/notifications/NotificationItem.js.map +7 -0
  585. package/dist/backend/notifications/NotificationPanel.js +146 -0
  586. package/dist/backend/notifications/NotificationPanel.js.map +7 -0
  587. package/dist/backend/notifications/index.js +19 -0
  588. package/dist/backend/notifications/index.js.map +7 -0
  589. package/dist/backend/notifications/useNotificationActions.js +124 -0
  590. package/dist/backend/notifications/useNotificationActions.js.map +7 -0
  591. package/dist/backend/notifications/useNotificationEffect.js +13 -0
  592. package/dist/backend/notifications/useNotificationEffect.js.map +7 -0
  593. package/dist/backend/notifications/useNotifications.js +11 -0
  594. package/dist/backend/notifications/useNotifications.js.map +7 -0
  595. package/dist/backend/notifications/useNotificationsPoll.js +135 -0
  596. package/dist/backend/notifications/useNotificationsPoll.js.map +7 -0
  597. package/dist/backend/notifications/useNotificationsSse.js +173 -0
  598. package/dist/backend/notifications/useNotificationsSse.js.map +7 -0
  599. package/dist/backend/operations/LastOperationBanner.js +80 -0
  600. package/dist/backend/operations/LastOperationBanner.js.map +7 -0
  601. package/dist/backend/operations/store.js +183 -0
  602. package/dist/backend/operations/store.js.map +7 -0
  603. package/dist/backend/progress/ProgressTopBar.js +129 -0
  604. package/dist/backend/progress/ProgressTopBar.js.map +7 -0
  605. package/dist/backend/progress/useProgress.js +11 -0
  606. package/dist/backend/progress/useProgress.js.map +7 -0
  607. package/dist/backend/progress/useProgressPoll.js +69 -0
  608. package/dist/backend/progress/useProgressPoll.js.map +7 -0
  609. package/dist/backend/progress/useProgressSse.js +104 -0
  610. package/dist/backend/progress/useProgressSse.js.map +7 -0
  611. package/dist/backend/schedule/ScheduleAgenda.js +107 -0
  612. package/dist/backend/schedule/ScheduleAgenda.js.map +7 -0
  613. package/dist/backend/schedule/ScheduleGrid.js +107 -0
  614. package/dist/backend/schedule/ScheduleGrid.js.map +7 -0
  615. package/dist/backend/schedule/ScheduleToolbar.js +166 -0
  616. package/dist/backend/schedule/ScheduleToolbar.js.map +7 -0
  617. package/dist/backend/schedule/ScheduleView.js +168 -0
  618. package/dist/backend/schedule/ScheduleView.js.map +7 -0
  619. package/dist/backend/schedule/index.js +6 -0
  620. package/dist/backend/schedule/index.js.map +7 -0
  621. package/dist/backend/schedule/recurrence.js +83 -0
  622. package/dist/backend/schedule/recurrence.js.map +7 -0
  623. package/dist/backend/schedule/types.js +1 -0
  624. package/dist/backend/schedule/types.js.map +7 -0
  625. package/dist/backend/section-page/SectionNav.js +104 -0
  626. package/dist/backend/section-page/SectionNav.js.map +7 -0
  627. package/dist/backend/section-page/SectionPage.js +33 -0
  628. package/dist/backend/section-page/SectionPage.js.map +7 -0
  629. package/dist/backend/section-page/index.js +7 -0
  630. package/dist/backend/section-page/index.js.map +7 -0
  631. package/dist/backend/section-page/types.js +1 -0
  632. package/dist/backend/section-page/types.js.map +7 -0
  633. package/dist/backend/settings/SettingsNavigation.js +43 -0
  634. package/dist/backend/settings/SettingsNavigation.js.map +7 -0
  635. package/dist/backend/settings/SettingsPageWrapper.js +66 -0
  636. package/dist/backend/settings/SettingsPageWrapper.js.map +7 -0
  637. package/dist/backend/settings/index.js +6 -0
  638. package/dist/backend/settings/index.js.map +7 -0
  639. package/dist/backend/upgrades/UpgradeActionBanner.js +91 -0
  640. package/dist/backend/upgrades/UpgradeActionBanner.js.map +7 -0
  641. package/dist/backend/utils/api.js +178 -0
  642. package/dist/backend/utils/api.js.map +7 -0
  643. package/dist/backend/utils/apiCall.js +68 -0
  644. package/dist/backend/utils/apiCall.js.map +7 -0
  645. package/dist/backend/utils/crud.js +126 -0
  646. package/dist/backend/utils/crud.js.map +7 -0
  647. package/dist/backend/utils/customFieldColumns.js +100 -0
  648. package/dist/backend/utils/customFieldColumns.js.map +7 -0
  649. package/dist/backend/utils/customFieldDefs.js +143 -0
  650. package/dist/backend/utils/customFieldDefs.js.map +7 -0
  651. package/dist/backend/utils/customFieldFilters.js +151 -0
  652. package/dist/backend/utils/customFieldFilters.js.map +7 -0
  653. package/dist/backend/utils/customFieldForms.js +169 -0
  654. package/dist/backend/utils/customFieldForms.js.map +7 -0
  655. package/dist/backend/utils/customFieldRelationDisplay.js +239 -0
  656. package/dist/backend/utils/customFieldRelationDisplay.js.map +7 -0
  657. package/dist/backend/utils/customFieldValues.js +26 -0
  658. package/dist/backend/utils/customFieldValues.js.map +7 -0
  659. package/dist/backend/utils/flash.js +16 -0
  660. package/dist/backend/utils/flash.js.map +7 -0
  661. package/dist/backend/utils/nav.js +280 -0
  662. package/dist/backend/utils/nav.js.map +7 -0
  663. package/dist/backend/utils/richTextSanitizer.js +11 -0
  664. package/dist/backend/utils/richTextSanitizer.js.map +7 -0
  665. package/dist/backend/utils/scopedHeaderStack.js +44 -0
  666. package/dist/backend/utils/scopedHeaderStack.js.map +7 -0
  667. package/dist/backend/utils/serverErrors.js +237 -0
  668. package/dist/backend/utils/serverErrors.js.map +7 -0
  669. package/dist/backend/utils/useAutoDiscoveredFields.js +96 -0
  670. package/dist/backend/utils/useAutoDiscoveredFields.js.map +7 -0
  671. package/dist/backend/version-history/VersionHistoryAction.js +67 -0
  672. package/dist/backend/version-history/VersionHistoryAction.js.map +7 -0
  673. package/dist/backend/version-history/VersionHistoryDetail.js +57 -0
  674. package/dist/backend/version-history/VersionHistoryDetail.js.map +7 -0
  675. package/dist/backend/version-history/VersionHistoryPanel.js +270 -0
  676. package/dist/backend/version-history/VersionHistoryPanel.js.map +7 -0
  677. package/dist/backend/version-history/index.js +13 -0
  678. package/dist/backend/version-history/index.js.map +7 -0
  679. package/dist/backend/version-history/labels.js +52 -0
  680. package/dist/backend/version-history/labels.js.map +7 -0
  681. package/dist/backend/version-history/types.js +1 -0
  682. package/dist/backend/version-history/types.js.map +7 -0
  683. package/dist/backend/version-history/useAuditPermissions.js +72 -0
  684. package/dist/backend/version-history/useAuditPermissions.js.map +7 -0
  685. package/dist/backend/version-history/useVersionHistory.js +141 -0
  686. package/dist/backend/version-history/useVersionHistory.js.map +7 -0
  687. package/dist/backend/views/NewViewForm.js +56 -0
  688. package/dist/backend/views/NewViewForm.js.map +7 -0
  689. package/dist/backend/views/ShareForm.js +49 -0
  690. package/dist/backend/views/ShareForm.js.map +7 -0
  691. package/dist/backend/views/ViewChip.js +112 -0
  692. package/dist/backend/views/ViewChip.js.map +7 -0
  693. package/dist/backend/views/ViewChipMenu.js +89 -0
  694. package/dist/backend/views/ViewChipMenu.js.map +7 -0
  695. package/dist/backend/views/types.js +1 -0
  696. package/dist/backend/views/types.js.map +7 -0
  697. package/dist/frontend/AuthFooter.js +23 -0
  698. package/dist/frontend/AuthFooter.js.map +7 -0
  699. package/dist/frontend/LanguageSwitcher.js +57 -0
  700. package/dist/frontend/LanguageSwitcher.js.map +7 -0
  701. package/dist/frontend/Layout.js +14 -0
  702. package/dist/frontend/Layout.js.map +7 -0
  703. package/dist/hooks/useIsMobile.js +21 -0
  704. package/dist/hooks/useIsMobile.js.map +7 -0
  705. package/dist/index.js +40 -0
  706. package/dist/index.js.map +7 -0
  707. package/dist/portal/PortalContext.js +113 -0
  708. package/dist/portal/PortalContext.js.map +7 -0
  709. package/dist/portal/PortalLayoutProvider.js +5 -0
  710. package/dist/portal/PortalLayoutProvider.js.map +7 -0
  711. package/dist/portal/PortalLayoutShell.js +44 -0
  712. package/dist/portal/PortalLayoutShell.js.map +7 -0
  713. package/dist/portal/PortalShell.js +229 -0
  714. package/dist/portal/PortalShell.js.map +7 -0
  715. package/dist/portal/components/PortalCard.js +31 -0
  716. package/dist/portal/components/PortalCard.js.map +7 -0
  717. package/dist/portal/components/PortalEmptyState.js +16 -0
  718. package/dist/portal/components/PortalEmptyState.js.map +7 -0
  719. package/dist/portal/components/PortalFeatureCard.js +21 -0
  720. package/dist/portal/components/PortalFeatureCard.js.map +7 -0
  721. package/dist/portal/components/PortalNotificationBell.js +67 -0
  722. package/dist/portal/components/PortalNotificationBell.js.map +7 -0
  723. package/dist/portal/components/PortalNotificationPanel.js +158 -0
  724. package/dist/portal/components/PortalNotificationPanel.js.map +7 -0
  725. package/dist/portal/components/PortalPageHeader.js +16 -0
  726. package/dist/portal/components/PortalPageHeader.js.map +7 -0
  727. package/dist/portal/components/index.js +18 -0
  728. package/dist/portal/components/index.js.map +7 -0
  729. package/dist/portal/hooks/useCustomerAuth.js +69 -0
  730. package/dist/portal/hooks/useCustomerAuth.js.map +7 -0
  731. package/dist/portal/hooks/usePortalAppEvent.js +26 -0
  732. package/dist/portal/hooks/usePortalAppEvent.js.map +7 -0
  733. package/dist/portal/hooks/usePortalDashboardWidgets.js +37 -0
  734. package/dist/portal/hooks/usePortalDashboardWidgets.js.map +7 -0
  735. package/dist/portal/hooks/usePortalEventBridge.js +129 -0
  736. package/dist/portal/hooks/usePortalEventBridge.js.map +7 -0
  737. package/dist/portal/hooks/usePortalInjectedMenuItems.js +88 -0
  738. package/dist/portal/hooks/usePortalInjectedMenuItems.js.map +7 -0
  739. package/dist/portal/hooks/usePortalNotifications.js +85 -0
  740. package/dist/portal/hooks/usePortalNotifications.js.map +7 -0
  741. package/dist/portal/hooks/useTenantContext.js +53 -0
  742. package/dist/portal/hooks/useTenantContext.js.map +7 -0
  743. package/dist/primitives/DataLoader.js +68 -0
  744. package/dist/primitives/DataLoader.js.map +7 -0
  745. package/dist/primitives/ErrorNotice.js +14 -0
  746. package/dist/primitives/ErrorNotice.js.map +7 -0
  747. package/dist/primitives/Notice.js +55 -0
  748. package/dist/primitives/Notice.js.map +7 -0
  749. package/dist/primitives/alert.js +38 -0
  750. package/dist/primitives/alert.js.map +7 -0
  751. package/dist/primitives/badge.js +33 -0
  752. package/dist/primitives/badge.js.map +7 -0
  753. package/dist/primitives/button.js +45 -0
  754. package/dist/primitives/button.js.map +7 -0
  755. package/dist/primitives/calendar.js +62 -0
  756. package/dist/primitives/calendar.js.map +7 -0
  757. package/dist/primitives/card.js +91 -0
  758. package/dist/primitives/card.js.map +7 -0
  759. package/dist/primitives/checkbox.js +28 -0
  760. package/dist/primitives/checkbox.js.map +7 -0
  761. package/dist/primitives/dialog.js +101 -0
  762. package/dist/primitives/dialog.js.map +7 -0
  763. package/dist/primitives/form-field.js +78 -0
  764. package/dist/primitives/form-field.js.map +7 -0
  765. package/dist/primitives/icon-button.js +40 -0
  766. package/dist/primitives/icon-button.js.map +7 -0
  767. package/dist/primitives/input.js +22 -0
  768. package/dist/primitives/input.js.map +7 -0
  769. package/dist/primitives/label.js +21 -0
  770. package/dist/primitives/label.js.map +7 -0
  771. package/dist/primitives/popover.js +36 -0
  772. package/dist/primitives/popover.js.map +7 -0
  773. package/dist/primitives/primitives.stories.js +187 -0
  774. package/dist/primitives/primitives.stories.js.map +7 -0
  775. package/dist/primitives/progress.js +28 -0
  776. package/dist/primitives/progress.js.map +7 -0
  777. package/dist/primitives/separator.js +9 -0
  778. package/dist/primitives/separator.js.map +7 -0
  779. package/dist/primitives/sheet.js +103 -0
  780. package/dist/primitives/sheet.js.map +7 -0
  781. package/dist/primitives/spinner.js +24 -0
  782. package/dist/primitives/spinner.js.map +7 -0
  783. package/dist/primitives/status-badge.js +38 -0
  784. package/dist/primitives/status-badge.js.map +7 -0
  785. package/dist/primitives/switch.js +80 -0
  786. package/dist/primitives/switch.js.map +7 -0
  787. package/dist/primitives/table.js +29 -0
  788. package/dist/primitives/table.js.map +7 -0
  789. package/dist/primitives/tabs.js +90 -0
  790. package/dist/primitives/tabs.js.map +7 -0
  791. package/dist/primitives/textarea.js +21 -0
  792. package/dist/primitives/textarea.js.map +7 -0
  793. package/dist/primitives/tooltip.js +60 -0
  794. package/dist/primitives/tooltip.js.map +7 -0
  795. package/dist/primitives-v2/Alert.js +69 -0
  796. package/dist/primitives-v2/Alert.js.map +7 -0
  797. package/dist/primitives-v2/Alert.stories.js +42 -0
  798. package/dist/primitives-v2/Alert.stories.js.map +7 -0
  799. package/dist/primitives-v2/Avatar.js +93 -0
  800. package/dist/primitives-v2/Avatar.js.map +7 -0
  801. package/dist/primitives-v2/Avatar.stories.js +57 -0
  802. package/dist/primitives-v2/Avatar.stories.js.map +7 -0
  803. package/dist/primitives-v2/Badge.js +50 -0
  804. package/dist/primitives-v2/Badge.js.map +7 -0
  805. package/dist/primitives-v2/Badge.stories.js +66 -0
  806. package/dist/primitives-v2/Badge.stories.js.map +7 -0
  807. package/dist/primitives-v2/Breadcrumb.js +53 -0
  808. package/dist/primitives-v2/Breadcrumb.js.map +7 -0
  809. package/dist/primitives-v2/Breadcrumb.stories.js +70 -0
  810. package/dist/primitives-v2/Breadcrumb.stories.js.map +7 -0
  811. package/dist/primitives-v2/Button.js +85 -0
  812. package/dist/primitives-v2/Button.js.map +7 -0
  813. package/dist/primitives-v2/Button.stories.js +48 -0
  814. package/dist/primitives-v2/Button.stories.js.map +7 -0
  815. package/dist/primitives-v2/Checkbox.js +65 -0
  816. package/dist/primitives-v2/Checkbox.js.map +7 -0
  817. package/dist/primitives-v2/Checkbox.stories.js +31 -0
  818. package/dist/primitives-v2/Checkbox.stories.js.map +7 -0
  819. package/dist/primitives-v2/IconButton.js +13 -0
  820. package/dist/primitives-v2/IconButton.js.map +7 -0
  821. package/dist/primitives-v2/IconButton.stories.js +37 -0
  822. package/dist/primitives-v2/IconButton.stories.js.map +7 -0
  823. package/dist/primitives-v2/Input.js +74 -0
  824. package/dist/primitives-v2/Input.js.map +7 -0
  825. package/dist/primitives-v2/Input.stories.js +56 -0
  826. package/dist/primitives-v2/Input.stories.js.map +7 -0
  827. package/dist/primitives-v2/NavGroup.js +54 -0
  828. package/dist/primitives-v2/NavGroup.js.map +7 -0
  829. package/dist/primitives-v2/NavGroup.stories.js +39 -0
  830. package/dist/primitives-v2/NavGroup.stories.js.map +7 -0
  831. package/dist/primitives-v2/NavItem.js +61 -0
  832. package/dist/primitives-v2/NavItem.js.map +7 -0
  833. package/dist/primitives-v2/NavItem.stories.js +56 -0
  834. package/dist/primitives-v2/NavItem.stories.js.map +7 -0
  835. package/dist/primitives-v2/SearchInput.js +93 -0
  836. package/dist/primitives-v2/SearchInput.js.map +7 -0
  837. package/dist/primitives-v2/SearchInput.stories.js +41 -0
  838. package/dist/primitives-v2/SearchInput.stories.js.map +7 -0
  839. package/dist/primitives-v2/Sidebar.js +48 -0
  840. package/dist/primitives-v2/Sidebar.js.map +7 -0
  841. package/dist/primitives-v2/Sidebar.stories.js +76 -0
  842. package/dist/primitives-v2/Sidebar.stories.js.map +7 -0
  843. package/dist/primitives-v2/Tab.js +78 -0
  844. package/dist/primitives-v2/Tab.js.map +7 -0
  845. package/dist/primitives-v2/Tab.stories.js +51 -0
  846. package/dist/primitives-v2/Tab.stories.js.map +7 -0
  847. package/dist/primitives-v2/Tag.js +61 -0
  848. package/dist/primitives-v2/Tag.js.map +7 -0
  849. package/dist/primitives-v2/Tag.stories.js +121 -0
  850. package/dist/primitives-v2/Tag.stories.js.map +7 -0
  851. package/dist/primitives-v2/Toggle.js +72 -0
  852. package/dist/primitives-v2/Toggle.js.map +7 -0
  853. package/dist/primitives-v2/Toggle.stories.js +34 -0
  854. package/dist/primitives-v2/Toggle.stories.js.map +7 -0
  855. package/dist/primitives-v2/Topbar.js +24 -0
  856. package/dist/primitives-v2/Topbar.js.map +7 -0
  857. package/dist/primitives-v2/Topbar.stories.js +58 -0
  858. package/dist/primitives-v2/Topbar.stories.js.map +7 -0
  859. package/dist/primitives-v2/index.js +41 -0
  860. package/dist/primitives-v2/index.js.map +7 -0
  861. package/dist/primitives-v2/utils.js +7 -0
  862. package/dist/primitives-v2/utils.js.map +7 -0
  863. package/dist/theme/BrandThemeProvider.js +49 -0
  864. package/dist/theme/BrandThemeProvider.js.map +7 -0
  865. package/dist/theme/QueryProvider.js +44 -0
  866. package/dist/theme/QueryProvider.js.map +7 -0
  867. package/dist/theme/ThemeProvider.js +96 -0
  868. package/dist/theme/ThemeProvider.js.map +7 -0
  869. package/dist/theme/ThemeToggle.js +88 -0
  870. package/dist/theme/ThemeToggle.js.map +7 -0
  871. package/dist/theme/index.js +12 -0
  872. package/dist/theme/index.js.map +7 -0
  873. package/dist/theme/m3.css.js +2 -0
  874. package/dist/theme/tokens.v2.css.js +2 -0
  875. package/dist/theme/typography.css.js +2 -0
  876. package/dist/theme/typography.stories.js +123 -0
  877. package/dist/theme/typography.stories.js.map +7 -0
  878. package/dist/theme/typography.tokens.js +281 -0
  879. package/dist/theme/typography.tokens.js.map +7 -0
  880. package/dist/types/react-big-calendar.d.js +1 -0
  881. package/dist/types/react-big-calendar.d.js.map +7 -0
  882. package/package.json +411 -0
  883. package/src/backend/AppShell.tsx +1606 -0
  884. package/src/backend/BackendChromeProvider.tsx +99 -0
  885. package/src/backend/BackendPageSurface.tsx +57 -0
  886. package/src/backend/CollapsibleNavSection.tsx +201 -0
  887. package/src/backend/ContextHelp.tsx +40 -0
  888. package/src/backend/CrudForm.tsx +3796 -0
  889. package/src/backend/DataTable.tsx +2584 -0
  890. package/src/backend/EmptyState.tsx +65 -0
  891. package/src/backend/FilterBar.tsx +171 -0
  892. package/src/backend/FilterOverlay.tsx +388 -0
  893. package/src/backend/FlashMessages.tsx +189 -0
  894. package/src/backend/HtmlRichTextEditor.tsx +124 -0
  895. package/src/backend/IntegrationsButton.tsx +29 -0
  896. package/src/backend/JsonBuilder.tsx +359 -0
  897. package/src/backend/JsonDisplay.tsx +258 -0
  898. package/src/backend/NextStepCallout.tsx +134 -0
  899. package/src/backend/Page.tsx +30 -0
  900. package/src/backend/PerspectiveSidebar.tsx +506 -0
  901. package/src/backend/ProfileDropdown.tsx +369 -0
  902. package/src/backend/RowActions.tsx +158 -0
  903. package/src/backend/SectionHeader.tsx +119 -0
  904. package/src/backend/SettingsButton.tsx +28 -0
  905. package/src/backend/Sidebar.stories.tsx +183 -0
  906. package/src/backend/Sidebar.tsx +737 -0
  907. package/src/backend/TruncatedCell.tsx +133 -0
  908. package/src/backend/UserMenu.tsx +153 -0
  909. package/src/backend/ValueIcons.tsx +48 -0
  910. package/src/backend/WebhookSetupGuide.tsx +127 -0
  911. package/src/backend/__tests__/AppShell.test.tsx +392 -0
  912. package/src/backend/__tests__/CrudForm.custom-fields.test.tsx +180 -0
  913. package/src/backend/__tests__/CrudForm.datetime.test.tsx +95 -0
  914. package/src/backend/__tests__/CrudForm.defaults.test.tsx +195 -0
  915. package/src/backend/__tests__/CrudForm.navigation.test.tsx +156 -0
  916. package/src/backend/__tests__/CrudForm.render.test.tsx +146 -0
  917. package/src/backend/__tests__/CrudForm.transformData.test.tsx +231 -0
  918. package/src/backend/__tests__/CrudForm.unsavedNavigation.test.tsx +145 -0
  919. package/src/backend/__tests__/CrudForm.validation.test.tsx +178 -0
  920. package/src/backend/__tests__/CustomDataSection.test.tsx +465 -0
  921. package/src/backend/__tests__/DataTable.extensions.test.tsx +339 -0
  922. package/src/backend/__tests__/DataTable.namespaces.test.ts +32 -0
  923. package/src/backend/__tests__/DataTable.render.test.tsx +48 -0
  924. package/src/backend/__tests__/FieldDefinitionsEditor.test.tsx +64 -0
  925. package/src/backend/__tests__/FlashMessages.test.tsx +105 -0
  926. package/src/backend/__tests__/FormHeader.test.tsx +81 -0
  927. package/src/backend/__tests__/NotificationDispatcher.test.ts +172 -0
  928. package/src/backend/__tests__/VersionHistoryPanel.test.tsx +109 -0
  929. package/src/backend/__tests__/component-replacement.test.tsx +270 -0
  930. package/src/backend/__tests__/custom-field-filters.test.ts +72 -0
  931. package/src/backend/__tests__/custom-field-forms.test.ts +54 -0
  932. package/src/backend/__tests__/nav-utils.test.ts +175 -0
  933. package/src/backend/__tests__/serverErrors.test.ts +83 -0
  934. package/src/backend/__tests__/useAuditPermissions.test.tsx +51 -0
  935. package/src/backend/__tests__/useNotifications.strategy.test.ts +58 -0
  936. package/src/backend/__tests__/useProgress.strategy.test.ts +62 -0
  937. package/src/backend/charts/BarChart.tsx +208 -0
  938. package/src/backend/charts/ChartUtils.tsx +196 -0
  939. package/src/backend/charts/ComboChart.stories.tsx +103 -0
  940. package/src/backend/charts/ComboChart.tsx +350 -0
  941. package/src/backend/charts/KpiCard.tsx +155 -0
  942. package/src/backend/charts/LineChart.tsx +207 -0
  943. package/src/backend/charts/PieChart.tsx +157 -0
  944. package/src/backend/charts/ScatterChart.tsx +498 -0
  945. package/src/backend/charts/TopNTable.tsx +141 -0
  946. package/src/backend/charts/WaterfallChart.tsx +213 -0
  947. package/src/backend/charts/index.ts +21 -0
  948. package/src/backend/columns/ColumnChooserPanel.tsx +293 -0
  949. package/src/backend/confirm-dialog/ConfirmDialog.tsx +275 -0
  950. package/src/backend/confirm-dialog/index.ts +7 -0
  951. package/src/backend/confirm-dialog/useConfirmDialog.tsx +146 -0
  952. package/src/backend/custom-fields/FieldDefinitionsEditor.tsx +1413 -0
  953. package/src/backend/custom-fields/FieldDefinitionsManager.tsx +381 -0
  954. package/src/backend/dashboard/DashboardScreen.tsx +706 -0
  955. package/src/backend/dashboard/__tests__/DashboardScreen.test.tsx +114 -0
  956. package/src/backend/dashboard/index.ts +1 -0
  957. package/src/backend/dashboard/widgetRegistry.ts +68 -0
  958. package/src/backend/date-range/DateRangeSelect.tsx +50 -0
  959. package/src/backend/date-range/InlineDateRangeSelect.tsx +52 -0
  960. package/src/backend/date-range/InlineGranularitySelect.tsx +63 -0
  961. package/src/backend/date-range/__tests__/dateRanges.test.ts +224 -0
  962. package/src/backend/date-range/dateRanges.ts +218 -0
  963. package/src/backend/date-range/index.ts +15 -0
  964. package/src/backend/detail/AccessDeniedMessage.tsx +32 -0
  965. package/src/backend/detail/ActivitiesSection.tsx +1261 -0
  966. package/src/backend/detail/AddressEditor.tsx +479 -0
  967. package/src/backend/detail/AddressTiles.tsx +591 -0
  968. package/src/backend/detail/AddressesSection.tsx +362 -0
  969. package/src/backend/detail/AttachmentDeleteDialog.tsx +56 -0
  970. package/src/backend/detail/AttachmentMetadataDialog.tsx +674 -0
  971. package/src/backend/detail/AttachmentVisualPreview.tsx +155 -0
  972. package/src/backend/detail/AttachmentsSection.tsx +327 -0
  973. package/src/backend/detail/CustomDataSection.tsx +700 -0
  974. package/src/backend/detail/DetailFieldsSection.tsx +163 -0
  975. package/src/backend/detail/ErrorMessage.tsx +32 -0
  976. package/src/backend/detail/InlineEditors.tsx +894 -0
  977. package/src/backend/detail/LoadingMessage.tsx +14 -0
  978. package/src/backend/detail/NotesSection.tsx +1266 -0
  979. package/src/backend/detail/TabEmptyState.tsx +48 -0
  980. package/src/backend/detail/TagsSection.tsx +470 -0
  981. package/src/backend/detail/__tests__/InlineEditors.test.tsx +59 -0
  982. package/src/backend/detail/addressFormat.tsx +121 -0
  983. package/src/backend/detail/index.ts +46 -0
  984. package/src/backend/devtools/UmesDevToolsPanel.tsx +122 -0
  985. package/src/backend/devtools/components/ConflictWarnings.tsx +36 -0
  986. package/src/backend/devtools/components/EnricherTiming.tsx +50 -0
  987. package/src/backend/devtools/components/EventFlow.tsx +45 -0
  988. package/src/backend/devtools/components/ExtensionPointList.tsx +59 -0
  989. package/src/backend/devtools/components/InterceptorActivity.tsx +48 -0
  990. package/src/backend/devtools/index.ts +2 -0
  991. package/src/backend/devtools/useUmesDevTools.ts +188 -0
  992. package/src/backend/document-viewer/RegionOverlay.tsx +150 -0
  993. package/src/backend/document-viewer/index.ts +2 -0
  994. package/src/backend/dynamic-grid/DynamicGrid.tsx +161 -0
  995. package/src/backend/dynamic-grid/adapters.ts +57 -0
  996. package/src/backend/dynamic-grid/components/GridCell.tsx +194 -0
  997. package/src/backend/dynamic-grid/components/GridRow.tsx +40 -0
  998. package/src/backend/dynamic-grid/hooks/useGridKeyboardNav.ts +134 -0
  999. package/src/backend/dynamic-grid/index.ts +4 -0
  1000. package/src/backend/dynamic-grid/types.ts +55 -0
  1001. package/src/backend/dynamic-table/DynamicTable.stories.tsx +274 -0
  1002. package/src/backend/dynamic-table/DynamicTable.tsx +4419 -0
  1003. package/src/backend/dynamic-table/README.md +1199 -0
  1004. package/src/backend/dynamic-table/URL_FILTERING.md +217 -0
  1005. package/src/backend/dynamic-table/__e2e__/GridHarness.ts +1155 -0
  1006. package/src/backend/dynamic-table/__e2e__/SplitViewHarness.ts +366 -0
  1007. package/src/backend/dynamic-table/__tests__/BulkActionsBar.test.tsx +143 -0
  1008. package/src/backend/dynamic-table/__tests__/ColumnQuickFilter.test.tsx +607 -0
  1009. package/src/backend/dynamic-table/__tests__/ConfigureViewFilters.suggestions.test.tsx +177 -0
  1010. package/src/backend/dynamic-table/__tests__/ConfigureViewFormatting.test.tsx +125 -0
  1011. package/src/backend/dynamic-table/__tests__/ConfigureViewFormulas.test.tsx +228 -0
  1012. package/src/backend/dynamic-table/__tests__/ConfigureViewGrouping.aggregations.test.tsx +131 -0
  1013. package/src/backend/dynamic-table/__tests__/ConfigureViewPanel.baseView.test.tsx +162 -0
  1014. package/src/backend/dynamic-table/__tests__/ConfigureViewPanel.focus.test.tsx +54 -0
  1015. package/src/backend/dynamic-table/__tests__/ConfigureViewPanel.sections.test.tsx +142 -0
  1016. package/src/backend/dynamic-table/__tests__/ConfigureViewRollups.test.tsx +228 -0
  1017. package/src/backend/dynamic-table/__tests__/ContextMenu.test.tsx +89 -0
  1018. package/src/backend/dynamic-table/__tests__/DynamicTable.density.test.tsx +299 -0
  1019. package/src/backend/dynamic-table/__tests__/DynamicTable.exportTruncation.test.tsx +145 -0
  1020. package/src/backend/dynamic-table/__tests__/DynamicTable.loadError.test.tsx +173 -0
  1021. package/src/backend/dynamic-table/__tests__/DynamicTable.wiring.test.tsx +357 -0
  1022. package/src/backend/dynamic-table/__tests__/EmptyState.test.tsx +70 -0
  1023. package/src/backend/dynamic-table/__tests__/ExportMenu.test.tsx +82 -0
  1024. package/src/backend/dynamic-table/__tests__/FooterTotalsRow.test.tsx +154 -0
  1025. package/src/backend/dynamic-table/__tests__/GroupSummaryRow.render.test.tsx +131 -0
  1026. package/src/backend/dynamic-table/__tests__/LoadErrorState.test.tsx +74 -0
  1027. package/src/backend/dynamic-table/__tests__/MentionPopup.search.test.tsx +127 -0
  1028. package/src/backend/dynamic-table/__tests__/PerspectiveTabs.test.tsx +170 -0
  1029. package/src/backend/dynamic-table/__tests__/RowHeaderCell.selection.test.tsx +80 -0
  1030. package/src/backend/dynamic-table/__tests__/abbreviationsSubscription.test.ts +171 -0
  1031. package/src/backend/dynamic-table/__tests__/aggregate.spec.test.ts +224 -0
  1032. package/src/backend/dynamic-table/__tests__/aggregateDimension.test.tsx +191 -0
  1033. package/src/backend/dynamic-table/__tests__/anchoredPosition.test.ts +88 -0
  1034. package/src/backend/dynamic-table/__tests__/badgeAutoFit.test.ts +121 -0
  1035. package/src/backend/dynamic-table/__tests__/cellHandlers.save.test.ts +282 -0
  1036. package/src/backend/dynamic-table/__tests__/cellWrites.test.ts +274 -0
  1037. package/src/backend/dynamic-table/__tests__/clipboard.test.ts +230 -0
  1038. package/src/backend/dynamic-table/__tests__/coerceCellValue.test.ts +117 -0
  1039. package/src/backend/dynamic-table/__tests__/colorAdjacency.test.ts +151 -0
  1040. package/src/backend/dynamic-table/__tests__/columnFill.test.ts +66 -0
  1041. package/src/backend/dynamic-table/__tests__/columnHeaderHandlers.sort.test.ts +100 -0
  1042. package/src/backend/dynamic-table/__tests__/columnHeaderReorder.test.tsx +209 -0
  1043. package/src/backend/dynamic-table/__tests__/columnReorderPersistence.test.tsx +127 -0
  1044. package/src/backend/dynamic-table/__tests__/columnVirtualization.render.test.tsx +420 -0
  1045. package/src/backend/dynamic-table/__tests__/columnVisibilityPersistence.test.tsx +136 -0
  1046. package/src/backend/dynamic-table/__tests__/columnWindow.test.ts +643 -0
  1047. package/src/backend/dynamic-table/__tests__/commentAudience.test.tsx +137 -0
  1048. package/src/backend/dynamic-table/__tests__/commentScope.test.tsx +214 -0
  1049. package/src/backend/dynamic-table/__tests__/conditionalFormat.test.ts +175 -0
  1050. package/src/backend/dynamic-table/__tests__/contentRegistry.test.ts +267 -0
  1051. package/src/backend/dynamic-table/__tests__/dateWindows.test.ts +149 -0
  1052. package/src/backend/dynamic-table/__tests__/density.test.ts +204 -0
  1053. package/src/backend/dynamic-table/__tests__/exportTable.test.ts +146 -0
  1054. package/src/backend/dynamic-table/__tests__/fillGeometry.test.ts +201 -0
  1055. package/src/backend/dynamic-table/__tests__/fillPatterns.test.ts +272 -0
  1056. package/src/backend/dynamic-table/__tests__/filterParser.presets.test.ts +64 -0
  1057. package/src/backend/dynamic-table/__tests__/filterParser.relative.test.ts +109 -0
  1058. package/src/backend/dynamic-table/__tests__/filterSuggestions.test.ts +152 -0
  1059. package/src/backend/dynamic-table/__tests__/formatAggregate.test.ts +99 -0
  1060. package/src/backend/dynamic-table/__tests__/formatDateCompact.test.ts +489 -0
  1061. package/src/backend/dynamic-table/__tests__/formatLabelCompact.test.ts +717 -0
  1062. package/src/backend/dynamic-table/__tests__/formula.check.test.ts +257 -0
  1063. package/src/backend/dynamic-table/__tests__/formula.evaluate.test.ts +274 -0
  1064. package/src/backend/dynamic-table/__tests__/formula.functions.test.ts +226 -0
  1065. package/src/backend/dynamic-table/__tests__/formula.noEval.test.ts +92 -0
  1066. package/src/backend/dynamic-table/__tests__/formula.parse.test.ts +233 -0
  1067. package/src/backend/dynamic-table/__tests__/formulaColumns.test.tsx +213 -0
  1068. package/src/backend/dynamic-table/__tests__/handlerIdentity.test.ts +77 -0
  1069. package/src/backend/dynamic-table/__tests__/importMapping.test.ts +174 -0
  1070. package/src/backend/dynamic-table/__tests__/importParse.test.ts +130 -0
  1071. package/src/backend/dynamic-table/__tests__/importServerOnly.test.ts +37 -0
  1072. package/src/backend/dynamic-table/__tests__/layoutPersistence.test.ts +372 -0
  1073. package/src/backend/dynamic-table/__tests__/mouseHandlers.doubleClick.test.ts +155 -0
  1074. package/src/backend/dynamic-table/__tests__/perspectivePersonalization.test.ts +188 -0
  1075. package/src/backend/dynamic-table/__tests__/perspectiveResolver.test.ts +133 -0
  1076. package/src/backend/dynamic-table/__tests__/perspectiveState.defaultGrouping.test.ts +306 -0
  1077. package/src/backend/dynamic-table/__tests__/perspectiveState.defaults.test.ts +107 -0
  1078. package/src/backend/dynamic-table/__tests__/perspectiveTemplates.test.tsx +269 -0
  1079. package/src/backend/dynamic-table/__tests__/perspectiveTransforms.aggregations.test.ts +105 -0
  1080. package/src/backend/dynamic-table/__tests__/perspectiveTransforms.conditionalFormats.test.ts +107 -0
  1081. package/src/backend/dynamic-table/__tests__/perspectiveTransforms.dateFormat.test.ts +61 -0
  1082. package/src/backend/dynamic-table/__tests__/perspectiveTransforms.formulas.test.ts +85 -0
  1083. package/src/backend/dynamic-table/__tests__/perspectiveTransforms.frozenColumns.test.ts +124 -0
  1084. package/src/backend/dynamic-table/__tests__/rollupColumns.test.ts +149 -0
  1085. package/src/backend/dynamic-table/__tests__/sharedCriteria.test.ts +255 -0
  1086. package/src/backend/dynamic-table/__tests__/splitViewTree.test.ts +324 -0
  1087. package/src/backend/dynamic-table/__tests__/store.clipboardMarker.test.ts +143 -0
  1088. package/src/backend/dynamic-table/__tests__/store.fillPreview.test.ts +168 -0
  1089. package/src/backend/dynamic-table/__tests__/store.mutations.test.ts +345 -0
  1090. package/src/backend/dynamic-table/__tests__/store.selection.test.ts +157 -0
  1091. package/src/backend/dynamic-table/__tests__/store.undo.test.ts +225 -0
  1092. package/src/backend/dynamic-table/__tests__/store.valueSource.test.tsx +204 -0
  1093. package/src/backend/dynamic-table/__tests__/useAnnotations.legacyOptions.test.tsx +58 -0
  1094. package/src/backend/dynamic-table/__tests__/useColumnVirtualizer.test.ts +290 -0
  1095. package/src/backend/dynamic-table/__tests__/useDensityPreference.test.ts +435 -0
  1096. package/src/backend/dynamic-table/__tests__/useDynamicTablePage.duplicate.test.tsx +99 -0
  1097. package/src/backend/dynamic-table/__tests__/useDynamicTablePage.export.test.tsx +281 -0
  1098. package/src/backend/dynamic-table/__tests__/useDynamicTablePage.personalization.test.tsx +313 -0
  1099. package/src/backend/dynamic-table/__tests__/useDynamicTablePage.perspectiveRestore.test.tsx +126 -0
  1100. package/src/backend/dynamic-table/__tests__/useGrouping.aggregations.test.ts +158 -0
  1101. package/src/backend/dynamic-table/__tests__/useGrouping.groupKey.test.ts +58 -0
  1102. package/src/backend/dynamic-table/__tests__/useKeyboardNavigation.test.ts +594 -0
  1103. package/src/backend/dynamic-table/__tests__/useStickyOffsets.memo.test.tsx +75 -0
  1104. package/src/backend/dynamic-table/__tests__/useStickyOffsets.test.ts +106 -0
  1105. package/src/backend/dynamic-table/__tests__/widgetPane.test.tsx +338 -0
  1106. package/src/backend/dynamic-table/components/ActiveFilterChips.tsx +109 -0
  1107. package/src/backend/dynamic-table/components/BulkActionsBar.tsx +89 -0
  1108. package/src/backend/dynamic-table/components/Cell.tsx +292 -0
  1109. package/src/backend/dynamic-table/components/CellCommentDialog.tsx +887 -0
  1110. package/src/backend/dynamic-table/components/CellCommentHoverPopup.tsx +94 -0
  1111. package/src/backend/dynamic-table/components/ColumnFilterPopover.tsx +775 -0
  1112. package/src/backend/dynamic-table/components/ColumnHeaderMenu.tsx +189 -0
  1113. package/src/backend/dynamic-table/components/ColumnHeaders.tsx +867 -0
  1114. package/src/backend/dynamic-table/components/CompactLabelCell.tsx +293 -0
  1115. package/src/backend/dynamic-table/components/ConfigureViewFields.tsx +173 -0
  1116. package/src/backend/dynamic-table/components/ConfigureViewFilters.tsx +346 -0
  1117. package/src/backend/dynamic-table/components/ConfigureViewFormatting.tsx +205 -0
  1118. package/src/backend/dynamic-table/components/ConfigureViewFormulas.tsx +423 -0
  1119. package/src/backend/dynamic-table/components/ConfigureViewGrouping.tsx +264 -0
  1120. package/src/backend/dynamic-table/components/ConfigureViewLinkedColumns.tsx +249 -0
  1121. package/src/backend/dynamic-table/components/ConfigureViewPanel.tsx +857 -0
  1122. package/src/backend/dynamic-table/components/ConfigureViewRollups.tsx +364 -0
  1123. package/src/backend/dynamic-table/components/ConfigureViewSorting.tsx +121 -0
  1124. package/src/backend/dynamic-table/components/ContextMenu.tsx +140 -0
  1125. package/src/backend/dynamic-table/components/DateCell.tsx +205 -0
  1126. package/src/backend/dynamic-table/components/Debugger.tsx +340 -0
  1127. package/src/backend/dynamic-table/components/DensityControl.tsx +441 -0
  1128. package/src/backend/dynamic-table/components/EmptyState.tsx +103 -0
  1129. package/src/backend/dynamic-table/components/EntitySearchEditor.tsx +528 -0
  1130. package/src/backend/dynamic-table/components/ExportMenu.tsx +90 -0
  1131. package/src/backend/dynamic-table/components/FilterDatePicker.tsx +194 -0
  1132. package/src/backend/dynamic-table/components/FilterValueInput.tsx +294 -0
  1133. package/src/backend/dynamic-table/components/FooterTotalsRow.tsx +291 -0
  1134. package/src/backend/dynamic-table/components/FullscreenOverlay.tsx +66 -0
  1135. package/src/backend/dynamic-table/components/GroupHeaderRow.tsx +136 -0
  1136. package/src/backend/dynamic-table/components/GroupSummaryRow.tsx +184 -0
  1137. package/src/backend/dynamic-table/components/ImportPanel.tsx +445 -0
  1138. package/src/backend/dynamic-table/components/ImportPreviewGrid.tsx +155 -0
  1139. package/src/backend/dynamic-table/components/LoadErrorState.tsx +70 -0
  1140. package/src/backend/dynamic-table/components/MentionPopup.tsx +224 -0
  1141. package/src/backend/dynamic-table/components/PerspectiveDeleteDialog.tsx +96 -0
  1142. package/src/backend/dynamic-table/components/PerspectivePublishDialog.tsx +152 -0
  1143. package/src/backend/dynamic-table/components/PerspectiveTabMenu.tsx +215 -0
  1144. package/src/backend/dynamic-table/components/PerspectiveTabs.tsx +426 -0
  1145. package/src/backend/dynamic-table/components/PerspectiveTemplateMenu.tsx +135 -0
  1146. package/src/backend/dynamic-table/components/RowHeaderCell.tsx +73 -0
  1147. package/src/backend/dynamic-table/components/SearchBar.tsx +309 -0
  1148. package/src/backend/dynamic-table/components/SelectMenu.tsx +237 -0
  1149. package/src/backend/dynamic-table/components/StaleDataBar.tsx +74 -0
  1150. package/src/backend/dynamic-table/components/TableDeleteDialog.tsx +74 -0
  1151. package/src/backend/dynamic-table/components/TablePagination.tsx +96 -0
  1152. package/src/backend/dynamic-table/components/TableSkeleton.tsx +123 -0
  1153. package/src/backend/dynamic-table/components/ToolbarOverflow.tsx +284 -0
  1154. package/src/backend/dynamic-table/components/ViewModeSwitch.tsx +92 -0
  1155. package/src/backend/dynamic-table/components/VirtualRow.tsx +346 -0
  1156. package/src/backend/dynamic-table/components/editors.tsx +1727 -0
  1157. package/src/backend/dynamic-table/components/renderers.tsx +162 -0
  1158. package/src/backend/dynamic-table/events/events.ts +107 -0
  1159. package/src/backend/dynamic-table/formula/check.ts +359 -0
  1160. package/src/backend/dynamic-table/formula/evaluate.ts +473 -0
  1161. package/src/backend/dynamic-table/formula/functions.ts +737 -0
  1162. package/src/backend/dynamic-table/formula/index.ts +57 -0
  1163. package/src/backend/dynamic-table/formula/parse.ts +414 -0
  1164. package/src/backend/dynamic-table/formula/types.ts +151 -0
  1165. package/src/backend/dynamic-table/handlers/cellWrites.ts +362 -0
  1166. package/src/backend/dynamic-table/handlers/index.ts +789 -0
  1167. package/src/backend/dynamic-table/handlers/perspectiveHandlers.ts +684 -0
  1168. package/src/backend/dynamic-table/hooks/index.ts +888 -0
  1169. package/src/backend/dynamic-table/hooks/useAbbreviations.ts +67 -0
  1170. package/src/backend/dynamic-table/hooks/useAnnotations.ts +215 -0
  1171. package/src/backend/dynamic-table/hooks/useColumnVirtualizer.ts +303 -0
  1172. package/src/backend/dynamic-table/hooks/useColumnWidthPersistence.ts +214 -0
  1173. package/src/backend/dynamic-table/hooks/useDensityPreference.ts +451 -0
  1174. package/src/backend/dynamic-table/hooks/useDynamicTablePage.tsx +1681 -0
  1175. package/src/backend/dynamic-table/hooks/useEscapeLayer.ts +72 -0
  1176. package/src/backend/dynamic-table/hooks/useGrouping.ts +428 -0
  1177. package/src/backend/dynamic-table/hooks/useSuggestionFetch.ts +109 -0
  1178. package/src/backend/dynamic-table/hooks/useTableDateFormat.tsx +19 -0
  1179. package/src/backend/dynamic-table/index.ts +497 -0
  1180. package/src/backend/dynamic-table/registry/ContentRegistryContext.tsx +244 -0
  1181. package/src/backend/dynamic-table/registry/TableRegistryContext.tsx +84 -0
  1182. package/src/backend/dynamic-table/registry/filterAccessibleTables.ts +36 -0
  1183. package/src/backend/dynamic-table/registry/index.ts +38 -0
  1184. package/src/backend/dynamic-table/registry/lazyTable.tsx +80 -0
  1185. package/src/backend/dynamic-table/registry/types.ts +181 -0
  1186. package/src/backend/dynamic-table/registry/widgetCatalog.ts +226 -0
  1187. package/src/backend/dynamic-table/server/aggregate.ts +474 -0
  1188. package/src/backend/dynamic-table/server/dateWindows.ts +201 -0
  1189. package/src/backend/dynamic-table/server/filterParser.ts +132 -0
  1190. package/src/backend/dynamic-table/server/filterSuggestions.ts +150 -0
  1191. package/src/backend/dynamic-table/server/index.ts +47 -0
  1192. package/src/backend/dynamic-table/server/makeDynamicTableRoute.ts +426 -0
  1193. package/src/backend/dynamic-table/split-view/ContentPicker.tsx +251 -0
  1194. package/src/backend/dynamic-table/split-view/EmptySlot.tsx +69 -0
  1195. package/src/backend/dynamic-table/split-view/SplitViewHost.tsx +1336 -0
  1196. package/src/backend/dynamic-table/split-view/WidgetPane.tsx +390 -0
  1197. package/src/backend/dynamic-table/split-view/WorkspaceFilterBar.tsx +728 -0
  1198. package/src/backend/dynamic-table/split-view/index.ts +48 -0
  1199. package/src/backend/dynamic-table/split-view/layoutPersistence.ts +185 -0
  1200. package/src/backend/dynamic-table/split-view/sharedCriteria.ts +196 -0
  1201. package/src/backend/dynamic-table/split-view/types.ts +778 -0
  1202. package/src/backend/dynamic-table/split-view/useSplitViewLayouts.ts +97 -0
  1203. package/src/backend/dynamic-table/store/index.ts +1011 -0
  1204. package/src/backend/dynamic-table/styles/ContextMenu.css +387 -0
  1205. package/src/backend/dynamic-table/styles/DynamicTable.css +3659 -0
  1206. package/src/backend/dynamic-table/styles/DynamicTable.v2.css +2651 -0
  1207. package/src/backend/dynamic-table/styles/SearchBar.css +426 -0
  1208. package/src/backend/dynamic-table/styles/dateCell.css +146 -0
  1209. package/src/backend/dynamic-table/styles/density.css +690 -0
  1210. package/src/backend/dynamic-table/types/density.ts +179 -0
  1211. package/src/backend/dynamic-table/types/filters.ts +156 -0
  1212. package/src/backend/dynamic-table/types/grouping.ts +189 -0
  1213. package/src/backend/dynamic-table/types/import.ts +132 -0
  1214. package/src/backend/dynamic-table/types/index.ts +1198 -0
  1215. package/src/backend/dynamic-table/types/perspective.ts +436 -0
  1216. package/src/backend/dynamic-table/types/rollup.ts +111 -0
  1217. package/src/backend/dynamic-table/utils/abbreviations.ts +556 -0
  1218. package/src/backend/dynamic-table/utils/anchoredPosition.ts +106 -0
  1219. package/src/backend/dynamic-table/utils/badgeAutoFit.ts +108 -0
  1220. package/src/backend/dynamic-table/utils/clipboard.ts +294 -0
  1221. package/src/backend/dynamic-table/utils/coerceCellValue.ts +96 -0
  1222. package/src/backend/dynamic-table/utils/colorAdjacency.ts +87 -0
  1223. package/src/backend/dynamic-table/utils/columnFill.ts +93 -0
  1224. package/src/backend/dynamic-table/utils/columnSpacerStyle.ts +53 -0
  1225. package/src/backend/dynamic-table/utils/columnWindow.ts +668 -0
  1226. package/src/backend/dynamic-table/utils/conditionalFormat.ts +300 -0
  1227. package/src/backend/dynamic-table/utils/exportTable.ts +140 -0
  1228. package/src/backend/dynamic-table/utils/fillGeometry.ts +187 -0
  1229. package/src/backend/dynamic-table/utils/fillPatterns.ts +422 -0
  1230. package/src/backend/dynamic-table/utils/formatAggregate.ts +145 -0
  1231. package/src/backend/dynamic-table/utils/formatDateCompact.ts +879 -0
  1232. package/src/backend/dynamic-table/utils/formatLabelCompact.ts +640 -0
  1233. package/src/backend/dynamic-table/utils/formulaColumns.tsx +237 -0
  1234. package/src/backend/dynamic-table/utils/importMapping.ts +202 -0
  1235. package/src/backend/dynamic-table/utils/importParse.ts +220 -0
  1236. package/src/backend/dynamic-table/utils/lookupColumns.tsx +47 -0
  1237. package/src/backend/dynamic-table/utils/perspectiveTransforms.ts +368 -0
  1238. package/src/backend/dynamic-table/utils/rollupColumns.ts +162 -0
  1239. package/src/backend/dynamic-table/validators/index.ts +40 -0
  1240. package/src/backend/fields/registry.generated.ts +8 -0
  1241. package/src/backend/fields/registry.ts +38 -0
  1242. package/src/backend/filters/AdvancedFilterBuilder.tsx +339 -0
  1243. package/src/backend/forms/ActionsDropdown.tsx +198 -0
  1244. package/src/backend/forms/FormActionButtons.tsx +98 -0
  1245. package/src/backend/forms/FormFooter.tsx +27 -0
  1246. package/src/backend/forms/FormHeader.tsx +204 -0
  1247. package/src/backend/forms/index.ts +4 -0
  1248. package/src/backend/hooks/useAdvancedFilter.ts +77 -0
  1249. package/src/backend/indexes/PartialIndexBanner.tsx +86 -0
  1250. package/src/backend/indexes/store.ts +88 -0
  1251. package/src/backend/injection/ComponentOverrideProvider.tsx +66 -0
  1252. package/src/backend/injection/InjectedField.tsx +196 -0
  1253. package/src/backend/injection/InjectionSpot.tsx +457 -0
  1254. package/src/backend/injection/InjectionWizard.tsx +335 -0
  1255. package/src/backend/injection/PageInjectionBoundary.tsx +31 -0
  1256. package/src/backend/injection/SseEventIndicator.tsx +11 -0
  1257. package/src/backend/injection/StatusBadgeInjectionSpot.tsx +50 -0
  1258. package/src/backend/injection/StatusBadgeRenderer.tsx +100 -0
  1259. package/src/backend/injection/WidgetSharedState.ts +58 -0
  1260. package/src/backend/injection/WizardInjectionSpot.tsx +46 -0
  1261. package/src/backend/injection/eventBridge.ts +158 -0
  1262. package/src/backend/injection/helpers.ts +35 -0
  1263. package/src/backend/injection/mergeMenuItems.ts +80 -0
  1264. package/src/backend/injection/mutationEvents.ts +22 -0
  1265. package/src/backend/injection/resolveInjectedIcon.tsx +30 -0
  1266. package/src/backend/injection/spotIds.ts +64 -0
  1267. package/src/backend/injection/useAppEvent.ts +76 -0
  1268. package/src/backend/injection/useGuardedMutation.ts +101 -0
  1269. package/src/backend/injection/useInjectedMenuItems.ts +67 -0
  1270. package/src/backend/injection/useInjectionDataWidgets.ts +41 -0
  1271. package/src/backend/injection/useOperationProgress.ts +105 -0
  1272. package/src/backend/injection/useRegisteredComponent.tsx +106 -0
  1273. package/src/backend/injection/useWidgetSharedState.ts +28 -0
  1274. package/src/backend/injection/visibility-utils.ts +31 -0
  1275. package/src/backend/injection/widgetRegistry.ts +68 -0
  1276. package/src/backend/inputs/ComboboxInput.tsx +272 -0
  1277. package/src/backend/inputs/DatePicker.tsx +162 -0
  1278. package/src/backend/inputs/DateTimePicker.tsx +199 -0
  1279. package/src/backend/inputs/EventPatternInput.tsx +46 -0
  1280. package/src/backend/inputs/EventSelect.tsx +183 -0
  1281. package/src/backend/inputs/LookupSelect.tsx +253 -0
  1282. package/src/backend/inputs/PhoneNumberField.tsx +166 -0
  1283. package/src/backend/inputs/SwitchableMarkdownInput.tsx +106 -0
  1284. package/src/backend/inputs/TagsInput.tsx +297 -0
  1285. package/src/backend/inputs/TimeInput.tsx +146 -0
  1286. package/src/backend/inputs/TimePicker.tsx +120 -0
  1287. package/src/backend/inputs/__tests__/DatePicker.test.tsx +76 -0
  1288. package/src/backend/inputs/__tests__/DateTimePicker.logic.test.ts +126 -0
  1289. package/src/backend/inputs/__tests__/PhoneNumberField.test.tsx +73 -0
  1290. package/src/backend/inputs/__tests__/TagsInput.test.tsx +78 -0
  1291. package/src/backend/inputs/__tests__/TimeInput.test.tsx +134 -0
  1292. package/src/backend/inputs/__tests__/TimePicker.test.tsx +50 -0
  1293. package/src/backend/inputs/index.ts +11 -0
  1294. package/src/backend/markdown/MarkdownContent.tsx +33 -0
  1295. package/src/backend/markdown/index.ts +2 -0
  1296. package/src/backend/markdown/useMarkdownRemarkPlugins.ts +39 -0
  1297. package/src/backend/messages/MessageComposer.tsx +197 -0
  1298. package/src/backend/messages/MessageObjectDetail.tsx +95 -0
  1299. package/src/backend/messages/MessageObjectPreview.tsx +64 -0
  1300. package/src/backend/messages/MessageObjectRecordPicker.tsx +149 -0
  1301. package/src/backend/messages/MessagePrioritySelector.tsx +78 -0
  1302. package/src/backend/messages/MessagesIcon.tsx +32 -0
  1303. package/src/backend/messages/SendObjectMessageDialog.tsx +74 -0
  1304. package/src/backend/messages/__tests__/MessageComposer.test.tsx +350 -0
  1305. package/src/backend/messages/__tests__/SendObjectMessageDialog.test.tsx +77 -0
  1306. package/src/backend/messages/index.ts +22 -0
  1307. package/src/backend/messages/message-compose-form-groups.tsx +383 -0
  1308. package/src/backend/messages/message-composer.types.ts +82 -0
  1309. package/src/backend/messages/message-priority.ts +53 -0
  1310. package/src/backend/messages/useMessageCompose.ts +666 -0
  1311. package/src/backend/messages/useMessageComposeOperations.ts +259 -0
  1312. package/src/backend/messages/useMessagesPoll.ts +118 -0
  1313. package/src/backend/notifications/NotificationBell.tsx +91 -0
  1314. package/src/backend/notifications/NotificationCountBadge.tsx +14 -0
  1315. package/src/backend/notifications/NotificationDispatcher.ts +213 -0
  1316. package/src/backend/notifications/NotificationItem.tsx +262 -0
  1317. package/src/backend/notifications/NotificationPanel.tsx +225 -0
  1318. package/src/backend/notifications/__tests__/NotificationCountBadge.test.tsx +34 -0
  1319. package/src/backend/notifications/index.ts +20 -0
  1320. package/src/backend/notifications/useNotificationActions.ts +161 -0
  1321. package/src/backend/notifications/useNotificationEffect.ts +17 -0
  1322. package/src/backend/notifications/useNotifications.ts +12 -0
  1323. package/src/backend/notifications/useNotificationsPoll.ts +167 -0
  1324. package/src/backend/notifications/useNotificationsSse.ts +220 -0
  1325. package/src/backend/operations/LastOperationBanner.tsx +85 -0
  1326. package/src/backend/operations/__tests__/LastOperationBanner.test.tsx +101 -0
  1327. package/src/backend/operations/store.ts +230 -0
  1328. package/src/backend/progress/ProgressTopBar.tsx +189 -0
  1329. package/src/backend/progress/useProgress.ts +12 -0
  1330. package/src/backend/progress/useProgressPoll.ts +100 -0
  1331. package/src/backend/progress/useProgressSse.ts +118 -0
  1332. package/src/backend/schedule/ScheduleAgenda.tsx +136 -0
  1333. package/src/backend/schedule/ScheduleGrid.tsx +136 -0
  1334. package/src/backend/schedule/ScheduleToolbar.tsx +178 -0
  1335. package/src/backend/schedule/ScheduleView.tsx +201 -0
  1336. package/src/backend/schedule/index.ts +5 -0
  1337. package/src/backend/schedule/recurrence.ts +99 -0
  1338. package/src/backend/schedule/types.ts +26 -0
  1339. package/src/backend/section-page/SectionNav.tsx +140 -0
  1340. package/src/backend/section-page/SectionPage.tsx +34 -0
  1341. package/src/backend/section-page/index.ts +3 -0
  1342. package/src/backend/section-page/types.ts +30 -0
  1343. package/src/backend/settings/SettingsNavigation.tsx +74 -0
  1344. package/src/backend/settings/SettingsPageWrapper.tsx +78 -0
  1345. package/src/backend/settings/index.ts +3 -0
  1346. package/src/backend/upgrades/UpgradeActionBanner.tsx +128 -0
  1347. package/src/backend/utils/__tests__/api.scoped-headers.test.ts +58 -0
  1348. package/src/backend/utils/__tests__/api.test.ts +148 -0
  1349. package/src/backend/utils/__tests__/apiCall.scoped-request-headers.test.ts +58 -0
  1350. package/src/backend/utils/__tests__/apiCall.test.ts +109 -0
  1351. package/src/backend/utils/__tests__/crud.test.ts +87 -0
  1352. package/src/backend/utils/__tests__/customFieldDefs.test.ts +25 -0
  1353. package/src/backend/utils/__tests__/customFieldValues.test.ts +35 -0
  1354. package/src/backend/utils/__tests__/richTextSanitizer.test.ts +57 -0
  1355. package/src/backend/utils/api.ts +214 -0
  1356. package/src/backend/utils/apiCall.ts +123 -0
  1357. package/src/backend/utils/crud.ts +174 -0
  1358. package/src/backend/utils/customFieldColumns.ts +118 -0
  1359. package/src/backend/utils/customFieldDefs.ts +247 -0
  1360. package/src/backend/utils/customFieldFilters.ts +174 -0
  1361. package/src/backend/utils/customFieldForms.ts +203 -0
  1362. package/src/backend/utils/customFieldRelationDisplay.ts +302 -0
  1363. package/src/backend/utils/customFieldValues.ts +41 -0
  1364. package/src/backend/utils/flash.ts +17 -0
  1365. package/src/backend/utils/nav.ts +402 -0
  1366. package/src/backend/utils/richTextSanitizer.ts +7 -0
  1367. package/src/backend/utils/scopedHeaderStack.ts +49 -0
  1368. package/src/backend/utils/serverErrors.ts +313 -0
  1369. package/src/backend/utils/useAutoDiscoveredFields.ts +138 -0
  1370. package/src/backend/version-history/VersionHistoryAction.tsx +76 -0
  1371. package/src/backend/version-history/VersionHistoryDetail.tsx +87 -0
  1372. package/src/backend/version-history/VersionHistoryPanel.tsx +331 -0
  1373. package/src/backend/version-history/index.ts +9 -0
  1374. package/src/backend/version-history/labels.ts +56 -0
  1375. package/src/backend/version-history/types.ts +27 -0
  1376. package/src/backend/version-history/useAuditPermissions.ts +94 -0
  1377. package/src/backend/version-history/useVersionHistory.ts +173 -0
  1378. package/src/backend/views/NewViewForm.tsx +54 -0
  1379. package/src/backend/views/ShareForm.tsx +62 -0
  1380. package/src/backend/views/ViewChip.tsx +123 -0
  1381. package/src/backend/views/ViewChipMenu.tsx +94 -0
  1382. package/src/backend/views/types.ts +4 -0
  1383. package/src/frontend/AuthFooter.tsx +29 -0
  1384. package/src/frontend/LanguageSwitcher.tsx +66 -0
  1385. package/src/frontend/Layout.tsx +13 -0
  1386. package/src/hooks/useIsMobile.ts +27 -0
  1387. package/src/index.ts +40 -0
  1388. package/src/portal/PortalContext.tsx +180 -0
  1389. package/src/portal/PortalLayoutProvider.tsx +5 -0
  1390. package/src/portal/PortalLayoutShell.tsx +64 -0
  1391. package/src/portal/PortalShell.tsx +370 -0
  1392. package/src/portal/components/PortalCard.tsx +77 -0
  1393. package/src/portal/components/PortalEmptyState.tsx +32 -0
  1394. package/src/portal/components/PortalFeatureCard.tsx +41 -0
  1395. package/src/portal/components/PortalNotificationBell.tsx +81 -0
  1396. package/src/portal/components/PortalNotificationPanel.tsx +230 -0
  1397. package/src/portal/components/PortalPageHeader.tsx +33 -0
  1398. package/src/portal/components/index.ts +6 -0
  1399. package/src/portal/hooks/useCustomerAuth.ts +97 -0
  1400. package/src/portal/hooks/usePortalAppEvent.ts +56 -0
  1401. package/src/portal/hooks/usePortalDashboardWidgets.ts +50 -0
  1402. package/src/portal/hooks/usePortalEventBridge.ts +162 -0
  1403. package/src/portal/hooks/usePortalInjectedMenuItems.ts +130 -0
  1404. package/src/portal/hooks/usePortalNotifications.ts +116 -0
  1405. package/src/portal/hooks/useTenantContext.ts +83 -0
  1406. package/src/primitives/DataLoader.tsx +93 -0
  1407. package/src/primitives/ErrorNotice.tsx +17 -0
  1408. package/src/primitives/Notice.tsx +83 -0
  1409. package/src/primitives/alert.tsx +59 -0
  1410. package/src/primitives/badge.tsx +43 -0
  1411. package/src/primitives/button.tsx +60 -0
  1412. package/src/primitives/calendar.tsx +69 -0
  1413. package/src/primitives/card.tsx +92 -0
  1414. package/src/primitives/checkbox.tsx +34 -0
  1415. package/src/primitives/dialog.tsx +122 -0
  1416. package/src/primitives/form-field.tsx +106 -0
  1417. package/src/primitives/icon-button.tsx +48 -0
  1418. package/src/primitives/input.tsx +26 -0
  1419. package/src/primitives/label.tsx +18 -0
  1420. package/src/primitives/popover.tsx +37 -0
  1421. package/src/primitives/primitives.stories.tsx +223 -0
  1422. package/src/primitives/progress.tsx +28 -0
  1423. package/src/primitives/separator.tsx +7 -0
  1424. package/src/primitives/sheet.tsx +137 -0
  1425. package/src/primitives/spinner.tsx +27 -0
  1426. package/src/primitives/status-badge.tsx +62 -0
  1427. package/src/primitives/switch.tsx +92 -0
  1428. package/src/primitives/table.tsx +27 -0
  1429. package/src/primitives/tabs.tsx +131 -0
  1430. package/src/primitives/textarea.tsx +20 -0
  1431. package/src/primitives/tooltip.tsx +85 -0
  1432. package/src/primitives-v2/AGENTS.md +66 -0
  1433. package/src/primitives-v2/Alert.stories.tsx +56 -0
  1434. package/src/primitives-v2/Alert.tsx +108 -0
  1435. package/src/primitives-v2/Avatar.stories.tsx +60 -0
  1436. package/src/primitives-v2/Avatar.tsx +139 -0
  1437. package/src/primitives-v2/Badge.stories.tsx +80 -0
  1438. package/src/primitives-v2/Badge.tsx +99 -0
  1439. package/src/primitives-v2/Breadcrumb.stories.tsx +61 -0
  1440. package/src/primitives-v2/Breadcrumb.tsx +96 -0
  1441. package/src/primitives-v2/Button.stories.tsx +72 -0
  1442. package/src/primitives-v2/Button.tsx +178 -0
  1443. package/src/primitives-v2/Checkbox.stories.tsx +34 -0
  1444. package/src/primitives-v2/Checkbox.tsx +103 -0
  1445. package/src/primitives-v2/IconButton.stories.tsx +40 -0
  1446. package/src/primitives-v2/IconButton.tsx +40 -0
  1447. package/src/primitives-v2/Input.stories.tsx +60 -0
  1448. package/src/primitives-v2/Input.tsx +113 -0
  1449. package/src/primitives-v2/NavGroup.stories.tsx +50 -0
  1450. package/src/primitives-v2/NavGroup.tsx +76 -0
  1451. package/src/primitives-v2/NavItem.stories.tsx +68 -0
  1452. package/src/primitives-v2/NavItem.tsx +105 -0
  1453. package/src/primitives-v2/SearchInput.stories.tsx +44 -0
  1454. package/src/primitives-v2/SearchInput.tsx +123 -0
  1455. package/src/primitives-v2/Sidebar.stories.tsx +91 -0
  1456. package/src/primitives-v2/Sidebar.tsx +92 -0
  1457. package/src/primitives-v2/Tab.stories.tsx +62 -0
  1458. package/src/primitives-v2/Tab.tsx +148 -0
  1459. package/src/primitives-v2/Tag.stories.tsx +123 -0
  1460. package/src/primitives-v2/Tag.tsx +115 -0
  1461. package/src/primitives-v2/Toggle.stories.tsx +37 -0
  1462. package/src/primitives-v2/Toggle.tsx +93 -0
  1463. package/src/primitives-v2/Topbar.stories.tsx +65 -0
  1464. package/src/primitives-v2/Topbar.tsx +37 -0
  1465. package/src/primitives-v2/index.ts +31 -0
  1466. package/src/primitives-v2/utils.ts +9 -0
  1467. package/src/theme/BrandThemeProvider.tsx +122 -0
  1468. package/src/theme/QueryProvider.tsx +46 -0
  1469. package/src/theme/ThemeProvider.tsx +120 -0
  1470. package/src/theme/ThemeToggle.tsx +88 -0
  1471. package/src/theme/index.ts +4 -0
  1472. package/src/theme/m3.css +622 -0
  1473. package/src/theme/tokens.v2.css +559 -0
  1474. package/src/theme/typography.css +163 -0
  1475. package/src/theme/typography.stories.tsx +157 -0
  1476. package/src/theme/typography.tokens.ts +326 -0
  1477. package/src/types/react-big-calendar.d.ts +16 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/backend/dynamic-table/store/index.ts"],
4
+ "sourcesContent": ["// store.ts\n\nimport type React from 'react';\nimport {\n CellId,\n SelectionState,\n SelectionBounds,\n CellState,\n SaveStateType,\n CellSubscriber,\n ColumnDef,\n RangeEdges,\n FillPreview,\n ClipboardMarker,\n UndoCellChange,\n UndoEntry,\n} from '../types/index';\n\nexport interface CellStore {\n // --- Reads (imperative, no subscription) ---\n /**\n * THE single cell-value read. A pure projection of the row object:\n * `getRowData(row)?.[currentColumns[col].data]` \u2014 exactly what `Cell.tsx`\n * renders. There is deliberately no second value map: a column-indexed cache\n * cannot survive a perspective reorder or a show/hide (`setColumns` re-keys\n * widths but could never re-key a stale value map correctly), which is how\n * copy and export used to disagree with the screen. Never reintroduce one.\n */\n getCellValue(row: number, col: number): any;\n getRowData(row: number): any;\n getRowCount(): number;\n getSelection(): SelectionState;\n getSelectionBounds(): SelectionBounds | null;\n getFillPreview(): FillPreview | null;\n /**\n * In-grid Find & Replace state. Lives HERE, not in React state: `Cell` is\n * memo'd and subscribes per cell, so routing match state through a parent\n * would repaint every mounted row on every keystroke.\n */\n /** The marching-ants rectangle, or `null` when nothing is marked. */\n getClipboardMarker(): ClipboardMarker | null;\n getEditingCell(): { row: number; col: number } | null;\n getSaveState(row: number, col: number): SaveStateType;\n isNewRow(row: number): boolean;\n hasNewRows(): boolean;\n /**\n * The column's PAINTED width: its declared width plus any fill-to-container\n * surplus assigned by `setColumnStretch`. Every render site (cells, headers,\n * spacers, the column virtualizer's geometry) reads this one number, which is\n * what keeps a virtualization spacer honest while the table fills its\n * container.\n */\n getColumnWidth(col: number): number;\n /**\n * The column's DECLARED width \u2014 what the column definition asked for, or what\n * the user last dragged it to. Never includes the fill surplus.\n *\n * Read by everything that must not feed the fill back into itself:\n * persistence (a stretched width must never be saved as a user preference),\n * badge auto-fit (it grows the declared width), and the fill computation itself.\n */\n getBaseColumnWidth(col: number): number;\n getColumnWidths(): Map<number, number>;\n /**\n * Assign the surplus that fills the container, in resolved PIXELS, keyed by\n * column index. Replaces the previous assignment wholesale; an empty map\n * clears it. No-ops (and notifies nobody) when nothing actually moved, which\n * is what stops the measure \u2192 apply \u2192 measure loop.\n */\n setColumnStretch(next: Map<number, number>): void;\n getStoreRevision(): number;\n getSelectionRevision(): number;\n\n // Derived for cell rendering\n getCellState(row: number, col: number): CellState;\n\n // For copy/paste operations\n getCellsInSelection(): { row: number; col: number; value: any }[];\n /**\n * Every cell of an arbitrary rectangle, row-major. `getCellsInSelection()`\n * delegates to this; fill reads its source block through it, and paste needs\n * the identical walk. Addressing is by INDEX into the full column array \u2014 a\n * column that is scrolled out of the virtualization window is still a column.\n */\n getCellsInRect(bounds: SelectionBounds): { row: number; col: number; value: any }[];\n\n // --- Writes (trigger revisions) ---\n setCellValue(row: number, col: number, value: any): void;\n setRowData(row: number, data: any): void;\n setSelection(selection: SelectionState): void;\n setFillPreview(preview: FillPreview | null): void;\n /** Replace the finder's state, repainting only the cells whose match status changed. */\n /**\n * Mark (or unmark) what is on the clipboard \u2014 Excel's marching ants.\n * Repaints the UNION of the old and the new rectangle, nothing else.\n */\n setClipboardMarker(marker: ClipboardMarker | null): void;\n setEditingCell(row: number, col: number): void;\n clearEditing(): void;\n /**\n * The cell under the pointer, or `null` on leaving the grid. Repaints only\n * the cell left and the cell entered \u2014 never the row, never the table.\n */\n setHoveredCell(cell: { row: number; col: number } | null): void;\n setSaveState(row: number, col: number, state: SaveStateType): void;\n setColumnWidth(col: number, width: number): void;\n\n // Bulk data operations\n setData(data: any[]): void;\n setColumns(columns: ColumnDef[]): void;\n reinitColumnWidths(): void;\n addRow(rowData: any, atIndex?: number): void;\n removeRow(rowIndex: number): void;\n markRowAsNew(rowIndex: number, isNew: boolean): void;\n markRowAsSaved(rowIndex: number, savedData: any): void;\n\n // --- Subscriptions ---\n subscribe(row: number, col: number, callback: CellSubscriber): () => void;\n subscribeToStore(callback: CellSubscriber): () => void;\n subscribeToSelection(callback: CellSubscriber): () => void;\n /**\n * Fires when the EDITING CELL moves (opened, moved, closed) \u2014 and nothing\n * else. Deliberately separate from the selection channel: `setEditingCell`\n * bumps only the two affected cells' revisions, so a selection subscriber\n * cannot see it, and widening `setEditingCell` to bump the selection revision\n * would re-render every mounted row on every edit start.\n *\n * Column virtualization is the reason this exists: the edited column is\n * force-mounted, so the grid has to learn that it moved.\n */\n subscribeToEditing(callback: CellSubscriber): () => void;\n getRevision(row: number, col: number): number;\n\n // --- Table container focus management ---\n setTableRef(ref: React.RefObject<HTMLDivElement | null>): void;\n focusTable(): void;\n blurTable(): void;\n\n // --- Undo / redo ---\n /** Record one cell mutation. No-op while suppressed (during replay). */\n recordCellChange(change: UndoCellChange): void;\n /** Open a group so subsequent recorded changes coalesce into one entry. */\n beginUndoGroup(): void;\n /** Close the open group, pushing it as a single entry if it has changes. */\n endUndoGroup(): void;\n popUndo(): UndoEntry | null;\n popRedo(): UndoEntry | null;\n pushUndo(entry: UndoEntry): void;\n pushRedo(entry: UndoEntry): void;\n canUndo(): boolean;\n canRedo(): boolean;\n setUndoSuppressed(suppressed: boolean): void;\n /** Resolve a stable row id to its current row index, or -1 if not present. */\n findRowIndexById(idColumnName: string, id: any): number;\n\n // --- Internal ---\n bumpRevision(row: number, col: number): void;\n bumpRevisions(cells: Array<{ row: number; col: number }>): void;\n bumpRowRevisions(row: number, colCount: number): void;\n bumpStoreRevision(): void;\n}\n\nexport function createCellStore(initialData: any[], columns: ColumnDef[]): CellStore {\n // Internal state.\n // `rowDataMap` is the ONE value source. Everything else here is metadata\n // (revisions, save states, widths, new-row flags) keyed by position.\n const rowDataMap = new Map<number, any>();\n const revisions = new Map<CellId, number>();\n const subscribers = new Map<CellId, Set<CellSubscriber>>();\n const saveStates = new Map<CellId, SaveStateType>();\n const newRowFlags = new Set<number>();\n const columnWidths = new Map<number, number>();\n // Fill-to-container surplus, in pixels, per column index. Held SEPARATELY\n // from the declared widths so a user's own drag, a persisted width and a\n // badge auto-fit are never overwritten by the fill \u2014 and so the fill can be\n // recomputed from scratch on every container resize instead of accumulating.\n const columnStretch = new Map<number, number>();\n const storeSubscribers = new Set<CellSubscriber>();\n\n // Mutable columns reference - updated when column order/visibility changes\n let currentColumns = columns;\n\n let selection: SelectionState = { type: null, anchor: null, focus: null };\n let fillPreview: FillPreview | null = null;\n // Excel's marching ants. Deliberately NOT derived from the selection: it has\n // to outlive the cursor moving away, which is the entire point of it.\n let clipboardMarker: ClipboardMarker | null = null;\n let editingCell: { row: number; col: number } | null = null;\n // Pointer position in CELL space. See `setHoveredCell` for why this is not\n // React state.\n let hoveredCell: { row: number; col: number } | null = null;\n\n // Undo / redo: stacks of entries (one inline edit, or one whole fill).\n const UNDO_LIMIT = 100;\n const undoStack: UndoEntry[] = [];\n const redoStack: UndoEntry[] = [];\n let undoGroup: UndoCellChange[] | null = null;\n let suppressUndo = false;\n let rowCount = initialData.length;\n let storeRevision = 0;\n let selectionRevision = 0;\n const selectionSubscribers = new Set<CellSubscriber>();\n const editingSubscribers = new Set<CellSubscriber>();\n let tableRef: React.RefObject<HTMLDivElement | null> | null = null;\n\n // Cache, invalidated on selection change\n let boundsCache: SelectionBounds | null = null;\n\n const getCellId = (row: number, col: number): CellId => `${row}:${col}`;\n\n const calcBounds = (): SelectionBounds | null => {\n if (!selection.anchor || !selection.focus) return null;\n\n if (selection.type === 'rowRange') {\n return {\n startRow: Math.min(selection.anchor.row, selection.focus.row),\n endRow: Math.max(selection.anchor.row, selection.focus.row),\n startCol: 0,\n endCol: currentColumns.length - 1,\n };\n }\n\n if (selection.type === 'colRange') {\n return {\n startRow: 0,\n endRow: rowCount - 1,\n startCol: Math.min(selection.anchor.col, selection.focus.col),\n endCol: Math.max(selection.anchor.col, selection.focus.col),\n };\n }\n\n return {\n startRow: Math.min(selection.anchor.row, selection.focus.row),\n endRow: Math.max(selection.anchor.row, selection.focus.row),\n startCol: Math.min(selection.anchor.col, selection.focus.col),\n endCol: Math.max(selection.anchor.col, selection.focus.col),\n };\n };\n\n const notify = (row: number, col: number) => {\n const id = getCellId(row, col);\n const subs = subscribers.get(id);\n if (subs) {\n subs.forEach((cb) => cb());\n }\n };\n\n const bumpRevision = (row: number, col: number) => {\n const id = getCellId(row, col);\n revisions.set(id, (revisions.get(id) ?? 0) + 1);\n notify(row, col);\n };\n\n const bumpRevisions = (cells: Array<{ row: number; col: number }>) => {\n // First bump all revisions\n cells.forEach(({ row, col }) => {\n const id = getCellId(row, col);\n revisions.set(id, (revisions.get(id) ?? 0) + 1);\n });\n // Then notify all (batch notifications)\n cells.forEach(({ row, col }) => notify(row, col));\n };\n\n const bumpRowRevisions = (row: number, colCount: number) => {\n const cells: Array<{ row: number; col: number }> = [];\n for (let col = 0; col < colCount; col++) {\n cells.push({ row, col });\n }\n bumpRevisions(cells);\n };\n\n const notifyStoreSubscribers = () => {\n storeSubscribers.forEach((cb) => cb());\n };\n\n const notifySelectionSubscribers = () => {\n selectionSubscribers.forEach((cb) => cb());\n };\n\n const notifyEditingSubscribers = () => {\n editingSubscribers.forEach((cb) => cb());\n };\n\n const bumpStoreRevision = () => {\n storeRevision++;\n notifyStoreSubscribers();\n };\n\n const bumpSelectionRevision = () => {\n selectionRevision++;\n notifySelectionSubscribers();\n };\n\n const isCellInBounds = (row: number, col: number, bounds: SelectionBounds): boolean => {\n return (\n row >= bounds.startRow &&\n row <= bounds.endRow &&\n col >= bounds.startCol &&\n col <= bounds.endCol\n );\n };\n\n const getRangeEdges = (row: number, col: number, bounds: SelectionBounds): RangeEdges => ({\n top: row === bounds.startRow,\n bottom: row === bounds.endRow,\n left: col === bounds.startCol,\n right: col === bounds.endCol,\n });\n\n /**\n * Does this block contain AT LEAST ONE column a fill may write?\n *\n * \"At least one\", never \"all\": a five-column selection that happens to include\n * a read-only lookup column must still offer the handle. That column's writes\n * are rejected by `applyCellWrites` and reported; the other four fill.\n */\n const someColumnFillable = (bounds: SelectionBounds): boolean => {\n for (let c = bounds.startCol; c <= bounds.endCol; c++) {\n const col = currentColumns[c];\n if (col && !col.readOnly && !col.disableFill) return true;\n }\n return false;\n };\n\n /**\n * Repaint the UNION of two rectangles, deduped. Used by both `setSelection`\n * and `setFillPreview` \u2014 cells leaving the old rect must lose their outline in\n * the same frame cells joining the new one gain it, or the grid shows two\n * outlines for a frame.\n */\n const repaintUnion = (a: SelectionBounds | null, b: SelectionBounds | null) => {\n const affected: Array<{ row: number; col: number }> = [];\n const add = (bounds: SelectionBounds | null) => {\n if (!bounds) return;\n for (let r = bounds.startRow; r <= bounds.endRow; r++) {\n for (let c = bounds.startCol; c <= bounds.endCol; c++) affected.push({ row: r, col: c });\n }\n };\n add(a);\n add(b);\n const seen = new Set<CellId>();\n const unique = affected.filter(({ row, col }) => {\n const id = getCellId(row, col);\n if (seen.has(id)) return false;\n seen.add(id);\n return true;\n });\n bumpRevisions(unique);\n };\n\n // Initialize data\n const initializeData = (data: any[]) => {\n rowDataMap.clear();\n rowCount = data.length;\n\n data.forEach((row, rowIndex) => {\n rowDataMap.set(rowIndex, row);\n });\n };\n\n // Initialize with provided data\n initializeData(initialData);\n\n // Initialize column widths from column definitions\n currentColumns.forEach((col, idx) => {\n if (col.width) {\n columnWidths.set(idx, col.width);\n }\n });\n\n const store: CellStore = {\n // --- Reads ---\n getCellValue(row: number, col: number): any {\n // Projection, never a cache. `col` indexes the CURRENT view-order column\n // array, so a reorder/hide is picked up on the very next read \u2014 which is\n // why copy, export and the screen can no longer disagree.\n const colDef = currentColumns[col];\n if (!colDef) return undefined;\n return rowDataMap.get(row)?.[colDef.data];\n },\n\n getRowData(row: number): any {\n return rowDataMap.get(row);\n },\n\n getRowCount(): number {\n return rowCount;\n },\n\n getSelection(): SelectionState {\n return selection;\n },\n\n getSelectionBounds(): SelectionBounds | null {\n if (!boundsCache) {\n boundsCache = calcBounds();\n }\n return boundsCache;\n },\n\n getFillPreview(): FillPreview | null {\n return fillPreview;\n },\n\n\n getClipboardMarker(): ClipboardMarker | null {\n return clipboardMarker;\n },\n\n getEditingCell(): { row: number; col: number } | null {\n return editingCell;\n },\n\n getSaveState(row: number, col: number): SaveStateType {\n return saveStates.get(getCellId(row, col)) ?? null;\n },\n\n isNewRow(row: number): boolean {\n return newRowFlags.has(row);\n },\n\n hasNewRows(): boolean {\n return newRowFlags.size > 0;\n },\n\n getColumnWidth(col: number): number {\n return (\n (columnWidths.get(col) ?? currentColumns[col]?.width ?? 100) +\n (columnStretch.get(col) ?? 0)\n );\n },\n\n getBaseColumnWidth(col: number): number {\n return columnWidths.get(col) ?? currentColumns[col]?.width ?? 100;\n },\n\n getColumnWidths(): Map<number, number> {\n return new Map(columnWidths);\n },\n\n setColumnStretch(next: Map<number, number>): void {\n // Normalize first: a zero surplus is the ABSENCE of one, so `{a: 0}` and\n // `{}` must compare equal \u2014 otherwise every measure would look like a\n // change and re-render the grid on a loop.\n const normalized = new Map<number, number>();\n next.forEach((extra, col) => { if (extra > 0) normalized.set(col, extra); });\n let changed = normalized.size !== columnStretch.size;\n if (!changed) {\n for (const [col, extra] of normalized) {\n if (columnStretch.get(col) !== extra) { changed = true; break; }\n }\n }\n if (!changed) return;\n columnStretch.clear();\n normalized.forEach((extra, col) => columnStretch.set(col, extra));\n bumpStoreRevision();\n },\n\n getStoreRevision(): number {\n return storeRevision;\n },\n\n getSelectionRevision(): number {\n return selectionRevision;\n },\n\n getCellState(row: number, col: number): CellState {\n const bounds = this.getSelectionBounds();\n const isInRange = bounds ? isCellInBounds(row, col, bounds) : false;\n\n const isSelected =\n selection.type === 'cell' &&\n selection.anchor?.row === row &&\n selection.anchor?.col === col;\n\n // The fill preview is a RECTANGLE (Excel fills in four directions), so\n // containment is the same `isCellInBounds` test the selection uses and the\n // edges come from the same `getRangeEdges` helper. `fillEdges` was already\n // typed four-sided; it simply used to be told `left: true, right: true`,\n // which is only correct for a one-column strip.\n const isFillPreview = !!fillPreview && isCellInBounds(row, col, fillPreview.bounds);\n // The extension only \u2014 the cells that will actually be WRITTEN on release.\n const isFillTarget =\n isFillPreview && !!fillPreview && !isCellInBounds(row, col, fillPreview.source);\n const isFillClearing =\n !!fillPreview && !!fillPreview.cleared && isCellInBounds(row, col, fillPreview.cleared);\n\n // The drag nub. Computed HERE, not in `Cell.tsx`: it needs the whole\n // selection AND the column defs, both of which are already in this\n // closure. Asking \"is ANY column in the selection fillable\" is what lets a\n // multi-column source that CONTAINS a read-only column still offer a\n // handle \u2014 that column's writes are rejected, the rest go through.\n const isFillOrigin =\n !!bounds &&\n row === bounds.endRow &&\n col === bounds.endCol &&\n !editingCell &&\n someColumnFillable(bounds);\n\n const cellId = getCellId(row, col);\n // Marching ants. Same containment test and same edge helper as the\n // selection outline, so only the OUTER border of the marked block is\n // painted rather than a box around every cell in it.\n const isClipboardSource =\n !!clipboardMarker && isCellInBounds(row, col, clipboardMarker.bounds);\n\n return {\n value: this.getCellValue(row, col),\n isSelected,\n isInRange,\n rangeEdges: isInRange && bounds ? getRangeEdges(row, col, bounds) : {},\n isEditing: editingCell?.row === row && editingCell?.col === col,\n saveState: this.getSaveState(row, col),\n isNewRow: this.isNewRow(row),\n isFillPreview,\n isFillTarget,\n isFillClearing,\n isFillOrigin,\n fillEdges: isFillPreview && fillPreview ? getRangeEdges(row, col, fillPreview.bounds) : {},\n isClipboardSource,\n clipboardEdges:\n isClipboardSource && clipboardMarker\n ? getRangeEdges(row, col, clipboardMarker.bounds)\n : {},\n clipboardMode: isClipboardSource && clipboardMarker ? clipboardMarker.mode : null,\n isHovered: hoveredCell?.row === row && hoveredCell?.col === col,\n };\n },\n\n getCellsInSelection(): { row: number; col: number; value: any }[] {\n const bounds = this.getSelectionBounds();\n if (!bounds) return [];\n return this.getCellsInRect(bounds);\n },\n\n getCellsInRect(bounds: SelectionBounds): { row: number; col: number; value: any }[] {\n const cells: { row: number; col: number; value: any }[] = [];\n for (let r = bounds.startRow; r <= bounds.endRow; r++) {\n for (let c = bounds.startCol; c <= bounds.endCol; c++) {\n cells.push({ row: r, col: c, value: this.getCellValue(r, c) });\n }\n }\n return cells;\n },\n\n // --- Writes ---\n setCellValue(row: number, col: number, value: any): void {\n // Writes the ONE value source in place. The row object is shared with the\n // consumer's `data` array by design (optimistic update), so the renderer,\n // copy and export all observe the new value on the next read.\n const rowData = rowDataMap.get(row);\n if (rowData && currentColumns[col]) {\n rowData[currentColumns[col].data] = value;\n }\n\n bumpRevision(row, col);\n },\n\n setRowData(row: number, data: any): void {\n rowDataMap.set(row, data);\n bumpRowRevisions(row, currentColumns.length);\n },\n\n setSelection(newSelection: SelectionState): void {\n const oldBounds = this.getSelectionBounds();\n selection = newSelection;\n boundsCache = null; // invalidate cache\n const newBounds = this.getSelectionBounds();\n\n // Collect all affected cells\n const affected: Array<{ row: number; col: number }> = [];\n\n const addBoundsCells = (bounds: SelectionBounds | null) => {\n if (!bounds) return;\n for (let r = bounds.startRow; r <= bounds.endRow; r++) {\n for (let c = bounds.startCol; c <= bounds.endCol; c++) {\n affected.push({ row: r, col: c });\n }\n }\n };\n\n addBoundsCells(oldBounds);\n addBoundsCells(newBounds);\n\n // Dedupe\n const seen = new Set<CellId>();\n const unique = affected.filter(({ row, col }) => {\n const id = getCellId(row, col);\n if (seen.has(id)) return false;\n seen.add(id);\n return true;\n });\n\n bumpRevisions(unique);\n bumpSelectionRevision();\n },\n\n setFillPreview(preview: FillPreview | null): void {\n const prev = fillPreview;\n fillPreview = preview;\n // Repaint the union of the old and new fill RECTANGLES so cells leaving\n // the preview lose their dashed outline in the same frame cells joining it\n // gain one. Over a 100x20 grid that is ~2,000 notifies per mousemove \u2014 the\n // same order a full-grid drag-select already costs today.\n repaintUnion(prev ? prev.bounds : null, preview ? preview.bounds : null);\n },\n\n\n setClipboardMarker(marker: ClipboardMarker | null): void {\n const prev = clipboardMarker;\n if (!prev && !marker) return;\n clipboardMarker = marker;\n // Same union repaint the selection and the fill preview use: cells\n // leaving the old rectangle must lose their ants in the SAME frame cells\n // joining the new one gain them, or the grid briefly shows two.\n repaintUnion(prev?.bounds ?? null, marker?.bounds ?? null);\n },\n\n // --- Undo / redo ---\n recordCellChange(change: UndoCellChange): void {\n if (suppressUndo) return;\n if (undoGroup) {\n undoGroup.push(change);\n } else {\n undoStack.push({ changes: [change] });\n if (undoStack.length > UNDO_LIMIT) undoStack.shift();\n redoStack.length = 0;\n }\n },\n\n beginUndoGroup(): void {\n undoGroup = [];\n },\n\n endUndoGroup(): void {\n const group = undoGroup;\n undoGroup = null;\n if (group && group.length > 0) {\n undoStack.push({ changes: group });\n if (undoStack.length > UNDO_LIMIT) undoStack.shift();\n redoStack.length = 0;\n }\n },\n\n popUndo(): UndoEntry | null {\n return undoStack.pop() ?? null;\n },\n\n popRedo(): UndoEntry | null {\n return redoStack.pop() ?? null;\n },\n\n pushUndo(entry: UndoEntry): void {\n undoStack.push(entry);\n if (undoStack.length > UNDO_LIMIT) undoStack.shift();\n },\n\n pushRedo(entry: UndoEntry): void {\n redoStack.push(entry);\n },\n\n canUndo(): boolean {\n return undoStack.length > 0;\n },\n\n canRedo(): boolean {\n return redoStack.length > 0;\n },\n\n setUndoSuppressed(suppressed: boolean): void {\n suppressUndo = suppressed;\n },\n\n findRowIndexById(idColumnName: string, id: any): number {\n if (id == null) return -1;\n for (const [index, rowData] of rowDataMap) {\n if (rowData?.[idColumnName] === id) return index;\n }\n return -1;\n },\n\n setEditingCell(row: number, col: number): void {\n const prev = editingCell;\n editingCell = { row, col };\n\n if (prev) {\n bumpRevision(prev.row, prev.col);\n }\n bumpRevision(row, col);\n if (!prev || prev.row !== row || prev.col !== col) notifyEditingSubscribers();\n },\n\n setHoveredCell(cell: { row: number; col: number } | null): void {\n const prev = hoveredCell;\n if (prev && cell && prev.row === cell.row && prev.col === cell.col) return;\n if (!prev && !cell) return;\n hoveredCell = cell;\n if (prev) bumpRevision(prev.row, prev.col);\n if (cell) bumpRevision(cell.row, cell.col);\n },\n\n clearEditing(): void {\n if (editingCell) {\n const { row, col } = editingCell;\n editingCell = null;\n bumpRevision(row, col);\n notifyEditingSubscribers();\n }\n },\n\n setSaveState(row: number, col: number, state: SaveStateType): void {\n const id = getCellId(row, col);\n if (state === null) {\n saveStates.delete(id);\n } else {\n saveStates.set(id, state);\n }\n bumpRevision(row, col);\n },\n\n setColumnWidth(col: number, width: number): void {\n columnWidths.set(col, width);\n // An explicit width REPLACES the fill surplus for that column. Without\n // this a resize drag would jump by the surplus on its first pixel: the\n // drag starts from the painted width and would then have the surplus\n // added on top of it again. The next measure re-distributes whatever is\n // still free across the columns that are still flexible.\n columnStretch.delete(col);\n // Bump store revision to trigger re-render of headers and total width\n bumpStoreRevision();\n },\n\n setData(data: any[]): void {\n // The marching ants are addressed by ROW INDEX. A refetch that returns\n // the same rows in the same order leaves them pointing at the same cells,\n // which is the common case (paste/copy do not change the sort) and is why\n // the marker survives it. A different row COUNT proves the indices moved,\n // and a marker that has silently slid onto other people's data is worse\n // than no marker \u2014 so it is dropped rather than guessed at.\n if (clipboardMarker && data.length !== rowCount) {\n const stale = clipboardMarker;\n clipboardMarker = null;\n repaintUnion(stale.bounds, null);\n }\n initializeData(data);\n newRowFlags.clear();\n\n // Bump all subscribed cells\n subscribers.forEach((_, id) => {\n const [row, col] = id.split(':').map(Number);\n bumpRevision(row, col);\n });\n\n bumpStoreRevision();\n },\n\n setColumns(newColumns: ColumnDef[]): void {\n // Column indices have just moved (reorder / show-hide), so the ants'\n // COLUMN bounds no longer name the columns they were drawn around.\n if (clipboardMarker) {\n const stale = clipboardMarker;\n clipboardMarker = null;\n repaintUnion(stale.bounds, null);\n }\n // Preserve the user's current widths across a column change (reorder /\n // show-hide) by remapping them via the stable `data` key rather than the\n // positional index. Without this, every perspective reorder would snap\n // manually-sized columns back to their defaults.\n const widthsByData = new Map<string, number>();\n currentColumns.forEach((col, idx) => {\n const w = columnWidths.get(idx);\n if (w != null) widthsByData.set(col.data, w);\n });\n currentColumns = newColumns;\n columnWidths.clear();\n // The surplus is index-keyed and the indices have just moved. Dropped\n // rather than remapped: the column SET changed, so the distribution is\n // wrong anyway and the next measure recomputes it from scratch.\n columnStretch.clear();\n newColumns.forEach((col, idx) => {\n const carried = widthsByData.get(col.data);\n if (carried != null) columnWidths.set(idx, carried);\n else if (col.width) columnWidths.set(idx, col.width);\n });\n // Clear save states when columns change to avoid showing states on wrong cells\n saveStates.clear();\n bumpStoreRevision();\n },\n\n reinitColumnWidths(): void {\n // Drop all width overrides back to the column definitions. Used when the\n // persistence scope changes under us (e.g. a different account loads on the\n // same browser) so one user's layout never lingers into another's.\n columnWidths.clear();\n columnStretch.clear();\n currentColumns.forEach((col, idx) => {\n if (col.width) columnWidths.set(idx, col.width);\n });\n bumpStoreRevision();\n },\n\n addRow(rowData: any, atIndex: number = 0): void {\n // Shift all existing data down\n const newRowDataMap = new Map<number, any>();\n const newRevisions = new Map<CellId, number>();\n const newSaveStates = new Map<CellId, SaveStateType>();\n const newNewRowFlags = new Set<number>();\n\n // Shift rows after insertion point\n rowDataMap.forEach((data, idx) => {\n const newIdx = idx >= atIndex ? idx + 1 : idx;\n newRowDataMap.set(newIdx, data);\n });\n\n // Shift revisions\n revisions.forEach((rev, id) => {\n const [r, c] = id.split(':').map(Number);\n const newR = r >= atIndex ? r + 1 : r;\n newRevisions.set(getCellId(newR, c), rev);\n });\n\n // Shift save states\n saveStates.forEach((state, id) => {\n const [r, c] = id.split(':').map(Number);\n const newR = r >= atIndex ? r + 1 : r;\n newSaveStates.set(getCellId(newR, c), state);\n });\n\n // Shift new row flags\n newRowFlags.forEach((idx) => {\n newNewRowFlags.add(idx >= atIndex ? idx + 1 : idx);\n });\n\n // Clear and repopulate\n rowDataMap.clear();\n revisions.clear();\n saveStates.clear();\n newRowFlags.clear();\n\n newRowDataMap.forEach((data, idx) => rowDataMap.set(idx, data));\n newRevisions.forEach((rev, id) => revisions.set(id, rev));\n newSaveStates.forEach((state, id) => saveStates.set(id, state));\n newNewRowFlags.forEach((idx) => newRowFlags.add(idx));\n\n // Add new row. Seed every column key that the caller left out with '' \u2014\n // the row object IS the value source now, so a missing key would render\n // (and copy, and export) as `undefined` instead of an empty cell.\n currentColumns.forEach((col) => {\n if (rowData[col.data] == null) rowData[col.data] = '';\n });\n rowDataMap.set(atIndex, rowData);\n\n rowCount++;\n\n // Mark as new row\n newRowFlags.add(atIndex);\n\n // Bump all subscribed cells\n subscribers.forEach((_, id) => {\n const [row, col] = id.split(':').map(Number);\n bumpRevision(row, col);\n });\n\n bumpStoreRevision();\n },\n\n removeRow(rowIndex: number): void {\n // Shift all data up\n const newRowDataMap = new Map<number, any>();\n const newRevisions = new Map<CellId, number>();\n const newSaveStates = new Map<CellId, SaveStateType>();\n const newNewRowFlags = new Set<number>();\n\n rowDataMap.forEach((data, idx) => {\n if (idx < rowIndex) {\n newRowDataMap.set(idx, data);\n } else if (idx > rowIndex) {\n newRowDataMap.set(idx - 1, data);\n }\n });\n\n revisions.forEach((rev, id) => {\n const [r, c] = id.split(':').map(Number);\n if (r < rowIndex) {\n newRevisions.set(getCellId(r, c), rev);\n } else if (r > rowIndex) {\n newRevisions.set(getCellId(r - 1, c), rev);\n }\n });\n\n saveStates.forEach((state, id) => {\n const [r, c] = id.split(':').map(Number);\n if (r < rowIndex) {\n newSaveStates.set(getCellId(r, c), state);\n } else if (r > rowIndex) {\n newSaveStates.set(getCellId(r - 1, c), state);\n }\n });\n\n newRowFlags.forEach((idx) => {\n if (idx < rowIndex) {\n newNewRowFlags.add(idx);\n } else if (idx > rowIndex) {\n newNewRowFlags.add(idx - 1);\n }\n });\n\n // Clear and repopulate\n rowDataMap.clear();\n revisions.clear();\n saveStates.clear();\n newRowFlags.clear();\n\n newRowDataMap.forEach((data, idx) => rowDataMap.set(idx, data));\n newRevisions.forEach((rev, id) => revisions.set(id, rev));\n newSaveStates.forEach((state, id) => saveStates.set(id, state));\n newNewRowFlags.forEach((idx) => newRowFlags.add(idx));\n\n rowCount--;\n\n // Bump all subscribed cells\n subscribers.forEach((_, id) => {\n const [row, col] = id.split(':').map(Number);\n bumpRevision(row, col);\n });\n\n bumpStoreRevision();\n },\n\n markRowAsNew(rowIndex: number, isNew: boolean): void {\n if (isNew) {\n newRowFlags.add(rowIndex);\n } else {\n newRowFlags.delete(rowIndex);\n }\n bumpRowRevisions(rowIndex, currentColumns.length);\n bumpStoreRevision();\n },\n\n markRowAsSaved(rowIndex: number, savedData: any): void {\n newRowFlags.delete(rowIndex);\n rowDataMap.set(rowIndex, savedData);\n bumpRowRevisions(rowIndex, currentColumns.length);\n bumpStoreRevision();\n },\n\n // --- Subscriptions ---\n subscribe(row: number, col: number, callback: CellSubscriber): () => void {\n const id = getCellId(row, col);\n if (!subscribers.has(id)) {\n subscribers.set(id, new Set());\n }\n subscribers.get(id)!.add(callback);\n\n return () => {\n const subs = subscribers.get(id);\n if (subs) {\n subs.delete(callback);\n if (subs.size === 0) {\n subscribers.delete(id);\n }\n }\n };\n },\n\n subscribeToStore(callback: CellSubscriber): () => void {\n storeSubscribers.add(callback);\n return () => {\n storeSubscribers.delete(callback);\n };\n },\n\n subscribeToSelection(callback: CellSubscriber): () => void {\n selectionSubscribers.add(callback);\n return () => {\n selectionSubscribers.delete(callback);\n };\n },\n\n subscribeToEditing(callback: CellSubscriber): () => void {\n editingSubscribers.add(callback);\n return () => {\n editingSubscribers.delete(callback);\n };\n },\n\n getRevision(row: number, col: number): number {\n return revisions.get(getCellId(row, col)) ?? 0;\n },\n\n // --- Table container focus management ---\n setTableRef(ref: React.RefObject<HTMLDivElement | null>): void {\n tableRef = ref;\n },\n\n focusTable(): void {\n tableRef?.current?.focus();\n },\n\n blurTable(): void {\n tableRef?.current?.blur();\n },\n\n bumpRevision,\n bumpRevisions,\n bumpRowRevisions,\n bumpStoreRevision,\n };\n\n return store;\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,2 @@
1
+ // Stub file - CSS is loaded via globals.css
2
+ export default {};
@@ -0,0 +1,2 @@
1
+ // Stub file - CSS is loaded via globals.css
2
+ export default {};
@@ -0,0 +1,2 @@
1
+ // Stub file - CSS is loaded via globals.css
2
+ export default {};
@@ -0,0 +1,2 @@
1
+ // Stub file - CSS is loaded via globals.css
2
+ export default {};
@@ -0,0 +1,2 @@
1
+ // Stub file - CSS is loaded via globals.css
2
+ export default {};
@@ -0,0 +1,2 @@
1
+ // Stub file - CSS is loaded via globals.css
2
+ export default {};
@@ -0,0 +1,29 @@
1
+ const DENSITY_LEVELS = ["comfortable", "compact", "dense"];
2
+ const DEFAULT_DENSITY = "comfortable";
3
+ const DENSITY_ATTRIBUTE = "data-density-level";
4
+ const DENSITY_METRICS = {
5
+ // Today's values, verified against DynamicTable.tsx:708 (`dataRowHeight`
6
+ // default 32) and DynamicTable.v2.css (header height is content-driven).
7
+ comfortable: { rowHeight: 32, headerHeight: null },
8
+ compact: { rowHeight: 26, headerHeight: 24 },
9
+ dense: { rowHeight: 20, headerHeight: 20 }
10
+ };
11
+ function isDensityLevel(value) {
12
+ return value === "comfortable" || value === "compact" || value === "dense";
13
+ }
14
+ function resolveDensityAttribute(level) {
15
+ return isDensityLevel(level) ? level : DEFAULT_DENSITY;
16
+ }
17
+ function resolveDensityRowHeight(level) {
18
+ return DENSITY_METRICS[isDensityLevel(level) ? level : DEFAULT_DENSITY].rowHeight;
19
+ }
20
+ export {
21
+ DEFAULT_DENSITY,
22
+ DENSITY_ATTRIBUTE,
23
+ DENSITY_LEVELS,
24
+ DENSITY_METRICS,
25
+ isDensityLevel,
26
+ resolveDensityAttribute,
27
+ resolveDensityRowHeight
28
+ };
29
+ //# sourceMappingURL=density.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/backend/dynamic-table/types/density.ts"],
4
+ "sourcesContent": ["/**\n * DynamicTable density scale \u2014 the USER-SETTABLE row/type density preference.\n *\n * \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n * WHY THIS EXISTS\n *\n * Logistics users read a whole working picture off one screen. The 3 Aug 2026\n * INF workshops recorded the complaint verbatim (A16): \"on a normal monitor\n * roughly half the needed columns fit\". The same workshops recorded the exact\n * opposite need \u2014 two users (Agnieszka, Klaudiusz) work completely differently\n * and both asked for their own defaults, and the product owner has repeatedly\n * flagged FMS tables as \"fonts too small\".\n *\n * Those two facts do not reconcile into one number. They reconcile into a\n * PREFERENCE. So:\n *\n * - `comfortable` is the DEFAULT and is pixel-identical to how the grid\n * renders today. Opting out of the feature is a no-op.\n * - `compact` and `dense` are opt-in, per user, and persist for that user.\n * - Nothing here shrinks type globally. There is no global default change.\n *\n * \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n * WHY IT IS AN ATTRIBUTE, NOT A PROP THREADED INTO CELLS\n *\n * The grid virtualizes ROWS ONLY (one `useVirtualizer`, `overscan: 10`, no\n * `horizontal: true`). `VirtualRow` does a plain `columns.map`, so EVERY column\n * of EVERY mounted row renders. Denser tables mount MORE cells, so anything\n * per-cell gets multiplied by thousands.\n *\n * Therefore density is delivered as ONE attribute on the container\n * (`data-density-level`) which flips a block of CSS custom properties consumed\n * by existing selectors in `styles/density.css`. Switching density re-styles\n * the entire grid with:\n *\n * - zero per-cell React work,\n * - zero cell re-renders,\n * - zero extra props threaded through `Cell` / `VirtualRow`.\n *\n * The browser recalculates style for the subtree; React does nothing.\n *\n * THE ONE EXCEPTION, stated honestly: ROW HEIGHT cannot be CSS-only. Rows are\n * absolutely positioned by the virtualizer (`transform: translateY(...)`, plus\n * an inline `height`), so the height must be a number JS knows. That is what\n * `DENSITY_METRICS[level].rowHeight` is for \u2014 the virtualizer's `estimateSize`\n * reads it, and `density.css` restates the SAME number for the box model.\n * Changing density therefore costs exactly one virtualizer re-measure, not a\n * per-cell pass. Do NOT try to force row height from CSS with `!important`:\n * it would win over the inline style and immediately desynchronise the fill\n * from the `translateY` offsets, overlapping the rows.\n *\n * \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n * NAMING TRAP \u2014 `data-density-level`, NOT `data-density`\n *\n * `data-density` is ALREADY TAKEN. `DynamicTable.tsx` emits it from a legacy\n * DEVELOPER-facing prop (`density?: 'sm' | 'md'` \u2192 36px / 44px rows), and\n * `DynamicTable.v2.css` carries rules keyed on `:not([data-density])` that\n * define part of today's default rendering. Reusing the attribute would\n * silently switch those rules off the moment a user picked `comfortable` \u2014\n * which is precisely the \"opting out must be a no-op\" guarantee, broken.\n *\n * So this scale uses a distinct attribute. The two are orthogonal today; see\n * the migration note at the bottom of this file.\n */\n\n/**\n * The three density levels, coarsest to tightest.\n *\n * - `comfortable` \u2014 today's sizing, exactly. The default.\n * - `compact` \u2014 same 12px type, tighter geometry. ~24% more rows.\n * - `dense` \u2014 the maximum-information setting: 11px data / 10px headers,\n * hairline row rules. ~67% more rows. For a power user on a\n * wide monitor who is scanning, not reading.\n */\nexport type DensityLevel = 'comfortable' | 'compact' | 'dense'\n\n/** Every level, in scale order. Safe to render as a picker. */\nexport const DENSITY_LEVELS: readonly DensityLevel[] = ['comfortable', 'compact', 'dense'] as const\n\n/**\n * The default. MUST stay `comfortable`: it is defined as pixel-identical to\n * pre-density rendering, which is what makes shipping this feature a visual\n * no-op for every user who never opens the setting.\n */\nexport const DEFAULT_DENSITY: DensityLevel = 'comfortable'\n\n/**\n * The container attribute that carries the level.\n *\n * Deliberately NOT `data-density` \u2014 see the naming trap above.\n */\nexport const DENSITY_ATTRIBUTE = 'data-density-level' as const\n\n/**\n * Geometry each level needs on the JS side.\n *\n * ONLY the numbers that CSS cannot own live here. Padding, borders, and the\n * type ramp are pure CSS (`styles/density.css`) and are intentionally absent \u2014\n * duplicating them in TS would create two sources of truth for values nothing\n * in JS reads.\n *\n * `rowHeight` MUST equal `--dt-row-height` for the same level in\n * `styles/density.css`. They are asserted equal by the unit test\n * `__tests__/density.test.ts`, which parses the stylesheet.\n */\nexport type DensityMetrics = {\n /**\n * Data-row height in px, border-box, INCLUDING the inter-row gap borders.\n * Feeds the virtualizer's `estimateSize`.\n */\n rowHeight: number\n /**\n * Column-header row height in px, border-box. `null` = content-driven\n * (`height: auto`), which is what today's grid does \u2014 pinning a number for\n * `comfortable` would be a 1\u20132px visual change, and `comfortable` is not\n * allowed to change anything.\n */\n headerHeight: number | null\n}\n\nexport const DENSITY_METRICS: Readonly<Record<DensityLevel, DensityMetrics>> = {\n // Today's values, verified against DynamicTable.tsx:708 (`dataRowHeight`\n // default 32) and DynamicTable.v2.css (header height is content-driven).\n comfortable: { rowHeight: 32, headerHeight: null },\n compact: { rowHeight: 26, headerHeight: 24 },\n dense: { rowHeight: 20, headerHeight: 20 },\n}\n\n/**\n * Narrow an untrusted value (localStorage, an API response, a URL param) to a\n * `DensityLevel`. Pure; no allocation.\n */\nexport function isDensityLevel(value: unknown): value is DensityLevel {\n return value === 'comfortable' || value === 'compact' || value === 'dense'\n}\n\n/**\n * Resolve a density level to the value of the container's density attribute.\n *\n * Pure, total, allocation-free \u2014 it returns one of three interned string\n * literals, so it is safe to call inside a render body.\n *\n * TOTAL BY DESIGN: an absent, `null`, or corrupt input (a stale localStorage\n * value, a hand-edited URL param) resolves to `DEFAULT_DENSITY` rather than\n * `null` or a throw. A broken preference must degrade to today's rendering,\n * never to an unstyled or missing grid.\n *\n * NOTE: `comfortable` DOES emit its attribute value rather than dropping the\n * attribute. That is deliberate. Every consuming rule in `density.css` is\n * guarded by `:not([data-density-level=\"comfortable\"])`, so the attribute's\n * presence at the default level changes nothing \u2014 and having it always present\n * means the level is inspectable in DevTools and assertable from `GridHarness`\n * without a special \"absent means comfortable\" case in every test.\n */\nexport function resolveDensityAttribute(level: DensityLevel | null | undefined): DensityLevel {\n return isDensityLevel(level) ? level : DEFAULT_DENSITY\n}\n\n/**\n * Row height for a level. Falls back to the default for unknown input rather\n * than throwing \u2014 a corrupt stored preference must never break the grid.\n */\nexport function resolveDensityRowHeight(level: DensityLevel | null | undefined): number {\n return DENSITY_METRICS[isDensityLevel(level) ? level : DEFAULT_DENSITY].rowHeight\n}\n\n/*\n * \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n * MIGRATION NOTE \u2014 folding in the legacy `density?: 'sm' | 'md'` prop\n *\n * The legacy prop is a per-table DEVELOPER choice (36px / 44px rows); this\n * scale is a per-user preference. They are independent axes today and a table\n * may carry both attributes without conflict, because `density.css` never\n * keys off `[data-density]`.\n *\n * The eventual cleanup \u2014 one axis, user-owned \u2014 is a separate change and needs\n * its own spec, because `'md'` (44px) is LOOSER than `comfortable` (32px), so\n * there is no honest 1:1 mapping. Do not \"simplify\" it in passing.\n * \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n */\n"],
5
+ "mappings": "AA4EO,MAAM,iBAA0C,CAAC,eAAe,WAAW,OAAO;AAOlF,MAAM,kBAAgC;AAOtC,MAAM,oBAAoB;AA6B1B,MAAM,kBAAkE;AAAA;AAAA;AAAA,EAG7E,aAAa,EAAE,WAAW,IAAI,cAAc,KAAK;AAAA,EACjD,SAAS,EAAE,WAAW,IAAI,cAAc,GAAG;AAAA,EAC3C,OAAO,EAAE,WAAW,IAAI,cAAc,GAAG;AAC3C;AAMO,SAAS,eAAe,OAAuC;AACpE,SAAO,UAAU,iBAAiB,UAAU,aAAa,UAAU;AACrE;AAoBO,SAAS,wBAAwB,OAAsD;AAC5F,SAAO,eAAe,KAAK,IAAI,QAAQ;AACzC;AAMO,SAAS,wBAAwB,OAAgD;AACtF,SAAO,gBAAgB,eAAe,KAAK,IAAI,QAAQ,eAAe,EAAE;AAC1E;",
6
+ "names": []
7
+ }
@@ -0,0 +1,124 @@
1
+ const getOperatorsForType = (type) => {
2
+ const common = [
3
+ { value: "is_any_of", label: "is any of" },
4
+ { value: "is_not_any_of", label: "is not any of" },
5
+ { value: "is_empty", label: "is empty" },
6
+ { value: "is_not_empty", label: "is not empty" }
7
+ ];
8
+ if (type === "numeric") {
9
+ return [
10
+ ...common,
11
+ { value: "equals", label: "equals" },
12
+ { value: "not_equals", label: "not equals" },
13
+ { value: "greater_than", label: "greater than" },
14
+ { value: "less_than", label: "less than" }
15
+ ];
16
+ }
17
+ if (type === "boolean") {
18
+ return [
19
+ { value: "is_true", label: "is true" },
20
+ { value: "is_false", label: "is false" }
21
+ ];
22
+ }
23
+ if (type === "date") {
24
+ return [
25
+ // Now-relative presets first — the most-used for "due today / this week".
26
+ { value: "is_today", label: "today" },
27
+ { value: "is_tomorrow", label: "tomorrow" },
28
+ { value: "is_this_week", label: "this week" },
29
+ { value: "is_next_week", label: "next week" },
30
+ { value: "is_overdue", label: "overdue" },
31
+ { value: "is_between", label: "is between" },
32
+ { value: "is_before", label: "is before" },
33
+ { value: "is_after", label: "is after" },
34
+ { value: "is_on_or_before", label: "is on or before" },
35
+ { value: "is_on_or_after", label: "is on or after" },
36
+ { value: "is_in_next", label: "next" },
37
+ { value: "is_in_last", label: "last" },
38
+ { value: "equals", label: "equals" },
39
+ { value: "is_empty", label: "is empty" },
40
+ { value: "is_not_empty", label: "is not empty" }
41
+ ];
42
+ }
43
+ return [
44
+ ...common,
45
+ { value: "contains", label: "contains" }
46
+ ];
47
+ };
48
+ const PRESET_DATE_OPERATORS = [
49
+ "is_overdue",
50
+ "is_today",
51
+ "is_tomorrow",
52
+ "is_this_week",
53
+ "is_next_week"
54
+ ];
55
+ const needsValueInput = (operator) => {
56
+ return !["is_empty", "is_not_empty", "is_true", "is_false", ...PRESET_DATE_OPERATORS].includes(operator);
57
+ };
58
+ const needsMultipleValues = (operator) => {
59
+ return ["is_any_of", "is_not_any_of"].includes(operator);
60
+ };
61
+ const needsRangeValues = (operator) => {
62
+ return operator === "is_between";
63
+ };
64
+ const DATE_OPERATORS = [
65
+ "is_before",
66
+ "is_after",
67
+ "is_on_or_before",
68
+ "is_on_or_after",
69
+ "is_between",
70
+ "equals"
71
+ ];
72
+ const isDateOperator = (operator) => DATE_OPERATORS.includes(operator);
73
+ const RELATIVE_DATE_UNITS = ["days", "weeks", "months"];
74
+ const RELATIVE_DATE_OPERATORS = ["is_in_next", "is_in_last"];
75
+ const needsRelativeInput = (operator) => RELATIVE_DATE_OPERATORS.includes(operator);
76
+ const applyFilters = (data, filters, columns) => {
77
+ if (filters.length === 0) return data;
78
+ return data.filter((row) => {
79
+ return filters.every((filter) => {
80
+ const value = row[filter.field];
81
+ const stringValue = String(value ?? "").toLowerCase();
82
+ switch (filter.operator) {
83
+ case "is_any_of":
84
+ return filter.values.some((v) => String(value) === v);
85
+ case "is_not_any_of":
86
+ return !filter.values.some((v) => String(value) === v);
87
+ case "contains":
88
+ return filter.values.some((v) => stringValue.includes(v.toLowerCase()));
89
+ case "is_empty":
90
+ return !value || stringValue === "";
91
+ case "is_not_empty":
92
+ return !!value && stringValue !== "";
93
+ case "equals":
94
+ return Number(value) === Number(filter.values[0]);
95
+ case "not_equals":
96
+ return Number(value) !== Number(filter.values[0]);
97
+ case "greater_than":
98
+ return Number(value) > Number(filter.values[0]);
99
+ case "less_than":
100
+ return Number(value) < Number(filter.values[0]);
101
+ case "is_true":
102
+ return value === true || value === "true";
103
+ case "is_false":
104
+ return value === false || value === "false";
105
+ default:
106
+ return true;
107
+ }
108
+ });
109
+ });
110
+ };
111
+ export {
112
+ DATE_OPERATORS,
113
+ PRESET_DATE_OPERATORS,
114
+ RELATIVE_DATE_OPERATORS,
115
+ RELATIVE_DATE_UNITS,
116
+ applyFilters,
117
+ getOperatorsForType,
118
+ isDateOperator,
119
+ needsMultipleValues,
120
+ needsRangeValues,
121
+ needsRelativeInput,
122
+ needsValueInput
123
+ };
124
+ //# sourceMappingURL=filters.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/backend/dynamic-table/types/filters.ts"],
4
+ "sourcesContent": ["// types/filters.ts\n\nexport type FilterOperator =\n | 'is_any_of'\n | 'is_not_any_of'\n | 'contains'\n | 'is_empty'\n | 'is_not_empty'\n | 'equals'\n | 'not_equals'\n | 'greater_than'\n | 'less_than'\n | 'is_true'\n | 'is_false'\n | 'is_before'\n | 'is_after'\n | 'is_on_or_before'\n | 'is_on_or_after'\n | 'is_between'\n | 'is_in_next'\n | 'is_in_last'\n | 'is_overdue'\n | 'is_today'\n | 'is_tomorrow'\n | 'is_this_week'\n | 'is_next_week';\n\nexport const getOperatorsForType = (type?: 'text' | 'numeric' | 'boolean'| \"date\" | \"dropdown\" | \"multiselect\"): { value: FilterOperator; label: string }[] => {\n const common = [\n { value: 'is_any_of' as FilterOperator, label: 'is any of' },\n { value: 'is_not_any_of' as FilterOperator, label: 'is not any of' },\n { value: 'is_empty' as FilterOperator, label: 'is empty' },\n { value: 'is_not_empty' as FilterOperator, label: 'is not empty' },\n ];\n\n if (type === 'numeric') {\n return [\n ...common,\n { value: 'equals' as FilterOperator, label: 'equals' },\n { value: 'not_equals' as FilterOperator, label: 'not equals' },\n { value: 'greater_than' as FilterOperator, label: 'greater than' },\n { value: 'less_than' as FilterOperator, label: 'less than' },\n ];\n }\n\n if (type === 'boolean') {\n return [\n { value: 'is_true' as FilterOperator, label: 'is true' },\n { value: 'is_false' as FilterOperator, label: 'is false' },\n ];\n }\n\n if (type === 'date') {\n return [\n // Now-relative presets first \u2014 the most-used for \"due today / this week\".\n { value: 'is_today' as FilterOperator, label: 'today' },\n { value: 'is_tomorrow' as FilterOperator, label: 'tomorrow' },\n { value: 'is_this_week' as FilterOperator, label: 'this week' },\n { value: 'is_next_week' as FilterOperator, label: 'next week' },\n { value: 'is_overdue' as FilterOperator, label: 'overdue' },\n { value: 'is_between' as FilterOperator, label: 'is between' },\n { value: 'is_before' as FilterOperator, label: 'is before' },\n { value: 'is_after' as FilterOperator, label: 'is after' },\n { value: 'is_on_or_before' as FilterOperator, label: 'is on or before' },\n { value: 'is_on_or_after' as FilterOperator, label: 'is on or after' },\n { value: 'is_in_next' as FilterOperator, label: 'next' },\n { value: 'is_in_last' as FilterOperator, label: 'last' },\n { value: 'equals' as FilterOperator, label: 'equals' },\n { value: 'is_empty' as FilterOperator, label: 'is empty' },\n { value: 'is_not_empty' as FilterOperator, label: 'is not empty' },\n ];\n }\n\n return [\n ...common,\n { value: 'contains' as FilterOperator, label: 'contains' },\n ];\n};\n\n// Now-relative preset operators \u2014 value-less; resolved to a today-anchored\n// window server-side (see filterParser). Like is_empty, they render no value\n// editor.\nexport const PRESET_DATE_OPERATORS: FilterOperator[] = [\n 'is_overdue', 'is_today', 'is_tomorrow', 'is_this_week', 'is_next_week',\n];\n\nexport const needsValueInput = (operator: FilterOperator): boolean => {\n return !['is_empty', 'is_not_empty', 'is_true', 'is_false', ...PRESET_DATE_OPERATORS].includes(operator);\n};\n\nexport const needsMultipleValues = (operator: FilterOperator): boolean => {\n return ['is_any_of', 'is_not_any_of'].includes(operator);\n};\n\n// `is_between` takes two scalar values (from + to), shown as two date inputs.\n// Distinct from `needsMultipleValues` which is a multi-pill \"any of\" set.\nexport const needsRangeValues = (operator: FilterOperator): boolean => {\n return operator === 'is_between';\n};\n\n// Date-operator predicate \u2014 used by ConfigureViewFilters to render\n// <input type=\"date\"> instead of a plain text box.\n// NB: the relative operators (`is_in_next`/`is_in_last`) are deliberately\n// excluded \u2014 they take a count + unit, not a calendar date, so they render the\n// relative editor (see `needsRelativeInput`) rather than the FilterDatePicker.\nexport const DATE_OPERATORS: FilterOperator[] = [\n 'is_before', 'is_after', 'is_on_or_before', 'is_on_or_after', 'is_between', 'equals',\n];\nexport const isDateOperator = (operator: FilterOperator): boolean => DATE_OPERATORS.includes(operator);\n\n// Relative (\"moving\") date operators \u2014 value is a [count, unit] pair, resolved\n// to a today-anchored window server-side. Rendered as a number input + unit\n// select (dni / tygodnie / miesi\u0105ce) in ConfigureViewFilters.\nexport type RelativeDateUnit = 'days' | 'weeks' | 'months';\nexport const RELATIVE_DATE_UNITS: RelativeDateUnit[] = ['days', 'weeks', 'months'];\nexport const RELATIVE_DATE_OPERATORS: FilterOperator[] = ['is_in_next', 'is_in_last'];\nexport const needsRelativeInput = (operator: FilterOperator): boolean =>\n RELATIVE_DATE_OPERATORS.includes(operator);\n\nexport const applyFilters = (data: any[], filters: { field: string; operator: FilterOperator; values: string[] }[], columns: any[]): any[] => {\n if (filters.length === 0) return data;\n\n return data.filter(row => {\n return filters.every(filter => {\n const value = row[filter.field];\n const stringValue = String(value ?? '').toLowerCase();\n\n switch (filter.operator) {\n case 'is_any_of':\n return filter.values.some(v => String(value) === v);\n case 'is_not_any_of':\n return !filter.values.some(v => String(value) === v);\n case 'contains':\n return filter.values.some(v => stringValue.includes(v.toLowerCase()));\n case 'is_empty':\n return !value || stringValue === '';\n case 'is_not_empty':\n return !!value && stringValue !== '';\n case 'equals':\n return Number(value) === Number(filter.values[0]);\n case 'not_equals':\n return Number(value) !== Number(filter.values[0]);\n case 'greater_than':\n return Number(value) > Number(filter.values[0]);\n case 'less_than':\n return Number(value) < Number(filter.values[0]);\n case 'is_true':\n return value === true || value === 'true';\n case 'is_false':\n return value === false || value === 'false';\n default:\n return true;\n }\n });\n });\n};\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,34 @@
1
+ const AGGREGATION_FNS = [
2
+ "sum",
3
+ "avg",
4
+ "min",
5
+ "max",
6
+ "count",
7
+ "countDistinct"
8
+ ];
9
+ function isAggregationFn(value) {
10
+ return typeof value === "string" && AGGREGATION_FNS.includes(value);
11
+ }
12
+ function aggregationFnsForColumnType(type) {
13
+ if (type === "numeric") return ["sum", "avg", "min", "max", "count", "countDistinct"];
14
+ if (type === "date") return ["min", "max", "count", "countDistinct"];
15
+ return ["count", "countDistinct"];
16
+ }
17
+ function defaultAggregationFnForColumnType(type) {
18
+ return aggregationFnsForColumnType(type)[0] ?? "count";
19
+ }
20
+ function generateGroupRuleId() {
21
+ return `group-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
22
+ }
23
+ function generateAggregationRuleId(field) {
24
+ return `agg-${field}`;
25
+ }
26
+ export {
27
+ AGGREGATION_FNS,
28
+ aggregationFnsForColumnType,
29
+ defaultAggregationFnForColumnType,
30
+ generateAggregationRuleId,
31
+ generateGroupRuleId,
32
+ isAggregationFn
33
+ };
34
+ //# sourceMappingURL=grouping.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/backend/dynamic-table/types/grouping.ts"],
4
+ "sourcesContent": ["// types/grouping.ts\n\nimport type { ColumnDataType } from './perspective';\n\nexport interface GroupRule {\n id: string;\n field: string;\n direction: 'asc' | 'desc';\n}\n\n/**\n * Aggregation function applied to a column within each group (and, once the\n * footer is wired, over the filtered dataset).\n *\n * Semantics deliberately mirror SQL / Excel so the client-side fold and the\n * server-side `GROUP BY`-less aggregate agree on the same numbers:\n *\n * - `sum` \u2014 `SUM(col)`; non-numeric cells are ignored, empty set \u2192 0\n * - `avg` \u2014 `AVG(col)`; non-numeric ignored, empty set \u2192 null\n * - `min` / `max` \u2014 `MIN(col)` / `MAX(col)`; empty set \u2192 null. Date columns\n * compare chronologically and yield epoch milliseconds.\n * - `count` \u2014 `COUNT(col)`: non-empty cells (NOT the row count)\n * - `countDistinct` \u2014 `COUNT(DISTINCT col)`\n */\nexport type AggregationFn = 'sum' | 'avg' | 'min' | 'max' | 'count' | 'countDistinct';\n\n/**\n * THE single source of truth for the supported functions.\n *\n * There used to be three independent `['sum']` literals \u2014 this type, the\n * `perspectiveTransforms` whitelist (which SILENTLY DROPPED any rule it did not\n * recognise, so a saved view could lose its rules on reload) and the Configure\n * View picker. They must widen in lockstep, so they now all read this constant.\n */\nexport const AGGREGATION_FNS: readonly AggregationFn[] = [\n 'sum',\n 'avg',\n 'min',\n 'max',\n 'count',\n 'countDistinct',\n] as const;\n\nexport function isAggregationFn(value: unknown): value is AggregationFn {\n return typeof value === 'string' && (AGGREGATION_FNS as readonly string[]).includes(value);\n}\n\n/**\n * Which functions make sense for a column of this type.\n *\n * `count` / `countDistinct` are valid on *every* column (Excel's COUNTA works\n * on text); `sum` / `avg` need numbers; `min` / `max` additionally work on\n * dates, which is how \"earliest / latest\" is expressed.\n */\nexport function aggregationFnsForColumnType(type?: ColumnDataType): AggregationFn[] {\n if (type === 'numeric') return ['sum', 'avg', 'min', 'max', 'count', 'countDistinct'];\n if (type === 'date') return ['min', 'max', 'count', 'countDistinct'];\n return ['count', 'countDistinct'];\n}\n\n/** The first function that is valid for a column type \u2014 used when a rule's column changes. */\nexport function defaultAggregationFnForColumnType(type?: ColumnDataType): AggregationFn {\n return aggregationFnsForColumnType(type)[0] ?? 'count';\n}\n\nexport interface AggregationRule {\n /** Stable id \u2014 one rule per column, so `agg-<field>`. */\n id: string;\n /** Column `data` key. */\n field: string;\n fn: AggregationFn;\n /**\n * OPTIONAL partition column (`data` key). When set, the aggregate is not one\n * number but ONE NUMBER PER DISTINCT VALUE of this column, and the UI renders\n * the breakdown instead of a single figure.\n *\n * This exists because a scalar `sum` over a column whose rows are not\n * commensurable is not merely imprecise \u2014 it is FALSE, and it looks fine.\n * `SUM(grossAmount)` over 6 150 PLN + 1 000 EUR + 8 600 USD rendered\n * `15 750,00`, unlabelled, as the only summary figure on the screen an\n * accountant closes the month from (HEDGE-147).\n *\n * The honest fix is a per-dimension breakdown rather than a conversion to a\n * base currency: a breakdown needs no exchange rate, so unlike a converted\n * total it CANNOT be wrong. (A converted total would additionally have to\n * show rate + date + source to be readable at all \u2014 HEDGE-39/43/81 \u2014 and\n * would have to source a rate that most rows simply do not carry.)\n *\n * Omitted on every pre-existing rule, so behaviour is unchanged wherever it\n * is not set.\n */\n dimension?: string;\n}\n\n/**\n * One slice of a dimensioned aggregate: the partition value and its figure.\n *\n * `key` is the raw cell value of the dimension column, stringified (`'PLN'`),\n * or `''` when the row had none \u2014 the renderer decides how to label that.\n */\nexport interface AggregateBreakdownEntry {\n key: string;\n value: number | null;\n}\n\n/**\n * What set of rows an aggregate actually describes.\n *\n * This is not decoration. Client-side grouping folds over ONE server page\n * (`pageSize <= 100`), so a subtotal presented as \"the group total\" is wrong\n * whenever the dataset spans more than one page. Every aggregate therefore\n * carries its scope and the UI is required to render it.\n */\nexport type AggregateScope = 'dataset' | 'page';\n\n/**\n * Transport shape for a server-computed aggregate (`?aggregate=` response).\n * Not persisted.\n */\nexport interface AggregateResult {\n /** MANDATORY. An unlabelled number is the defect this exists to prevent. */\n scope: AggregateScope;\n /** Row count in scope. */\n total: number;\n /** `${field}:${fn}` -> value. `null` means \"no value in scope\" (e.g. MIN of nothing). */\n values: Record<string, number | null>;\n /**\n * `${field}:${fn}` -> per-dimension slices, present only for rules that\n * carry a `dimension`. Optional, so a route that has not adopted it (and\n * every already-published response) stays valid.\n */\n breakdowns?: Record<string, AggregateBreakdownEntry[]>;\n}\n\nexport interface GroupHeaderVisualRow {\n type: 'groupHeader';\n groupKey: string;\n field: string;\n value: string;\n count: number;\n depth: number;\n collapsed: boolean;\n /** Data indices of every row in this group (incl. nested descendants),\n * regardless of collapse state \u2014 drives the group select-all checkbox. */\n memberDataIndices: number[];\n}\n\nexport interface DataVisualRow {\n type: 'dataRow';\n dataIndex: number;\n}\n\n/** Subtotal row rendered after a group's rows (one per group level). */\nexport interface GroupSummaryVisualRow {\n type: 'groupSummary';\n /** Ties the summary to its group header. */\n groupKey: string;\n /** Nesting depth \u2014 parity with the group header for left-indent. */\n depth: number;\n /** field -> aggregated value. Only aggregated fields are present.\n * `null` = the function had nothing to work with (e.g. MIN over no numbers). */\n values: Record<string, number | null>;\n /** field -> the function that produced `values[field]`, so the renderer can\n * format a count as an integer and a date MIN as a date. */\n fns: Record<string, AggregationFn>;\n /** field -> per-dimension slices, for the fields whose rule set a\n * `dimension`. When present the renderer shows these INSTEAD of\n * `values[field]`, because for those fields the scalar is not meaningful. */\n breakdowns?: Record<string, AggregateBreakdownEntry[]>;\n /**\n * What these numbers actually cover. `'page'` whenever the loaded rows are\n * only part of the filtered dataset (or when coverage is unknown) \u2014 the UI\n * MUST say so rather than presenting a page fold as a group total.\n */\n scope: AggregateScope;\n /** How many rows on the loaded page fed this subtotal. */\n rowsCovered: number;\n}\n\nexport type VisualRow = GroupHeaderVisualRow | DataVisualRow | GroupSummaryVisualRow;\n\nexport function generateGroupRuleId(): string {\n return `group-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n}\n\n/** One aggregation rule per column, so a field-derived id keeps it unique. */\nexport function generateAggregationRuleId(field: string): string {\n return `agg-${field}`;\n}\n"],
5
+ "mappings": "AAkCO,MAAM,kBAA4C;AAAA,EACvD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,gBAAgB,OAAwC;AACtE,SAAO,OAAO,UAAU,YAAa,gBAAsC,SAAS,KAAK;AAC3F;AASO,SAAS,4BAA4B,MAAwC;AAClF,MAAI,SAAS,UAAW,QAAO,CAAC,OAAO,OAAO,OAAO,OAAO,SAAS,eAAe;AACpF,MAAI,SAAS,OAAQ,QAAO,CAAC,OAAO,OAAO,SAAS,eAAe;AACnE,SAAO,CAAC,SAAS,eAAe;AAClC;AAGO,SAAS,kCAAkC,MAAsC;AACtF,SAAO,4BAA4B,IAAI,EAAE,CAAC,KAAK;AACjD;AAsHO,SAAS,sBAA8B;AAC5C,SAAO,SAAS,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC;AACvE;AAGO,SAAS,0BAA0B,OAAuB;AAC/D,SAAO,OAAO,KAAK;AACrB;",
6
+ "names": []
7
+ }
@@ -0,0 +1,7 @@
1
+ const IMPORT_MAX_ROWS = 1e3;
2
+ const IMPORT_MAX_FILE_BYTES = 10 * 1024 * 1024;
3
+ export {
4
+ IMPORT_MAX_FILE_BYTES,
5
+ IMPORT_MAX_ROWS
6
+ };
7
+ //# sourceMappingURL=import.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/backend/dynamic-table/types/import.ts"],
4
+ "sourcesContent": ["/**\n * Wire types for the reversible file-import pipeline (Spec 3, Phases 1-3).\n *\n * This module is deliberately **dependency-free** \u2014 no `xlsx`, no React, no\n * server APIs \u2014 so both the browser panel (`components/ImportPanel.tsx`) and\n * the server parser (`utils/importParse.ts`) can share one vocabulary without\n * the client ever pulling the spreadsheet reader into its bundle.\n *\n * The parse itself is SERVER-SIDE ONLY. A client+server double parse is\n * exactly how a preview and its commit drift apart, so the browser never sees\n * a workbook \u2014 it uploads bytes and renders whatever the server made of them.\n */\n\n/** Hard caps enforced BEFORE parsing (see spec A6 / \"Memory blow-up\" risk). */\nexport const IMPORT_MAX_ROWS = 1000;\nexport const IMPORT_MAX_FILE_BYTES = 10 * 1024 * 1024;\n\n/** v1 import modes. `upsert_key` is per-module opt-in and not offered here. */\nexport type ImportMode = 'create' | 'upsert_id';\n\n/** What a preview decided to do with one source row. */\nexport type ImportRowAction = 'created' | 'updated' | 'skipped' | 'failed';\n\n/**\n * One importable target field, declared by the adopting module.\n *\n * `labels` carries EVERY header spelling that should auto-map onto this field:\n * the export's own column title (per locale), the field key, and any legacy\n * spelling. Round-tripping an export must need zero manual mapping, and the\n * export header is locale-dependent, so a single label is not enough.\n */\nexport interface ImportFieldDef {\n /** Target field key on the module's create/update input. */\n field: string;\n /** Primary human label, shown in the mapping UI. */\n label: string;\n /** Additional accepted header spellings (locales, snake_case, aliases). */\n labels?: string[];\n type?: 'text' | 'numeric' | 'date' | 'boolean';\n /** Required for a `create`; a blank value fails the row. */\n required?: boolean;\n /**\n * True when the field points at another record. Relation fields are REFUSED\n * on the generic path rather than silently mis-resolved (spec A1): a header\n * mapping onto one produces `relation_unsupported`, never a lookup guess.\n */\n relation?: boolean;\n /** Marks the field used to match an existing record in `upsert_id` mode. */\n matchKey?: boolean;\n}\n\n/** File header \u2192 target field key. Headers absent from the map are ignored. */\nexport type ImportMapping = Record<string, string>;\n\nexport type ImportMappingIssueCode =\n | 'relation_unsupported'\n | 'unknown_field'\n | 'duplicate_field'\n | 'missing_required';\n\nexport interface ImportMappingIssue {\n code: ImportMappingIssueCode;\n /** The file header at fault, when the issue is header-shaped. */\n header?: string;\n /** The target field at fault, when the issue is field-shaped. */\n field?: string;\n /** Human label for whichever of the two the message should name. */\n label: string;\n}\n\n/** A per-cell validation failure on a previewed row. */\nexport interface ImportCellError {\n field: string;\n message: string;\n}\n\n/** One row of the dry-run preview. Nothing here has been written. */\nexport interface ImportPreviewRow {\n /** 1-based data row in the uploaded file (header row excluded). */\n sourceRowNumber: number;\n action: ImportRowAction;\n /** Mapped + coerced values, keyed by target field. */\n values: Record<string, unknown>;\n /** Existing record this row would update (`upsert_id` only). */\n recordId: string | null;\n errors: ImportCellError[];\n}\n\nexport interface ImportSummary {\n created: number;\n updated: number;\n skipped: number;\n failed: number;\n}\n\n/** `POST \u2026/import/preview` response. */\nexport interface ImportPreviewResponse {\n importBatchId: string;\n mode: ImportMode;\n sourceFileName: string;\n /** The mapping actually applied \u2014 echoed so the panel can show + edit it. */\n mapping: ImportMapping;\n /** Headers found in the file, in file order. */\n headers: string[];\n /** Target fields the module accepts, for the mapping UI. */\n fields: ImportFieldDef[];\n mappingIssues: ImportMappingIssue[];\n rows: ImportPreviewRow[];\n summary: ImportSummary;\n}\n\n/** `POST \u2026/import/:id/commit` response. */\nexport interface ImportCommitResponse {\n importBatchId: string;\n created: number;\n updated: number;\n failed: number;\n rows: Array<{\n sourceRowNumber: number;\n action: ImportRowAction;\n recordId: string | null;\n errorMessage: string | null;\n }>;\n}\n\n/** `POST \u2026/import/:id/revert` response. */\nexport interface ImportRevertResponse {\n importBatchId: string;\n restored: number;\n deleted: number;\n refused: Array<{ sourceRowNumber: number; reason: string }>;\n}\n"],
5
+ "mappings": "AAcO,MAAM,kBAAkB;AACxB,MAAM,wBAAwB,KAAK,OAAO;",
6
+ "names": []
7
+ }
@@ -0,0 +1,46 @@
1
+ import {
2
+ CELL_BATCH_SAVE_EVENT,
3
+ CELL_BATCH_SAVE_RESULT_EVENT
4
+ } from "../handlers/cellWrites.js";
5
+ const TableEvents = {
6
+ CELL_EDIT_SAVE: "table:cell:edit:save",
7
+ CELL_SAVE_START: "table:cell:save:start",
8
+ CELL_SAVE_SUCCESS: "table:cell:save:success",
9
+ CELL_SAVE_ERROR: "table:cell:save:error",
10
+ /** One multi-cell write (paste / cut / clear / fill / replace / import). */
11
+ CELL_BATCH_SAVE: CELL_BATCH_SAVE_EVENT,
12
+ /** The applied/rejected tally for that same write. */
13
+ CELL_BATCH_SAVE_RESULT: CELL_BATCH_SAVE_RESULT_EVENT,
14
+ NEW_ROW_SAVE: "table:new:row:save",
15
+ NEW_ROW_SAVE_START: "table:new:row:save:start",
16
+ NEW_ROW_SAVE_SUCCESS: "table:new:row:save:success",
17
+ NEW_ROW_SAVE_ERROR: "table:new:row:save:error",
18
+ FILTER_CHANGE: "table:filter:change",
19
+ FILTER_SAVE: "table:filter:save",
20
+ FILTER_SELECT: "table:filter:select",
21
+ FILTER_RENAME: "table:filter:rename",
22
+ FILTER_DELETE: "table:filter:delete",
23
+ COLUMN_SORT: "table:column:sort",
24
+ SEARCH: "table:search",
25
+ COLUMN_CONTEXT_MENU_ACTION: "table:column:context:action",
26
+ ROW_CONTEXT_MENU_ACTION: "table:row:context:action",
27
+ CELL_CONTEXT_MENU_ACTION: "table:cell:context:action",
28
+ // Perspective events
29
+ PERSPECTIVE_SAVE: "table:perspective:save",
30
+ PERSPECTIVE_SELECT: "table:perspective:select",
31
+ PERSPECTIVE_RENAME: "table:perspective:rename",
32
+ PERSPECTIVE_DELETE: "table:perspective:delete",
33
+ PERSPECTIVE_CHANGE: "table:perspective:change",
34
+ PERSPECTIVE_DUPLICATE: "table:perspective:duplicate",
35
+ PERSPECTIVE_SET_DEFAULT: "table:perspective:setDefault",
36
+ PERSPECTIVE_PUBLISH: "table:perspective:publish",
37
+ PERSPECTIVE_TEMPLATE_COPY: "table:perspective:templateCopy"
38
+ };
39
+ export * from "./filters.js";
40
+ export * from "./perspective.js";
41
+ export * from "./grouping.js";
42
+ export * from "./rollup.js";
43
+ export {
44
+ TableEvents
45
+ };
46
+ //# sourceMappingURL=index.js.map