@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,2651 @@
1
+ /*
2
+ DynamicTable — v2 appearance theme layer.
3
+
4
+ Opt-in via <DynamicTable appearance="v2" />, which adds `.hot-appearance-v2`
5
+ to the table root. This file ONLY remaps the grid's existing `--hot-*`
6
+ custom properties onto the `-v2` design-system tokens (packages/ui/src/theme/
7
+ tokens.v2.css) and switches the typeface to Geist. It adds no new structural
8
+ rules and no behavior — re-skin only.
9
+
10
+ MATERIAL 3 (2026-08) — this sheet's shape, state, elevation and motion now
11
+ come from `packages/ui/src/theme/m3.css`. The `--m3-*` roles are the single
12
+ source of truth here: every radius is a rung of the shape ladder, every
13
+ control hover is a translucent state layer, every overlay uses the two-shadow
14
+ elevation model, and every transition names an `--m3-duration-*` /
15
+ `--m3-ease-*` pair. GRID ROWS deliberately keep OPAQUE fills (`--m3-row-*`) —
16
+ translucent layers band against the recessed dark well (ledger 1.28).
17
+ The one hard limit is DENSITY: no row height, cell padding, header height or
18
+ typography token moves. Corners cost zero vertical space; sizes do not.
19
+
20
+ Rules:
21
+ - No hardcoded hex here. Every color is a `var(--m3-…)` role, or a `-v2`
22
+ token where no M3 role carries the same value in BOTH themes.
23
+ - Scoped under `.hot-appearance-v2` so legacy consumers are untouched (the
24
+ package default is appearance="legacy"). Additive / Tier-3 BC-safe.
25
+ - tokens.v2.css is already imported by apps/web globals.css and the Storybook
26
+ preview, so these vars resolve in both contexts.
27
+
28
+ Known follow-ups (later phases, NOT here):
29
+ - Cell-type renderers (badge/mono/number/empty) → phase 2
30
+ - Selected-row left accent rail, zebra stripe, density → phase 3
31
+ - Popovers/menus portaled to <body> fall outside this
32
+ scope; they keep legacy vars until phase 3/4 wraps them.
33
+ */
34
+
35
+ .hot-appearance-v2 {
36
+ /* Typeface — Geist (sans) + Geist Mono, wired in apps/web layout.tsx and
37
+ aliased to --font-sans / --font-mono in globals.css.
38
+
39
+ This block used to also carry ~39 `--hot-*` aliases that overrode the
40
+ base ones in DynamicTable.css. Both sets are gone: rules name their
41
+ `--m3-*` role directly now. Where the two blocks disagreed, the value
42
+ that survived is the one THIS block set, because every table container
43
+ hardcodes `hot-appearance-v2` (DynamicTable.tsx:3291) and the
44
+ `appearance` prop is a documented no-op — so these were the values
45
+ actually rendering. */
46
+ font-family: var(--font-sans, ui-sans-serif, system-ui, sans-serif);
47
+ }
48
+
49
+
50
+ /* No wrapper card. The DynamicTable renders flush — any surrounding card or
51
+ border is the consumer page's responsibility, not the component's. This
52
+ also strips the legacy toolbar + tabs-row chrome borders so there is no
53
+ stray line above the perspective tabs or above the column header. */
54
+ .hot-appearance-v2.hot-container {
55
+ /* Flush (no-card) tables — the container IS the grid body, so it takes the
56
+ table-body surface (white in light, the recessed dark well in dark). Card
57
+ list pages override this to transparent below; their grid body gets the
58
+ same token on `.hot-virtual-container`. */
59
+ background: var(--m3-surface-container-lowest);
60
+ border: none;
61
+ border-radius: 0;
62
+ overflow: visible;
63
+ }
64
+ /* Full list pages wrap the toolbar+tabs+grid in a `.hot-card`; the container
65
+ itself then becomes a transparent layout shell so the page canvas shows
66
+ through behind the lead row (category tabs) and around the floating card. */
67
+ .hot-appearance-v2.hot-container:has(.hot-card) {
68
+ background: transparent;
69
+ }
70
+ /* The white floating card — toolbar, perspective tabs and grid sit on it.
71
+ Rounded + hairline border; the lead row above stays outside it. */
72
+ .hot-appearance-v2 .hot-card {
73
+ /* The whole table widget — toolbar, search, perspective tabs AND grid — sits
74
+ on one surface (recessed dark well in dark; white in light), distinct from
75
+ the page canvas around it. The toolbar/tabs stay transparent so they inherit
76
+ this fill, and the grid's 16px side margins reveal the same color (no gap). */
77
+ background: var(--m3-surface-container-lowest);
78
+ /* M3 OUTLINED card: an outline and NO shadow. Softness comes from the 16px
79
+ corner, not from a drop shadow — in-flow chrome stays at elevation 0 and
80
+ only true overlays (menus, the drawer, the floating selection bar) cast. */
81
+ border: 1px solid var(--m3-outline-variant);
82
+ border-radius: var(--m3-shape-lg);
83
+ box-shadow: var(--m3-elevation-0);
84
+ /* `overflow: hidden` is load-bearing: it is what clips the square grid header
85
+ bar to the card's radius. Do not remove it. */
86
+ overflow: hidden;
87
+ }
88
+ /* The pill radius lives on this rule, not on the base one, because this rule
89
+ exists specifically to out-specify the legacy toolbar chrome reset. */
90
+ .hot-appearance-v2.hot-container .hot-toolbar {
91
+ border: none;
92
+ border-radius: var(--m3-shape-full);
93
+ }
94
+ .hot-appearance-v2.hot-container .hot-tabs-row {
95
+ position: relative;
96
+ display: flex;
97
+ align-items: flex-end; /* tabs sit on the rail */
98
+ padding-right: 16px;
99
+ border: none;
100
+ margin-bottom: 8px;
101
+ }
102
+ /* Divider ABOVE the perspectives row, separating the title/search toolbar from
103
+ the tabs. Drawn as an inset ::before, NOT a full-bleed border: it spans
104
+ almost the full width with a small gap at each end. */
105
+ .hot-appearance-v2.hot-container .hot-tabs-row::before {
106
+ content: "";
107
+ position: absolute;
108
+ left: 8px;
109
+ right: 8px;
110
+ top: 0;
111
+ height: 1px;
112
+ background: var(--table-v2-divider);
113
+ }
114
+ .hot-appearance-v2.hot-container .hot-tabs-row .hot-tabs-row-spacer {
115
+ flex: 1;
116
+ }
117
+ /* The TabBar primitive draws its own short border under the tab labels; hide
118
+ it so only the full-width row rail shows (the active underline is a separate
119
+ pseudo-element, unaffected). */
120
+ .hot-appearance-v2.hot-container .hot-tabs-row .hot-top-tabs-v2 {
121
+ border-bottom: none;
122
+ }
123
+ /* Pagination lifted off the rail (tabs are bottom-aligned). The 2px lift puts
124
+ the pagination's vertical center on the tab labels' center: the tabs bottom-
125
+ align with text center 18px above the row bottom (4px pt + 20px line-height
126
+ half + 8px pb), and the 32px-tall pagination center-aligned at +2px lands at
127
+ that same 18px. */
128
+ .hot-appearance-v2.hot-container .hot-tabs-row .hot-table-pagination {
129
+ align-self: flex-end;
130
+ margin-bottom: -2px;
131
+ }
132
+
133
+ /* Grouped-actions (bulk) bar — collapse animation. The bar is kept mounted and
134
+ the wrapper animates its height via the grid-rows 0fr↔1fr trick (animatable,
135
+ unlike `height: auto`), so showing/hiding the band glides instead of snapping
136
+ the table up/down. `.hot-bulk-bar-inner` is the clipped grid child; the band's
137
+ 8px top/bottom margins live inside it so the breathing room collapses too. */
138
+ .hot-bulk-bar-wrap {
139
+ display: grid;
140
+ grid-template-rows: 0fr;
141
+ transition: grid-template-rows var(--m3-duration-medium1) var(--m3-ease-emphasized);
142
+ }
143
+ .hot-bulk-bar-wrap.is-open {
144
+ grid-template-rows: 1fr;
145
+ }
146
+ .hot-bulk-bar-inner {
147
+ min-height: 0;
148
+ overflow: hidden;
149
+ /* Fade the band slightly behind the height so it doesn't pop in at 0px. */
150
+ opacity: 0;
151
+ /* Exit is always shorter than enter, and accelerates out. */
152
+ transition: opacity var(--m3-duration-short3) var(--m3-ease-emphasized-accelerate);
153
+ }
154
+ .hot-bulk-bar-wrap.is-open .hot-bulk-bar-inner {
155
+ opacity: 1;
156
+ transition: opacity var(--m3-duration-short4) var(--m3-ease-emphasized-decelerate) 60ms;
157
+ }
158
+ @media (prefers-reduced-motion: reduce) {
159
+ .hot-bulk-bar-wrap,
160
+ .hot-bulk-bar-inner {
161
+ transition: none;
162
+ }
163
+ }
164
+
165
+ /* Grouped-actions (bulk) bar — dark navy band shown when >1 row is selected
166
+ (Figma 546:12289). Floats inside the card with an 8px gutter and rounded
167
+ corners; the 8px top/bottom margin is the requested breathing room above and
168
+ below the bar. */
169
+ .hot-appearance-v2.hot-container .hot-bulk-bar {
170
+ display: flex;
171
+ align-items: center;
172
+ gap: 8px;
173
+ /* Match a md data row: 44px tall, and the 16px L/R margin lines the band up
174
+ with the grid (`.hot-virtual-container`) so its width equals the row width.
175
+ The 8px top/bottom is the breathing room above/below the band. */
176
+ height: 44px;
177
+ box-sizing: border-box;
178
+ margin: 8px 16px;
179
+ padding: 4px 10px;
180
+ /* The M3 floating selection bar: a full pill, lifted off the grid on the
181
+ level-2 two-shadow elevation. Height and margins are unchanged. */
182
+ border-radius: var(--m3-shape-full);
183
+ background: var(--m3-primary);
184
+ color: var(--m3-on-primary);
185
+ box-shadow: var(--m3-elevation-2);
186
+ }
187
+ /* Scoped under `.hot-bulk-bar` for specificity (0,3,0) so it beats the
188
+ later-defined `.hot-row-select { width:16px }` (0,2,0) and renders at the
189
+ same 13×16 as the data-row checkboxes. */
190
+ .hot-appearance-v2 .hot-bulk-bar .hot-bulk-bar-checkbox {
191
+ flex-shrink: 0;
192
+ width: 13px;
193
+ height: 16px;
194
+ margin: 0;
195
+ }
196
+ /* Count + deselect text use the same body/regular/xs ramp as the grid cells. */
197
+ .hot-appearance-v2 .hot-bulk-bar-count {
198
+ font-size: var(--text-caption-medium-md, 0.75rem);
199
+ line-height: var(--text-caption-medium-md--line-height, 1rem);
200
+ font-weight: var(--text-caption-medium-md--font-weight, 500);
201
+ white-space: nowrap;
202
+ }
203
+ .hot-appearance-v2 .hot-bulk-bar-spacer {
204
+ flex: 1;
205
+ }
206
+ /* xs action pill. */
207
+ .hot-appearance-v2 .hot-bulk-bar-action {
208
+ display: inline-flex;
209
+ align-items: center;
210
+ gap: 4px;
211
+ height: 24px;
212
+ padding: 0 10px;
213
+ /* M3 text button ON a primary container: no box at rest, a state layer built
214
+ from `on-primary` on interaction. The old `#ffffff 8%/16%` mixes were raw
215
+ hex and therefore invisible to any retint of the bar. */
216
+ border-radius: var(--m3-shape-full);
217
+ background-color: transparent;
218
+ border: none;
219
+ color: var(--m3-on-primary);
220
+ font-size: var(--text-caption-medium-md, 0.75rem);
221
+ line-height: var(--text-caption-medium-md--line-height, 1rem);
222
+ font-weight: var(--text-caption-medium-md--font-weight, 500);
223
+ cursor: pointer;
224
+ transition: var(--m3-transition-state);
225
+ }
226
+ .hot-appearance-v2 .hot-bulk-bar-action:hover {
227
+ background-color: var(--m3-state-layer-on-primary-hover);
228
+ }
229
+ .hot-appearance-v2 .hot-bulk-bar-action:active {
230
+ background-color: var(--m3-state-layer-on-primary-pressed);
231
+ }
232
+ .hot-appearance-v2 .hot-bulk-bar-action:disabled {
233
+ opacity: var(--m3-disabled-content-opacity);
234
+ cursor: not-allowed;
235
+ }
236
+ /* Export menu items live in a portaled Radix popover (outside .hot-appearance-v2),
237
+ so this rule is intentionally unscoped and uses theme popover tokens. */
238
+ .hot-export-menu-item {
239
+ display: flex;
240
+ align-items: center;
241
+ gap: 8px;
242
+ width: 100%;
243
+ padding: 6px 8px;
244
+ border-radius: var(--m3-shape-sm);
245
+ background-color: transparent;
246
+ border: none;
247
+ color: var(--m3-on-surface);
248
+ font-size: var(--text-body-regular-sm, 0.875rem);
249
+ line-height: var(--text-body-regular-sm--line-height, 1.25rem);
250
+ text-align: left;
251
+ cursor: pointer;
252
+ transition: var(--m3-transition-state);
253
+ }
254
+ .hot-export-menu-item:hover {
255
+ background-color: var(--m3-state-layer-hover);
256
+ }
257
+ .hot-export-menu-item:active {
258
+ background-color: var(--m3-state-layer-pressed);
259
+ }
260
+ .hot-appearance-v2 .hot-bulk-bar-clear {
261
+ padding: 0 10px;
262
+ border-radius: var(--m3-shape-full);
263
+ background-color: transparent;
264
+ border: none;
265
+ /* Full-strength `on-primary`, not a 60% alpha wash. Dimming ink with
266
+ transparency is the one thing this system never does; the button is
267
+ distinguished by having no container until you touch it. */
268
+ color: var(--m3-on-primary);
269
+ font-size: var(--text-body-regular-xs, 0.75rem);
270
+ line-height: var(--text-body-regular-xs--line-height, 1rem);
271
+ cursor: pointer;
272
+ transition: var(--m3-transition-state);
273
+ }
274
+ .hot-appearance-v2 .hot-bulk-bar-clear:hover {
275
+ background-color: var(--m3-state-layer-on-primary-hover);
276
+ }
277
+ .hot-appearance-v2 .hot-bulk-bar-clear:active {
278
+ background-color: var(--m3-state-layer-on-primary-pressed);
279
+ }
280
+ .hot-appearance-v2 .hot-bulk-bar-clear:disabled {
281
+ opacity: var(--m3-disabled-content-opacity);
282
+ cursor: not-allowed;
283
+ }
284
+
285
+ /* The base sticky-shadow rules paint an always-on `box-shadow` on sticky
286
+ cells (and, via attribute-PRESENCE selectors, on every ="false" cell too),
287
+ which reads as a permanent vertical line beside the checkbox + Actions
288
+ columns. The v2 look is flush/borderless, so drop the shadow on all cells.
289
+ The selected-row inset rail uses `!important`, so it still wins. */
290
+ .hot-appearance-v2 [data-sticky-left],
291
+ .hot-appearance-v2 [data-sticky-right] {
292
+ box-shadow: none;
293
+ }
294
+ /* …except: when the grid can still be scrolled horizontally (there's content
295
+ hidden under the right-pinned Actions column), cast a soft left-edge shadow
296
+ on that column so it reads as floating above the scrolling content. Toggled
297
+ by `data-actions-scroll-shadow` on the container (set in DynamicTable from a
298
+ scroll/resize listener). Higher specificity than the zeroing rule above. */
299
+ /* Sticky-column dividers (Figma) — a SINGLE continuous 1px line on the Actions
300
+ column's LEFT edge and the checkbox column's RIGHT edge, scroll-triggered
301
+ (shown only while there's hidden horizontal content, via the container's
302
+ data-*-scroll-shadow attrs).
303
+
304
+ Drawn as an ::after, NOT a `border`: a border miters at the corners against
305
+ the 2px transparent top/bottom gap borders, so each row's line falls ~4px
306
+ short and the column reads as dashed. The ::after instead overhangs ±4px into
307
+ the row gaps and carries a z-index, so the topmost overlapping cell always
308
+ paints its segment and adjacent segments merge into ONE unbroken line. Both
309
+ the header cell AND the body cells carry it, so the line runs continuously
310
+ from the column header through the last row. */
311
+ /* The base `.hot-cell { overflow: hidden }` (for text ellipsis) would CLIP the
312
+ divider ::after's row-gap overhang back to the cell, re-segmenting the line.
313
+ These sticky cells hold only a checkbox / kebab (no text to clip), so let
314
+ their overflow escape — out-specifies the base `.hot-cell` rule. */
315
+ .hot-appearance-v2 td.hot-actions-cell,
316
+ .hot-appearance-v2 td.hot-row-header,
317
+ .hot-appearance-v2 th.hot-col-header[data-actions-cell="true"],
318
+ .hot-appearance-v2 th.hot-row-header {
319
+ overflow: visible;
320
+ }
321
+ /* The Actions column isn't an editable grid cell — drop the inherited
322
+ `cursor: cell` (crosshair/"+") so it reads as a normal column. */
323
+ .hot-appearance-v2 td.hot-actions-cell {
324
+ cursor: default;
325
+ }
326
+ .hot-appearance-v2 td.hot-actions-cell::after,
327
+ .hot-appearance-v2 th.hot-col-header[data-actions-cell="true"]::after {
328
+ content: "";
329
+ position: absolute;
330
+ top: -4px;
331
+ bottom: -4px;
332
+ left: 0;
333
+ width: 1px;
334
+ background: var(--table-v2-divider);
335
+ pointer-events: none;
336
+ z-index: 1;
337
+ }
338
+ /* Body cells only — the checkbox HEADER already draws its right divider via the
339
+ header rule's always-on `border-right` (at its border-box edge). Adding an
340
+ ::after to the header too would sit 1px inside that border (right:0 =
341
+ padding-box edge, pushed in by the 1px border) → a visible double line. The
342
+ body cell has no border, so its ::after lands exactly on the header's
343
+ border-right → one clean continuous line from header through the rows. */
344
+ .hot-appearance-v2[data-firstcol-scroll-shadow="true"] td.hot-row-header::after {
345
+ content: "";
346
+ position: absolute;
347
+ top: -4px;
348
+ bottom: -4px;
349
+ right: 0;
350
+ width: 1px;
351
+ background: var(--table-v2-divider);
352
+ pointer-events: none;
353
+ z-index: 1;
354
+ }
355
+ /* Frozen-column right divider — the rightmost pinned column gets a SINGLE
356
+ continuous 1px line on its RIGHT edge, identical to the checkbox column's
357
+ divider (Figma), rather than a float shadow. Gated on `data-frozen-shadow`,
358
+ which DynamicTable sets only once the pinned block has reached its sticky point
359
+ (content sliding under it) — NOT while a not-yet-pinned frozen column is still
360
+ drifting with the scroll.
361
+
362
+ ONLY the BODY cells (`td[data-frozen-edge]`) draw the line — exactly like the
363
+ checkbox column. The HEADER already carries its own divider via the always-on
364
+ `th.hot-col-header { border-right }` column separator (rule below), so adding a
365
+ pseudo-line to the header too produced a 1px-offset DOUBLE line: with
366
+ border-box sizing the `::before` sits at the padding-box edge, 1px inside the
367
+ `border-right`. The body cell's `border-right` is none, so its `::before` at
368
+ `right:0` lands exactly on the header's `border-right` → one continuous line
369
+ from header through the rows.
370
+
371
+ Drawn as an overhanging pseudo-element, NOT a `border`: a border miters against
372
+ the 2px transparent top/bottom inter-row gap borders so each row's line falls
373
+ ~4px short and reads as dashed. The ::before overhangs ±4px into the row gaps
374
+ with a z-index, so adjacent segments merge into ONE unbroken line. `::before` —
375
+ not `::after` — because data cells already use `::after` for the range-selection
376
+ outline; the cell's `overflow:hidden` (text ellipsis) is relaxed to `visible`
377
+ so the overhang isn't clipped (text still ellipses via the inner `.cell-content`,
378
+ which keeps its own overflow). */
379
+ .hot-appearance-v2 td[data-frozen-edge="true"] {
380
+ overflow: visible;
381
+ }
382
+ .hot-appearance-v2[data-frozen-shadow="true"] td[data-frozen-edge="true"]::before {
383
+ content: "";
384
+ position: absolute;
385
+ top: -4px;
386
+ bottom: -4px;
387
+ right: 0;
388
+ width: 1px;
389
+ background: var(--table-v2-divider);
390
+ pointer-events: none;
391
+ z-index: 1;
392
+ }
393
+
394
+ /* Horizontal-scroll edge overlay for TOOLBAR-LESS embedded/sub-tables (which
395
+ have no sticky checkbox/Actions columns, so the shadows above never show).
396
+ A WHITE fade (opaque at the edge → transparent toward the content) pinned to
397
+ whichever edge still has hidden content, so partial cut-off columns fade out
398
+ and signal "more this way". Driven by the same scroll-state attributes, so it
399
+ auto-DISAPPEARS once that edge is fully scrolled. Scoped to
400
+ `:not(:has(.hot-toolbar))` so it never paints over a list page's toolbar
401
+ (those tables use the sticky-column shadows instead). */
402
+ .hot-appearance-v2.hot-container:not(:has(.hot-toolbar))[data-actions-scroll-shadow="true"]::after,
403
+ .hot-appearance-v2.hot-container:not(:has(.hot-toolbar))[data-firstcol-scroll-shadow="true"]::before {
404
+ content: "";
405
+ position: absolute;
406
+ top: 0;
407
+ bottom: 0;
408
+ width: 40px;
409
+ pointer-events: none;
410
+ /* Above the sticky header (z-index:10) so the fade covers the column-header
411
+ bar AND the rows, not just the rows. Below popovers/menus (z-index:10000+). */
412
+ z-index: 15;
413
+ }
414
+ /* Right edge: more content to the RIGHT → fade out toward the right edge. */
415
+ .hot-appearance-v2.hot-container:not(:has(.hot-toolbar))[data-actions-scroll-shadow="true"]::after {
416
+ right: 0;
417
+ background: linear-gradient(to right, transparent, var(--background-v2));
418
+ }
419
+ /* Left edge: scrolled right (content hidden LEFT) → fade out toward the left. */
420
+ .hot-appearance-v2.hot-container:not(:has(.hot-toolbar))[data-firstcol-scroll-shadow="true"]::before {
421
+ left: 0;
422
+ background: linear-gradient(to left, transparent, var(--background-v2));
423
+ }
424
+ /* Lead row — a custom topBarStart (e.g. category tabs) on its own line above
425
+ the title on list pages, so it doesn't crowd the title + search + buttons. */
426
+ .hot-appearance-v2 .hot-toolbar-lead-row {
427
+ display: flex;
428
+ align-items: center;
429
+ /* Sits OUTSIDE the card on the page canvas — no horizontal inset (the tabs
430
+ align to the card's left edge), just a small gap down to the card. */
431
+ padding: 0 0 10px;
432
+ }
433
+
434
+ /* Toolbar (v2, Figma 220:2935) — title + search on the left, actions
435
+ right-aligned, all on ONE row. The search no longer has its own line. */
436
+ /* R8 — the single change that makes a list page read as Drive: the toolbar is
437
+ a TINTED PILL STRIP floating on the card rather than an invisible band.
438
+ ZERO vertical cost: the 4px margin is paid for out of the old 8px vertical
439
+ padding (4+4 padding + 4+4 margin == the previous 8+8 padding), so the block
440
+ size of the toolbar is unchanged and no data row is lost. */
441
+ .hot-appearance-v2 .hot-toolbar {
442
+ display: flex;
443
+ align-items: center;
444
+ gap: 12px;
445
+ /* 16px horizontal, matching `.hot-virtual-container`'s own 16px margin, so
446
+ the search pill's left edge lines up with the table's first column. It was
447
+ 8px, which put the toolbar 9px from the card and the grid 17px — close
448
+ enough to look like a mistake rather than a decision, and the same
449
+ mismatch that was fixed inside split panes. Vertical is unchanged. */
450
+ margin: 4px 16px;
451
+ padding: 4px 16px;
452
+ /* `surface-container`, not `-low`: the tinted pill strip is the most
453
+ recognisable element of the M3 reference, and `-low` (#F8FAFC) against a
454
+ #FFFFFF page is a 3-value delta nobody can see. `surface-container`
455
+ (#F1F5F9 light / #16203A dark) is the step M3 actually specifies for a
456
+ raised chrome bar and reads clearly in both schemes. Costs no height —
457
+ the 4px margin is absorbed by the toolbar's own vertical padding. */
458
+ background-color: var(--m3-surface-container);
459
+ border-radius: var(--m3-shape-full);
460
+ }
461
+ .hot-appearance-v2 .hot-toolbar .hot-toolbar-spacer {
462
+ flex: 1;
463
+ }
464
+ .hot-appearance-v2 .hot-toolbar .hot-toolbar-actions {
465
+ display: flex;
466
+ align-items: center;
467
+ gap: 8px;
468
+ }
469
+ /* The toolbar's own search skin used to live here: a second, competing set of
470
+ `border` / `border-radius` / `background` / `padding` declarations for the
471
+ same field SearchBar.css already styles, plus 60px of right padding reserved
472
+ for a ⌘K pill that no longer renders. It is gone. SearchBar.css loads AFTER
473
+ this file (see globals.css) and is the single owner of the field, so the
474
+ search input, its icon and its clear button are skinned in exactly one
475
+ place. The narrow-container overrides further down still apply. */
476
+
477
+ /* Align the grid with the toolbar text. The title, search and perspective
478
+ tabs sit at 16px (the toolbar's padding-left); the grid (column-header bar +
479
+ rows) otherwise starts flush at the container edge. Use MARGIN (not padding)
480
+ to inset the scroll container: padding does NOT clip horizontally-scrolling
481
+ content, so the non-sticky columns would scroll through the padding strip and
482
+ peek out beside the sticky checkbox/Actions columns. Margin makes the
483
+ container genuinely narrower, so overflow clips at its border and the sticky
484
+ columns sit flush at the 16px inset, lined up with "Oferty frachtowe". */
485
+ /* Only inset list-page grids (those with a toolbar) — the 16px aligns the grid
486
+ with the toolbar title. Embedded/sub-tables render with `hideToolbar` (no
487
+ `.hot-toolbar`); they should sit flush with their own section title, so they
488
+ get NO inset. `:has()` scopes the margin to toolbar'd tables only. */
489
+ .hot-appearance-v2.hot-container:has(.hot-toolbar) .hot-virtual-container {
490
+ margin-left: 16px;
491
+ margin-right: 16px;
492
+ }
493
+
494
+ /* Bottom breathing room inside the scroll area so the last row clears the
495
+ horizontal scrollbar (which overlays the container's bottom edge). Modern
496
+ browsers honour padding at the end of a scroll container, so this extends
497
+ the scrollable extent past the last row. */
498
+ .hot-appearance-v2 .hot-virtual-container {
499
+ padding-bottom: 16px;
500
+ /* Grid-body well — darker than the toolbar/card in dark mode (white in light),
501
+ so the inter-row gaps and side margins read as one recessed table surface. */
502
+ background: var(--m3-surface-container-lowest);
503
+ }
504
+
505
+ /* Grid type ramp — body cells use the named typography token (12/16),
506
+ matching Figma `body/regular/xs`. The legacy default is Arial 13px. */
507
+ .hot-appearance-v2 .hot-table {
508
+ font-family: var(--font-sans, ui-sans-serif, system-ui, sans-serif);
509
+ font-size: var(--text-body-regular-xs, 0.75rem);
510
+ line-height: var(--text-body-regular-xs--line-height, 1rem);
511
+ }
512
+ /* The base `.hot-container .hot-table th, td { font-size: 14px }` (specificity
513
+ 0,3,1) sits DIRECTLY on the cells, so it overrides the font-size inherited
514
+ from `.hot-table` above (0,2,1) — which means custom-renderer cells (whose
515
+ content is a direct <td> child, e.g. offers/invoicing/products) render at the
516
+ legacy 14px while the v2 12px never takes effect. Re-assert the token on the
517
+ cells themselves at higher specificity so the WHOLE grid (default + custom
518
+ renderers) uses Figma `body/regular/xs` (12/16). Per-cell overrides like
519
+ `.cell-mono` / explicit `text-[10px]` badges still win (they're on the inner
520
+ span). */
521
+ .hot-appearance-v2.hot-container .hot-table td,
522
+ .hot-appearance-v2.hot-container .hot-table th {
523
+ font-size: var(--text-body-regular-xs, 0.75rem);
524
+ line-height: var(--text-body-regular-xs--line-height, 1rem);
525
+ }
526
+
527
+ /* Toolbar title → Figma 220:2935 `heading/bold/md` (16/24, ls -2.5%). */
528
+ .hot-appearance-v2 .hot-toolbar-title {
529
+ font-size: var(--text-heading-bold-md, 1rem);
530
+ line-height: var(--text-heading-bold-md--line-height, 1.5rem);
531
+ letter-spacing: var(--text-heading-bold-md--letter-spacing, -0.025em);
532
+ font-weight: var(--text-heading-bold-md--font-weight, 700);
533
+ }
534
+
535
+ /* ══════════════════════════════════════════════════════════════════
536
+ v2 cell presentation — phase 2
537
+
538
+ These classes are opt-in per column (ColumnDef.type='badge', .mono,
539
+ .align) so they're additive and work regardless of appearance. Colors
540
+ come from the global --status-v2-* tokens, never hardcoded.
541
+ ════════════════════════════════════════════════════════════════ */
542
+
543
+ /* Alignment — text-align handles the wrapped .cell-content (text/badge);
544
+ justify-content handles the custom-renderer path (no inner span). */
545
+ .hot-cell.cell-align-right { justify-content: flex-end; }
546
+ .hot-cell.cell-align-right > .cell-content { text-align: right; }
547
+ .hot-cell.cell-align-center { justify-content: center; }
548
+ .hot-cell.cell-align-center > .cell-content { text-align: center; }
549
+
550
+ /* Monospace (Geist Mono) — refs / codes / dates / amounts. */
551
+ .hot-cell.cell-mono {
552
+ font-family: var(--font-mono, ui-monospace, SFMono-Regular, "SF Mono", Menlo, monospace);
553
+ font-size: var(--text-code-regular-sm, 0.75rem);
554
+ line-height: var(--text-code-regular-sm--line-height, 1rem);
555
+ }
556
+
557
+ /* Select / dropdown cell (type:'dropdown' | 'multiselect') — bordered control
558
+ at rest (Figma `select`: radius 10, border #D4D4D8, "Wybierz…" + chevron).
559
+ Scoped to v2 so legacy dropdown cells keep plain text. */
560
+ .hot-appearance-v2 .hot-cell.cell-select { padding: 4px 6px; }
561
+ .hot-appearance-v2 .hot-cell.cell-select > .cell-content {
562
+ flex: 1;
563
+ min-width: 0;
564
+ border: 1px solid var(--m3-outline);
565
+ /* Density floor: this pill lives inside a 32px row, so it takes `sm` — the
566
+ largest rung the floor allows — and now matches the row pill exactly. */
567
+ border-radius: var(--m3-shape-sm);
568
+ padding: 5px 30px 5px 10px;
569
+ background-color: var(--background-v2);
570
+ /* `stroke='currentColor'` — the chevron used to be a hardcoded #71717A, i.e.
571
+ invisible to dark mode. It now follows the cell's ink. */
572
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
573
+ background-repeat: no-repeat;
574
+ background-position: right 8px center;
575
+ color: var(--m3-on-surface);
576
+ line-height: 18px;
577
+ cursor: pointer;
578
+ transition: var(--m3-transition-state);
579
+ }
580
+ .hot-appearance-v2 .hot-cell.cell-select:hover > .cell-content {
581
+ border-color: var(--m3-on-surface-variant);
582
+ }
583
+ /* Empty select cell → "Wybierz…" placeholder (overrides the em-dash). */
584
+ .hot-appearance-v2 .hot-cell.cell-select > .cell-content:empty::after {
585
+ content: "Wybierz\2026";
586
+ color: var(--m3-on-surface-variant);
587
+ }
588
+
589
+ /* Status badge pill (type:'badge') — Figma `label/semibold/xs`, radius 9999.
590
+ NOTE: set only border-width/-style here, NEVER border-color (not even via
591
+ the `border` shorthand). This rule's specificity (0,2,0) outranks each
592
+ `.cell-badge-<variant>` `border-color` (0,1,0); pinning the color here —
593
+ transparent or otherwise — would hide every variant's Figma border. */
594
+ .hot-cell .cell-badge {
595
+ display: inline-flex;
596
+ align-items: center;
597
+ gap: 4px;
598
+ padding: 2px 10px;
599
+ /* D4 — M3 chip FORM (a full pill, container + on-container ink, a 1px
600
+ outline only where the variant already declares one), FMS semantic hues.
601
+ Never set `border-color` (or the `border` shorthand) here: this rule
602
+ out-specifies every `.cell-badge-<variant>` and would flatten all 12. */
603
+ border-radius: var(--m3-shape-full);
604
+ border-width: 1px;
605
+ border-style: solid;
606
+ white-space: nowrap;
607
+ font-size: var(--text-label-semibold-xs, 0.75rem);
608
+ line-height: var(--text-label-semibold-xs--line-height, 1rem);
609
+ font-weight: var(--text-label-semibold-xs--font-weight, 600);
610
+ }
611
+ .cell-badge-neutral { background: var(--status-v2-neutral-bg); border-color: var(--status-v2-neutral-border); color: var(--status-v2-neutral-text); }
612
+ .cell-badge-primary { background: var(--status-v2-primary-bg); border-color: var(--status-v2-primary-border); color: var(--status-v2-primary-text); }
613
+ .cell-badge-outline { background: var(--status-v2-outline-bg); border-color: var(--status-v2-outline-border); color: var(--status-v2-outline-text); }
614
+ .cell-badge-success { background: var(--status-v2-success-bg); border-color: var(--status-v2-success-border); color: var(--status-v2-success-text); }
615
+ .cell-badge-error { background: var(--status-v2-error-bg); border-color: var(--status-v2-error-border); color: var(--status-v2-error-text); }
616
+ .cell-badge-warning { background: var(--status-v2-warning-bg); border-color: var(--status-v2-warning-border); color: var(--status-v2-warning-text); }
617
+ .cell-badge-info { background: var(--status-v2-info-bg); border-color: var(--status-v2-info-border); color: var(--status-v2-info-text); }
618
+ .cell-badge-purple { background: var(--status-v2-purple-bg); border-color: var(--status-v2-purple-border); color: var(--status-v2-purple-text); }
619
+ .cell-badge-teal { background: var(--status-v2-teal-bg); border-color: var(--status-v2-teal-border); color: var(--status-v2-teal-text); }
620
+ .cell-badge-orange { background: var(--status-v2-orange-bg); border-color: var(--status-v2-orange-border); color: var(--status-v2-orange-text); }
621
+ .cell-badge-sky { background: var(--status-v2-sky-bg); border-color: var(--status-v2-sky-border); color: var(--status-v2-sky-text); }
622
+ .cell-badge-rose { background: var(--status-v2-rose-bg); border-color: var(--status-v2-rose-border); color: var(--status-v2-rose-text); }
623
+
624
+ /* Empty cell → em-dash. Scoped to v2 so legacy keeps rendering blank.
625
+ Applies to non-custom text/numeric/date renderers that return '' (their
626
+ .cell-content span is :empty). Custom renderers manage their own empties. */
627
+ .hot-appearance-v2 .hot-cell > .cell-content:empty::after {
628
+ content: "—";
629
+ color: var(--m3-on-surface-variant);
630
+ }
631
+
632
+ /* Zebra striping (striped prop) — alternate rows get the secondary surface.
633
+ Row-range selection keeps its !important background, so it still wins; the
634
+ second rule re-asserts hover at higher specificity so even rows still
635
+ respond to hover. */
636
+ /* NOTE: these use `background-color` (longhand), NOT the `background`
637
+ shorthand — the shorthand resets `background-clip` to border-box, which
638
+ would defeat the padding-box inset that creates the inter-row gap. */
639
+ .hot-appearance-v2[data-striped="true"] tbody tr[data-row-even="true"] td.hot-cell,
640
+ .hot-appearance-v2[data-striped="true"] tbody tr[data-row-even="true"] td.hot-row-header {
641
+ background-color: var(--table-v2-row-stripe);
642
+ }
643
+ .hot-appearance-v2[data-striped="true"] tbody tr[data-row-even="true"] td.hot-cell:hover:not([data-save-state]) {
644
+ background-color: var(--m3-row-hover);
645
+ }
646
+
647
+ /* Checkbox-selected row — pale-blue fill (Figma), covering data cells AND the
648
+ row-header (checkbox) cell so the whole row is uniform. `!important` so it
649
+ wins over the zebra stripe + per-cell hover regardless of row parity. */
650
+ .hot-appearance-v2 tbody tr[data-row-checked="true"] td.hot-cell:not([class*="cell-color-"]),
651
+ .hot-appearance-v2 tbody tr[data-row-checked="true"] td.hot-row-header {
652
+ background-color: var(--m3-row-selected) !important;
653
+ }
654
+ /* M3 composites the hover layer ON TOP of the selected container rather than
655
+ replacing it, so a checked row still answers the pointer instead of going
656
+ inert. Pre-composited and OPAQUE — a translucent layer bands against the
657
+ recessed dark well (ledger 1.28). Same specificity as the rule above,
658
+ declared after it, so it wins only while hovered. */
659
+ .hot-appearance-v2 tbody tr[data-row-checked="true"] td.hot-cell:not([class*="cell-color-"]):hover,
660
+ .hot-appearance-v2 tbody tr[data-row-checked="true"] td.hot-row-header:hover {
661
+ background-color: var(--m3-row-selected-hover) !important;
662
+ }
663
+
664
+ /* Row-range selection (v2) — flat pale-blue, same as the checkbox selection.
665
+ The legacy treatment turns the row-header NAVY (`--hot-selection-color`) and
666
+ adds navy inset border lines on the cells. This is the "strange navy
667
+ first-row/first-column" after cancelling an add-row: the grid auto-selects
668
+ row 0 as a RANGE, so the trigger is `data-in-row-range` (NOT
669
+ `data-row-selected`). The selectors are deliberately high specificity
670
+ (≥ (0,5,1)) to beat the base nth-child + multi-attr box-shadow rules
671
+ (up to (0,4,3) !important). */
672
+ .hot-appearance-v2.hot-container .hot-virtual-container .hot-table td[data-in-row-range="true"],
673
+ .hot-appearance-v2.hot-container .hot-virtual-container .hot-table .hot-row-header[data-in-row-range="true"],
674
+ .hot-appearance-v2.hot-container .hot-virtual-container .hot-table tr[data-row-selected="true"] td,
675
+ .hot-appearance-v2.hot-container .hot-virtual-container .hot-table tr[data-row-selected="true"] .hot-row-header {
676
+ background-clip: padding-box !important;
677
+ color: var(--m3-on-surface) !important;
678
+ box-shadow: none !important;
679
+ }
680
+ /* Pale-blue fill only on un-annotated cells — colored cells keep their
681
+ annotation color (the row header + the rest of the row convey selection). */
682
+ .hot-appearance-v2.hot-container .hot-virtual-container .hot-table td[data-in-row-range="true"]:not([class*="cell-color-"]),
683
+ .hot-appearance-v2.hot-container .hot-virtual-container .hot-table .hot-row-header[data-in-row-range="true"],
684
+ .hot-appearance-v2.hot-container .hot-virtual-container .hot-table tr[data-row-selected="true"] td:not([class*="cell-color-"]),
685
+ .hot-appearance-v2.hot-container .hot-virtual-container .hot-table tr[data-row-selected="true"] .hot-row-header {
686
+ background-color: var(--m3-row-selected) !important;
687
+ }
688
+ /* Row-header must not darken to navy/grey when a cell in its row is selected. */
689
+ .hot-appearance-v2 .hot-row-header[data-has-selected-cell="true"] {
690
+ background-color: var(--m3-surface-container-lowest) !important;
691
+ color: var(--m3-on-surface) !important;
692
+ }
693
+
694
+ /* Cell / range selection (v2) — match the row-selected look: a flat pale-blue
695
+ fill with NO border outline. `box-shadow: none !important` strips the base
696
+ navy inset borders (cell + every range-edge variant); background-color
697
+ (longhand) keeps the inter-row gap intact. `background-clip: padding-box
698
+ !important` is required because the base `td[data-in-range]` rule uses the
699
+ `background` shorthand with !important, which would otherwise force
700
+ border-box clip and make the fill overhang the row (taller than the row bg). */
701
+ .hot-appearance-v2 td[data-cell-selected="true"],
702
+ .hot-appearance-v2 td[data-in-range="true"] {
703
+ box-shadow: none !important;
704
+ background-clip: padding-box !important;
705
+ }
706
+ /* Plain (un-annotated) selected cells get the soft blue-50 fill (Figma Frame
707
+ 142) — same as the new/add row in LIGHT, lighter than the blue-100
708
+ checkbox-selected row.
709
+ `--range-v2-fill` rather than `--row-v2-new` directly: in DARK the new-row
710
+ mirror (#14233A) sat within a couple of steps of the #1E293B row hover, so a
711
+ multi-cell selection read as row banding instead of as a selection (ledger
712
+ row 1.28). The token carries the per-theme answer; light is unchanged. */
713
+ .hot-appearance-v2 td[data-cell-selected="true"]:not([class*="cell-color-"]),
714
+ .hot-appearance-v2 td[data-in-range="true"]:not([class*="cell-color-"]) {
715
+ background-color: var(--range-v2-fill, var(--m3-primary-container)) !important;
716
+ }
717
+ /* Drag-selected cell range — a 1px dotted #3B82F6 outline on the OUTER edges of
718
+ the selection rectangle (per-edge via the `data-range-*` attrs), so internal
719
+ cell boundaries stay clean. Drawn on an inset ::after (no layout shift, never
720
+ clips text). The outline only appears once the drag FINISHES: DynamicTable
721
+ sets `data-range-phase="committed"` on mouseup (fade in) and flips it to
722
+ `"exiting"` on deselect (fade out) before the selection actually clears. While
723
+ dragging, the attribute is absent → fill only, no outline. */
724
+ /* The committed outline pulses its opacity 0↔1 forever (fade in / fade out)
725
+ while the range stays selected; on deselect it does one last fade to 0. */
726
+ @keyframes hot-range-outline-pulse {
727
+ from { opacity: 0; }
728
+ to { opacity: 1; }
729
+ }
730
+ @keyframes hot-range-outline-out {
731
+ from { opacity: 1; }
732
+ to { opacity: 0; }
733
+ }
734
+ .hot-appearance-v2[data-range-phase] td[data-in-range="true"]::after {
735
+ content: "";
736
+ position: absolute;
737
+ inset: 0;
738
+ pointer-events: none;
739
+ z-index: 5;
740
+ }
741
+ .hot-appearance-v2[data-range-phase="committed"] td[data-in-range="true"]::after {
742
+ animation: hot-range-outline-pulse 1.1s var(--m3-ease-standard) infinite alternate;
743
+ }
744
+ .hot-appearance-v2[data-range-phase="exiting"] td[data-in-range="true"]::after {
745
+ animation: hot-range-outline-out var(--m3-duration-short3) var(--m3-ease-emphasized-accelerate) forwards;
746
+ }
747
+ /* The committed outline pulses FOREVER while a range stays selected. Motion
748
+ that cannot be switched off and never ends is an accessibility failure, so
749
+ hold it at full strength instead — the outline still marks the range. */
750
+ @media (prefers-reduced-motion: reduce) {
751
+ .hot-appearance-v2[data-range-phase="committed"] td[data-in-range="true"]::after,
752
+ .hot-appearance-v2[data-range-phase="exiting"] td[data-in-range="true"]::after {
753
+ animation: none;
754
+ opacity: 1;
755
+ }
756
+ }
757
+ .hot-appearance-v2[data-range-phase] td[data-in-range="true"][data-range-top="true"]::after { border-top: 2px dotted var(--m3-accent); }
758
+ .hot-appearance-v2[data-range-phase] td[data-in-range="true"][data-range-bottom="true"]::after { border-bottom: 2px dotted var(--m3-accent); }
759
+ .hot-appearance-v2[data-range-phase] td[data-in-range="true"][data-range-left="true"]::after { border-left: 2px dotted var(--m3-accent); }
760
+ .hot-appearance-v2[data-range-phase] td[data-in-range="true"][data-range-right="true"]::after { border-right: 2px dotted var(--m3-accent); }
761
+ /* Annotation palette mirrored as variables. `--cell-anno-bg` (the light fill)
762
+ lets the selected-state rule below RE-ASSERT the color — the base
763
+ `td[data-in-range] { background: … !important }` rule (DynamicTable.css)
764
+ outranks a plain color class, so it must be re-applied with !important when
765
+ the cell is selected. `--cell-anno-fg` (a darker shade of the same hue, the
766
+ palette's -700) is the matching comment-indicator color. Both inherit to the
767
+ cell's children. There is no v2 token for the annotation palette, so these hex
768
+ values duplicate the legacy `.cell-color-*` fills in DynamicTable.css — keep
769
+ them in sync. */
770
+ .hot-appearance-v2 .cell-color-gray { --cell-anno-bg: #e5e7eb; --cell-anno-fg: #374151; }
771
+ .hot-appearance-v2 .cell-color-pink { --cell-anno-bg: #fce7f3; --cell-anno-fg: #be185d; }
772
+ .hot-appearance-v2 .cell-color-orange { --cell-anno-bg: #ffedd5; --cell-anno-fg: #c2410c; }
773
+ .hot-appearance-v2 .cell-color-yellow { --cell-anno-bg: #fef9c3; --cell-anno-fg: #a16207; }
774
+ .hot-appearance-v2 .cell-color-green { --cell-anno-bg: #dcfce7; --cell-anno-fg: #15803d; }
775
+ .hot-appearance-v2 .cell-color-blue { --cell-anno-bg: #dbeafe; --cell-anno-fg: #1d4ed8; }
776
+ .hot-appearance-v2 .cell-color-purple { --cell-anno-bg: #f3e8ff; --cell-anno-fg: #7e22ce; }
777
+
778
+ /* Dark-mode annotation palette. The light fills above (#dcfce7 etc.) rendered as
779
+ glaring pastel boxes under the `.dark` class — and the cell's near-white text
780
+ (--hot-fg) was unreadable on them. Re-tint the fill to a dark wash of the same
781
+ hue (legacy `.dark .cell-*` uses the same 25% color-mix), and lift --cell-anno-fg
782
+ (the comment-indicator colour) to a light shade so the badge stays visible.
783
+ Cell text keeps --hot-fg, now legible on the dark fill. The base @media
784
+ (prefers-color-scheme: dark) block in DynamicTable.css doesn't track the
785
+ class-based theme toggle the app uses, so this `.dark` rule is required. */
786
+ .dark .hot-appearance-v2 .cell-color-gray { --cell-anno-bg: color-mix(in srgb, #9ca3af 25%, var(--background-v2)); --cell-anno-fg: #d1d5db; }
787
+ .dark .hot-appearance-v2 .cell-color-pink { --cell-anno-bg: color-mix(in srgb, #ec4899 25%, var(--background-v2)); --cell-anno-fg: #f9a8d4; }
788
+ .dark .hot-appearance-v2 .cell-color-orange { --cell-anno-bg: color-mix(in srgb, #fb923c 25%, var(--background-v2)); --cell-anno-fg: #fdba74; }
789
+ .dark .hot-appearance-v2 .cell-color-yellow { --cell-anno-bg: color-mix(in srgb, #eab308 25%, var(--background-v2)); --cell-anno-fg: #fde047; }
790
+ .dark .hot-appearance-v2 .cell-color-green { --cell-anno-bg: color-mix(in srgb, #22c55e 25%, var(--background-v2)); --cell-anno-fg: #86efac; }
791
+ .dark .hot-appearance-v2 .cell-color-blue { --cell-anno-bg: color-mix(in srgb, #3b82f6 25%, var(--background-v2)); --cell-anno-fg: #93c5fd; }
792
+ .dark .hot-appearance-v2 .cell-color-purple { --cell-anno-bg: color-mix(in srgb, #a855f7 25%, var(--background-v2)); --cell-anno-fg: #d8b4fe; }
793
+
794
+ /* Annotated (commented) cells keep their color when selected. The pale-blue
795
+ selection fill would otherwise cover the annotation color — and since the
796
+ tint is itself blue, every color reads as "blue / not applied". Re-assert the
797
+ color and show the selection as an inset ring layered over it instead.
798
+ Selectors carry the full container prefix on the row-range variants so they
799
+ beat the base !important selection backgrounds. */
800
+ /* CELL-range / single-cell selection: the fill is UNIFIED — annotated cells show
801
+ the same pale-blue selection fill as the rest (their colour returns on
802
+ deselect) so a mixed-colour range reads as one block, not a patchwork. The
803
+ dotted range outline marks the selection. */
804
+ .hot-appearance-v2 td.hot-cell[data-cell-selected="true"][class*="cell-color-"],
805
+ .hot-appearance-v2 td.hot-cell[data-in-range="true"][class*="cell-color-"] {
806
+ background-color: var(--m3-primary-container) !important;
807
+ }
808
+ /* ROW-level (checkbox / row-range) selection — coloured cells take the SAME
809
+ pale-blue row-selection fill as every other cell, so the whole row reads as one
810
+ uniform highlight (the original row-selection style), not a patchwork of
811
+ annotation colours. The per-cell colour returns on deselect. No inset ring. */
812
+ .hot-appearance-v2 tbody tr[data-row-checked="true"] td.hot-cell[class*="cell-color-"],
813
+ .hot-appearance-v2.hot-container .hot-virtual-container .hot-table td[data-in-row-range="true"][class*="cell-color-"],
814
+ .hot-appearance-v2.hot-container .hot-virtual-container .hot-table tr[data-row-selected="true"] td[class*="cell-color-"] {
815
+ background-color: var(--m3-row-selected) !important;
816
+ box-shadow: none !important;
817
+ /* Square — drop the annotation-pill corner rounding (the `.cell-color-*`
818
+ corner rules don't exclude row selection), which would otherwise notch the
819
+ flat uniform highlight. */
820
+ border-radius: 0 !important;
821
+ }
822
+
823
+ /* Round the outer corners of the selection. The range-edge attributes mark
824
+ each boundary cell; a single selected cell carries all four, so it rounds on
825
+ every corner, while a multi-cell range only rounds its four outer corners. */
826
+ .hot-appearance-v2 td[data-range-top="true"][data-range-left="true"] {
827
+ border-top-left-radius: var(--m3-shape-sm) !important;
828
+ }
829
+ .hot-appearance-v2 td[data-range-top="true"][data-range-right="true"] {
830
+ border-top-right-radius: var(--m3-shape-sm) !important;
831
+ }
832
+ .hot-appearance-v2 td[data-range-bottom="true"][data-range-left="true"] {
833
+ border-bottom-left-radius: var(--m3-shape-sm) !important;
834
+ }
835
+ .hot-appearance-v2 td[data-range-bottom="true"][data-range-right="true"] {
836
+ border-bottom-right-radius: var(--m3-shape-sm) !important;
837
+ }
838
+
839
+ /* Hovered cell — round its corners (6px) so the per-cell hover fill reads as
840
+ the same inset pill as a selected cell. Scoped to `:not([data-row-hover-style])`
841
+ because when ROW hover is enabled the whole row highlights and the row-end
842
+ rules already round it; rounding an interior cell there would carve an odd
843
+ notch out of the row fill. background-clip:padding-box (set on every body
844
+ cell) clips the fill to the radius. */
845
+ .hot-appearance-v2:not([data-row-hover-style]) td.hot-cell:hover {
846
+ border-radius: var(--m3-shape-sm);
847
+ }
848
+
849
+ /* Warning / overdue cell (Figma red-50). A custom cell renderer adds
850
+ `.cell-warning` to flag an overdue amount/date; the `!important` +
851
+ padding-box clip keep it consistent with the inter-row gap. */
852
+ .hot-appearance-v2 td.hot-cell.cell-warning {
853
+ background-color: var(--m3-error-container) !important;
854
+ background-clip: padding-box !important;
855
+ }
856
+
857
+ /* Cell edit mode (v2) — the base editor draws a square, navy 2px inset border
858
+ (--hot-selection-color → --primary-v2). Re-skin it to a rounded, BLUE
859
+ (--selection-v2 #3B82F6) input that echoes the hover/row-pill rounding. The
860
+ editing cell drops its overflow:hidden (via :has) so the rounded corners
861
+ aren't clipped square by the cell box. */
862
+ .hot-appearance-v2 .hot-cell:has(> .hot-cell-editor),
863
+ .hot-appearance-v2 .hot-cell:has(> .hot-boolean-editor-wrapper) {
864
+ overflow: visible;
865
+ }
866
+ .hot-appearance-v2 .hot-cell-editor,
867
+ .hot-appearance-v2 .hot-boolean-editor-wrapper {
868
+ /* `sm` — the density floor's ceiling — so the editor pill matches the row
869
+ pill and the hovered-cell pill exactly. */
870
+ border-radius: var(--m3-shape-sm);
871
+ background: var(--background-v2);
872
+ /* Focus is TEAL and INSET. Teal because tokens.v2.css defines it as the
873
+ interaction-affirmative colour and every primitives-v2 control focuses
874
+ teal; inset because an outward halo on a grid cell is clipped by its
875
+ neighbours. Outward halos are only for controls with clearance. */
876
+ box-shadow: var(--m3-focus-ring-inset);
877
+ }
878
+ /* The text editor is a <textarea> that, in the base, fills the whole cell
879
+ (top/left:0, width/height:100%, padding:8px 12px). Figma Frame 142 draws it
880
+ as an inset white pill so the pale-blue new-row fill reads as a gap around
881
+ it. Inset 4px top/bottom + 6px sides, drop the vertical padding, and set the
882
+ line-height to the full inset height (md row 44px → 40px cell → 32px editor)
883
+ so the single line's line-box fills the box and the glyph stays vertically
884
+ centered. */
885
+ .hot-appearance-v2 textarea.hot-cell-editor {
886
+ top: 4px;
887
+ left: 6px;
888
+ width: calc(100% - 12px);
889
+ height: calc(100% - 8px);
890
+ padding: 0 14px;
891
+ line-height: 32px;
892
+ }
893
+
894
+ /* ── Default (tight 32px) density — fit the editable controls to the short row ──
895
+ The select pill and cell editor above are dimensioned for the md (44px) row
896
+ (the editor's line-height:32px = "md row 44px → 40px cell → 32px editor"). A
897
+ table that doesn't set `density` renders 32px rows (a 24px content box), so
898
+ those controls overflow and stretch the row (default-state targets/finance
899
+ grids). Compact them to the 32px row: a ~22px select pill and a 24px editor
900
+ line-box both center cleanly in the 24px content. Scoped to `:not([data-density])`
901
+ so the sm/md tables (which set the attribute) keep their Figma sizing. */
902
+ .hot-appearance-v2:not([data-density]) .hot-cell.cell-select > .cell-content {
903
+ padding-top: 2px;
904
+ padding-bottom: 2px;
905
+ line-height: 16px;
906
+ }
907
+ .hot-appearance-v2:not([data-density]) textarea.hot-cell-editor {
908
+ line-height: 24px;
909
+ }
910
+
911
+ /* Annotated / commented cell (`.cell-color-*`) — the base CSS paints a flat,
912
+ square, full-bleed fill. Round its corners and clip to the padding box so it
913
+ reads as an inset pill matching the selection treatment. The radius applies
914
+ on all four corners; first/last columns keep the larger 8px row radius on
915
+ their outer edge via the row-end rules below. */
916
+ .hot-appearance-v2 td.hot-cell[class*="cell-color-"] {
917
+ background-clip: padding-box !important;
918
+ /* Make the annotation fill authoritative. `!important` beats the (non-
919
+ important but higher-specificity) zebra-stripe and per-cell hover rules,
920
+ which would otherwise paint over the color on striped tables (e.g. the
921
+ even-row stripe on Transports / Contractors showed the stripe, not the
922
+ color — it only "worked" on the non-striped Offers table). Selected cells
923
+ re-assert the same `--cell-anno-bg` at higher specificity and add the ring. */
924
+ background-color: var(--cell-anno-bg) !important;
925
+ }
926
+ /* Coloured cells default to SQUARE; a corner rounds (6px) ONLY when it is an
927
+ OUTER corner of the same-colour block — i.e. there is NO same-colour neighbour
928
+ in EITHER direction that forms that corner. `data-cb-{above,below,left,right}`
929
+ are set by a post-render scan in DynamicTable (CSS can't see vertical adjacency
930
+ across <tr>s, so all four edges go through the same scan for consistency).
931
+ This mirrors the selection's range-edge corner rules. Skipped while selected —
932
+ there the selection's range-edge rules (!important, below) own the rounding. */
933
+ .hot-appearance-v2 td.hot-cell[class*="cell-color-"] {
934
+ border-radius: 0;
935
+ }
936
+ .hot-appearance-v2 td.hot-cell[class*="cell-color-"]:not([data-cb-above="true"]):not([data-cb-left="true"]):not([data-in-range="true"]):not([data-cell-selected="true"]) {
937
+ border-top-left-radius: var(--m3-shape-sm);
938
+ }
939
+ .hot-appearance-v2 td.hot-cell[class*="cell-color-"]:not([data-cb-above="true"]):not([data-cb-right="true"]):not([data-in-range="true"]):not([data-cell-selected="true"]) {
940
+ border-top-right-radius: var(--m3-shape-sm);
941
+ }
942
+ .hot-appearance-v2 td.hot-cell[class*="cell-color-"]:not([data-cb-below="true"]):not([data-cb-left="true"]):not([data-in-range="true"]):not([data-cell-selected="true"]) {
943
+ border-bottom-left-radius: var(--m3-shape-sm);
944
+ }
945
+ .hot-appearance-v2 td.hot-cell[class*="cell-color-"]:not([data-cb-below="true"]):not([data-cb-right="true"]):not([data-in-range="true"]):not([data-cell-selected="true"]) {
946
+ border-bottom-right-radius: var(--m3-shape-sm);
947
+ }
948
+ /* Paint the 2px transparent inter-row border with the colour when the same colour
949
+ sits directly above/below, so a vertical run reads as one continuous block. */
950
+ .hot-appearance-v2 td.hot-cell[class*="cell-color-"][data-cb-above="true"] {
951
+ border-top-color: var(--cell-anno-bg);
952
+ }
953
+ .hot-appearance-v2 td.hot-cell[class*="cell-color-"][data-cb-below="true"] {
954
+ border-bottom-color: var(--cell-anno-bg);
955
+ }
956
+
957
+ /* Comment indicator (the speech-bubble badge on commented cells). Its color
958
+ tracks the cell's annotation color — a darker shade of the same hue
959
+ (`--cell-anno-fg`, inherited from the `.cell-color-*` cell). Cells with a
960
+ comment but NO color fall back to the normal text/foreground color. */
961
+ .hot-appearance-v2 .cell-comment-indicator {
962
+ color: var(--cell-anno-fg, var(--m3-on-surface));
963
+ /* An icon button, so: a circle. */
964
+ border-radius: var(--m3-shape-full);
965
+ padding: 1px;
966
+ transition: var(--m3-transition-state);
967
+ }
968
+ /* A commented cell's indicator has to READ as a button, not as decoration —
969
+ half of workshop B9 is that people did not realise the existing icon was
970
+ clickable. Hover gives it a hit area and a background, like every other
971
+ affordance in the grid chrome. */
972
+ .hot-appearance-v2 .cell-comment-indicator:hover {
973
+ background-color: var(--m3-state-layer-hover);
974
+ }
975
+
976
+ /* B9 — the ghost affordance on the focused cell. Muted enough to be ignorable
977
+ while typing, solid enough to invite a click; it inherits every geometric
978
+ property of the real indicator above, so discovering it teaches the real one. */
979
+ /* Muted by INK, not by opacity: `on-surface-variant` is the role for a
980
+ secondary affordance, and it keeps its contrast in both themes where a 55%
981
+ wash simply dissolved against the dark well. */
982
+ .hot-appearance-v2 .cell-comment-indicator-ghost {
983
+ color: var(--m3-on-surface-variant);
984
+ }
985
+ .hot-appearance-v2 .cell-comment-indicator-ghost:hover {
986
+ color: var(--m3-on-surface);
987
+ background-color: var(--m3-state-layer-hover);
988
+ }
989
+ /* Reserve the same right-hand gutter the solid indicator gets, so the value
990
+ does not jump sideways when a cell is selected.
991
+ NOT for the hover variant: reserving on hover would re-ellipsize the value
992
+ under the pointer, so dragging the mouse across a row would make every cell's
993
+ text twitch in turn. */
994
+ .hot-appearance-v2.hot-container .hot-table td.hot-cell:has(> .cell-comment-indicator-ghost:not(.cell-comment-indicator-hover)) {
995
+ padding-right: 28px;
996
+ }
997
+ /* The hover affordance (ledger 8.1). Sits on its own chip so it stays legible
998
+ over the tail of a long value without moving it. */
999
+ /* Opaque on purpose — this chip sits over the tail of a long value, so a
1000
+ translucent state layer would let the text show through it. */
1001
+ .hot-appearance-v2 .cell-comment-indicator-hover {
1002
+ background-color: var(--m3-surface-container);
1003
+ box-shadow: 0 0 0 3px var(--m3-surface-container);
1004
+ }
1005
+ /* The indicator is absolutely positioned at the cell's right edge (right:10px),
1006
+ so a cell's text would otherwise run UNDER it (ellipsing only at the cell
1007
+ edge). Reserve room via the cell's own padding-right so the content box ends
1008
+ before the icon — this works for BOTH the wrapped `.cell-content` text and
1009
+ custom renderers (which render their own `.truncate` span, not .cell-content).
1010
+ 28px ≈ the indicator's 10px offset + the 15px icon + a small gap. The full
1011
+ container prefix out-specifies the base 8px cell padding-right. */
1012
+ .hot-appearance-v2.hot-container .hot-table td.hot-cell[data-has-comment="true"] {
1013
+ padding-right: 28px;
1014
+ }
1015
+ /* Text content truncates with an ellipsis when it exceeds the cell width.
1016
+ Needed because custom renderers emit their own span with
1017
+ `white-space:nowrap; overflow:visible`, so the cell's `overflow:hidden` would
1018
+ HARD-clip the text at the edge with no ellipsis (and, on commented cells, run
1019
+ it under the icon — the padding-right above reserves that space).
1020
+ `min-width:0` lets the flex child shrink so the ellipsis can render.
1021
+ BADGES are excluded: they must never be cut — their column is widened to fit
1022
+ the longest badge instead (see Cell.tsx badge-column auto-fit). The comment
1023
+ indicator is excluded (absolutely positioned, fixed size). */
1024
+ .hot-appearance-v2 td.hot-cell > *:not(.cell-comment-indicator):not(.cell-badge) {
1025
+ overflow: hidden;
1026
+ text-overflow: ellipsis;
1027
+ white-space: nowrap;
1028
+ min-width: 0;
1029
+ }
1030
+
1031
+ /* ══════════════════════════════════════════════════════════════════
1032
+ Portaled popovers / Configure-View drawer — phase 4
1033
+
1034
+ Popovers render via createPortal to <body>, outside this container.
1035
+ AppearanceContext lets each portaled root re-apply .hot-appearance-v2,
1036
+ so the --hot-* → -v2 remap above reaches them and they re-skin for free
1037
+ (they already read --hot-popup-bg / --hot-border / --hot-btn-* / etc.).
1038
+ These rules only fix the few values the popover CSS hardcodes.
1039
+ ════════════════════════════════════════════════════════════════ */
1040
+
1041
+ /* Configure-View drawer → Figma width (400) + Geist + solid surface.
1042
+ The Sheet primitive paints `bg-card`, which doesn't resolve solid inside
1043
+ the portal/v2 scope (drawer reads transparent), so set it explicitly. */
1044
+ .hot-config-panel.hot-appearance-v2 {
1045
+ /* 400px (Figma) crowded the field/operator/value selects, clipped longer
1046
+ column names in "Hide fields", and wrapped the date-range triggers onto two
1047
+ lines; 600px gives the filter row controls room to breathe on one line. */
1048
+ max-width: 600px !important;
1049
+ background: var(--surface-v2);
1050
+ font-family: var(--font-sans, ui-sans-serif, system-ui, sans-serif);
1051
+ /* An M3 side sheet: `xl` on the free (left) edge only — the docked edge stays
1052
+ square — and level 3, the elevation for a sheet over content. `overflow:
1053
+ hidden` is what clips the header and footer bands to that corner; the body
1054
+ keeps its own scroll. */
1055
+ border-radius: var(--m3-shape-xl) 0 0 var(--m3-shape-xl);
1056
+ box-shadow: var(--m3-elevation-3);
1057
+ overflow: hidden;
1058
+ }
1059
+
1060
+ /* Keep the date-range triggers ("15 cze 2026") on a single line. The filter row
1061
+ is flex and each trigger is `flex:1`; without a floor the localized date text
1062
+ wraps to two lines. nowrap + a min-width that fits "DD mmm YYYY" prevents it —
1063
+ the 600px drawer above leaves ample room for both triggers side by side. */
1064
+ .hot-config-panel.hot-appearance-v2 .hot-config-filter-date-trigger {
1065
+ white-space: nowrap;
1066
+ min-width: 96px;
1067
+ }
1068
+
1069
+ /* Checked boxes + "Add condition/sort" links use teal accent (Figma),
1070
+ not the indigo the base CSS hardcodes / derives from selection color. */
1071
+ .hot-appearance-v2 .hot-config-fields-checkbox { accent-color: var(--m3-focus-ring-color); }
1072
+ .hot-appearance-v2 .hot-config-add-btn { color: var(--accent-v2); }
1073
+
1074
+ /* ── ConfigureView v2 skin — Figma "Configure View" drawer ────────── */
1075
+ /* Section cards: spaced, rounded, bordered. `flex-shrink: 0` so an expanded
1076
+ section's content doesn't squish the sibling cards into slivers — the body
1077
+ (a flex column) scrolls instead. */
1078
+ .hot-config-panel.hot-appearance-v2 .hot-config-section {
1079
+ flex-shrink: 0;
1080
+ border: 1px solid var(--m3-outline-variant);
1081
+ border-radius: var(--m3-shape-lg);
1082
+ background: var(--background-v2);
1083
+ margin-bottom: 4px;
1084
+ overflow: hidden;
1085
+ }
1086
+ .hot-config-panel.hot-appearance-v2 .hot-config-section-header {
1087
+ padding: 12px 14px;
1088
+ gap: 10px;
1089
+ color: var(--m3-on-surface);
1090
+ font-size: var(--text-label-semibold-md, 0.875rem);
1091
+ line-height: var(--text-label-semibold-md--line-height, 1.25rem);
1092
+ font-weight: var(--text-label-semibold-md--font-weight, 600);
1093
+ }
1094
+ .hot-config-panel.hot-appearance-v2 .hot-config-section-badge {
1095
+ color: var(--m3-on-surface-variant);
1096
+ font-weight: 400;
1097
+ }
1098
+ .hot-config-panel.hot-appearance-v2 .hot-config-section-chevron { color: var(--m3-on-surface-variant); }
1099
+ .hot-config-panel.hot-appearance-v2 .hot-config-fields-grip { color: var(--m3-on-surface-variant); }
1100
+ .hot-config-panel.hot-appearance-v2 .hot-config-fields-bulk-btn { color: var(--accent-v2); }
1101
+ /* Drop the nested 400px scroll box on the field list — the drawer body is the
1102
+ single scroll container in v2, so the section grows to fit its fields. */
1103
+ .hot-config-panel.hot-appearance-v2 .hot-config-fields-list {
1104
+ max-height: none;
1105
+ overflow: visible;
1106
+ }
1107
+
1108
+ /* Sort rank badge (1/2/3). */
1109
+ .hot-config-panel.hot-appearance-v2 .hot-config-sort-index {
1110
+ display: inline-flex;
1111
+ align-items: center;
1112
+ justify-content: center;
1113
+ width: 24px;
1114
+ height: 24px;
1115
+ border-radius: var(--m3-shape-full);
1116
+ background-color: var(--m3-surface-container);
1117
+ border: 1px solid var(--m3-outline-variant);
1118
+ color: var(--m3-on-surface-variant);
1119
+ font-size: var(--text-label-semibold-xs, 0.75rem);
1120
+ line-height: var(--text-label-semibold-xs--line-height, 1rem);
1121
+ font-weight: var(--text-label-semibold-xs--font-weight, 600);
1122
+ }
1123
+ .hot-config-panel.hot-appearance-v2 .hot-config-sort-select,
1124
+ .hot-config-panel.hot-appearance-v2 .hot-config-sort-direction-select {
1125
+ border: 1px solid var(--m3-outline-variant);
1126
+ border-radius: var(--m3-shape-md);
1127
+ background: var(--background-v2);
1128
+ color: var(--m3-on-surface);
1129
+ transition: var(--m3-transition-state);
1130
+ }
1131
+
1132
+ /* Linked (lookup) columns → "Linked sources" multiselect (trigger + chips;
1133
+ the option menu is a portaled Popover styled with global tokens). */
1134
+ .hot-config-panel.hot-appearance-v2 .hot-config-linked {
1135
+ display: flex;
1136
+ flex-direction: column;
1137
+ gap: 10px;
1138
+ /* Match the sibling section content inset (.hot-config-sorting). */
1139
+ padding: 8px 14px 12px;
1140
+ }
1141
+ .hot-config-panel.hot-appearance-v2 .hot-config-linked-hint {
1142
+ color: var(--m3-on-surface-variant);
1143
+ font-size: var(--text-body-regular-sm, 0.875rem);
1144
+ line-height: var(--text-body-regular-sm--line-height, 1.25rem);
1145
+ }
1146
+ .hot-config-panel.hot-appearance-v2 .hot-config-empty-hint {
1147
+ color: var(--m3-on-surface-variant);
1148
+ font-size: var(--text-body-regular-sm, 0.875rem);
1149
+ padding: 4px 0;
1150
+ }
1151
+ .hot-config-panel.hot-appearance-v2 .hot-config-linked-ms-trigger {
1152
+ display: flex;
1153
+ align-items: center;
1154
+ gap: 8px;
1155
+ width: 100%;
1156
+ min-height: 40px;
1157
+ padding: 6px 10px;
1158
+ border: 1px solid var(--m3-outline-variant);
1159
+ border-radius: var(--m3-shape-md);
1160
+ background: var(--background-v2);
1161
+ cursor: pointer;
1162
+ text-align: left;
1163
+ transition: var(--m3-transition-state);
1164
+ }
1165
+ .hot-config-panel.hot-appearance-v2 .hot-config-linked-ms-trigger:hover {
1166
+ border-color: var(--m3-outline);
1167
+ background-color: var(--m3-state-layer-hover);
1168
+ }
1169
+ .hot-config-panel.hot-appearance-v2 .hot-config-linked-ms-placeholder {
1170
+ flex: 1;
1171
+ color: var(--m3-on-surface-variant);
1172
+ font-size: var(--text-body-regular-sm, 0.875rem);
1173
+ }
1174
+ .hot-config-panel.hot-appearance-v2 .hot-config-linked-ms-chevron {
1175
+ flex-shrink: 0;
1176
+ color: var(--m3-on-surface-variant);
1177
+ }
1178
+ .hot-config-panel.hot-appearance-v2 .hot-config-linked-ms-chips {
1179
+ display: flex;
1180
+ flex-wrap: wrap;
1181
+ gap: 6px;
1182
+ }
1183
+ .hot-config-panel.hot-appearance-v2 .hot-config-linked-ms-chip {
1184
+ display: inline-flex;
1185
+ align-items: center;
1186
+ gap: 4px;
1187
+ padding: 3px 4px 3px 10px;
1188
+ border: 1px solid var(--m3-outline-variant);
1189
+ border-radius: var(--m3-shape-full);
1190
+ background-color: var(--m3-surface-container);
1191
+ color: var(--m3-on-surface);
1192
+ font-size: var(--text-label-semibold-xs, 0.75rem);
1193
+ line-height: var(--text-label-semibold-xs--line-height, 1rem);
1194
+ font-weight: var(--text-label-semibold-xs--font-weight, 600);
1195
+ }
1196
+ .hot-config-panel.hot-appearance-v2 .hot-config-linked-ms-chip-x {
1197
+ display: inline-flex;
1198
+ align-items: center;
1199
+ justify-content: center;
1200
+ width: 18px;
1201
+ height: 18px;
1202
+ border-radius: var(--m3-shape-full);
1203
+ color: var(--m3-on-surface-variant);
1204
+ cursor: pointer;
1205
+ transition: var(--m3-transition-state);
1206
+ }
1207
+ .hot-config-panel.hot-appearance-v2 .hot-config-linked-ms-chip-x:hover {
1208
+ color: var(--m3-on-surface);
1209
+ background-color: var(--m3-state-layer-hover);
1210
+ }
1211
+
1212
+ /* View-name + colour form. */
1213
+ .hot-config-panel.hot-appearance-v2 .hot-config-save-label {
1214
+ color: var(--m3-on-surface);
1215
+ font-size: var(--text-label-semibold-md, 0.875rem);
1216
+ line-height: var(--text-label-semibold-md--line-height, 1.25rem);
1217
+ font-weight: var(--text-label-semibold-md--font-weight, 600);
1218
+ }
1219
+ .hot-config-panel.hot-appearance-v2 .hot-config-save-colors { gap: 10px; }
1220
+ /* Explains what an empty name does on the base tab — the answer to "where did
1221
+ my Default-view changes go?". Sits between the input and the colour row, so
1222
+ it takes the same 4px stack gap as the labels around it. */
1223
+ .hot-config-panel.hot-appearance-v2 .hot-config-save-hint {
1224
+ margin: 2px 0 2px;
1225
+ font-size: var(--text-body-regular-xs, 0.75rem);
1226
+ line-height: var(--text-body-regular-xs--line-height, 1rem);
1227
+ color: var(--m3-on-surface-variant);
1228
+ }
1229
+ /* The 120-character cap has bitten. Same slot and rhythm as the base-view hint
1230
+ above; only the colour changes, because this one is a refusal, not a note. */
1231
+ .hot-config-panel.hot-appearance-v2 .hot-config-save-hint-limit {
1232
+ color: var(--m3-error);
1233
+ }
1234
+ .hot-config-panel.hot-appearance-v2 .hot-config-save-color-btn {
1235
+ width: 28px;
1236
+ height: 28px;
1237
+ border-radius: var(--m3-shape-full); /* circles (Figma) */
1238
+ border: 2px solid transparent;
1239
+ cursor: pointer;
1240
+ transition: var(--m3-transition-elevation);
1241
+ }
1242
+ /* The selected swatch takes the same two-step ring shape as an M3 focus ring,
1243
+ spaced off the drawer surface so it reads on any hue. */
1244
+ .hot-config-panel.hot-appearance-v2 .hot-config-save-color-btn.selected {
1245
+ box-shadow: 0 0 0 2px var(--surface-v2), 0 0 0 4px var(--m3-accent);
1246
+ }
1247
+ /* Saturated swatch hues (Figma view-name palette) — override the inline
1248
+ pastel `background` set in COLOR_PALETTE for the v2 picker only. */
1249
+ .hot-config-panel.hot-appearance-v2 .hot-config-color-blue { background: var(--m3-view-color-blue) !important; }
1250
+ .hot-config-panel.hot-appearance-v2 .hot-config-color-green { background: var(--m3-view-color-green) !important; }
1251
+ .hot-config-panel.hot-appearance-v2 .hot-config-color-teal { background: var(--m3-view-color-teal) !important; }
1252
+ .hot-config-panel.hot-appearance-v2 .hot-config-color-purple { background: var(--m3-view-color-purple) !important; }
1253
+ .hot-config-panel.hot-appearance-v2 .hot-config-color-pink { background: var(--m3-view-color-pink) !important; }
1254
+ .hot-config-panel.hot-appearance-v2 .hot-config-color-red { background: var(--m3-view-color-red) !important; }
1255
+ .hot-config-panel.hot-appearance-v2 .hot-config-color-orange { background: var(--m3-view-color-orange) !important; }
1256
+ .hot-config-panel.hot-appearance-v2 .hot-config-color-yellow { background: var(--m3-view-color-yellow) !important; }
1257
+
1258
+ /* Footer: full-width buttons side by side (the Button primitives carry their
1259
+ own navy/outline skin). */
1260
+ .hot-config-panel.hot-appearance-v2 .hot-config-panel-footer {
1261
+ display: flex;
1262
+ gap: 12px;
1263
+ }
1264
+
1265
+ /* Save form + footer surface. The base CSS hardcodes a light gray
1266
+ (rgb(243,243,245)) on the save section and the adjacent footer, and the
1267
+ name input uses the legacy --hot-bg (#fff) — all stayed light inside the v2
1268
+ drawer in dark mode. Re-point them at v2 tokens so the footer matches the
1269
+ drawer surface in both themes. */
1270
+ .hot-config-panel.hot-appearance-v2 .hot-config-panel-save,
1271
+ .hot-config-panel.hot-appearance-v2 .hot-config-panel-save + .hot-config-panel-footer {
1272
+ background: var(--surface-v2);
1273
+ border-top-color: var(--m3-outline-variant);
1274
+ }
1275
+ .hot-config-panel.hot-appearance-v2 .hot-config-save-input {
1276
+ background: var(--background-v2);
1277
+ border-color: var(--m3-outline-variant);
1278
+ border-radius: var(--m3-shape-md);
1279
+ color: var(--m3-on-surface);
1280
+ transition: var(--m3-transition-state), box-shadow var(--m3-duration-short2) var(--m3-ease-standard);
1281
+ }
1282
+ /* This field HAS clearance, so it gets the outward teal halo the grid cells
1283
+ cannot have. */
1284
+ .hot-config-panel.hot-appearance-v2 .hot-config-save-input:focus {
1285
+ border-color: var(--m3-focus-ring-color);
1286
+ box-shadow: var(--m3-focus-halo);
1287
+ outline: none;
1288
+ }
1289
+
1290
+ /* ══════════════════════════════════════════════════════════════════
1291
+ Rows (v2) — borderless. The base `.hot-container .hot-table td` paints a
1292
+ 1px grid (border-bottom + border-right, plus a left edge on the first
1293
+ cell). Figma shows no row separators at all — rows are delimited by
1294
+ whitespace + hover/selection only. Strip every body-cell border here
1295
+ (higher specificity than the base `.hot-container` rule wins).
1296
+ ════════════════════════════════════════════════════════════════ */
1297
+ .hot-appearance-v2.hot-container .hot-table td,
1298
+ .hot-appearance-v2.hot-container .hot-table td.hot-cell,
1299
+ .hot-appearance-v2.hot-container .hot-table td:first-child {
1300
+ border: none;
1301
+ /* Gap between rows: transparent top/bottom borders inset the cell's
1302
+ background (clipped to padding-box) so adjacent row fills don't touch.
1303
+ Combined with the rounded ends, every stripe/selected row reads as a
1304
+ separate rounded pill. 2px each = 4px gap (Figma 220:2935). */
1305
+ border-top: 2px solid transparent;
1306
+ border-bottom: 2px solid transparent;
1307
+ background-clip: padding-box;
1308
+ }
1309
+
1310
+ /* Tight cell padding (Figma 220:2935 — body cell 4×8 inside a 32px row). */
1311
+ .hot-appearance-v2.hot-container .hot-table td.hot-cell {
1312
+ padding-top: 4px;
1313
+ padding-bottom: 4px;
1314
+ padding-left: 8px;
1315
+ padding-right: 8px;
1316
+ }
1317
+
1318
+ /* Authoritative padding-box clip for EVERY v2 body cell. Many base rules paint
1319
+ with the `background` shorthand + `!important` (cell hover, new-row hover,
1320
+ range selection), which resets `background-clip` to border-box and makes the
1321
+ fill overhang the row gap. The selector is DELIBERATELY high specificity
1322
+ (0,4,3) so it outranks the worst offender — the new-row hover rule
1323
+ `tr[data-is-new] td:hover:not():not()` (0,4,2) — and the gap always holds
1324
+ (rest, hover, new-row, selected). */
1325
+ .hot-appearance-v2 .hot-virtual-container .hot-table tbody tr td.hot-cell,
1326
+ .hot-appearance-v2 .hot-virtual-container .hot-table tbody tr td.hot-row-header {
1327
+ background-clip: padding-box !important;
1328
+ }
1329
+
1330
+ /* ══════════════════════════════════════════════════════════════════
1331
+ Column headers (v2) — gray rounded bar, no outer border, per-column
1332
+ kebab. Figma: the header is a single light-gray pill with rounded ends
1333
+ and NO surrounding border; columns are separated by thin internal
1334
+ dividers only.
1335
+ ════════════════════════════════════════════════════════════════ */
1336
+
1337
+ /* The header is its own <table> inside .hot-headers-sticky, so switching it
1338
+ to separated borders (needed for border-radius to render) doesn't touch
1339
+ the virtualized body table. A small gap below lets the rounding read
1340
+ against the white body. */
1341
+ .hot-appearance-v2 .hot-headers-sticky {
1342
+ /* Solid grid-body bg (not transparent) so body rows scrolling under the sticky
1343
+ header don't peek through the gap below the floating bar. The 2px bottom
1344
+ gap + the first row's 2px transparent top border = 4px, matching the
1345
+ inter-row gap. */
1346
+ background: var(--m3-surface-container-lowest);
1347
+ padding-bottom: 2px;
1348
+ }
1349
+ .hot-appearance-v2 .hot-headers-sticky .hot-table {
1350
+ border-collapse: separate;
1351
+ border-spacing: 0;
1352
+ }
1353
+
1354
+ /* Header cells: gray fill, muted title, thin internal divider, NO outer
1355
+ border (the base paints bottom/right/left hex borders — override them). */
1356
+ .hot-appearance-v2.hot-container .hot-table th.hot-col-header,
1357
+ .hot-appearance-v2.hot-container .hot-table th.hot-row-header {
1358
+ background: var(--table-v2-header-bg);
1359
+ color: var(--table-v2-header-text);
1360
+ font-weight: 500;
1361
+ border: none;
1362
+ border-right: 1px solid var(--table-v2-divider);
1363
+ /* Figma 220:2935 — tight header padding. The <tr> is display:flex so each
1364
+ <th> is a flex child; make the th a flex container too so its inner label
1365
+ wrapper centers vertically (vertical-align doesn't apply to flex items). */
1366
+ display: flex;
1367
+ align-items: center;
1368
+ padding: 6px 8px;
1369
+ }
1370
+ /* The header label wrapper carries a legacy `.hot-col-header>div { padding: 0 4px }`
1371
+ (DynamicTable.css) that the body cells don't have — so header titles sat 4px
1372
+ further in than their column's data (12px vs 8px). Zero it so the header label
1373
+ (and the right-aligned sort/kebab) line up flush with the cell content below. */
1374
+ .hot-appearance-v2.hot-container .hot-table th.hot-col-header > div {
1375
+ padding: 0;
1376
+ }
1377
+ /* Last header cell ends the bar cleanly — no trailing divider. */
1378
+ .hot-appearance-v2.hot-container .hot-table thead tr th:last-child {
1379
+ border-right: none;
1380
+ }
1381
+ /* Rounded ends on the bar (Figma 220:2935 — radius 6). */
1382
+ .hot-appearance-v2.hot-container .hot-table thead tr th:first-child {
1383
+ border-top-left-radius: var(--m3-shape-sm);
1384
+ border-bottom-left-radius: var(--m3-shape-sm);
1385
+ }
1386
+ .hot-appearance-v2.hot-container .hot-table thead tr th:last-child {
1387
+ border-top-right-radius: var(--m3-shape-sm);
1388
+ border-bottom-right-radius: var(--m3-shape-sm);
1389
+ }
1390
+ /* Selection checkbox column (replaces the row number in v2). */
1391
+ .hot-appearance-v2 td.hot-row-header,
1392
+ .hot-appearance-v2 th.hot-row-header {
1393
+ display: flex;
1394
+ align-items: center;
1395
+ justify-content: center;
1396
+ }
1397
+ /* TEAL, not blue. `--m3-focus-ring-color` (`--accent-v2`) is documented in
1398
+ tokens.v2.css as the FMS interaction-affirmative colour — focus rings, CHECKED
1399
+ CHECKBOXES, toggled switches — and it is what the config drawer's field
1400
+ checkbox already uses (L1127). `--m3-accent` (`--selection-v2`, #3B82F6) is the
1401
+ SELECTION colour: the row tint, the sort indicator, the selection edges. The
1402
+ two roles were reading as two different checkbox accents on one screen; the
1403
+ checkbox belongs to the affirmative role, so it follows the drawer. */
1404
+ .hot-appearance-v2 .hot-row-select {
1405
+ width: 16px;
1406
+ height: 16px;
1407
+ margin: 0;
1408
+ accent-color: var(--m3-focus-ring-color);
1409
+ cursor: pointer;
1410
+ }
1411
+ /* The column-header select-all checkbox shares `.hot-row-select` but its flex
1412
+ header cell shrinks it to ~15px. Pin it to the same 13×16 the data-row
1413
+ checkboxes render at so all three match. */
1414
+ .hot-appearance-v2 .hot-row-select-all {
1415
+ flex-shrink: 0;
1416
+ width: 13px;
1417
+ height: 16px;
1418
+ }
1419
+
1420
+ /* Group header row — slate-100 fill (Figma), rounded like data rows, with a
1421
+ group select-all checkbox aligned to the row-header column. The fill lives on
1422
+ the CELLS (not the <tr>) so the shared first/last-cell radius + inter-row gap
1423
+ rules clip the band into a rounded pill matching the data rows. The base layer
1424
+ paints the <tr> grey + a 1px bottom divider — strip both, otherwise the tr's
1425
+ square fill paints over the cells' rounded corners and the divider reads as a
1426
+ full-width block edge. */
1427
+ .hot-appearance-v2 .hot-group-header-row {
1428
+ background: transparent;
1429
+ border-bottom: none;
1430
+ }
1431
+ .hot-appearance-v2 .hot-group-header-row:hover {
1432
+ background: transparent;
1433
+ }
1434
+ .hot-appearance-v2 td.hot-group-header-cell,
1435
+ .hot-appearance-v2 td.hot-group-header-select-cell {
1436
+ height: 100%;
1437
+ background: var(--table-v2-header-bg);
1438
+ background-clip: padding-box;
1439
+ }
1440
+ /* The select cell carries `.hot-row-header`, which the generic rule paints
1441
+ white — re-assert the band fill at higher specificity so the checkbox column
1442
+ matches the rest of the group header. */
1443
+ .hot-appearance-v2.hot-container td.hot-group-header-select-cell {
1444
+ background: var(--table-v2-header-bg);
1445
+ }
1446
+ /* The zero-width sticky label cell stays transparent — its label overflows onto
1447
+ the band-fill cell, which already carries the slate fill. Painting it would
1448
+ add a 0-width sliver and (when it's :first-child) a stray rounded corner. */
1449
+ .hot-appearance-v2 td.hot-group-header-label-cell {
1450
+ background: transparent;
1451
+ }
1452
+ /* When there's no group select checkbox, the zero-width label cell is the row's
1453
+ :first-child and absorbs the left pill radius (invisibly, since it has no
1454
+ width). Round the band-fill cell's left edge instead so the band keeps its
1455
+ rounded-pill shape. It's the 2nd and last child in that case. */
1456
+ .hot-appearance-v2 .hot-virtual-container tbody tr.hot-group-header-row
1457
+ > td.hot-group-header-cell:nth-child(2):last-child {
1458
+ border-top-left-radius: var(--m3-shape-sm);
1459
+ border-bottom-left-radius: var(--m3-shape-sm);
1460
+ }
1461
+
1462
+ /* Group summary (subtotal) row (v2) — reads as a totals strip: white fill with a
1463
+ 1px top rule separating it from the group's data rows, bolder right-aligned
1464
+ values. Fills live on the cells (the base paints the <tr> grey) so the row
1465
+ sits flush with the column grid. */
1466
+ .hot-appearance-v2 .hot-group-summary-row {
1467
+ background: transparent;
1468
+ border-top: none;
1469
+ }
1470
+ .hot-appearance-v2 td.hot-group-summary-cell,
1471
+ .hot-appearance-v2 td.hot-group-summary-rowheader,
1472
+ .hot-appearance-v2 td.hot-group-summary-actions {
1473
+ background: var(--m3-surface-container-lowest);
1474
+ border-top: 1px solid var(--m3-outline-variant);
1475
+ background-clip: padding-box;
1476
+ }
1477
+ .hot-appearance-v2 .hot-group-summary-label-cell {
1478
+ background: transparent;
1479
+ }
1480
+ .hot-appearance-v2 .hot-group-summary-label {
1481
+ color: var(--m3-on-surface-variant);
1482
+ }
1483
+ .hot-appearance-v2 .hot-group-summary-value {
1484
+ color: var(--m3-on-surface);
1485
+ }
1486
+ /* Read-only subtotal row: keep cells at their band fill on hover (no cell-hover
1487
+ tint that would read as an interactive box). */
1488
+ .hot-appearance-v2 .hot-group-summary-row .hot-cell:hover:not([data-save-state]) {
1489
+ background: var(--m3-surface-container-lowest);
1490
+ }
1491
+
1492
+ /* New (add) row — keep the pale-blue fill inset to the row gap (the base
1493
+ paints `background:!important` which would otherwise overhang). */
1494
+ .hot-appearance-v2 tr[data-is-new="true"] td {
1495
+ background-clip: padding-box !important;
1496
+ }
1497
+
1498
+ /* New-row cancel button (row-header ✕) — bare red glyph, no box (Figma Frame
1499
+ 142). Compact square hit-area centered in the cell; the hover tint gives a
1500
+ subtle target without reintroducing the filled navy pill. */
1501
+ .hot-appearance-v2 .hot-row-cancel-btn-header {
1502
+ width: 12px;
1503
+ height: 12px;
1504
+ padding: 0;
1505
+ margin: 0 auto;
1506
+ background-color: transparent;
1507
+ color: var(--m3-error);
1508
+ border-radius: var(--m3-shape-full);
1509
+ font-size: var(--text-body-regular-xs, 0.75rem);
1510
+ line-height: 1;
1511
+ transition: var(--m3-transition-state);
1512
+ }
1513
+ .hot-appearance-v2 .hot-row-cancel-btn-header:hover {
1514
+ background-color: var(--m3-state-layer-error-hover);
1515
+ color: var(--m3-error);
1516
+ }
1517
+
1518
+ /* Save button (new-row actions) → compact v2 navy pill (not full-bleed),
1519
+ centered in the actions cell. */
1520
+ .hot-appearance-v2 .hot-row-save-btn {
1521
+ width: auto;
1522
+ height: 24px;
1523
+ min-height: 0;
1524
+ padding: 0 12px;
1525
+ border-radius: var(--m3-shape-full);
1526
+ font-size: var(--text-label-semibold-xs, 0.75rem);
1527
+ line-height: var(--text-label-semibold-xs--line-height, 1rem);
1528
+ font-weight: var(--text-label-semibold-xs--font-weight, 600);
1529
+ }
1530
+ .hot-appearance-v2 .hot-row-save-btn:hover {
1531
+ transform: none;
1532
+ }
1533
+ .hot-appearance-v2 .hot-row-save-btn:active {
1534
+ background: var(--primary-v2-hover);
1535
+ transform: none;
1536
+ }
1537
+
1538
+ /* Actions column kebab (•••) — opens the row actions menu. */
1539
+ .hot-appearance-v2 td.hot-actions-cell {
1540
+ justify-content: center;
1541
+ }
1542
+ .hot-appearance-v2 .hot-row-actions-btn {
1543
+ display: inline-flex;
1544
+ align-items: center;
1545
+ justify-content: center;
1546
+ width: 28px;
1547
+ height: 28px;
1548
+ padding: 0;
1549
+ border: none;
1550
+ /* An icon button is a circle in M3. 28×28 is unchanged — only the corner. */
1551
+ border-radius: var(--m3-shape-full);
1552
+ background-color: transparent;
1553
+ color: var(--m3-on-surface-variant);
1554
+ cursor: pointer;
1555
+ transition: var(--m3-transition-state);
1556
+ }
1557
+ .hot-appearance-v2 .hot-row-actions-btn:hover {
1558
+ background-color: var(--m3-state-layer-hover);
1559
+ color: var(--m3-on-surface);
1560
+ }
1561
+ .hot-appearance-v2 .hot-row-actions-btn:active {
1562
+ background-color: var(--m3-state-layer-pressed);
1563
+ }
1564
+ /* Body row-header (checkbox) cells follow the row background, not the grey
1565
+ header bar — the zebra stripe further down overrides it to match darker rows.
1566
+ `surface-container-lowest` rather than `--background-v2`: they resolve to the
1567
+ same white in light, but in DARK `--background-v2` is slate-900 while the grid
1568
+ body is the recessed #040A11 well, so the checkbox column used to sit a full
1569
+ step lighter than the row it belongs to. */
1570
+ .hot-appearance-v2 td.hot-row-header {
1571
+ background: var(--m3-surface-container-lowest);
1572
+ }
1573
+
1574
+ /* Rounded row ends — match the header bar. The body table needs separated
1575
+ borders for the radius to render; rounding the first/last cell clips the
1576
+ row background (stripe / hover / selection) into a rounded rectangle. */
1577
+ .hot-appearance-v2 .hot-virtual-container .hot-table {
1578
+ border-collapse: separate;
1579
+ border-spacing: 0;
1580
+ }
1581
+ .hot-appearance-v2 .hot-virtual-container tbody tr > td:first-child {
1582
+ border-top-left-radius: var(--m3-shape-sm);
1583
+ border-bottom-left-radius: var(--m3-shape-sm);
1584
+ }
1585
+ .hot-appearance-v2 .hot-virtual-container tbody tr > td:last-child {
1586
+ border-top-right-radius: var(--m3-shape-sm);
1587
+ border-bottom-right-radius: var(--m3-shape-sm);
1588
+ }
1589
+
1590
+ /* ══════════════════════════════════════════════════════════════════
1591
+ A16 — drag a header to reorder the column.
1592
+ The drop indicator is a 2px accent rule painted on the LEADING edge of the
1593
+ column the source would land before, drawn as an ::after so it overlays the
1594
+ header's own 1px border instead of shifting layout. `data-drop-*` is written
1595
+ from an INDEX (see ColumnHeaders): a column scrolled out of the
1596
+ virtualization window simply never paints one, and nothing drifts.
1597
+ ════════════════════════════════════════════════════════════════ */
1598
+ .hot-appearance-v2 .hot-col-header[data-reorderable] {
1599
+ cursor: grab;
1600
+ }
1601
+ .hot-appearance-v2 .hot-headers-sticky[data-reordering] .hot-col-header[data-reorderable] {
1602
+ cursor: grabbing;
1603
+ }
1604
+ .hot-appearance-v2 .hot-col-header[data-reorder-source] {
1605
+ opacity: 0.45;
1606
+ }
1607
+ .hot-appearance-v2 .hot-col-header[data-drop-before]::after,
1608
+ .hot-appearance-v2 .hot-col-header[data-drop-after]::after {
1609
+ content: '';
1610
+ position: absolute;
1611
+ top: 2px;
1612
+ bottom: 2px;
1613
+ width: 2px;
1614
+ border-radius: var(--m3-shape-full);
1615
+ background: var(--m3-accent);
1616
+ z-index: 6;
1617
+ pointer-events: none;
1618
+ }
1619
+ .hot-appearance-v2 .hot-col-header[data-drop-before]::after {
1620
+ left: -1px;
1621
+ }
1622
+ .hot-appearance-v2 .hot-col-header[data-drop-after]::after {
1623
+ right: -1px;
1624
+ }
1625
+
1626
+ /* Per-column options trigger (⋮) — always visible, muted; darkens on hover. */
1627
+ .hot-appearance-v2 .hot-col-kebab {
1628
+ display: inline-flex;
1629
+ align-items: center;
1630
+ justify-content: center;
1631
+ flex-shrink: 0;
1632
+ width: 20px;
1633
+ height: 20px;
1634
+ margin-left: 2px;
1635
+ padding: 0;
1636
+ border: none;
1637
+ /* A circle at its existing 20×20 — M3's 40dp target is exactly the
1638
+ touch-first geometry this system rejects, so the box does not grow. */
1639
+ border-radius: var(--m3-shape-full);
1640
+ background-color: transparent;
1641
+ color: var(--m3-on-surface-variant);
1642
+ cursor: pointer;
1643
+ transition: var(--m3-transition-state);
1644
+ }
1645
+ .hot-appearance-v2 .hot-col-kebab:hover {
1646
+ background-color: var(--m3-state-layer-hover);
1647
+ color: var(--m3-on-surface);
1648
+ }
1649
+ .hot-appearance-v2 .hot-col-kebab:active {
1650
+ background-color: var(--m3-state-layer-pressed);
1651
+ }
1652
+
1653
+ /* Per-column quick-filter trigger (funnel) — A1. Geometry is COPIED from the
1654
+ kebab above so the two chrome affordances in a header cell are the same box;
1655
+ only the resting colour differs, and only once a filter is live. Always
1656
+ rendered, never hover-revealed: being findable IS the requested feature. */
1657
+ .hot-appearance-v2 .hot-col-funnel {
1658
+ display: inline-flex;
1659
+ align-items: center;
1660
+ justify-content: center;
1661
+ flex-shrink: 0;
1662
+ width: 20px;
1663
+ height: 20px;
1664
+ margin-left: 2px;
1665
+ padding: 0;
1666
+ border: none;
1667
+ border-radius: var(--m3-shape-full);
1668
+ background-color: transparent;
1669
+ /* Was `--muted-v2-foreground` at 55% opacity — a wash on top of an already
1670
+ tertiary ink, which is how a permanently-rendered control ended up
1671
+ illegible. One role, full strength, no opacity. */
1672
+ color: var(--m3-on-surface-variant);
1673
+ cursor: pointer;
1674
+ transition: var(--m3-transition-state);
1675
+ }
1676
+ .hot-appearance-v2 .hot-col-funnel:hover {
1677
+ background-color: var(--m3-state-layer-hover);
1678
+ color: var(--m3-on-surface);
1679
+ }
1680
+ .hot-appearance-v2 .hot-col-funnel:active {
1681
+ background-color: var(--m3-state-layer-pressed);
1682
+ }
1683
+ /* A13 — a filtered column has to be legible as filtered from the header row
1684
+ alone. The glyph goes full-strength accent and stops being a hover hint. */
1685
+ /* 12% is already M3's selected-state layer value — this only tokenizes it. */
1686
+ .hot-appearance-v2 .hot-col-funnel[data-filtered] {
1687
+ color: var(--m3-accent);
1688
+ background-color: var(--m3-state-layer-accent-selected);
1689
+ }
1690
+
1691
+ /* …and the header cell picks up a DASHED accent underline. Dashed, not solid,
1692
+ because this rule is temporary and is never written to the saved view
1693
+ (A2/D6) — the same visual language as the toolbar's dashed clear-all pill. */
1694
+ .hot-appearance-v2.hot-container .hot-table th.hot-col-header[data-filtered] {
1695
+ color: var(--m3-on-surface);
1696
+ background-image: repeating-linear-gradient(
1697
+ to right,
1698
+ var(--m3-accent) 0 4px,
1699
+ transparent 4px 8px
1700
+ );
1701
+ background-repeat: no-repeat;
1702
+ background-size: 100% 2px;
1703
+ background-position: left bottom;
1704
+ }
1705
+
1706
+ /* ══════════════════════════════════════════════════════════════════
1707
+ Perspective tabs (v2) — rendered via the primitives-v2 Tab/TabBar.
1708
+ The primitive owns the underline + active state; these rules only add the
1709
+ hover-reveal delete affordance and the inline rename box.
1710
+ ════════════════════════════════════════════════════════════════ */
1711
+ /* Edit (pencil) + close (×) affordances. At rest they collapse to zero width
1712
+ so the active tab's underline sits right under the label (not stretched out
1713
+ by reserved icon space). On hover they expand to full size, widening the tab;
1714
+ because the underline is `inset-x-0` it grows in step with the tab, and the
1715
+ `width` transition makes that extension smooth. `display` stays inline-flex
1716
+ (it can't animate) — `width`/`margin`/`opacity` carry the reveal instead.
1717
+ `:has()` zeroes the flex gap so the collapsed state leaves no trailing space. */
1718
+ .hot-top-tabs-v2 [role="tab"]:has(.hot-top-tab-close-v2),
1719
+ .hot-top-tabs-v2 [role="tab"]:has(.hot-top-tab-menu-v2) {
1720
+ gap: 0;
1721
+ }
1722
+ .hot-top-tabs-v2 .hot-top-tab-edit-v2,
1723
+ .hot-top-tabs-v2 .hot-top-tab-menu-v2,
1724
+ .hot-top-tabs-v2 .hot-top-tab-close-v2 {
1725
+ display: inline-flex;
1726
+ align-items: center;
1727
+ justify-content: center;
1728
+ flex-shrink: 0;
1729
+ width: 0;
1730
+ height: 15px;
1731
+ margin-left: 0;
1732
+ border-radius: var(--m3-shape-full);
1733
+ line-height: 1;
1734
+ color: var(--m3-on-surface-variant);
1735
+ opacity: 0;
1736
+ overflow: hidden;
1737
+ cursor: pointer;
1738
+ transition:
1739
+ width var(--m3-duration-short4) var(--m3-ease-standard),
1740
+ margin-left var(--m3-duration-short4) var(--m3-ease-standard),
1741
+ opacity var(--m3-duration-short3) var(--m3-ease-standard),
1742
+ background-color var(--m3-duration-short2) var(--m3-ease-standard),
1743
+ color var(--m3-duration-short2) var(--m3-ease-standard);
1744
+ }
1745
+ .hot-top-tabs-v2 .hot-top-tab-close-v2 {
1746
+ font-size: var(--text-body-regular-sm, 0.875rem);
1747
+ }
1748
+ .hot-top-tabs-v2 [role="tab"]:hover .hot-top-tab-edit-v2,
1749
+ .hot-top-tabs-v2 [role="tab"]:hover .hot-top-tab-menu-v2,
1750
+ .hot-top-tabs-v2 [role="tab"]:hover .hot-top-tab-close-v2,
1751
+ /* Keep the `⋯` present on the ACTIVE tab even without hover: the view you are
1752
+ working in is the one whose actions you reach for, and a control that only
1753
+ exists on hover is the discoverability failure A6/B9 are both about. */
1754
+ .hot-top-tabs-v2 [role="tab"][aria-selected="true"] .hot-top-tab-menu-v2 {
1755
+ width: 15px;
1756
+ margin-left: 3px;
1757
+ opacity: 1;
1758
+ }
1759
+ .hot-top-tabs-v2 .hot-top-tab-edit-v2:hover,
1760
+ .hot-top-tabs-v2 .hot-top-tab-menu-v2:hover,
1761
+ .hot-top-tabs-v2 .hot-top-tab-close-v2:hover {
1762
+ background-color: var(--m3-state-layer-hover);
1763
+ color: var(--m3-on-surface);
1764
+ }
1765
+
1766
+ /* ── R8 — the perspective selector becomes M3 SELECTION ─────────────────────
1767
+ This is the most visible selector on the page, and it was the last one still
1768
+ speaking in underlines while every other selected thing in the grid — rows,
1769
+ cells, chips, menu items — had become a tinted container. It now takes the
1770
+ SAME `--m3-secondary-container` role as a selected row (D1), so "selected"
1771
+ reads identically everywhere.
1772
+
1773
+ ZERO vertical cost. The views bar's height is set by the 32px rows-per-page
1774
+ select, not by the tabs: a tab at 20px line-height plus 4+4 of padding is
1775
+ 28px and still clears it. The primitive's own asymmetric 4/8 padding was
1776
+ already zeroed further down by the "one centre line" rule.
1777
+
1778
+ The underline is switched off HERE rather than in the Tab primitive, which
1779
+ other surfaces still render with its underline intact. */
1780
+ .hot-appearance-v2.hot-container .hot-tabs-row .hot-top-tabs-v2 {
1781
+ /* 24px of gap read as separate links; 4px reads as one segmented group. */
1782
+ gap: 4px;
1783
+ }
1784
+ .hot-appearance-v2.hot-container .hot-tabs-row .hot-top-tabs-v2 [role="tab"] {
1785
+ padding: 4px 12px;
1786
+ border-radius: var(--m3-shape-full);
1787
+ color: var(--m3-on-surface-variant);
1788
+ transition: var(--m3-transition-state);
1789
+ }
1790
+ .hot-appearance-v2.hot-container .hot-tabs-row .hot-top-tabs-v2 [role="tab"]::after {
1791
+ content: none;
1792
+ }
1793
+ .hot-appearance-v2.hot-container .hot-tabs-row .hot-top-tabs-v2 [role="tab"]:hover:not([aria-selected="true"]) {
1794
+ background-color: var(--m3-state-layer-hover);
1795
+ color: var(--m3-on-surface);
1796
+ }
1797
+ .hot-appearance-v2.hot-container .hot-tabs-row .hot-top-tabs-v2 [role="tab"]:active:not([aria-selected="true"]) {
1798
+ background-color: var(--m3-state-layer-pressed);
1799
+ }
1800
+ .hot-appearance-v2.hot-container .hot-tabs-row .hot-top-tabs-v2 [role="tab"][aria-selected="true"] {
1801
+ background-color: var(--m3-secondary-container);
1802
+ color: var(--m3-on-secondary-container);
1803
+ }
1804
+ /* The per-tab affordances follow the tab's ink instead of holding three
1805
+ different greys, so the pill reads as one object. `:not(:hover)` matters:
1806
+ without it this rule out-specifies each affordance's own hover colour and
1807
+ the hover would silently do nothing. */
1808
+ .hot-appearance-v2.hot-container .hot-tabs-row .hot-top-tabs-v2 [role="tab"] .hot-top-tab-edit-v2:not(:hover),
1809
+ .hot-appearance-v2.hot-container .hot-tabs-row .hot-top-tabs-v2 [role="tab"] .hot-top-tab-menu-v2:not(:hover),
1810
+ .hot-appearance-v2.hot-container .hot-tabs-row .hot-top-tabs-v2 [role="tab"] .hot-top-tab-close-v2:not(:hover),
1811
+ .hot-appearance-v2.hot-container .hot-tabs-row .hot-top-tabs-v2 [role="tab"] .hot-top-tab-default-v2 {
1812
+ color: currentColor;
1813
+ }
1814
+ /* In a pane the row is shorter, so the pill's padding is paid for out of the
1815
+ pane's own 2px/4px tab padding — the row height does not move. */
1816
+ [data-split-view='true'] .hot-appearance-v2.hot-container .hot-tabs-row .hot-top-tabs-v2 [role="tab"] {
1817
+ padding-top: 3px;
1818
+ padding-bottom: 3px;
1819
+ }
1820
+
1821
+ /* A4 — the user's own default view carries a small star. It is never
1822
+ hover-revealed: which view opens tomorrow morning is a fact about the tab,
1823
+ not an action on it. */
1824
+ .hot-top-tabs-v2 .hot-top-tab-default-v2 {
1825
+ display: inline-flex;
1826
+ align-items: center;
1827
+ justify-content: center;
1828
+ flex-shrink: 0;
1829
+ width: 12px;
1830
+ height: 15px;
1831
+ margin-left: 4px;
1832
+ color: var(--m3-on-surface-variant);
1833
+ }
1834
+
1835
+ /* Destructive row in the shared `.hot-col-menu` dropdown (view delete). */
1836
+ .hot-col-menu-item-danger {
1837
+ color: var(--m3-error);
1838
+ }
1839
+ .hot-col-menu-item-danger svg {
1840
+ color: currentColor;
1841
+ }
1842
+ .hot-col-menu-item-danger:hover:not(:disabled) {
1843
+ background-color: var(--m3-state-layer-error-hover);
1844
+ }
1845
+
1846
+ /* Shared-template shelf. Same `.hot-col-menu` shell as the column and view
1847
+ menus — only the row's inner structure differs (two lines instead of one),
1848
+ so the three dropdowns keep identical padding, radius and shadow. */
1849
+ .hot-col-menu-title {
1850
+ padding: 6px 10px 4px;
1851
+ font-size: var(--text-label-semibold-2xs, 0.625rem);
1852
+ line-height: var(--text-label-semibold-2xs--line-height, 0.75rem);
1853
+ font-weight: var(--text-label-semibold-2xs--font-weight, 600);
1854
+ letter-spacing: var(--text-label-semibold-2xs--letter-spacing, 0.02em);
1855
+ text-transform: uppercase;
1856
+ color: var(--m3-on-surface-variant);
1857
+ }
1858
+ .hot-col-menu-empty {
1859
+ padding: 6px 10px 8px;
1860
+ font-size: var(--text-body-regular-xs, 0.75rem);
1861
+ line-height: var(--text-body-regular-xs--line-height, 1rem);
1862
+ color: var(--m3-on-surface-variant);
1863
+ }
1864
+ /* A two-line row: icon top-aligned with the title, not centred on the pair. */
1865
+ .hot-col-menu-item-stack {
1866
+ align-items: flex-start;
1867
+ padding-top: 7px;
1868
+ padding-bottom: 7px;
1869
+ }
1870
+ .hot-col-menu-item-stack svg {
1871
+ margin-top: 1px;
1872
+ }
1873
+ .hot-col-menu-item-text {
1874
+ display: flex;
1875
+ flex-direction: column;
1876
+ gap: 1px;
1877
+ min-width: 0;
1878
+ }
1879
+ .hot-col-menu-item-title {
1880
+ overflow: hidden;
1881
+ text-overflow: ellipsis;
1882
+ white-space: nowrap;
1883
+ }
1884
+ .hot-col-menu-item-sub {
1885
+ font-size: var(--text-body-regular-2xs, 0.6875rem);
1886
+ line-height: var(--text-body-regular-2xs--line-height, 0.875rem);
1887
+ letter-spacing: var(--text-body-regular-2xs--letter-spacing, 0.01em);
1888
+ color: var(--m3-on-surface-variant);
1889
+ }
1890
+ /* Provenance line in the view menu — information, so it is not a button and
1891
+ never takes hover. Padding matches `.hot-col-menu-item` exactly so the menu
1892
+ reads as one column of rows. */
1893
+ .hot-col-menu-note {
1894
+ display: flex;
1895
+ align-items: center;
1896
+ gap: 8px;
1897
+ padding: 6px 10px;
1898
+ font-size: var(--text-body-regular-xs, 0.75rem);
1899
+ line-height: var(--text-body-regular-xs--line-height, 1rem);
1900
+ color: var(--m3-on-surface-variant);
1901
+ }
1902
+ .hot-col-menu-note svg {
1903
+ flex-shrink: 0;
1904
+ color: var(--m3-on-surface-variant);
1905
+ }
1906
+ .hot-col-menu-note span {
1907
+ overflow: hidden;
1908
+ text-overflow: ellipsis;
1909
+ white-space: nowrap;
1910
+ }
1911
+ .hot-top-tabs-v2 .hot-top-tab-input {
1912
+ align-self: center;
1913
+ height: 28px;
1914
+ border: 1px solid var(--m3-outline-variant);
1915
+ border-radius: var(--m3-shape-sm);
1916
+ padding: 0 8px;
1917
+ font-family: var(--font-sans, ui-sans-serif, system-ui, sans-serif);
1918
+ font-size: var(--text-body-regular-sm, 0.875rem);
1919
+ color: var(--m3-on-surface);
1920
+ }
1921
+
1922
+ /* ══════════════════════════════════════════════════════════════════
1923
+ Pagination (v2, Figma 220:2935) — compact, right-aligned on the tabs row.
1924
+ `‹ [active] ··· page › [rows-per-page ⌄]`. Active page = slate-300 pill;
1925
+ no record-count text; no bottom footer.
1926
+ ════════════════════════════════════════════════════════════════ */
1927
+ .hot-appearance-v2 .hot-table-pagination {
1928
+ display: flex;
1929
+ align-items: center;
1930
+ gap: 8px;
1931
+ flex-shrink: 0;
1932
+ font-family: var(--font-sans, ui-sans-serif, system-ui, sans-serif);
1933
+ }
1934
+ .hot-appearance-v2 .hot-table-pagination-pages {
1935
+ display: flex;
1936
+ align-items: center;
1937
+ gap: 2px;
1938
+ }
1939
+ .hot-appearance-v2 .hot-table-pagination-btn {
1940
+ display: inline-flex;
1941
+ align-items: center;
1942
+ justify-content: center;
1943
+ width: 20px;
1944
+ height: 20px;
1945
+ padding: 0;
1946
+ border: none;
1947
+ border-radius: var(--m3-shape-full);
1948
+ background-color: transparent;
1949
+ color: var(--m3-on-surface-variant);
1950
+ cursor: pointer;
1951
+ transition: var(--m3-transition-state);
1952
+ }
1953
+ .hot-appearance-v2 .hot-table-pagination-btn:hover:not(:disabled) {
1954
+ background-color: var(--m3-state-layer-hover);
1955
+ color: var(--m3-on-surface);
1956
+ }
1957
+ .hot-appearance-v2 .hot-table-pagination-btn:active:not(:disabled) {
1958
+ background-color: var(--m3-state-layer-pressed);
1959
+ }
1960
+ /* A genuinely disabled control — the one legitimate use of opacity here. */
1961
+ .hot-appearance-v2 .hot-table-pagination-btn:disabled {
1962
+ opacity: var(--m3-disabled-content-opacity);
1963
+ cursor: default;
1964
+ }
1965
+ .hot-appearance-v2 .hot-table-pagination-page {
1966
+ display: inline-flex;
1967
+ align-items: center;
1968
+ justify-content: center;
1969
+ min-width: 24px;
1970
+ height: 24px;
1971
+ padding: 0 6px;
1972
+ border: none;
1973
+ border-radius: var(--m3-shape-full);
1974
+ background-color: transparent;
1975
+ color: var(--m3-on-surface-variant);
1976
+ font-family: inherit;
1977
+ font-size: var(--text-label-semibold-xs, 0.75rem);
1978
+ line-height: var(--text-label-semibold-xs--line-height, 1rem);
1979
+ font-weight: var(--text-label-semibold-xs--font-weight, 600);
1980
+ cursor: pointer;
1981
+ transition: var(--m3-transition-state);
1982
+ }
1983
+ .hot-appearance-v2 .hot-table-pagination-page:hover:not(.is-active) {
1984
+ background-color: var(--m3-state-layer-hover);
1985
+ color: var(--m3-on-surface);
1986
+ }
1987
+ /* The current page IS a selection, so it takes the one selection role rather
1988
+ than a neutral slate pill — the same tint as a selected row or tab (D1). */
1989
+ .hot-appearance-v2 .hot-table-pagination-page.is-active {
1990
+ background-color: var(--m3-secondary-container);
1991
+ color: var(--m3-on-secondary-container);
1992
+ }
1993
+ .hot-appearance-v2 .hot-table-pagination-ellipsis {
1994
+ display: inline-flex;
1995
+ align-items: center;
1996
+ justify-content: center;
1997
+ min-width: 20px;
1998
+ height: 24px;
1999
+ color: var(--m3-on-surface-variant);
2000
+ font-size: var(--text-body-regular-xs, 0.75rem);
2001
+ }
2002
+
2003
+ /* Rows-per-page select — white, 1px slate-300, radius 10, trailing chevron. */
2004
+ .hot-appearance-v2 .hot-table-pagination-perpage {
2005
+ position: relative;
2006
+ display: inline-flex;
2007
+ align-items: center;
2008
+ }
2009
+ .hot-appearance-v2 .hot-table-pagination-select {
2010
+ appearance: none;
2011
+ -webkit-appearance: none;
2012
+ font-family: inherit;
2013
+ font-size: var(--text-body-regular-xs, 0.75rem);
2014
+ color: var(--m3-on-surface-variant);
2015
+ background: var(--background-v2);
2016
+ border: 1px solid var(--m3-outline);
2017
+ /* Pill-able and outside the grid, so it takes the full corner. Height is
2018
+ unchanged — this is the whole reason the tab pills above cost nothing. */
2019
+ border-radius: var(--m3-shape-full);
2020
+ height: 32px;
2021
+ padding: 0 28px 0 12px;
2022
+ cursor: pointer;
2023
+ transition: var(--m3-transition-state);
2024
+ }
2025
+ .hot-appearance-v2 .hot-table-pagination-select:hover {
2026
+ border-color: var(--m3-on-surface-variant);
2027
+ }
2028
+ .hot-appearance-v2 .hot-table-pagination-select-chevron {
2029
+ position: absolute;
2030
+ right: 8px;
2031
+ color: var(--m3-on-surface-variant);
2032
+ pointer-events: none;
2033
+ }
2034
+
2035
+ /* ============================================================
2036
+ Fill handle (drag-to-fill)
2037
+ ============================================================
2038
+ Opt-in via `uiConfig.enableFillHandle`, which sets [data-fill-enabled] on
2039
+ the scroll container. The nub element is rendered (in Cell.tsx) only on a
2040
+ single active editable cell; this gate hides it unless the feature is on. */
2041
+ .hot-virtual-container:not([data-fill-enabled]) .fill-handle {
2042
+ display: none;
2043
+ }
2044
+ /* Relax the cell's text-ellipsis `overflow: hidden` so the corner nub can
2045
+ straddle the bottom-right corner without being clipped (text still ellipses
2046
+ via the inner `.cell-content`, which keeps its own overflow). */
2047
+ .hot-appearance-v2 .hot-cell:has(> .fill-handle) {
2048
+ overflow: visible;
2049
+ }
2050
+ .fill-handle {
2051
+ position: absolute;
2052
+ right: -3px;
2053
+ bottom: -3px;
2054
+ width: 8px;
2055
+ height: 8px;
2056
+ background: var(--m3-accent);
2057
+ border: 1.5px solid var(--m3-surface-container-lowest);
2058
+ /* 4px on an 8px nub is a full circle — the smallest rung, applied round. */
2059
+ border-radius: var(--m3-shape-xs);
2060
+ cursor: crosshair;
2061
+ z-index: 6;
2062
+ }
2063
+ /* Dashed preview RECTANGLE — deliberately DASHED so a fill drag never reads as
2064
+ the SOLID selection box.
2065
+
2066
+ PER EDGE, not per cell. A single `outline` on every previewed cell collapses
2067
+ visually into one outline on a 1-wide strip, but over a rectangle it draws a
2068
+ GRID OF BOXES — one around each cell. The four `data-fill-*` attributes carry
2069
+ the real rectangle edges (the store computes them with the same helper the
2070
+ selection outline uses), so only the outer border of the block is painted.
2071
+
2072
+ `::before`, not `::after`: the v2 range outline owns `td[data-in-range]::after`
2073
+ and the source cells are STILL `data-in-range` during a fill drag —
2074
+ `handleFillMouseDown` returns before the range phase is reset, by design, so
2075
+ the user keeps seeing what they are filling FROM.
2076
+
2077
+ `::before` has exactly one incumbent, `td[data-frozen-edge]::before` (the
2078
+ frozen-column divider). The collision window is one column edge, only while
2079
+ the pinned block is floating AND inside the fill rectangle: for the duration
2080
+ of the drag the fill edge wins that border and the divider returns on release.
2081
+ Accepted, and cheaper than a third pseudo-element. */
2082
+ .hot-appearance-v2 td[data-fill-preview="true"]::before {
2083
+ content: "";
2084
+ position: absolute;
2085
+ inset: 0;
2086
+ pointer-events: none;
2087
+ z-index: 5;
2088
+ }
2089
+ .hot-appearance-v2 td[data-fill-preview="true"][data-fill-top="true"]::before { border-top: 1.5px dashed var(--m3-accent); }
2090
+ .hot-appearance-v2 td[data-fill-preview="true"][data-fill-bottom="true"]::before { border-bottom: 1.5px dashed var(--m3-accent); }
2091
+ .hot-appearance-v2 td[data-fill-preview="true"][data-fill-left="true"]::before { border-left: 1.5px dashed var(--m3-accent); }
2092
+ .hot-appearance-v2 td[data-fill-preview="true"][data-fill-right="true"]::before { border-right: 1.5px dashed var(--m3-accent); }
2093
+ /* Cells a back-drag is about to EMPTY. Washed out rather than outlined: the
2094
+ user is destroying content and must see which content before releasing. */
2095
+ .hot-appearance-v2 td[data-fill-clear="true"] {
2096
+ opacity: 0.45;
2097
+ }
2098
+
2099
+ /* ============================================================
2100
+ MARCHING ANTS — the clipboard source outline
2101
+ ============================================================
2102
+ Excel's marquee, and the product owner asked for it by feel: after Ctrl+C /
2103
+ Ctrl+X the copied block keeps an ANIMATED DASHED border until Escape or a
2104
+ paste ends it, so you can move the cursor away and still see what a Ctrl+V
2105
+ is about to paste.
2106
+
2107
+ NOT scoped to `.hot-appearance-v2`: `.hot-clip-ants` is a new class with no
2108
+ legacy incumbent, and the marker is a correctness affordance rather than a
2109
+ theme flourish — the legacy appearance must not silently ship without it.
2110
+
2111
+ ONE element, four edges. Four background LAYERS are always declared and each
2112
+ one is switched on by giving it a size — `--ants-<edge>` defaults to 0 (a
2113
+ zero-width layer paints nothing) and the per-edge rules below raise it to
2114
+ 100%. Custom properties accumulate across rules where `background-image`
2115
+ would not, which is what lets four independent booleans drive one shorthand.
2116
+
2117
+ The animation shifts each layer by exactly one 8px dash period, so the loop
2118
+ is seamless; the four directions run top→right, bottom→left, left→up,
2119
+ right→down, which is the rotation Excel draws.
2120
+
2121
+ Colour: the selection accent, so the ants read as "the grid marked this" in
2122
+ both themes — `--hot-selection-color` (per-table override) falling back to
2123
+ `--selection-v2`, exactly like the fill-preview rectangle above. */
2124
+ @keyframes hot-marching-ants {
2125
+ to {
2126
+ background-position: 8px 0, -8px 100%, 0 -8px, 100% 8px;
2127
+ }
2128
+ }
2129
+ .hot-clip-ants {
2130
+ position: absolute;
2131
+ inset: 0;
2132
+ pointer-events: none;
2133
+ z-index: 6;
2134
+ --ants-top: 0;
2135
+ --ants-bottom: 0;
2136
+ --ants-left: 0;
2137
+ --ants-right: 0;
2138
+ --ants-color: var(--m3-accent);
2139
+ background-image:
2140
+ repeating-linear-gradient(to right, var(--ants-color) 0 4px, transparent 4px 8px),
2141
+ repeating-linear-gradient(to right, var(--ants-color) 0 4px, transparent 4px 8px),
2142
+ repeating-linear-gradient(to bottom, var(--ants-color) 0 4px, transparent 4px 8px),
2143
+ repeating-linear-gradient(to bottom, var(--ants-color) 0 4px, transparent 4px 8px);
2144
+ background-repeat: repeat-x, repeat-x, repeat-y, repeat-y;
2145
+ background-size:
2146
+ var(--ants-top) 1.5px,
2147
+ var(--ants-bottom) 1.5px,
2148
+ 1.5px var(--ants-left),
2149
+ 1.5px var(--ants-right);
2150
+ background-position: 0 0, 0 100%, 0 0, 100% 0;
2151
+ animation: hot-marching-ants 600ms var(--m3-ease-linear) infinite;
2152
+ }
2153
+ .hot-clip-ants[data-clip-top] { --ants-top: 100%; }
2154
+ .hot-clip-ants[data-clip-bottom] { --ants-bottom: 100%; }
2155
+ .hot-clip-ants[data-clip-left] { --ants-left: 100%; }
2156
+ .hot-clip-ants[data-clip-right] { --ants-right: 100%; }
2157
+ /* A dashed outline still says "clipboard" without moving. Motion that cannot
2158
+ be switched off is an accessibility failure, and the marker persists, so it
2159
+ would be a permanent one. */
2160
+ @media (prefers-reduced-motion: reduce) {
2161
+ .hot-clip-ants { animation: none; }
2162
+ }/* Pinned totals row — v2 surface. Matches the group-subtotal band so the two
2163
+ read as the same kind of row, and sits on the header fill so scrolling body
2164
+ rows pass underneath it rather than showing through. */
2165
+ /* The sticky shell owns the fill and the hairline; the inner row is now just
2166
+ the flex track of cells (see FooterTotalsRow's `hot-footer-totals` wrapper,
2167
+ added for ledger 3.3). Both are selected so the rule survives either shape. */
2168
+ .hot-appearance-v2 .hot-footer-totals,
2169
+ .hot-appearance-v2 .hot-footer-totals-row {
2170
+ background: var(--m3-surface-container-lowest);
2171
+ }
2172
+ .hot-appearance-v2 .hot-footer-totals {
2173
+ border-top: 1px solid var(--m3-outline-variant);
2174
+ }
2175
+ .hot-appearance-v2 .hot-footer-totals .hot-footer-totals-row {
2176
+ border-top: none;
2177
+ }
2178
+ .hot-appearance-v2 .hot-footer-totals-cell,
2179
+ .hot-appearance-v2 .hot-footer-totals-rowheader,
2180
+ .hot-appearance-v2 .hot-footer-totals-actions {
2181
+ background: var(--m3-surface-container-lowest);
2182
+ border-top: none;
2183
+ background-clip: padding-box;
2184
+ }
2185
+ .hot-appearance-v2 .hot-footer-totals-label {
2186
+ color: var(--m3-on-surface-variant);
2187
+ }
2188
+ .hot-appearance-v2 .hot-footer-totals-value {
2189
+ color: var(--m3-on-surface);
2190
+ }
2191
+ .hot-appearance-v2 .hot-footer-totals-scope {
2192
+ color: var(--m3-on-surface-variant);
2193
+ }
2194
+
2195
+ /* ══════════════════════════════════════════════════════════════════
2196
+ COLUMN-VIRTUALIZATION SPACERS
2197
+
2198
+ Under `uiConfig.enableColumnVirtualization`, a run of unmounted columns is
2199
+ replaced by ONE placeholder box whose width is the summed width of the
2200
+ columns it stands in for. Geometry is inline (see
2201
+ `utils/columnSpacerStyle.ts`); everything a spacer must NOT do is here.
2202
+
2203
+ Why the fills below exist: a striped, checkbox-selected or range-selected
2204
+ row paints its background on the CELLS, never on the <tr>. A spacer that
2205
+ painted nothing would therefore read as a hole punched through the middle
2206
+ of a highlighted row — and it would MOVE as the user scrolls, which is the
2207
+ most obviously-broken artifact this feature could ship. Each rule mirrors
2208
+ its `td.hot-cell` counterpart exactly, including `background-color`
2209
+ (longhand — the shorthand resets background-clip and breaks the row gap).
2210
+ ════════════════════════════════════════════════════════════════ */
2211
+ .hot-appearance-v2.hot-container .hot-table td.hot-cell-spacer,
2212
+ .hot-appearance-v2.hot-container .hot-table th.hot-header-spacer {
2213
+ border: none;
2214
+ padding: 0;
2215
+ box-shadow: none;
2216
+ background-clip: padding-box;
2217
+ }
2218
+
2219
+ /* Zebra stripe — mirrors the `td.hot-cell` rule above. */
2220
+ .hot-appearance-v2[data-striped="true"] tbody tr[data-row-even="true"] td.hot-cell-spacer {
2221
+ background-color: var(--table-v2-row-stripe);
2222
+ }
2223
+
2224
+ /* Checkbox-selected row. */
2225
+ .hot-appearance-v2 tbody tr[data-row-checked="true"] td.hot-cell-spacer {
2226
+ background-color: var(--m3-row-selected) !important;
2227
+ }
2228
+
2229
+ /* Row-range selection. */
2230
+ .hot-appearance-v2.hot-container .hot-virtual-container .hot-table tr[data-row-selected="true"] td.hot-cell-spacer {
2231
+ background-color: var(--m3-row-selected) !important;
2232
+ background-clip: padding-box !important;
2233
+ box-shadow: none !important;
2234
+ }
2235
+
2236
+ /* Header band: the sticky header strip has its own surface, so a header spacer
2237
+ must carry it or a white notch travels across the header while scrolling. */
2238
+ .hot-appearance-v2 .hot-headers-sticky th.hot-header-spacer {
2239
+ background: var(--table-v2-header-bg, var(--m3-surface-container));
2240
+ }
2241
+
2242
+ /* Pinned totals row — same surface as its neighbouring footer cells. */
2243
+ .hot-appearance-v2 .hot-footer-totals-row .hot-cell-spacer {
2244
+ background: var(--m3-surface-container-lowest);
2245
+ background-clip: padding-box;
2246
+ }
2247
+
2248
+ /* ═══════════════════════════════════════════════════════════════════════════
2249
+ COMPACT TOOLBAR — the grid adapts to its OWN width, not the viewport's
2250
+ Spec: .ai/specs/2026-08-04-module-table-registry.md
2251
+
2252
+ `.hot-toolbar` is a single non-wrapping flex row (title · search · spacer ·
2253
+ N action buttons) and the grid had no container queries or breakpoints at
2254
+ all, so in any narrow host — a split-view pane, a drawer, a narrow laptop —
2255
+ the actions simply overflowed.
2256
+
2257
+ A CONTAINER query, not a media query: a pane's width is set by a splitter,
2258
+ not by the viewport, so a media query would be answering the wrong question.
2259
+ The same rule therefore serves panes, drawers and small screens alike.
2260
+
2261
+ Nothing is HIDDEN except the title. Hiding search or the perspective tabs
2262
+ would remove the very capability an embedded table exists to provide; the
2263
+ title is the one element a host already shows in its own chrome.
2264
+ ═══════════════════════════════════════════════════════════════════════════ */
2265
+
2266
+ .hot-appearance-v2.hot-container {
2267
+ /* Inline-axis containment only — block size still follows content, so the
2268
+ `height: 'fill'` measurement in DynamicTable.tsx is unaffected. */
2269
+ container-type: inline-size;
2270
+ container-name: dt-grid;
2271
+ }
2272
+
2273
+ @container dt-grid (max-width: 720px) {
2274
+ /* ONE row, always. A narrow pane gets AT MOST two rows of chrome before the
2275
+ first data row — the toolbar (search + actions) and the views+pagination
2276
+ bar. The toolbar used to wrap into two on its own, which made three.
2277
+ `nowrap` is safe because everything inside it is elastic or collapsible:
2278
+ the search shrinks (below), the button labels drop to icons under 520px,
2279
+ and extra actions already live behind the overflow menu. */
2280
+ .hot-appearance-v2 .hot-toolbar {
2281
+ flex-wrap: nowrap;
2282
+ }
2283
+
2284
+ /* The host's own pane header already names the table. */
2285
+ .hot-appearance-v2 .hot-toolbar-title {
2286
+ display: none;
2287
+ }
2288
+
2289
+ /* Search SHRINKS; it does not take a row of its own.
2290
+ It used to be `flex: 1 1 100%` with `order: -1`, which forced the actions
2291
+ onto a second line and gave a pane THREE rows of chrome before the first
2292
+ data row: search, then actions, then the views+pagination bar. In a split
2293
+ pane that is most of the pane. Two rows is the ceiling.
2294
+ `min-width: 0` is what actually lets it shrink — a flex item will not go
2295
+ below its content's intrinsic width without it, and the input's own
2296
+ `width: 100%` would otherwise pin the row open and re-trigger the wrap. */
2297
+ .hot-appearance-v2 .hot-toolbar .search-bar {
2298
+ flex: 1 1 auto;
2299
+ min-width: 0;
2300
+ }
2301
+ .hot-appearance-v2 .hot-toolbar .search-input-wrapper {
2302
+ max-width: none;
2303
+ min-width: 0;
2304
+ }
2305
+ /* An `<input>` carries an intrinsic width from its `size` attribute (~170px)
2306
+ that `width: 100%` does not override as a flex MINIMUM — without this the
2307
+ input alone holds the row open and the wrap comes back. */
2308
+ .hot-appearance-v2 .hot-toolbar .search-input {
2309
+ min-width: 0;
2310
+ }
2311
+
2312
+ /* The search grows into the gap instead, so the spacer would be a second
2313
+ elastic item fighting it for the same space. */
2314
+ .hot-appearance-v2 .hot-toolbar .hot-toolbar-spacer {
2315
+ display: none;
2316
+ }
2317
+
2318
+ /* Actions hold their size and stay pinned right — they are the fixed end of
2319
+ the row, and `margin-left: auto` keeps them there even if the search is
2320
+ ever hidden by the chrome toggles. */
2321
+ .hot-appearance-v2 .hot-toolbar .hot-toolbar-actions {
2322
+ /* `0 1 auto`, not `0 0 auto`: actions hold their natural size while there is
2323
+ room, but they must be ABLE to give some back, because the active-filter
2324
+ chip strip lives in here and is up to 360px wide. Unshrinkable, a couple
2325
+ of active filters would push the row past the pane. Shrinking makes the
2326
+ chip strip scroll inside itself instead, which is what it is built for. */
2327
+ flex: 0 1 auto;
2328
+ min-width: 0;
2329
+ flex-wrap: nowrap;
2330
+ /* Keeps actions at the right edge even if the search is hidden by the
2331
+ pane's chrome toggles, when nothing else would push them over. */
2332
+ margin-left: auto;
2333
+ }
2334
+
2335
+ /* The TABS scroll; the row does not.
2336
+ Scrolling the whole row carried the pagination away with the tabs, so in a
2337
+ three-column pane the page controls were simply off-screen with no hint
2338
+ they existed. Confining the scroll to the tab list keeps pagination pinned
2339
+ at the right where it always is. */
2340
+ .hot-appearance-v2.hot-container .hot-tabs-row {
2341
+ overflow-x: visible;
2342
+ }
2343
+ /* Everything in the row that is NOT the tab list holds its size — pagination
2344
+ is the fixed end of the bar. */
2345
+ .hot-appearance-v2.hot-container .hot-tabs-row > *:not(.hot-top-tabs-v2) {
2346
+ flex: 0 0 auto;
2347
+ }
2348
+
2349
+ /* `overflow-x` on the row was not enough on its own: the tabs are flex items
2350
+ with no `nowrap`, so instead of overflowing they SHRANK and wrapped their
2351
+ own labels — "Default view" became two lines and the bar rendered 54px
2352
+ tall. Two rows of chrome, one of them double-height, is the three-row
2353
+ problem by another route.
2354
+ Holding each tab at its natural width is what actually makes the list
2355
+ overflow, which is what makes it scroll. The 24px inter-tab gap is page
2356
+ geometry; in a pane it is most of the row. */
2357
+ .hot-appearance-v2.hot-container .hot-top-tabs-v2 {
2358
+ flex: 1 1 auto;
2359
+ min-width: 0;
2360
+ gap: 12px;
2361
+ flex-wrap: nowrap;
2362
+ overflow-x: auto;
2363
+ scrollbar-width: none;
2364
+ }
2365
+ .hot-appearance-v2.hot-container .hot-top-tabs-v2::-webkit-scrollbar {
2366
+ display: none;
2367
+ }
2368
+ .hot-appearance-v2.hot-container .hot-top-tabs-v2 > * {
2369
+ flex: 0 0 auto;
2370
+ white-space: nowrap;
2371
+ }
2372
+ }
2373
+
2374
+ /* Below ~520px even the two-row toolbar is tight: drop the button labels and
2375
+ keep the icons, which every action button already renders. */
2376
+ @container dt-grid (max-width: 520px) {
2377
+ .hot-appearance-v2 .hot-toolbar .hot-toolbar-actions button > span:not([data-keep-label]) {
2378
+ display: none;
2379
+ }
2380
+ .hot-appearance-v2 .hot-toolbar {
2381
+ padding-left: 8px;
2382
+ padding-right: 8px;
2383
+ }
2384
+ }
2385
+
2386
+ /* ═══════════════════════════════════════════════════════════════════════════
2387
+ EMBEDDED (split-view pane) — reclaim vertical space
2388
+ Spec: .ai/specs/2026-08-04-dynamic-table-split-view.md
2389
+
2390
+ A pane is a budget: every pixel of chrome is a data row not shown, and the
2391
+ cost multiplies by pane count. Full-page padding is generous on purpose;
2392
+ inside a pane it is the single biggest avoidable loss. These rules only
2393
+ apply under `[data-split-view="true"]`, so a full-page table is untouched.
2394
+ ═══════════════════════════════════════════════════════════════════════════ */
2395
+
2396
+ /* The pane's pill strip. Same total block size as the pane's previous 4px/4px
2397
+ padding: the margin is taken OUT of the padding, never added to it. */
2398
+ [data-split-view='true'] .hot-appearance-v2 .hot-toolbar {
2399
+ /* Horizontal margin dropped to 0: the card owns the pane's inset now, so the
2400
+ pill strip spans the full content width and its left edge lines up with the
2401
+ table's first column. Vertical margin is unchanged. */
2402
+ margin: 2px 0;
2403
+ padding: 2px 8px; /* was 4px 8px, minus the 2px margin */
2404
+ gap: 8px; /* was 12px */
2405
+ }
2406
+
2407
+ [data-split-view='true'] .hot-appearance-v2.hot-container .hot-tabs-row {
2408
+ margin-bottom: 0; /* was 8px */
2409
+ padding-right: 8px; /* was 16px */
2410
+ }
2411
+
2412
+ /* The card's own inset — a pane already has a border and a divider around it,
2413
+ so the extra frame is drawn twice. */
2414
+ /* R2 — ONE frame owner. Inside a split view the PANE wrapper draws the 16px
2415
+ outlined frame; if the card drew one too the result was two concentric 1px
2416
+ hairlines at mismatched radii. The card keeps its `background` and its
2417
+ `overflow: hidden` (that clip is what rounds the grid header to the pane)
2418
+ and gives up only its own border and corner. */
2419
+ [data-split-view='true'] .hot-appearance-v2 .hot-card {
2420
+ /* ONE owner for the pane's horizontal inset.
2421
+ Measured before this (1600x1000, four-cell template): the toolbar sat 5px
2422
+ from the pane frame while the grid sat 17px, because each carried its own
2423
+ margin. Two problems at once — the search pill and the table's first column
2424
+ did not line up, and at 5px the toolbar was visibly cramped against the
2425
+ card's 16px corner, which is the "needs more padding" the design review
2426
+ called out.
2427
+ The card now owns the inset and the children below give up their own, so
2428
+ every row in a pane — toolbar, tabs, grid — shares one 16px edge.
2429
+ HORIZONTAL ONLY: vertical padding here would cost a data row in every pane,
2430
+ and rows-per-screen is the product requirement. */
2431
+ padding: 0 16px;
2432
+ border: none;
2433
+ border-radius: 0;
2434
+ }
2435
+
2436
+ /* The children stop paying their own horizontal inset now that the card pays it
2437
+ once. Without these the two stack and the content sits 32px in. */
2438
+ [data-split-view='true'] .hot-appearance-v2.hot-container:has(.hot-toolbar) .hot-virtual-container,
2439
+ [data-split-view='true'] .hot-appearance-v2 .hot-virtual-container {
2440
+ margin-left: 0;
2441
+ margin-right: 0;
2442
+ }
2443
+
2444
+ /* Toolbar title: keep it (nothing else names the table in a pane) but stop it
2445
+ reserving a full-size heading's leading. */
2446
+ [data-split-view='true'] .hot-appearance-v2 .hot-toolbar-title {
2447
+ margin: 0;
2448
+ line-height: 1.2;
2449
+ }
2450
+
2451
+ /* The page-level bleed margins do not apply inside a host. */
2452
+ [data-split-view='true'] .hot-appearance-v2.hot-container {
2453
+ border-radius: 0;
2454
+ }
2455
+
2456
+ /* ── Pane controls: sized for a pane, not for a page ───────────────────────
2457
+ Measured before changing anything (1800x1000, two panes):
2458
+ toolbar 50px · tabs+pagination row 38px
2459
+ .hot-table-pagination-select 32px tall, 40px horizontal padding for "50"
2460
+ action buttons 32x32 with a 16px icon
2461
+ Full-page those are comfortable. In a pane they are the difference between
2462
+ seeing the next row and not, and the cost repeats per pane. Scoped to
2463
+ `[data-split-view="true"]` so nothing outside a split changes.
2464
+ ───────────────────────────────────────────────────────────────────────── */
2465
+
2466
+ [data-split-view='true'] .hot-appearance-v2 .hot-tabs-row {
2467
+ min-height: 0;
2468
+ }
2469
+
2470
+ /* Page-size select: the padding was sized for a wide label, not a 2-digit
2471
+ number, so most of its width was empty. */
2472
+ [data-split-view='true'] .hot-appearance-v2 .hot-table-pagination-select {
2473
+ height: 22px;
2474
+ padding: 0 18px 0 6px;
2475
+ background-position: right 4px center;
2476
+ font-size: var(--text-body-regular-2xs, 0.6875rem);
2477
+ line-height: var(--text-body-regular-2xs--line-height, 0.875rem);
2478
+ }
2479
+
2480
+ [data-split-view='true'] .hot-appearance-v2 .hot-table-pagination-page,
2481
+ [data-split-view='true'] .hot-appearance-v2 .hot-table-pagination-ellipsis {
2482
+ height: 18px;
2483
+ min-width: 18px;
2484
+ padding: 0 3px;
2485
+ font-size: var(--text-body-regular-2xs, 0.6875rem);
2486
+ line-height: var(--text-body-regular-2xs--line-height, 0.875rem);
2487
+ }
2488
+
2489
+ [data-split-view='true'] .hot-appearance-v2 .hot-table-pagination-btn {
2490
+ height: 16px;
2491
+ width: 16px;
2492
+ }
2493
+
2494
+ /* Icon actions: keep the 16px icon, drop the 8px of dead ring around it. */
2495
+ [data-split-view='true'] .hot-appearance-v2 .hot-toolbar .hot-add-row-btn,
2496
+ [data-split-view='true'] .hot-appearance-v2 .hot-toolbar .fullscreen-toggle-btn {
2497
+ height: 24px;
2498
+ width: 24px;
2499
+ }
2500
+
2501
+ [data-split-view='true'] .hot-appearance-v2 .hot-toolbar button svg {
2502
+ height: 14px;
2503
+ width: 14px;
2504
+ }
2505
+
2506
+ /* The saved-view tabs carry a page-sized bottom rail.
2507
+ `:not([class*='pagination'])` matters: the pagination controls live INSIDE
2508
+ this row, so the unqualified selector was giving them an asymmetric
2509
+ 2px/4px padding and pushing them 4px below the tab baseline — which is
2510
+ exactly the "pagination looks off" symptom. */
2511
+ [data-split-view='true'] .hot-appearance-v2 .hot-tabs-row button:not([class*='pagination']) {
2512
+ padding-top: 2px;
2513
+ padding-bottom: 4px;
2514
+ }
2515
+
2516
+ /* The row is `align-items: flex-end` for the tab underline rail; the
2517
+ pagination is not a tab and should sit on the row's centre line. */
2518
+ [data-split-view='true'] .hot-appearance-v2 .hot-table-pagination-btn,
2519
+ [data-split-view='true'] .hot-appearance-v2 .hot-table-pagination-page,
2520
+ [data-split-view='true'] .hot-appearance-v2 .hot-table-pagination-ellipsis,
2521
+ [data-split-view='true'] .hot-appearance-v2 .hot-table-pagination-select {
2522
+ align-self: center;
2523
+ padding-top: 0;
2524
+ padding-bottom: 0;
2525
+ }
2526
+
2527
+ /* With the toolbar hidden the restore handle floats at the pane's top-right,
2528
+ where the pagination already is. Reserve room for it so the two never
2529
+ collide, rather than moving the handle out of the pane's clipped bounds. */
2530
+ [data-split-view='true'] [data-pane-toolbar='hidden'] .hot-appearance-v2 .hot-tabs-row {
2531
+ padding-right: 40px;
2532
+ }
2533
+
2534
+ /* Overflow trigger — matches the other icon actions in the toolbar. */
2535
+ .hot-appearance-v2 .hot-toolbar-overflow-btn {
2536
+ display: inline-flex;
2537
+ align-items: center;
2538
+ justify-content: center;
2539
+ height: 32px;
2540
+ width: 32px;
2541
+ /* The three legacy shadcn tokens this rule used (`--border`, `--background`,
2542
+ `--muted`) are the last of their kind in this sheet. An icon button on the
2543
+ tinted toolbar strip needs no box of its own — just a circular state
2544
+ layer. Sizes are unchanged. */
2545
+ border: none;
2546
+ border-radius: var(--m3-shape-full);
2547
+ background-color: transparent;
2548
+ color: var(--m3-on-surface-variant);
2549
+ transition: var(--m3-transition-state);
2550
+ }
2551
+ .hot-appearance-v2 .hot-toolbar-overflow-btn:hover {
2552
+ background-color: var(--m3-state-layer-hover);
2553
+ color: var(--m3-on-surface);
2554
+ }
2555
+ .hot-appearance-v2 .hot-toolbar-overflow-btn:active {
2556
+ background-color: var(--m3-state-layer-pressed);
2557
+ }
2558
+ [data-split-view='true'] .hot-appearance-v2 .hot-toolbar-overflow-btn {
2559
+ height: 24px;
2560
+ width: 24px;
2561
+ border-radius: var(--m3-shape-full);
2562
+ }
2563
+
2564
+ /* ── Views bar: one centre line ────────────────────────────────────────────
2565
+ Measured before changing anything (full page):
2566
+ row h 38 centre 164
2567
+ view tab h 23 centre 172 (inside a nested `div.flex.items-end`)
2568
+ page btn h 24 centre 169
2569
+ select h 32 centre 169
2570
+
2571
+ Three centre lines in one row — that is what reads as "not centered". The
2572
+ tabs sit in their own flex wrapper that bottom-aligns them, so aligning the
2573
+ ROW alone never moved them; the wrapper had to be addressed too.
2574
+ ───────────────────────────────────────────────────────────────────────── */
2575
+
2576
+ .hot-appearance-v2.hot-container .hot-tabs-row {
2577
+ align-items: center;
2578
+ }
2579
+
2580
+ /* The tab GROUP is a nested flex container with its own `items-end`. */
2581
+ .hot-appearance-v2.hot-container .hot-tabs-row > div {
2582
+ align-items: center;
2583
+ }
2584
+
2585
+ .hot-appearance-v2.hot-container .hot-tabs-row > div > button {
2586
+ padding-top: 0;
2587
+ padding-bottom: 0;
2588
+ }
2589
+
2590
+ .hot-appearance-v2.hot-container .hot-tabs-row .hot-table-pagination-btn,
2591
+ .hot-appearance-v2.hot-container .hot-tabs-row .hot-table-pagination-page,
2592
+ .hot-appearance-v2.hot-container .hot-tabs-row .hot-table-pagination-ellipsis,
2593
+ .hot-appearance-v2.hot-container .hot-tabs-row .hot-table-pagination-select {
2594
+ align-self: center;
2595
+ margin-top: 0;
2596
+ margin-bottom: 0;
2597
+ }
2598
+
2599
+ /* The pagination CONTAINER is what sits off-centre: `align-self: flex-end`
2600
+ plus a -2px bottom margin, both there to hang it on the old bottom rail.
2601
+ Targeting the individual buttons never moved it. */
2602
+ .hot-appearance-v2.hot-container .hot-tabs-row .hot-table-pagination {
2603
+ align-self: center;
2604
+ margin-bottom: 0;
2605
+ }
2606
+
2607
+ /* The select's 28px right inset was sized for a wider label than two digits. */
2608
+ .hot-appearance-v2 .hot-table-pagination-select {
2609
+ padding-right: 22px;
2610
+ padding-left: 8px;
2611
+ background-position: right 6px center;
2612
+ }
2613
+
2614
+ /* Stale-data bar (HEDGE-165) — the band shown when the list request FAILED but
2615
+ the grid still holds the previous response's rows. Sits between the tabs row
2616
+ and the column headers, i.e. the same slot the bulk bar uses, and borrows its
2617
+ geometry (44px, 8px/16px margins) so the two never disagree about where a
2618
+ band above the headers lives.
2619
+
2620
+ Coloured from the error container tokens rather than the primary ones the
2621
+ bulk bar uses: this is a warning about what is on screen, not an action bar,
2622
+ and it must not read as "something is selected" at a glance. `flex-shrink: 0`
2623
+ because it is a flex child of the fill-height column — without it the bar is
2624
+ the thing that gets squeezed when the grid is tall. */
2625
+ .hot-appearance-v2.hot-container .hot-stale-data-bar {
2626
+ display: flex;
2627
+ align-items: center;
2628
+ gap: 8px;
2629
+ flex-shrink: 0;
2630
+ height: 44px;
2631
+ box-sizing: border-box;
2632
+ margin: 8px 16px;
2633
+ padding: 4px 10px;
2634
+ border-radius: var(--m3-shape-md);
2635
+ background: var(--m3-error-container);
2636
+ color: var(--m3-on-error-container);
2637
+ }
2638
+ .hot-appearance-v2 .hot-stale-data-bar-icon {
2639
+ flex-shrink: 0;
2640
+ width: 16px;
2641
+ height: 16px;
2642
+ }
2643
+ .hot-appearance-v2 .hot-stale-data-bar-message {
2644
+ flex: 1;
2645
+ min-width: 0;
2646
+ /* One line: the bar must not grow the band and re-measure the grid on a
2647
+ narrow viewport. The full sentence stays available as the title. */
2648
+ overflow: hidden;
2649
+ text-overflow: ellipsis;
2650
+ white-space: nowrap;
2651
+ }