@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,3659 @@
1
+ /* DynamicTable CSS — structure and layout for the grid. */
2
+
3
+ /* ============================================
4
+ COLOUR LIVES IN m3.css — NOT HERE.
5
+
6
+ This file used to open with `--hot-*` alias blocks (:root and .dark here,
7
+ a third in DynamicTable.v2.css) — 119 declarations for 58 slots, in which
8
+ .dark was 39 of 40 lines identical to :root because the M3 layer already
9
+ resolves per theme. Three names, one colour.
10
+
11
+ Every rule below now names the `--m3-*` role it wants directly, so a colour
12
+ is decided in exactly one place and called by exactly one name. Add new
13
+ roles to packages/ui/src/theme/m3.css; do not reintroduce an alias layer
14
+ here, and do not write a hex literal in this file.
15
+ ============================================ */
16
+
17
+ /* ============================================
18
+ CONTAINER STYLES
19
+ ============================================ */
20
+ .hot-container {
21
+ overflow: hidden;
22
+ border: 1px solid var(--m3-outline-variant);
23
+ border-radius: var(--m3-shape-lg);
24
+ display: flex;
25
+ flex-direction: column;
26
+ background: var(--m3-surface-container-lowest);
27
+ }
28
+
29
+ .hot-container.hot-borderless {
30
+ border: none;
31
+ border-radius: 0;
32
+ }
33
+
34
+ .hot-container.hot-borderless .hot-toolbar {
35
+ border: none;
36
+ border-radius: 0;
37
+ }
38
+
39
+ .hot-container.hot-borderless .hot-tabs-row {
40
+ border-left: none;
41
+ border-right: none;
42
+ }
43
+
44
+ .hot-virtual-container {
45
+ flex: 1;
46
+ overflow: auto;
47
+ }
48
+
49
+ .hot-headers-sticky {
50
+ position: sticky;
51
+ top: 0;
52
+ z-index: 10;
53
+ background: var(--m3-surface-container-lowest);
54
+ }
55
+
56
+ .hot-table {
57
+ border-collapse: collapse;
58
+ table-layout: fixed;
59
+ width: 100%;
60
+ font-family: Arial, sans-serif;
61
+ font-size: 13px;
62
+ color: var(--m3-on-surface);
63
+ }
64
+
65
+ .hot-table th,
66
+ .hot-table td {
67
+ border: 1px solid var(--m3-outline-faint);
68
+ padding: 4px 8px;
69
+ text-align: left;
70
+ box-sizing: border-box;
71
+ min-width: 0;
72
+ overflow: hidden;
73
+ text-overflow: ellipsis;
74
+ white-space: nowrap;
75
+ }
76
+
77
+ .hot-col-header {
78
+ background: var(--m3-surface-container);
79
+ font-weight: 500;
80
+ position: sticky;
81
+ top: 0;
82
+ z-index: 2;
83
+ cursor: pointer;
84
+ color: var(--m3-on-surface);
85
+ font-size: 13px;
86
+ }
87
+
88
+ .hot-row-header {
89
+ background: var(--m3-surface-container);
90
+ font-weight: 400;
91
+ text-align: center;
92
+ color: var(--m3-on-surface-variant);
93
+ min-width: 32px;
94
+ cursor: pointer;
95
+ font-size: 11px;
96
+ }
97
+
98
+ .hot-cell {
99
+ background: var(--m3-surface-container-lowest);
100
+ cursor: cell;
101
+ position: relative;
102
+ display: flex;
103
+ align-items: center;
104
+ height: 100%;
105
+ padding: 4px 8px;
106
+ min-width: 0;
107
+ overflow: hidden;
108
+ }
109
+
110
+ .hot-cell > .cell-content {
111
+ overflow: hidden;
112
+ text-overflow: ellipsis;
113
+ white-space: nowrap;
114
+ flex: 1;
115
+ min-width: 0;
116
+ }
117
+
118
+
119
+ /* Read-only cell styles - controlled by data-readonly-style on container */
120
+
121
+ /* Default 'muted' style - gray background */
122
+ .hot-cell.read-only {
123
+ background: var(--m3-surface-container);
124
+ color: var(--m3-on-surface-variant);
125
+ }
126
+
127
+ /* 'normal' style - same as editable cells, no visual difference */
128
+ [data-readonly-style="normal"] .hot-cell.read-only {
129
+ background: var(--m3-surface-container-lowest);
130
+ color: var(--m3-on-surface);
131
+ }
132
+
133
+ /* 'subtle' style - very subtle background tint */
134
+ [data-readonly-style="subtle"] .hot-cell.read-only {
135
+ background: color-mix(in srgb, var(--m3-surface-container) 30%, var(--m3-surface-container-lowest));
136
+ color: var(--m3-on-surface);
137
+ }
138
+
139
+ .hot-cell:hover:not([data-save-state]) {
140
+ background: var(--m3-row-hover);
141
+ }
142
+
143
+ /* Sticky columns carry no shadow: DynamicTable.v2.css zeroes it and paints a
144
+ 1px `::after` divider on the pinned edge instead. The two blur rules that
145
+ used to live here were pure overdraw on every pinned cell of every row. */
146
+
147
+ /* New row styles */
148
+ tr[data-is-new="true"] td {
149
+ background: var(--m3-primary-container) !important;
150
+ }
151
+
152
+ tr[data-is-new="true"] td:hover:not([data-save-state]):not([data-row-save-state]) {
153
+ background: color-mix(in srgb, var(--m3-on-primary-container) 8%, var(--m3-primary-container)) !important;
154
+ }
155
+
156
+ /* Error state on new rows - override yellow with red */
157
+ tr[data-is-new="true"] td[data-row-save-state="error"] {
158
+ background: var(--m3-error-container) !important;
159
+ }
160
+
161
+ /* Cancel button in row header */
162
+ .hot-row-cancel-btn-header {
163
+ width: 100%;
164
+ height: 100%;
165
+ border: none;
166
+ background: color-mix(in srgb, var(--m3-error) 10%, transparent);
167
+ color: var(--m3-error);
168
+ font-size: 14px;
169
+ font-weight: bold;
170
+ cursor: pointer;
171
+ display: flex;
172
+ align-items: center;
173
+ justify-content: center;
174
+ transition: var(--m3-transition-state);
175
+ }
176
+
177
+ .hot-row-cancel-btn-header:hover {
178
+ background: var(--m3-error);
179
+ color: var(--m3-on-primary);
180
+ }
181
+
182
+ /* Actions column cell */
183
+ .hot-actions-cell {
184
+ background: var(--m3-surface-container-lowest);
185
+ padding: 2px !important;
186
+ display: flex;
187
+ align-items: center;
188
+ justify-content: center;
189
+ }
190
+
191
+ tr[data-is-new="true"] .hot-actions-cell {
192
+ background: var(--m3-primary-container) !important;
193
+ }
194
+
195
+ .hot-row-save-btn {
196
+ width: 100%;
197
+ height: 100%;
198
+ min-height: 24px;
199
+ border: none;
200
+ border-radius: var(--m3-shape-sm);
201
+ background: var(--m3-primary);
202
+ color: var(--m3-on-primary);
203
+ font-size: 12px;
204
+ font-weight: 500;
205
+ cursor: pointer;
206
+ transition: var(--m3-transition-state), transform var(--m3-duration-short2) var(--m3-ease-standard);
207
+ }
208
+
209
+ .hot-row-save-btn:hover {
210
+ background: var(--m3-primary-hover);
211
+ transform: scale(1.05);
212
+ }
213
+
214
+ .hot-row-save-btn:active {
215
+ background: var(--m3-primary);
216
+ transform: scale(0.98);
217
+ }
218
+
219
+ /* ============================================
220
+ SELECTION STYLES
221
+ ============================================ */
222
+
223
+ /* Selected cell - blue border */
224
+ td[data-cell-selected="true"] {
225
+ box-shadow: inset 0 0 0 2px var(--m3-accent) !important;
226
+ z-index: 1;
227
+ }
228
+
229
+ /* Selected row - blue background with top/bottom inset shadows */
230
+ tr[data-row-selected="true"] td {
231
+ background: var(--m3-secondary-container) !important;
232
+ box-shadow:
233
+ inset 0 2px 0 0 var(--m3-accent),
234
+ inset 0 -2px 0 0 var(--m3-accent);
235
+ }
236
+
237
+ /* Selected row's row header - includes left edge */
238
+ tr[data-row-selected="true"] .hot-row-header {
239
+ background: var(--m3-accent) !important;
240
+ color: var(--m3-on-primary);
241
+ box-shadow:
242
+ inset 2px 0 0 0 var(--m3-accent),
243
+ inset 0 2px 0 0 var(--m3-accent),
244
+ inset 0 -2px 0 0 var(--m3-accent);
245
+ }
246
+
247
+ /* Last cell in selected row - add right edge */
248
+ tr[data-row-selected="true"] td:last-child {
249
+ box-shadow:
250
+ inset 0 2px 0 0 var(--m3-accent),
251
+ inset 0 -2px 0 0 var(--m3-accent),
252
+ inset -2px 0 0 0 var(--m3-accent);
253
+ }
254
+
255
+ /* Selected column - blue background with left/right inset shadows */
256
+ td[data-col-selected="true"] {
257
+ background: var(--m3-secondary-container) !important;
258
+ box-shadow:
259
+ inset 2px 0 0 0 var(--m3-accent),
260
+ inset -2px 0 0 0 var(--m3-accent);
261
+ }
262
+
263
+ /* Last row in selected column - add bottom shadow */
264
+ tbody tr:last-child td[data-col-selected="true"] {
265
+ box-shadow:
266
+ inset 2px 0 0 0 var(--m3-accent),
267
+ inset -2px 0 0 0 var(--m3-accent),
268
+ inset 0 -2px 0 0 var(--m3-accent);
269
+ }
270
+
271
+ /* Selected column header - includes top shadow */
272
+ th[data-col-selected="true"] {
273
+ background: var(--m3-accent) !important;
274
+ color: var(--m3-on-primary);
275
+ box-shadow:
276
+ inset 2px 0 0 0 var(--m3-accent),
277
+ inset -2px 0 0 0 var(--m3-accent),
278
+ inset 0 2px 0 0 var(--m3-accent);
279
+ }
280
+
281
+ /* Darker row header when cell in that row is selected */
282
+ .hot-row-header[data-has-selected-cell="true"] {
283
+ background: var(--m3-outline-faint) !important;
284
+ color: var(--m3-on-surface);
285
+ }
286
+
287
+ /* Darker column header when cell in that column is selected */
288
+ th[data-has-selected-cell="true"] {
289
+ background: var(--m3-outline-faint) !important;
290
+ color: var(--m3-on-surface);
291
+ }
292
+
293
+ /* ============================================
294
+ RANGE SELECTION STYLES
295
+ ============================================ */
296
+
297
+ /* Cells in range - blue background */
298
+ td[data-in-range="true"] {
299
+ background: var(--m3-secondary-container) !important;
300
+ }
301
+
302
+ /* Range borders - only apply to cells in range, not to single selected cells */
303
+ /* Top edge only */
304
+ td[data-in-range="true"][data-range-top="true"]:not([data-range-bottom="true"]):not([data-range-left="true"]):not([data-range-right="true"]) {
305
+ box-shadow: inset 0 2px 0 0 var(--m3-accent);
306
+ }
307
+
308
+ /* Bottom edge only */
309
+ td[data-in-range="true"][data-range-bottom="true"]:not([data-range-top="true"]):not([data-range-left="true"]):not([data-range-right="true"]) {
310
+ box-shadow: inset 0 -2px 0 0 var(--m3-accent);
311
+ }
312
+
313
+ /* Left edge only */
314
+ td[data-in-range="true"][data-range-left="true"]:not([data-range-top="true"]):not([data-range-bottom="true"]):not([data-range-right="true"]) {
315
+ box-shadow: inset 2px 0 0 0 var(--m3-accent);
316
+ }
317
+
318
+ /* Right edge only */
319
+ td[data-in-range="true"][data-range-right="true"]:not([data-range-top="true"]):not([data-range-bottom="true"]):not([data-range-left="true"]) {
320
+ box-shadow: inset -2px 0 0 0 var(--m3-accent);
321
+ }
322
+
323
+ /* Top + Bottom */
324
+ td[data-in-range="true"][data-range-top="true"][data-range-bottom="true"]:not([data-range-left="true"]):not([data-range-right="true"]) {
325
+ box-shadow: inset 0 2px 0 0 var(--m3-accent), inset 0 -2px 0 0 var(--m3-accent);
326
+ }
327
+
328
+ /* Left + Right */
329
+ td[data-in-range="true"][data-range-left="true"][data-range-right="true"]:not([data-range-top="true"]):not([data-range-bottom="true"]) {
330
+ box-shadow: inset 2px 0 0 0 var(--m3-accent), inset -2px 0 0 0 var(--m3-accent);
331
+ }
332
+
333
+ /* Top + Left */
334
+ td[data-in-range="true"][data-range-top="true"][data-range-left="true"]:not([data-range-bottom="true"]):not([data-range-right="true"]) {
335
+ box-shadow: inset 0 2px 0 0 var(--m3-accent), inset 2px 0 0 0 var(--m3-accent);
336
+ }
337
+
338
+ /* Top + Right */
339
+ td[data-in-range="true"][data-range-top="true"][data-range-right="true"]:not([data-range-bottom="true"]):not([data-range-left="true"]) {
340
+ box-shadow: inset 0 2px 0 0 var(--m3-accent), inset -2px 0 0 0 var(--m3-accent);
341
+ }
342
+
343
+ /* Bottom + Left */
344
+ td[data-in-range="true"][data-range-bottom="true"][data-range-left="true"]:not([data-range-top="true"]):not([data-range-right="true"]) {
345
+ box-shadow: inset 0 -2px 0 0 var(--m3-accent), inset 2px 0 0 0 var(--m3-accent);
346
+ }
347
+
348
+ /* Bottom + Right */
349
+ td[data-in-range="true"][data-range-bottom="true"][data-range-right="true"]:not([data-range-top="true"]):not([data-range-left="true"]) {
350
+ box-shadow: inset 0 -2px 0 0 var(--m3-accent), inset -2px 0 0 0 var(--m3-accent);
351
+ }
352
+
353
+ /* Top + Left + Right */
354
+ td[data-in-range="true"][data-range-top="true"][data-range-left="true"][data-range-right="true"]:not([data-range-bottom="true"]) {
355
+ box-shadow: inset 0 2px 0 0 var(--m3-accent), inset 2px 0 0 0 var(--m3-accent), inset -2px 0 0 0 var(--m3-accent);
356
+ }
357
+
358
+ /* Bottom + Left + Right */
359
+ td[data-in-range="true"][data-range-bottom="true"][data-range-left="true"][data-range-right="true"]:not([data-range-top="true"]) {
360
+ box-shadow: inset 0 -2px 0 0 var(--m3-accent), inset 2px 0 0 0 var(--m3-accent), inset -2px 0 0 0 var(--m3-accent);
361
+ }
362
+
363
+ /* Top + Bottom + Left */
364
+ td[data-in-range="true"][data-range-top="true"][data-range-bottom="true"][data-range-left="true"]:not([data-range-right="true"]) {
365
+ box-shadow: inset 0 2px 0 0 var(--m3-accent), inset 0 -2px 0 0 var(--m3-accent), inset 2px 0 0 0 var(--m3-accent);
366
+ }
367
+
368
+ /* Top + Bottom + Right */
369
+ td[data-in-range="true"][data-range-top="true"][data-range-bottom="true"][data-range-right="true"]:not([data-range-left="true"]) {
370
+ box-shadow: inset 0 2px 0 0 var(--m3-accent), inset 0 -2px 0 0 var(--m3-accent), inset -2px 0 0 0 var(--m3-accent);
371
+ }
372
+
373
+ /* All four edges (complete rectangle) */
374
+ td[data-in-range="true"][data-range-top="true"][data-range-bottom="true"][data-range-left="true"][data-range-right="true"] {
375
+ box-shadow: inset 0 2px 0 0 var(--m3-accent), inset 0 -2px 0 0 var(--m3-accent), inset 2px 0 0 0 var(--m3-accent), inset -2px 0 0 0 var(--m3-accent);
376
+ }
377
+
378
+ /* ============================================
379
+ ROW RANGE SELECTION STYLES
380
+ ============================================ */
381
+
382
+ /* Cells in row range */
383
+ td[data-in-row-range="true"] {
384
+ background: var(--m3-secondary-container) !important;
385
+ }
386
+
387
+ /* Row header in row range */
388
+ .hot-row-header[data-in-row-range="true"] {
389
+ background: var(--m3-accent) !important;
390
+ color: var(--m3-on-primary);
391
+ }
392
+
393
+ /* Top border for all cells in top row */
394
+ td[data-in-row-range="true"][data-row-range-top="true"] {
395
+ box-shadow: inset 0 2px 0 0 var(--m3-accent);
396
+ }
397
+
398
+ /* Bottom border for all cells in bottom row */
399
+ td[data-in-row-range="true"][data-row-range-bottom="true"] {
400
+ box-shadow: inset 0 -2px 0 0 var(--m3-accent);
401
+ }
402
+
403
+ /* Both borders for single row */
404
+ td[data-in-row-range="true"][data-row-range-top="true"][data-row-range-bottom="true"] {
405
+ box-shadow: inset 0 2px 0 0 var(--m3-accent), inset 0 -2px 0 0 var(--m3-accent);
406
+ }
407
+
408
+ /* Add left border to first cell (after row header) */
409
+ tbody tr td[data-in-row-range="true"]:nth-child(2) {
410
+ box-shadow: inset 2px 0 0 0 var(--m3-accent) !important;
411
+ }
412
+
413
+ tbody tr td[data-in-row-range="true"]:nth-child(2)[data-row-range-top="true"]:not([data-row-range-bottom="true"]) {
414
+ box-shadow: inset 2px 0 0 0 var(--m3-accent), inset 0 2px 0 0 var(--m3-accent) !important;
415
+ }
416
+
417
+ tbody tr td[data-in-row-range="true"]:nth-child(2)[data-row-range-bottom="true"]:not([data-row-range-top="true"]) {
418
+ box-shadow: inset 2px 0 0 0 var(--m3-accent), inset 0 -2px 0 0 var(--m3-accent) !important;
419
+ }
420
+
421
+ tbody tr td[data-in-row-range="true"]:nth-child(2)[data-row-range-top="true"][data-row-range-bottom="true"] {
422
+ box-shadow: inset 2px 0 0 0 var(--m3-accent), inset 0 2px 0 0 var(--m3-accent), inset 0 -2px 0 0 var(--m3-accent) !important;
423
+ }
424
+
425
+ /* Add right border to last cell */
426
+ tbody tr td[data-in-row-range="true"]:last-child {
427
+ box-shadow: inset -2px 0 0 0 var(--m3-accent) !important;
428
+ }
429
+
430
+ tbody tr td[data-in-row-range="true"]:last-child[data-row-range-top="true"]:not([data-row-range-bottom="true"]) {
431
+ box-shadow: inset -2px 0 0 0 var(--m3-accent), inset 0 2px 0 0 var(--m3-accent) !important;
432
+ }
433
+
434
+ tbody tr td[data-in-row-range="true"]:last-child[data-row-range-bottom="true"]:not([data-row-range-top="true"]) {
435
+ box-shadow: inset -2px 0 0 0 var(--m3-accent), inset 0 -2px 0 0 var(--m3-accent) !important;
436
+ }
437
+
438
+ tbody tr td[data-in-row-range="true"]:last-child[data-row-range-top="true"][data-row-range-bottom="true"] {
439
+ box-shadow: inset -2px 0 0 0 var(--m3-accent), inset 0 2px 0 0 var(--m3-accent), inset 0 -2px 0 0 var(--m3-accent) !important;
440
+ }
441
+
442
+ /* ============================================
443
+ COLUMN RANGE SELECTION STYLES
444
+ ============================================ */
445
+
446
+ /* Cells in column range */
447
+ td[data-in-col-range="true"] {
448
+ background: var(--m3-secondary-container) !important;
449
+ }
450
+
451
+ /* Column header in column range */
452
+ th[data-in-col-range="true"] {
453
+ background: var(--m3-accent) !important;
454
+ color: var(--m3-on-primary);
455
+ }
456
+
457
+ /* Left border for all cells in left column */
458
+ td[data-in-col-range="true"][data-col-range-left="true"] {
459
+ box-shadow: inset 2px 0 0 0 var(--m3-accent);
460
+ }
461
+
462
+ /* Right border for all cells in right column */
463
+ td[data-in-col-range="true"][data-col-range-right="true"] {
464
+ box-shadow: inset -2px 0 0 0 var(--m3-accent);
465
+ }
466
+
467
+ /* Both borders for single column */
468
+ td[data-in-col-range="true"][data-col-range-left="true"][data-col-range-right="true"] {
469
+ box-shadow: inset 2px 0 0 0 var(--m3-accent), inset -2px 0 0 0 var(--m3-accent);
470
+ }
471
+
472
+ /* Add top border to first row cells */
473
+ tbody tr:first-child td[data-in-col-range="true"] {
474
+ box-shadow: inset 0 2px 0 0 var(--m3-accent) !important;
475
+ }
476
+
477
+ tbody tr:first-child td[data-in-col-range="true"][data-col-range-left="true"]:not([data-col-range-right="true"]) {
478
+ box-shadow: inset 2px 0 0 0 var(--m3-accent), inset 0 2px 0 0 var(--m3-accent) !important;
479
+ }
480
+
481
+ tbody tr:first-child td[data-in-col-range="true"][data-col-range-right="true"]:not([data-col-range-left="true"]) {
482
+ box-shadow: inset -2px 0 0 0 var(--m3-accent), inset 0 2px 0 0 var(--m3-accent) !important;
483
+ }
484
+
485
+ tbody tr:first-child td[data-in-col-range="true"][data-col-range-left="true"][data-col-range-right="true"] {
486
+ box-shadow: inset 2px 0 0 0 var(--m3-accent), inset -2px 0 0 0 var(--m3-accent), inset 0 2px 0 0 var(--m3-accent) !important;
487
+ }
488
+
489
+ /* Add bottom border to last row cells */
490
+ tbody tr:last-child td[data-in-col-range="true"] {
491
+ box-shadow: inset 0 -2px 0 0 var(--m3-accent) !important;
492
+ }
493
+
494
+ tbody tr:last-child td[data-in-col-range="true"][data-col-range-left="true"]:not([data-col-range-right="true"]) {
495
+ box-shadow: inset 2px 0 0 0 var(--m3-accent), inset 0 -2px 0 0 var(--m3-accent) !important;
496
+ }
497
+
498
+ tbody tr:last-child td[data-in-col-range="true"][data-col-range-right="true"]:not([data-col-range-left="true"]) {
499
+ box-shadow: inset -2px 0 0 0 var(--m3-accent), inset 0 -2px 0 0 var(--m3-accent) !important;
500
+ }
501
+
502
+ tbody tr:last-child td[data-in-col-range="true"][data-col-range-left="true"][data-col-range-right="true"] {
503
+ box-shadow: inset 2px 0 0 0 var(--m3-accent), inset -2px 0 0 0 var(--m3-accent), inset 0 -2px 0 0 var(--m3-accent) !important;
504
+ }
505
+
506
+ /* Column header range edges */
507
+ th[data-in-col-range="true"][data-col-range-left="true"]:not([data-col-range-right="true"]) {
508
+ box-shadow: inset 2px 0 0 0 var(--m3-accent), inset 0 2px 0 0 var(--m3-accent) !important;
509
+ }
510
+
511
+ th[data-in-col-range="true"][data-col-range-right="true"]:not([data-col-range-left="true"]) {
512
+ box-shadow: inset -2px 0 0 0 var(--m3-accent), inset 0 2px 0 0 var(--m3-accent) !important;
513
+ }
514
+
515
+ th[data-in-col-range="true"][data-col-range-left="true"][data-col-range-right="true"] {
516
+ box-shadow: inset 2px 0 0 0 var(--m3-accent), inset -2px 0 0 0 var(--m3-accent), inset 0 2px 0 0 var(--m3-accent) !important;
517
+ }
518
+
519
+ /* Flex layout for virtualized rows */
520
+ tr[style*="display: flex"] td {
521
+ flex-shrink: 0;
522
+ flex-grow: 0;
523
+ }
524
+
525
+ /* ============================================
526
+ CELL EDITOR STYLES
527
+ ============================================ */
528
+
529
+ /* Cell editor - Base styles */
530
+ .hot-cell-editor {
531
+ position: absolute;
532
+ top: 0;
533
+ left: 0;
534
+ width: 100%;
535
+ height: 100%;
536
+ border: none;
537
+ outline: none;
538
+ padding: 8px 12px;
539
+ font-family: inherit;
540
+ font-size: inherit;
541
+ resize: none;
542
+ background: var(--m3-surface-container-lowest);
543
+ color: var(--m3-on-surface);
544
+ box-shadow: var(--m3-focus-ring-inset);
545
+ z-index: 10;
546
+ }
547
+
548
+ /* Numeric Editor */
549
+ .hot-numeric-editor {
550
+ text-align: right;
551
+ }
552
+
553
+ /* Date Editor */
554
+ .hot-date-editor {
555
+ cursor: pointer;
556
+ font-size: 12px;
557
+ }
558
+
559
+ /* Dropdown Editor */
560
+ .hot-dropdown-editor {
561
+ cursor: pointer;
562
+ padding-right: 24px;
563
+ }
564
+
565
+ /* Boolean Editor */
566
+ .hot-boolean-editor-wrapper {
567
+ position: absolute;
568
+ top: 0;
569
+ left: 0;
570
+ width: 100%;
571
+ height: 100%;
572
+ display: flex;
573
+ align-items: center;
574
+ justify-content: center;
575
+ background: var(--m3-surface-container-lowest);
576
+ box-shadow: var(--m3-focus-ring-inset);
577
+ z-index: 10;
578
+ }
579
+
580
+ .hot-boolean-editor {
581
+ width: 18px;
582
+ height: 18px;
583
+ cursor: pointer;
584
+ }
585
+
586
+ /* ============================================
587
+ EDITOR POPUPS
588
+ ============================================ */
589
+
590
+ .hot-editor-popup {
591
+ background: var(--m3-surface-container);
592
+ border: 1px solid var(--m3-outline-variant);
593
+ border-radius: var(--m3-shape-md);
594
+ box-shadow: var(--m3-elevation-2);
595
+ z-index: 10000;
596
+ }
597
+
598
+ /* Calendar Popup */
599
+ .hot-calendar-popup {
600
+ padding: 0;
601
+ pointer-events: auto;
602
+ background: var(--m3-surface-container);
603
+ }
604
+
605
+ .hot-calendar-footer {
606
+ display: flex;
607
+ align-items: center;
608
+ justify-content: space-between;
609
+ gap: 8px;
610
+ border-top: 1px solid var(--m3-outline-faint);
611
+ padding: 8px 12px;
612
+ }
613
+
614
+ .hot-calendar-footer-btn {
615
+ font-size: 13px;
616
+ background: none;
617
+ border: none;
618
+ cursor: pointer;
619
+ padding: 0;
620
+ }
621
+
622
+ .hot-calendar-footer-btn:hover {
623
+ text-decoration: underline;
624
+ }
625
+
626
+ .hot-calendar-clear-btn {
627
+ color: var(--m3-on-surface-variant);
628
+ }
629
+
630
+ .hot-calendar-clear-btn:hover {
631
+ color: var(--m3-on-surface);
632
+ }
633
+
634
+ .hot-calendar-today-btn {
635
+ color: var(--m3-on-surface);
636
+ margin-left: auto;
637
+ }
638
+
639
+ /* DateTime Popup — ensure calendar has room for nav arrows */
640
+ .hot-datetime-popup {
641
+ width: 300px;
642
+ }
643
+
644
+ /* Dropdown Popup */
645
+ .hot-dropdown-popup {
646
+ max-height: 250px;
647
+ overflow-y: auto;
648
+ background: var(--m3-surface-container);
649
+ min-width: 150px;
650
+ pointer-events: auto;
651
+ }
652
+
653
+ .hot-dropdown-option {
654
+ padding: 8px 12px;
655
+ cursor: pointer;
656
+ font-size: 13px;
657
+ transition: background-color var(--m3-duration-short3) var(--m3-ease-standard);
658
+ border-bottom: 1px solid var(--m3-outline-faint);
659
+ white-space: nowrap;
660
+ color: var(--m3-on-surface);
661
+ }
662
+
663
+ .hot-dropdown-option:last-child {
664
+ border-bottom: none;
665
+ }
666
+
667
+ .hot-dropdown-option:hover,
668
+ .hot-dropdown-option.highlighted {
669
+ background-color: var(--m3-state-layer-hover);
670
+ }
671
+
672
+ .hot-dropdown-option:active {
673
+ background-color: var(--m3-state-layer-pressed);
674
+ }
675
+
676
+ /* Scrollbar for dropdown */
677
+ .hot-dropdown-popup::-webkit-scrollbar {
678
+ width: 6px;
679
+ }
680
+
681
+ .hot-dropdown-popup::-webkit-scrollbar-track {
682
+ background: var(--m3-surface-container);
683
+ }
684
+
685
+ .hot-dropdown-popup::-webkit-scrollbar-thumb {
686
+ background: var(--m3-outline-faint);
687
+ border-radius: var(--m3-shape-full);
688
+ }
689
+
690
+ .hot-dropdown-popup::-webkit-scrollbar-thumb:hover {
691
+ background: var(--m3-on-surface-variant);
692
+ }
693
+
694
+ /* ============================================
695
+ MULTI-SELECT EDITOR STYLES
696
+ ============================================ */
697
+
698
+ .hot-multiselect-editor {
699
+ display: flex;
700
+ align-items: center;
701
+ min-height: 28px;
702
+ padding: 0 4px;
703
+ cursor: pointer;
704
+ }
705
+
706
+ .hot-multiselect-popup {
707
+ max-height: 250px;
708
+ overflow-y: auto;
709
+ background: var(--m3-surface-container);
710
+ border: 1px solid var(--m3-outline-variant);
711
+ border-radius: var(--m3-shape-md);
712
+ box-shadow: var(--m3-elevation-2);
713
+ min-width: 160px;
714
+ pointer-events: auto;
715
+ }
716
+
717
+ .hot-multiselect-option {
718
+ display: flex;
719
+ align-items: center;
720
+ justify-content: space-between;
721
+ padding: 8px 12px;
722
+ cursor: pointer;
723
+ font-size: 13px;
724
+ transition: background-color var(--m3-duration-short3) var(--m3-ease-standard);
725
+ border-bottom: 1px solid var(--m3-outline-faint);
726
+ color: var(--m3-on-surface);
727
+ }
728
+
729
+ .hot-multiselect-option:last-child {
730
+ border-bottom: none;
731
+ }
732
+
733
+ .hot-multiselect-option:hover,
734
+ .hot-multiselect-option.highlighted {
735
+ background-color: var(--m3-state-layer-hover);
736
+ }
737
+
738
+ .hot-multiselect-option.selected {
739
+ background-color: var(--m3-secondary-container);
740
+ }
741
+
742
+ .hot-multiselect-option.selected.highlighted {
743
+ background-color: var(--m3-row-selected-hover);
744
+ }
745
+
746
+ /* Scrollbar for multiselect popup */
747
+ .hot-multiselect-popup::-webkit-scrollbar {
748
+ width: 6px;
749
+ }
750
+
751
+ .hot-multiselect-popup::-webkit-scrollbar-track {
752
+ background: var(--m3-surface-container);
753
+ }
754
+
755
+ .hot-multiselect-popup::-webkit-scrollbar-thumb {
756
+ background: var(--m3-outline-faint);
757
+ border-radius: var(--m3-shape-full);
758
+ }
759
+
760
+ .hot-multiselect-popup::-webkit-scrollbar-thumb:hover {
761
+ background: var(--m3-on-surface-variant);
762
+ }
763
+
764
+ /* ============================================
765
+ SAVE STATE STYLES
766
+ ============================================ */
767
+
768
+ td[data-save-state="saving"] {
769
+ position: relative;
770
+ overflow: hidden;
771
+ background: var(--m3-primary-container) !important;
772
+ }
773
+
774
+ td[data-save-state="saving"]::after {
775
+ content: '';
776
+ position: absolute;
777
+ top: 0;
778
+ left: 0;
779
+ width: 100%;
780
+ height: 100%;
781
+ background: linear-gradient(90deg,
782
+ transparent 0%,
783
+ var(--m3-skeleton-shimmer) 50%,
784
+ transparent 100%);
785
+ animation: pulse-skeleton 1.5s ease-in-out infinite;
786
+ pointer-events: none;
787
+ }
788
+
789
+ @keyframes pulse-skeleton {
790
+ 0% {
791
+ transform: translateX(-100%);
792
+ }
793
+
794
+ 100% {
795
+ transform: translateX(100%);
796
+ }
797
+ }
798
+
799
+ td[data-save-state="success"] {
800
+ background: var(--m3-success-container) !important;
801
+ box-shadow: inset 0 0 0 2px var(--m3-on-success-container);
802
+ animation: fade-success 2s ease-out forwards;
803
+ }
804
+
805
+ @keyframes fade-success {
806
+ 0% {
807
+ background: var(--m3-success-container) !important;
808
+ box-shadow: inset 0 0 0 2px var(--m3-on-success-container);
809
+ }
810
+
811
+ 70% {
812
+ background: var(--m3-success-container) !important;
813
+ box-shadow: inset 0 0 0 2px var(--m3-on-success-container);
814
+ }
815
+
816
+ 100% {
817
+ background: var(--m3-surface-container-lowest) !important;
818
+ box-shadow: none;
819
+ }
820
+ }
821
+
822
+ td[data-save-state="error"] {
823
+ background: var(--m3-error-container) !important;
824
+ box-shadow: inset 0 0 0 2px var(--m3-error) !important;
825
+ animation: shake 0.5s ease-in-out;
826
+ }
827
+
828
+ @keyframes shake {
829
+
830
+ 0%,
831
+ 100% {
832
+ transform: translateX(0);
833
+ }
834
+
835
+ 10%,
836
+ 30%,
837
+ 50%,
838
+ 70%,
839
+ 90% {
840
+ transform: translateX(-2px);
841
+ }
842
+
843
+ 20%,
844
+ 40%,
845
+ 60%,
846
+ 80% {
847
+ transform: translateX(2px);
848
+ }
849
+ }
850
+
851
+ /* ============================================
852
+ ROW SAVE STATE STYLES
853
+ ============================================ */
854
+
855
+ td[data-row-save-state="saving"] {
856
+ position: relative;
857
+ overflow: hidden;
858
+ background: var(--m3-primary-container) !important;
859
+ }
860
+
861
+ td[data-row-save-state="saving"]::after {
862
+ content: '';
863
+ position: absolute;
864
+ top: 0;
865
+ left: 0;
866
+ width: 100%;
867
+ height: 100%;
868
+ background: linear-gradient(90deg,
869
+ transparent 0%,
870
+ var(--m3-skeleton-shimmer) 50%,
871
+ transparent 100%);
872
+ animation: pulse-skeleton 1.5s ease-in-out infinite;
873
+ pointer-events: none;
874
+ }
875
+
876
+ td[data-row-save-state="success"] {
877
+ background: var(--m3-success-container) !important;
878
+ animation: fade-row-success 2s ease-out forwards;
879
+ }
880
+
881
+ /* Success row border - first cell (including row header) */
882
+ tr td:first-child[data-row-save-state="success"] {
883
+ box-shadow: inset 2px 0 0 0 var(--m3-on-success-container), inset 0 2px 0 0 var(--m3-on-success-container), inset 0 -2px 0 0 var(--m3-on-success-container) !important;
884
+ }
885
+
886
+ /* Success row border - middle cells */
887
+ tr td[data-row-save-state="success"]:not(:first-child):not(:last-child) {
888
+ box-shadow: inset 0 2px 0 0 var(--m3-on-success-container), inset 0 -2px 0 0 var(--m3-on-success-container) !important;
889
+ }
890
+
891
+ /* Success row border - last cell */
892
+ tr td:last-child[data-row-save-state="success"] {
893
+ box-shadow: inset -2px 0 0 0 var(--m3-on-success-container), inset 0 2px 0 0 var(--m3-on-success-container), inset 0 -2px 0 0 var(--m3-on-success-container) !important;
894
+ }
895
+
896
+ td[data-row-save-state="error"] {
897
+ background: var(--m3-error-container) !important;
898
+ animation: shake-row 0.5s ease-in-out, fade-row-error 3s ease-out forwards;
899
+ }
900
+
901
+ /* Error row border - first cell */
902
+ tr td:first-child[data-row-save-state="error"] {
903
+ box-shadow: inset 2px 0 0 0 var(--m3-error), inset 0 2px 0 0 var(--m3-error), inset 0 -2px 0 0 var(--m3-error) !important;
904
+ }
905
+
906
+ /* Error row border - middle cells */
907
+ tr td[data-row-save-state="error"]:not(:first-child):not(:last-child) {
908
+ box-shadow: inset 0 2px 0 0 var(--m3-error), inset 0 -2px 0 0 var(--m3-error) !important;
909
+ }
910
+
911
+ /* Error row border - last cell */
912
+ tr td:last-child[data-row-save-state="error"] {
913
+ box-shadow: inset -2px 0 0 0 var(--m3-error), inset 0 2px 0 0 var(--m3-error), inset 0 -2px 0 0 var(--m3-error) !important;
914
+ }
915
+
916
+ @keyframes fade-row-success {
917
+ 0% {
918
+ background: var(--m3-success-container) !important;
919
+ }
920
+
921
+ 70% {
922
+ background: var(--m3-success-container) !important;
923
+ }
924
+
925
+ 100% {
926
+ background: var(--m3-surface-container-lowest) !important;
927
+ }
928
+ }
929
+
930
+ @keyframes fade-row-error {
931
+ 0% {
932
+ background: var(--m3-error-container) !important;
933
+ }
934
+
935
+ 85% {
936
+ background: var(--m3-error-container) !important;
937
+ }
938
+
939
+ 100% {
940
+ background: var(--m3-surface-container-lowest) !important;
941
+ }
942
+ }
943
+
944
+ @keyframes shake-row {
945
+
946
+ 0%,
947
+ 100% {
948
+ transform: translateX(0);
949
+ }
950
+
951
+ 10%,
952
+ 30%,
953
+ 50%,
954
+ 70%,
955
+ 90% {
956
+ transform: translateX(-2px);
957
+ }
958
+
959
+ 20%,
960
+ 40%,
961
+ 60%,
962
+ 80% {
963
+ transform: translateX(2px);
964
+ }
965
+ }
966
+
967
+ /* Override new row background during save states */
968
+ tr[data-is-new="false"] td[data-row-save-state="success"],
969
+ tr[data-is-new="false"] td[data-row-save-state="error"],
970
+ tr[data-is-new="false"] td[data-row-save-state="saving"] {
971
+ /* Let the data attribute styles apply */
972
+ }
973
+
974
+ /* Ensure save state styles override selection styles when needed */
975
+ td[data-save-state="saving"],
976
+ td[data-save-state="success"],
977
+ td[data-save-state="error"],
978
+ td[data-row-save-state="saving"],
979
+ td[data-row-save-state="success"],
980
+ td[data-row-save-state="error"] {
981
+ z-index: 2;
982
+ }
983
+
984
+ /* ============================================
985
+ TABLE SKELETON STYLES
986
+ ============================================ */
987
+
988
+ .table-skeleton {
989
+ pointer-events: none;
990
+ user-select: none;
991
+ }
992
+
993
+ /* ── v2 skeleton: mirrors the loaded DynamicTable (toolbar → tabs → header bar
994
+ → rows) and stretches full width so there is no narrow grid or layout jump
995
+ when data arrives. ─────────────────────────────────────────────────────── */
996
+ .dt-skel {
997
+ background: var(--background-v2);
998
+ padding: 4px;
999
+ box-sizing: border-box;
1000
+ }
1001
+
1002
+ .dt-skel-toolbar {
1003
+ display: flex;
1004
+ align-items: center;
1005
+ justify-content: space-between;
1006
+ padding: 4px 4px 16px;
1007
+ }
1008
+
1009
+ .dt-skel-tabs {
1010
+ display: flex;
1011
+ align-items: center;
1012
+ justify-content: space-between;
1013
+ padding: 0 4px 12px;
1014
+ }
1015
+
1016
+ .dt-skel-header {
1017
+ display: flex;
1018
+ align-items: center;
1019
+ height: 40px;
1020
+ border-radius: var(--m3-shape-sm);
1021
+ background: var(--table-v2-header-bg);
1022
+ }
1023
+
1024
+ /* Rows match the real table: no borders — separation comes from zebra striping
1025
+ (odd rows white, even rows slate-50) — plus rounded corners on the stripe. */
1026
+ .dt-skel-row {
1027
+ display: flex;
1028
+ align-items: center;
1029
+ height: 44px;
1030
+ border-radius: var(--m3-shape-sm);
1031
+ }
1032
+
1033
+ .dt-skel-row:nth-child(even) {
1034
+ background-color: var(--table-v2-row-stripe);
1035
+ }
1036
+
1037
+ .dt-skel-cell {
1038
+ display: flex;
1039
+ align-items: center;
1040
+ min-width: 0;
1041
+ padding: 0 8px;
1042
+ overflow: hidden;
1043
+ }
1044
+
1045
+ .dt-skel-cell--fixed { flex-grow: 0; flex-shrink: 0; }
1046
+ .dt-skel-cell--center { justify-content: center; }
1047
+
1048
+ /* Placeholder bar in the real table's slate divider tone (`--table-v2-divider`)
1049
+ so the loading state matches the loaded table's palette. Every bar shimmers. */
1050
+ .dt-skel-bar {
1051
+ position: relative;
1052
+ overflow: hidden;
1053
+ background: var(--table-v2-divider);
1054
+ }
1055
+
1056
+ .dt-skel-bar::after {
1057
+ content: '';
1058
+ position: absolute;
1059
+ inset: 0;
1060
+ background: linear-gradient(90deg,
1061
+ transparent 0%,
1062
+ var(--m3-skeleton-shimmer) 50%,
1063
+ transparent 100%);
1064
+ animation: pulse-skeleton 1.5s ease-in-out infinite;
1065
+ pointer-events: none;
1066
+ }
1067
+
1068
+ /* Skeleton specific overrides */
1069
+ .table-skeleton .hot-cell:hover {
1070
+ background: var(--m3-surface-container) !important;
1071
+ cursor: default;
1072
+ }
1073
+
1074
+ .table-skeleton .hot-row-header {
1075
+ background: var(--m3-outline-variant) !important;
1076
+ }
1077
+
1078
+ .table-skeleton .hot-col-header {
1079
+ background: var(--m3-outline-variant) !important;
1080
+ }
1081
+
1082
+ /* Remove borders for cleaner skeleton look */
1083
+ .table-skeleton .hot-cell,
1084
+ .table-skeleton .hot-row-header,
1085
+ .table-skeleton .hot-col-header {
1086
+ border-color: var(--m3-outline-faint);
1087
+ }
1088
+
1089
+ /* ============================================
1090
+ COLUMN RESIZE HANDLE
1091
+ ============================================ */
1092
+
1093
+ .hot-col-resize-handle {
1094
+ position: absolute;
1095
+ right: 0;
1096
+ top: 0;
1097
+ bottom: 0;
1098
+ width: 5px;
1099
+ cursor: col-resize;
1100
+ user-select: none;
1101
+ z-index: 10;
1102
+ }
1103
+
1104
+ .hot-col-resize-handle:hover {
1105
+ background-color: color-mix(in srgb, var(--m3-primary) 30%, transparent);
1106
+ }
1107
+
1108
+ .hot-col-resize-handle:active {
1109
+ background-color: color-mix(in srgb, var(--m3-primary) 50%, transparent);
1110
+ }
1111
+
1112
+
1113
+ .hot-col-sort-btn:hover {
1114
+ color: var(--m3-primary) !important;
1115
+ background-color: color-mix(in srgb, var(--m3-primary) 10%, transparent);
1116
+ border-radius: var(--m3-shape-xs);
1117
+ }
1118
+
1119
+ .hot-col-header {
1120
+ position: relative;
1121
+ user-select: none;
1122
+ }
1123
+
1124
+ .hot-col-header>div {
1125
+ padding: 0 4px;
1126
+ }
1127
+
1128
+ /* ============================================
1129
+ DRAG AND DROP STYLES
1130
+ ============================================ */
1131
+
1132
+ /* The one non-disabled opacity left in this file, on purpose: a drag GHOST is
1133
+ the whole element deliberately faded while its copy follows the pointer —
1134
+ M3's `dragged` state. It is not a text dimmer; muted text uses
1135
+ `--m3-on-surface-variant`. */
1136
+ .dragging {
1137
+ opacity: 0.5;
1138
+ background: var(--m3-surface-container);
1139
+ }
1140
+
1141
+ .drag-over {
1142
+ background: var(--m3-secondary-container);
1143
+ border-top: 2px solid var(--m3-primary);
1144
+ }
1145
+
1146
+ /* ============================================
1147
+ FULLSCREEN OVERLAY STYLES
1148
+ ============================================ */
1149
+
1150
+ .dynamic-table-fullscreen-overlay {
1151
+ position: fixed;
1152
+ inset: 0;
1153
+ z-index: 50;
1154
+ background: var(--m3-surface-container-lowest);
1155
+ display: flex;
1156
+ flex-direction: column;
1157
+ animation: fullscreen-fade-in 0.2s ease-out;
1158
+ }
1159
+
1160
+ @keyframes fullscreen-fade-in {
1161
+ from {
1162
+ opacity: 0;
1163
+ }
1164
+ to {
1165
+ opacity: 1;
1166
+ }
1167
+ }
1168
+
1169
+ .dynamic-table-fullscreen-header {
1170
+ display: flex;
1171
+ align-items: center;
1172
+ justify-content: space-between;
1173
+ padding: 12px 24px;
1174
+ border-bottom: 1px solid var(--m3-outline-faint);
1175
+ background: var(--m3-surface-container-lowest);
1176
+ flex-shrink: 0;
1177
+ }
1178
+
1179
+ .dynamic-table-fullscreen-title {
1180
+ display: flex;
1181
+ align-items: center;
1182
+ gap: 12px;
1183
+ font-size: 16px;
1184
+ font-weight: 600;
1185
+ color: var(--m3-on-surface);
1186
+ }
1187
+
1188
+ .dynamic-table-fullscreen-badge {
1189
+ padding: 4px 10px;
1190
+ background: var(--m3-surface-container);
1191
+ border-radius: var(--m3-shape-full);
1192
+ font-size: 12px;
1193
+ font-weight: 500;
1194
+ color: var(--m3-on-surface-variant);
1195
+ }
1196
+
1197
+ .dynamic-table-fullscreen-close {
1198
+ display: flex;
1199
+ align-items: center;
1200
+ justify-content: center;
1201
+ width: 36px;
1202
+ height: 36px;
1203
+ border: 1px solid var(--m3-outline-faint);
1204
+ border-radius: var(--m3-shape-full);
1205
+ background: var(--m3-surface-container-lowest);
1206
+ color: var(--m3-on-surface-variant);
1207
+ cursor: pointer;
1208
+ transition: var(--m3-transition-state);
1209
+ }
1210
+
1211
+ .dynamic-table-fullscreen-close:hover {
1212
+ background: var(--m3-surface-container);
1213
+ color: var(--m3-on-surface);
1214
+ border-color: var(--m3-on-surface-variant);
1215
+ }
1216
+
1217
+ .dynamic-table-fullscreen-content {
1218
+ flex: 1;
1219
+ overflow: hidden;
1220
+ padding: 24px;
1221
+ }
1222
+
1223
+ .dynamic-table-fullscreen-content .hot-container {
1224
+ height: 100%;
1225
+ border-radius: var(--m3-shape-lg);
1226
+ }
1227
+
1228
+ .dynamic-table-fullscreen-content .hot-virtual-container {
1229
+ height: calc(100% - 90px) !important;
1230
+ }
1231
+
1232
+ /* Fullscreen toggle button */
1233
+ .fullscreen-toggle-btn {
1234
+ display: flex;
1235
+ align-items: center;
1236
+ justify-content: center;
1237
+ width: 32px;
1238
+ height: 32px;
1239
+ border: none;
1240
+ border-radius: var(--m3-shape-full);
1241
+ background: transparent;
1242
+ color: var(--m3-on-surface-variant);
1243
+ cursor: pointer;
1244
+ transition: var(--m3-transition-state);
1245
+ }
1246
+
1247
+ .fullscreen-toggle-btn:hover {
1248
+ background-color: var(--m3-state-layer-hover);
1249
+ color: var(--m3-on-surface);
1250
+ }
1251
+
1252
+ .fullscreen-toggle-btn:active {
1253
+ background-color: var(--m3-state-layer-pressed);
1254
+ }
1255
+
1256
+ .fullscreen-toggle-btn:focus-visible {
1257
+ outline: none;
1258
+ box-shadow: var(--m3-focus-ring-inset);
1259
+ }
1260
+
1261
+ /* ============================================
1262
+ CONDITIONAL CELL STYLING CLASSES
1263
+ Use with cellClassName prop on ColumnDef
1264
+
1265
+ A documented public API (see README) — consumers return these from
1266
+ `cellClassName`, so they are restyled, never removed.
1267
+
1268
+ They used to be 24 hardcoded hex literals plus a mirrored `.dark` set. They
1269
+ now resolve through the semantic status roles in m3.css, which already carry
1270
+ their own per-theme values — so the `.dark` duplicates are gone and there is
1271
+ one declaration per state instead of two.
1272
+ ============================================ */
1273
+
1274
+ .cell-green { background-color: var(--m3-success-container) !important; color: var(--m3-on-success-container); }
1275
+ .cell-yellow { background-color: var(--m3-warning-container) !important; color: var(--m3-on-warning-container); }
1276
+ .cell-red { background-color: var(--m3-error-container) !important; color: var(--m3-on-error-container); }
1277
+
1278
+ /* Hover deepens the container with the M3 hover state layer rather than
1279
+ jumping to a hand-picked second hex. */
1280
+ .cell-green:hover:not([data-save-state]) {
1281
+ background-color: color-mix(in srgb, var(--m3-on-success-container) 8%, var(--m3-success-container)) !important;
1282
+ }
1283
+ .cell-yellow:hover:not([data-save-state]) {
1284
+ background-color: color-mix(in srgb, var(--m3-on-warning-container) 8%, var(--m3-warning-container)) !important;
1285
+ }
1286
+ .cell-red:hover:not([data-save-state]) {
1287
+ background-color: color-mix(in srgb, var(--m3-on-error-container) 8%, var(--m3-error-container)) !important;
1288
+ }
1289
+
1290
+ /* `-subtle` = the same hue washed back over the grid surface; `-bold` = the
1291
+ full-strength container. Both derive from the one role above. */
1292
+ .cell-green-subtle { background-color: color-mix(in srgb, var(--m3-success-container) 45%, var(--m3-surface-container-lowest)) !important; color: var(--m3-on-success-container); }
1293
+ .cell-yellow-subtle { background-color: color-mix(in srgb, var(--m3-warning-container) 45%, var(--m3-surface-container-lowest)) !important; color: var(--m3-on-warning-container); }
1294
+ .cell-red-subtle { background-color: color-mix(in srgb, var(--m3-error-container) 45%, var(--m3-surface-container-lowest)) !important; color: var(--m3-on-error-container); }
1295
+
1296
+ .cell-green-bold { background-color: var(--m3-success) !important; color: var(--m3-on-primary); }
1297
+ .cell-yellow-bold { background-color: var(--m3-warning) !important; color: var(--m3-on-primary); }
1298
+ .cell-red-bold { background-color: var(--m3-error) !important; color: var(--m3-on-primary); }
1299
+
1300
+ /* ============================================
1301
+ TABLE TOOLBAR STYLES
1302
+ ============================================ */
1303
+
1304
+ .hot-toolbar {
1305
+ display: flex;
1306
+ align-items: center;
1307
+ padding: 6px 12px;
1308
+ border-bottom: 1px solid var(--m3-outline-faint);
1309
+ background: var(--m3-surface-container-lowest);
1310
+ gap: 12px;
1311
+ }
1312
+
1313
+ .hot-toolbar-title {
1314
+ font-size: 14px;
1315
+ font-weight: 500;
1316
+ color: var(--m3-on-surface);
1317
+ white-space: nowrap;
1318
+ }
1319
+
1320
+ .hot-toolbar-spacer {
1321
+ flex: 1;
1322
+ }
1323
+
1324
+ .hot-toolbar-actions {
1325
+ display: flex;
1326
+ align-items: center;
1327
+ gap: 8px;
1328
+ }
1329
+
1330
+ .hot-add-row-btn {
1331
+ width: 32px;
1332
+ height: 32px;
1333
+ border-radius: var(--m3-shape-full);
1334
+ border: none;
1335
+ background: transparent;
1336
+ color: var(--m3-on-surface-variant);
1337
+ cursor: pointer;
1338
+ display: flex;
1339
+ align-items: center;
1340
+ justify-content: center;
1341
+ font-size: 18px;
1342
+ transition: var(--m3-transition-state);
1343
+ }
1344
+
1345
+ .hot-add-row-btn:hover {
1346
+ background-color: var(--m3-state-layer-hover);
1347
+ color: var(--m3-on-surface);
1348
+ }
1349
+
1350
+ .hot-add-row-btn:active {
1351
+ background-color: var(--m3-state-layer-pressed);
1352
+ }
1353
+
1354
+ .hot-add-row-btn:focus-visible {
1355
+ outline: none;
1356
+ box-shadow: var(--m3-focus-ring-inset);
1357
+ }
1358
+
1359
+ .hot-empty-message {
1360
+ display: flex;
1361
+ align-items: center;
1362
+ justify-content: center;
1363
+ padding: 32px 16px;
1364
+ font-size: 14px;
1365
+ color: var(--m3-on-surface-variant);
1366
+ }
1367
+
1368
+ /* Ledger 2.20 — the zero-result state.
1369
+ Sticky-left so the panel stays centred in the VIEWPORT of a horizontally
1370
+ scrolled 57-column grid instead of sitting off-screen at x=4000, and pinned
1371
+ to the viewport width for the same reason. */
1372
+ /* A band, not a strip: the panel sits in the middle of a generous block under
1373
+ the headers instead of clinging to them with 700px of void underneath. Capped
1374
+ at half the viewport so a short window still shows it without scrolling. */
1375
+ .hot-empty-message:has(.hot-empty-state) {
1376
+ min-height: min(360px, 50vh);
1377
+ }
1378
+
1379
+ .hot-empty-state {
1380
+ position: sticky;
1381
+ left: 0;
1382
+ display: flex;
1383
+ flex-direction: column;
1384
+ align-items: center;
1385
+ gap: 8px;
1386
+ width: 100%;
1387
+ max-width: 420px;
1388
+ padding: 24px 16px;
1389
+ text-align: center;
1390
+ }
1391
+
1392
+ .hot-empty-state-icon {
1393
+ width: 28px;
1394
+ height: 28px;
1395
+ margin-bottom: 4px;
1396
+ color: var(--m3-on-surface-variant);
1397
+
1398
+ }
1399
+
1400
+ .hot-empty-state-title {
1401
+ margin: 0;
1402
+ color: var(--m3-on-surface);
1403
+ }
1404
+
1405
+ .hot-empty-state-detail {
1406
+ margin: 0;
1407
+ color: var(--m3-on-surface-variant);
1408
+ }
1409
+
1410
+ .hot-empty-state-actions {
1411
+ display: flex;
1412
+ gap: 8px;
1413
+ margin-top: 8px;
1414
+ }
1415
+
1416
+ /* HEDGE-119 — the failed-load state.
1417
+ Same geometry as the empty state (it occupies the same slot under the
1418
+ headers), different COLOUR, because the one thing that must never happen
1419
+ again is these two reading as the same thing at a glance. */
1420
+ .hot-load-error-state {
1421
+ max-width: 480px;
1422
+ }
1423
+
1424
+ .hot-load-error-icon {
1425
+ color: var(--m3-error, #b3261e);
1426
+ }
1427
+
1428
+ /* ============================================
1429
+ EDITOR DROPDOWN STYLES (autocomplete, search)
1430
+ ============================================ */
1431
+
1432
+ .hot-editor-dropdown {
1433
+ position: absolute;
1434
+ z-index: 10001;
1435
+ background: var(--m3-surface-container);
1436
+ border: 1px solid var(--m3-outline-variant);
1437
+ border-radius: var(--m3-shape-md);
1438
+ box-shadow: var(--m3-elevation-2);
1439
+ min-width: 200px;
1440
+ max-height: 300px;
1441
+ overflow: auto;
1442
+ }
1443
+
1444
+ .hot-editor-dropdown-item {
1445
+ padding: 8px 12px;
1446
+ cursor: pointer;
1447
+ font-size: 13px;
1448
+ color: var(--m3-on-surface);
1449
+ transition: background-color var(--m3-duration-short3) var(--m3-ease-standard);
1450
+ }
1451
+
1452
+ .hot-editor-dropdown-item:hover,
1453
+ .hot-editor-dropdown-item.highlighted {
1454
+ background: var(--m3-row-hover);
1455
+ }
1456
+
1457
+ .hot-editor-dropdown-item.selected {
1458
+ background: var(--m3-secondary-container);
1459
+ color: var(--m3-primary);
1460
+ }
1461
+
1462
+ .hot-editor-dropdown-empty {
1463
+ padding: 12px;
1464
+ font-size: 13px;
1465
+ color: var(--m3-on-surface-variant);
1466
+ text-align: center;
1467
+ }
1468
+
1469
+ .hot-editor-dropdown-item-primary {
1470
+ font-weight: 500;
1471
+ color: var(--m3-on-surface);
1472
+ }
1473
+
1474
+ .hot-editor-dropdown-item-secondary {
1475
+ font-size: 12px;
1476
+ color: var(--m3-on-surface-variant);
1477
+ margin-top: 2px;
1478
+ }
1479
+
1480
+ /* ============================================
1481
+ GROUP HEADER ROW
1482
+ ============================================ */
1483
+
1484
+ .hot-group-header-row {
1485
+ display: flex;
1486
+ align-items: center;
1487
+ background: var(--m3-surface-container);
1488
+ cursor: pointer;
1489
+ user-select: none;
1490
+ border-bottom: 1px solid var(--m3-outline-faint);
1491
+ }
1492
+
1493
+ .hot-group-header-row:hover {
1494
+ background: color-mix(in srgb, var(--m3-surface-container) 70%, var(--m3-secondary-container) 30%);
1495
+ }
1496
+
1497
+ .hot-group-header-cell {
1498
+ display: flex;
1499
+ align-items: center;
1500
+ padding: 0;
1501
+ height: 40px;
1502
+ }
1503
+
1504
+ /* Zero-width sticky cell holding the group label. It takes no horizontal space
1505
+ in the flex row (the label overflows to the right over the band-fill cell) so
1506
+ the band keeps aligning with the data rows, while `position: sticky` (set
1507
+ inline) keeps the label pinned to the left edge during horizontal scroll.
1508
+ The `.hot-container` prefix out-specifies `.hot-container .hot-table td`
1509
+ (overflow:hidden + 12px padding), which would otherwise clip the overflowing
1510
+ label to the chevron and leave a 24px gap that pushes the band to the right. */
1511
+ .hot-container .hot-table td.hot-group-header-label-cell,
1512
+ .hot-container .hot-table td.hot-group-summary-label-cell {
1513
+ display: flex;
1514
+ align-items: center;
1515
+ align-self: stretch;
1516
+ flex: 0 0 0px;
1517
+ width: 0;
1518
+ min-width: 0;
1519
+ padding: 0;
1520
+ overflow: visible;
1521
+ white-space: nowrap;
1522
+ cursor: pointer;
1523
+ }
1524
+
1525
+ /* Keep the label at its natural width and let it overflow the zero-width cell
1526
+ (don't let the flex parent shrink it to fit the 0px basis). */
1527
+ .hot-group-header-label-cell > .hot-group-header-content,
1528
+ .hot-group-summary-label-cell > .hot-group-summary-label {
1529
+ flex-shrink: 0;
1530
+ }
1531
+
1532
+ .hot-group-header-content {
1533
+ display: flex;
1534
+ align-items: center;
1535
+ gap: 8px;
1536
+ padding-right: 12px;
1537
+ font-size: 13px;
1538
+ }
1539
+
1540
+ .hot-group-header-chevron {
1541
+ width: 14px;
1542
+ height: 14px;
1543
+ color: var(--m3-on-surface-variant);
1544
+ flex-shrink: 0;
1545
+ }
1546
+
1547
+ .hot-group-header-field {
1548
+ color: var(--m3-on-surface-variant);
1549
+ font-size: 11px;
1550
+ text-transform: uppercase;
1551
+ letter-spacing: 0.05em;
1552
+ font-weight: 500;
1553
+ }
1554
+
1555
+ .hot-group-header-value {
1556
+ color: var(--m3-on-surface);
1557
+ font-weight: 600;
1558
+ }
1559
+
1560
+ .hot-group-header-count {
1561
+ display: inline-flex;
1562
+ align-items: center;
1563
+ justify-content: center;
1564
+ min-width: 20px;
1565
+ height: 20px;
1566
+ padding: 0 6px;
1567
+ border-radius: var(--m3-shape-full);
1568
+ background: var(--m3-outline-faint);
1569
+ color: var(--m3-on-surface-variant);
1570
+ font-size: 11px;
1571
+ font-weight: 500;
1572
+ }
1573
+
1574
+ /* ============================================
1575
+ GROUP SUMMARY (SUBTOTAL) ROW
1576
+ ============================================ */
1577
+
1578
+ .hot-group-summary-row {
1579
+ display: flex;
1580
+ align-items: center;
1581
+ background: var(--m3-surface-container);
1582
+ border-top: 1px solid var(--m3-outline-faint);
1583
+ cursor: default;
1584
+ }
1585
+
1586
+ /* The subtotal row is read-only — drop the spreadsheet `cursor: cell` (+) from
1587
+ its cells, and the `pointer` the label cell + row-header spacer inherit from
1588
+ the group header / selectable row header. */
1589
+ .hot-group-summary-cell {
1590
+ cursor: default;
1591
+ }
1592
+ .hot-container .hot-table td.hot-group-summary-label-cell,
1593
+ .hot-group-summary-rowheader {
1594
+ cursor: default;
1595
+ }
1596
+
1597
+ /* No interactive hover on a read-only subtotal row — keep cells flush with the
1598
+ row band instead of flashing the cell-hover tint. */
1599
+ .hot-group-summary-row .hot-cell:hover:not([data-save-state]) {
1600
+ background: transparent;
1601
+ }
1602
+
1603
+ .hot-group-summary-label {
1604
+ display: flex;
1605
+ align-items: center;
1606
+ gap: 6px;
1607
+ font-size: 11px;
1608
+ font-weight: 600;
1609
+ text-transform: uppercase;
1610
+ letter-spacing: 0.05em;
1611
+ color: var(--m3-on-surface-variant);
1612
+ }
1613
+
1614
+ .hot-group-summary-sigma {
1615
+ width: 13px;
1616
+ height: 13px;
1617
+ flex-shrink: 0;
1618
+ }
1619
+
1620
+ .hot-group-summary-cell {
1621
+ display: flex;
1622
+ align-items: center;
1623
+ justify-content: flex-end;
1624
+ }
1625
+
1626
+ /* Numbers read right-aligned and a touch heavier so the subtotal stands out. */
1627
+ .hot-group-summary-value {
1628
+ width: 100%;
1629
+ text-align: right;
1630
+ font-weight: 600;
1631
+ color: var(--m3-on-surface);
1632
+ }
1633
+
1634
+ /* ============================================
1635
+ CLICKABLE ROW MODE
1636
+ Pure CSS hover - no JS state needed
1637
+ ============================================ */
1638
+
1639
+ /* Clickable rows - cursor on both row and cells */
1640
+ [data-clickable-rows="true"] tr[data-row],
1641
+ [data-clickable-rows="true"] tr[data-row] td {
1642
+ cursor: pointer;
1643
+ }
1644
+
1645
+ /* Smooth transition for hover effect */
1646
+ [data-clickable-rows="true"] tr[data-row] td {
1647
+ transition: background-color var(--m3-duration-short2) var(--m3-ease-standard);
1648
+ }
1649
+
1650
+ /* Hover state - default style (light blue) */
1651
+ [data-row-hover-style="default"] tr[data-row]:hover td {
1652
+ background-color: var(--m3-row-hover) !important;
1653
+ }
1654
+
1655
+ /* Hover state - subtle style (light gray) */
1656
+ [data-row-hover-style="subtle"] tr[data-row]:hover td {
1657
+ background-color: var(--m3-row-hover) !important;
1658
+ }
1659
+
1660
+ /* Hover state - accent style (theme accent) */
1661
+ [data-row-hover-style="accent"] tr[data-row]:hover td {
1662
+ background-color: var(--m3-surface-container) !important;
1663
+ }
1664
+
1665
+ /* Don't apply hover to new rows (keep yellow) */
1666
+ [data-clickable-rows="true"] tr[data-row][data-is-new="true"]:hover td {
1667
+ background-color: color-mix(in srgb, var(--m3-on-primary-container) 8%, var(--m3-primary-container)) !important;
1668
+ }
1669
+
1670
+ /* Keep selection border visible when hovering selected cell */
1671
+ [data-clickable-rows="true"] tr[data-row]:hover td[data-cell-selected="true"] {
1672
+ box-shadow: inset 0 0 0 2px var(--m3-accent) !important;
1673
+ }
1674
+
1675
+ /* ============================================
1676
+ EXTERNALLY HIGHLIGHTED ROW
1677
+ Same styling as hover, for syncing selection
1678
+ with external components (e.g., 3D visualization)
1679
+ ============================================ */
1680
+
1681
+ /* Highlighted row - default style (light blue) */
1682
+ [data-row-hover-style="default"] tr[data-row-highlighted="true"] td,
1683
+ [data-clickable-rows="true"]:not([data-row-hover-style]) tr[data-row-highlighted="true"] td {
1684
+ background-color: var(--m3-row-hover) !important;
1685
+ }
1686
+
1687
+ /* Highlighted row - subtle style (light gray) */
1688
+ [data-row-hover-style="subtle"] tr[data-row-highlighted="true"] td {
1689
+ background-color: var(--m3-row-hover) !important;
1690
+ }
1691
+
1692
+ /* Highlighted row - accent style (theme accent) */
1693
+ [data-row-hover-style="accent"] tr[data-row-highlighted="true"] td {
1694
+ background-color: var(--m3-surface-container) !important;
1695
+ }
1696
+
1697
+ /* Don't apply highlight to new rows (keep yellow) */
1698
+ tr[data-row-highlighted="true"][data-is-new="true"] td {
1699
+ background-color: color-mix(in srgb, var(--m3-on-primary-container) 8%, var(--m3-primary-container)) !important;
1700
+ }
1701
+
1702
+ /* Keep selection border visible on highlighted row */
1703
+ tr[data-row-highlighted="true"] td[data-cell-selected="true"] {
1704
+ box-shadow: inset 0 0 0 2px var(--m3-accent) !important;
1705
+ }
1706
+
1707
+ /* ============================================
1708
+ MODERN LAYOUT - TABS ROW
1709
+ ============================================ */
1710
+
1711
+ .hot-tabs-row {
1712
+ display: flex;
1713
+ align-items: center;
1714
+ gap: 4px;
1715
+ padding: 4px 8px;
1716
+ border-bottom: 1px solid var(--m3-outline-faint);
1717
+ background: var(--m3-surface-container-lowest);
1718
+ min-height: 36px;
1719
+ }
1720
+
1721
+ .hot-tabs-row-spacer {
1722
+ flex: 1;
1723
+ }
1724
+
1725
+ /* Top Tabs Variant */
1726
+ .hot-top-tabs {
1727
+ display: flex;
1728
+ align-items: center;
1729
+ gap: 2px;
1730
+ overflow-x: auto;
1731
+ scrollbar-width: none;
1732
+ }
1733
+
1734
+ .hot-top-tabs::-webkit-scrollbar {
1735
+ display: none;
1736
+ }
1737
+
1738
+ .hot-top-tab {
1739
+ padding: 4px 12px;
1740
+ font-size: 13px;
1741
+ font-weight: 500;
1742
+ color: var(--m3-on-surface-variant);
1743
+ background: transparent;
1744
+ border: none;
1745
+ border-bottom: 2px solid transparent;
1746
+ cursor: pointer;
1747
+ white-space: nowrap;
1748
+ transition: var(--m3-transition-state);
1749
+ border-radius: var(--m3-shape-full);
1750
+ }
1751
+
1752
+ .hot-top-tab:hover {
1753
+ background-color: var(--m3-state-layer-hover);
1754
+ color: var(--m3-on-surface);
1755
+ }
1756
+
1757
+ .hot-top-tab:focus-visible {
1758
+ outline: none;
1759
+ box-shadow: var(--m3-focus-ring-inset);
1760
+ }
1761
+
1762
+ /* Selected = a tinted container, not an underline. The transparent 2px bottom
1763
+ border above is kept purely for geometry (the tab row height is frozen); the
1764
+ colour on it is retired so the pill is the only indicator. */
1765
+ .hot-top-tab.active {
1766
+ background-color: var(--m3-secondary-container);
1767
+ color: var(--m3-on-secondary-container);
1768
+ border-bottom-color: transparent;
1769
+ }
1770
+
1771
+ .hot-top-tab-wrapper {
1772
+ display: flex;
1773
+ align-items: center;
1774
+ position: relative;
1775
+ }
1776
+
1777
+ .hot-top-tab-close {
1778
+ display: none;
1779
+ position: absolute;
1780
+ right: -2px;
1781
+ top: 0;
1782
+ width: 16px;
1783
+ height: 16px;
1784
+ font-size: 10px;
1785
+ line-height: 16px;
1786
+ text-align: center;
1787
+ color: var(--m3-on-surface-variant);
1788
+ background: var(--m3-surface-container);
1789
+ border: none;
1790
+ border-radius: var(--m3-shape-full);
1791
+ cursor: pointer;
1792
+ }
1793
+
1794
+ .hot-top-tab-wrapper:hover .hot-top-tab-close {
1795
+ display: block;
1796
+ }
1797
+
1798
+ .hot-top-tab-close:hover {
1799
+ color: var(--m3-on-error-container);
1800
+ background: var(--m3-error-container);
1801
+ }
1802
+
1803
+ .hot-top-tab-add {
1804
+ color: var(--m3-on-surface-variant);
1805
+ font-size: 16px;
1806
+ padding: 4px 8px;
1807
+ }
1808
+
1809
+ .hot-top-tab-add:hover {
1810
+ background-color: var(--m3-state-layer-hover);
1811
+ color: var(--m3-on-surface);
1812
+ }
1813
+
1814
+ .hot-top-tab-input {
1815
+ padding: 2px 8px;
1816
+ font-size: 13px;
1817
+ border: 1px solid var(--m3-focus-ring-color);
1818
+ border-radius: var(--m3-shape-sm);
1819
+ outline: none;
1820
+ background: var(--m3-surface-container-lowest);
1821
+ color: var(--m3-on-surface);
1822
+ }
1823
+
1824
+ /* ============================================
1825
+ MODERN LAYOUT - COLUMN HEADER MENU
1826
+ ============================================ */
1827
+
1828
+ .hot-col-header-modern {
1829
+ cursor: pointer;
1830
+ }
1831
+
1832
+ .hot-col-header-modern:hover {
1833
+ background: var(--m3-row-hover) !important;
1834
+ }
1835
+
1836
+ .hot-col-sort-indicator {
1837
+ font-size: 12px;
1838
+ color: var(--m3-accent);
1839
+ padding: 0 4px;
1840
+ flex-shrink: 0;
1841
+ }
1842
+
1843
+ .hot-col-menu {
1844
+ min-width: 180px;
1845
+ background: var(--m3-surface-container);
1846
+ border: 1px solid var(--m3-outline-variant);
1847
+ border-radius: var(--m3-shape-md);
1848
+ box-shadow: var(--m3-elevation-2);
1849
+ padding: 4px;
1850
+ z-index: 9999;
1851
+ }
1852
+
1853
+ .hot-col-menu-item {
1854
+ display: flex;
1855
+ align-items: center;
1856
+ gap: 8px;
1857
+ width: 100%;
1858
+ padding: 6px 10px;
1859
+ font-size: 13px;
1860
+ color: var(--m3-on-surface);
1861
+ background: transparent;
1862
+ border: none;
1863
+ border-radius: var(--m3-shape-sm);
1864
+ cursor: pointer;
1865
+ text-align: left;
1866
+ transition: background-color var(--m3-duration-short2) var(--m3-ease-standard);
1867
+ }
1868
+
1869
+ .hot-col-menu-item:hover:not(:disabled) {
1870
+ background: var(--m3-state-layer-hover);
1871
+ }
1872
+
1873
+ .hot-col-menu-item:disabled {
1874
+ opacity: var(--m3-disabled-content-opacity);
1875
+ cursor: default;
1876
+ }
1877
+
1878
+ .hot-col-menu-item svg {
1879
+ flex-shrink: 0;
1880
+ color: var(--m3-on-surface-variant);
1881
+ }
1882
+
1883
+ .hot-col-menu-divider {
1884
+ height: 1px;
1885
+ background: var(--m3-outline-faint);
1886
+ margin: 4px 0;
1887
+ }
1888
+
1889
+ /* ============================================
1890
+ MODERN LAYOUT - CONFIGURE VIEW PANEL
1891
+ ============================================ */
1892
+
1893
+ /* ============================================
1894
+ CONFIGURE VIEW PANEL
1895
+ ============================================ */
1896
+
1897
+ /* Overlay: dark scrim, no blur */
1898
+ .hot-config-overlay {
1899
+ backdrop-filter: none !important;
1900
+ -webkit-backdrop-filter: none !important;
1901
+ background: var(--m3-scrim) !important;
1902
+ }
1903
+
1904
+ /* Panel: override Sheet's p-6, max-w-md */
1905
+ .hot-config-panel {
1906
+ max-width: 480px !important;
1907
+ padding: 0 !important;
1908
+ font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
1909
+ }
1910
+
1911
+ .hot-config-panel-inner {
1912
+ display: flex;
1913
+ flex-direction: column;
1914
+ height: 100%;
1915
+ }
1916
+
1917
+ /* Header */
1918
+ .hot-config-panel-header {
1919
+ padding: 20px 20px 16px;
1920
+ border-bottom: 1px solid var(--m3-outline-faint);
1921
+ }
1922
+
1923
+ .hot-config-panel-header-row {
1924
+ display: flex;
1925
+ align-items: flex-start;
1926
+ justify-content: space-between;
1927
+ }
1928
+
1929
+ .hot-config-panel-title {
1930
+ font-size: 18px;
1931
+ font-weight: 600;
1932
+ color: var(--m3-on-surface);
1933
+ margin: 0;
1934
+ line-height: 1.3;
1935
+ }
1936
+
1937
+ .hot-config-panel-close {
1938
+ width: 24px;
1939
+ height: 24px;
1940
+ display: flex;
1941
+ align-items: center;
1942
+ justify-content: center;
1943
+ background: transparent;
1944
+ border: none;
1945
+ color: var(--m3-on-surface-variant);
1946
+ cursor: pointer;
1947
+ border-radius: var(--m3-shape-full);
1948
+ flex-shrink: 0;
1949
+ }
1950
+
1951
+ .hot-config-panel-close:hover {
1952
+ background-color: var(--m3-state-layer-hover);
1953
+ color: var(--m3-on-surface);
1954
+ }
1955
+
1956
+ .hot-config-panel-close:active {
1957
+ background-color: var(--m3-state-layer-pressed);
1958
+ }
1959
+
1960
+ .hot-config-panel-close:focus-visible {
1961
+ outline: none;
1962
+ box-shadow: var(--m3-focus-ring-inset);
1963
+ }
1964
+
1965
+ .hot-config-panel-subtitle {
1966
+ font-size: 14px;
1967
+ color: var(--m3-on-surface-variant);
1968
+ margin: 2px 0 0;
1969
+ line-height: 1.4;
1970
+ }
1971
+
1972
+ /* Body */
1973
+ .hot-config-panel-body {
1974
+ display: flex;
1975
+ flex-direction: column;
1976
+ gap: 8px;
1977
+ flex: 1;
1978
+ overflow-y: auto;
1979
+ padding: 16px 20px 0;
1980
+ }
1981
+
1982
+ /* Collapsible Sections */
1983
+ .hot-config-section {
1984
+ border: 1px solid var(--m3-outline-faint);
1985
+ border-radius: var(--m3-shape-md);
1986
+ overflow: hidden;
1987
+ }
1988
+
1989
+ .hot-config-section-header {
1990
+ display: flex;
1991
+ align-items: center;
1992
+ gap: 8px;
1993
+ width: 100%;
1994
+ padding: 12px 14px;
1995
+ font-size: 14px;
1996
+ font-weight: 600;
1997
+ color: var(--m3-on-surface);
1998
+ background: transparent;
1999
+ border: none;
2000
+ cursor: pointer;
2001
+ text-align: left;
2002
+ }
2003
+
2004
+ .hot-config-section-header:hover {
2005
+ background: var(--m3-surface-container);
2006
+ }
2007
+
2008
+ .hot-config-section-header svg {
2009
+ flex-shrink: 0;
2010
+ color: var(--m3-on-surface-variant);
2011
+ }
2012
+
2013
+ /* Ledger 10.5 — the chevrons were ragged: eight section rows, eight different
2014
+ chevron positions (x = 1421, 1427, 1434, 1472, 1474, 1494, 1525 … and 1869).
2015
+ Cause: the title was `flex: 0 0 auto` and only the BADGE carried
2016
+ `margin-left: auto`, so a row WITH a badge pushed its chevron flush right
2017
+ while a row WITHOUT one left the chevron hugging the end of its own label —
2018
+ a different x for every label length.
2019
+
2020
+ Letting the TITLE take the free space fixes both cases with one declaration:
2021
+ the chevron is now the last item on a full-width row, so it lands on the same
2022
+ x in every section, and a badge still sits immediately to its left. */
2023
+ .hot-config-section-title {
2024
+ flex: 1 1 auto;
2025
+ min-width: 0;
2026
+ overflow: hidden;
2027
+ text-overflow: ellipsis;
2028
+ white-space: nowrap;
2029
+ }
2030
+
2031
+ .hot-config-section-badge {
2032
+ flex: 0 0 auto;
2033
+ font-size: 12px;
2034
+ font-weight: 400;
2035
+ white-space: nowrap;
2036
+ color: var(--m3-on-surface-variant);
2037
+ }
2038
+
2039
+ .hot-config-section-chevron {
2040
+ flex-shrink: 0;
2041
+ color: var(--m3-on-surface-variant);
2042
+ }
2043
+
2044
+ /* Fields Section */
2045
+ .hot-config-fields {
2046
+ padding: 0 14px 12px;
2047
+ }
2048
+
2049
+ .hot-config-fields-toolbar {
2050
+ display: flex;
2051
+ align-items: center;
2052
+ justify-content: flex-end;
2053
+ gap: 12px;
2054
+ padding: 2px 0 8px;
2055
+ }
2056
+
2057
+ .hot-config-fields-toolbar-spacer {
2058
+ flex: 1;
2059
+ }
2060
+
2061
+ .hot-config-fields-bulk-btn {
2062
+ font-size: 13px;
2063
+ font-weight: 500;
2064
+ color: var(--m3-on-surface-variant);
2065
+ background: transparent;
2066
+ border: none;
2067
+ cursor: pointer;
2068
+ padding: 0;
2069
+ }
2070
+
2071
+ .hot-config-fields-bulk-btn:hover {
2072
+ color: var(--m3-on-surface);
2073
+ }
2074
+
2075
+ .hot-config-fields-list {
2076
+ display: flex;
2077
+ flex-direction: column;
2078
+ max-height: 400px;
2079
+ overflow-y: auto;
2080
+ }
2081
+
2082
+ .hot-config-fields-item {
2083
+ display: flex;
2084
+ align-items: center;
2085
+ gap: 10px;
2086
+ padding: 10px 12px;
2087
+ cursor: pointer;
2088
+ font-size: 14px;
2089
+ border: 1px solid var(--m3-outline-faint);
2090
+ margin-top: -1px;
2091
+ }
2092
+
2093
+ .hot-config-fields-item:first-child {
2094
+ margin-top: 0;
2095
+ border-radius: var(--m3-shape-sm) var(--m3-shape-sm) 0 0;
2096
+ }
2097
+
2098
+ .hot-config-fields-item:last-child {
2099
+ border-radius: 0 0 var(--m3-shape-sm) var(--m3-shape-sm);
2100
+ }
2101
+
2102
+ .hot-config-fields-item:first-child:last-child {
2103
+ border-radius: var(--m3-shape-sm);
2104
+ }
2105
+
2106
+ .hot-config-fields-item:hover {
2107
+ background: var(--m3-surface-container);
2108
+ }
2109
+
2110
+ /* Drag ghost — see the note on `.dragging`. */
2111
+ .hot-config-fields-item.is-dragging {
2112
+ opacity: 0.5;
2113
+ background: var(--m3-surface-container);
2114
+ }
2115
+
2116
+ .hot-config-fields-item.is-drag-over {
2117
+ background: var(--m3-secondary-container);
2118
+ border-top-color: var(--m3-primary);
2119
+ }
2120
+
2121
+ .hot-config-fields-grip {
2122
+ color: var(--m3-on-surface-variant);
2123
+ flex-shrink: 0;
2124
+ cursor: grab;
2125
+ }
2126
+
2127
+ .hot-config-fields-item.is-dragging .hot-config-fields-grip {
2128
+ cursor: grabbing;
2129
+ }
2130
+
2131
+ /* No `accent-color` here on purpose. Exactly ONE rule owns the checked-checkbox
2132
+ colour for this control — `.hot-appearance-v2 .hot-config-fields-checkbox` in
2133
+ DynamicTable.v2.css, which paints it TEAL (`--m3-focus-ring-color`) to match
2134
+ every other checked control in the app. `hot-appearance-v2` is applied
2135
+ unconditionally (DynamicTable.tsx and ConfigureViewPanel.tsx), so there is no
2136
+ unstyled path; a second declaration here could only ever contradict it. */
2137
+ .hot-config-fields-checkbox {
2138
+ width: 16px;
2139
+ height: 16px;
2140
+ flex-shrink: 0;
2141
+ }
2142
+
2143
+ .hot-config-fields-label {
2144
+ color: var(--m3-on-surface);
2145
+ }
2146
+
2147
+ .hot-config-fields-label.is-hidden {
2148
+ color: var(--m3-on-surface-variant);
2149
+ }
2150
+
2151
+ /* Filters Section */
2152
+ .hot-config-filters {
2153
+ padding: 8px 14px 12px;
2154
+ display: flex;
2155
+ flex-direction: column;
2156
+ gap: 8px;
2157
+ }
2158
+
2159
+ /* The generic collapsible-section body. It was referenced by four call sites
2160
+ (the Date format dropdown, Calculated columns, and both Summarised-columns
2161
+ placeholder states) and defined by none — and `.hot-config-section` carries
2162
+ no padding of its own, so all four rendered flush against the section
2163
+ border while every sibling section was inset by 14px. Padding and gap are
2164
+ copied from `.hot-config-filters` directly above so the sections line up
2165
+ rather than merely look similar. */
2166
+ .hot-config-section-body {
2167
+ padding: 8px 14px 12px;
2168
+ display: flex;
2169
+ flex-direction: column;
2170
+ gap: 8px;
2171
+ }
2172
+
2173
+ .hot-config-filters-label {
2174
+ font-size: 13px;
2175
+ font-weight: 500;
2176
+ color: var(--m3-on-surface);
2177
+ }
2178
+
2179
+ .hot-config-filter-row {
2180
+ display: flex;
2181
+ align-items: center;
2182
+ gap: 6px;
2183
+ }
2184
+
2185
+ /* The rollup picker's three-step row: [source][field][function][remove].
2186
+ As a plain flex row the selects were content-sized, so two stacked rows
2187
+ measured 96/150/73 and 96/126/101 — three ragged columns where the whole
2188
+ point of the row is that step 2 of one rule sits under step 2 of the next.
2189
+ A grid pins the tracks instead. The field track gets the extra weight
2190
+ because it holds the longest labels ("Number of records", "Estimated
2191
+ cost"); `minmax(0, …)` lets `.hot-select-trigger-label` ellipsize rather
2192
+ than force the track wider, which is what would reintroduce the ragging. */
2193
+ [data-rollup-editor] .hot-config-filter-row {
2194
+ display: grid;
2195
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1.35fr) minmax(0, 1fr) auto;
2196
+ align-items: center;
2197
+ gap: 6px;
2198
+ }
2199
+
2200
+ /* `var(--m3-surface-container)`, NOT the bare literal. The fill was hard-coded
2201
+ `rgb(243,243,245)` while the label used `var(--m3-on-surface)`, so in dark mode the
2202
+ whole Configure View filter/sort builder rendered #f8fafc text on a #f3f3f5
2203
+ pill — a 1.04:1 contrast ratio, i.e. invisible. Same class of bug the
2204
+ `--hot-dropdown-hover` comment further down already records for the menu
2205
+ hover; the controls themselves were missed. Light mode is unchanged
2206
+ (`--secondary-v2` is #F4F4F5). */
2207
+ .hot-config-filter-select {
2208
+ padding: 6px 28px 6px 10px;
2209
+ font-size: 13px;
2210
+ border: none;
2211
+ border-radius: var(--m3-shape-sm);
2212
+ background: var(--m3-surface-container);
2213
+ color: var(--m3-on-surface);
2214
+ min-width: 0;
2215
+ cursor: pointer;
2216
+ appearance: none;
2217
+ -webkit-appearance: none;
2218
+ /* No background-image chevron: these classes land on `SelectMenu`, which
2219
+ renders its own <ChevronDown>. The data-URI drew a second one, and its
2220
+ stroke was a baked-in #6b7280 that never followed the theme. */
2221
+ }
2222
+
2223
+ .hot-config-filter-operator {
2224
+ flex-shrink: 0;
2225
+ }
2226
+
2227
+ /* The colour picker in a Highlighting rule. Without this it is the control the
2228
+ flex row chooses to crush: a rule on a long column name ("Cost lines ·
2229
+ Average of Estimated cost") squeezed it to a literal "R…", i.e. a colour
2230
+ picker that does not show which colour is picked. The FIELD select keeps
2231
+ min-width:0 and absorbs the truncation instead, which is the right one to
2232
+ shorten — its full text is still readable in the open menu. */
2233
+ .hot-config-cf-style {
2234
+ flex-shrink: 0;
2235
+ }
2236
+
2237
+ .hot-config-filter-remove {
2238
+ width: 24px;
2239
+ height: 24px;
2240
+ display: flex;
2241
+ align-items: center;
2242
+ justify-content: center;
2243
+ background: transparent;
2244
+ border: none;
2245
+ color: var(--m3-on-surface-variant);
2246
+ cursor: pointer;
2247
+ border-radius: var(--m3-shape-full);
2248
+ flex-shrink: 0;
2249
+ }
2250
+
2251
+ .hot-config-filter-remove:hover {
2252
+ background-color: var(--m3-state-layer-error-hover);
2253
+ color: var(--m3-error);
2254
+ }
2255
+
2256
+ .hot-config-filter-remove:focus-visible {
2257
+ outline: none;
2258
+ box-shadow: var(--m3-focus-ring-inset);
2259
+ }
2260
+
2261
+ .hot-config-filter-pill {
2262
+ display: inline-flex;
2263
+ align-items: center;
2264
+ gap: 2px;
2265
+ padding: 2px 8px;
2266
+ font-size: 13px;
2267
+ background: var(--m3-secondary-container);
2268
+ color: var(--m3-primary);
2269
+ border-radius: var(--m3-shape-full);
2270
+ }
2271
+
2272
+ .hot-config-filter-pill-remove {
2273
+ background: transparent;
2274
+ border: none;
2275
+ color: inherit;
2276
+ cursor: pointer;
2277
+ padding: 0 2px;
2278
+ font-size: 12px;
2279
+ }
2280
+
2281
+ .hot-config-filter-input {
2282
+ flex: 1;
2283
+ min-width: 70px;
2284
+ padding: 6px 8px;
2285
+ font-size: 13px;
2286
+ border: none;
2287
+ border-radius: var(--m3-shape-sm);
2288
+ background: var(--m3-surface-container);
2289
+ color: var(--m3-on-surface);
2290
+ outline: none;
2291
+ }
2292
+
2293
+ .hot-config-filter-input:focus {
2294
+ box-shadow: var(--m3-focus-halo);
2295
+ outline: 1px solid var(--m3-focus-ring-color);
2296
+ }
2297
+
2298
+ /* Relative date count (is_in_next / is_in_last): narrow numeric box sitting
2299
+ next to the unit select, instead of the flex-stretched value input. */
2300
+ .hot-config-filter-relative-count {
2301
+ flex: 0 0 auto;
2302
+ width: 64px;
2303
+ min-width: 64px;
2304
+ }
2305
+
2306
+ /* Date trigger button — looks like the filter input but renders a calendar
2307
+ popover anchored to it (FilterDatePicker). Reuses .hot-config-filter-input
2308
+ for sizing/colors then layers in the trigger affordances. */
2309
+ .hot-config-filter-date-trigger {
2310
+ display: inline-flex;
2311
+ align-items: center;
2312
+ justify-content: space-between;
2313
+ gap: 6px;
2314
+ cursor: pointer;
2315
+ text-align: left;
2316
+ }
2317
+
2318
+ .hot-config-filter-date-placeholder {
2319
+ color: var(--m3-on-surface-variant);
2320
+ }
2321
+
2322
+ /* Sort Section */
2323
+ .hot-config-sorting {
2324
+ padding: 8px 14px 12px;
2325
+ display: flex;
2326
+ flex-direction: column;
2327
+ gap: 8px;
2328
+ }
2329
+
2330
+ .hot-config-sorting-empty {
2331
+ font-size: 14px;
2332
+ color: var(--m3-on-surface-variant);
2333
+ padding: 4px 0;
2334
+ }
2335
+
2336
+ .hot-config-sorting-header {
2337
+ display: flex;
2338
+ align-items: center;
2339
+ justify-content: space-between;
2340
+ }
2341
+
2342
+ .hot-config-sorting-header-label {
2343
+ font-size: 13px;
2344
+ font-weight: 500;
2345
+ color: var(--m3-on-surface);
2346
+ }
2347
+
2348
+ .hot-config-sort-row {
2349
+ display: flex;
2350
+ align-items: center;
2351
+ gap: 6px;
2352
+ }
2353
+
2354
+ .hot-config-sort-index {
2355
+ width: 24px;
2356
+ height: 28px;
2357
+ display: flex;
2358
+ align-items: center;
2359
+ justify-content: center;
2360
+ font-size: 12px;
2361
+ font-weight: 500;
2362
+ color: var(--m3-on-surface-variant);
2363
+ background: var(--m3-surface-container);
2364
+ border-radius: var(--m3-shape-full);
2365
+ flex-shrink: 0;
2366
+ }
2367
+
2368
+ .hot-config-sort-select {
2369
+ flex: 1;
2370
+ padding: 6px 28px 6px 10px;
2371
+ font-size: 13px;
2372
+ border: none;
2373
+ border-radius: var(--m3-shape-sm);
2374
+ background: var(--m3-surface-container);
2375
+ color: var(--m3-on-surface);
2376
+ min-width: 0;
2377
+ cursor: pointer;
2378
+ appearance: none;
2379
+ -webkit-appearance: none;
2380
+ /* No background-image chevron: these classes land on `SelectMenu`, which
2381
+ renders its own <ChevronDown>. The data-URI drew a second one, and its
2382
+ stroke was a baked-in #6b7280 that never followed the theme. */
2383
+ }
2384
+
2385
+ .hot-config-sort-direction-select {
2386
+ padding: 6px 28px 6px 10px;
2387
+ font-size: 13px;
2388
+ border: none;
2389
+ border-radius: var(--m3-shape-sm);
2390
+ background: var(--m3-surface-container);
2391
+ color: var(--m3-on-surface);
2392
+ cursor: pointer;
2393
+ white-space: nowrap;
2394
+ flex-shrink: 0;
2395
+ appearance: none;
2396
+ -webkit-appearance: none;
2397
+ /* No background-image chevron: these classes land on `SelectMenu`, which
2398
+ renders its own <ChevronDown>. The data-URI drew a second one, and its
2399
+ stroke was a baked-in #6b7280 that never followed the theme. */
2400
+ }
2401
+
2402
+ .hot-config-sort-remove {
2403
+ width: 24px;
2404
+ height: 24px;
2405
+ display: flex;
2406
+ align-items: center;
2407
+ justify-content: center;
2408
+ background: transparent;
2409
+ border: none;
2410
+ color: var(--m3-on-surface-variant);
2411
+ cursor: pointer;
2412
+ border-radius: var(--m3-shape-full);
2413
+ flex-shrink: 0;
2414
+ }
2415
+
2416
+ .hot-config-sort-remove:hover {
2417
+ background-color: var(--m3-state-layer-error-hover);
2418
+ color: var(--m3-error);
2419
+ }
2420
+
2421
+ .hot-config-sort-remove:focus-visible {
2422
+ outline: none;
2423
+ box-shadow: var(--m3-focus-ring-inset);
2424
+ }
2425
+
2426
+ /* Shared Buttons */
2427
+ .hot-config-add-btn {
2428
+ display: inline-flex;
2429
+ align-items: center;
2430
+ gap: 4px;
2431
+ padding: 4px 0;
2432
+ font-size: 13px;
2433
+ color: var(--m3-accent);
2434
+ background: transparent;
2435
+ border: none;
2436
+ cursor: pointer;
2437
+ }
2438
+
2439
+ .hot-config-add-btn:hover:not(:disabled) {
2440
+ background-color: var(--m3-state-layer-accent-hover);
2441
+ }
2442
+
2443
+ .hot-config-add-btn:disabled {
2444
+ opacity: var(--m3-disabled-content-opacity);
2445
+ cursor: default;
2446
+ }
2447
+
2448
+ .hot-config-clear-btn {
2449
+ padding: 4px 8px;
2450
+ font-size: 13px;
2451
+ font-weight: 500;
2452
+ color: var(--m3-on-surface-variant);
2453
+ background: transparent;
2454
+ border: none;
2455
+ cursor: pointer;
2456
+ }
2457
+
2458
+ .hot-config-clear-btn:hover {
2459
+ color: var(--m3-error);
2460
+ }
2461
+
2462
+ /* Footer */
2463
+ .hot-config-panel-footer {
2464
+ display: flex;
2465
+ gap: 8px;
2466
+ padding: 12px 20px;
2467
+ border-top: 1px solid var(--m3-outline-faint);
2468
+ margin-top: auto;
2469
+ }
2470
+
2471
+ /* When save section is shown, footer shares the gray bg */
2472
+ .hot-config-panel-save + .hot-config-panel-footer {
2473
+ border-top: none;
2474
+ padding-top: 8px;
2475
+ background: var(--m3-surface-container);
2476
+ }
2477
+
2478
+ .hot-config-cancel-btn {
2479
+ flex: 1;
2480
+ padding: 6px 12px;
2481
+ font-size: 13px;
2482
+ font-weight: 500;
2483
+ background: var(--m3-surface-container-lowest);
2484
+ color: var(--m3-on-surface);
2485
+ border: 1px solid var(--m3-outline-faint);
2486
+ border-radius: var(--m3-shape-full);
2487
+ cursor: pointer;
2488
+ }
2489
+
2490
+ .hot-config-cancel-btn:hover {
2491
+ background: var(--m3-surface-container);
2492
+ }
2493
+
2494
+ .hot-config-save-btn {
2495
+ flex: 1;
2496
+ padding: 6px 12px;
2497
+ font-size: 13px;
2498
+ font-weight: 500;
2499
+ background: var(--m3-primary);
2500
+ color: var(--m3-on-primary);
2501
+ border: none;
2502
+ border-radius: var(--m3-shape-full);
2503
+ cursor: pointer;
2504
+ transition: background-color var(--m3-duration-short3) var(--m3-ease-standard);
2505
+ }
2506
+
2507
+ .hot-config-save-btn:hover:not(:disabled) {
2508
+ background: var(--m3-primary-hover);
2509
+ }
2510
+
2511
+ .hot-config-save-btn:disabled {
2512
+ opacity: var(--m3-disabled-content-opacity);
2513
+ cursor: default;
2514
+ }
2515
+
2516
+ /* Save section: name + color */
2517
+ .hot-config-panel-save {
2518
+ border-top: 1px solid var(--m3-outline-faint);
2519
+ padding: 12px 20px;
2520
+ display: flex;
2521
+ flex-direction: column;
2522
+ gap: 4px;
2523
+ background: var(--m3-surface-container);
2524
+ }
2525
+
2526
+ .hot-config-save-label {
2527
+ font-size: 12px;
2528
+ font-weight: 600;
2529
+ color: var(--m3-on-surface);
2530
+ }
2531
+
2532
+ .hot-config-save-input {
2533
+ padding: 6px 10px;
2534
+ font-size: 13px;
2535
+ border: 1px solid var(--m3-outline-faint);
2536
+ border-radius: var(--m3-shape-sm);
2537
+ background: var(--m3-surface-container-lowest);
2538
+ color: var(--m3-on-surface);
2539
+ outline: none;
2540
+ margin-bottom: 4px;
2541
+ }
2542
+
2543
+ .hot-config-save-input:focus {
2544
+ border-color: var(--m3-focus-ring-color);
2545
+ box-shadow: var(--m3-focus-halo);
2546
+ }
2547
+
2548
+ .hot-config-save-colors {
2549
+ display: flex;
2550
+ gap: 8px;
2551
+ flex-wrap: wrap;
2552
+ }
2553
+
2554
+ .hot-config-save-color-btn {
2555
+ width: 24px;
2556
+ height: 24px;
2557
+ border-radius: var(--m3-shape-full);
2558
+ border: 2px solid var(--m3-outline-variant);
2559
+ cursor: pointer;
2560
+ transition: border-color var(--m3-duration-short3) var(--m3-ease-standard), transform var(--m3-duration-short2) var(--m3-ease-standard);
2561
+ }
2562
+
2563
+ .hot-config-save-color-btn:hover {
2564
+ transform: scale(1.1);
2565
+ }
2566
+
2567
+ .hot-config-save-color-btn.selected {
2568
+ border-color: var(--m3-on-surface);
2569
+ }
2570
+
2571
+ /* ============================================
2572
+ CELL ANNOTATION COLORS
2573
+ ============================================ */
2574
+
2575
+ .hot-cell.cell-color-gray { background-color: var(--m3-annotation-gray);}
2576
+ .hot-cell.cell-color-pink { background-color: var(--m3-annotation-pink);}
2577
+ .hot-cell.cell-color-orange { background-color: var(--m3-annotation-orange);}
2578
+ .hot-cell.cell-color-yellow { background-color: var(--m3-annotation-yellow);}
2579
+ .hot-cell.cell-color-green { background-color: var(--m3-annotation-green);}
2580
+ .hot-cell.cell-color-blue { background-color: var(--m3-annotation-blue);}
2581
+ .hot-cell.cell-color-purple { background-color: var(--m3-annotation-purple);}
2582
+
2583
+ /* Comment indicator icon. Interactive: hover shows a read-only thread preview,
2584
+ click opens the full comment dialog (handled by DynamicTable). */
2585
+ .cell-comment-indicator {
2586
+ display: inline-flex;
2587
+ align-items: center;
2588
+ justify-content: center;
2589
+ color: var(--m3-primary);
2590
+ pointer-events: auto;
2591
+ cursor: pointer;
2592
+ position: absolute;
2593
+ right: 10px;
2594
+ top: 50%;
2595
+ transform: translateY(-50%);
2596
+ }
2597
+ .cell-comment-indicator:hover {
2598
+ color: var(--m3-primary);
2599
+ }
2600
+
2601
+ /* ============================================
2602
+ CELL COMMENT HOVER PREVIEW (read-only)
2603
+ ============================================ */
2604
+ .hot-comment-hover-popup {
2605
+ z-index: 10000;
2606
+ background: var(--m3-surface-container);
2607
+ border: 1px solid var(--m3-outline-variant);
2608
+ border-radius: var(--m3-shape-lg);
2609
+ box-shadow: var(--m3-elevation-3);
2610
+ padding: 8px 0;
2611
+ pointer-events: none;
2612
+ overflow: hidden;
2613
+ }
2614
+ .hot-comment-hover-header {
2615
+ display: flex;
2616
+ align-items: center;
2617
+ gap: 6px;
2618
+ padding: 2px 12px 8px;
2619
+ font-size: 11px;
2620
+ font-weight: 600;
2621
+ text-transform: uppercase;
2622
+ letter-spacing: 0.04em;
2623
+ color: var(--m3-on-surface-variant);
2624
+ border-bottom: 1px solid var(--m3-outline-faint);
2625
+ }
2626
+ .hot-comment-hover-count {
2627
+ margin-left: auto;
2628
+ font-size: 11px;
2629
+ font-weight: 600;
2630
+ color: var(--m3-primary);
2631
+ }
2632
+ .hot-comment-hover-list {
2633
+ max-height: 240px;
2634
+ overflow-y: auto;
2635
+ padding-top: 6px;
2636
+ }
2637
+ .hot-comment-hover-item {
2638
+ padding: 6px 12px;
2639
+ }
2640
+ .hot-comment-hover-item + .hot-comment-hover-item {
2641
+ border-top: 1px solid var(--m3-outline-faint);
2642
+ }
2643
+ .hot-comment-hover-meta {
2644
+ display: flex;
2645
+ align-items: baseline;
2646
+ gap: 6px;
2647
+ margin-bottom: 2px;
2648
+ }
2649
+ .hot-comment-hover-author {
2650
+ font-size: 12px;
2651
+ font-weight: 600;
2652
+ color: var(--m3-on-surface);
2653
+ }
2654
+ .hot-comment-hover-time {
2655
+ font-size: 11px;
2656
+ color: var(--m3-on-surface-variant);
2657
+ }
2658
+ .hot-comment-hover-body {
2659
+ font-size: 12px;
2660
+ line-height: 1.4;
2661
+ color: var(--m3-on-surface);
2662
+ white-space: pre-wrap;
2663
+ word-break: break-word;
2664
+ }
2665
+
2666
+ /* ============================================
2667
+ CELL COMMENT POPOVER
2668
+ ============================================ */
2669
+
2670
+ .hot-comment-popover {
2671
+ background: var(--m3-surface-container);
2672
+ border: 1px solid var(--m3-outline-variant);
2673
+ border-radius: var(--m3-shape-xl);
2674
+ box-shadow: var(--m3-elevation-3);
2675
+ display: flex;
2676
+ flex-direction: column;
2677
+ max-height: 520px;
2678
+ overflow: hidden;
2679
+ }
2680
+
2681
+ .hot-comment-popover-header {
2682
+ display: flex;
2683
+ align-items: flex-start;
2684
+ justify-content: space-between;
2685
+ padding: 14px 16px;
2686
+ border-bottom: 1px solid var(--m3-outline-faint);
2687
+ }
2688
+
2689
+ .hot-comment-popover-title-group {
2690
+ display: flex;
2691
+ flex-direction: column;
2692
+ gap: 2px;
2693
+ overflow: hidden;
2694
+ min-width: 0;
2695
+ }
2696
+
2697
+ .hot-comment-popover-subtitle {
2698
+ font-size: 12px;
2699
+ color: var(--m3-on-surface-variant);
2700
+ font-weight: 400;
2701
+ }
2702
+
2703
+ .hot-comment-popover-title {
2704
+ font-size: 14px;
2705
+ font-weight: 600;
2706
+ color: var(--m3-on-surface);
2707
+ overflow: hidden;
2708
+ text-overflow: ellipsis;
2709
+ white-space: nowrap;
2710
+ }
2711
+
2712
+ .hot-comment-popover-close {
2713
+ background: none;
2714
+ border: none;
2715
+ color: var(--m3-on-surface-variant);
2716
+ cursor: pointer;
2717
+ padding: 4px;
2718
+ line-height: 1;
2719
+ flex-shrink: 0;
2720
+ display: flex;
2721
+ align-items: center;
2722
+ justify-content: center;
2723
+ border-radius: var(--m3-shape-full);
2724
+ margin-top: 2px;
2725
+ }
2726
+
2727
+ .hot-comment-popover-close:hover {
2728
+ color: var(--m3-on-surface);
2729
+ background-color: var(--m3-state-layer-hover);
2730
+ }
2731
+
2732
+ .hot-comment-colors {
2733
+ display: flex;
2734
+ align-items: center;
2735
+ gap: 8px;
2736
+ padding: 0;
2737
+ margin-top: 10px;
2738
+ }
2739
+
2740
+ /* B8c — audience picker. A two-segment control, sized and spaced off the colour
2741
+ row directly below it so the input area reads as one stack of choices.
2742
+ Deliberately not a <select>: which of the two a note is has to be legible
2743
+ while it is being typed. */
2744
+ .hot-comment-audience {
2745
+ display: flex;
2746
+ align-items: center;
2747
+ gap: 4px;
2748
+ margin-top: 10px;
2749
+ padding: 2px;
2750
+ border: 1px solid var(--m3-outline-variant);
2751
+ border-radius: var(--m3-shape-full);
2752
+ width: fit-content;
2753
+ }
2754
+
2755
+ .hot-comment-audience-option {
2756
+ display: inline-flex;
2757
+ align-items: center;
2758
+ gap: 6px;
2759
+ height: 26px;
2760
+ padding: 0 10px;
2761
+ border: none;
2762
+ border-radius: var(--m3-shape-full);
2763
+ background: transparent;
2764
+ font-size: 12px;
2765
+ font-family: inherit;
2766
+ color: var(--m3-on-surface-variant);
2767
+ cursor: pointer;
2768
+ transition: var(--m3-transition-state);
2769
+ }
2770
+
2771
+ .hot-comment-audience-option:hover {
2772
+ color: var(--m3-on-surface);
2773
+ }
2774
+
2775
+ .hot-comment-audience-option[data-selected] {
2776
+ background: var(--m3-secondary-container);
2777
+ color: var(--m3-on-secondary-container);
2778
+ font-weight: 600;
2779
+ }
2780
+
2781
+ /* The badge on an existing carrier-facing comment in the thread. */
2782
+ .hot-comment-audience-tag {
2783
+ display: inline-flex;
2784
+ align-items: center;
2785
+ gap: 3px;
2786
+ padding: 1px 6px;
2787
+ border-radius: var(--m3-shape-full);
2788
+ background: var(--m3-surface-container);
2789
+ border: 1px solid var(--m3-outline-faint);
2790
+ font-size: 11px;
2791
+ color: var(--m3-on-surface-variant);
2792
+ }
2793
+
2794
+ .hot-comment-colors-label {
2795
+ font-size: 13px;
2796
+ color: var(--m3-on-surface-variant);
2797
+ margin-right: 4px;
2798
+ }
2799
+
2800
+ .hot-comment-color-btn {
2801
+ width: 28px;
2802
+ height: 28px;
2803
+ border-radius: var(--m3-shape-full);
2804
+ border: 2px solid var(--m3-outline-variant);
2805
+ cursor: pointer;
2806
+ transition: transform var(--m3-duration-short2) var(--m3-ease-standard), border-color var(--m3-duration-short3) var(--m3-ease-standard);
2807
+ padding: 0;
2808
+ display: flex;
2809
+ align-items: center;
2810
+ justify-content: center;
2811
+ }
2812
+
2813
+ .hot-comment-color-btn:hover {
2814
+ transform: scale(1.15);
2815
+ }
2816
+
2817
+ .hot-comment-color-btn.selected {
2818
+ border-color: var(--m3-on-surface);
2819
+ border-width: 2.5px;
2820
+ }
2821
+
2822
+ /* Dark-mode annotation swatches — the buttons carry the light fill as an inline
2823
+ style, so override with !important to the same dark tints used for the cells
2824
+ (color-mix of the hue into the dark surface). Lighten the ring so the circle
2825
+ reads on the dark popover. The "none" swatch keeps its inline dashed border. */
2826
+
2827
+ .hot-comment-thread {
2828
+ max-height: 240px;
2829
+ overflow-y: auto;
2830
+ display: flex;
2831
+ flex-direction: column;
2832
+ gap: 2px;
2833
+ padding: 8px 16px;
2834
+ min-height: 40px;
2835
+ border-bottom: 1px solid var(--m3-outline-faint);
2836
+ }
2837
+
2838
+ /* Bulk-mode "delete all comments" action (between the thread and the input). */
2839
+ .hot-comment-bulk-actions {
2840
+ display: flex;
2841
+ justify-content: flex-end;
2842
+ padding: 6px 16px;
2843
+ border-bottom: 1px solid var(--m3-outline-faint);
2844
+ flex-shrink: 0;
2845
+ }
2846
+ .hot-comment-delete-all {
2847
+ background: none;
2848
+ border: none;
2849
+ color: var(--m3-error);
2850
+ font-size: 12px;
2851
+ font-weight: 500;
2852
+ cursor: pointer;
2853
+ padding: 3px 8px;
2854
+ border-radius: var(--m3-shape-full);
2855
+ }
2856
+ .hot-comment-delete-all:hover {
2857
+ background-color: var(--m3-state-layer-error-hover);
2858
+ }
2859
+
2860
+ .hot-comment-loading,
2861
+ .hot-comment-empty {
2862
+ text-align: center;
2863
+ color: var(--m3-on-surface-variant);
2864
+ font-size: 13px;
2865
+ padding: 24px 0;
2866
+ }
2867
+
2868
+ .hot-comment-item {
2869
+ padding: 10px 0;
2870
+ }
2871
+
2872
+ .hot-comment-item + .hot-comment-item {
2873
+ border-top: 1px solid var(--m3-outline-faint);
2874
+ }
2875
+
2876
+ .hot-comment-item-row {
2877
+ display: flex;
2878
+ align-items: flex-start;
2879
+ gap: 10px;
2880
+ }
2881
+
2882
+ .hot-comment-item-body {
2883
+ flex: 1;
2884
+ min-width: 0;
2885
+ }
2886
+
2887
+ .hot-comment-item-header {
2888
+ display: flex;
2889
+ align-items: baseline;
2890
+ gap: 6px;
2891
+ margin-bottom: 2px;
2892
+ }
2893
+
2894
+ .hot-comment-avatar {
2895
+ width: 28px;
2896
+ height: 28px;
2897
+ border-radius: var(--m3-shape-full);
2898
+ background: var(--m3-primary-container);
2899
+ color: var(--m3-on-primary-container);
2900
+ display: flex;
2901
+ align-items: center;
2902
+ justify-content: center;
2903
+ font-size: 12px;
2904
+ font-weight: 600;
2905
+ flex-shrink: 0;
2906
+ margin-top: 1px;
2907
+ }
2908
+
2909
+ .hot-comment-author {
2910
+ font-size: 13px;
2911
+ font-weight: 600;
2912
+ color: var(--m3-on-surface);
2913
+ }
2914
+
2915
+ .hot-comment-action {
2916
+ font-size: 12px;
2917
+ color: var(--m3-on-surface-variant);
2918
+ font-weight: 400;
2919
+ }
2920
+
2921
+ .hot-comment-time {
2922
+ font-size: 12px;
2923
+ color: var(--m3-on-surface-variant);
2924
+ font-weight: 400;
2925
+ }
2926
+
2927
+ .hot-comment-delete {
2928
+ background: none;
2929
+ border: none;
2930
+ color: var(--m3-on-surface-variant);
2931
+ cursor: pointer;
2932
+ padding: 4px;
2933
+ line-height: 1;
2934
+ display: flex;
2935
+ align-items: center;
2936
+ justify-content: center;
2937
+ flex-shrink: 0;
2938
+ border-radius: var(--m3-shape-full);
2939
+ margin-top: 2px;
2940
+ opacity: 0;
2941
+ transition: opacity var(--m3-duration-short3) var(--m3-ease-standard), color var(--m3-duration-short3) var(--m3-ease-standard);
2942
+ }
2943
+
2944
+ .hot-comment-item:hover .hot-comment-delete {
2945
+ opacity: 1;
2946
+ }
2947
+
2948
+ .hot-comment-delete:hover {
2949
+ color: var(--m3-error);
2950
+ background-color: var(--m3-state-layer-error-hover);
2951
+ }
2952
+
2953
+ .hot-comment-content {
2954
+ font-size: 13px;
2955
+ color: var(--m3-on-surface);
2956
+ line-height: 1.5;
2957
+ white-space: pre-wrap;
2958
+ }
2959
+
2960
+ .hot-comment-input-area {
2961
+ padding: 12px 16px 14px;
2962
+ }
2963
+
2964
+ .hot-comment-textarea {
2965
+ width: 100%;
2966
+ resize: none;
2967
+ border: 1px solid var(--m3-outline-faint);
2968
+ border-radius: var(--m3-shape-md);
2969
+ padding: 10px 12px;
2970
+ font-size: 13px;
2971
+ font-family: inherit;
2972
+ background: var(--m3-surface-container);
2973
+ color: var(--m3-on-surface);
2974
+ outline: none;
2975
+ transition: border-color var(--m3-duration-short3) var(--m3-ease-standard);
2976
+ }
2977
+
2978
+ .hot-comment-textarea::placeholder {
2979
+ color: var(--m3-on-surface-variant);
2980
+ }
2981
+
2982
+ .hot-comment-textarea:focus {
2983
+ border-color: var(--m3-focus-ring-color);
2984
+ background: var(--m3-surface-container-lowest);
2985
+ box-shadow: var(--m3-focus-halo);
2986
+ }
2987
+
2988
+ .hot-comment-input-footer {
2989
+ display: flex;
2990
+ align-items: center;
2991
+ justify-content: space-between;
2992
+ margin-top: 10px;
2993
+ }
2994
+
2995
+ .hot-comment-hint {
2996
+ font-size: 12px;
2997
+ color: var(--m3-on-surface-variant);
2998
+ }
2999
+
3000
+ .hot-comment-hint kbd {
3001
+ display: inline-block;
3002
+ padding: 1px 5px;
3003
+ font-size: 11px;
3004
+ font-family: inherit;
3005
+ background: var(--m3-surface-container);
3006
+ border: 1px solid var(--m3-outline-faint);
3007
+ border-radius: var(--m3-shape-xs);
3008
+ color: var(--m3-on-surface-variant);
3009
+ }
3010
+
3011
+ .hot-comment-send-btn {
3012
+ padding: 6px 16px;
3013
+ font-size: 13px;
3014
+ font-weight: 500;
3015
+ background: var(--m3-primary);
3016
+ color: var(--m3-on-primary);
3017
+ border: none;
3018
+ border-radius: var(--m3-shape-full);
3019
+ cursor: pointer;
3020
+ transition: var(--m3-transition-state);
3021
+ }
3022
+
3023
+ .hot-comment-send-btn:hover:not(:disabled) {
3024
+ background: color-mix(in srgb, var(--m3-on-primary) 8%, var(--m3-primary));
3025
+ }
3026
+
3027
+ .hot-comment-send-btn:active:not(:disabled) {
3028
+ background: color-mix(in srgb, var(--m3-on-primary) 16%, var(--m3-primary));
3029
+ }
3030
+
3031
+ .hot-comment-send-btn:disabled {
3032
+ opacity: var(--m3-disabled-content-opacity);
3033
+ cursor: default;
3034
+ }
3035
+
3036
+ /* ============================================
3037
+ MENTION POPUP & MENTION STYLES
3038
+ ============================================ */
3039
+
3040
+ .hot-comment-mention {
3041
+ color: var(--m3-primary);
3042
+ font-weight: 600;
3043
+ }
3044
+
3045
+ .hot-mention-popup {
3046
+ background: var(--m3-surface-container);
3047
+ border: 1px solid var(--m3-outline-variant);
3048
+ border-radius: var(--m3-shape-md);
3049
+ box-shadow: var(--m3-elevation-2);
3050
+ min-width: 240px;
3051
+ max-height: 200px;
3052
+ overflow-y: auto;
3053
+ z-index: 10002;
3054
+ }
3055
+
3056
+ .hot-mention-popup-item {
3057
+ display: flex;
3058
+ align-items: center;
3059
+ gap: 10px;
3060
+ padding: 8px 12px;
3061
+ cursor: pointer;
3062
+ }
3063
+
3064
+ .hot-mention-popup-item:hover,
3065
+ .hot-mention-popup-item.highlighted {
3066
+ background: var(--m3-row-hover);
3067
+ }
3068
+
3069
+ .hot-mention-popup-avatar {
3070
+ width: 28px;
3071
+ height: 28px;
3072
+ border-radius: var(--m3-shape-full);
3073
+ display: flex;
3074
+ align-items: center;
3075
+ justify-content: center;
3076
+ font-weight: 600;
3077
+ font-size: 12px;
3078
+ color: white;
3079
+ flex-shrink: 0;
3080
+ }
3081
+
3082
+ /* ============================================================================
3083
+ PORTAL DROPDOWNS (SelectMenu / FilterValueInput)
3084
+ ----------------------------------------------------------------------------
3085
+ This product uses no native <select> anywhere: the Configure View drawer is a
3086
+ Sheet with its own stacking context, so an OS menu paints against the page
3087
+ instead of the panel and cannot carry the v2 type tokens. Both menus render
3088
+ into document.body and are positioned from the trigger's bounding rect, so
3089
+ the sizing below must not assume a parent.
3090
+ ========================================================================== */
3091
+
3092
+ /* Trigger — deliberately inherits whatever class the old <select> carried
3093
+ (.hot-config-filter-select and friends) so spacing, radius and fill are
3094
+ unchanged; this only lays out the label + chevron inside it. */
3095
+ .hot-select-trigger {
3096
+ display: inline-flex;
3097
+ align-items: center;
3098
+ justify-content: space-between;
3099
+ gap: 6px;
3100
+ text-align: left;
3101
+ /* The chevron is a real element now, not a background image. */
3102
+ background-image: none;
3103
+ padding-right: 8px;
3104
+ }
3105
+
3106
+ .hot-select-trigger:disabled {
3107
+ opacity: var(--m3-disabled-content-opacity);
3108
+ cursor: default;
3109
+ }
3110
+
3111
+ .hot-select-trigger-label {
3112
+ overflow: hidden;
3113
+ text-overflow: ellipsis;
3114
+ white-space: nowrap;
3115
+ }
3116
+
3117
+ .hot-select-trigger-placeholder {
3118
+ color: var(--m3-on-surface-variant);
3119
+ }
3120
+
3121
+ .hot-select-trigger-chevron {
3122
+ width: 12px;
3123
+ height: 12px;
3124
+ flex-shrink: 0;
3125
+ color: var(--m3-on-surface-variant);
3126
+ }
3127
+
3128
+ /* ============================================================================
3129
+ PORTALLED POPUPS — POINTER-EVENTS RESTORE (blocker 10.1)
3130
+ ----------------------------------------------------------------------------
3131
+ Every menu in this grid renders through `createPortal(…, document.body)`, so
3132
+ each one is a DIRECT CHILD OF <body>.
3133
+
3134
+ Radix's `DismissableLayer` — used by every Sheet and Dialog in the app,
3135
+ including the Configure View drawer — sets `document.body.style.pointerEvents
3136
+ = 'none'` for as long as it is open, and re-enables it only on its own layer
3137
+ node. Our portals are SIBLINGS of that layer, not descendants, so they
3138
+ inherited `none`: the menu painted correctly on top and then swallowed every
3139
+ click. That made rollups, formulas, conditional formatting, filters, sorting
3140
+ and grouping keyboard-only inside the drawer.
3141
+
3142
+ `pointer-events` is an inherited property, so declaring `auto` on each portal
3143
+ ROOT is enough for its whole subtree, and it is declared — not inherited —
3144
+ so it beats the value coming down from <body>.
3145
+
3146
+ Chosen over the two alternatives deliberately:
3147
+ - Mounting the portals inside the Sheet's content node would put them back
3148
+ inside its `overflow` and stacking context, which is precisely what the
3149
+ portals exist to escape (a menu near the drawer's bottom edge would clip).
3150
+ - A Radix-sanctioned portal container has the same problem, and would couple
3151
+ the grid to whichever dialog implementation happens to host it.
3152
+
3153
+ Outside-click dismissal, Escape and z-order are untouched: dismissal is a
3154
+ `mousedown` listener on `document`, and the Sheet's own overlay/content keep
3155
+ their own `pointer-events: auto` from Radix.
3156
+
3157
+ Making the menus clickable does NOT make them dismiss the dialog they were
3158
+ opened from: Radix decides "outside" from the REACT tree, and a portal's
3159
+ content still belongs to the React subtree that rendered it. Verified in a
3160
+ browser — committing an option leaves the Configure View drawer open, while a
3161
+ click on the page outside it still dismisses it.
3162
+ ========================================================================== */
3163
+ .hot-select-menu,
3164
+ .hot-filter-suggestions,
3165
+ .hot-quick-filter,
3166
+ .hot-col-menu,
3167
+ .hot-editor-popup,
3168
+ .hot-cell-editor,
3169
+ .hot-editor-dropdown,
3170
+ .hot-mention-popup,
3171
+ .hot-comment-popover,
3172
+ .hot-comment-hover-popup,
3173
+ .context-menu {
3174
+ pointer-events: auto;
3175
+ }
3176
+
3177
+ .hot-select-menu,
3178
+ .hot-filter-suggestions {
3179
+ display: flex;
3180
+ flex-direction: column;
3181
+ padding: 4px;
3182
+ background: var(--m3-surface-container);
3183
+ border: 1px solid var(--m3-outline-variant);
3184
+ border-radius: var(--m3-shape-md);
3185
+ box-shadow: var(--m3-elevation-3);
3186
+ overflow-y: auto;
3187
+ overflow-x: hidden;
3188
+ max-height: 280px;
3189
+ }
3190
+
3191
+ /* `flex-shrink: 0` is load-bearing, not defensive. The menu is a flex column
3192
+ with `max-height: 280px`, so once the list is longer than that its children
3193
+ are SQUASHED to fit instead of the container scrolling: the 15-option date
3194
+ operator list rendered at 18px per row against a 20px line-height, so every
3195
+ label was vertically clipped and overlapped its neighbour. Worst on the two
3196
+ longest menus in the panel — the operator list and the 48-column field
3197
+ picker, i.e. exactly the controls a filter is built from. */
3198
+ .hot-select-menu-option,
3199
+ .hot-filter-suggestion {
3200
+ display: block;
3201
+ width: 100%;
3202
+ flex-shrink: 0;
3203
+ padding: 6px 8px;
3204
+ border: none;
3205
+ border-radius: var(--m3-shape-sm);
3206
+ background: transparent;
3207
+ color: var(--m3-on-surface);
3208
+ text-align: left;
3209
+ cursor: pointer;
3210
+ white-space: nowrap;
3211
+ overflow: hidden;
3212
+ text-overflow: ellipsis;
3213
+ }
3214
+
3215
+ /* `--hot-dropdown-hover`, NOT a hard-coded light gray: this menu renders in
3216
+ both themes, and a literal `rgb(243,243,245)` paints a near-white band under
3217
+ near-white text in dark mode — the option becomes unreadable exactly while it
3218
+ is being pointed at. */
3219
+ .hot-select-menu-option[data-active],
3220
+ .hot-filter-suggestion[data-active] {
3221
+ background: var(--m3-state-layer-hover);
3222
+ }
3223
+
3224
+ .hot-select-menu-option[data-selected] {
3225
+ font-weight: 600;
3226
+ }
3227
+
3228
+ /* Loading / empty / error are three DIFFERENT strings on purpose. A silently
3229
+ empty dropdown is what made the missing suggestion loader invisible. */
3230
+ .hot-filter-suggestion-note {
3231
+ flex-shrink: 0;
3232
+ padding: 8px;
3233
+ color: var(--m3-on-surface-variant);
3234
+ white-space: nowrap;
3235
+ }
3236
+
3237
+ /* ============================================================================
3238
+ COLUMN QUICK FILTER (Excel AutoFilter — A1)
3239
+ ----------------------------------------------------------------------------
3240
+ Chrome deliberately COPIED from `.hot-select-menu` above (same border, radius,
3241
+ shadow and 4px gutter) so the funnel dropdown reads as the same family as
3242
+ every other portal menu in the grid. Only the internal sections are new.
3243
+ ========================================================================== */
3244
+ .hot-quick-filter {
3245
+ display: flex;
3246
+ flex-direction: column;
3247
+ background: var(--m3-surface-container);
3248
+ border: 1px solid var(--m3-outline-variant);
3249
+ border-radius: var(--m3-shape-md);
3250
+ box-shadow: var(--m3-elevation-3);
3251
+ overflow: hidden;
3252
+ }
3253
+
3254
+ .hot-quick-filter-search {
3255
+ padding: 8px;
3256
+ border-bottom: 1px solid var(--m3-outline-faint);
3257
+ }
3258
+
3259
+ .hot-quick-filter-list {
3260
+ display: flex;
3261
+ flex-direction: column;
3262
+ /* Same 4px gutter the select menu uses, so an option's hover fill inset
3263
+ matches the one in the sort/field dropdowns exactly. */
3264
+ padding: 4px;
3265
+ max-height: 232px;
3266
+ /* The flexible section. The popover carries a viewport-derived max-height
3267
+ (utils/anchoredPosition); `min-height: 0` is what lets flexbox shrink
3268
+ this list past its content so the search box, the transient footnote and
3269
+ the Apply button always survive a short viewport. Without it the list
3270
+ refuses to shrink and the footer is what gets clipped. */
3271
+ flex: 1 1 auto;
3272
+ min-height: 0;
3273
+ overflow-y: auto;
3274
+ overflow-x: hidden;
3275
+ }
3276
+
3277
+ .hot-quick-filter-option {
3278
+ display: flex;
3279
+ align-items: center;
3280
+ gap: 8px;
3281
+ padding: 6px 8px;
3282
+ border-radius: var(--m3-shape-sm);
3283
+ cursor: pointer;
3284
+ color: var(--m3-on-surface);
3285
+ /* A tick list is dragged over, not read as prose — a stray text selection
3286
+ under the pointer looks like a broken row. */
3287
+ user-select: none;
3288
+ }
3289
+
3290
+ .hot-quick-filter-option:hover {
3291
+ background: var(--m3-state-layer-hover);
3292
+ }
3293
+
3294
+ /* "Select all" sits above the values with a hairline, the way Excel separates
3295
+ it — it acts on the VISIBLE list, so it belongs with the search box. */
3296
+ .hot-quick-filter-select-all {
3297
+ margin-bottom: 4px;
3298
+ padding-bottom: 8px;
3299
+ border-bottom: 1px solid var(--m3-outline-faint);
3300
+ border-radius: var(--m3-shape-sm) var(--m3-shape-sm) 0 0;
3301
+ }
3302
+
3303
+ .hot-quick-filter-option-label {
3304
+ min-width: 0;
3305
+ overflow: hidden;
3306
+ text-overflow: ellipsis;
3307
+ white-space: nowrap;
3308
+ }
3309
+
3310
+ .hot-quick-filter-note {
3311
+ padding: 12px 8px;
3312
+ color: var(--m3-on-surface-variant);
3313
+ }
3314
+
3315
+ /* ── Date body (workshop A14) ────────────────────────────────────────────────
3316
+ A date column gets an operator + its editor instead of a tick list. Stacked
3317
+ rather than the drawer's single inline row, because the popover is 268px
3318
+ wide: two side-by-side date triggers there are ~110px each, which truncates
3319
+ "10 sie 2026" to nothing readable. Label above control also means the two
3320
+ ends of a range are unmistakable — which is the whole of Agnieszka's
3321
+ "szybciej mi jest operować na zakresie dat". */
3322
+ .hot-quick-filter-date {
3323
+ display: flex;
3324
+ flex-direction: column;
3325
+ gap: 10px;
3326
+ padding: 10px;
3327
+ /* The flexible section, mirroring .hot-quick-filter-list: a short viewport
3328
+ scrolls the form rather than clipping the Apply button off the bottom. */
3329
+ flex: 1 1 auto;
3330
+ min-height: 0;
3331
+ overflow-y: auto;
3332
+ }
3333
+
3334
+ .hot-quick-filter-date-field {
3335
+ display: flex;
3336
+ flex-direction: column;
3337
+ gap: 4px;
3338
+ min-width: 0;
3339
+ }
3340
+
3341
+ .hot-quick-filter-date-label {
3342
+ color: var(--m3-on-surface-variant);
3343
+ }
3344
+
3345
+ /* The controls are the Configure View drawer's, so the two filter surfaces read
3346
+ as one family — but the drawer hard-codes 13px, which is not one of the named
3347
+ type tokens. Re-declare from the token's own custom properties (higher
3348
+ specificity, so it wins over `.hot-config-filter-*`) instead of leaving a
3349
+ stray magic number inside a v2 surface. */
3350
+ .hot-quick-filter-date .hot-quick-filter-control {
3351
+ width: 100%;
3352
+ font-size: var(--text-body-regular-sm);
3353
+ line-height: var(--text-body-regular-sm--line-height);
3354
+ font-weight: var(--text-body-regular-sm--font-weight);
3355
+ }
3356
+
3357
+ /* Count + unit share a row: "next | 7 | days" is one phrase, not two fields. */
3358
+ .hot-quick-filter-relative-row {
3359
+ display: flex;
3360
+ align-items: center;
3361
+ gap: 6px;
3362
+ min-width: 0;
3363
+ }
3364
+
3365
+ .hot-quick-filter-date .hot-quick-filter-count {
3366
+ flex: 0 0 auto;
3367
+ width: 72px;
3368
+ min-width: 72px;
3369
+ }
3370
+
3371
+ .hot-quick-filter-date .hot-quick-filter-relative-row .hot-select-trigger {
3372
+ flex: 1 1 0;
3373
+ width: auto;
3374
+ min-width: 0;
3375
+ }
3376
+
3377
+ /* A2/D6 made visible: a header filter is TEMPORARY. The user rejected saving
3378
+ these herself — the UI has to say which kind of filter this is, in words. */
3379
+ .hot-quick-filter-transient {
3380
+ margin: 0;
3381
+ padding: 6px 10px;
3382
+ color: var(--m3-on-surface-variant);
3383
+ background: var(--m3-state-layer-hover);
3384
+ border-top: 1px solid var(--m3-outline-faint);
3385
+ }
3386
+
3387
+ .hot-quick-filter-footer {
3388
+ display: flex;
3389
+ align-items: center;
3390
+ justify-content: space-between;
3391
+ gap: 8px;
3392
+ padding: 8px;
3393
+ border-top: 1px solid var(--m3-outline-faint);
3394
+ }
3395
+
3396
+ /* Toolbar "Clear all filters (n)". A borderless M3 text button: the dashed
3397
+ outline that used to carry the "this filter is transient" semantics is gone —
3398
+ that distinction now lives in the outlined filter chips rendered beside it,
3399
+ and a dashed border next to pill chrome read as an unfinished control. Height
3400
+ stays 32px. */
3401
+ .hot-clear-filters-btn {
3402
+ display: inline-flex;
3403
+ align-items: center;
3404
+ gap: 6px;
3405
+ height: 32px;
3406
+ padding: 0 10px;
3407
+ border: none;
3408
+ border-radius: var(--m3-shape-full);
3409
+ background: transparent;
3410
+ color: var(--m3-on-surface-variant);
3411
+ cursor: pointer;
3412
+ white-space: nowrap;
3413
+ transition: var(--m3-transition-state);
3414
+ }
3415
+
3416
+ .hot-clear-filters-btn:hover {
3417
+ background-color: var(--m3-state-layer-hover);
3418
+ color: var(--m3-on-surface);
3419
+ }
3420
+
3421
+ .hot-clear-filters-btn:active {
3422
+ background-color: var(--m3-state-layer-pressed);
3423
+ }
3424
+
3425
+ .hot-clear-filters-btn:focus-visible {
3426
+ outline: none;
3427
+ box-shadow: var(--m3-focus-ring-inset);
3428
+ }
3429
+
3430
+ /* Group-subtotal scope note — "(this page only)" beside the Σ label. */
3431
+ .hot-group-summary-scope {
3432
+ text-transform: none;
3433
+ letter-spacing: normal;
3434
+ font-weight: 400;
3435
+ color: var(--m3-on-surface-variant);
3436
+ }
3437
+
3438
+ /* ============================================================================
3439
+ PINNED TOTALS ROW
3440
+ ----------------------------------------------------------------------------
3441
+ Sticky to the BOTTOM of the scroll container, mirroring .hot-headers-sticky
3442
+ at the top. Rendered outside the virtualiser, so it needs its own fill: it
3443
+ sits over scrolling rows.
3444
+ ========================================================================== */
3445
+ .hot-footer-totals-row {
3446
+ align-items: center;
3447
+ min-height: 32px;
3448
+ }
3449
+
3450
+ /* The label's clip box (ledger 3.3).
3451
+ -----------------------------------------------------------------------------
3452
+ `.hot-footer-totals-label-cell` is deliberately zero-width and the label
3453
+ overflows out of it, over the leading columns that render nothing. Nothing
3454
+ used to stop that overflow, so on a view whose FIRST column carries an
3455
+ aggregate the caption was painted straight over the number.
3456
+ `max-width` is set inline from the MEASURED width of that blank run; this
3457
+ rule is what turns the overflow into an ellipsis instead of a collision. The
3458
+ full string stays reachable via the element's `title`. */
3459
+ .hot-footer-totals-label-clip {
3460
+ /* `width: max-content` is load-bearing, not tidying. The clip box lives
3461
+ inside a ZERO-width cell, and a block box takes the width of its
3462
+ containing block — so without this it resolves to 0 and `max-width`
3463
+ clamps nothing, collapsing the label to just the Σ glyph. Measured in a
3464
+ browser: 12px wide instead of 220. `max-content` sizes it to the label,
3465
+ and the inline `max-width` (the measured blank lead) then clips it. */
3466
+ width: max-content;
3467
+ max-width: 0;
3468
+ overflow: hidden;
3469
+ }
3470
+
3471
+ .hot-footer-totals-label {
3472
+ display: flex;
3473
+ align-items: center;
3474
+ gap: 6px;
3475
+ padding-left: 12px;
3476
+ white-space: nowrap;
3477
+ overflow: hidden;
3478
+ text-overflow: ellipsis;
3479
+ color: var(--m3-on-surface-variant);
3480
+ text-transform: uppercase;
3481
+ letter-spacing: 0.05em;
3482
+ }
3483
+
3484
+ /* Stacked layout: used only when EVERY column from the first one carries a
3485
+ value, so there is no blank run to borrow. The caption gets its own line
3486
+ rather than overlapping a number — the scope statement is normative and
3487
+ cannot be dropped. */
3488
+ .hot-footer-totals-caption {
3489
+ padding: 4px 0 2px;
3490
+ }
3491
+
3492
+ .hot-footer-totals-scope {
3493
+
3494
+ color: var(--m3-on-surface-variant);
3495
+ }
3496
+
3497
+ .hot-footer-totals-sigma {
3498
+ flex-shrink: 0;
3499
+ color: var(--m3-on-surface-variant);
3500
+ }
3501
+
3502
+ .hot-footer-totals-cell,
3503
+ .hot-footer-totals-rowheader,
3504
+ .hot-footer-totals-actions {
3505
+ display: flex;
3506
+ align-items: center;
3507
+ background: var(--m3-surface-container);
3508
+ }
3509
+
3510
+ .hot-footer-totals-value {
3511
+ color: var(--m3-on-surface);
3512
+ }
3513
+
3514
+ /* ============================================
3515
+ DIMENSIONED AGGREGATES (per-currency totals)
3516
+
3517
+ A sum partitioned by a dimension is several figures, not one, so the cell
3518
+ stacks one labelled line per slice. Each line keeps its label GLUED to its
3519
+ number (`white-space: nowrap`) — a currency code that wraps away from its
3520
+ amount recreates the unlabelled total this feature exists to remove
3521
+ (HEDGE-147).
3522
+
3523
+ The row heights are driven by content here rather than fixed: two currencies
3524
+ need two lines, and clipping the second one would hide money.
3525
+ ============================================ */
3526
+ .hot-aggregate-breakdown {
3527
+ display: flex;
3528
+ flex-direction: column;
3529
+ align-items: flex-end;
3530
+ gap: 1px;
3531
+ line-height: 1.25;
3532
+ width: 100%;
3533
+ }
3534
+
3535
+ .hot-aggregate-breakdown-line {
3536
+ white-space: nowrap;
3537
+ }
3538
+
3539
+ .hot-aggregate-breakdown-key {
3540
+ color: var(--m3-on-surface-variant);
3541
+ font-size: 0.85em;
3542
+ font-weight: 500;
3543
+ }
3544
+
3545
+ /* The stacked lines must be able to make their row taller. */
3546
+ .hot-footer-totals-cell:has(.hot-aggregate-breakdown),
3547
+ .hot-group-summary-cell:has(.hot-aggregate-breakdown) {
3548
+ height: auto;
3549
+ align-items: center;
3550
+ }
3551
+
3552
+ .hot-footer-totals:has(.hot-aggregate-breakdown),
3553
+ .hot-group-summary-row:has(.hot-aggregate-breakdown) {
3554
+ height: auto;
3555
+ min-height: 0;
3556
+ }
3557
+
3558
+ /* ============================================
3559
+ REDUCED MOTION
3560
+ The transition tokens self-collapse (see the @media block in
3561
+ packages/ui/src/theme/m3.css); these are the keyframe animations,
3562
+ which have to be named explicitly.
3563
+ ============================================ */
3564
+ @media (prefers-reduced-motion: reduce) {
3565
+ /* Looping shimmer — purely decorative. */
3566
+ td[data-save-state="saving"]::after,
3567
+ td[data-row-save-state="saving"]::after,
3568
+ .dt-skel-bar::after {
3569
+ animation: none;
3570
+ }
3571
+
3572
+ /* The save-state shake is pure translation. Drop the shake on the cell;
3573
+ on the row, keep the fade — it is what clears the error fill. */
3574
+ td[data-save-state="error"] {
3575
+ animation: none;
3576
+ }
3577
+
3578
+ td[data-row-save-state="error"] {
3579
+ animation: fade-row-error 3s var(--m3-ease-standard) forwards;
3580
+ }
3581
+ }
3582
+
3583
+ /* ============================================
3584
+ VIEW MODE SWITCH (list / grid)
3585
+
3586
+ M3 segmented button. The container carries the outline and the pill radius;
3587
+ the segments are transparent until selected, when they take the
3588
+ secondary-container / on-secondary-container PAIR. Hover and press are 8%
3589
+ state layers of the content colour, never a background swap — a hover that
3590
+ replaces the fill would erase the selected/unselected distinction for as
3591
+ long as the cursor is over it.
3592
+ ============================================ */
3593
+
3594
+ .hot-viewmode-switch {
3595
+ display: inline-flex;
3596
+ align-items: center;
3597
+ /* 1px gap so the two segments' focus rings never touch. */
3598
+ gap: 1px;
3599
+ padding: 2px;
3600
+ border: 1px solid var(--m3-outline-variant);
3601
+ border-radius: var(--m3-shape-full);
3602
+ background: transparent;
3603
+ }
3604
+
3605
+ .hot-viewmode-segment {
3606
+ position: relative;
3607
+ display: inline-flex;
3608
+ align-items: center;
3609
+ justify-content: center;
3610
+ width: 32px;
3611
+ height: 28px;
3612
+ border: none;
3613
+ border-radius: var(--m3-shape-full);
3614
+ background: transparent;
3615
+ color: var(--m3-on-surface-variant);
3616
+ cursor: pointer;
3617
+ transition: var(--m3-transition-state);
3618
+ }
3619
+
3620
+ /* 48dp minimum touch target, grown OUTWARD from a 32x28 visual so the toolbar
3621
+ stays dense. `pointer-events` stays on the button; this pseudo-element only
3622
+ enlarges what the pointer can hit. */
3623
+ .hot-viewmode-segment::after {
3624
+ content: '';
3625
+ position: absolute;
3626
+ inset: -10px -8px;
3627
+ border-radius: inherit;
3628
+ }
3629
+
3630
+ .hot-viewmode-segment:hover {
3631
+ background-color: var(--m3-state-layer-hover);
3632
+ color: var(--m3-on-surface);
3633
+ }
3634
+
3635
+ .hot-viewmode-segment:active {
3636
+ background-color: var(--m3-state-layer-pressed);
3637
+ }
3638
+
3639
+ .hot-viewmode-segment:focus-visible {
3640
+ outline: none;
3641
+ box-shadow: var(--m3-focus-ring-inset);
3642
+ }
3643
+
3644
+ /* The selected segment. Background and foreground land together — a
3645
+ background without its `on-` partner is the single most common way a
3646
+ Material palette becomes unreadable in the other theme. */
3647
+ .hot-viewmode-segment[data-selected='true'] {
3648
+ background-color: var(--m3-secondary-container);
3649
+ color: var(--m3-on-secondary-container);
3650
+ }
3651
+
3652
+ .hot-viewmode-segment[data-selected='true']:hover {
3653
+ /* The state layer composites OVER the container tint rather than replacing
3654
+ it, so the selected segment still reads as selected under the cursor. */
3655
+ background-image: linear-gradient(
3656
+ var(--m3-state-layer-hover),
3657
+ var(--m3-state-layer-hover)
3658
+ );
3659
+ }