@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,426 @@
1
+ function tableContent(tableId) {
2
+ return { kind: "table", tableId };
3
+ }
4
+ function paneTableId(node) {
5
+ return node.content.kind === "table" ? node.content.tableId : null;
6
+ }
7
+ const SPLIT_LAYOUT_VERSION = 3;
8
+ const PANE_MIN_WIDTH_PX = 420;
9
+ const PANE_MIN_HEIGHT_PX = 220;
10
+ function makePaneId() {
11
+ return `p${Math.random().toString(36).slice(2, 9)}`;
12
+ }
13
+ function evenSizes(count) {
14
+ if (count <= 0) return [];
15
+ return Array.from({ length: count }, () => 1 / count);
16
+ }
17
+ function normalize(sizes) {
18
+ const total = sizes.reduce((sum, size) => sum + size, 0);
19
+ if (total <= 0) return evenSizes(sizes.length);
20
+ return sizes.map((size) => size / total);
21
+ }
22
+ function normalizeIfNeeded(sizes) {
23
+ const total = sizes.reduce((sum, size) => sum + size, 0);
24
+ return Math.abs(total - 1) > 1e-9 ? normalize(sizes) : sizes;
25
+ }
26
+ function isChrome(value) {
27
+ return !!value && typeof value === "object" && !Array.isArray(value);
28
+ }
29
+ function readContent(node) {
30
+ const content = node.content;
31
+ if (content && typeof content === "object") {
32
+ if (content.kind === "table" && typeof content.tableId === "string" && content.tableId) {
33
+ return { kind: "table", tableId: content.tableId };
34
+ }
35
+ if (content.kind === "widget" && typeof content.widgetId === "string" && content.widgetId && typeof content.loaderKey === "string" && content.loaderKey) {
36
+ const ref = {
37
+ kind: "widget",
38
+ widgetId: content.widgetId,
39
+ loaderKey: content.loaderKey
40
+ };
41
+ return "settings" in content ? { ...ref, settings: content.settings } : ref;
42
+ }
43
+ return null;
44
+ }
45
+ if (typeof node.tableId === "string" && node.tableId) return { kind: "table", tableId: node.tableId };
46
+ return null;
47
+ }
48
+ function readNode(value) {
49
+ if (!value || typeof value !== "object") return null;
50
+ const node = value;
51
+ if (node.kind === "empty") {
52
+ return { kind: "empty", id: typeof node.id === "string" && node.id ? node.id : makePaneId() };
53
+ }
54
+ if (node.kind === "pane") {
55
+ const content = readContent(node);
56
+ if (!content) return null;
57
+ const pane = { kind: "pane", id: typeof node.id === "string" && node.id ? node.id : makePaneId(), content };
58
+ return isChrome(node.chrome) ? { ...pane, chrome: node.chrome } : pane;
59
+ }
60
+ if (node.kind === "split") {
61
+ const rawChildren = Array.isArray(node.children) ? node.children : [];
62
+ const rawSizes = Array.isArray(node.sizes) ? node.sizes : [];
63
+ const children = [];
64
+ const sizes = [];
65
+ rawChildren.forEach((child, index) => {
66
+ const parsed = readNode(child);
67
+ if (!parsed) return;
68
+ children.push(parsed);
69
+ const size = rawSizes[index];
70
+ sizes.push(typeof size === "number" && size > 0 ? size : 1 / rawChildren.length);
71
+ });
72
+ if (children.length === 0) return null;
73
+ if (children.length === 1) return children[0];
74
+ return {
75
+ kind: "split",
76
+ direction: node.direction === "column" ? "column" : "row",
77
+ sizes: normalizeIfNeeded(sizes),
78
+ children
79
+ };
80
+ }
81
+ return null;
82
+ }
83
+ function normalizeLayout(input, fallbackTableId) {
84
+ const single = () => ({
85
+ root: { kind: "pane", id: makePaneId(), content: tableContent(fallbackTableId) },
86
+ version: SPLIT_LAYOUT_VERSION
87
+ });
88
+ if (!input || typeof input !== "object") return single();
89
+ const doc = input;
90
+ const version = typeof doc.version === "number" ? doc.version : null;
91
+ if (version !== null && version > SPLIT_LAYOUT_VERSION) return single();
92
+ const carry = (layout) => {
93
+ const next = { ...layout, version: SPLIT_LAYOUT_VERSION };
94
+ if (doc.sharedCriteria !== void 0) next.sharedCriteria = doc.sharedCriteria;
95
+ if (typeof doc.sharedFiltersEnabled === "boolean") next.sharedFiltersEnabled = doc.sharedFiltersEnabled;
96
+ return next;
97
+ };
98
+ if (version === null || version >= 2) {
99
+ const root = readNode(doc.root);
100
+ if (root) return carry({ root });
101
+ }
102
+ if (Array.isArray(doc.panes) && doc.panes.length > 0) {
103
+ const children = doc.panes.map((pane) => readNode({ ...pane, kind: "pane" })).filter((node) => node !== null);
104
+ if (children.length === 1) return carry({ root: children[0] });
105
+ if (children.length > 1) {
106
+ return carry({
107
+ root: {
108
+ kind: "split",
109
+ direction: doc.direction === "column" ? "column" : "row",
110
+ sizes: Array.isArray(doc.sizes) && doc.sizes.length === children.length ? normalizeIfNeeded(doc.sizes) : evenSizes(children.length),
111
+ children
112
+ }
113
+ });
114
+ }
115
+ }
116
+ return single();
117
+ }
118
+ function listPanes(node) {
119
+ if (node.kind === "pane") return [node];
120
+ if (node.kind === "empty") return [];
121
+ return node.children.flatMap(listPanes);
122
+ }
123
+ function listSlots(node) {
124
+ if (node.kind === "split") return node.children.flatMap(listSlots);
125
+ return [node];
126
+ }
127
+ function countPanes(node) {
128
+ return listPanes(node).length;
129
+ }
130
+ function countSlots(node) {
131
+ return listSlots(node).length;
132
+ }
133
+ function getNode(root, path) {
134
+ let current = root;
135
+ for (const index of path) {
136
+ if (current.kind !== "split") return null;
137
+ const next = current.children[index];
138
+ if (!next) return null;
139
+ current = next;
140
+ }
141
+ return current;
142
+ }
143
+ function replaceNode(root, path, next) {
144
+ if (path.length === 0) return next;
145
+ if (root.kind !== "split") return root;
146
+ const [head, ...rest] = path;
147
+ const children = [...root.children];
148
+ if (!children[head]) return root;
149
+ children[head] = replaceNode(children[head], rest, next);
150
+ return { ...root, children };
151
+ }
152
+ function findSlotPath(root, slotId, path = []) {
153
+ if (root.kind !== "split") return root.id === slotId ? path : null;
154
+ for (let index = 0; index < root.children.length; index++) {
155
+ const found = findSlotPath(root.children[index], slotId, [...path, index]);
156
+ if (found) return found;
157
+ }
158
+ return null;
159
+ }
160
+ function fillSlot(layout, slotId, content) {
161
+ const path = findSlotPath(layout.root, slotId);
162
+ if (!path) return layout;
163
+ const node = getNode(layout.root, path);
164
+ if (!node || node.kind !== "empty") return layout;
165
+ const pane = { kind: "pane", id: node.id, content };
166
+ return { ...layout, root: replaceNode(layout.root, path, pane) };
167
+ }
168
+ function splitPane(layout, targetSlotId, content, direction, before = false) {
169
+ const path = findSlotPath(layout.root, targetSlotId);
170
+ if (!path) return layout;
171
+ const target = getNode(layout.root, path);
172
+ if (target?.kind === "empty") return fillSlot(layout, targetSlotId, content);
173
+ const newPane = { kind: "pane", id: makePaneId(), content };
174
+ if (path.length === 0) {
175
+ return {
176
+ ...layout,
177
+ root: {
178
+ kind: "split",
179
+ direction,
180
+ sizes: [0.5, 0.5],
181
+ children: before ? [newPane, layout.root] : [layout.root, newPane]
182
+ }
183
+ };
184
+ }
185
+ const parentPath = path.slice(0, -1);
186
+ const indexInParent = path[path.length - 1];
187
+ const parent = getNode(layout.root, parentPath);
188
+ if (!parent || parent.kind !== "split") return layout;
189
+ if (parent.direction === direction) {
190
+ const children = [...parent.children];
191
+ const sizes = [...parent.sizes];
192
+ const share = sizes[indexInParent] ?? 1 / children.length;
193
+ sizes[indexInParent] = share / 2;
194
+ const at = before ? indexInParent : indexInParent + 1;
195
+ children.splice(at, 0, newPane);
196
+ sizes.splice(at, 0, share / 2);
197
+ return {
198
+ ...layout,
199
+ root: replaceNode(layout.root, parentPath, { ...parent, children, sizes: normalize(sizes) })
200
+ };
201
+ }
202
+ const wrapped = {
203
+ kind: "split",
204
+ direction,
205
+ sizes: [0.5, 0.5],
206
+ children: before ? [newPane, parent.children[indexInParent]] : [parent.children[indexInParent], newPane]
207
+ };
208
+ return { ...layout, root: replaceNode(layout.root, parentPath.concat(indexInParent), wrapped) };
209
+ }
210
+ function removePane(layout, slotId) {
211
+ const path = findSlotPath(layout.root, slotId);
212
+ if (!path) return layout;
213
+ if (path.length === 0) {
214
+ if (layout.root.kind !== "pane") return layout;
215
+ return { ...layout, root: { kind: "empty", id: layout.root.id } };
216
+ }
217
+ const parentPath = path.slice(0, -1);
218
+ const indexInParent = path[path.length - 1];
219
+ const parent = getNode(layout.root, parentPath);
220
+ if (!parent || parent.kind !== "split") return layout;
221
+ const children = parent.children.filter((_, index) => index !== indexInParent);
222
+ const sizes = [...parent.sizes];
223
+ const [freed] = sizes.splice(indexInParent, 1);
224
+ const neighbour = Math.min(indexInParent, sizes.length - 1);
225
+ if (sizes[neighbour] !== void 0) sizes[neighbour] += freed ?? 0;
226
+ const next = children.length === 0 ? { kind: "empty", id: makePaneId() } : children.length === 1 ? children[0] : { ...parent, children, sizes: normalize(sizes) };
227
+ return { ...layout, root: replaceNode(layout.root, parentPath, next) };
228
+ }
229
+ function resizeAt(layout, splitPath, index, deltaFraction) {
230
+ const node = getNode(layout.root, splitPath);
231
+ if (!node || node.kind !== "split") return layout;
232
+ const sizes = [...node.sizes];
233
+ if (index < 0 || index >= sizes.length - 1) return layout;
234
+ const next = sizes[index] + deltaFraction;
235
+ const nextSibling = sizes[index + 1] - deltaFraction;
236
+ if (next <= 0.05 || nextSibling <= 0.05) return layout;
237
+ sizes[index] = next;
238
+ sizes[index + 1] = nextSibling;
239
+ return {
240
+ ...layout,
241
+ root: replaceNode(layout.root, splitPath, { ...node, sizes: normalize(sizes) })
242
+ };
243
+ }
244
+ function setPaneChrome(layout, paneId, patch) {
245
+ const path = findSlotPath(layout.root, paneId);
246
+ if (!path) return layout;
247
+ const node = getNode(layout.root, path);
248
+ if (!node || node.kind !== "pane") return layout;
249
+ const next = { ...node, chrome: { ...node.chrome, ...patch } };
250
+ return { ...layout, root: replaceNode(layout.root, path, next) };
251
+ }
252
+ function setPaneContentSettings(layout, paneId, settings) {
253
+ const path = findSlotPath(layout.root, paneId);
254
+ if (!path) return layout;
255
+ const node = getNode(layout.root, path);
256
+ if (!node || node.kind !== "pane" || node.content.kind !== "widget") return layout;
257
+ const next = { ...node, content: { ...node.content, settings } };
258
+ return { ...layout, root: replaceNode(layout.root, path, next) };
259
+ }
260
+ function setAllPaneChrome(node, chrome) {
261
+ if (node.kind === "pane") return { ...node, chrome: { ...node.chrome, ...chrome } };
262
+ if (node.kind === "empty") return node;
263
+ return { ...node, children: node.children.map((child) => setAllPaneChrome(child, chrome)) };
264
+ }
265
+ function evenAll(node) {
266
+ if (node.kind !== "split") return node;
267
+ return { ...node, sizes: evenSizes(node.children.length), children: node.children.map(evenAll) };
268
+ }
269
+ function emptySlot() {
270
+ return { kind: "empty", id: makePaneId() };
271
+ }
272
+ function splitOf(direction, children) {
273
+ return { kind: "split", direction, sizes: evenSizes(children.length), children };
274
+ }
275
+ const GRID_TEMPLATES = {
276
+ "2x1": {
277
+ id: "2x1",
278
+ label: "Two columns",
279
+ hint: "Side by side",
280
+ slots: 2,
281
+ build: () => splitOf("row", [emptySlot(), emptySlot()])
282
+ },
283
+ "1x2": {
284
+ id: "1x2",
285
+ label: "Two rows",
286
+ hint: "Stacked",
287
+ slots: 2,
288
+ build: () => splitOf("column", [emptySlot(), emptySlot()])
289
+ },
290
+ "2x2": {
291
+ id: "2x2",
292
+ label: "Four cells",
293
+ hint: "Two by two",
294
+ slots: 4,
295
+ build: () => splitOf("column", [
296
+ splitOf("row", [emptySlot(), emptySlot()]),
297
+ splitOf("row", [emptySlot(), emptySlot()])
298
+ ])
299
+ },
300
+ "3-up": {
301
+ id: "3-up",
302
+ label: "Three columns",
303
+ hint: "All in one row",
304
+ slots: 3,
305
+ build: () => splitOf("row", [emptySlot(), emptySlot(), emptySlot()])
306
+ },
307
+ "two-top-one-below": {
308
+ id: "two-top-one-below",
309
+ label: "Two on top, one below",
310
+ hint: "Pair above, full width beneath",
311
+ slots: 3,
312
+ build: () => splitOf("column", [splitOf("row", [emptySlot(), emptySlot()]), emptySlot()])
313
+ },
314
+ "1+2": {
315
+ id: "1+2",
316
+ label: "One left, two right",
317
+ hint: "Full height beside a stacked pair",
318
+ slots: 3,
319
+ build: () => splitOf("row", [emptySlot(), splitOf("column", [emptySlot(), emptySlot()])])
320
+ }
321
+ };
322
+ const GRID_TEMPLATE_LIST = Object.values(GRID_TEMPLATES);
323
+ function applyGridTemplate(layout, templateId) {
324
+ const template = GRID_TEMPLATES[templateId];
325
+ if (!template) return layout;
326
+ const existing = listPanes(layout.root);
327
+ let next = 0;
328
+ const fill = (node) => {
329
+ if (node.kind === "split") return { ...node, children: node.children.map(fill) };
330
+ const pane = existing[next];
331
+ next += 1;
332
+ return pane ? { ...pane } : node;
333
+ };
334
+ return { ...layout, root: fill(template.build()) };
335
+ }
336
+ function applyPreset(layout, preset) {
337
+ const panes = listPanes(layout.root);
338
+ if (panes.length === 0) return layout;
339
+ if (panes.length === 1) return { ...layout, root: panes[0] };
340
+ const row = (children) => ({
341
+ kind: "split",
342
+ direction: "row",
343
+ sizes: evenSizes(children.length),
344
+ children
345
+ });
346
+ switch (preset) {
347
+ case "columns":
348
+ return { ...layout, root: row(panes) };
349
+ case "rows":
350
+ return {
351
+ ...layout,
352
+ root: { kind: "split", direction: "column", sizes: evenSizes(panes.length), children: panes }
353
+ };
354
+ case "two-top-one-below": {
355
+ if (panes.length < 3) return { ...layout, root: row(panes) };
356
+ const top = row(panes.slice(0, 2));
357
+ const below = panes.slice(2);
358
+ const bottom = below.length === 1 ? below[0] : row(below);
359
+ return {
360
+ ...layout,
361
+ root: { kind: "split", direction: "column", sizes: [0.5, 0.5], children: [top, bottom] }
362
+ };
363
+ }
364
+ case "one-top-two-below": {
365
+ if (panes.length < 3) return { ...layout, root: row(panes) };
366
+ return {
367
+ ...layout,
368
+ root: {
369
+ kind: "split",
370
+ direction: "column",
371
+ sizes: [0.5, 0.5],
372
+ children: [panes[0], row(panes.slice(1))]
373
+ }
374
+ };
375
+ }
376
+ case "grid": {
377
+ const pairs = [];
378
+ for (let index = 0; index < panes.length; index += 2) {
379
+ const pair = panes.slice(index, index + 2);
380
+ pairs.push(pair.length === 1 ? pair[0] : row(pair));
381
+ }
382
+ return {
383
+ ...layout,
384
+ root: { kind: "split", direction: "column", sizes: evenSizes(pairs.length), children: pairs }
385
+ };
386
+ }
387
+ default:
388
+ return layout;
389
+ }
390
+ }
391
+ const ARRANGE_PRESETS = [
392
+ { id: "columns", label: "Side by side", hint: "All in one row", minPanes: 2 },
393
+ { id: "rows", label: "Stacked", hint: "All in one column", minPanes: 2 },
394
+ { id: "two-top-one-below", label: "Two on top, one below", hint: "Pair above, full width beneath", minPanes: 3 },
395
+ { id: "one-top-two-below", label: "One on top, two below", hint: "Full width above, pair beneath", minPanes: 3 },
396
+ { id: "grid", label: "Grid", hint: "Two per row", minPanes: 4 }
397
+ ];
398
+ export {
399
+ ARRANGE_PRESETS,
400
+ GRID_TEMPLATES,
401
+ GRID_TEMPLATE_LIST,
402
+ PANE_MIN_HEIGHT_PX,
403
+ PANE_MIN_WIDTH_PX,
404
+ SPLIT_LAYOUT_VERSION,
405
+ applyGridTemplate,
406
+ applyPreset,
407
+ countPanes,
408
+ countSlots,
409
+ evenAll,
410
+ evenSizes,
411
+ fillSlot,
412
+ getNode,
413
+ listPanes,
414
+ listSlots,
415
+ makePaneId,
416
+ normalizeLayout,
417
+ paneTableId,
418
+ removePane,
419
+ resizeAt,
420
+ setAllPaneChrome,
421
+ setPaneChrome,
422
+ setPaneContentSettings,
423
+ splitPane,
424
+ tableContent
425
+ };
426
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/backend/dynamic-table/split-view/types.ts"],
4
+ "sourcesContent": ["// Split view \u2014 a composable workspace: a tree of SLOTS, each holding a table,\n// a widget, or nothing yet.\n// Specs: .ai/specs/2026-08-04-dynamic-table-split-view.md (the tree)\n// .ai/specs/2026-08-17-split-view-workspace-composition.md (slots + templates)\n\n/** Arrangement axis for one split node. 'row' = side by side, 'column' = stacked. */\nexport type SplitDirection = 'row' | 'column'\n\n/**\n * Which chrome rows a pane shows. All default ON.\n *\n * Chrome is the scarce resource in a split: a pane used to spend ~150px on a\n * pane header, a toolbar repeating the same title, a views row and pagination\n * before a single data row \u2014 multiplied by pane count. These let a user spend\n * that budget where they want it.\n */\nexport type PaneChrome = {\n /** The whole top strip: title, search and the action buttons. */\n toolbar?: boolean\n search?: boolean\n /**\n * The whole second bar \u2014 saved-view tabs AND pagination together.\n *\n * These were separate toggles. Splitting them was a mistake: they share one\n * row, so hiding either alone reclaimed nothing, and the entire point of\n * these switches is vertical space. One toggle, one row, one row's worth of\n * space back.\n */\n viewsBar?: boolean\n}\n\n/**\n * WHAT a pane holds, as opposed to WHERE it sits.\n *\n * Split out of `PaneNode` (which carried a bare `tableId`) so a pane can hold a\n * dashboard widget without a second node kind and without a second breaking\n * change: adding a variant to this union is additive, and every layout\n * algorithm below is written against the union rather than against `tableId`.\n *\n * `loaderKey` is stored alongside `widgetId` because the widget catalogue is\n * fetched at runtime \u2014 a saved layout must be resolvable without re-deriving\n * it. Both ids are OPAQUE strings: no FK, no cross-module relation, and ACL is\n * re-checked at render rather than trusted from storage.\n */\nexport type PaneContentRef =\n | { kind: 'table'; tableId: string }\n | { kind: 'widget'; widgetId: string; loaderKey: string; settings?: unknown }\n\n/** Convenience constructor \u2014 the overwhelmingly common case. */\nexport function tableContent(tableId: string): PaneContentRef {\n return { kind: 'table', tableId }\n}\n\n/** The table id a pane shows, or `null` when it holds something else. */\nexport function paneTableId(node: PaneNode): string | null {\n return node.content.kind === 'table' ? node.content.tableId : null\n}\n\nexport type PaneNode = {\n kind: 'pane'\n /** Absent = everything shown. */\n chrome?: PaneChrome\n /** Stable per-slot id; also seeds `storageScope`, so two panes of the same\n * table keep independent perspectives and column widths. Preserved across\n * every migration \u2014 losing it silently discards the user's column widths. */\n id: string\n content: PaneContentRef\n}\n\n/**\n * A slot with nothing in it yet.\n *\n * Grid templates are the reason this exists: \"give me a 2\u00D72 and let me decide\n * the contents afterwards\" is unrepresentable when a pane requires content at\n * creation. The alternative \u2014 prompting N times the moment a template is\n * picked \u2014 makes the first run modal and forbids \"leave that one empty\".\n */\nexport type EmptyNode = { kind: 'empty'; id: string }\n\nexport type SplitNode = {\n kind: 'split'\n direction: SplitDirection\n /** Fractions summing to 1, one per child. */\n sizes: number[]\n children: LayoutNode[]\n}\n\nexport type LayoutNode = PaneNode | EmptyNode | SplitNode\n\n/** A pane or an empty slot \u2014 anything that occupies one cell of the layout. */\nexport type SlotNode = PaneNode | EmptyNode\n\n/**\n * A TREE, not a flat list.\n *\n * v1 was flat \u2014 one axis, N panes \u2014 and could not express the arrangement users\n * asked for first: two tables side by side with a third full-width beneath.\n * That is a row nested inside a column, and no arrangement of flags on a flat\n * list produces it. The tree is the smallest model that does, and it subsumes\n * the flat cases (one split node with N children IS the old layout).\n *\n * Versions:\n * 1 \u2014 flat `{ panes, sizes, direction }`\n * 2 \u2014 tree of `{ kind:'pane', tableId }` / `{ kind:'split' }`\n * 3 \u2014 tree of `{ kind:'pane', content }` / `{ kind:'empty' }` / `{ kind:'split' }`\n *\n * v1 and v2 documents are migrated on read by `normalizeLayout`, preserving\n * pane ids, so every layout saved before this still opens with its stored\n * column widths intact.\n */\nexport type SplitLayout = {\n root: LayoutNode\n version?: number\n /**\n * Workspace-level shared search + rules, and the toggle that arms them.\n *\n * Deliberately OPAQUE here. The closed criterion vocabulary and the\n * per-table mapping are a later phase's business (`sharedCriteria.ts`); this\n * layer only has to carry them through a write/read cycle without dropping\n * them, which is exactly what an opaque field guarantees.\n */\n sharedCriteria?: unknown\n sharedFiltersEnabled?: boolean\n}\n\nexport const SPLIT_LAYOUT_VERSION = 3\n\n/** The shape v1 persisted. Kept so saved layouts remain readable. */\nexport type LegacySplitLayoutV1 = {\n panes: Array<{ id: string; tableId: string }>\n sizes: number[]\n direction?: SplitDirection\n}\n\n/**\n * Floor for a pane's width. Below this a grid cannot show a frozen column, one\n * data column and the row-actions gutter, so it would show nothing useful.\n * Paired with the compact toolbar's 520px container-query step.\n */\nexport const PANE_MIN_WIDTH_PX = 420\n\n/**\n * Floor for a pane's height when stacked. Smaller than the width floor because\n * the constraint differs: a short pane still shows its toolbar and a few rows,\n * whereas a narrow pane cannot show two columns at all.\n */\nexport const PANE_MIN_HEIGHT_PX = 220\n\nexport function makePaneId(): string {\n // Not crypto.randomUUID(): a readable id makes a saved layout debuggable by\n // eye, and this is a client-side key, never a security token.\n return `p${Math.random().toString(36).slice(2, 9)}`\n}\n\nexport function evenSizes(count: number): number[] {\n if (count <= 0) return []\n return Array.from({ length: count }, () => 1 / count)\n}\n\nfunction normalize(sizes: number[]): number[] {\n const total = sizes.reduce((sum, size) => sum + size, 0)\n if (total <= 0) return evenSizes(sizes.length)\n return sizes.map((size) => size / total)\n}\n\n/**\n * Re-normalise ONLY when the shares no longer add up \u2014 a child was dropped, or\n * the document was hand-written. Normalising unconditionally rewrites a user's\n * divider positions by a float epsilon on every single read.\n */\nfunction normalizeIfNeeded(sizes: number[]): number[] {\n const total = sizes.reduce((sum, size) => sum + size, 0)\n return Math.abs(total - 1) > 1e-9 ? normalize(sizes) : sizes\n}\n\n// \u2500\u2500 Reading \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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\nfunction isChrome(value: unknown): value is PaneChrome {\n return !!value && typeof value === 'object' && !Array.isArray(value)\n}\n\n/**\n * Lift whatever a stored pane carried into a v3 content ref.\n *\n * v2 wrote `tableId` on the pane itself; v3 writes `content`. Both are read\n * here \u2014 the v2 branch is the entire reason a four-pane arrangement saved last\n * week still opens today.\n */\nfunction readContent(node: Record<string, unknown>): PaneContentRef | null {\n const content = node.content as Record<string, unknown> | undefined\n if (content && typeof content === 'object') {\n if (content.kind === 'table' && typeof content.tableId === 'string' && content.tableId) {\n return { kind: 'table', tableId: content.tableId }\n }\n if (\n content.kind === 'widget' &&\n typeof content.widgetId === 'string' &&\n content.widgetId &&\n typeof content.loaderKey === 'string' &&\n content.loaderKey\n ) {\n const ref: PaneContentRef = {\n kind: 'widget',\n widgetId: content.widgetId,\n loaderKey: content.loaderKey,\n }\n return 'settings' in content ? { ...ref, settings: content.settings } : ref\n }\n return null\n }\n // v2 and v1: the table id sat directly on the pane.\n if (typeof node.tableId === 'string' && node.tableId) return { kind: 'table', tableId: node.tableId }\n return null\n}\n\n/** Parse one stored node into v3, or `null` when it carries nothing usable. */\nfunction readNode(value: unknown): LayoutNode | null {\n if (!value || typeof value !== 'object') return null\n const node = value as Record<string, unknown>\n\n if (node.kind === 'empty') {\n return { kind: 'empty', id: typeof node.id === 'string' && node.id ? node.id : makePaneId() }\n }\n\n if (node.kind === 'pane') {\n const content = readContent(node)\n if (!content) return null\n // The pane id seeds `storageScope`. Minting a fresh one here would hand\n // every reload a new key and silently discard the user's column widths \u2014\n // this exact bug has already shipped once.\n const pane: PaneNode = { kind: 'pane', id: typeof node.id === 'string' && node.id ? node.id : makePaneId(), content }\n return isChrome(node.chrome) ? { ...pane, chrome: node.chrome as PaneChrome } : pane\n }\n\n if (node.kind === 'split') {\n const rawChildren = Array.isArray(node.children) ? node.children : []\n const rawSizes = Array.isArray(node.sizes) ? (node.sizes as unknown[]) : []\n const children: LayoutNode[] = []\n const sizes: number[] = []\n rawChildren.forEach((child, index) => {\n const parsed = readNode(child)\n if (!parsed) return\n children.push(parsed)\n const size = rawSizes[index]\n sizes.push(typeof size === 'number' && size > 0 ? size : 1 / rawChildren.length)\n })\n if (children.length === 0) return null\n // A split with one surviving child is not a split any more; keeping it\n // would accumulate junk nodes across add/remove cycles.\n if (children.length === 1) return children[0]\n return {\n kind: 'split',\n direction: node.direction === 'column' ? 'column' : 'row',\n sizes: normalizeIfNeeded(sizes),\n children,\n }\n }\n\n return null\n}\n\n/**\n * Accepts a v3 tree, a v2 tree, a v1 flat document, or junk; always yields a\n * usable tree.\n *\n * The stored `version` is CONSULTED, with shape-sniffing as the fallback. It\n * used to be written, stored and echoed in DTOs but never read \u2014 the entity's\n * own comment claimed \"an unknown version is ignored on read\", which was not\n * what happened. A document from a future version is now treated as unreadable\n * (single default pane) rather than half-parsed.\n */\nexport function normalizeLayout(input: unknown, fallbackTableId: string): SplitLayout {\n const single = (): SplitLayout => ({\n root: { kind: 'pane', id: makePaneId(), content: tableContent(fallbackTableId) },\n version: SPLIT_LAYOUT_VERSION,\n })\n if (!input || typeof input !== 'object') return single()\n\n const doc = input as Partial<SplitLayout> & Partial<LegacySplitLayoutV1>\n const version = typeof doc.version === 'number' ? doc.version : null\n if (version !== null && version > SPLIT_LAYOUT_VERSION) return single()\n\n const carry = (layout: SplitLayout): SplitLayout => {\n const next: SplitLayout = { ...layout, version: SPLIT_LAYOUT_VERSION }\n if (doc.sharedCriteria !== undefined) next.sharedCriteria = doc.sharedCriteria\n if (typeof doc.sharedFiltersEnabled === 'boolean') next.sharedFiltersEnabled = doc.sharedFiltersEnabled\n return next\n }\n\n // v2 / v3 \u2014 a tree. Sniffed as the fallback when `version` is absent, which\n // every document written before the version was read will be.\n if (version === null || version >= 2) {\n const root = readNode(doc.root)\n if (root) return carry({ root })\n }\n\n // v1 \u2014 a flat pane list.\n if (Array.isArray(doc.panes) && doc.panes.length > 0) {\n const children: LayoutNode[] = doc.panes\n .map((pane) => readNode({ ...pane, kind: 'pane' }))\n .filter((node): node is LayoutNode => node !== null)\n if (children.length === 1) return carry({ root: children[0] })\n if (children.length > 1) {\n return carry({\n root: {\n kind: 'split',\n direction: doc.direction === 'column' ? 'column' : 'row',\n sizes:\n Array.isArray(doc.sizes) && doc.sizes.length === children.length\n ? normalizeIfNeeded(doc.sizes)\n : evenSizes(children.length),\n children,\n },\n })\n }\n }\n return single()\n}\n\n/**\n * Every PANE in document order. Empty slots are deliberately excluded: every\n * existing caller wants \"the tables on screen\", and quietly handing them holes\n * would put an id with no content into `openTableIds`, the primary-pane\n * calculation and the arrange presets.\n */\nexport function listPanes(node: LayoutNode): PaneNode[] {\n if (node.kind === 'pane') return [node]\n if (node.kind === 'empty') return []\n return node.children.flatMap(listPanes)\n}\n\n/** Every slot \u2014 panes AND empty ones \u2014 in document order. */\nexport function listSlots(node: LayoutNode): SlotNode[] {\n if (node.kind === 'split') return node.children.flatMap(listSlots)\n return [node]\n}\n\nexport function countPanes(node: LayoutNode): number {\n return listPanes(node).length\n}\n\n/** How many cells the layout has, filled or not. */\nexport function countSlots(node: LayoutNode): number {\n return listSlots(node).length\n}\n\n// \u2500\u2500 Addressing \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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// A node is addressed by its PATH from the root \u2014 the child index at each\n// level, so [0,1] is \"second child of the root's first child\". Paths stay valid\n// for the duration of a render, which is all a click or a splitter drag needs,\n// and they avoid minting ids for interior nodes.\n\nexport type NodePath = number[]\n\nexport function getNode(root: LayoutNode, path: NodePath): LayoutNode | null {\n let current: LayoutNode = root\n for (const index of path) {\n if (current.kind !== 'split') return null\n const next = current.children[index]\n if (!next) return null\n current = next\n }\n return current\n}\n\nfunction replaceNode(root: LayoutNode, path: NodePath, next: LayoutNode): LayoutNode {\n if (path.length === 0) return next\n if (root.kind !== 'split') return root\n const [head, ...rest] = path\n const children = [...root.children]\n if (!children[head]) return root\n children[head] = replaceNode(children[head], rest, next)\n return { ...root, children }\n}\n\n/** Path to a pane OR an empty slot \u2014 both are addressed by the same id space. */\nfunction findSlotPath(root: LayoutNode, slotId: string, path: NodePath = []): NodePath | null {\n if (root.kind !== 'split') return root.id === slotId ? path : null\n for (let index = 0; index < root.children.length; index++) {\n const found = findSlotPath(root.children[index], slotId, [...path, index])\n if (found) return found\n }\n return null\n}\n\n// \u2500\u2500 Mutation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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/** Fill an EMPTY slot in place \u2014 same id, same share, siblings untouched. */\nexport function fillSlot(layout: SplitLayout, slotId: string, content: PaneContentRef): SplitLayout {\n const path = findSlotPath(layout.root, slotId)\n if (!path) return layout\n const node = getNode(layout.root, path)\n if (!node || node.kind !== 'empty') return layout\n // The id survives the fill: it is this slot's `storageScope`, so a template\n // slot keeps its column widths if it is emptied and refilled.\n const pane: PaneNode = { kind: 'pane', id: node.id, content }\n return { ...layout, root: replaceNode(layout.root, path, pane) }\n}\n\n/**\n * Split `targetSlotId` along `direction`, inserting a pane for `content` after it.\n *\n * The new pane takes half of the TARGET's space, so the rest of the layout does\n * not move \u2014 splitting the pane you are looking at should not resize everything\n * else. When the target's parent already runs along `direction` the pane is\n * inserted as a sibling, rather than nesting a redundant split node.\n *\n * An EMPTY target is FILLED rather than split. Nesting a split inside a hole\n * the user asked to fill would turn one 2\u00D72 cell into two half-cells and answer\n * a question nobody asked.\n */\nexport function splitPane(\n layout: SplitLayout,\n targetSlotId: string,\n content: PaneContentRef,\n direction: SplitDirection,\n /** Insert on the leading side \u2014 left of a row, above a column. */\n before = false,\n): SplitLayout {\n const path = findSlotPath(layout.root, targetSlotId)\n if (!path) return layout\n\n const target = getNode(layout.root, path)\n if (target?.kind === 'empty') return fillSlot(layout, targetSlotId, content)\n\n const newPane: PaneNode = { kind: 'pane', id: makePaneId(), content }\n\n if (path.length === 0) {\n return {\n ...layout,\n root: {\n kind: 'split',\n direction,\n sizes: [0.5, 0.5],\n children: before ? [newPane, layout.root] : [layout.root, newPane],\n },\n }\n }\n\n const parentPath = path.slice(0, -1)\n const indexInParent = path[path.length - 1]\n const parent = getNode(layout.root, parentPath)\n if (!parent || parent.kind !== 'split') return layout\n\n if (parent.direction === direction) {\n const children = [...parent.children]\n const sizes = [...parent.sizes]\n const share = sizes[indexInParent] ?? 1 / children.length\n sizes[indexInParent] = share / 2\n const at = before ? indexInParent : indexInParent + 1\n children.splice(at, 0, newPane)\n sizes.splice(at, 0, share / 2)\n return {\n ...layout,\n root: replaceNode(layout.root, parentPath, { ...parent, children, sizes: normalize(sizes) }),\n }\n }\n\n // Different axis \u2014 wrap the target in a nested split. THIS is what makes\n // \"two side by side, one full-width below\" expressible at all.\n const wrapped: SplitNode = {\n kind: 'split',\n direction,\n sizes: [0.5, 0.5],\n children: before ? [newPane, parent.children[indexInParent]] : [parent.children[indexInParent], newPane],\n }\n return { ...layout, root: replaceNode(layout.root, parentPath.concat(indexInParent), wrapped) }\n}\n\n/**\n * Remove a slot; its share goes to a sibling, and a split left with one child\n * collapses into that child.\n *\n * Removing the LAST pane leaves an empty slot rather than refusing: with\n * templates in play \"close this table but keep the cell\" is a real intent, and\n * an empty slot is recoverable from the UI whereas a childless split is not\n * representable at all.\n */\nexport function removePane(layout: SplitLayout, slotId: string): SplitLayout {\n const path = findSlotPath(layout.root, slotId)\n if (!path) return layout\n\n if (path.length === 0) {\n // The root slot. A pane becomes an empty slot; an already-empty root has\n // nothing to remove (the tree must always have a node).\n if (layout.root.kind !== 'pane') return layout\n return { ...layout, root: { kind: 'empty', id: layout.root.id } }\n }\n\n const parentPath = path.slice(0, -1)\n const indexInParent = path[path.length - 1]\n const parent = getNode(layout.root, parentPath)\n if (!parent || parent.kind !== 'split') return layout\n\n const children = parent.children.filter((_, index) => index !== indexInParent)\n const sizes = [...parent.sizes]\n const [freed] = sizes.splice(indexInParent, 1)\n const neighbour = Math.min(indexInParent, sizes.length - 1)\n if (sizes[neighbour] !== undefined) sizes[neighbour] += freed ?? 0\n\n // A split with one child is meaningless \u2014 collapse into that child, empty or\n // not, or the tree accumulates junk nodes with every add/remove cycle.\n const next: LayoutNode =\n children.length === 0\n ? { kind: 'empty', id: makePaneId() }\n : children.length === 1\n ? children[0]\n : { ...parent, children, sizes: normalize(sizes) }\n return { ...layout, root: replaceNode(layout.root, parentPath, next) }\n}\n\n/** Resize the boundary between children `index` and `index + 1` of one split node. */\nexport function resizeAt(\n layout: SplitLayout,\n splitPath: NodePath,\n index: number,\n deltaFraction: number,\n): SplitLayout {\n const node = getNode(layout.root, splitPath)\n if (!node || node.kind !== 'split') return layout\n const sizes = [...node.sizes]\n if (index < 0 || index >= sizes.length - 1) return layout\n const next = sizes[index] + deltaFraction\n const nextSibling = sizes[index + 1] - deltaFraction\n // Guard both sides so a fast drag cannot invert a pane into a negative share.\n // Empty slots clamp exactly like filled ones: a hole you cannot see is a hole\n // you cannot drop anything into.\n if (next <= 0.05 || nextSibling <= 0.05) return layout\n sizes[index] = next\n sizes[index + 1] = nextSibling\n return {\n ...layout,\n root: replaceNode(layout.root, splitPath, { ...node, sizes: normalize(sizes) }),\n }\n}\n\n/** Toggle one chrome row on a single pane. */\nexport function setPaneChrome(\n layout: SplitLayout,\n paneId: string,\n patch: Partial<PaneChrome>,\n): SplitLayout {\n const path = findSlotPath(layout.root, paneId)\n if (!path) return layout\n const node = getNode(layout.root, path)\n if (!node || node.kind !== 'pane') return layout\n const next: PaneNode = { ...node, chrome: { ...node.chrome, ...patch } }\n return { ...layout, root: replaceNode(layout.root, path, next) }\n}\n\n/**\n * Store a widget pane's settings on its SLOT.\n *\n * The host owns the layout tree and its persistence, so a widget's settings\n * ride on the slot rather than being written by the pane itself \u2014 two writers\n * to one document would race, and the working layout is saved by a single\n * `setLayout` funnel precisely to avoid that.\n *\n * Keyed on the slot, not the widget id, so the same widget in two panes keeps\n * two independent configurations.\n *\n * A no-op on table panes: a table's per-instance state already lives under its\n * `storageScope`, and silently growing a `settings` bag on it would create a\n * second, competing place for the same thing.\n */\nexport function setPaneContentSettings(\n layout: SplitLayout,\n paneId: string,\n settings: unknown,\n): SplitLayout {\n const path = findSlotPath(layout.root, paneId)\n if (!path) return layout\n const node = getNode(layout.root, path)\n if (!node || node.kind !== 'pane' || node.content.kind !== 'widget') return layout\n const next: PaneNode = { ...node, content: { ...node.content, settings } }\n return { ...layout, root: replaceNode(layout.root, path, next) }\n}\n\n/** Turn every chrome row off across the whole layout \u2014 the \"maximum rows\" shortcut. */\nexport function setAllPaneChrome(node: LayoutNode, chrome: PaneChrome): LayoutNode {\n if (node.kind === 'pane') return { ...node, chrome: { ...node.chrome, ...chrome } }\n if (node.kind === 'empty') return node\n return { ...node, children: node.children.map((child) => setAllPaneChrome(child, chrome)) }\n}\n\n/** Reset every split in the tree to equal shares. */\nexport function evenAll(node: LayoutNode): LayoutNode {\n if (node.kind !== 'split') return node\n return { ...node, sizes: evenSizes(node.children.length), children: node.children.map(evenAll) }\n}\n\n// \u2500\u2500 Grid templates \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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// Templates CREATE slots; the arrange presets below RE-SHAPE panes that already\n// exist. Two concepts, one menu, two labelled sections \u2014 the distinction is\n// \"how many cells\" versus \"where the cells go\".\n\nexport type GridTemplateId = '2x1' | '1x2' | '2x2' | '3-up' | 'two-top-one-below' | '1+2'\n\nfunction emptySlot(): EmptyNode {\n return { kind: 'empty', id: makePaneId() }\n}\n\nfunction splitOf(direction: SplitDirection, children: LayoutNode[]): SplitNode {\n return { kind: 'split', direction, sizes: evenSizes(children.length), children }\n}\n\nexport type GridTemplate = {\n id: GridTemplateId\n label: string\n hint: string\n /** How many cells the template creates. */\n slots: number\n /** Fresh ids on every call \u2014 two instantiations must not share storage scopes. */\n build: () => LayoutNode\n}\n\nexport const GRID_TEMPLATES: Record<GridTemplateId, GridTemplate> = {\n '2x1': {\n id: '2x1',\n label: 'Two columns',\n hint: 'Side by side',\n slots: 2,\n build: () => splitOf('row', [emptySlot(), emptySlot()]),\n },\n '1x2': {\n id: '1x2',\n label: 'Two rows',\n hint: 'Stacked',\n slots: 2,\n build: () => splitOf('column', [emptySlot(), emptySlot()]),\n },\n '2x2': {\n id: '2x2',\n label: 'Four cells',\n hint: 'Two by two',\n slots: 4,\n build: () =>\n splitOf('column', [\n splitOf('row', [emptySlot(), emptySlot()]),\n splitOf('row', [emptySlot(), emptySlot()]),\n ]),\n },\n '3-up': {\n id: '3-up',\n label: 'Three columns',\n hint: 'All in one row',\n slots: 3,\n build: () => splitOf('row', [emptySlot(), emptySlot(), emptySlot()]),\n },\n 'two-top-one-below': {\n id: 'two-top-one-below',\n label: 'Two on top, one below',\n hint: 'Pair above, full width beneath',\n slots: 3,\n build: () => splitOf('column', [splitOf('row', [emptySlot(), emptySlot()]), emptySlot()]),\n },\n '1+2': {\n id: '1+2',\n label: 'One left, two right',\n hint: 'Full height beside a stacked pair',\n slots: 3,\n build: () => splitOf('row', [emptySlot(), splitOf('column', [emptySlot(), emptySlot()])]),\n },\n}\n\nexport const GRID_TEMPLATE_LIST: GridTemplate[] = Object.values(GRID_TEMPLATES)\n\n/**\n * Adopt a template's SHAPE, keeping what is already on screen.\n *\n * The existing panes are poured into the template's slots in document order and\n * the remainder stay empty. Discarding them instead would mean picking \"2\u00D72\"\n * from a page that is showing your table closes your table \u2014 the layout-first,\n * fill-after flow only works if choosing a shape is non-destructive.\n *\n * Panes beyond the template's slot count are dropped: the user asked for that\n * many cells.\n */\nexport function applyGridTemplate(layout: SplitLayout, templateId: GridTemplateId): SplitLayout {\n const template = GRID_TEMPLATES[templateId]\n if (!template) return layout\n const existing = listPanes(layout.root)\n let next = 0\n const fill = (node: LayoutNode): LayoutNode => {\n if (node.kind === 'split') return { ...node, children: node.children.map(fill) }\n const pane = existing[next]\n next += 1\n return pane ? { ...pane } : node\n }\n return { ...layout, root: fill(template.build()) }\n}\n\n// \u2500\u2500 Presets \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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\nexport type PresetId = 'columns' | 'rows' | 'two-top-one-below' | 'one-top-two-below' | 'grid'\n\n/**\n * Re-arrange the EXISTING panes into a named shape, preserving their order.\n *\n * Empty slots are dropped: a preset is a statement about the tables you have\n * open, and carrying holes through it would produce shapes (\"two on top, one\n * below\" where one of the three is a hole) the user did not ask for.\n */\nexport function applyPreset(layout: SplitLayout, preset: PresetId): SplitLayout {\n const panes = listPanes(layout.root)\n if (panes.length === 0) return layout\n if (panes.length === 1) return { ...layout, root: panes[0] }\n\n const row = (children: LayoutNode[]): SplitNode => ({\n kind: 'split',\n direction: 'row',\n sizes: evenSizes(children.length),\n children,\n })\n\n switch (preset) {\n case 'columns':\n return { ...layout, root: row(panes) }\n case 'rows':\n return {\n ...layout,\n root: { kind: 'split', direction: 'column', sizes: evenSizes(panes.length), children: panes },\n }\n case 'two-top-one-below': {\n // Two side by side, the rest full-width beneath \u2014 the arrangement the flat\n // model could not express.\n if (panes.length < 3) return { ...layout, root: row(panes) }\n const top = row(panes.slice(0, 2))\n const below = panes.slice(2)\n const bottom: LayoutNode = below.length === 1 ? below[0] : row(below)\n return {\n ...layout,\n root: { kind: 'split', direction: 'column', sizes: [0.5, 0.5], children: [top, bottom] },\n }\n }\n case 'one-top-two-below': {\n if (panes.length < 3) return { ...layout, root: row(panes) }\n return {\n ...layout,\n root: {\n kind: 'split',\n direction: 'column',\n sizes: [0.5, 0.5],\n children: [panes[0], row(panes.slice(1))],\n },\n }\n }\n case 'grid': {\n const pairs: LayoutNode[] = []\n for (let index = 0; index < panes.length; index += 2) {\n const pair = panes.slice(index, index + 2)\n pairs.push(pair.length === 1 ? pair[0] : row(pair))\n }\n return {\n ...layout,\n root: { kind: 'split', direction: 'column', sizes: evenSizes(pairs.length), children: pairs },\n }\n }\n default:\n return layout\n }\n}\n\nexport const ARRANGE_PRESETS: Array<{\n id: PresetId\n label: string\n hint: string\n /** Minimum panes for the shape to differ from a plain row. */\n minPanes: number\n}> = [\n { id: 'columns', label: 'Side by side', hint: 'All in one row', minPanes: 2 },\n { id: 'rows', label: 'Stacked', hint: 'All in one column', minPanes: 2 },\n { id: 'two-top-one-below', label: 'Two on top, one below', hint: 'Pair above, full width beneath', minPanes: 3 },\n { id: 'one-top-two-below', label: 'One on top, two below', hint: 'Full width above, pair beneath', minPanes: 3 },\n { id: 'grid', label: 'Grid', hint: 'Two per row', minPanes: 4 },\n]\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,79 @@
1
+ "use client";
2
+ import * as React from "react";
3
+ import { useQuery, useQueryClient } from "@tanstack/react-query";
4
+ import { apiCall } from "../../utils/apiCall.js";
5
+ import { flash } from "../../FlashMessages.js";
6
+ import { useOrganizationScopeVersion } from "@open-mercato/shared/lib/frontend/useOrganizationScope";
7
+ import { SPLIT_LAYOUT_VERSION, normalizeLayout } from "./types.js";
8
+ const BASE = "/api/split_views/split-views";
9
+ function useSplitViewLayouts(anchorTableId) {
10
+ const queryClient = useQueryClient();
11
+ const scopeVersion = useOrganizationScopeVersion();
12
+ const queryKey = React.useMemo(
13
+ () => ["split-view-layouts", anchorTableId, scopeVersion],
14
+ [anchorTableId, scopeVersion]
15
+ );
16
+ const { data, isFetched } = useQuery({
17
+ queryKey,
18
+ queryFn: async () => {
19
+ const res = await apiCall(
20
+ `${BASE}?anchorTableId=${encodeURIComponent(anchorTableId)}`
21
+ );
22
+ return res.ok && res.result ? res.result : { layouts: [], defaultLayoutId: null };
23
+ }
24
+ });
25
+ const invalidate = React.useCallback(() => {
26
+ void queryClient.invalidateQueries({ queryKey });
27
+ }, [queryClient, queryKey]);
28
+ const save = React.useCallback(
29
+ async (name, layout) => {
30
+ const res = await apiCall(BASE, {
31
+ method: "POST",
32
+ body: JSON.stringify({
33
+ name,
34
+ layout,
35
+ layoutVersion: SPLIT_LAYOUT_VERSION,
36
+ anchorTableId
37
+ })
38
+ });
39
+ if (!res.ok) {
40
+ flash("Could not save this layout", "error");
41
+ return null;
42
+ }
43
+ flash("Layout saved", "success");
44
+ invalidate();
45
+ return res.result?.layout ?? null;
46
+ },
47
+ [anchorTableId, invalidate]
48
+ );
49
+ const remove = React.useCallback(
50
+ async (id) => {
51
+ const res = await apiCall(`${BASE}/${id}`, { method: "DELETE" });
52
+ if (!res.ok) {
53
+ flash("Could not delete this layout", "error");
54
+ return false;
55
+ }
56
+ flash("Layout deleted", "success");
57
+ invalidate();
58
+ return true;
59
+ },
60
+ [invalidate]
61
+ );
62
+ return {
63
+ // v1 (flat) documents are MIGRATED rather than dropped: `normalizeLayout`
64
+ // wraps their panes in a single split node, so a layout saved before the
65
+ // tree existed still opens and behaves identically.
66
+ layouts: (data?.layouts ?? []).map((saved) => ({
67
+ ...saved,
68
+ layout: normalizeLayout(saved.layout, anchorTableId)
69
+ })),
70
+ defaultLayoutId: data?.defaultLayoutId ?? null,
71
+ isFetched,
72
+ save,
73
+ remove
74
+ };
75
+ }
76
+ export {
77
+ useSplitViewLayouts
78
+ };
79
+ //# sourceMappingURL=useSplitViewLayouts.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/backend/dynamic-table/split-view/useSplitViewLayouts.ts"],
4
+ "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport { apiCall } from '../../utils/apiCall'\nimport { flash } from '../../FlashMessages'\nimport { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport { SPLIT_LAYOUT_VERSION, normalizeLayout, type SplitLayout } from './types'\n\n// Module routes are namespaced by module id, so this is /api/<module>/<route>.\nconst BASE = '/api/split_views/split-views'\n\nexport type SavedSplitLayout = {\n id: string\n name: string\n layout: SplitLayout\n layoutVersion: number\n anchorTableId: string | null\n isDefault: boolean\n}\n\ntype IndexResponse = { layouts: SavedSplitLayout[]; defaultLayoutId: string | null }\n\nexport function useSplitViewLayouts(anchorTableId: string) {\n const queryClient = useQueryClient()\n // Layouts are per organization; switching org must not show the previous\n // org's saved layouts.\n const scopeVersion = useOrganizationScopeVersion()\n const queryKey = React.useMemo(\n () => ['split-view-layouts', anchorTableId, scopeVersion],\n [anchorTableId, scopeVersion],\n )\n\n const { data, isFetched } = useQuery({\n queryKey,\n queryFn: async () => {\n const res = await apiCall<IndexResponse>(\n `${BASE}?anchorTableId=${encodeURIComponent(anchorTableId)}`,\n )\n return res.ok && res.result ? res.result : { layouts: [], defaultLayoutId: null }\n },\n })\n\n const invalidate = React.useCallback(() => {\n void queryClient.invalidateQueries({ queryKey })\n }, [queryClient, queryKey])\n\n const save = React.useCallback(\n async (name: string, layout: SplitLayout) => {\n const res = await apiCall<{ layout: SavedSplitLayout }>(BASE, {\n method: 'POST',\n body: JSON.stringify({\n name,\n layout,\n layoutVersion: SPLIT_LAYOUT_VERSION,\n anchorTableId,\n }),\n })\n if (!res.ok) {\n flash('Could not save this layout', 'error')\n return null\n }\n flash('Layout saved', 'success')\n invalidate()\n return res.result?.layout ?? null\n },\n [anchorTableId, invalidate],\n )\n\n const remove = React.useCallback(\n async (id: string) => {\n const res = await apiCall<{ ok: boolean }>(`${BASE}/${id}`, { method: 'DELETE' })\n if (!res.ok) {\n flash('Could not delete this layout', 'error')\n return false\n }\n flash('Layout deleted', 'success')\n invalidate()\n return true\n },\n [invalidate],\n )\n\n return {\n // v1 (flat) documents are MIGRATED rather than dropped: `normalizeLayout`\n // wraps their panes in a single split node, so a layout saved before the\n // tree existed still opens and behaves identically.\n layouts: (data?.layouts ?? []).map((saved) => ({\n ...saved,\n layout: normalizeLayout(saved.layout, anchorTableId),\n })),\n defaultLayoutId: data?.defaultLayoutId ?? null,\n isFetched,\n save,\n remove,\n }\n}\n"],
5
+ "mappings": ";AAEA,YAAY,WAAW;AACvB,SAAS,UAAU,sBAAsB;AACzC,SAAS,eAAe;AACxB,SAAS,aAAa;AACtB,SAAS,mCAAmC;AAC5C,SAAS,sBAAsB,uBAAyC;AAGxE,MAAM,OAAO;AAaN,SAAS,oBAAoB,eAAuB;AACzD,QAAM,cAAc,eAAe;AAGnC,QAAM,eAAe,4BAA4B;AACjD,QAAM,WAAW,MAAM;AAAA,IACrB,MAAM,CAAC,sBAAsB,eAAe,YAAY;AAAA,IACxD,CAAC,eAAe,YAAY;AAAA,EAC9B;AAEA,QAAM,EAAE,MAAM,UAAU,IAAI,SAAS;AAAA,IACnC;AAAA,IACA,SAAS,YAAY;AACnB,YAAM,MAAM,MAAM;AAAA,QAChB,GAAG,IAAI,kBAAkB,mBAAmB,aAAa,CAAC;AAAA,MAC5D;AACA,aAAO,IAAI,MAAM,IAAI,SAAS,IAAI,SAAS,EAAE,SAAS,CAAC,GAAG,iBAAiB,KAAK;AAAA,IAClF;AAAA,EACF,CAAC;AAED,QAAM,aAAa,MAAM,YAAY,MAAM;AACzC,SAAK,YAAY,kBAAkB,EAAE,SAAS,CAAC;AAAA,EACjD,GAAG,CAAC,aAAa,QAAQ,CAAC;AAE1B,QAAM,OAAO,MAAM;AAAA,IACjB,OAAO,MAAc,WAAwB;AAC3C,YAAM,MAAM,MAAM,QAAsC,MAAM;AAAA,QAC5D,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU;AAAA,UACnB;AAAA,UACA;AAAA,UACA,eAAe;AAAA,UACf;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AACD,UAAI,CAAC,IAAI,IAAI;AACX,cAAM,8BAA8B,OAAO;AAC3C,eAAO;AAAA,MACT;AACA,YAAM,gBAAgB,SAAS;AAC/B,iBAAW;AACX,aAAO,IAAI,QAAQ,UAAU;AAAA,IAC/B;AAAA,IACA,CAAC,eAAe,UAAU;AAAA,EAC5B;AAEA,QAAM,SAAS,MAAM;AAAA,IACnB,OAAO,OAAe;AACpB,YAAM,MAAM,MAAM,QAAyB,GAAG,IAAI,IAAI,EAAE,IAAI,EAAE,QAAQ,SAAS,CAAC;AAChF,UAAI,CAAC,IAAI,IAAI;AACX,cAAM,gCAAgC,OAAO;AAC7C,eAAO;AAAA,MACT;AACA,YAAM,kBAAkB,SAAS;AACjC,iBAAW;AACX,aAAO;AAAA,IACT;AAAA,IACA,CAAC,UAAU;AAAA,EACb;AAEA,SAAO;AAAA;AAAA;AAAA;AAAA,IAIL,UAAU,MAAM,WAAW,CAAC,GAAG,IAAI,CAAC,WAAW;AAAA,MAC7C,GAAG;AAAA,MACH,QAAQ,gBAAgB,MAAM,QAAQ,aAAa;AAAA,IACrD,EAAE;AAAA,IACF,iBAAiB,MAAM,mBAAmB;AAAA,IAC1C;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }