@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,293 @@
1
+ const DEFAULT_COLUMN_OVERSCAN = 3;
2
+ const EMPTY_COLUMN_RANGE = { startIndex: 0, endIndex: -1 };
3
+ function clampIndex(value, columnCount) {
4
+ if (columnCount <= 0) return 0;
5
+ if (value < 0) return 0;
6
+ if (value > columnCount - 1) return columnCount - 1;
7
+ return value;
8
+ }
9
+ function computeColumnGeometry(columnCount, getColumnWidth, options = {}) {
10
+ const leadingWidth = options.leadingWidth ?? 0;
11
+ const trailingWidth = options.trailingWidth ?? 0;
12
+ const count = Math.max(0, columnCount);
13
+ const starts = new Array(count + 1);
14
+ let x = leadingWidth;
15
+ starts[0] = x;
16
+ for (let i = 0; i < count; i++) {
17
+ const width = getColumnWidth(i);
18
+ x += Number.isFinite(width) && width > 0 ? width : 0;
19
+ starts[i + 1] = x;
20
+ }
21
+ return {
22
+ columnCount: count,
23
+ starts,
24
+ leadingWidth,
25
+ trailingWidth,
26
+ totalWidth: x + trailingWidth
27
+ };
28
+ }
29
+ function getGeometryColumnWidth(geometry, index) {
30
+ if (index < 0 || index >= geometry.columnCount) return 0;
31
+ return geometry.starts[index + 1] - geometry.starts[index];
32
+ }
33
+ function getRangeWidth(geometry, from, to) {
34
+ if (geometry.columnCount === 0 || to < from) return 0;
35
+ const lo = clampIndex(from, geometry.columnCount);
36
+ const hi = clampIndex(to, geometry.columnCount);
37
+ if (hi < lo) return 0;
38
+ return geometry.starts[hi + 1] - geometry.starts[lo];
39
+ }
40
+ function findColumnIndexAtOffset(geometry, x) {
41
+ const { columnCount, starts } = geometry;
42
+ if (columnCount === 0) return -1;
43
+ if (x <= starts[0]) return 0;
44
+ if (x >= starts[columnCount]) return columnCount - 1;
45
+ let lo = 0;
46
+ let hi = columnCount - 1;
47
+ while (lo < hi) {
48
+ const mid = lo + hi + 1 >> 1;
49
+ if (starts[mid] <= x) lo = mid;
50
+ else hi = mid - 1;
51
+ }
52
+ return lo;
53
+ }
54
+ function computeVisibleRange(geometry, scrollLeft, viewportWidth) {
55
+ const { columnCount, starts } = geometry;
56
+ if (columnCount === 0) return EMPTY_COLUMN_RANGE;
57
+ if (!(viewportWidth > 0)) return { startIndex: 0, endIndex: columnCount - 1 };
58
+ const left = Math.max(scrollLeft, starts[0]);
59
+ const right = scrollLeft + viewportWidth;
60
+ const startIndex = findColumnIndexAtOffset(geometry, left);
61
+ let endIndex = startIndex;
62
+ while (endIndex + 1 < columnCount && starts[endIndex + 1] < right) endIndex++;
63
+ return { startIndex, endIndex };
64
+ }
65
+ function expandColumnRange(range, overscan, columnCount) {
66
+ if (columnCount <= 0 || range.endIndex < range.startIndex) return EMPTY_COLUMN_RANGE;
67
+ const pad = Math.max(0, Math.floor(overscan));
68
+ return {
69
+ startIndex: Math.max(0, range.startIndex - pad),
70
+ endIndex: Math.min(columnCount - 1, range.endIndex + pad)
71
+ };
72
+ }
73
+ function getPinnedColumnIndices(columns, frozenColumns) {
74
+ const left = [];
75
+ const right = [];
76
+ for (let i = 0; i < columns.length; i++) {
77
+ const col = columns[i];
78
+ if (col.sticky === "right") {
79
+ right.push(i);
80
+ } else if (col.sticky === "left" || frozenColumns?.has(col.data)) {
81
+ left.push(i);
82
+ }
83
+ }
84
+ return { left, right };
85
+ }
86
+ function mergePinnedColumns(range, options) {
87
+ const { columnCount } = options;
88
+ if (columnCount <= 0) return [];
89
+ const mounted = /* @__PURE__ */ new Set();
90
+ if (range.endIndex >= range.startIndex) {
91
+ const from = Math.max(0, range.startIndex);
92
+ const to = Math.min(columnCount - 1, range.endIndex);
93
+ for (let i = from; i <= to; i++) mounted.add(i);
94
+ }
95
+ const add = (list) => {
96
+ if (!list) return;
97
+ for (const index of list) {
98
+ if (Number.isInteger(index) && index >= 0 && index < columnCount) mounted.add(index);
99
+ }
100
+ };
101
+ add(options.pinnedLeftIndices);
102
+ add(options.pinnedRightIndices);
103
+ add(options.forcedIndices);
104
+ return Array.from(mounted).sort((a, b) => a - b);
105
+ }
106
+ function buildColumnRenderPlan(mountedIndices, geometry, getColumnKey) {
107
+ const segments = [];
108
+ const virtualColumns = [];
109
+ let cursor = 0;
110
+ for (const index of mountedIndices) {
111
+ if (index > cursor) {
112
+ segments.push({
113
+ type: "spacer",
114
+ width: getRangeWidth(geometry, cursor, index - 1),
115
+ fromIndex: cursor,
116
+ toIndex: index - 1
117
+ });
118
+ }
119
+ const column = {
120
+ index,
121
+ start: geometry.starts[index],
122
+ end: geometry.starts[index + 1],
123
+ size: geometry.starts[index + 1] - geometry.starts[index],
124
+ key: getColumnKey ? getColumnKey(index) : index
125
+ };
126
+ virtualColumns.push(column);
127
+ segments.push({ type: "column", column });
128
+ cursor = index + 1;
129
+ }
130
+ if (cursor < geometry.columnCount) {
131
+ segments.push({
132
+ type: "spacer",
133
+ width: getRangeWidth(geometry, cursor, geometry.columnCount - 1),
134
+ fromIndex: cursor,
135
+ toIndex: geometry.columnCount - 1
136
+ });
137
+ }
138
+ return { segments, virtualColumns };
139
+ }
140
+ function summedWidth(geometry, indices) {
141
+ if (!indices || indices.length === 0) return 0;
142
+ let total = 0;
143
+ for (const index of indices) total += getGeometryColumnWidth(geometry, index);
144
+ return total;
145
+ }
146
+ function finalizeWindow(geometry, mountedIndices, virtualized, pinnedLeftIndices, pinnedRightIndices, getColumnKey) {
147
+ const { segments, virtualColumns } = buildColumnRenderPlan(
148
+ mountedIndices,
149
+ geometry,
150
+ getColumnKey
151
+ );
152
+ const mountedSet = new Set(mountedIndices);
153
+ const first = mountedIndices[0];
154
+ const last = mountedIndices[mountedIndices.length - 1];
155
+ return {
156
+ virtualized,
157
+ startIndex: mountedIndices.length ? first : 0,
158
+ endIndex: mountedIndices.length ? last : -1,
159
+ columnCount: geometry.columnCount,
160
+ mountedIndices,
161
+ virtualColumns,
162
+ segments,
163
+ paddingLeft: mountedIndices.length ? getRangeWidth(geometry, 0, first - 1) : 0,
164
+ paddingRight: mountedIndices.length ? getRangeWidth(geometry, last + 1, geometry.columnCount - 1) : getRangeWidth(geometry, 0, geometry.columnCount - 1),
165
+ totalWidth: geometry.totalWidth,
166
+ leadingWidth: geometry.leadingWidth,
167
+ trailingWidth: geometry.trailingWidth,
168
+ pinnedLeftWidth: geometry.leadingWidth + summedWidth(geometry, pinnedLeftIndices),
169
+ pinnedRightWidth: geometry.trailingWidth + summedWidth(geometry, pinnedRightIndices),
170
+ isColumnMounted: (index) => mountedSet.has(index)
171
+ };
172
+ }
173
+ function createFullColumnWindow(geometry, options = {}) {
174
+ const mounted = new Array(geometry.columnCount);
175
+ for (let i = 0; i < geometry.columnCount; i++) mounted[i] = i;
176
+ return finalizeWindow(
177
+ geometry,
178
+ mounted,
179
+ false,
180
+ options.pinnedLeftIndices,
181
+ options.pinnedRightIndices,
182
+ options.getColumnKey
183
+ );
184
+ }
185
+ function buildColumnWindow(input) {
186
+ const {
187
+ geometry,
188
+ pinnedLeftIndices,
189
+ pinnedRightIndices,
190
+ forcedIndices,
191
+ getColumnKey
192
+ } = input;
193
+ if (geometry.columnCount === 0) {
194
+ return finalizeWindow(geometry, [], true, pinnedLeftIndices, pinnedRightIndices, getColumnKey);
195
+ }
196
+ const baseRange = input.range ?? computeVisibleRange(geometry, input.scrollLeft ?? 0, input.viewportWidth ?? 0);
197
+ const overscanned = expandColumnRange(
198
+ baseRange,
199
+ input.overscan ?? DEFAULT_COLUMN_OVERSCAN,
200
+ geometry.columnCount
201
+ );
202
+ const mountedIndices = mergePinnedColumns(overscanned, {
203
+ columnCount: geometry.columnCount,
204
+ pinnedLeftIndices,
205
+ pinnedRightIndices,
206
+ forcedIndices
207
+ });
208
+ return finalizeWindow(
209
+ geometry,
210
+ mountedIndices,
211
+ true,
212
+ pinnedLeftIndices,
213
+ pinnedRightIndices,
214
+ getColumnKey
215
+ );
216
+ }
217
+ function columnIndexToVisualIndex(window, columnIndex) {
218
+ const list = window.mountedIndices;
219
+ let lo = 0;
220
+ let hi = list.length - 1;
221
+ while (lo <= hi) {
222
+ const mid = lo + hi >> 1;
223
+ if (list[mid] === columnIndex) return mid;
224
+ if (list[mid] < columnIndex) lo = mid + 1;
225
+ else hi = mid - 1;
226
+ }
227
+ return -1;
228
+ }
229
+ function visualIndexToColumnIndex(window, visualIndex) {
230
+ if (visualIndex < 0 || visualIndex >= window.mountedIndices.length) return -1;
231
+ return window.mountedIndices[visualIndex];
232
+ }
233
+ function isColumnMounted(window, columnIndex) {
234
+ return window.isColumnMounted(columnIndex);
235
+ }
236
+ function getAriaColCount(columnCount, options = {}) {
237
+ return columnCount + (options.hasRowHeader ? 1 : 0) + (options.hasActionsColumn ? 1 : 0);
238
+ }
239
+ function getAriaColIndex(columnIndex, options = {}) {
240
+ return columnIndex + 1 + (options.hasRowHeader ? 1 : 0);
241
+ }
242
+ function computeScrollLeftToReveal(geometry, columnIndex, options) {
243
+ const { columnCount } = geometry;
244
+ if (columnIndex < 0 || columnIndex >= columnCount) return null;
245
+ if (options.pinnedIndices?.includes(columnIndex)) return null;
246
+ const viewportWidth = options.viewportWidth;
247
+ if (!(viewportWidth > 0)) return null;
248
+ const gutterLeft = options.pinnedLeftWidth ?? geometry.leadingWidth;
249
+ const gutterRight = options.pinnedRightWidth ?? geometry.trailingWidth;
250
+ const align = options.align ?? "auto";
251
+ const columnStart = geometry.starts[columnIndex];
252
+ const columnEnd = geometry.starts[columnIndex + 1];
253
+ const maxScroll = Math.max(0, geometry.totalWidth - viewportWidth);
254
+ const clamp = (value) => Math.min(Math.max(value, 0), maxScroll);
255
+ const alignStart = () => clamp(columnStart - gutterLeft);
256
+ const alignEnd = () => clamp(columnEnd + gutterRight - viewportWidth);
257
+ if (align === "start") return alignStart();
258
+ if (align === "end") return alignEnd();
259
+ if (align === "center") {
260
+ const usable = viewportWidth - gutterLeft - gutterRight;
261
+ return clamp(columnStart - gutterLeft - Math.max(0, (usable - (columnEnd - columnStart)) / 2));
262
+ }
263
+ const visibleStart = options.scrollLeft + gutterLeft;
264
+ const visibleEnd = options.scrollLeft + viewportWidth - gutterRight;
265
+ if (columnStart < visibleStart) return alignStart();
266
+ if (columnEnd > visibleEnd) {
267
+ if (columnEnd - columnStart > visibleEnd - visibleStart) return alignStart();
268
+ return alignEnd();
269
+ }
270
+ return null;
271
+ }
272
+ export {
273
+ DEFAULT_COLUMN_OVERSCAN,
274
+ EMPTY_COLUMN_RANGE,
275
+ buildColumnRenderPlan,
276
+ buildColumnWindow,
277
+ columnIndexToVisualIndex,
278
+ computeColumnGeometry,
279
+ computeScrollLeftToReveal,
280
+ computeVisibleRange,
281
+ createFullColumnWindow,
282
+ expandColumnRange,
283
+ findColumnIndexAtOffset,
284
+ getAriaColCount,
285
+ getAriaColIndex,
286
+ getGeometryColumnWidth,
287
+ getPinnedColumnIndices,
288
+ getRangeWidth,
289
+ isColumnMounted,
290
+ mergePinnedColumns,
291
+ visualIndexToColumnIndex
292
+ };
293
+ //# sourceMappingURL=columnWindow.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/backend/dynamic-table/utils/columnWindow.ts"],
4
+ "sourcesContent": ["/**\n * COLUMN VIRTUALIZATION \u2014 PURE ARITHMETIC\n * =======================================\n *\n * No React, no DOM, no store. Everything that decides *which columns are\n * mounted and where the gaps go* lives here so it can be unit-tested without a\n * browser. `hooks/useColumnVirtualizer.ts` is a thin wrapper that feeds this\n * module a scroll range from `@tanstack/react-virtual` and hands the result to\n * the render tree.\n *\n * WHY THIS EXISTS\n * ---------------\n * The grid virtualizes rows only. Render cost is\n * `(visible rows + overscan) \u00D7 ALL columns`, so a 60-column table pays for 60\n * columns per mounted row no matter how few are on screen. Information density\n * is a product requirement \u2014 the fix is to make cells CHEAPER, never FEWER \u2014\n * so we stop rendering the columns nobody can see instead of showing less.\n *\n * THE CONTRACT THIS MODULE UPHOLDS (from the range-operation audit)\n * ----------------------------------------------------------------\n * A column may be unmounted while still selected, still exported, still written\n * to, still navigated onto. Consequently:\n *\n * 1. Everything here speaks in COLUMN ARRAY INDICES into the full, view-ordered\n * `cols` array. A window never renumbers columns. `data-col` stays absolute.\n * 2. Geometry comes from the model (`store.getColumnWidth(i)`, which answers\n * for every `i`, mounted or not) \u2014 never from `clientWidth` / `scrollWidth`\n * / `getBoundingClientRect` at scroll time.\n * 3. Pinned (sticky-left / sticky-right / menu-frozen) columns are mounted\n * unconditionally: `position: sticky` only works on an element that exists.\n * 4. The selection anchor, the selection focus and the editing cell are\n * force-mountable via `forcedIndices` \u2014 `setEditingCell` on an unmounted\n * column would mount no editor at all.\n * 5. Spacers replace the columns we skipped, so every mounted column keeps its\n * exact natural x position. A pinned column that is force-mounted is NOT\n * also counted inside a spacer, so the pinned block can never double-count\n * against the scroll offset.\n *\n * COORDINATE SPACE\n * ----------------\n * All offsets are in the scroller's content space: x = 0 is the left edge of\n * the `<table>`, `leadingWidth` is the row-header gutter, column 0 therefore\n * starts at `leadingWidth`, and `trailingWidth` is the sticky Actions column.\n * This is the same space as the scroll container's `scrollLeft`.\n */\n\n/** A half-open range of column array indices; `endIndex` is INCLUSIVE. */\nexport interface ColumnRange {\n startIndex: number;\n /** Inclusive. `-1` (with `startIndex: 0`) means \"no columns\". */\n endIndex: number;\n}\n\n/**\n * Prefix-sum geometry over the FULL column array. `starts` has\n * `columnCount + 1` entries: `starts[i]` is column `i`'s left edge and\n * `starts[columnCount]` is the right edge of the last column.\n */\nexport interface ColumnGeometry {\n columnCount: number;\n starts: number[];\n /** Row-header gutter (or 0). `starts[0] === leadingWidth`. */\n leadingWidth: number;\n /** Sticky Actions column (or 0). Included in `totalWidth`. */\n trailingWidth: number;\n /** leadingWidth + \u03A3 column widths + trailingWidth. */\n totalWidth: number;\n}\n\n/** One mounted column, shaped like a `VirtualItem` so it reads familiarly. */\nexport interface VirtualColumn {\n /** Index into the FULL column array. Never a window-relative index. */\n index: number;\n /** Absolute left edge in scroller content space. */\n start: number;\n /** Absolute right edge. */\n end: number;\n /** Column width. */\n size: number;\n /** Stable key (`col.data` when the caller supplies `getColumnKey`). */\n key: string | number;\n}\n\n/**\n * The render plan. A row renders these left-to-right and gets pixel-identical\n * geometry to an unvirtualized row.\n */\nexport type ColumnRenderSegment =\n | {\n type: 'spacer';\n /** Summed width of the skipped columns. */\n width: number;\n /** First skipped column index (inclusive). */\n fromIndex: number;\n /** Last skipped column index (inclusive). */\n toIndex: number;\n }\n | { type: 'column'; column: VirtualColumn };\n\nexport interface ColumnWindow {\n /** False when virtualization is off or bypassed \u2014 every column is mounted. */\n virtualized: boolean;\n /** First mounted column index (0 when nothing is mounted). */\n startIndex: number;\n /** Last mounted column index, INCLUSIVE (-1 when nothing is mounted). */\n endIndex: number;\n /** Length of the FULL column array \u2014 the denominator for aria-colcount. */\n columnCount: number;\n /** Every mounted index, ascending, unique: window \u222A pinned \u222A forced. */\n mountedIndices: number[];\n /** Mounted columns with absolute geometry, ascending by index. */\n virtualColumns: VirtualColumn[];\n /** Spacers + columns, in render order. Widths always sum to `totalWidth`. */\n segments: ColumnRenderSegment[];\n /** Width of the unmounted columns BEFORE the first mounted one. */\n paddingLeft: number;\n /** Width of the unmounted columns AFTER the last mounted one. */\n paddingRight: number;\n /** Full-table width \u2014 unchanged by virtualization. */\n totalWidth: number;\n leadingWidth: number;\n trailingWidth: number;\n /** leadingWidth + \u03A3 widths of sticky/frozen LEFT columns (the left occluder). */\n pinnedLeftWidth: number;\n /** trailingWidth + \u03A3 widths of sticky RIGHT columns (the right occluder). */\n pinnedRightWidth: number;\n /** O(1). Range operations ask this before touching the DOM. */\n isColumnMounted: (index: number) => boolean;\n}\n\n/**\n * DEFAULT HORIZONTAL OVERSCAN \u2014 deliberately 3, not the row virtualizer's 10.\n *\n * Overscan is a pixel budget dressed up as an item count, and the two axes have\n * very different pixel-per-item ratios:\n *\n * \u2022 Rows are 32px (density 'xs') to 44px ('md'). The row virtualizer's\n * overscan of 10 therefore pre-renders ~320\u2013440px above and below.\n * \u2022 Columns default to 100px and are commonly 120\u2013200px. Three columns is\n * ~300\u2013600px on each side \u2014 the SAME pixel buffer for a third of the items.\n *\n * The cost asymmetry runs the other way, which is why we do not simply copy 10:\n * one extra overscanned column costs (mounted rows \u2248 40) extra cells, whereas\n * one extra overscanned row costs (mounted columns \u2248 20) extra cells. A\n * horizontal overscan of 10 on a 60-column grid would mount roughly as many\n * cells as not virtualizing at all on a normal monitor.\n *\n * The trade is against blank flashes on fast horizontal scroll. Horizontal\n * scrolling here is shift+wheel, a trackpad two-finger pan, or a drag on the\n * scrollbar \u2014 all materially slower in items/second than a vertical fling, and\n * `overscan: 0` on the underlying virtualizer means the React commit happens the\n * moment the base range changes, one full column ahead of the viewport edge.\n * Three columns buys ~2\u20134 frames of headroom at typical pan speeds.\n *\n * DO NOT raise this to \"fix\" a blank flash. A blank flash is a commit-latency\n * bug (a re-render blocked by unmemoized work \u2014 see Defect 5); inflating the\n * mounted set to hide it spends exactly the density budget this work exists to\n * buy back.\n */\nexport const DEFAULT_COLUMN_OVERSCAN = 3;\n\n/** An empty range, spelled once so callers can compare against it meaningfully. */\nexport const EMPTY_COLUMN_RANGE: ColumnRange = { startIndex: 0, endIndex: -1 };\n\nfunction clampIndex(value: number, columnCount: number): number {\n if (columnCount <= 0) return 0;\n if (value < 0) return 0;\n if (value > columnCount - 1) return columnCount - 1;\n return value;\n}\n\n/**\n * Builds the prefix-sum table. O(n) over the FULL column array \u2014 deliberately\n * not over the window, because a window cannot know where it starts without it.\n *\n * `getColumnWidth` is expected to be `store.getColumnWidth`, which answers for\n * any index whether or not the column is mounted. Widths are user-resizable, so\n * the caller must rebuild this whenever a width changes (see the hook's\n * `widthRevision`).\n */\nexport function computeColumnGeometry(\n columnCount: number,\n getColumnWidth: (index: number) => number,\n options: { leadingWidth?: number; trailingWidth?: number } = {}\n): ColumnGeometry {\n const leadingWidth = options.leadingWidth ?? 0;\n const trailingWidth = options.trailingWidth ?? 0;\n const count = Math.max(0, columnCount);\n const starts = new Array<number>(count + 1);\n let x = leadingWidth;\n starts[0] = x;\n for (let i = 0; i < count; i++) {\n const width = getColumnWidth(i);\n x += Number.isFinite(width) && width > 0 ? width : 0;\n starts[i + 1] = x;\n }\n return {\n columnCount: count,\n starts,\n leadingWidth,\n trailingWidth,\n totalWidth: x + trailingWidth,\n };\n}\n\n/** Width of a single column, straight off the geometry. */\nexport function getGeometryColumnWidth(geometry: ColumnGeometry, index: number): number {\n if (index < 0 || index >= geometry.columnCount) return 0;\n return geometry.starts[index + 1] - geometry.starts[index];\n}\n\n/** Summed width of an inclusive index range. `to < from` yields 0. */\nexport function getRangeWidth(geometry: ColumnGeometry, from: number, to: number): number {\n if (geometry.columnCount === 0 || to < from) return 0;\n const lo = clampIndex(from, geometry.columnCount);\n const hi = clampIndex(to, geometry.columnCount);\n if (hi < lo) return 0;\n return geometry.starts[hi + 1] - geometry.starts[lo];\n}\n\n/**\n * Binary search: the index of the column containing `x` (the last column whose\n * left edge is <= x). Clamped into range, so an `x` left of the first column\n * returns 0 and an `x` past the end returns `columnCount - 1`.\n */\nexport function findColumnIndexAtOffset(geometry: ColumnGeometry, x: number): number {\n const { columnCount, starts } = geometry;\n if (columnCount === 0) return -1;\n if (x <= starts[0]) return 0;\n if (x >= starts[columnCount]) return columnCount - 1;\n let lo = 0;\n let hi = columnCount - 1;\n while (lo < hi) {\n const mid = (lo + hi + 1) >> 1;\n if (starts[mid] <= x) lo = mid;\n else hi = mid - 1;\n }\n return lo;\n}\n\n/**\n * The columns whose boxes intersect `[scrollLeft, scrollLeft + viewportWidth)`,\n * with no overscan. This is the reference implementation of the base range: the\n * hook normally takes the same range from `@tanstack/react-virtual` (which owns\n * the scroll/resize plumbing), and falls back to this when it needs a window\n * without a live virtualizer \u2014 headless callers, SSR, and tests.\n *\n * FAIL-OPEN: a non-positive `viewportWidth` means \"we have not measured yet\".\n * Returning the full range there mounts everything \u2014 correct but slow \u2014 which\n * is the only acceptable direction to fail. Returning an empty range would\n * paint an empty grid.\n */\nexport function computeVisibleRange(\n geometry: ColumnGeometry,\n scrollLeft: number,\n viewportWidth: number\n): ColumnRange {\n const { columnCount, starts } = geometry;\n if (columnCount === 0) return EMPTY_COLUMN_RANGE;\n if (!(viewportWidth > 0)) return { startIndex: 0, endIndex: columnCount - 1 };\n\n const left = Math.max(scrollLeft, starts[0]);\n const right = scrollLeft + viewportWidth;\n\n const startIndex = findColumnIndexAtOffset(geometry, left);\n let endIndex = startIndex;\n while (endIndex + 1 < columnCount && starts[endIndex + 1] < right) endIndex++;\n return { startIndex, endIndex };\n}\n\n/** Grows a range by `overscan` columns on each side, clamped to the array. */\nexport function expandColumnRange(\n range: ColumnRange,\n overscan: number,\n columnCount: number\n): ColumnRange {\n if (columnCount <= 0 || range.endIndex < range.startIndex) return EMPTY_COLUMN_RANGE;\n const pad = Math.max(0, Math.floor(overscan));\n return {\n startIndex: Math.max(0, range.startIndex - pad),\n endIndex: Math.min(columnCount - 1, range.endIndex + pad),\n };\n}\n\n/**\n * Derives the pinned column indices from the grid's two independent pinning\n * sources, both keyed by column DATA KEY so they survive a reorder:\n *\n * \u2022 static \u2014 `ColumnDef.sticky === 'left' | 'right'`\n * \u2022 runtime \u2014 the `frozenColumns: Set<string>` toggled from the header menu\n * and persisted per-perspective\n *\n * A frozen column is pinned LEFT unless it is already statically sticky-right;\n * that mirrors `effectiveLeftOffsets` in DynamicTable, which folds the runtime\n * frozen set on top of the static left offsets.\n */\nexport function getPinnedColumnIndices(\n columns: readonly { data: string; sticky?: 'left' | 'right' }[],\n frozenColumns?: ReadonlySet<string> | null\n): { left: number[]; right: number[] } {\n const left: number[] = [];\n const right: number[] = [];\n for (let i = 0; i < columns.length; i++) {\n const col = columns[i];\n if (col.sticky === 'right') {\n right.push(i);\n } else if (col.sticky === 'left' || frozenColumns?.has(col.data)) {\n left.push(i);\n }\n }\n return { left, right };\n}\n\n/**\n * The mounted set: `window \u222A pinned-left \u222A pinned-right \u222A forced`, ascending and\n * de-duplicated. `forced` carries the selection anchor, the selection focus and\n * the editing cell \u2014 moving the selection onto a column and then failing to\n * mount it is how you get an invisible cursor and a missing editor.\n *\n * Out-of-range indices are dropped rather than throwing: `forced` comes from\n * selection state that can outlive a column being hidden by a perspective.\n */\nexport function mergePinnedColumns(\n range: ColumnRange,\n options: {\n columnCount: number;\n pinnedLeftIndices?: readonly number[];\n pinnedRightIndices?: readonly number[];\n forcedIndices?: readonly number[];\n }\n): number[] {\n const { columnCount } = options;\n if (columnCount <= 0) return [];\n const mounted = new Set<number>();\n if (range.endIndex >= range.startIndex) {\n const from = Math.max(0, range.startIndex);\n const to = Math.min(columnCount - 1, range.endIndex);\n for (let i = from; i <= to; i++) mounted.add(i);\n }\n const add = (list?: readonly number[]) => {\n if (!list) return;\n for (const index of list) {\n if (Number.isInteger(index) && index >= 0 && index < columnCount) mounted.add(index);\n }\n };\n add(options.pinnedLeftIndices);\n add(options.pinnedRightIndices);\n add(options.forcedIndices);\n return Array.from(mounted).sort((a, b) => a - b);\n}\n\n/**\n * Turns a mounted index list into the left-to-right render plan.\n *\n * Gaps become spacers \u2014 INCLUDING interior gaps. That is what lets a pinned\n * column that sits far to the left stay mounted without being double-counted:\n * it occupies its own real box at its own natural x, and only the columns\n * actually skipped are folded into a spacer. Widths always sum to\n * `totalWidth - leadingWidth - trailingWidth`.\n */\nexport function buildColumnRenderPlan(\n mountedIndices: readonly number[],\n geometry: ColumnGeometry,\n getColumnKey?: (index: number) => string | number\n): { segments: ColumnRenderSegment[]; virtualColumns: VirtualColumn[] } {\n const segments: ColumnRenderSegment[] = [];\n const virtualColumns: VirtualColumn[] = [];\n let cursor = 0;\n\n for (const index of mountedIndices) {\n if (index > cursor) {\n segments.push({\n type: 'spacer',\n width: getRangeWidth(geometry, cursor, index - 1),\n fromIndex: cursor,\n toIndex: index - 1,\n });\n }\n const column: VirtualColumn = {\n index,\n start: geometry.starts[index],\n end: geometry.starts[index + 1],\n size: geometry.starts[index + 1] - geometry.starts[index],\n key: getColumnKey ? getColumnKey(index) : index,\n };\n virtualColumns.push(column);\n segments.push({ type: 'column', column });\n cursor = index + 1;\n }\n\n if (cursor < geometry.columnCount) {\n segments.push({\n type: 'spacer',\n width: getRangeWidth(geometry, cursor, geometry.columnCount - 1),\n fromIndex: cursor,\n toIndex: geometry.columnCount - 1,\n });\n }\n\n return { segments, virtualColumns };\n}\n\nexport interface BuildColumnWindowInput {\n geometry: ColumnGeometry;\n /**\n * Base (un-overscanned) range. Supply it from the underlying virtualizer;\n * omit it and `scrollLeft` / `viewportWidth` are used instead.\n */\n range?: ColumnRange | null;\n scrollLeft?: number;\n viewportWidth?: number;\n overscan?: number;\n pinnedLeftIndices?: readonly number[];\n pinnedRightIndices?: readonly number[];\n forcedIndices?: readonly number[];\n getColumnKey?: (index: number) => string | number;\n}\n\nfunction summedWidth(geometry: ColumnGeometry, indices?: readonly number[]): number {\n if (!indices || indices.length === 0) return 0;\n let total = 0;\n for (const index of indices) total += getGeometryColumnWidth(geometry, index);\n return total;\n}\n\nfunction finalizeWindow(\n geometry: ColumnGeometry,\n mountedIndices: number[],\n virtualized: boolean,\n pinnedLeftIndices: readonly number[] | undefined,\n pinnedRightIndices: readonly number[] | undefined,\n getColumnKey?: (index: number) => string | number\n): ColumnWindow {\n const { segments, virtualColumns } = buildColumnRenderPlan(\n mountedIndices,\n geometry,\n getColumnKey\n );\n const mountedSet = new Set(mountedIndices);\n const first = mountedIndices[0];\n const last = mountedIndices[mountedIndices.length - 1];\n\n return {\n virtualized,\n startIndex: mountedIndices.length ? first : 0,\n endIndex: mountedIndices.length ? last : -1,\n columnCount: geometry.columnCount,\n mountedIndices,\n virtualColumns,\n segments,\n paddingLeft: mountedIndices.length ? getRangeWidth(geometry, 0, first - 1) : 0,\n paddingRight: mountedIndices.length\n ? getRangeWidth(geometry, last + 1, geometry.columnCount - 1)\n : getRangeWidth(geometry, 0, geometry.columnCount - 1),\n totalWidth: geometry.totalWidth,\n leadingWidth: geometry.leadingWidth,\n trailingWidth: geometry.trailingWidth,\n pinnedLeftWidth: geometry.leadingWidth + summedWidth(geometry, pinnedLeftIndices),\n pinnedRightWidth: geometry.trailingWidth + summedWidth(geometry, pinnedRightIndices),\n isColumnMounted: (index: number) => mountedSet.has(index),\n };\n}\n\n/**\n * Every column mounted, no spacers. Used when virtualization is switched off,\n * and as the fail-open result when geometry has not been measured yet.\n */\nexport function createFullColumnWindow(\n geometry: ColumnGeometry,\n options: {\n pinnedLeftIndices?: readonly number[];\n pinnedRightIndices?: readonly number[];\n getColumnKey?: (index: number) => string | number;\n } = {}\n): ColumnWindow {\n const mounted: number[] = new Array(geometry.columnCount);\n for (let i = 0; i < geometry.columnCount; i++) mounted[i] = i;\n return finalizeWindow(\n geometry,\n mounted,\n false,\n options.pinnedLeftIndices,\n options.pinnedRightIndices,\n options.getColumnKey\n );\n}\n\n/** The one entry point: range \u2192 overscan \u2192 pinned merge \u2192 render plan. */\nexport function buildColumnWindow(input: BuildColumnWindowInput): ColumnWindow {\n const {\n geometry,\n pinnedLeftIndices,\n pinnedRightIndices,\n forcedIndices,\n getColumnKey,\n } = input;\n\n if (geometry.columnCount === 0) {\n return finalizeWindow(geometry, [], true, pinnedLeftIndices, pinnedRightIndices, getColumnKey);\n }\n\n const baseRange =\n input.range ??\n computeVisibleRange(geometry, input.scrollLeft ?? 0, input.viewportWidth ?? 0);\n\n const overscanned = expandColumnRange(\n baseRange,\n input.overscan ?? DEFAULT_COLUMN_OVERSCAN,\n geometry.columnCount\n );\n\n const mountedIndices = mergePinnedColumns(overscanned, {\n columnCount: geometry.columnCount,\n pinnedLeftIndices,\n pinnedRightIndices,\n forcedIndices,\n });\n\n return finalizeWindow(\n geometry,\n mountedIndices,\n true,\n pinnedLeftIndices,\n pinnedRightIndices,\n getColumnKey\n );\n}\n\n// ============================================================================\n// INDEX MAPPING \u2014 \"visual\" (position among rendered cells) \u2194 column array index\n// ============================================================================\n//\n// The grid addresses cells as (rowIndex, colIndex) into the FULL column array,\n// and `data-col` must keep carrying that absolute index or every pointer\n// hit-test in handlers/index.ts silently retargets. These two helpers exist for\n// the narrow cases that genuinely need the rendered position \u2014 DOM sibling\n// walks, focus order, screen-reader ordering \u2014 and nothing else should use them.\n\n/** Position of `columnIndex` among the mounted columns, or -1 if unmounted. */\nexport function columnIndexToVisualIndex(window: ColumnWindow, columnIndex: number): number {\n // mountedIndices is ascending, so binary search rather than indexOf.\n const list = window.mountedIndices;\n let lo = 0;\n let hi = list.length - 1;\n while (lo <= hi) {\n const mid = (lo + hi) >> 1;\n if (list[mid] === columnIndex) return mid;\n if (list[mid] < columnIndex) lo = mid + 1;\n else hi = mid - 1;\n }\n return -1;\n}\n\n/** Column array index rendered at mounted position `visualIndex`, or -1. */\nexport function visualIndexToColumnIndex(window: ColumnWindow, visualIndex: number): number {\n if (visualIndex < 0 || visualIndex >= window.mountedIndices.length) return -1;\n return window.mountedIndices[visualIndex];\n}\n\n/** Convenience predicate for range operations that only hold a window. */\nexport function isColumnMounted(window: ColumnWindow, columnIndex: number): boolean {\n return window.isColumnMounted(columnIndex);\n}\n\n// ============================================================================\n// ACCESSIBILITY\n// ============================================================================\n//\n// Unmounted columns break grid semantics if `aria-colcount` / `aria-colindex`\n// are inferred from the DOM: a screen reader would announce \"column 4 of 12\"\n// while the user is on column 37 of 60. Both are therefore computed from the\n// FULL column list, exactly like `data-col`. A grid whose rendered cells are a\n// subset MUST set `aria-colcount` on the grid and `aria-colindex` on every cell\n// and header \u2014 omitting `aria-colindex` is only legal when the DOM is complete.\n\n/** 1-based total, counting the row-header and Actions columns when present. */\nexport function getAriaColCount(\n columnCount: number,\n options: { hasRowHeader?: boolean; hasActionsColumn?: boolean } = {}\n): number {\n return (\n columnCount + (options.hasRowHeader ? 1 : 0) + (options.hasActionsColumn ? 1 : 0)\n );\n}\n\n/** 1-based aria index of a data column; the row header occupies index 1. */\nexport function getAriaColIndex(\n columnIndex: number,\n options: { hasRowHeader?: boolean } = {}\n): number {\n return columnIndex + 1 + (options.hasRowHeader ? 1 : 0);\n}\n\n// ============================================================================\n// SCROLL-INTO-VIEW\n// ============================================================================\n\nexport type ColumnScrollAlign = 'auto' | 'start' | 'end' | 'center';\n\n/**\n * The `scrollLeft` that brings `columnIndex` into view, or `null` when no scroll\n * is needed (already visible under `'auto'`, or the column is pinned and can\n * never be scrolled away from).\n *\n * The pinned block occludes the viewport's left and right edges, so a column is\n * only \"visible\" between `pinnedLeftWidth` and `viewportWidth - pinnedRightWidth`\n * \u2014 scrolling a cell to `scrollLeft` exactly would park it underneath a frozen\n * column and it would look like nothing happened.\n *\n * This exists because there is currently NO horizontal scroll-into-view anywhere\n * in the grid. Keyboard navigation and `setEditingCell` move the selection by\n * index, which under column virtualization can land on a column that is not\n * mounted \u2014 the caller must scroll in the same commit, before any focus attempt.\n */\nexport function computeScrollLeftToReveal(\n geometry: ColumnGeometry,\n columnIndex: number,\n options: {\n scrollLeft: number;\n viewportWidth: number;\n /** Left occluder \u2014 `ColumnWindow.pinnedLeftWidth`. */\n pinnedLeftWidth?: number;\n /** Right occluder \u2014 `ColumnWindow.pinnedRightWidth`. */\n pinnedRightWidth?: number;\n align?: ColumnScrollAlign;\n /** Indices that are pinned and therefore always visible. */\n pinnedIndices?: readonly number[];\n }\n): number | null {\n const { columnCount } = geometry;\n if (columnIndex < 0 || columnIndex >= columnCount) return null;\n if (options.pinnedIndices?.includes(columnIndex)) return null;\n\n const viewportWidth = options.viewportWidth;\n if (!(viewportWidth > 0)) return null;\n\n const gutterLeft = options.pinnedLeftWidth ?? geometry.leadingWidth;\n const gutterRight = options.pinnedRightWidth ?? geometry.trailingWidth;\n const align = options.align ?? 'auto';\n\n const columnStart = geometry.starts[columnIndex];\n const columnEnd = geometry.starts[columnIndex + 1];\n\n const maxScroll = Math.max(0, geometry.totalWidth - viewportWidth);\n const clamp = (value: number) => Math.min(Math.max(value, 0), maxScroll);\n\n const alignStart = () => clamp(columnStart - gutterLeft);\n const alignEnd = () => clamp(columnEnd + gutterRight - viewportWidth);\n\n if (align === 'start') return alignStart();\n if (align === 'end') return alignEnd();\n if (align === 'center') {\n const usable = viewportWidth - gutterLeft - gutterRight;\n return clamp(columnStart - gutterLeft - Math.max(0, (usable - (columnEnd - columnStart)) / 2));\n }\n\n // 'auto': only move if the column is actually occluded. A column wider than\n // the usable viewport aligns to its start, so at least its leading edge and\n // its content anchor are visible.\n const visibleStart = options.scrollLeft + gutterLeft;\n const visibleEnd = options.scrollLeft + viewportWidth - gutterRight;\n if (columnStart < visibleStart) return alignStart();\n if (columnEnd > visibleEnd) {\n if (columnEnd - columnStart > visibleEnd - visibleStart) return alignStart();\n return alignEnd();\n }\n return null;\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,188 @@
1
+ const CONDITIONAL_FORMAT_STYLES = [
2
+ "green",
3
+ "yellow",
4
+ "red",
5
+ "green-subtle",
6
+ "yellow-subtle",
7
+ "red-subtle"
8
+ ];
9
+ const CONDITIONAL_FORMAT_OPERATORS = [
10
+ "eq",
11
+ "neq",
12
+ "gt",
13
+ "gte",
14
+ "lt",
15
+ "lte",
16
+ "contains",
17
+ "isEmpty",
18
+ "isNotEmpty",
19
+ "beforeField",
20
+ "afterField"
21
+ ];
22
+ const RELATIVE_OPERATORS = ["beforeField", "afterField"];
23
+ const UNARY_OPERATORS = ["isEmpty", "isNotEmpty"];
24
+ function operatorNeedsValue(op) {
25
+ return !UNARY_OPERATORS.includes(op) && !RELATIVE_OPERATORS.includes(op);
26
+ }
27
+ function operatorNeedsCompareField(op) {
28
+ return RELATIVE_OPERATORS.includes(op);
29
+ }
30
+ const MAX_CONDITIONAL_FORMAT_RULES = 20;
31
+ function generateConditionalFormatRuleId() {
32
+ return `cf-${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;
33
+ }
34
+ function parseConditionalFormats(raw) {
35
+ if (!Array.isArray(raw)) return [];
36
+ const out = [];
37
+ for (const entry of raw) {
38
+ if (!entry || typeof entry !== "object") continue;
39
+ const { id, field, operator, value, compareField, style } = entry;
40
+ if (typeof field !== "string" || !field) continue;
41
+ if (typeof operator !== "string" || !CONDITIONAL_FORMAT_OPERATORS.includes(operator))
42
+ continue;
43
+ if (typeof style !== "string" || !CONDITIONAL_FORMAT_STYLES.includes(style))
44
+ continue;
45
+ const op = operator;
46
+ if (operatorNeedsCompareField(op) && (typeof compareField !== "string" || !compareField)) continue;
47
+ out.push({
48
+ id: typeof id === "string" && id ? id : generateConditionalFormatRuleId(),
49
+ field,
50
+ operator: op,
51
+ value: typeof value === "string" || typeof value === "number" ? value : value === null ? null : void 0,
52
+ compareField: typeof compareField === "string" && compareField ? compareField : void 0,
53
+ style
54
+ });
55
+ if (out.length >= MAX_CONDITIONAL_FORMAT_RULES) break;
56
+ }
57
+ return out;
58
+ }
59
+ const EMPTY_CONDITIONAL_FORMATS = {
60
+ byField: /* @__PURE__ */ new Map(),
61
+ isEmpty: true
62
+ };
63
+ function isBlank(v) {
64
+ return v === null || v === void 0 || typeof v === "string" && v.trim() === "";
65
+ }
66
+ function asNumber(v) {
67
+ if (typeof v === "number") return Number.isFinite(v) ? v : null;
68
+ if (typeof v === "boolean") return v ? 1 : 0;
69
+ if (typeof v !== "string") return null;
70
+ const s = v.trim();
71
+ if (!s) return null;
72
+ const n = Number(s);
73
+ return Number.isFinite(n) ? n : null;
74
+ }
75
+ function asComparable(v) {
76
+ if (v instanceof Date) {
77
+ const t = v.getTime();
78
+ return Number.isNaN(t) ? null : t;
79
+ }
80
+ const n = asNumber(v);
81
+ if (n !== null) return n;
82
+ if (typeof v === "string") {
83
+ const t = Date.parse(v.trim());
84
+ if (!Number.isNaN(t)) return t;
85
+ }
86
+ return null;
87
+ }
88
+ function compileRule(rule) {
89
+ const className = `cell-${rule.style}`;
90
+ const literal = rule.value;
91
+ switch (rule.operator) {
92
+ case "isEmpty":
93
+ return { test: (v) => isBlank(v), className };
94
+ case "isNotEmpty":
95
+ return { test: (v) => !isBlank(v), className };
96
+ case "contains": {
97
+ const needle = String(literal ?? "").toLowerCase();
98
+ if (!needle) return null;
99
+ return { test: (v) => !isBlank(v) && String(v).toLowerCase().includes(needle), className };
100
+ }
101
+ case "eq":
102
+ case "neq": {
103
+ const wantNumber = asNumber(literal);
104
+ const wantText = String(literal ?? "").toLowerCase();
105
+ const eq = (v) => {
106
+ if (wantNumber !== null) {
107
+ const n = asNumber(v);
108
+ if (n !== null) return n === wantNumber;
109
+ }
110
+ if (isBlank(v)) return isBlank(literal);
111
+ return String(v).toLowerCase() === wantText;
112
+ };
113
+ return rule.operator === "eq" ? { test: eq, className } : { test: (v, row) => !eq(v, row), className };
114
+ }
115
+ case "gt":
116
+ case "gte":
117
+ case "lt":
118
+ case "lte": {
119
+ const bound = asComparable(literal);
120
+ if (bound === null) return null;
121
+ const op = rule.operator;
122
+ return {
123
+ test: (v) => {
124
+ const n = asComparable(v);
125
+ if (n === null) return false;
126
+ if (op === "gt") return n > bound;
127
+ if (op === "gte") return n >= bound;
128
+ if (op === "lt") return n < bound;
129
+ return n <= bound;
130
+ },
131
+ className
132
+ };
133
+ }
134
+ case "beforeField":
135
+ case "afterField": {
136
+ const other = rule.compareField;
137
+ if (!other) return null;
138
+ const wantBefore = rule.operator === "beforeField";
139
+ return {
140
+ test: (v, rowData) => {
141
+ const a = asComparable(v);
142
+ const b = asComparable(rowData?.[other]);
143
+ if (a === null || b === null) return false;
144
+ return wantBefore ? a < b : a > b;
145
+ },
146
+ className
147
+ };
148
+ }
149
+ default:
150
+ return null;
151
+ }
152
+ }
153
+ function compileConditionalFormats(rules) {
154
+ if (!rules || rules.length === 0) return EMPTY_CONDITIONAL_FORMATS;
155
+ const byField = /* @__PURE__ */ new Map();
156
+ for (const rule of rules.slice(0, MAX_CONDITIONAL_FORMAT_RULES)) {
157
+ const compiled = compileRule(rule);
158
+ if (!compiled) continue;
159
+ const list = byField.get(rule.field);
160
+ if (list) list.push(compiled);
161
+ else byField.set(rule.field, [compiled]);
162
+ }
163
+ return { byField, isEmpty: byField.size === 0 };
164
+ }
165
+ function conditionalFormatClassName(compiled, field, value, rowData) {
166
+ if (compiled.isEmpty) return void 0;
167
+ const rules = compiled.byField.get(field);
168
+ if (!rules) return void 0;
169
+ for (const rule of rules) {
170
+ if (rule.test(value, rowData)) return rule.className;
171
+ }
172
+ return void 0;
173
+ }
174
+ export {
175
+ CONDITIONAL_FORMAT_OPERATORS,
176
+ CONDITIONAL_FORMAT_STYLES,
177
+ EMPTY_CONDITIONAL_FORMATS,
178
+ MAX_CONDITIONAL_FORMAT_RULES,
179
+ RELATIVE_OPERATORS,
180
+ UNARY_OPERATORS,
181
+ compileConditionalFormats,
182
+ conditionalFormatClassName,
183
+ generateConditionalFormatRuleId,
184
+ operatorNeedsCompareField,
185
+ operatorNeedsValue,
186
+ parseConditionalFormats
187
+ };
188
+ //# sourceMappingURL=conditionalFormat.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/backend/dynamic-table/utils/conditionalFormat.ts"],
4
+ "sourcesContent": ["// utils/conditionalFormat.ts\n//\n// User-authored conditional formatting (\"Highlighting\"). Rules are view-scoped:\n// they ride inside the perspective's `settings.filters._conditionalFormats`\n// passthrough, so switching views switches the highlighting.\n//\n// The rule type is declared HERE rather than in `types/perspective.ts` so this\n// feature owns its own vocabulary; `PerspectiveConfig` picks it up through\n// `ConditionalFormatCarrier` below.\n\n/** Palette variants. Each maps 1:1 onto an existing `cell-*` class in DynamicTable.css. */\nexport type ConditionalFormatStyle =\n | 'green'\n | 'yellow'\n | 'red'\n | 'green-subtle'\n | 'yellow-subtle'\n | 'red-subtle';\n\nexport const CONDITIONAL_FORMAT_STYLES: readonly ConditionalFormatStyle[] = [\n 'green',\n 'yellow',\n 'red',\n 'green-subtle',\n 'yellow-subtle',\n 'red-subtle',\n] as const;\n\nexport type ConditionalFormatOperator =\n | 'eq'\n | 'neq'\n | 'gt'\n | 'gte'\n | 'lt'\n | 'lte'\n | 'contains'\n | 'isEmpty'\n | 'isNotEmpty'\n /** `field` is chronologically before `compareField` \u2014 the ETA-vs-ATA delay case. */\n | 'beforeField'\n /** `field` is chronologically after `compareField`. */\n | 'afterField';\n\nexport const CONDITIONAL_FORMAT_OPERATORS: readonly ConditionalFormatOperator[] = [\n 'eq',\n 'neq',\n 'gt',\n 'gte',\n 'lt',\n 'lte',\n 'contains',\n 'isEmpty',\n 'isNotEmpty',\n 'beforeField',\n 'afterField',\n] as const;\n\n/** Operators that compare against another column instead of a literal. */\nexport const RELATIVE_OPERATORS: readonly ConditionalFormatOperator[] = ['beforeField', 'afterField'];\n\n/** Operators that need no comparand at all. */\nexport const UNARY_OPERATORS: readonly ConditionalFormatOperator[] = ['isEmpty', 'isNotEmpty'];\n\nexport function operatorNeedsValue(op: ConditionalFormatOperator): boolean {\n return !UNARY_OPERATORS.includes(op) && !RELATIVE_OPERATORS.includes(op);\n}\n\nexport function operatorNeedsCompareField(op: ConditionalFormatOperator): boolean {\n return RELATIVE_OPERATORS.includes(op);\n}\n\nexport interface ConditionalFormatRule {\n /** `cf-<something unique>`. */\n id: string;\n /** `ColumnDef.data` key the rule paints. */\n field: string;\n operator: ConditionalFormatOperator;\n /** Literal comparand. Ignored by unary and relative operators. */\n value?: string | number | null;\n /** Other column's `data` key, for `beforeField` / `afterField`. */\n compareField?: string;\n style: ConditionalFormatStyle;\n}\n\n/**\n * Mixin that carries view-scoped highlighting rules on a `PerspectiveConfig`.\n * Declared here so `types/perspective.ts` does not have to change; once the\n * field is folded into `PerspectiveConfig` itself the intersection becomes a\n * harmless no-op.\n */\nexport interface ConditionalFormatCarrier {\n conditionalFormats?: ConditionalFormatRule[];\n}\n\n/**\n * Hard cap. Rules are evaluated on the cell render path, so an unbounded rule\n * set is a scroll-performance hazard. 20 is the spec's number.\n */\nexport const MAX_CONDITIONAL_FORMAT_RULES = 20;\n\nexport function generateConditionalFormatRuleId(): string {\n return `cf-${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\n}\n\n// \u2500\u2500\u2500 Parsing (persistence boundary) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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/**\n * Defensively parse `_conditionalFormats` out of the perspective settings\n * passthrough. Anything malformed is dropped rather than allowed to crash the\n * grid, and the list is capped.\n */\nexport function parseConditionalFormats(raw: unknown): ConditionalFormatRule[] {\n if (!Array.isArray(raw)) return [];\n const out: ConditionalFormatRule[] = [];\n for (const entry of raw) {\n if (!entry || typeof entry !== 'object') continue;\n const { id, field, operator, value, compareField, style } = entry as Record<string, unknown>;\n if (typeof field !== 'string' || !field) continue;\n if (\n typeof operator !== 'string' ||\n !(CONDITIONAL_FORMAT_OPERATORS as readonly string[]).includes(operator)\n )\n continue;\n if (typeof style !== 'string' || !(CONDITIONAL_FORMAT_STYLES as readonly string[]).includes(style))\n continue;\n const op = operator as ConditionalFormatOperator;\n if (operatorNeedsCompareField(op) && (typeof compareField !== 'string' || !compareField)) continue;\n out.push({\n id: typeof id === 'string' && id ? id : generateConditionalFormatRuleId(),\n field,\n operator: op,\n value:\n typeof value === 'string' || typeof value === 'number' ? value : value === null ? null : undefined,\n compareField: typeof compareField === 'string' && compareField ? compareField : undefined,\n style: style as ConditionalFormatStyle,\n });\n if (out.length >= MAX_CONDITIONAL_FORMAT_RULES) break;\n }\n return out;\n}\n\n// \u2500\u2500\u2500 Evaluation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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\ntype Predicate = (value: unknown, rowData: any) => boolean;\n\ninterface CompiledRule {\n test: Predicate;\n className: string;\n}\n\n/** Pre-compiled rule set: field -> ordered predicates. */\nexport interface CompiledConditionalFormats {\n byField: Map<string, CompiledRule[]>;\n /** `true` when there is nothing to evaluate \u2014 lets callers skip entirely. */\n isEmpty: boolean;\n}\n\nexport const EMPTY_CONDITIONAL_FORMATS: CompiledConditionalFormats = {\n byField: new Map(),\n isEmpty: true,\n};\n\nfunction isBlank(v: unknown): boolean {\n return v === null || v === undefined || (typeof v === 'string' && v.trim() === '');\n}\n\nfunction asNumber(v: unknown): number | null {\n if (typeof v === 'number') return Number.isFinite(v) ? v : null;\n if (typeof v === 'boolean') return v ? 1 : 0;\n if (typeof v !== 'string') return null;\n const s = v.trim();\n if (!s) return null;\n const n = Number(s);\n return Number.isFinite(n) ? n : null;\n}\n\n/** Comparable ordering key: a date if both sides parse as dates, else a number. */\nfunction asComparable(v: unknown): number | null {\n if (v instanceof Date) {\n const t = v.getTime();\n return Number.isNaN(t) ? null : t;\n }\n const n = asNumber(v);\n if (n !== null) return n;\n if (typeof v === 'string') {\n const t = Date.parse(v.trim());\n if (!Number.isNaN(t)) return t;\n }\n return null;\n}\n\nfunction compileRule(rule: ConditionalFormatRule): CompiledRule | null {\n const className = `cell-${rule.style}`;\n const literal = rule.value;\n\n switch (rule.operator) {\n case 'isEmpty':\n return { test: (v) => isBlank(v), className };\n case 'isNotEmpty':\n return { test: (v) => !isBlank(v), className };\n case 'contains': {\n const needle = String(literal ?? '').toLowerCase();\n if (!needle) return null;\n return { test: (v) => !isBlank(v) && String(v).toLowerCase().includes(needle), className };\n }\n case 'eq':\n case 'neq': {\n const wantNumber = asNumber(literal);\n const wantText = String(literal ?? '').toLowerCase();\n const eq: Predicate = (v) => {\n if (wantNumber !== null) {\n const n = asNumber(v);\n if (n !== null) return n === wantNumber;\n }\n if (isBlank(v)) return isBlank(literal);\n return String(v).toLowerCase() === wantText;\n };\n return rule.operator === 'eq'\n ? { test: eq, className }\n : { test: (v, row) => !eq(v, row), className };\n }\n case 'gt':\n case 'gte':\n case 'lt':\n case 'lte': {\n const bound = asComparable(literal);\n if (bound === null) return null;\n const op = rule.operator;\n return {\n test: (v) => {\n const n = asComparable(v);\n if (n === null) return false;\n if (op === 'gt') return n > bound;\n if (op === 'gte') return n >= bound;\n if (op === 'lt') return n < bound;\n return n <= bound;\n },\n className,\n };\n }\n case 'beforeField':\n case 'afterField': {\n const other = rule.compareField;\n if (!other) return null;\n const wantBefore = rule.operator === 'beforeField';\n return {\n test: (v, rowData) => {\n const a = asComparable(v);\n const b = asComparable(rowData?.[other]);\n if (a === null || b === null) return false;\n return wantBefore ? a < b : a > b;\n },\n className,\n };\n }\n default:\n return null;\n }\n}\n\n/**\n * Compile a rule set ONCE per change, not once per cell. Rules that cannot\n * produce a meaningful predicate (a `gt` with no comparand, a `beforeField`\n * with no target) are dropped rather than matching everything.\n */\nexport function compileConditionalFormats(\n rules: ConditionalFormatRule[] | undefined | null,\n): CompiledConditionalFormats {\n if (!rules || rules.length === 0) return EMPTY_CONDITIONAL_FORMATS;\n const byField = new Map<string, CompiledRule[]>();\n for (const rule of rules.slice(0, MAX_CONDITIONAL_FORMAT_RULES)) {\n const compiled = compileRule(rule);\n if (!compiled) continue;\n const list = byField.get(rule.field);\n if (list) list.push(compiled);\n else byField.set(rule.field, [compiled]);\n }\n return { byField, isEmpty: byField.size === 0 };\n}\n\n/**\n * Resolve the highlight class for one cell. First matching rule wins (Excel's\n * precedence: rules are ordered and the first one that fires paints the cell).\n * Returns `undefined` when nothing matches, so the caller can fall through to\n * the code-level `cellClassName` hook.\n */\nexport function conditionalFormatClassName(\n compiled: CompiledConditionalFormats,\n field: string,\n value: unknown,\n rowData: any,\n): string | undefined {\n if (compiled.isEmpty) return undefined;\n const rules = compiled.byField.get(field);\n if (!rules) return undefined;\n for (const rule of rules) {\n if (rule.test(value, rowData)) return rule.className;\n }\n return undefined;\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }