@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.
- package/LICENSE +21 -0
- package/README.md +31 -0
- package/dist/backend/AppShell.js +1289 -0
- package/dist/backend/AppShell.js.map +7 -0
- package/dist/backend/BackendChromeProvider.js +83 -0
- package/dist/backend/BackendChromeProvider.js.map +7 -0
- package/dist/backend/BackendPageSurface.js +19 -0
- package/dist/backend/BackendPageSurface.js.map +7 -0
- package/dist/backend/CollapsibleNavSection.js +149 -0
- package/dist/backend/CollapsibleNavSection.js.map +7 -0
- package/dist/backend/ContextHelp.js +33 -0
- package/dist/backend/ContextHelp.js.map +7 -0
- package/dist/backend/CrudForm.js +3163 -0
- package/dist/backend/CrudForm.js.map +7 -0
- package/dist/backend/DataTable.js +2091 -0
- package/dist/backend/DataTable.js.map +7 -0
- package/dist/backend/EmptyState.js +52 -0
- package/dist/backend/EmptyState.js.map +7 -0
- package/dist/backend/FilterBar.js +147 -0
- package/dist/backend/FilterBar.js.map +7 -0
- package/dist/backend/FilterOverlay.js +337 -0
- package/dist/backend/FilterOverlay.js.map +7 -0
- package/dist/backend/FlashMessages.js +158 -0
- package/dist/backend/FlashMessages.js.map +7 -0
- package/dist/backend/HtmlRichTextEditor.js +129 -0
- package/dist/backend/HtmlRichTextEditor.js.map +7 -0
- package/dist/backend/IntegrationsButton.js +25 -0
- package/dist/backend/IntegrationsButton.js.map +7 -0
- package/dist/backend/JsonBuilder.js +323 -0
- package/dist/backend/JsonBuilder.js.map +7 -0
- package/dist/backend/JsonDisplay.js +207 -0
- package/dist/backend/JsonDisplay.js.map +7 -0
- package/dist/backend/NextStepCallout.js +79 -0
- package/dist/backend/NextStepCallout.js.map +7 -0
- package/dist/backend/Page.js +27 -0
- package/dist/backend/Page.js.map +7 -0
- package/dist/backend/PerspectiveSidebar.js +456 -0
- package/dist/backend/PerspectiveSidebar.js.map +7 -0
- package/dist/backend/ProfileDropdown.js +341 -0
- package/dist/backend/ProfileDropdown.js.map +7 -0
- package/dist/backend/RowActions.js +155 -0
- package/dist/backend/RowActions.js.map +7 -0
- package/dist/backend/SectionHeader.js +74 -0
- package/dist/backend/SectionHeader.js.map +7 -0
- package/dist/backend/SettingsButton.js +25 -0
- package/dist/backend/SettingsButton.js.map +7 -0
- package/dist/backend/Sidebar.js +510 -0
- package/dist/backend/Sidebar.js.map +7 -0
- package/dist/backend/Sidebar.stories.js +166 -0
- package/dist/backend/Sidebar.stories.js.map +7 -0
- package/dist/backend/TruncatedCell.js +92 -0
- package/dist/backend/TruncatedCell.js.map +7 -0
- package/dist/backend/UserMenu.js +146 -0
- package/dist/backend/UserMenu.js.map +7 -0
- package/dist/backend/ValueIcons.js +34 -0
- package/dist/backend/ValueIcons.js.map +7 -0
- package/dist/backend/WebhookSetupGuide.js +79 -0
- package/dist/backend/WebhookSetupGuide.js.map +7 -0
- package/dist/backend/charts/BarChart.js +154 -0
- package/dist/backend/charts/BarChart.js.map +7 -0
- package/dist/backend/charts/ChartUtils.js +141 -0
- package/dist/backend/charts/ChartUtils.js.map +7 -0
- package/dist/backend/charts/ComboChart.js +261 -0
- package/dist/backend/charts/ComboChart.js.map +7 -0
- package/dist/backend/charts/ComboChart.stories.js +88 -0
- package/dist/backend/charts/ComboChart.stories.js.map +7 -0
- package/dist/backend/charts/KpiCard.js +96 -0
- package/dist/backend/charts/KpiCard.js.map +7 -0
- package/dist/backend/charts/LineChart.js +165 -0
- package/dist/backend/charts/LineChart.js.map +7 -0
- package/dist/backend/charts/PieChart.js +121 -0
- package/dist/backend/charts/PieChart.js.map +7 -0
- package/dist/backend/charts/ScatterChart.js +320 -0
- package/dist/backend/charts/ScatterChart.js.map +7 -0
- package/dist/backend/charts/TopNTable.js +91 -0
- package/dist/backend/charts/TopNTable.js.map +7 -0
- package/dist/backend/charts/WaterfallChart.js +136 -0
- package/dist/backend/charts/WaterfallChart.js.map +7 -0
- package/dist/backend/charts/index.js +30 -0
- package/dist/backend/charts/index.js.map +7 -0
- package/dist/backend/columns/ColumnChooserPanel.js +244 -0
- package/dist/backend/columns/ColumnChooserPanel.js.map +7 -0
- package/dist/backend/confirm-dialog/ConfirmDialog.js +214 -0
- package/dist/backend/confirm-dialog/ConfirmDialog.js.map +7 -0
- package/dist/backend/confirm-dialog/index.js +7 -0
- package/dist/backend/confirm-dialog/index.js.map +7 -0
- package/dist/backend/confirm-dialog/useConfirmDialog.js +113 -0
- package/dist/backend/confirm-dialog/useConfirmDialog.js.map +7 -0
- package/dist/backend/custom-fields/FieldDefinitionsEditor.js +1352 -0
- package/dist/backend/custom-fields/FieldDefinitionsEditor.js.map +7 -0
- package/dist/backend/custom-fields/FieldDefinitionsManager.js +332 -0
- package/dist/backend/custom-fields/FieldDefinitionsManager.js.map +7 -0
- package/dist/backend/dashboard/DashboardScreen.js +598 -0
- package/dist/backend/dashboard/DashboardScreen.js.map +7 -0
- package/dist/backend/dashboard/index.js +5 -0
- package/dist/backend/dashboard/index.js.map +7 -0
- package/dist/backend/dashboard/widgetRegistry.js +55 -0
- package/dist/backend/dashboard/widgetRegistry.js.map +7 -0
- package/dist/backend/date-range/DateRangeSelect.js +39 -0
- package/dist/backend/date-range/DateRangeSelect.js.map +7 -0
- package/dist/backend/date-range/InlineDateRangeSelect.js +42 -0
- package/dist/backend/date-range/InlineDateRangeSelect.js.map +7 -0
- package/dist/backend/date-range/InlineGranularitySelect.js +40 -0
- package/dist/backend/date-range/InlineGranularitySelect.js.map +7 -0
- package/dist/backend/date-range/dateRanges.js +176 -0
- package/dist/backend/date-range/dateRanges.js.map +7 -0
- package/dist/backend/date-range/index.js +25 -0
- package/dist/backend/date-range/index.js.map +7 -0
- package/dist/backend/detail/AccessDeniedMessage.js +28 -0
- package/dist/backend/detail/AccessDeniedMessage.js.map +7 -0
- package/dist/backend/detail/ActivitiesSection.js +947 -0
- package/dist/backend/detail/ActivitiesSection.js.map +7 -0
- package/dist/backend/detail/AddressEditor.js +417 -0
- package/dist/backend/detail/AddressEditor.js.map +7 -0
- package/dist/backend/detail/AddressTiles.js +441 -0
- package/dist/backend/detail/AddressTiles.js.map +7 -0
- package/dist/backend/detail/AddressesSection.js +274 -0
- package/dist/backend/detail/AddressesSection.js.map +7 -0
- package/dist/backend/detail/AttachmentDeleteDialog.js +41 -0
- package/dist/backend/detail/AttachmentDeleteDialog.js.map +7 -0
- package/dist/backend/detail/AttachmentMetadataDialog.js +519 -0
- package/dist/backend/detail/AttachmentMetadataDialog.js.map +7 -0
- package/dist/backend/detail/AttachmentVisualPreview.js +132 -0
- package/dist/backend/detail/AttachmentVisualPreview.js.map +7 -0
- package/dist/backend/detail/AttachmentsSection.js +281 -0
- package/dist/backend/detail/AttachmentsSection.js.map +7 -0
- package/dist/backend/detail/CustomDataSection.js +575 -0
- package/dist/backend/detail/CustomDataSection.js.map +7 -0
- package/dist/backend/detail/DetailFieldsSection.js +85 -0
- package/dist/backend/detail/DetailFieldsSection.js.map +7 -0
- package/dist/backend/detail/ErrorMessage.js +28 -0
- package/dist/backend/detail/ErrorMessage.js.map +7 -0
- package/dist/backend/detail/InlineEditors.js +697 -0
- package/dist/backend/detail/InlineEditors.js.map +7 -0
- package/dist/backend/detail/LoadingMessage.js +14 -0
- package/dist/backend/detail/LoadingMessage.js.map +7 -0
- package/dist/backend/detail/NotesSection.js +1022 -0
- package/dist/backend/detail/NotesSection.js.map +7 -0
- package/dist/backend/detail/TabEmptyState.js +25 -0
- package/dist/backend/detail/TabEmptyState.js.map +7 -0
- package/dist/backend/detail/TagsSection.js +375 -0
- package/dist/backend/detail/TagsSection.js.map +7 -0
- package/dist/backend/detail/addressFormat.js +77 -0
- package/dist/backend/detail/addressFormat.js.map +7 -0
- package/dist/backend/detail/index.js +36 -0
- package/dist/backend/detail/index.js.map +7 -0
- package/dist/backend/devtools/UmesDevToolsPanel.js +109 -0
- package/dist/backend/devtools/UmesDevToolsPanel.js.map +7 -0
- package/dist/backend/devtools/components/ConflictWarnings.js +32 -0
- package/dist/backend/devtools/components/ConflictWarnings.js.map +7 -0
- package/dist/backend/devtools/components/EnricherTiming.js +46 -0
- package/dist/backend/devtools/components/EnricherTiming.js.map +7 -0
- package/dist/backend/devtools/components/EventFlow.js +34 -0
- package/dist/backend/devtools/components/EventFlow.js.map +7 -0
- package/dist/backend/devtools/components/ExtensionPointList.js +58 -0
- package/dist/backend/devtools/components/ExtensionPointList.js.map +7 -0
- package/dist/backend/devtools/components/InterceptorActivity.js +36 -0
- package/dist/backend/devtools/components/InterceptorActivity.js.map +7 -0
- package/dist/backend/devtools/index.js +7 -0
- package/dist/backend/devtools/index.js.map +7 -0
- package/dist/backend/devtools/useUmesDevTools.js +125 -0
- package/dist/backend/devtools/useUmesDevTools.js.map +7 -0
- package/dist/backend/document-viewer/RegionOverlay.js +92 -0
- package/dist/backend/document-viewer/RegionOverlay.js.map +7 -0
- package/dist/backend/document-viewer/index.js +6 -0
- package/dist/backend/document-viewer/index.js.map +7 -0
- package/dist/backend/dynamic-grid/DynamicGrid.js +130 -0
- package/dist/backend/dynamic-grid/DynamicGrid.js.map +7 -0
- package/dist/backend/dynamic-grid/adapters.js +34 -0
- package/dist/backend/dynamic-grid/adapters.js.map +7 -0
- package/dist/backend/dynamic-grid/components/GridCell.js +149 -0
- package/dist/backend/dynamic-grid/components/GridCell.js.map +7 -0
- package/dist/backend/dynamic-grid/components/GridRow.js +32 -0
- package/dist/backend/dynamic-grid/components/GridRow.js.map +7 -0
- package/dist/backend/dynamic-grid/hooks/useGridKeyboardNav.js +115 -0
- package/dist/backend/dynamic-grid/hooks/useGridKeyboardNav.js.map +7 -0
- package/dist/backend/dynamic-grid/index.js +9 -0
- package/dist/backend/dynamic-grid/index.js.map +7 -0
- package/dist/backend/dynamic-grid/types.js +1 -0
- package/dist/backend/dynamic-grid/types.js.map +7 -0
- package/dist/backend/dynamic-table/DynamicTable.js +2607 -0
- package/dist/backend/dynamic-table/DynamicTable.js.map +7 -0
- package/dist/backend/dynamic-table/DynamicTable.stories.js +233 -0
- package/dist/backend/dynamic-table/DynamicTable.stories.js.map +7 -0
- package/dist/backend/dynamic-table/components/ActiveFilterChips.js +60 -0
- package/dist/backend/dynamic-table/components/ActiveFilterChips.js.map +7 -0
- package/dist/backend/dynamic-table/components/BulkActionsBar.js +58 -0
- package/dist/backend/dynamic-table/components/BulkActionsBar.js.map +7 -0
- package/dist/backend/dynamic-table/components/Cell.js +155 -0
- package/dist/backend/dynamic-table/components/Cell.js.map +7 -0
- package/dist/backend/dynamic-table/components/CellCommentDialog.js +726 -0
- package/dist/backend/dynamic-table/components/CellCommentDialog.js.map +7 -0
- package/dist/backend/dynamic-table/components/CellCommentHoverPopup.js +77 -0
- package/dist/backend/dynamic-table/components/CellCommentHoverPopup.js.map +7 -0
- package/dist/backend/dynamic-table/components/ColumnFilterPopover.js +485 -0
- package/dist/backend/dynamic-table/components/ColumnFilterPopover.js.map +7 -0
- package/dist/backend/dynamic-table/components/ColumnHeaderMenu.js +173 -0
- package/dist/backend/dynamic-table/components/ColumnHeaderMenu.js.map +7 -0
- package/dist/backend/dynamic-table/components/ColumnHeaders.js +528 -0
- package/dist/backend/dynamic-table/components/ColumnHeaders.js.map +7 -0
- package/dist/backend/dynamic-table/components/CompactLabelCell.js +64 -0
- package/dist/backend/dynamic-table/components/CompactLabelCell.js.map +7 -0
- package/dist/backend/dynamic-table/components/ConfigureViewFields.js +139 -0
- package/dist/backend/dynamic-table/components/ConfigureViewFields.js.map +7 -0
- package/dist/backend/dynamic-table/components/ConfigureViewFilters.js +305 -0
- package/dist/backend/dynamic-table/components/ConfigureViewFilters.js.map +7 -0
- package/dist/backend/dynamic-table/components/ConfigureViewFormatting.js +169 -0
- package/dist/backend/dynamic-table/components/ConfigureViewFormatting.js.map +7 -0
- package/dist/backend/dynamic-table/components/ConfigureViewFormulas.js +298 -0
- package/dist/backend/dynamic-table/components/ConfigureViewFormulas.js.map +7 -0
- package/dist/backend/dynamic-table/components/ConfigureViewGrouping.js +224 -0
- package/dist/backend/dynamic-table/components/ConfigureViewGrouping.js.map +7 -0
- package/dist/backend/dynamic-table/components/ConfigureViewLinkedColumns.js +167 -0
- package/dist/backend/dynamic-table/components/ConfigureViewLinkedColumns.js.map +7 -0
- package/dist/backend/dynamic-table/components/ConfigureViewPanel.js +592 -0
- package/dist/backend/dynamic-table/components/ConfigureViewPanel.js.map +7 -0
- package/dist/backend/dynamic-table/components/ConfigureViewRollups.js +269 -0
- package/dist/backend/dynamic-table/components/ConfigureViewRollups.js.map +7 -0
- package/dist/backend/dynamic-table/components/ConfigureViewSorting.js +107 -0
- package/dist/backend/dynamic-table/components/ConfigureViewSorting.js.map +7 -0
- package/dist/backend/dynamic-table/components/ContextMenu.js +91 -0
- package/dist/backend/dynamic-table/components/ContextMenu.js.map +7 -0
- package/dist/backend/dynamic-table/components/DateCell.js +80 -0
- package/dist/backend/dynamic-table/components/DateCell.js.map +7 -0
- package/dist/backend/dynamic-table/components/Debugger.js +311 -0
- package/dist/backend/dynamic-table/components/Debugger.js.map +7 -0
- package/dist/backend/dynamic-table/components/DensityControl.js +289 -0
- package/dist/backend/dynamic-table/components/DensityControl.js.map +7 -0
- package/dist/backend/dynamic-table/components/EmptyState.js +42 -0
- package/dist/backend/dynamic-table/components/EmptyState.js.map +7 -0
- package/dist/backend/dynamic-table/components/EntitySearchEditor.js +369 -0
- package/dist/backend/dynamic-table/components/EntitySearchEditor.js.map +7 -0
- package/dist/backend/dynamic-table/components/ExportMenu.js +63 -0
- package/dist/backend/dynamic-table/components/ExportMenu.js.map +7 -0
- package/dist/backend/dynamic-table/components/FilterDatePicker.js +165 -0
- package/dist/backend/dynamic-table/components/FilterDatePicker.js.map +7 -0
- package/dist/backend/dynamic-table/components/FilterValueInput.js +200 -0
- package/dist/backend/dynamic-table/components/FilterValueInput.js.map +7 -0
- package/dist/backend/dynamic-table/components/FooterTotalsRow.js +165 -0
- package/dist/backend/dynamic-table/components/FooterTotalsRow.js.map +7 -0
- package/dist/backend/dynamic-table/components/FullscreenOverlay.js +51 -0
- package/dist/backend/dynamic-table/components/FullscreenOverlay.js.map +7 -0
- package/dist/backend/dynamic-table/components/GroupHeaderRow.js +108 -0
- package/dist/backend/dynamic-table/components/GroupHeaderRow.js.map +7 -0
- package/dist/backend/dynamic-table/components/GroupSummaryRow.js +134 -0
- package/dist/backend/dynamic-table/components/GroupSummaryRow.js.map +7 -0
- package/dist/backend/dynamic-table/components/ImportPanel.js +341 -0
- package/dist/backend/dynamic-table/components/ImportPanel.js.map +7 -0
- package/dist/backend/dynamic-table/components/ImportPreviewGrid.js +114 -0
- package/dist/backend/dynamic-table/components/ImportPreviewGrid.js.map +7 -0
- package/dist/backend/dynamic-table/components/LoadErrorState.js +23 -0
- package/dist/backend/dynamic-table/components/LoadErrorState.js.map +7 -0
- package/dist/backend/dynamic-table/components/MentionPopup.js +149 -0
- package/dist/backend/dynamic-table/components/MentionPopup.js.map +7 -0
- package/dist/backend/dynamic-table/components/PerspectiveDeleteDialog.js +57 -0
- package/dist/backend/dynamic-table/components/PerspectiveDeleteDialog.js.map +7 -0
- package/dist/backend/dynamic-table/components/PerspectivePublishDialog.js +100 -0
- package/dist/backend/dynamic-table/components/PerspectivePublishDialog.js.map +7 -0
- package/dist/backend/dynamic-table/components/PerspectiveTabMenu.js +159 -0
- package/dist/backend/dynamic-table/components/PerspectiveTabMenu.js.map +7 -0
- package/dist/backend/dynamic-table/components/PerspectiveTabs.js +319 -0
- package/dist/backend/dynamic-table/components/PerspectiveTabs.js.map +7 -0
- package/dist/backend/dynamic-table/components/PerspectiveTemplateMenu.js +90 -0
- package/dist/backend/dynamic-table/components/PerspectiveTemplateMenu.js.map +7 -0
- package/dist/backend/dynamic-table/components/RowHeaderCell.js +58 -0
- package/dist/backend/dynamic-table/components/RowHeaderCell.js.map +7 -0
- package/dist/backend/dynamic-table/components/SearchBar.js +221 -0
- package/dist/backend/dynamic-table/components/SearchBar.js.map +7 -0
- package/dist/backend/dynamic-table/components/SelectMenu.js +186 -0
- package/dist/backend/dynamic-table/components/SelectMenu.js.map +7 -0
- package/dist/backend/dynamic-table/components/StaleDataBar.js +26 -0
- package/dist/backend/dynamic-table/components/StaleDataBar.js.map +7 -0
- package/dist/backend/dynamic-table/components/TableDeleteDialog.js +48 -0
- package/dist/backend/dynamic-table/components/TableDeleteDialog.js.map +7 -0
- package/dist/backend/dynamic-table/components/TablePagination.js +69 -0
- package/dist/backend/dynamic-table/components/TablePagination.js.map +7 -0
- package/dist/backend/dynamic-table/components/TableSkeleton.js +43 -0
- package/dist/backend/dynamic-table/components/TableSkeleton.js.map +7 -0
- package/dist/backend/dynamic-table/components/ToolbarOverflow.js +204 -0
- package/dist/backend/dynamic-table/components/ToolbarOverflow.js.map +7 -0
- package/dist/backend/dynamic-table/components/ViewModeSwitch.js +50 -0
- package/dist/backend/dynamic-table/components/ViewModeSwitch.js.map +7 -0
- package/dist/backend/dynamic-table/components/VirtualRow.js +214 -0
- package/dist/backend/dynamic-table/components/VirtualRow.js.map +7 -0
- package/dist/backend/dynamic-table/components/editors.js +1483 -0
- package/dist/backend/dynamic-table/components/editors.js.map +7 -0
- package/dist/backend/dynamic-table/components/renderers.js +131 -0
- package/dist/backend/dynamic-table/components/renderers.js.map +7 -0
- package/dist/backend/dynamic-table/events/events.js +73 -0
- package/dist/backend/dynamic-table/events/events.js.map +7 -0
- package/dist/backend/dynamic-table/formula/check.js +243 -0
- package/dist/backend/dynamic-table/formula/check.js.map +7 -0
- package/dist/backend/dynamic-table/formula/evaluate.js +302 -0
- package/dist/backend/dynamic-table/formula/evaluate.js.map +7 -0
- package/dist/backend/dynamic-table/formula/functions.js +602 -0
- package/dist/backend/dynamic-table/formula/functions.js.map +7 -0
- package/dist/backend/dynamic-table/formula/index.js +47 -0
- package/dist/backend/dynamic-table/formula/index.js.map +7 -0
- package/dist/backend/dynamic-table/formula/parse.js +293 -0
- package/dist/backend/dynamic-table/formula/parse.js.map +7 -0
- package/dist/backend/dynamic-table/formula/types.js +24 -0
- package/dist/backend/dynamic-table/formula/types.js.map +7 -0
- package/dist/backend/dynamic-table/handlers/cellWrites.js +143 -0
- package/dist/backend/dynamic-table/handlers/cellWrites.js.map +7 -0
- package/dist/backend/dynamic-table/handlers/index.js +504 -0
- package/dist/backend/dynamic-table/handlers/index.js.map +7 -0
- package/dist/backend/dynamic-table/handlers/perspectiveHandlers.js +377 -0
- package/dist/backend/dynamic-table/handlers/perspectiveHandlers.js.map +7 -0
- package/dist/backend/dynamic-table/hooks/index.js +524 -0
- package/dist/backend/dynamic-table/hooks/index.js.map +7 -0
- package/dist/backend/dynamic-table/hooks/useAbbreviations.js +19 -0
- package/dist/backend/dynamic-table/hooks/useAbbreviations.js.map +7 -0
- package/dist/backend/dynamic-table/hooks/useAnnotations.js +115 -0
- package/dist/backend/dynamic-table/hooks/useAnnotations.js.map +7 -0
- package/dist/backend/dynamic-table/hooks/useColumnVirtualizer.js +155 -0
- package/dist/backend/dynamic-table/hooks/useColumnVirtualizer.js.map +7 -0
- package/dist/backend/dynamic-table/hooks/useColumnWidthPersistence.js +135 -0
- package/dist/backend/dynamic-table/hooks/useColumnWidthPersistence.js.map +7 -0
- package/dist/backend/dynamic-table/hooks/useDensityPreference.js +203 -0
- package/dist/backend/dynamic-table/hooks/useDensityPreference.js.map +7 -0
- package/dist/backend/dynamic-table/hooks/useDynamicTablePage.js +1005 -0
- package/dist/backend/dynamic-table/hooks/useDynamicTablePage.js.map +7 -0
- package/dist/backend/dynamic-table/hooks/useEscapeLayer.js +32 -0
- package/dist/backend/dynamic-table/hooks/useEscapeLayer.js.map +7 -0
- package/dist/backend/dynamic-table/hooks/useGrouping.js +256 -0
- package/dist/backend/dynamic-table/hooks/useGrouping.js.map +7 -0
- package/dist/backend/dynamic-table/hooks/useSuggestionFetch.js +63 -0
- package/dist/backend/dynamic-table/hooks/useSuggestionFetch.js.map +7 -0
- package/dist/backend/dynamic-table/hooks/useTableDateFormat.js +11 -0
- package/dist/backend/dynamic-table/hooks/useTableDateFormat.js.map +7 -0
- package/dist/backend/dynamic-table/index.js +476 -0
- package/dist/backend/dynamic-table/index.js.map +7 -0
- package/dist/backend/dynamic-table/registry/ContentRegistryContext.js +126 -0
- package/dist/backend/dynamic-table/registry/ContentRegistryContext.js.map +7 -0
- package/dist/backend/dynamic-table/registry/TableRegistryContext.js +43 -0
- package/dist/backend/dynamic-table/registry/TableRegistryContext.js.map +7 -0
- package/dist/backend/dynamic-table/registry/filterAccessibleTables.js +13 -0
- package/dist/backend/dynamic-table/registry/filterAccessibleTables.js.map +7 -0
- package/dist/backend/dynamic-table/registry/index.js +44 -0
- package/dist/backend/dynamic-table/registry/index.js.map +7 -0
- package/dist/backend/dynamic-table/registry/lazyTable.js +55 -0
- package/dist/backend/dynamic-table/registry/lazyTable.js.map +7 -0
- package/dist/backend/dynamic-table/registry/types.js +1 -0
- package/dist/backend/dynamic-table/registry/types.js.map +7 -0
- package/dist/backend/dynamic-table/registry/widgetCatalog.js +96 -0
- package/dist/backend/dynamic-table/registry/widgetCatalog.js.map +7 -0
- package/dist/backend/dynamic-table/server/aggregate.js +261 -0
- package/dist/backend/dynamic-table/server/aggregate.js.map +7 -0
- package/dist/backend/dynamic-table/server/dateWindows.js +105 -0
- package/dist/backend/dynamic-table/server/dateWindows.js.map +7 -0
- package/dist/backend/dynamic-table/server/filterParser.js +97 -0
- package/dist/backend/dynamic-table/server/filterParser.js.map +7 -0
- package/dist/backend/dynamic-table/server/filterSuggestions.js +70 -0
- package/dist/backend/dynamic-table/server/filterSuggestions.js.map +7 -0
- package/dist/backend/dynamic-table/server/index.js +47 -0
- package/dist/backend/dynamic-table/server/index.js.map +7 -0
- package/dist/backend/dynamic-table/server/makeDynamicTableRoute.js +270 -0
- package/dist/backend/dynamic-table/server/makeDynamicTableRoute.js.map +7 -0
- package/dist/backend/dynamic-table/split-view/ContentPicker.js +171 -0
- package/dist/backend/dynamic-table/split-view/ContentPicker.js.map +7 -0
- package/dist/backend/dynamic-table/split-view/EmptySlot.js +47 -0
- package/dist/backend/dynamic-table/split-view/EmptySlot.js.map +7 -0
- package/dist/backend/dynamic-table/split-view/SplitViewHost.js +863 -0
- package/dist/backend/dynamic-table/split-view/SplitViewHost.js.map +7 -0
- package/dist/backend/dynamic-table/split-view/WidgetPane.js +280 -0
- package/dist/backend/dynamic-table/split-view/WidgetPane.js.map +7 -0
- package/dist/backend/dynamic-table/split-view/WorkspaceFilterBar.js +524 -0
- package/dist/backend/dynamic-table/split-view/WorkspaceFilterBar.js.map +7 -0
- package/dist/backend/dynamic-table/split-view/index.js +61 -0
- package/dist/backend/dynamic-table/split-view/index.js.map +7 -0
- package/dist/backend/dynamic-table/split-view/layoutPersistence.js +91 -0
- package/dist/backend/dynamic-table/split-view/layoutPersistence.js.map +7 -0
- package/dist/backend/dynamic-table/split-view/sharedCriteria.js +62 -0
- package/dist/backend/dynamic-table/split-view/sharedCriteria.js.map +7 -0
- package/dist/backend/dynamic-table/split-view/types.js +426 -0
- package/dist/backend/dynamic-table/split-view/types.js.map +7 -0
- package/dist/backend/dynamic-table/split-view/useSplitViewLayouts.js +79 -0
- package/dist/backend/dynamic-table/split-view/useSplitViewLayouts.js.map +7 -0
- package/dist/backend/dynamic-table/store/index.js +611 -0
- package/dist/backend/dynamic-table/store/index.js.map +7 -0
- package/dist/backend/dynamic-table/styles/ContextMenu.css.js +2 -0
- package/dist/backend/dynamic-table/styles/DynamicTable.css.js +2 -0
- package/dist/backend/dynamic-table/styles/DynamicTable.v2.css.js +2 -0
- package/dist/backend/dynamic-table/styles/SearchBar.css.js +2 -0
- package/dist/backend/dynamic-table/styles/dateCell.css.js +2 -0
- package/dist/backend/dynamic-table/styles/density.css.js +2 -0
- package/dist/backend/dynamic-table/types/density.js +29 -0
- package/dist/backend/dynamic-table/types/density.js.map +7 -0
- package/dist/backend/dynamic-table/types/filters.js +124 -0
- package/dist/backend/dynamic-table/types/filters.js.map +7 -0
- package/dist/backend/dynamic-table/types/grouping.js +34 -0
- package/dist/backend/dynamic-table/types/grouping.js.map +7 -0
- package/dist/backend/dynamic-table/types/import.js +7 -0
- package/dist/backend/dynamic-table/types/import.js.map +7 -0
- package/dist/backend/dynamic-table/types/index.js +46 -0
- package/dist/backend/dynamic-table/types/index.js.map +7 -0
- package/dist/backend/dynamic-table/types/perspective.js +79 -0
- package/dist/backend/dynamic-table/types/perspective.js.map +7 -0
- package/dist/backend/dynamic-table/types/rollup.js +13 -0
- package/dist/backend/dynamic-table/types/rollup.js.map +7 -0
- package/dist/backend/dynamic-table/utils/abbreviations.js +228 -0
- package/dist/backend/dynamic-table/utils/abbreviations.js.map +7 -0
- package/dist/backend/dynamic-table/utils/anchoredPosition.js +21 -0
- package/dist/backend/dynamic-table/utils/anchoredPosition.js.map +7 -0
- package/dist/backend/dynamic-table/utils/badgeAutoFit.js +35 -0
- package/dist/backend/dynamic-table/utils/badgeAutoFit.js.map +7 -0
- package/dist/backend/dynamic-table/utils/clipboard.js +172 -0
- package/dist/backend/dynamic-table/utils/clipboard.js.map +7 -0
- package/dist/backend/dynamic-table/utils/coerceCellValue.js +52 -0
- package/dist/backend/dynamic-table/utils/coerceCellValue.js.map +7 -0
- package/dist/backend/dynamic-table/utils/colorAdjacency.js +27 -0
- package/dist/backend/dynamic-table/utils/colorAdjacency.js.map +7 -0
- package/dist/backend/dynamic-table/utils/columnFill.js +36 -0
- package/dist/backend/dynamic-table/utils/columnFill.js.map +7 -0
- package/dist/backend/dynamic-table/utils/columnSpacerStyle.js +21 -0
- package/dist/backend/dynamic-table/utils/columnSpacerStyle.js.map +7 -0
- package/dist/backend/dynamic-table/utils/columnWindow.js +293 -0
- package/dist/backend/dynamic-table/utils/columnWindow.js.map +7 -0
- package/dist/backend/dynamic-table/utils/conditionalFormat.js +188 -0
- package/dist/backend/dynamic-table/utils/conditionalFormat.js.map +7 -0
- package/dist/backend/dynamic-table/utils/exportTable.js +82 -0
- package/dist/backend/dynamic-table/utils/exportTable.js.map +7 -0
- package/dist/backend/dynamic-table/utils/fillGeometry.js +92 -0
- package/dist/backend/dynamic-table/utils/fillGeometry.js.map +7 -0
- package/dist/backend/dynamic-table/utils/fillPatterns.js +241 -0
- package/dist/backend/dynamic-table/utils/fillPatterns.js.map +7 -0
- package/dist/backend/dynamic-table/utils/formatAggregate.js +82 -0
- package/dist/backend/dynamic-table/utils/formatAggregate.js.map +7 -0
- package/dist/backend/dynamic-table/utils/formatDateCompact.js +508 -0
- package/dist/backend/dynamic-table/utils/formatDateCompact.js.map +7 -0
- package/dist/backend/dynamic-table/utils/formatLabelCompact.js +312 -0
- package/dist/backend/dynamic-table/utils/formatLabelCompact.js.map +7 -0
- package/dist/backend/dynamic-table/utils/formulaColumns.js +158 -0
- package/dist/backend/dynamic-table/utils/formulaColumns.js.map +7 -0
- package/dist/backend/dynamic-table/utils/importMapping.js +118 -0
- package/dist/backend/dynamic-table/utils/importMapping.js.map +7 -0
- package/dist/backend/dynamic-table/utils/importParse.js +121 -0
- package/dist/backend/dynamic-table/utils/importParse.js.map +7 -0
- package/dist/backend/dynamic-table/utils/lookupColumns.js +28 -0
- package/dist/backend/dynamic-table/utils/lookupColumns.js.map +7 -0
- package/dist/backend/dynamic-table/utils/perspectiveTransforms.js +191 -0
- package/dist/backend/dynamic-table/utils/perspectiveTransforms.js.map +7 -0
- package/dist/backend/dynamic-table/utils/rollupColumns.js +81 -0
- package/dist/backend/dynamic-table/utils/rollupColumns.js.map +7 -0
- package/dist/backend/dynamic-table/validators/index.js +36 -0
- package/dist/backend/dynamic-table/validators/index.js.map +7 -0
- package/dist/backend/fields/registry.generated.js +8 -0
- package/dist/backend/fields/registry.generated.js.map +7 -0
- package/dist/backend/fields/registry.js +29 -0
- package/dist/backend/fields/registry.js.map +7 -0
- package/dist/backend/filters/AdvancedFilterBuilder.js +280 -0
- package/dist/backend/filters/AdvancedFilterBuilder.js.map +7 -0
- package/dist/backend/forms/ActionsDropdown.js +160 -0
- package/dist/backend/forms/ActionsDropdown.js.map +7 -0
- package/dist/backend/forms/FormActionButtons.js +59 -0
- package/dist/backend/forms/FormActionButtons.js.map +7 -0
- package/dist/backend/forms/FormFooter.js +18 -0
- package/dist/backend/forms/FormFooter.js.map +7 -0
- package/dist/backend/forms/FormHeader.js +125 -0
- package/dist/backend/forms/FormHeader.js.map +7 -0
- package/dist/backend/forms/index.js +11 -0
- package/dist/backend/forms/index.js.map +7 -0
- package/dist/backend/hooks/useAdvancedFilter.js +64 -0
- package/dist/backend/hooks/useAdvancedFilter.js.map +7 -0
- package/dist/backend/indexes/PartialIndexBanner.js +74 -0
- package/dist/backend/indexes/PartialIndexBanner.js.map +7 -0
- package/dist/backend/indexes/store.js +62 -0
- package/dist/backend/indexes/store.js.map +7 -0
- package/dist/backend/injection/ComponentOverrideProvider.js +55 -0
- package/dist/backend/injection/ComponentOverrideProvider.js.map +7 -0
- package/dist/backend/injection/InjectedField.js +166 -0
- package/dist/backend/injection/InjectedField.js.map +7 -0
- package/dist/backend/injection/InjectionSpot.js +323 -0
- package/dist/backend/injection/InjectionSpot.js.map +7 -0
- package/dist/backend/injection/InjectionWizard.js +256 -0
- package/dist/backend/injection/InjectionWizard.js.map +7 -0
- package/dist/backend/injection/PageInjectionBoundary.js +26 -0
- package/dist/backend/injection/PageInjectionBoundary.js.map +7 -0
- package/dist/backend/injection/SseEventIndicator.js +8 -0
- package/dist/backend/injection/SseEventIndicator.js.map +7 -0
- package/dist/backend/injection/StatusBadgeInjectionSpot.js +34 -0
- package/dist/backend/injection/StatusBadgeInjectionSpot.js.map +7 -0
- package/dist/backend/injection/StatusBadgeRenderer.js +58 -0
- package/dist/backend/injection/StatusBadgeRenderer.js.map +7 -0
- package/dist/backend/injection/WidgetSharedState.js +49 -0
- package/dist/backend/injection/WidgetSharedState.js.map +7 -0
- package/dist/backend/injection/WizardInjectionSpot.js +30 -0
- package/dist/backend/injection/WizardInjectionSpot.js.map +7 -0
- package/dist/backend/injection/eventBridge.js +129 -0
- package/dist/backend/injection/eventBridge.js.map +7 -0
- package/dist/backend/injection/helpers.js +26 -0
- package/dist/backend/injection/helpers.js.map +7 -0
- package/dist/backend/injection/mergeMenuItems.js +49 -0
- package/dist/backend/injection/mergeMenuItems.js.map +7 -0
- package/dist/backend/injection/mutationEvents.js +20 -0
- package/dist/backend/injection/mutationEvents.js.map +7 -0
- package/dist/backend/injection/resolveInjectedIcon.js +23 -0
- package/dist/backend/injection/resolveInjectedIcon.js.map +7 -0
- package/dist/backend/injection/spotIds.js +72 -0
- package/dist/backend/injection/spotIds.js.map +7 -0
- package/dist/backend/injection/useAppEvent.js +35 -0
- package/dist/backend/injection/useAppEvent.js.map +7 -0
- package/dist/backend/injection/useGuardedMutation.js +71 -0
- package/dist/backend/injection/useGuardedMutation.js.map +7 -0
- package/dist/backend/injection/useInjectedMenuItems.js +49 -0
- package/dist/backend/injection/useInjectedMenuItems.js.map +7 -0
- package/dist/backend/injection/useInjectionDataWidgets.js +36 -0
- package/dist/backend/injection/useInjectionDataWidgets.js.map +7 -0
- package/dist/backend/injection/useOperationProgress.js +64 -0
- package/dist/backend/injection/useOperationProgress.js.map +7 -0
- package/dist/backend/injection/useRegisteredComponent.js +89 -0
- package/dist/backend/injection/useRegisteredComponent.js.map +7 -0
- package/dist/backend/injection/useWidgetSharedState.js +26 -0
- package/dist/backend/injection/useWidgetSharedState.js.map +7 -0
- package/dist/backend/injection/visibility-utils.js +29 -0
- package/dist/backend/injection/visibility-utils.js.map +7 -0
- package/dist/backend/injection/widgetRegistry.js +55 -0
- package/dist/backend/injection/widgetRegistry.js.map +7 -0
- package/dist/backend/inputs/ComboboxInput.js +228 -0
- package/dist/backend/inputs/ComboboxInput.js.map +7 -0
- package/dist/backend/inputs/DatePicker.js +148 -0
- package/dist/backend/inputs/DatePicker.js.map +7 -0
- package/dist/backend/inputs/DateTimePicker.js +188 -0
- package/dist/backend/inputs/DateTimePicker.js.map +7 -0
- package/dist/backend/inputs/EventPatternInput.js +38 -0
- package/dist/backend/inputs/EventPatternInput.js.map +7 -0
- package/dist/backend/inputs/EventSelect.js +115 -0
- package/dist/backend/inputs/EventSelect.js.map +7 -0
- package/dist/backend/inputs/LookupSelect.js +197 -0
- package/dist/backend/inputs/LookupSelect.js.map +7 -0
- package/dist/backend/inputs/PhoneNumberField.js +133 -0
- package/dist/backend/inputs/PhoneNumberField.js.map +7 -0
- package/dist/backend/inputs/SwitchableMarkdownInput.js +73 -0
- package/dist/backend/inputs/SwitchableMarkdownInput.js.map +7 -0
- package/dist/backend/inputs/TagsInput.js +258 -0
- package/dist/backend/inputs/TagsInput.js.map +7 -0
- package/dist/backend/inputs/TimeInput.js +132 -0
- package/dist/backend/inputs/TimeInput.js.map +7 -0
- package/dist/backend/inputs/TimePicker.js +105 -0
- package/dist/backend/inputs/TimePicker.js.map +7 -0
- package/dist/backend/inputs/index.js +12 -0
- package/dist/backend/inputs/index.js.map +7 -0
- package/dist/backend/markdown/MarkdownContent.js +20 -0
- package/dist/backend/markdown/MarkdownContent.js.map +7 -0
- package/dist/backend/markdown/index.js +3 -0
- package/dist/backend/markdown/index.js.map +7 -0
- package/dist/backend/markdown/useMarkdownRemarkPlugins.js +33 -0
- package/dist/backend/markdown/useMarkdownRemarkPlugins.js.map +7 -0
- package/dist/backend/messages/MessageComposer.js +158 -0
- package/dist/backend/messages/MessageComposer.js.map +7 -0
- package/dist/backend/messages/MessageObjectDetail.js +81 -0
- package/dist/backend/messages/MessageObjectDetail.js.map +7 -0
- package/dist/backend/messages/MessageObjectPreview.js +48 -0
- package/dist/backend/messages/MessageObjectPreview.js.map +7 -0
- package/dist/backend/messages/MessageObjectRecordPicker.js +89 -0
- package/dist/backend/messages/MessageObjectRecordPicker.js.map +7 -0
- package/dist/backend/messages/MessagePrioritySelector.js +74 -0
- package/dist/backend/messages/MessagePrioritySelector.js.map +7 -0
- package/dist/backend/messages/MessagesIcon.js +22 -0
- package/dist/backend/messages/MessagesIcon.js.map +7 -0
- package/dist/backend/messages/SendObjectMessageDialog.js +65 -0
- package/dist/backend/messages/SendObjectMessageDialog.js.map +7 -0
- package/dist/backend/messages/index.js +17 -0
- package/dist/backend/messages/index.js.map +7 -0
- package/dist/backend/messages/message-compose-form-groups.js +333 -0
- package/dist/backend/messages/message-compose-form-groups.js.map +7 -0
- package/dist/backend/messages/message-composer.types.js +1 -0
- package/dist/backend/messages/message-composer.types.js.map +7 -0
- package/dist/backend/messages/message-priority.js +40 -0
- package/dist/backend/messages/message-priority.js.map +7 -0
- package/dist/backend/messages/useMessageCompose.js +488 -0
- package/dist/backend/messages/useMessageCompose.js.map +7 -0
- package/dist/backend/messages/useMessageComposeOperations.js +163 -0
- package/dist/backend/messages/useMessageComposeOperations.js.map +7 -0
- package/dist/backend/messages/useMessagesPoll.js +79 -0
- package/dist/backend/messages/useMessagesPoll.js.map +7 -0
- package/dist/backend/notifications/NotificationBell.js +83 -0
- package/dist/backend/notifications/NotificationBell.js.map +7 -0
- package/dist/backend/notifications/NotificationCountBadge.js +9 -0
- package/dist/backend/notifications/NotificationCountBadge.js.map +7 -0
- package/dist/backend/notifications/NotificationDispatcher.js +165 -0
- package/dist/backend/notifications/NotificationDispatcher.js.map +7 -0
- package/dist/backend/notifications/NotificationItem.js +187 -0
- package/dist/backend/notifications/NotificationItem.js.map +7 -0
- package/dist/backend/notifications/NotificationPanel.js +146 -0
- package/dist/backend/notifications/NotificationPanel.js.map +7 -0
- package/dist/backend/notifications/index.js +19 -0
- package/dist/backend/notifications/index.js.map +7 -0
- package/dist/backend/notifications/useNotificationActions.js +124 -0
- package/dist/backend/notifications/useNotificationActions.js.map +7 -0
- package/dist/backend/notifications/useNotificationEffect.js +13 -0
- package/dist/backend/notifications/useNotificationEffect.js.map +7 -0
- package/dist/backend/notifications/useNotifications.js +11 -0
- package/dist/backend/notifications/useNotifications.js.map +7 -0
- package/dist/backend/notifications/useNotificationsPoll.js +135 -0
- package/dist/backend/notifications/useNotificationsPoll.js.map +7 -0
- package/dist/backend/notifications/useNotificationsSse.js +173 -0
- package/dist/backend/notifications/useNotificationsSse.js.map +7 -0
- package/dist/backend/operations/LastOperationBanner.js +80 -0
- package/dist/backend/operations/LastOperationBanner.js.map +7 -0
- package/dist/backend/operations/store.js +183 -0
- package/dist/backend/operations/store.js.map +7 -0
- package/dist/backend/progress/ProgressTopBar.js +129 -0
- package/dist/backend/progress/ProgressTopBar.js.map +7 -0
- package/dist/backend/progress/useProgress.js +11 -0
- package/dist/backend/progress/useProgress.js.map +7 -0
- package/dist/backend/progress/useProgressPoll.js +69 -0
- package/dist/backend/progress/useProgressPoll.js.map +7 -0
- package/dist/backend/progress/useProgressSse.js +104 -0
- package/dist/backend/progress/useProgressSse.js.map +7 -0
- package/dist/backend/schedule/ScheduleAgenda.js +107 -0
- package/dist/backend/schedule/ScheduleAgenda.js.map +7 -0
- package/dist/backend/schedule/ScheduleGrid.js +107 -0
- package/dist/backend/schedule/ScheduleGrid.js.map +7 -0
- package/dist/backend/schedule/ScheduleToolbar.js +166 -0
- package/dist/backend/schedule/ScheduleToolbar.js.map +7 -0
- package/dist/backend/schedule/ScheduleView.js +168 -0
- package/dist/backend/schedule/ScheduleView.js.map +7 -0
- package/dist/backend/schedule/index.js +6 -0
- package/dist/backend/schedule/index.js.map +7 -0
- package/dist/backend/schedule/recurrence.js +83 -0
- package/dist/backend/schedule/recurrence.js.map +7 -0
- package/dist/backend/schedule/types.js +1 -0
- package/dist/backend/schedule/types.js.map +7 -0
- package/dist/backend/section-page/SectionNav.js +104 -0
- package/dist/backend/section-page/SectionNav.js.map +7 -0
- package/dist/backend/section-page/SectionPage.js +33 -0
- package/dist/backend/section-page/SectionPage.js.map +7 -0
- package/dist/backend/section-page/index.js +7 -0
- package/dist/backend/section-page/index.js.map +7 -0
- package/dist/backend/section-page/types.js +1 -0
- package/dist/backend/section-page/types.js.map +7 -0
- package/dist/backend/settings/SettingsNavigation.js +43 -0
- package/dist/backend/settings/SettingsNavigation.js.map +7 -0
- package/dist/backend/settings/SettingsPageWrapper.js +66 -0
- package/dist/backend/settings/SettingsPageWrapper.js.map +7 -0
- package/dist/backend/settings/index.js +6 -0
- package/dist/backend/settings/index.js.map +7 -0
- package/dist/backend/upgrades/UpgradeActionBanner.js +91 -0
- package/dist/backend/upgrades/UpgradeActionBanner.js.map +7 -0
- package/dist/backend/utils/api.js +178 -0
- package/dist/backend/utils/api.js.map +7 -0
- package/dist/backend/utils/apiCall.js +68 -0
- package/dist/backend/utils/apiCall.js.map +7 -0
- package/dist/backend/utils/crud.js +126 -0
- package/dist/backend/utils/crud.js.map +7 -0
- package/dist/backend/utils/customFieldColumns.js +100 -0
- package/dist/backend/utils/customFieldColumns.js.map +7 -0
- package/dist/backend/utils/customFieldDefs.js +143 -0
- package/dist/backend/utils/customFieldDefs.js.map +7 -0
- package/dist/backend/utils/customFieldFilters.js +151 -0
- package/dist/backend/utils/customFieldFilters.js.map +7 -0
- package/dist/backend/utils/customFieldForms.js +169 -0
- package/dist/backend/utils/customFieldForms.js.map +7 -0
- package/dist/backend/utils/customFieldRelationDisplay.js +239 -0
- package/dist/backend/utils/customFieldRelationDisplay.js.map +7 -0
- package/dist/backend/utils/customFieldValues.js +26 -0
- package/dist/backend/utils/customFieldValues.js.map +7 -0
- package/dist/backend/utils/flash.js +16 -0
- package/dist/backend/utils/flash.js.map +7 -0
- package/dist/backend/utils/nav.js +280 -0
- package/dist/backend/utils/nav.js.map +7 -0
- package/dist/backend/utils/richTextSanitizer.js +11 -0
- package/dist/backend/utils/richTextSanitizer.js.map +7 -0
- package/dist/backend/utils/scopedHeaderStack.js +44 -0
- package/dist/backend/utils/scopedHeaderStack.js.map +7 -0
- package/dist/backend/utils/serverErrors.js +237 -0
- package/dist/backend/utils/serverErrors.js.map +7 -0
- package/dist/backend/utils/useAutoDiscoveredFields.js +96 -0
- package/dist/backend/utils/useAutoDiscoveredFields.js.map +7 -0
- package/dist/backend/version-history/VersionHistoryAction.js +67 -0
- package/dist/backend/version-history/VersionHistoryAction.js.map +7 -0
- package/dist/backend/version-history/VersionHistoryDetail.js +57 -0
- package/dist/backend/version-history/VersionHistoryDetail.js.map +7 -0
- package/dist/backend/version-history/VersionHistoryPanel.js +270 -0
- package/dist/backend/version-history/VersionHistoryPanel.js.map +7 -0
- package/dist/backend/version-history/index.js +13 -0
- package/dist/backend/version-history/index.js.map +7 -0
- package/dist/backend/version-history/labels.js +52 -0
- package/dist/backend/version-history/labels.js.map +7 -0
- package/dist/backend/version-history/types.js +1 -0
- package/dist/backend/version-history/types.js.map +7 -0
- package/dist/backend/version-history/useAuditPermissions.js +72 -0
- package/dist/backend/version-history/useAuditPermissions.js.map +7 -0
- package/dist/backend/version-history/useVersionHistory.js +141 -0
- package/dist/backend/version-history/useVersionHistory.js.map +7 -0
- package/dist/backend/views/NewViewForm.js +56 -0
- package/dist/backend/views/NewViewForm.js.map +7 -0
- package/dist/backend/views/ShareForm.js +49 -0
- package/dist/backend/views/ShareForm.js.map +7 -0
- package/dist/backend/views/ViewChip.js +112 -0
- package/dist/backend/views/ViewChip.js.map +7 -0
- package/dist/backend/views/ViewChipMenu.js +89 -0
- package/dist/backend/views/ViewChipMenu.js.map +7 -0
- package/dist/backend/views/types.js +1 -0
- package/dist/backend/views/types.js.map +7 -0
- package/dist/frontend/AuthFooter.js +23 -0
- package/dist/frontend/AuthFooter.js.map +7 -0
- package/dist/frontend/LanguageSwitcher.js +57 -0
- package/dist/frontend/LanguageSwitcher.js.map +7 -0
- package/dist/frontend/Layout.js +14 -0
- package/dist/frontend/Layout.js.map +7 -0
- package/dist/hooks/useIsMobile.js +21 -0
- package/dist/hooks/useIsMobile.js.map +7 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +7 -0
- package/dist/portal/PortalContext.js +113 -0
- package/dist/portal/PortalContext.js.map +7 -0
- package/dist/portal/PortalLayoutProvider.js +5 -0
- package/dist/portal/PortalLayoutProvider.js.map +7 -0
- package/dist/portal/PortalLayoutShell.js +44 -0
- package/dist/portal/PortalLayoutShell.js.map +7 -0
- package/dist/portal/PortalShell.js +229 -0
- package/dist/portal/PortalShell.js.map +7 -0
- package/dist/portal/components/PortalCard.js +31 -0
- package/dist/portal/components/PortalCard.js.map +7 -0
- package/dist/portal/components/PortalEmptyState.js +16 -0
- package/dist/portal/components/PortalEmptyState.js.map +7 -0
- package/dist/portal/components/PortalFeatureCard.js +21 -0
- package/dist/portal/components/PortalFeatureCard.js.map +7 -0
- package/dist/portal/components/PortalNotificationBell.js +67 -0
- package/dist/portal/components/PortalNotificationBell.js.map +7 -0
- package/dist/portal/components/PortalNotificationPanel.js +158 -0
- package/dist/portal/components/PortalNotificationPanel.js.map +7 -0
- package/dist/portal/components/PortalPageHeader.js +16 -0
- package/dist/portal/components/PortalPageHeader.js.map +7 -0
- package/dist/portal/components/index.js +18 -0
- package/dist/portal/components/index.js.map +7 -0
- package/dist/portal/hooks/useCustomerAuth.js +69 -0
- package/dist/portal/hooks/useCustomerAuth.js.map +7 -0
- package/dist/portal/hooks/usePortalAppEvent.js +26 -0
- package/dist/portal/hooks/usePortalAppEvent.js.map +7 -0
- package/dist/portal/hooks/usePortalDashboardWidgets.js +37 -0
- package/dist/portal/hooks/usePortalDashboardWidgets.js.map +7 -0
- package/dist/portal/hooks/usePortalEventBridge.js +129 -0
- package/dist/portal/hooks/usePortalEventBridge.js.map +7 -0
- package/dist/portal/hooks/usePortalInjectedMenuItems.js +88 -0
- package/dist/portal/hooks/usePortalInjectedMenuItems.js.map +7 -0
- package/dist/portal/hooks/usePortalNotifications.js +85 -0
- package/dist/portal/hooks/usePortalNotifications.js.map +7 -0
- package/dist/portal/hooks/useTenantContext.js +53 -0
- package/dist/portal/hooks/useTenantContext.js.map +7 -0
- package/dist/primitives/DataLoader.js +68 -0
- package/dist/primitives/DataLoader.js.map +7 -0
- package/dist/primitives/ErrorNotice.js +14 -0
- package/dist/primitives/ErrorNotice.js.map +7 -0
- package/dist/primitives/Notice.js +55 -0
- package/dist/primitives/Notice.js.map +7 -0
- package/dist/primitives/alert.js +38 -0
- package/dist/primitives/alert.js.map +7 -0
- package/dist/primitives/badge.js +33 -0
- package/dist/primitives/badge.js.map +7 -0
- package/dist/primitives/button.js +45 -0
- package/dist/primitives/button.js.map +7 -0
- package/dist/primitives/calendar.js +62 -0
- package/dist/primitives/calendar.js.map +7 -0
- package/dist/primitives/card.js +91 -0
- package/dist/primitives/card.js.map +7 -0
- package/dist/primitives/checkbox.js +28 -0
- package/dist/primitives/checkbox.js.map +7 -0
- package/dist/primitives/dialog.js +101 -0
- package/dist/primitives/dialog.js.map +7 -0
- package/dist/primitives/form-field.js +78 -0
- package/dist/primitives/form-field.js.map +7 -0
- package/dist/primitives/icon-button.js +40 -0
- package/dist/primitives/icon-button.js.map +7 -0
- package/dist/primitives/input.js +22 -0
- package/dist/primitives/input.js.map +7 -0
- package/dist/primitives/label.js +21 -0
- package/dist/primitives/label.js.map +7 -0
- package/dist/primitives/popover.js +36 -0
- package/dist/primitives/popover.js.map +7 -0
- package/dist/primitives/primitives.stories.js +187 -0
- package/dist/primitives/primitives.stories.js.map +7 -0
- package/dist/primitives/progress.js +28 -0
- package/dist/primitives/progress.js.map +7 -0
- package/dist/primitives/separator.js +9 -0
- package/dist/primitives/separator.js.map +7 -0
- package/dist/primitives/sheet.js +103 -0
- package/dist/primitives/sheet.js.map +7 -0
- package/dist/primitives/spinner.js +24 -0
- package/dist/primitives/spinner.js.map +7 -0
- package/dist/primitives/status-badge.js +38 -0
- package/dist/primitives/status-badge.js.map +7 -0
- package/dist/primitives/switch.js +80 -0
- package/dist/primitives/switch.js.map +7 -0
- package/dist/primitives/table.js +29 -0
- package/dist/primitives/table.js.map +7 -0
- package/dist/primitives/tabs.js +90 -0
- package/dist/primitives/tabs.js.map +7 -0
- package/dist/primitives/textarea.js +21 -0
- package/dist/primitives/textarea.js.map +7 -0
- package/dist/primitives/tooltip.js +60 -0
- package/dist/primitives/tooltip.js.map +7 -0
- package/dist/primitives-v2/Alert.js +69 -0
- package/dist/primitives-v2/Alert.js.map +7 -0
- package/dist/primitives-v2/Alert.stories.js +42 -0
- package/dist/primitives-v2/Alert.stories.js.map +7 -0
- package/dist/primitives-v2/Avatar.js +93 -0
- package/dist/primitives-v2/Avatar.js.map +7 -0
- package/dist/primitives-v2/Avatar.stories.js +57 -0
- package/dist/primitives-v2/Avatar.stories.js.map +7 -0
- package/dist/primitives-v2/Badge.js +50 -0
- package/dist/primitives-v2/Badge.js.map +7 -0
- package/dist/primitives-v2/Badge.stories.js +66 -0
- package/dist/primitives-v2/Badge.stories.js.map +7 -0
- package/dist/primitives-v2/Breadcrumb.js +53 -0
- package/dist/primitives-v2/Breadcrumb.js.map +7 -0
- package/dist/primitives-v2/Breadcrumb.stories.js +70 -0
- package/dist/primitives-v2/Breadcrumb.stories.js.map +7 -0
- package/dist/primitives-v2/Button.js +85 -0
- package/dist/primitives-v2/Button.js.map +7 -0
- package/dist/primitives-v2/Button.stories.js +48 -0
- package/dist/primitives-v2/Button.stories.js.map +7 -0
- package/dist/primitives-v2/Checkbox.js +65 -0
- package/dist/primitives-v2/Checkbox.js.map +7 -0
- package/dist/primitives-v2/Checkbox.stories.js +31 -0
- package/dist/primitives-v2/Checkbox.stories.js.map +7 -0
- package/dist/primitives-v2/IconButton.js +13 -0
- package/dist/primitives-v2/IconButton.js.map +7 -0
- package/dist/primitives-v2/IconButton.stories.js +37 -0
- package/dist/primitives-v2/IconButton.stories.js.map +7 -0
- package/dist/primitives-v2/Input.js +74 -0
- package/dist/primitives-v2/Input.js.map +7 -0
- package/dist/primitives-v2/Input.stories.js +56 -0
- package/dist/primitives-v2/Input.stories.js.map +7 -0
- package/dist/primitives-v2/NavGroup.js +54 -0
- package/dist/primitives-v2/NavGroup.js.map +7 -0
- package/dist/primitives-v2/NavGroup.stories.js +39 -0
- package/dist/primitives-v2/NavGroup.stories.js.map +7 -0
- package/dist/primitives-v2/NavItem.js +61 -0
- package/dist/primitives-v2/NavItem.js.map +7 -0
- package/dist/primitives-v2/NavItem.stories.js +56 -0
- package/dist/primitives-v2/NavItem.stories.js.map +7 -0
- package/dist/primitives-v2/SearchInput.js +93 -0
- package/dist/primitives-v2/SearchInput.js.map +7 -0
- package/dist/primitives-v2/SearchInput.stories.js +41 -0
- package/dist/primitives-v2/SearchInput.stories.js.map +7 -0
- package/dist/primitives-v2/Sidebar.js +48 -0
- package/dist/primitives-v2/Sidebar.js.map +7 -0
- package/dist/primitives-v2/Sidebar.stories.js +76 -0
- package/dist/primitives-v2/Sidebar.stories.js.map +7 -0
- package/dist/primitives-v2/Tab.js +78 -0
- package/dist/primitives-v2/Tab.js.map +7 -0
- package/dist/primitives-v2/Tab.stories.js +51 -0
- package/dist/primitives-v2/Tab.stories.js.map +7 -0
- package/dist/primitives-v2/Tag.js +61 -0
- package/dist/primitives-v2/Tag.js.map +7 -0
- package/dist/primitives-v2/Tag.stories.js +121 -0
- package/dist/primitives-v2/Tag.stories.js.map +7 -0
- package/dist/primitives-v2/Toggle.js +72 -0
- package/dist/primitives-v2/Toggle.js.map +7 -0
- package/dist/primitives-v2/Toggle.stories.js +34 -0
- package/dist/primitives-v2/Toggle.stories.js.map +7 -0
- package/dist/primitives-v2/Topbar.js +24 -0
- package/dist/primitives-v2/Topbar.js.map +7 -0
- package/dist/primitives-v2/Topbar.stories.js +58 -0
- package/dist/primitives-v2/Topbar.stories.js.map +7 -0
- package/dist/primitives-v2/index.js +41 -0
- package/dist/primitives-v2/index.js.map +7 -0
- package/dist/primitives-v2/utils.js +7 -0
- package/dist/primitives-v2/utils.js.map +7 -0
- package/dist/theme/BrandThemeProvider.js +49 -0
- package/dist/theme/BrandThemeProvider.js.map +7 -0
- package/dist/theme/QueryProvider.js +44 -0
- package/dist/theme/QueryProvider.js.map +7 -0
- package/dist/theme/ThemeProvider.js +96 -0
- package/dist/theme/ThemeProvider.js.map +7 -0
- package/dist/theme/ThemeToggle.js +88 -0
- package/dist/theme/ThemeToggle.js.map +7 -0
- package/dist/theme/index.js +12 -0
- package/dist/theme/index.js.map +7 -0
- package/dist/theme/m3.css.js +2 -0
- package/dist/theme/tokens.v2.css.js +2 -0
- package/dist/theme/typography.css.js +2 -0
- package/dist/theme/typography.stories.js +123 -0
- package/dist/theme/typography.stories.js.map +7 -0
- package/dist/theme/typography.tokens.js +281 -0
- package/dist/theme/typography.tokens.js.map +7 -0
- package/dist/types/react-big-calendar.d.js +1 -0
- package/dist/types/react-big-calendar.d.js.map +7 -0
- package/package.json +411 -0
- package/src/backend/AppShell.tsx +1606 -0
- package/src/backend/BackendChromeProvider.tsx +99 -0
- package/src/backend/BackendPageSurface.tsx +57 -0
- package/src/backend/CollapsibleNavSection.tsx +201 -0
- package/src/backend/ContextHelp.tsx +40 -0
- package/src/backend/CrudForm.tsx +3796 -0
- package/src/backend/DataTable.tsx +2584 -0
- package/src/backend/EmptyState.tsx +65 -0
- package/src/backend/FilterBar.tsx +171 -0
- package/src/backend/FilterOverlay.tsx +388 -0
- package/src/backend/FlashMessages.tsx +189 -0
- package/src/backend/HtmlRichTextEditor.tsx +124 -0
- package/src/backend/IntegrationsButton.tsx +29 -0
- package/src/backend/JsonBuilder.tsx +359 -0
- package/src/backend/JsonDisplay.tsx +258 -0
- package/src/backend/NextStepCallout.tsx +134 -0
- package/src/backend/Page.tsx +30 -0
- package/src/backend/PerspectiveSidebar.tsx +506 -0
- package/src/backend/ProfileDropdown.tsx +369 -0
- package/src/backend/RowActions.tsx +158 -0
- package/src/backend/SectionHeader.tsx +119 -0
- package/src/backend/SettingsButton.tsx +28 -0
- package/src/backend/Sidebar.stories.tsx +183 -0
- package/src/backend/Sidebar.tsx +737 -0
- package/src/backend/TruncatedCell.tsx +133 -0
- package/src/backend/UserMenu.tsx +153 -0
- package/src/backend/ValueIcons.tsx +48 -0
- package/src/backend/WebhookSetupGuide.tsx +127 -0
- package/src/backend/__tests__/AppShell.test.tsx +392 -0
- package/src/backend/__tests__/CrudForm.custom-fields.test.tsx +180 -0
- package/src/backend/__tests__/CrudForm.datetime.test.tsx +95 -0
- package/src/backend/__tests__/CrudForm.defaults.test.tsx +195 -0
- package/src/backend/__tests__/CrudForm.navigation.test.tsx +156 -0
- package/src/backend/__tests__/CrudForm.render.test.tsx +146 -0
- package/src/backend/__tests__/CrudForm.transformData.test.tsx +231 -0
- package/src/backend/__tests__/CrudForm.unsavedNavigation.test.tsx +145 -0
- package/src/backend/__tests__/CrudForm.validation.test.tsx +178 -0
- package/src/backend/__tests__/CustomDataSection.test.tsx +465 -0
- package/src/backend/__tests__/DataTable.extensions.test.tsx +339 -0
- package/src/backend/__tests__/DataTable.namespaces.test.ts +32 -0
- package/src/backend/__tests__/DataTable.render.test.tsx +48 -0
- package/src/backend/__tests__/FieldDefinitionsEditor.test.tsx +64 -0
- package/src/backend/__tests__/FlashMessages.test.tsx +105 -0
- package/src/backend/__tests__/FormHeader.test.tsx +81 -0
- package/src/backend/__tests__/NotificationDispatcher.test.ts +172 -0
- package/src/backend/__tests__/VersionHistoryPanel.test.tsx +109 -0
- package/src/backend/__tests__/component-replacement.test.tsx +270 -0
- package/src/backend/__tests__/custom-field-filters.test.ts +72 -0
- package/src/backend/__tests__/custom-field-forms.test.ts +54 -0
- package/src/backend/__tests__/nav-utils.test.ts +175 -0
- package/src/backend/__tests__/serverErrors.test.ts +83 -0
- package/src/backend/__tests__/useAuditPermissions.test.tsx +51 -0
- package/src/backend/__tests__/useNotifications.strategy.test.ts +58 -0
- package/src/backend/__tests__/useProgress.strategy.test.ts +62 -0
- package/src/backend/charts/BarChart.tsx +208 -0
- package/src/backend/charts/ChartUtils.tsx +196 -0
- package/src/backend/charts/ComboChart.stories.tsx +103 -0
- package/src/backend/charts/ComboChart.tsx +350 -0
- package/src/backend/charts/KpiCard.tsx +155 -0
- package/src/backend/charts/LineChart.tsx +207 -0
- package/src/backend/charts/PieChart.tsx +157 -0
- package/src/backend/charts/ScatterChart.tsx +498 -0
- package/src/backend/charts/TopNTable.tsx +141 -0
- package/src/backend/charts/WaterfallChart.tsx +213 -0
- package/src/backend/charts/index.ts +21 -0
- package/src/backend/columns/ColumnChooserPanel.tsx +293 -0
- package/src/backend/confirm-dialog/ConfirmDialog.tsx +275 -0
- package/src/backend/confirm-dialog/index.ts +7 -0
- package/src/backend/confirm-dialog/useConfirmDialog.tsx +146 -0
- package/src/backend/custom-fields/FieldDefinitionsEditor.tsx +1413 -0
- package/src/backend/custom-fields/FieldDefinitionsManager.tsx +381 -0
- package/src/backend/dashboard/DashboardScreen.tsx +706 -0
- package/src/backend/dashboard/__tests__/DashboardScreen.test.tsx +114 -0
- package/src/backend/dashboard/index.ts +1 -0
- package/src/backend/dashboard/widgetRegistry.ts +68 -0
- package/src/backend/date-range/DateRangeSelect.tsx +50 -0
- package/src/backend/date-range/InlineDateRangeSelect.tsx +52 -0
- package/src/backend/date-range/InlineGranularitySelect.tsx +63 -0
- package/src/backend/date-range/__tests__/dateRanges.test.ts +224 -0
- package/src/backend/date-range/dateRanges.ts +218 -0
- package/src/backend/date-range/index.ts +15 -0
- package/src/backend/detail/AccessDeniedMessage.tsx +32 -0
- package/src/backend/detail/ActivitiesSection.tsx +1261 -0
- package/src/backend/detail/AddressEditor.tsx +479 -0
- package/src/backend/detail/AddressTiles.tsx +591 -0
- package/src/backend/detail/AddressesSection.tsx +362 -0
- package/src/backend/detail/AttachmentDeleteDialog.tsx +56 -0
- package/src/backend/detail/AttachmentMetadataDialog.tsx +674 -0
- package/src/backend/detail/AttachmentVisualPreview.tsx +155 -0
- package/src/backend/detail/AttachmentsSection.tsx +327 -0
- package/src/backend/detail/CustomDataSection.tsx +700 -0
- package/src/backend/detail/DetailFieldsSection.tsx +163 -0
- package/src/backend/detail/ErrorMessage.tsx +32 -0
- package/src/backend/detail/InlineEditors.tsx +894 -0
- package/src/backend/detail/LoadingMessage.tsx +14 -0
- package/src/backend/detail/NotesSection.tsx +1266 -0
- package/src/backend/detail/TabEmptyState.tsx +48 -0
- package/src/backend/detail/TagsSection.tsx +470 -0
- package/src/backend/detail/__tests__/InlineEditors.test.tsx +59 -0
- package/src/backend/detail/addressFormat.tsx +121 -0
- package/src/backend/detail/index.ts +46 -0
- package/src/backend/devtools/UmesDevToolsPanel.tsx +122 -0
- package/src/backend/devtools/components/ConflictWarnings.tsx +36 -0
- package/src/backend/devtools/components/EnricherTiming.tsx +50 -0
- package/src/backend/devtools/components/EventFlow.tsx +45 -0
- package/src/backend/devtools/components/ExtensionPointList.tsx +59 -0
- package/src/backend/devtools/components/InterceptorActivity.tsx +48 -0
- package/src/backend/devtools/index.ts +2 -0
- package/src/backend/devtools/useUmesDevTools.ts +188 -0
- package/src/backend/document-viewer/RegionOverlay.tsx +150 -0
- package/src/backend/document-viewer/index.ts +2 -0
- package/src/backend/dynamic-grid/DynamicGrid.tsx +161 -0
- package/src/backend/dynamic-grid/adapters.ts +57 -0
- package/src/backend/dynamic-grid/components/GridCell.tsx +194 -0
- package/src/backend/dynamic-grid/components/GridRow.tsx +40 -0
- package/src/backend/dynamic-grid/hooks/useGridKeyboardNav.ts +134 -0
- package/src/backend/dynamic-grid/index.ts +4 -0
- package/src/backend/dynamic-grid/types.ts +55 -0
- package/src/backend/dynamic-table/DynamicTable.stories.tsx +274 -0
- package/src/backend/dynamic-table/DynamicTable.tsx +4419 -0
- package/src/backend/dynamic-table/README.md +1199 -0
- package/src/backend/dynamic-table/URL_FILTERING.md +217 -0
- package/src/backend/dynamic-table/__e2e__/GridHarness.ts +1155 -0
- package/src/backend/dynamic-table/__e2e__/SplitViewHarness.ts +366 -0
- package/src/backend/dynamic-table/__tests__/BulkActionsBar.test.tsx +143 -0
- package/src/backend/dynamic-table/__tests__/ColumnQuickFilter.test.tsx +607 -0
- package/src/backend/dynamic-table/__tests__/ConfigureViewFilters.suggestions.test.tsx +177 -0
- package/src/backend/dynamic-table/__tests__/ConfigureViewFormatting.test.tsx +125 -0
- package/src/backend/dynamic-table/__tests__/ConfigureViewFormulas.test.tsx +228 -0
- package/src/backend/dynamic-table/__tests__/ConfigureViewGrouping.aggregations.test.tsx +131 -0
- package/src/backend/dynamic-table/__tests__/ConfigureViewPanel.baseView.test.tsx +162 -0
- package/src/backend/dynamic-table/__tests__/ConfigureViewPanel.focus.test.tsx +54 -0
- package/src/backend/dynamic-table/__tests__/ConfigureViewPanel.sections.test.tsx +142 -0
- package/src/backend/dynamic-table/__tests__/ConfigureViewRollups.test.tsx +228 -0
- package/src/backend/dynamic-table/__tests__/ContextMenu.test.tsx +89 -0
- package/src/backend/dynamic-table/__tests__/DynamicTable.density.test.tsx +299 -0
- package/src/backend/dynamic-table/__tests__/DynamicTable.exportTruncation.test.tsx +145 -0
- package/src/backend/dynamic-table/__tests__/DynamicTable.loadError.test.tsx +173 -0
- package/src/backend/dynamic-table/__tests__/DynamicTable.wiring.test.tsx +357 -0
- package/src/backend/dynamic-table/__tests__/EmptyState.test.tsx +70 -0
- package/src/backend/dynamic-table/__tests__/ExportMenu.test.tsx +82 -0
- package/src/backend/dynamic-table/__tests__/FooterTotalsRow.test.tsx +154 -0
- package/src/backend/dynamic-table/__tests__/GroupSummaryRow.render.test.tsx +131 -0
- package/src/backend/dynamic-table/__tests__/LoadErrorState.test.tsx +74 -0
- package/src/backend/dynamic-table/__tests__/MentionPopup.search.test.tsx +127 -0
- package/src/backend/dynamic-table/__tests__/PerspectiveTabs.test.tsx +170 -0
- package/src/backend/dynamic-table/__tests__/RowHeaderCell.selection.test.tsx +80 -0
- package/src/backend/dynamic-table/__tests__/abbreviationsSubscription.test.ts +171 -0
- package/src/backend/dynamic-table/__tests__/aggregate.spec.test.ts +224 -0
- package/src/backend/dynamic-table/__tests__/aggregateDimension.test.tsx +191 -0
- package/src/backend/dynamic-table/__tests__/anchoredPosition.test.ts +88 -0
- package/src/backend/dynamic-table/__tests__/badgeAutoFit.test.ts +121 -0
- package/src/backend/dynamic-table/__tests__/cellHandlers.save.test.ts +282 -0
- package/src/backend/dynamic-table/__tests__/cellWrites.test.ts +274 -0
- package/src/backend/dynamic-table/__tests__/clipboard.test.ts +230 -0
- package/src/backend/dynamic-table/__tests__/coerceCellValue.test.ts +117 -0
- package/src/backend/dynamic-table/__tests__/colorAdjacency.test.ts +151 -0
- package/src/backend/dynamic-table/__tests__/columnFill.test.ts +66 -0
- package/src/backend/dynamic-table/__tests__/columnHeaderHandlers.sort.test.ts +100 -0
- package/src/backend/dynamic-table/__tests__/columnHeaderReorder.test.tsx +209 -0
- package/src/backend/dynamic-table/__tests__/columnReorderPersistence.test.tsx +127 -0
- package/src/backend/dynamic-table/__tests__/columnVirtualization.render.test.tsx +420 -0
- package/src/backend/dynamic-table/__tests__/columnVisibilityPersistence.test.tsx +136 -0
- package/src/backend/dynamic-table/__tests__/columnWindow.test.ts +643 -0
- package/src/backend/dynamic-table/__tests__/commentAudience.test.tsx +137 -0
- package/src/backend/dynamic-table/__tests__/commentScope.test.tsx +214 -0
- package/src/backend/dynamic-table/__tests__/conditionalFormat.test.ts +175 -0
- package/src/backend/dynamic-table/__tests__/contentRegistry.test.ts +267 -0
- package/src/backend/dynamic-table/__tests__/dateWindows.test.ts +149 -0
- package/src/backend/dynamic-table/__tests__/density.test.ts +204 -0
- package/src/backend/dynamic-table/__tests__/exportTable.test.ts +146 -0
- package/src/backend/dynamic-table/__tests__/fillGeometry.test.ts +201 -0
- package/src/backend/dynamic-table/__tests__/fillPatterns.test.ts +272 -0
- package/src/backend/dynamic-table/__tests__/filterParser.presets.test.ts +64 -0
- package/src/backend/dynamic-table/__tests__/filterParser.relative.test.ts +109 -0
- package/src/backend/dynamic-table/__tests__/filterSuggestions.test.ts +152 -0
- package/src/backend/dynamic-table/__tests__/formatAggregate.test.ts +99 -0
- package/src/backend/dynamic-table/__tests__/formatDateCompact.test.ts +489 -0
- package/src/backend/dynamic-table/__tests__/formatLabelCompact.test.ts +717 -0
- package/src/backend/dynamic-table/__tests__/formula.check.test.ts +257 -0
- package/src/backend/dynamic-table/__tests__/formula.evaluate.test.ts +274 -0
- package/src/backend/dynamic-table/__tests__/formula.functions.test.ts +226 -0
- package/src/backend/dynamic-table/__tests__/formula.noEval.test.ts +92 -0
- package/src/backend/dynamic-table/__tests__/formula.parse.test.ts +233 -0
- package/src/backend/dynamic-table/__tests__/formulaColumns.test.tsx +213 -0
- package/src/backend/dynamic-table/__tests__/handlerIdentity.test.ts +77 -0
- package/src/backend/dynamic-table/__tests__/importMapping.test.ts +174 -0
- package/src/backend/dynamic-table/__tests__/importParse.test.ts +130 -0
- package/src/backend/dynamic-table/__tests__/importServerOnly.test.ts +37 -0
- package/src/backend/dynamic-table/__tests__/layoutPersistence.test.ts +372 -0
- package/src/backend/dynamic-table/__tests__/mouseHandlers.doubleClick.test.ts +155 -0
- package/src/backend/dynamic-table/__tests__/perspectivePersonalization.test.ts +188 -0
- package/src/backend/dynamic-table/__tests__/perspectiveResolver.test.ts +133 -0
- package/src/backend/dynamic-table/__tests__/perspectiveState.defaultGrouping.test.ts +306 -0
- package/src/backend/dynamic-table/__tests__/perspectiveState.defaults.test.ts +107 -0
- package/src/backend/dynamic-table/__tests__/perspectiveTemplates.test.tsx +269 -0
- package/src/backend/dynamic-table/__tests__/perspectiveTransforms.aggregations.test.ts +105 -0
- package/src/backend/dynamic-table/__tests__/perspectiveTransforms.conditionalFormats.test.ts +107 -0
- package/src/backend/dynamic-table/__tests__/perspectiveTransforms.dateFormat.test.ts +61 -0
- package/src/backend/dynamic-table/__tests__/perspectiveTransforms.formulas.test.ts +85 -0
- package/src/backend/dynamic-table/__tests__/perspectiveTransforms.frozenColumns.test.ts +124 -0
- package/src/backend/dynamic-table/__tests__/rollupColumns.test.ts +149 -0
- package/src/backend/dynamic-table/__tests__/sharedCriteria.test.ts +255 -0
- package/src/backend/dynamic-table/__tests__/splitViewTree.test.ts +324 -0
- package/src/backend/dynamic-table/__tests__/store.clipboardMarker.test.ts +143 -0
- package/src/backend/dynamic-table/__tests__/store.fillPreview.test.ts +168 -0
- package/src/backend/dynamic-table/__tests__/store.mutations.test.ts +345 -0
- package/src/backend/dynamic-table/__tests__/store.selection.test.ts +157 -0
- package/src/backend/dynamic-table/__tests__/store.undo.test.ts +225 -0
- package/src/backend/dynamic-table/__tests__/store.valueSource.test.tsx +204 -0
- package/src/backend/dynamic-table/__tests__/useAnnotations.legacyOptions.test.tsx +58 -0
- package/src/backend/dynamic-table/__tests__/useColumnVirtualizer.test.ts +290 -0
- package/src/backend/dynamic-table/__tests__/useDensityPreference.test.ts +435 -0
- package/src/backend/dynamic-table/__tests__/useDynamicTablePage.duplicate.test.tsx +99 -0
- package/src/backend/dynamic-table/__tests__/useDynamicTablePage.export.test.tsx +281 -0
- package/src/backend/dynamic-table/__tests__/useDynamicTablePage.personalization.test.tsx +313 -0
- package/src/backend/dynamic-table/__tests__/useDynamicTablePage.perspectiveRestore.test.tsx +126 -0
- package/src/backend/dynamic-table/__tests__/useGrouping.aggregations.test.ts +158 -0
- package/src/backend/dynamic-table/__tests__/useGrouping.groupKey.test.ts +58 -0
- package/src/backend/dynamic-table/__tests__/useKeyboardNavigation.test.ts +594 -0
- package/src/backend/dynamic-table/__tests__/useStickyOffsets.memo.test.tsx +75 -0
- package/src/backend/dynamic-table/__tests__/useStickyOffsets.test.ts +106 -0
- package/src/backend/dynamic-table/__tests__/widgetPane.test.tsx +338 -0
- package/src/backend/dynamic-table/components/ActiveFilterChips.tsx +109 -0
- package/src/backend/dynamic-table/components/BulkActionsBar.tsx +89 -0
- package/src/backend/dynamic-table/components/Cell.tsx +292 -0
- package/src/backend/dynamic-table/components/CellCommentDialog.tsx +887 -0
- package/src/backend/dynamic-table/components/CellCommentHoverPopup.tsx +94 -0
- package/src/backend/dynamic-table/components/ColumnFilterPopover.tsx +775 -0
- package/src/backend/dynamic-table/components/ColumnHeaderMenu.tsx +189 -0
- package/src/backend/dynamic-table/components/ColumnHeaders.tsx +867 -0
- package/src/backend/dynamic-table/components/CompactLabelCell.tsx +293 -0
- package/src/backend/dynamic-table/components/ConfigureViewFields.tsx +173 -0
- package/src/backend/dynamic-table/components/ConfigureViewFilters.tsx +346 -0
- package/src/backend/dynamic-table/components/ConfigureViewFormatting.tsx +205 -0
- package/src/backend/dynamic-table/components/ConfigureViewFormulas.tsx +423 -0
- package/src/backend/dynamic-table/components/ConfigureViewGrouping.tsx +264 -0
- package/src/backend/dynamic-table/components/ConfigureViewLinkedColumns.tsx +249 -0
- package/src/backend/dynamic-table/components/ConfigureViewPanel.tsx +857 -0
- package/src/backend/dynamic-table/components/ConfigureViewRollups.tsx +364 -0
- package/src/backend/dynamic-table/components/ConfigureViewSorting.tsx +121 -0
- package/src/backend/dynamic-table/components/ContextMenu.tsx +140 -0
- package/src/backend/dynamic-table/components/DateCell.tsx +205 -0
- package/src/backend/dynamic-table/components/Debugger.tsx +340 -0
- package/src/backend/dynamic-table/components/DensityControl.tsx +441 -0
- package/src/backend/dynamic-table/components/EmptyState.tsx +103 -0
- package/src/backend/dynamic-table/components/EntitySearchEditor.tsx +528 -0
- package/src/backend/dynamic-table/components/ExportMenu.tsx +90 -0
- package/src/backend/dynamic-table/components/FilterDatePicker.tsx +194 -0
- package/src/backend/dynamic-table/components/FilterValueInput.tsx +294 -0
- package/src/backend/dynamic-table/components/FooterTotalsRow.tsx +291 -0
- package/src/backend/dynamic-table/components/FullscreenOverlay.tsx +66 -0
- package/src/backend/dynamic-table/components/GroupHeaderRow.tsx +136 -0
- package/src/backend/dynamic-table/components/GroupSummaryRow.tsx +184 -0
- package/src/backend/dynamic-table/components/ImportPanel.tsx +445 -0
- package/src/backend/dynamic-table/components/ImportPreviewGrid.tsx +155 -0
- package/src/backend/dynamic-table/components/LoadErrorState.tsx +70 -0
- package/src/backend/dynamic-table/components/MentionPopup.tsx +224 -0
- package/src/backend/dynamic-table/components/PerspectiveDeleteDialog.tsx +96 -0
- package/src/backend/dynamic-table/components/PerspectivePublishDialog.tsx +152 -0
- package/src/backend/dynamic-table/components/PerspectiveTabMenu.tsx +215 -0
- package/src/backend/dynamic-table/components/PerspectiveTabs.tsx +426 -0
- package/src/backend/dynamic-table/components/PerspectiveTemplateMenu.tsx +135 -0
- package/src/backend/dynamic-table/components/RowHeaderCell.tsx +73 -0
- package/src/backend/dynamic-table/components/SearchBar.tsx +309 -0
- package/src/backend/dynamic-table/components/SelectMenu.tsx +237 -0
- package/src/backend/dynamic-table/components/StaleDataBar.tsx +74 -0
- package/src/backend/dynamic-table/components/TableDeleteDialog.tsx +74 -0
- package/src/backend/dynamic-table/components/TablePagination.tsx +96 -0
- package/src/backend/dynamic-table/components/TableSkeleton.tsx +123 -0
- package/src/backend/dynamic-table/components/ToolbarOverflow.tsx +284 -0
- package/src/backend/dynamic-table/components/ViewModeSwitch.tsx +92 -0
- package/src/backend/dynamic-table/components/VirtualRow.tsx +346 -0
- package/src/backend/dynamic-table/components/editors.tsx +1727 -0
- package/src/backend/dynamic-table/components/renderers.tsx +162 -0
- package/src/backend/dynamic-table/events/events.ts +107 -0
- package/src/backend/dynamic-table/formula/check.ts +359 -0
- package/src/backend/dynamic-table/formula/evaluate.ts +473 -0
- package/src/backend/dynamic-table/formula/functions.ts +737 -0
- package/src/backend/dynamic-table/formula/index.ts +57 -0
- package/src/backend/dynamic-table/formula/parse.ts +414 -0
- package/src/backend/dynamic-table/formula/types.ts +151 -0
- package/src/backend/dynamic-table/handlers/cellWrites.ts +362 -0
- package/src/backend/dynamic-table/handlers/index.ts +789 -0
- package/src/backend/dynamic-table/handlers/perspectiveHandlers.ts +684 -0
- package/src/backend/dynamic-table/hooks/index.ts +888 -0
- package/src/backend/dynamic-table/hooks/useAbbreviations.ts +67 -0
- package/src/backend/dynamic-table/hooks/useAnnotations.ts +215 -0
- package/src/backend/dynamic-table/hooks/useColumnVirtualizer.ts +303 -0
- package/src/backend/dynamic-table/hooks/useColumnWidthPersistence.ts +214 -0
- package/src/backend/dynamic-table/hooks/useDensityPreference.ts +451 -0
- package/src/backend/dynamic-table/hooks/useDynamicTablePage.tsx +1681 -0
- package/src/backend/dynamic-table/hooks/useEscapeLayer.ts +72 -0
- package/src/backend/dynamic-table/hooks/useGrouping.ts +428 -0
- package/src/backend/dynamic-table/hooks/useSuggestionFetch.ts +109 -0
- package/src/backend/dynamic-table/hooks/useTableDateFormat.tsx +19 -0
- package/src/backend/dynamic-table/index.ts +497 -0
- package/src/backend/dynamic-table/registry/ContentRegistryContext.tsx +244 -0
- package/src/backend/dynamic-table/registry/TableRegistryContext.tsx +84 -0
- package/src/backend/dynamic-table/registry/filterAccessibleTables.ts +36 -0
- package/src/backend/dynamic-table/registry/index.ts +38 -0
- package/src/backend/dynamic-table/registry/lazyTable.tsx +80 -0
- package/src/backend/dynamic-table/registry/types.ts +181 -0
- package/src/backend/dynamic-table/registry/widgetCatalog.ts +226 -0
- package/src/backend/dynamic-table/server/aggregate.ts +474 -0
- package/src/backend/dynamic-table/server/dateWindows.ts +201 -0
- package/src/backend/dynamic-table/server/filterParser.ts +132 -0
- package/src/backend/dynamic-table/server/filterSuggestions.ts +150 -0
- package/src/backend/dynamic-table/server/index.ts +47 -0
- package/src/backend/dynamic-table/server/makeDynamicTableRoute.ts +426 -0
- package/src/backend/dynamic-table/split-view/ContentPicker.tsx +251 -0
- package/src/backend/dynamic-table/split-view/EmptySlot.tsx +69 -0
- package/src/backend/dynamic-table/split-view/SplitViewHost.tsx +1336 -0
- package/src/backend/dynamic-table/split-view/WidgetPane.tsx +390 -0
- package/src/backend/dynamic-table/split-view/WorkspaceFilterBar.tsx +728 -0
- package/src/backend/dynamic-table/split-view/index.ts +48 -0
- package/src/backend/dynamic-table/split-view/layoutPersistence.ts +185 -0
- package/src/backend/dynamic-table/split-view/sharedCriteria.ts +196 -0
- package/src/backend/dynamic-table/split-view/types.ts +778 -0
- package/src/backend/dynamic-table/split-view/useSplitViewLayouts.ts +97 -0
- package/src/backend/dynamic-table/store/index.ts +1011 -0
- package/src/backend/dynamic-table/styles/ContextMenu.css +387 -0
- package/src/backend/dynamic-table/styles/DynamicTable.css +3659 -0
- package/src/backend/dynamic-table/styles/DynamicTable.v2.css +2651 -0
- package/src/backend/dynamic-table/styles/SearchBar.css +426 -0
- package/src/backend/dynamic-table/styles/dateCell.css +146 -0
- package/src/backend/dynamic-table/styles/density.css +690 -0
- package/src/backend/dynamic-table/types/density.ts +179 -0
- package/src/backend/dynamic-table/types/filters.ts +156 -0
- package/src/backend/dynamic-table/types/grouping.ts +189 -0
- package/src/backend/dynamic-table/types/import.ts +132 -0
- package/src/backend/dynamic-table/types/index.ts +1198 -0
- package/src/backend/dynamic-table/types/perspective.ts +436 -0
- package/src/backend/dynamic-table/types/rollup.ts +111 -0
- package/src/backend/dynamic-table/utils/abbreviations.ts +556 -0
- package/src/backend/dynamic-table/utils/anchoredPosition.ts +106 -0
- package/src/backend/dynamic-table/utils/badgeAutoFit.ts +108 -0
- package/src/backend/dynamic-table/utils/clipboard.ts +294 -0
- package/src/backend/dynamic-table/utils/coerceCellValue.ts +96 -0
- package/src/backend/dynamic-table/utils/colorAdjacency.ts +87 -0
- package/src/backend/dynamic-table/utils/columnFill.ts +93 -0
- package/src/backend/dynamic-table/utils/columnSpacerStyle.ts +53 -0
- package/src/backend/dynamic-table/utils/columnWindow.ts +668 -0
- package/src/backend/dynamic-table/utils/conditionalFormat.ts +300 -0
- package/src/backend/dynamic-table/utils/exportTable.ts +140 -0
- package/src/backend/dynamic-table/utils/fillGeometry.ts +187 -0
- package/src/backend/dynamic-table/utils/fillPatterns.ts +422 -0
- package/src/backend/dynamic-table/utils/formatAggregate.ts +145 -0
- package/src/backend/dynamic-table/utils/formatDateCompact.ts +879 -0
- package/src/backend/dynamic-table/utils/formatLabelCompact.ts +640 -0
- package/src/backend/dynamic-table/utils/formulaColumns.tsx +237 -0
- package/src/backend/dynamic-table/utils/importMapping.ts +202 -0
- package/src/backend/dynamic-table/utils/importParse.ts +220 -0
- package/src/backend/dynamic-table/utils/lookupColumns.tsx +47 -0
- package/src/backend/dynamic-table/utils/perspectiveTransforms.ts +368 -0
- package/src/backend/dynamic-table/utils/rollupColumns.ts +162 -0
- package/src/backend/dynamic-table/validators/index.ts +40 -0
- package/src/backend/fields/registry.generated.ts +8 -0
- package/src/backend/fields/registry.ts +38 -0
- package/src/backend/filters/AdvancedFilterBuilder.tsx +339 -0
- package/src/backend/forms/ActionsDropdown.tsx +198 -0
- package/src/backend/forms/FormActionButtons.tsx +98 -0
- package/src/backend/forms/FormFooter.tsx +27 -0
- package/src/backend/forms/FormHeader.tsx +204 -0
- package/src/backend/forms/index.ts +4 -0
- package/src/backend/hooks/useAdvancedFilter.ts +77 -0
- package/src/backend/indexes/PartialIndexBanner.tsx +86 -0
- package/src/backend/indexes/store.ts +88 -0
- package/src/backend/injection/ComponentOverrideProvider.tsx +66 -0
- package/src/backend/injection/InjectedField.tsx +196 -0
- package/src/backend/injection/InjectionSpot.tsx +457 -0
- package/src/backend/injection/InjectionWizard.tsx +335 -0
- package/src/backend/injection/PageInjectionBoundary.tsx +31 -0
- package/src/backend/injection/SseEventIndicator.tsx +11 -0
- package/src/backend/injection/StatusBadgeInjectionSpot.tsx +50 -0
- package/src/backend/injection/StatusBadgeRenderer.tsx +100 -0
- package/src/backend/injection/WidgetSharedState.ts +58 -0
- package/src/backend/injection/WizardInjectionSpot.tsx +46 -0
- package/src/backend/injection/eventBridge.ts +158 -0
- package/src/backend/injection/helpers.ts +35 -0
- package/src/backend/injection/mergeMenuItems.ts +80 -0
- package/src/backend/injection/mutationEvents.ts +22 -0
- package/src/backend/injection/resolveInjectedIcon.tsx +30 -0
- package/src/backend/injection/spotIds.ts +64 -0
- package/src/backend/injection/useAppEvent.ts +76 -0
- package/src/backend/injection/useGuardedMutation.ts +101 -0
- package/src/backend/injection/useInjectedMenuItems.ts +67 -0
- package/src/backend/injection/useInjectionDataWidgets.ts +41 -0
- package/src/backend/injection/useOperationProgress.ts +105 -0
- package/src/backend/injection/useRegisteredComponent.tsx +106 -0
- package/src/backend/injection/useWidgetSharedState.ts +28 -0
- package/src/backend/injection/visibility-utils.ts +31 -0
- package/src/backend/injection/widgetRegistry.ts +68 -0
- package/src/backend/inputs/ComboboxInput.tsx +272 -0
- package/src/backend/inputs/DatePicker.tsx +162 -0
- package/src/backend/inputs/DateTimePicker.tsx +199 -0
- package/src/backend/inputs/EventPatternInput.tsx +46 -0
- package/src/backend/inputs/EventSelect.tsx +183 -0
- package/src/backend/inputs/LookupSelect.tsx +253 -0
- package/src/backend/inputs/PhoneNumberField.tsx +166 -0
- package/src/backend/inputs/SwitchableMarkdownInput.tsx +106 -0
- package/src/backend/inputs/TagsInput.tsx +297 -0
- package/src/backend/inputs/TimeInput.tsx +146 -0
- package/src/backend/inputs/TimePicker.tsx +120 -0
- package/src/backend/inputs/__tests__/DatePicker.test.tsx +76 -0
- package/src/backend/inputs/__tests__/DateTimePicker.logic.test.ts +126 -0
- package/src/backend/inputs/__tests__/PhoneNumberField.test.tsx +73 -0
- package/src/backend/inputs/__tests__/TagsInput.test.tsx +78 -0
- package/src/backend/inputs/__tests__/TimeInput.test.tsx +134 -0
- package/src/backend/inputs/__tests__/TimePicker.test.tsx +50 -0
- package/src/backend/inputs/index.ts +11 -0
- package/src/backend/markdown/MarkdownContent.tsx +33 -0
- package/src/backend/markdown/index.ts +2 -0
- package/src/backend/markdown/useMarkdownRemarkPlugins.ts +39 -0
- package/src/backend/messages/MessageComposer.tsx +197 -0
- package/src/backend/messages/MessageObjectDetail.tsx +95 -0
- package/src/backend/messages/MessageObjectPreview.tsx +64 -0
- package/src/backend/messages/MessageObjectRecordPicker.tsx +149 -0
- package/src/backend/messages/MessagePrioritySelector.tsx +78 -0
- package/src/backend/messages/MessagesIcon.tsx +32 -0
- package/src/backend/messages/SendObjectMessageDialog.tsx +74 -0
- package/src/backend/messages/__tests__/MessageComposer.test.tsx +350 -0
- package/src/backend/messages/__tests__/SendObjectMessageDialog.test.tsx +77 -0
- package/src/backend/messages/index.ts +22 -0
- package/src/backend/messages/message-compose-form-groups.tsx +383 -0
- package/src/backend/messages/message-composer.types.ts +82 -0
- package/src/backend/messages/message-priority.ts +53 -0
- package/src/backend/messages/useMessageCompose.ts +666 -0
- package/src/backend/messages/useMessageComposeOperations.ts +259 -0
- package/src/backend/messages/useMessagesPoll.ts +118 -0
- package/src/backend/notifications/NotificationBell.tsx +91 -0
- package/src/backend/notifications/NotificationCountBadge.tsx +14 -0
- package/src/backend/notifications/NotificationDispatcher.ts +213 -0
- package/src/backend/notifications/NotificationItem.tsx +262 -0
- package/src/backend/notifications/NotificationPanel.tsx +225 -0
- package/src/backend/notifications/__tests__/NotificationCountBadge.test.tsx +34 -0
- package/src/backend/notifications/index.ts +20 -0
- package/src/backend/notifications/useNotificationActions.ts +161 -0
- package/src/backend/notifications/useNotificationEffect.ts +17 -0
- package/src/backend/notifications/useNotifications.ts +12 -0
- package/src/backend/notifications/useNotificationsPoll.ts +167 -0
- package/src/backend/notifications/useNotificationsSse.ts +220 -0
- package/src/backend/operations/LastOperationBanner.tsx +85 -0
- package/src/backend/operations/__tests__/LastOperationBanner.test.tsx +101 -0
- package/src/backend/operations/store.ts +230 -0
- package/src/backend/progress/ProgressTopBar.tsx +189 -0
- package/src/backend/progress/useProgress.ts +12 -0
- package/src/backend/progress/useProgressPoll.ts +100 -0
- package/src/backend/progress/useProgressSse.ts +118 -0
- package/src/backend/schedule/ScheduleAgenda.tsx +136 -0
- package/src/backend/schedule/ScheduleGrid.tsx +136 -0
- package/src/backend/schedule/ScheduleToolbar.tsx +178 -0
- package/src/backend/schedule/ScheduleView.tsx +201 -0
- package/src/backend/schedule/index.ts +5 -0
- package/src/backend/schedule/recurrence.ts +99 -0
- package/src/backend/schedule/types.ts +26 -0
- package/src/backend/section-page/SectionNav.tsx +140 -0
- package/src/backend/section-page/SectionPage.tsx +34 -0
- package/src/backend/section-page/index.ts +3 -0
- package/src/backend/section-page/types.ts +30 -0
- package/src/backend/settings/SettingsNavigation.tsx +74 -0
- package/src/backend/settings/SettingsPageWrapper.tsx +78 -0
- package/src/backend/settings/index.ts +3 -0
- package/src/backend/upgrades/UpgradeActionBanner.tsx +128 -0
- package/src/backend/utils/__tests__/api.scoped-headers.test.ts +58 -0
- package/src/backend/utils/__tests__/api.test.ts +148 -0
- package/src/backend/utils/__tests__/apiCall.scoped-request-headers.test.ts +58 -0
- package/src/backend/utils/__tests__/apiCall.test.ts +109 -0
- package/src/backend/utils/__tests__/crud.test.ts +87 -0
- package/src/backend/utils/__tests__/customFieldDefs.test.ts +25 -0
- package/src/backend/utils/__tests__/customFieldValues.test.ts +35 -0
- package/src/backend/utils/__tests__/richTextSanitizer.test.ts +57 -0
- package/src/backend/utils/api.ts +214 -0
- package/src/backend/utils/apiCall.ts +123 -0
- package/src/backend/utils/crud.ts +174 -0
- package/src/backend/utils/customFieldColumns.ts +118 -0
- package/src/backend/utils/customFieldDefs.ts +247 -0
- package/src/backend/utils/customFieldFilters.ts +174 -0
- package/src/backend/utils/customFieldForms.ts +203 -0
- package/src/backend/utils/customFieldRelationDisplay.ts +302 -0
- package/src/backend/utils/customFieldValues.ts +41 -0
- package/src/backend/utils/flash.ts +17 -0
- package/src/backend/utils/nav.ts +402 -0
- package/src/backend/utils/richTextSanitizer.ts +7 -0
- package/src/backend/utils/scopedHeaderStack.ts +49 -0
- package/src/backend/utils/serverErrors.ts +313 -0
- package/src/backend/utils/useAutoDiscoveredFields.ts +138 -0
- package/src/backend/version-history/VersionHistoryAction.tsx +76 -0
- package/src/backend/version-history/VersionHistoryDetail.tsx +87 -0
- package/src/backend/version-history/VersionHistoryPanel.tsx +331 -0
- package/src/backend/version-history/index.ts +9 -0
- package/src/backend/version-history/labels.ts +56 -0
- package/src/backend/version-history/types.ts +27 -0
- package/src/backend/version-history/useAuditPermissions.ts +94 -0
- package/src/backend/version-history/useVersionHistory.ts +173 -0
- package/src/backend/views/NewViewForm.tsx +54 -0
- package/src/backend/views/ShareForm.tsx +62 -0
- package/src/backend/views/ViewChip.tsx +123 -0
- package/src/backend/views/ViewChipMenu.tsx +94 -0
- package/src/backend/views/types.ts +4 -0
- package/src/frontend/AuthFooter.tsx +29 -0
- package/src/frontend/LanguageSwitcher.tsx +66 -0
- package/src/frontend/Layout.tsx +13 -0
- package/src/hooks/useIsMobile.ts +27 -0
- package/src/index.ts +40 -0
- package/src/portal/PortalContext.tsx +180 -0
- package/src/portal/PortalLayoutProvider.tsx +5 -0
- package/src/portal/PortalLayoutShell.tsx +64 -0
- package/src/portal/PortalShell.tsx +370 -0
- package/src/portal/components/PortalCard.tsx +77 -0
- package/src/portal/components/PortalEmptyState.tsx +32 -0
- package/src/portal/components/PortalFeatureCard.tsx +41 -0
- package/src/portal/components/PortalNotificationBell.tsx +81 -0
- package/src/portal/components/PortalNotificationPanel.tsx +230 -0
- package/src/portal/components/PortalPageHeader.tsx +33 -0
- package/src/portal/components/index.ts +6 -0
- package/src/portal/hooks/useCustomerAuth.ts +97 -0
- package/src/portal/hooks/usePortalAppEvent.ts +56 -0
- package/src/portal/hooks/usePortalDashboardWidgets.ts +50 -0
- package/src/portal/hooks/usePortalEventBridge.ts +162 -0
- package/src/portal/hooks/usePortalInjectedMenuItems.ts +130 -0
- package/src/portal/hooks/usePortalNotifications.ts +116 -0
- package/src/portal/hooks/useTenantContext.ts +83 -0
- package/src/primitives/DataLoader.tsx +93 -0
- package/src/primitives/ErrorNotice.tsx +17 -0
- package/src/primitives/Notice.tsx +83 -0
- package/src/primitives/alert.tsx +59 -0
- package/src/primitives/badge.tsx +43 -0
- package/src/primitives/button.tsx +60 -0
- package/src/primitives/calendar.tsx +69 -0
- package/src/primitives/card.tsx +92 -0
- package/src/primitives/checkbox.tsx +34 -0
- package/src/primitives/dialog.tsx +122 -0
- package/src/primitives/form-field.tsx +106 -0
- package/src/primitives/icon-button.tsx +48 -0
- package/src/primitives/input.tsx +26 -0
- package/src/primitives/label.tsx +18 -0
- package/src/primitives/popover.tsx +37 -0
- package/src/primitives/primitives.stories.tsx +223 -0
- package/src/primitives/progress.tsx +28 -0
- package/src/primitives/separator.tsx +7 -0
- package/src/primitives/sheet.tsx +137 -0
- package/src/primitives/spinner.tsx +27 -0
- package/src/primitives/status-badge.tsx +62 -0
- package/src/primitives/switch.tsx +92 -0
- package/src/primitives/table.tsx +27 -0
- package/src/primitives/tabs.tsx +131 -0
- package/src/primitives/textarea.tsx +20 -0
- package/src/primitives/tooltip.tsx +85 -0
- package/src/primitives-v2/AGENTS.md +66 -0
- package/src/primitives-v2/Alert.stories.tsx +56 -0
- package/src/primitives-v2/Alert.tsx +108 -0
- package/src/primitives-v2/Avatar.stories.tsx +60 -0
- package/src/primitives-v2/Avatar.tsx +139 -0
- package/src/primitives-v2/Badge.stories.tsx +80 -0
- package/src/primitives-v2/Badge.tsx +99 -0
- package/src/primitives-v2/Breadcrumb.stories.tsx +61 -0
- package/src/primitives-v2/Breadcrumb.tsx +96 -0
- package/src/primitives-v2/Button.stories.tsx +72 -0
- package/src/primitives-v2/Button.tsx +178 -0
- package/src/primitives-v2/Checkbox.stories.tsx +34 -0
- package/src/primitives-v2/Checkbox.tsx +103 -0
- package/src/primitives-v2/IconButton.stories.tsx +40 -0
- package/src/primitives-v2/IconButton.tsx +40 -0
- package/src/primitives-v2/Input.stories.tsx +60 -0
- package/src/primitives-v2/Input.tsx +113 -0
- package/src/primitives-v2/NavGroup.stories.tsx +50 -0
- package/src/primitives-v2/NavGroup.tsx +76 -0
- package/src/primitives-v2/NavItem.stories.tsx +68 -0
- package/src/primitives-v2/NavItem.tsx +105 -0
- package/src/primitives-v2/SearchInput.stories.tsx +44 -0
- package/src/primitives-v2/SearchInput.tsx +123 -0
- package/src/primitives-v2/Sidebar.stories.tsx +91 -0
- package/src/primitives-v2/Sidebar.tsx +92 -0
- package/src/primitives-v2/Tab.stories.tsx +62 -0
- package/src/primitives-v2/Tab.tsx +148 -0
- package/src/primitives-v2/Tag.stories.tsx +123 -0
- package/src/primitives-v2/Tag.tsx +115 -0
- package/src/primitives-v2/Toggle.stories.tsx +37 -0
- package/src/primitives-v2/Toggle.tsx +93 -0
- package/src/primitives-v2/Topbar.stories.tsx +65 -0
- package/src/primitives-v2/Topbar.tsx +37 -0
- package/src/primitives-v2/index.ts +31 -0
- package/src/primitives-v2/utils.ts +9 -0
- package/src/theme/BrandThemeProvider.tsx +122 -0
- package/src/theme/QueryProvider.tsx +46 -0
- package/src/theme/ThemeProvider.tsx +120 -0
- package/src/theme/ThemeToggle.tsx +88 -0
- package/src/theme/index.ts +4 -0
- package/src/theme/m3.css +622 -0
- package/src/theme/tokens.v2.css +559 -0
- package/src/theme/typography.css +163 -0
- package/src/theme/typography.stories.tsx +157 -0
- package/src/theme/typography.tokens.ts +326 -0
- 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
|
+
}
|