@cratis/components 4.26.3 → 4.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/compat-manifest.json +11 -11
  2. package/dist/esm/Common/CratisComponentsProvider.d.ts +4 -0
  3. package/dist/esm/Common/CratisComponentsProvider.d.ts.map +1 -1
  4. package/dist/esm/Common/CratisComponentsProvider.js +1 -0
  5. package/dist/esm/Common/CratisComponentsProvider.js.map +1 -1
  6. package/dist/esm/DataPage/DataPage.d.ts +2 -0
  7. package/dist/esm/DataPage/DataPage.d.ts.map +1 -1
  8. package/dist/esm/DataPage/DataPage.js.map +1 -1
  9. package/dist/esm/DataTables/DataTableForObservableQuery.d.ts +2 -0
  10. package/dist/esm/DataTables/DataTableForObservableQuery.d.ts.map +1 -1
  11. package/dist/esm/DataTables/DataTableForObservableQuery.js +1 -1
  12. package/dist/esm/DataTables/DataTableForObservableQuery.js.map +1 -1
  13. package/dist/esm/DataTables/DataTableForQuery.d.ts +2 -0
  14. package/dist/esm/DataTables/DataTableForQuery.d.ts.map +1 -1
  15. package/dist/esm/DataTables/DataTableForQuery.js +1 -1
  16. package/dist/esm/DataTables/DataTableForQuery.js.map +1 -1
  17. package/dist/esm/DataTables/PaginatorPageItem.d.ts +13 -0
  18. package/dist/esm/DataTables/PaginatorPageItem.d.ts.map +1 -0
  19. package/dist/esm/DataTables/PaginatorPageItem.js +4 -0
  20. package/dist/esm/DataTables/PaginatorPageItem.js.map +1 -0
  21. package/dist/esm/DataTables/TablePaginator.d.ts +22 -2
  22. package/dist/esm/DataTables/TablePaginator.d.ts.map +1 -1
  23. package/dist/esm/DataTables/TablePaginator.js.map +1 -1
  24. package/dist/esm/DataTables/TablePaginatorImplementation.d.ts +1 -1
  25. package/dist/esm/DataTables/TablePaginatorImplementation.d.ts.map +1 -1
  26. package/dist/esm/DataTables/TablePaginatorImplementation.js +8 -3
  27. package/dist/esm/DataTables/TablePaginatorImplementation.js.map +1 -1
  28. package/dist/esm/DataTables/TablePaginatorPages.d.ts +9 -0
  29. package/dist/esm/DataTables/TablePaginatorPages.d.ts.map +1 -0
  30. package/dist/esm/DataTables/TablePaginatorPages.js +20 -0
  31. package/dist/esm/DataTables/TablePaginatorPages.js.map +1 -0
  32. package/dist/esm/DataTables/index.d.ts +2 -0
  33. package/dist/esm/DataTables/index.d.ts.map +1 -1
  34. package/dist/esm/DataTables/index.js +1 -0
  35. package/dist/esm/DataTables/index.js.map +1 -1
  36. package/dist/esm/DataTables/paginatorPages.d.ts +15 -0
  37. package/dist/esm/DataTables/paginatorPages.d.ts.map +1 -0
  38. package/dist/esm/DataTables/paginatorPages.js +40 -0
  39. package/dist/esm/DataTables/paginatorPages.js.map +1 -0
  40. package/dist/esm/Filter/FilterGroup.d.ts +23 -0
  41. package/dist/esm/Filter/FilterGroup.d.ts.map +1 -0
  42. package/dist/esm/Filter/FilterGroup.js +51 -0
  43. package/dist/esm/Filter/FilterGroup.js.map +1 -0
  44. package/dist/esm/Filter/FilterPanel.d.ts.map +1 -1
  45. package/dist/esm/Filter/FilterPanel.js +24 -257
  46. package/dist/esm/Filter/FilterPanel.js.map +1 -1
  47. package/dist/esm/Filter/FilterSearchBox.d.ts +10 -0
  48. package/dist/esm/Filter/FilterSearchBox.d.ts.map +1 -0
  49. package/dist/esm/Filter/FilterSearchBox.js +10 -0
  50. package/dist/esm/Filter/FilterSearchBox.js.map +1 -0
  51. package/dist/esm/Filter/measurePanelPlacement.d.ts +31 -0
  52. package/dist/esm/Filter/measurePanelPlacement.d.ts.map +1 -0
  53. package/dist/esm/Filter/measurePanelPlacement.js +132 -0
  54. package/dist/esm/Filter/measurePanelPlacement.js.map +1 -0
  55. package/dist/esm/Filter/usePanelDismissal.d.ts +32 -0
  56. package/dist/esm/Filter/usePanelDismissal.d.ts.map +1 -0
  57. package/dist/esm/Filter/usePanelDismissal.js +63 -0
  58. package/dist/esm/Filter/usePanelDismissal.js.map +1 -0
  59. package/dist/esm/Filter/usePanelPosition.d.ts +24 -0
  60. package/dist/esm/Filter/usePanelPosition.d.ts.map +1 -0
  61. package/dist/esm/Filter/usePanelPosition.js +85 -0
  62. package/dist/esm/Filter/usePanelPosition.js.map +1 -0
  63. package/dist/esm/Filter/useResolvedAnchor.d.ts +17 -0
  64. package/dist/esm/Filter/useResolvedAnchor.d.ts.map +1 -0
  65. package/dist/esm/Filter/useResolvedAnchor.js +16 -0
  66. package/dist/esm/Filter/useResolvedAnchor.js.map +1 -0
  67. package/dist/esm/PivotViewer/PivotViewer.d.ts.map +1 -1
  68. package/dist/esm/PivotViewer/PivotViewer.js +47 -207
  69. package/dist/esm/PivotViewer/PivotViewer.js.map +1 -1
  70. package/dist/esm/PivotViewer/components/pivot/sprites.js +1 -1
  71. package/dist/esm/PivotViewer/components/pivot/syncScrollSprites.d.ts +2 -2
  72. package/dist/esm/PivotViewer/components/pivot/syncScrollSprites.d.ts.map +1 -1
  73. package/dist/esm/PivotViewer/components/pivot/syncScrollSprites.js +1 -1
  74. package/dist/esm/PivotViewer/components/pivot/syncScrollSprites.js.map +1 -1
  75. package/dist/esm/PivotViewer/components/pivot/usePivotScrollSync.d.ts.map +1 -1
  76. package/dist/esm/PivotViewer/components/pivot/usePivotScrollSync.js +8 -2
  77. package/dist/esm/PivotViewer/components/pivot/usePivotScrollSync.js.map +1 -1
  78. package/dist/esm/PivotViewer/components/pivot/usePivotSpriteSync.d.ts.map +1 -1
  79. package/dist/esm/PivotViewer/components/pivot/usePivotSpriteSync.js +49 -28
  80. package/dist/esm/PivotViewer/components/pivot/usePivotSpriteSync.js.map +1 -1
  81. package/dist/esm/PivotViewer/components/pivot/visibility.d.ts +12 -2
  82. package/dist/esm/PivotViewer/components/pivot/visibility.d.ts.map +1 -1
  83. package/dist/esm/PivotViewer/components/pivot/visibility.js +34 -194
  84. package/dist/esm/PivotViewer/components/pivot/visibility.js.map +1 -1
  85. package/dist/esm/PivotViewer/components/pivot/visibilityHelpers.d.ts +114 -0
  86. package/dist/esm/PivotViewer/components/pivot/visibilityHelpers.d.ts.map +1 -0
  87. package/dist/esm/PivotViewer/components/pivot/visibilityHelpers.js +306 -0
  88. package/dist/esm/PivotViewer/components/pivot/visibilityHelpers.js.map +1 -0
  89. package/dist/esm/PivotViewer/hooks/useColorCssVariables.d.ts +9 -0
  90. package/dist/esm/PivotViewer/hooks/useColorCssVariables.d.ts.map +1 -0
  91. package/dist/esm/PivotViewer/hooks/useColorCssVariables.js +32 -0
  92. package/dist/esm/PivotViewer/hooks/useColorCssVariables.js.map +1 -0
  93. package/dist/esm/PivotViewer/hooks/usePivotViewerGrouping.d.ts +27 -0
  94. package/dist/esm/PivotViewer/hooks/usePivotViewerGrouping.d.ts.map +1 -0
  95. package/dist/esm/PivotViewer/hooks/usePivotViewerGrouping.js +40 -0
  96. package/dist/esm/PivotViewer/hooks/usePivotViewerGrouping.js.map +1 -0
  97. package/dist/esm/PivotViewer/hooks/usePivotViewerInteractions.d.ts +27 -0
  98. package/dist/esm/PivotViewer/hooks/usePivotViewerInteractions.d.ts.map +1 -0
  99. package/dist/esm/PivotViewer/hooks/usePivotViewerInteractions.js +46 -0
  100. package/dist/esm/PivotViewer/hooks/usePivotViewerInteractions.js.map +1 -0
  101. package/dist/esm/PivotViewer/hooks/useRawGrouping.d.ts +22 -0
  102. package/dist/esm/PivotViewer/hooks/useRawGrouping.d.ts.map +1 -0
  103. package/dist/esm/PivotViewer/hooks/useRawGrouping.js +56 -0
  104. package/dist/esm/PivotViewer/hooks/useRawGrouping.js.map +1 -0
  105. package/dist/esm/PivotViewer/hooks/useScrollPositionTracking.d.ts +12 -0
  106. package/dist/esm/PivotViewer/hooks/useScrollPositionTracking.d.ts.map +1 -0
  107. package/dist/esm/PivotViewer/hooks/useScrollPositionTracking.js +20 -0
  108. package/dist/esm/PivotViewer/hooks/useScrollPositionTracking.js.map +1 -0
  109. package/dist/esm/PivotViewer/hooks/useViewerLayout.d.ts +16 -0
  110. package/dist/esm/PivotViewer/hooks/useViewerLayout.d.ts.map +1 -0
  111. package/dist/esm/PivotViewer/hooks/useViewerLayout.js +29 -0
  112. package/dist/esm/PivotViewer/hooks/useViewerLayout.js.map +1 -0
  113. package/dist/esm/PivotViewer/hooks/useVisibleIds.d.ts +21 -0
  114. package/dist/esm/PivotViewer/hooks/useVisibleIds.d.ts.map +1 -0
  115. package/dist/esm/PivotViewer/hooks/useVisibleIds.js +34 -0
  116. package/dist/esm/PivotViewer/hooks/useVisibleIds.js.map +1 -0
  117. package/dist/esm/configuration/CratisComponentsDefaults.d.ts.map +1 -1
  118. package/dist/esm/configuration/CratisComponentsDefaults.js +2 -0
  119. package/dist/esm/configuration/CratisComponentsDefaults.js.map +1 -1
  120. package/dist/esm/styles.DataPage.css +51 -6
  121. package/dist/esm/styles.DataTables.css +51 -6
  122. package/dist/esm/styles.SchemaEditor.css +51 -6
  123. package/dist/esm/styles.css +51 -6
  124. package/dist/esm/styles.renderer.builtin.css +51 -6
  125. package/dist/esm/types/parts.d.ts +4 -1
  126. package/dist/esm/types/parts.d.ts.map +1 -1
  127. package/dist/esm/types/parts.js +4 -1
  128. package/dist/esm/types/parts.js.map +1 -1
  129. package/package.json +1 -1
@@ -0,0 +1,27 @@
1
+ import type { RefObject } from 'react';
2
+ import { useCardSelection } from './useCardSelection.js';
3
+ import { useAnimationModeTracking } from './useAnimationModeTracking.js';
4
+ type CardSelectionParams<TItem extends object> = Parameters<typeof useCardSelection<TItem>>[0];
5
+ type AnimationTrackingParams = Parameters<typeof useAnimationModeTracking>;
6
+ export interface UsePivotViewerInteractionsOptions<TItem extends object> extends Omit<CardSelectionParams<TItem>, 'resolveId' | 'containerRef'> {
7
+ containerRef: RefObject<HTMLDivElement>;
8
+ axisLabelsRef: RefObject<HTMLDivElement>;
9
+ filterState: AnimationTrackingParams[0];
10
+ rangeFilterState: AnimationTrackingParams[1];
11
+ search: AnimationTrackingParams[2];
12
+ activeDimensionKey: AnimationTrackingParams[3];
13
+ setAnimationMode: AnimationTrackingParams[5];
14
+ }
15
+ /**
16
+ * Wires scroll syncing, animation tracking, card selection and detail-panel closing.
17
+ *
18
+ * @param options - The viewer state and setters the interactions operate on.
19
+ * @returns The id resolver, card click handler and detail close handler.
20
+ */
21
+ export declare function usePivotViewerInteractions<TItem extends object>(options: UsePivotViewerInteractionsOptions<TItem>): {
22
+ resolveId: (item: TItem) => number;
23
+ handleCardClick: (item: TItem, e: MouseEvent, id?: number | string) => void;
24
+ closeDetail: () => void;
25
+ };
26
+ export {};
27
+ //# sourceMappingURL=usePivotViewerInteractions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePivotViewerInteractions.d.ts","sourceRoot":"","sources":["../../../../PivotViewer/hooks/usePivotViewerInteractions.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAoB,CAAC;AAGtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA4B,CAAC;AAGtE,KAAK,mBAAmB,CAAC,KAAK,SAAS,MAAM,IAAI,UAAU,CAAC,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/F,KAAK,uBAAuB,GAAG,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAE3E,MAAM,WAAW,iCAAiC,CAAC,KAAK,SAAS,MAAM,CACnE,SAAQ,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,WAAW,GAAG,cAAc,CAAC;IACtE,YAAY,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC;IACxC,aAAa,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC;IACzC,WAAW,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAC;IACxC,gBAAgB,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAC;IAC7C,MAAM,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAC;IACnC,kBAAkB,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAC;IAC/C,gBAAgB,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAC;CAChD;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,SAAS,MAAM,EAC3D,OAAO,EAAE,iCAAiC,CAAC,KAAK,CAAC;sBA0BtC,KAAK;;;EAoDnB"}
@@ -0,0 +1,46 @@
1
+ import { useCallback } from 'react';
2
+ import { resolveInternalItemIndex } from '../utils/idResolution.js';
3
+ import { useCardSelection } from './useCardSelection.js';
4
+ import { useDetailPanelClose } from './useDetailPanelClose.js';
5
+ import { useScrollSync } from './useScrollSync.js';
6
+ import { useAnimationModeTracking } from './useAnimationModeTracking.js';
7
+ import { useViewModeScrollHandling } from './useViewModeScrollHandling.js';
8
+
9
+ function usePivotViewerInteractions(options) {
10
+ const { data, getItemId, containerRef, axisLabelsRef, viewMode, grouping, layout, selectedItem, zoomLevel, containerDimensions, preSelectionState, filterState, rangeFilterState, search, activeDimensionKey, setAnimationMode, setZoomLevel, setIsZooming, setSelectedItem, setPreSelectionState, } = options;
11
+ const resolveId = useCallback((item) => resolveInternalItemIndex(data, item, getItemId), [data, getItemId]);
12
+ useAnimationModeTracking(filterState, rangeFilterState, search, activeDimensionKey, viewMode, setAnimationMode);
13
+ useScrollSync(containerRef, axisLabelsRef, viewMode);
14
+ useViewModeScrollHandling({
15
+ containerRef,
16
+ viewMode,
17
+ grouping,
18
+ layout,
19
+ selectedItem,
20
+ zoomLevel,
21
+ resolveId,
22
+ data,
23
+ setPreSelectionState,
24
+ });
25
+ const handleCardClick = useCardSelection({ ...options, resolveId });
26
+ const closeDetail = useDetailPanelClose({
27
+ selectedItem,
28
+ preSelectionState,
29
+ zoomLevel,
30
+ viewMode,
31
+ layout,
32
+ containerRef,
33
+ containerDimensions,
34
+ grouping,
35
+ data,
36
+ resolveId,
37
+ setZoomLevel,
38
+ setIsZooming,
39
+ setSelectedItem,
40
+ setPreSelectionState,
41
+ });
42
+ return { resolveId, handleCardClick, closeDetail };
43
+ }
44
+
45
+ export { usePivotViewerInteractions };
46
+ //# sourceMappingURL=usePivotViewerInteractions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePivotViewerInteractions.js","sources":["../../../../PivotViewer/hooks/usePivotViewerInteractions.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { useCallback } from 'react';\nimport type { RefObject } from 'react';\nimport { resolveInternalItemIndex } from '../utils/idResolution';\nimport { useCardSelection } from './useCardSelection';\nimport { useDetailPanelClose } from './useDetailPanelClose';\nimport { useScrollSync } from './useScrollSync';\nimport { useAnimationModeTracking } from './useAnimationModeTracking';\nimport { useViewModeScrollHandling } from './useViewModeScrollHandling';\n\ntype CardSelectionParams<TItem extends object> = Parameters<typeof useCardSelection<TItem>>[0];\ntype AnimationTrackingParams = Parameters<typeof useAnimationModeTracking>;\n\nexport interface UsePivotViewerInteractionsOptions<TItem extends object>\n extends Omit<CardSelectionParams<TItem>, 'resolveId' | 'containerRef'> {\n containerRef: RefObject<HTMLDivElement>;\n axisLabelsRef: RefObject<HTMLDivElement>;\n filterState: AnimationTrackingParams[0];\n rangeFilterState: AnimationTrackingParams[1];\n search: AnimationTrackingParams[2];\n activeDimensionKey: AnimationTrackingParams[3];\n setAnimationMode: AnimationTrackingParams[5];\n}\n\n/**\n * Wires scroll syncing, animation tracking, card selection and detail-panel closing.\n *\n * @param options - The viewer state and setters the interactions operate on.\n * @returns The id resolver, card click handler and detail close handler.\n */\nexport function usePivotViewerInteractions<TItem extends object>(\n options: UsePivotViewerInteractionsOptions<TItem>,\n) {\n const {\n data,\n getItemId,\n containerRef,\n axisLabelsRef,\n viewMode,\n grouping,\n layout,\n selectedItem,\n zoomLevel,\n containerDimensions,\n preSelectionState,\n filterState,\n rangeFilterState,\n search,\n activeDimensionKey,\n setAnimationMode,\n setZoomLevel,\n setIsZooming,\n setSelectedItem,\n setPreSelectionState,\n } = options;\n\n const resolveId = useCallback(\n (item: TItem) => resolveInternalItemIndex(data, item, getItemId),\n [data, getItemId],\n );\n\n // Track animation mode changes\n useAnimationModeTracking(\n filterState,\n rangeFilterState,\n search,\n activeDimensionKey,\n viewMode,\n setAnimationMode,\n );\n\n // Sync axis labels scroll with container scroll\n useScrollSync(containerRef, axisLabelsRef, viewMode);\n\n // Handle scroll positioning when switching view modes or grouping changes\n useViewModeScrollHandling({\n containerRef,\n viewMode,\n grouping,\n layout,\n selectedItem,\n zoomLevel,\n resolveId,\n data,\n setPreSelectionState,\n });\n\n // Handle card selection (click)\n const handleCardClick = useCardSelection({ ...options, resolveId });\n\n // Handle detail panel close\n const closeDetail = useDetailPanelClose({\n selectedItem,\n preSelectionState,\n zoomLevel,\n viewMode,\n layout,\n containerRef,\n containerDimensions,\n grouping,\n data,\n resolveId,\n setZoomLevel,\n setIsZooming,\n setSelectedItem,\n setPreSelectionState,\n });\n\n return { resolveId, handleCardClick, closeDetail };\n}\n"],"names":[],"mappings":";;;;;;;;AAgCM,SAAU,0BAA0B,CACtC,OAAiD,EAAA;AAEjD,IAAA,MAAM,EACF,IAAI,EACJ,SAAS,EACT,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,YAAY,EACZ,SAAS,EACT,mBAAmB,EACnB,iBAAiB,EACjB,WAAW,EACX,gBAAgB,EAChB,MAAM,EACN,kBAAkB,EAClB,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,oBAAoB,GACvB,GAAG,OAAO;IAEX,MAAM,SAAS,GAAG,WAAW,CACzB,CAAC,IAAW,KAAK,wBAAwB,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,EAChE,CAAC,IAAI,EAAE,SAAS,CAAC,CACpB;AAGD,IAAA,wBAAwB,CACpB,WAAW,EACX,gBAAgB,EAChB,MAAM,EACN,kBAAkB,EAClB,QAAQ,EACR,gBAAgB,CACnB;AAGD,IAAA,aAAa,CAAC,YAAY,EAAE,aAAa,EAAE,QAAQ,CAAC;AAGpD,IAAA,yBAAyB,CAAC;QACtB,YAAY;QACZ,QAAQ;QACR,QAAQ;QACR,MAAM;QACN,YAAY;QACZ,SAAS;QACT,SAAS;QACT,IAAI;QACJ,oBAAoB;AACvB,KAAA,CAAC;IAGF,MAAM,eAAe,GAAG,gBAAgB,CAAC,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,CAAC;IAGnE,MAAM,WAAW,GAAG,mBAAmB,CAAC;QACpC,YAAY;QACZ,iBAAiB;QACjB,SAAS;QACT,QAAQ;QACR,MAAM;QACN,YAAY;QACZ,mBAAmB;QACnB,QAAQ;QACR,IAAI;QACJ,SAAS;QACT,YAAY;QACZ,YAAY;QACZ,eAAe;QACf,oBAAoB;AACvB,KAAA,CAAC;AAEF,IAAA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,WAAW,EAAE;AACtD;;"}
@@ -0,0 +1,22 @@
1
+ import type { GroupSpec, GroupingResult } from '../engine/types.js';
2
+ import type { ViewMode } from '../components/Toolbar.js';
3
+ /** Inputs for {@link useRawGrouping}. */
4
+ export interface UseRawGroupingOptions {
5
+ ready: boolean;
6
+ visibleIds: Uint32Array;
7
+ currentGroupBy: GroupSpec;
8
+ viewMode: ViewMode;
9
+ activeDimensionKey: string | null;
10
+ computeGrouping: (visibleIds: Uint32Array, groupBy: GroupSpec) => Promise<GroupingResult>;
11
+ sortIds: (visibleIds: Uint32Array, sortBy: string) => Promise<Uint32Array>;
12
+ }
13
+ /**
14
+ * Computes the (unpresented) grouping of the visible ids. Every async branch ignores a result
15
+ * after its dependencies change, so an older worker response can never overwrite a newer
16
+ * filter/search/view selection.
17
+ *
18
+ * @param options - Engine, view mode and visible ids.
19
+ * @returns The raw grouping result.
20
+ */
21
+ export declare function useRawGrouping({ ready, visibleIds, currentGroupBy, viewMode, activeDimensionKey, computeGrouping, sortIds, }: UseRawGroupingOptions): GroupingResult;
22
+ //# sourceMappingURL=useRawGrouping.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRawGrouping.d.ts","sourceRoot":"","sources":["../../../../PivotViewer/hooks/useRawGrouping.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,oBAAiB,CAAC;AACjE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAAuB,CAAC;AAEtD,yCAAyC;AACzC,MAAM,WAAW,qBAAqB;IAClC,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,WAAW,CAAC;IACxB,cAAc,EAAE,SAAS,CAAC;IAC1B,QAAQ,EAAE,QAAQ,CAAC;IACnB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,eAAe,EAAE,CAAC,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IAC1F,OAAO,EAAE,CAAC,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;CAC9E;AAiBD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,EAC3B,KAAK,EACL,UAAU,EACV,cAAc,EACd,QAAQ,EACR,kBAAkB,EAClB,eAAe,EACf,OAAO,GACV,EAAE,qBAAqB,GAAG,cAAc,CAsCxC"}
@@ -0,0 +1,56 @@
1
+ import { useState, useEffect } from 'react';
2
+
3
+ function singleGroup(ids) {
4
+ return {
5
+ groups: [
6
+ {
7
+ key: 'all',
8
+ label: 'All Items',
9
+ value: 'all',
10
+ ids,
11
+ count: ids.length,
12
+ },
13
+ ],
14
+ };
15
+ }
16
+ function useRawGrouping({ ready, visibleIds, currentGroupBy, viewMode, activeDimensionKey, computeGrouping, sortIds, }) {
17
+ const [rawGrouping, setRawGrouping] = useState({ groups: [] });
18
+ useEffect(() => {
19
+ if (!ready || visibleIds.length === 0) {
20
+ setRawGrouping({ groups: [] });
21
+ return;
22
+ }
23
+ let cancelled = false;
24
+ if (viewMode !== 'collection') {
25
+ void computeGrouping(visibleIds, currentGroupBy).then((result) => {
26
+ if (!cancelled)
27
+ setRawGrouping(result);
28
+ });
29
+ }
30
+ else if (activeDimensionKey) {
31
+ void sortIds(visibleIds, activeDimensionKey).then((sortedIds) => {
32
+ if (cancelled)
33
+ return;
34
+ setRawGrouping(singleGroup(sortedIds));
35
+ });
36
+ }
37
+ else {
38
+ setRawGrouping(singleGroup(visibleIds));
39
+ }
40
+ return () => {
41
+ cancelled = true;
42
+ };
43
+ }, [
44
+ ready,
45
+ visibleIds,
46
+ currentGroupBy,
47
+ viewMode,
48
+ computeGrouping,
49
+ sortIds,
50
+ activeDimensionKey,
51
+ ]);
52
+ return rawGrouping;
53
+ }
54
+
55
+ export { useRawGrouping };
56
+ //# sourceMappingURL=useRawGrouping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRawGrouping.js","sources":["../../../../PivotViewer/hooks/useRawGrouping.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { useEffect, useState } from 'react';\nimport type { GroupSpec, GroupingResult } from '../engine/types';\nimport type { ViewMode } from '../components/Toolbar';\n\n/** Inputs for {@link useRawGrouping}. */\nexport interface UseRawGroupingOptions {\n ready: boolean;\n visibleIds: Uint32Array;\n currentGroupBy: GroupSpec;\n viewMode: ViewMode;\n activeDimensionKey: string | null;\n computeGrouping: (visibleIds: Uint32Array, groupBy: GroupSpec) => Promise<GroupingResult>;\n sortIds: (visibleIds: Uint32Array, sortBy: string) => Promise<Uint32Array>;\n}\n\n/** The single \"all items\" group shown in collection mode. */\nfunction singleGroup(ids: Uint32Array): GroupingResult {\n return {\n groups: [\n {\n key: 'all',\n label: 'All Items',\n value: 'all',\n ids,\n count: ids.length,\n },\n ],\n };\n}\n\n/**\n * Computes the (unpresented) grouping of the visible ids. Every async branch ignores a result\n * after its dependencies change, so an older worker response can never overwrite a newer\n * filter/search/view selection.\n *\n * @param options - Engine, view mode and visible ids.\n * @returns The raw grouping result.\n */\nexport function useRawGrouping({\n ready,\n visibleIds,\n currentGroupBy,\n viewMode,\n activeDimensionKey,\n computeGrouping,\n sortIds,\n}: UseRawGroupingOptions): GroupingResult {\n const [rawGrouping, setRawGrouping] = useState<GroupingResult>({ groups: [] });\n\n useEffect(() => {\n if (!ready || visibleIds.length === 0) {\n setRawGrouping({ groups: [] });\n return;\n }\n\n let cancelled = false;\n if (viewMode !== 'collection') {\n void computeGrouping(visibleIds, currentGroupBy).then((result) => {\n if (!cancelled) setRawGrouping(result);\n });\n } else if (activeDimensionKey) {\n // In collection mode, create a single group with all items.\n void sortIds(visibleIds, activeDimensionKey).then((sortedIds) => {\n if (cancelled) return;\n setRawGrouping(singleGroup(sortedIds));\n });\n } else {\n setRawGrouping(singleGroup(visibleIds));\n }\n\n return () => {\n cancelled = true;\n };\n }, [\n ready,\n visibleIds,\n currentGroupBy,\n viewMode,\n computeGrouping,\n sortIds,\n activeDimensionKey,\n ]);\n\n return rawGrouping;\n}\n"],"names":[],"mappings":";;AAmBA,SAAS,WAAW,CAAC,GAAgB,EAAA;IACjC,OAAO;AACH,QAAA,MAAM,EAAE;AACJ,YAAA;AACI,gBAAA,GAAG,EAAE,KAAK;AACV,gBAAA,KAAK,EAAE,WAAW;AAClB,gBAAA,KAAK,EAAE,KAAK;gBACZ,GAAG;gBACH,KAAK,EAAE,GAAG,CAAC,MAAM;AACpB,aAAA;AACJ,SAAA;KACJ;AACL;SAUgB,cAAc,CAAC,EAC3B,KAAK,EACL,UAAU,EACV,cAAc,EACd,QAAQ,EACR,kBAAkB,EAClB,eAAe,EACf,OAAO,GACa,EAAA;AACpB,IAAA,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAiB,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAE9E,SAAS,CAAC,MAAK;QACX,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;AACnC,YAAA,cAAc,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;YAC9B;QACJ;QAEA,IAAI,SAAS,GAAG,KAAK;AACrB,QAAA,IAAI,QAAQ,KAAK,YAAY,EAAE;AAC3B,YAAA,KAAK,eAAe,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAI;AAC7D,gBAAA,IAAI,CAAC,SAAS;oBAAE,cAAc,CAAC,MAAM,CAAC;AAC1C,YAAA,CAAC,CAAC;QACN;aAAO,IAAI,kBAAkB,EAAE;AAE3B,YAAA,KAAK,OAAO,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,KAAI;AAC5D,gBAAA,IAAI,SAAS;oBAAE;AACf,gBAAA,cAAc,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;AAC1C,YAAA,CAAC,CAAC;QACN;aAAO;AACH,YAAA,cAAc,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QAC3C;AAEA,QAAA,OAAO,MAAK;YACR,SAAS,GAAG,IAAI;AACpB,QAAA,CAAC;AACL,IAAA,CAAC,EAAE;QACC,KAAK;QACL,UAAU;QACV,cAAc;QACd,QAAQ;QACR,eAAe;QACf,OAAO;QACP,kBAAkB;AACrB,KAAA,CAAC;AAEF,IAAA,OAAO,WAAW;AACtB;;"}
@@ -0,0 +1,12 @@
1
+ import type { RefObject } from 'react';
2
+ /**
3
+ * Reports the container's scroll offset whenever it scrolls.
4
+ *
5
+ * @param containerRef - The scrollable container.
6
+ * @param setScrollPosition - Receives the new scroll offset.
7
+ */
8
+ export declare function useScrollPositionTracking(containerRef: RefObject<HTMLDivElement>, setScrollPosition: (position: {
9
+ x: number;
10
+ y: number;
11
+ }) => void): void;
12
+ //# sourceMappingURL=useScrollPositionTracking.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useScrollPositionTracking.d.ts","sourceRoot":"","sources":["../../../../PivotViewer/hooks/useScrollPositionTracking.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACrC,YAAY,EAAE,SAAS,CAAC,cAAc,CAAC,EACvC,iBAAiB,EAAE,CAAC,QAAQ,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,KAAK,IAAI,QAgBlE"}
@@ -0,0 +1,20 @@
1
+ import { useEffect } from 'react';
2
+
3
+ function useScrollPositionTracking(containerRef, setScrollPosition) {
4
+ useEffect(() => {
5
+ const container = containerRef.current;
6
+ if (!container)
7
+ return;
8
+ const handleScroll = () => {
9
+ setScrollPosition({
10
+ x: container.scrollLeft,
11
+ y: container.scrollTop,
12
+ });
13
+ };
14
+ container.addEventListener('scroll', handleScroll);
15
+ return () => container.removeEventListener('scroll', handleScroll);
16
+ }, [containerRef, setScrollPosition]);
17
+ }
18
+
19
+ export { useScrollPositionTracking };
20
+ //# sourceMappingURL=useScrollPositionTracking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useScrollPositionTracking.js","sources":["../../../../PivotViewer/hooks/useScrollPositionTracking.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { useEffect } from 'react';\nimport type { RefObject } from 'react';\n\n/**\n * Reports the container's scroll offset whenever it scrolls.\n *\n * @param containerRef - The scrollable container.\n * @param setScrollPosition - Receives the new scroll offset.\n */\nexport function useScrollPositionTracking(\n containerRef: RefObject<HTMLDivElement>,\n setScrollPosition: (position: { x: number; y: number }) => void,\n) {\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const handleScroll = () => {\n setScrollPosition({\n x: container.scrollLeft,\n y: container.scrollTop,\n });\n };\n\n container.addEventListener('scroll', handleScroll);\n return () => container.removeEventListener('scroll', handleScroll);\n }, [containerRef, setScrollPosition]);\n}\n"],"names":[],"mappings":";;AAYM,SAAU,yBAAyB,CACrC,YAAuC,EACvC,iBAA+D,EAAA;IAE/D,SAAS,CAAC,MAAK;AACX,QAAA,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO;AACtC,QAAA,IAAI,CAAC,SAAS;YAAE;QAEhB,MAAM,YAAY,GAAG,MAAK;AACtB,YAAA,iBAAiB,CAAC;gBACd,CAAC,EAAE,SAAS,CAAC,UAAU;gBACvB,CAAC,EAAE,SAAS,CAAC,SAAS;AACzB,aAAA,CAAC;AACN,QAAA,CAAC;AAED,QAAA,SAAS,CAAC,gBAAgB,CAAC,QAAQ,EAAE,YAAY,CAAC;QAClD,OAAO,MAAM,SAAS,CAAC,mBAAmB,CAAC,QAAQ,EAAE,YAAY,CAAC;AACtE,IAAA,CAAC,EAAE,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;AACzC;;"}
@@ -0,0 +1,16 @@
1
+ import type { GroupingResult } from '../engine/types.js';
2
+ import type { ViewMode } from '../components/Toolbar.js';
3
+ /**
4
+ * Computes the card layout at base dimensions (zoom is applied as a transform).
5
+ *
6
+ * @param grouping - The presented grouping to lay out.
7
+ * @param viewMode - The current view mode.
8
+ * @param zoomLevel - The current zoom level.
9
+ * @param containerDimensions - The measured container size.
10
+ * @returns The computed layout.
11
+ */
12
+ export declare function useViewerLayout(grouping: GroupingResult, viewMode: ViewMode, zoomLevel: number, containerDimensions: {
13
+ width: number;
14
+ height: number;
15
+ }): import("../engine/types.js").LayoutResult;
16
+ //# sourceMappingURL=useViewerLayout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useViewerLayout.d.ts","sourceRoot":"","sources":["../../../../PivotViewer/hooks/useViewerLayout.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAiB,CAAC;AAGtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAAuB,CAAC;AAEtD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC3B,QAAQ,EAAE,cAAc,EACxB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,MAAM,EACjB,mBAAmB,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,6CA0BzD"}
@@ -0,0 +1,29 @@
1
+ import { useMemo } from 'react';
2
+ import { computeLayout } from '../engine/layout.js';
3
+ import { BASE_CARD_WIDTH, BASE_CARD_HEIGHT, CARDS_PER_COLUMN } from '../constants.js';
4
+
5
+ function useViewerLayout(grouping, viewMode, zoomLevel, containerDimensions) {
6
+ return useMemo(() => {
7
+ const containerWidth = containerDimensions.width / zoomLevel;
8
+ const containerHeight = viewMode === 'collection'
9
+ ? containerDimensions.height / zoomLevel
10
+ : containerDimensions.height;
11
+ return computeLayout(grouping, {
12
+ viewMode,
13
+ cardWidth: BASE_CARD_WIDTH,
14
+ cardHeight: BASE_CARD_HEIGHT,
15
+ cardsPerColumn: CARDS_PER_COLUMN,
16
+ containerWidth,
17
+ containerHeight,
18
+ });
19
+ }, [
20
+ grouping,
21
+ viewMode,
22
+ zoomLevel,
23
+ containerDimensions.width,
24
+ containerDimensions.height,
25
+ ]);
26
+ }
27
+
28
+ export { useViewerLayout };
29
+ //# sourceMappingURL=useViewerLayout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useViewerLayout.js","sources":["../../../../PivotViewer/hooks/useViewerLayout.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { useMemo } from 'react';\nimport type { GroupingResult } from '../engine/types';\nimport { computeLayout } from '../engine/layout';\nimport { BASE_CARD_WIDTH, BASE_CARD_HEIGHT, CARDS_PER_COLUMN, GROUP_SPACING } from '../constants';\nimport type { ViewMode } from '../components/Toolbar';\n\n/**\n * Computes the card layout at base dimensions (zoom is applied as a transform).\n *\n * @param grouping - The presented grouping to lay out.\n * @param viewMode - The current view mode.\n * @param zoomLevel - The current zoom level.\n * @param containerDimensions - The measured container size.\n * @returns The computed layout.\n */\nexport function useViewerLayout(\n grouping: GroupingResult,\n viewMode: ViewMode,\n zoomLevel: number,\n containerDimensions: { width: number; height: number },\n) {\n return useMemo(() => {\n const containerWidth = containerDimensions.width / zoomLevel;\n // For grouped mode, use fixed container height to ensure stable layout during zoom\n const containerHeight =\n viewMode === 'collection'\n ? containerDimensions.height / zoomLevel\n : containerDimensions.height;\n\n return computeLayout(grouping, {\n viewMode,\n cardWidth: BASE_CARD_WIDTH,\n cardHeight: BASE_CARD_HEIGHT,\n cardsPerColumn: CARDS_PER_COLUMN,\n groupSpacing: GROUP_SPACING,\n containerWidth,\n containerHeight,\n });\n }, [\n grouping,\n viewMode,\n zoomLevel,\n containerDimensions.width,\n containerDimensions.height,\n ]);\n}\n"],"names":[],"mappings":";;;;AAkBM,SAAU,eAAe,CAC3B,QAAwB,EACxB,QAAkB,EAClB,SAAiB,EACjB,mBAAsD,EAAA;IAEtD,OAAO,OAAO,CAAC,MAAK;AAChB,QAAA,MAAM,cAAc,GAAG,mBAAmB,CAAC,KAAK,GAAG,SAAS;AAE5D,QAAA,MAAM,eAAe,GACjB,QAAQ,KAAK;AACT,cAAE,mBAAmB,CAAC,MAAM,GAAG;AAC/B,cAAE,mBAAmB,CAAC,MAAM;QAEpC,OAAO,aAAa,CAAC,QAAQ,EAAE;YAC3B,QAAQ;AACR,YAAA,SAAS,EAAE,eAAe;AAC1B,YAAA,UAAU,EAAE,gBAAgB;AAC5B,YAAA,cAAc,EAAE,gBAAgB;AAChC,YACA,cAAc;YACd,eAAe;AAClB,SAAA,CAAC;AACN,IAAA,CAAC,EAAE;QACC,QAAQ;QACR,QAAQ;QACR,SAAS;AACT,QAAA,mBAAmB,CAAC,KAAK;AACzB,QAAA,mBAAmB,CAAC,MAAM;AAC7B,KAAA,CAAC;AACN;;"}
@@ -0,0 +1,21 @@
1
+ import type { FilterSpec, FilterResult } from '../engine/types.js';
2
+ import type { PivotViewerProps } from '../types.js';
3
+ /** Inputs for {@link useVisibleIds}. */
4
+ export interface UseVisibleIdsOptions<TItem extends object> {
5
+ ready: boolean;
6
+ data: TItem[];
7
+ currentFilters: FilterSpec[];
8
+ search: string;
9
+ searchFields: PivotViewerProps<TItem>['searchFields'];
10
+ engineApplyFilters: (filters: FilterSpec[]) => Promise<FilterResult>;
11
+ }
12
+ /**
13
+ * Applies filters, then narrows the result by search - a post-filter step over the visible
14
+ * Uint32 ids so it applies identically whether the engine result came from the worker or
15
+ * its synchronous fallback.
16
+ *
17
+ * @param options - Engine, data, filters and search inputs.
18
+ * @returns The ids currently visible.
19
+ */
20
+ export declare function useVisibleIds<TItem extends object>({ ready, data, currentFilters, search, searchFields, engineApplyFilters, }: UseVisibleIdsOptions<TItem>): Uint32Array;
21
+ //# sourceMappingURL=useVisibleIds.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useVisibleIds.d.ts","sourceRoot":"","sources":["../../../../PivotViewer/hooks/useVisibleIds.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,oBAAiB,CAAC;AAEhE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAU,CAAC;AAEjD,wCAAwC;AACxC,MAAM,WAAW,oBAAoB,CAAC,KAAK,SAAS,MAAM;IACtD,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,KAAK,EAAE,CAAC;IACd,cAAc,EAAE,UAAU,EAAE,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,gBAAgB,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,CAAC;IACtD,kBAAkB,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;CACxE;AAWD;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,KAAK,SAAS,MAAM,EAAE,EAChD,KAAK,EACL,IAAI,EACJ,cAAc,EACd,MAAM,EACN,YAAY,EACZ,kBAAkB,GACrB,EAAE,oBAAoB,CAAC,KAAK,CAAC,GAAG,WAAW,CAyB3C"}
@@ -0,0 +1,34 @@
1
+ import { useState, useEffect } from 'react';
2
+ import { filterVisibleIdsBySearch } from '../utils/search.js';
3
+
4
+ function allIds(count) {
5
+ const ids = new Uint32Array(count);
6
+ for (let i = 0; i < count; i++) {
7
+ ids[i] = i;
8
+ }
9
+ return ids;
10
+ }
11
+ function useVisibleIds({ ready, data, currentFilters, search, searchFields, engineApplyFilters, }) {
12
+ const [visibleIds, setVisibleIds] = useState(new Uint32Array(0));
13
+ useEffect(() => {
14
+ if (!ready)
15
+ return;
16
+ let cancelled = false;
17
+ void engineApplyFilters(currentFilters).then((result) => {
18
+ if (cancelled)
19
+ return;
20
+ let ids = result.visibleIds;
21
+ if (ids.length === 0 && currentFilters.length === 0 && data.length > 0) {
22
+ ids = allIds(data.length);
23
+ }
24
+ setVisibleIds(filterVisibleIdsBySearch(data, ids, search, searchFields));
25
+ });
26
+ return () => {
27
+ cancelled = true;
28
+ };
29
+ }, [ready, currentFilters, engineApplyFilters, data, search, searchFields]);
30
+ return visibleIds;
31
+ }
32
+
33
+ export { useVisibleIds };
34
+ //# sourceMappingURL=useVisibleIds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useVisibleIds.js","sources":["../../../../PivotViewer/hooks/useVisibleIds.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { useEffect, useState } from 'react';\nimport type { FilterSpec, FilterResult } from '../engine/types';\nimport { filterVisibleIdsBySearch } from '../utils/search';\nimport type { PivotViewerProps } from '../types';\n\n/** Inputs for {@link useVisibleIds}. */\nexport interface UseVisibleIdsOptions<TItem extends object> {\n ready: boolean;\n data: TItem[];\n currentFilters: FilterSpec[];\n search: string;\n searchFields: PivotViewerProps<TItem>['searchFields'];\n engineApplyFilters: (filters: FilterSpec[]) => Promise<FilterResult>;\n}\n\n/** The full dataset's ids, used when the engine returns nothing while no filters are active. */\nfunction allIds(count: number): Uint32Array {\n const ids = new Uint32Array(count);\n for (let i = 0; i < count; i++) {\n ids[i] = i;\n }\n return ids;\n}\n\n/**\n * Applies filters, then narrows the result by search - a post-filter step over the visible\n * Uint32 ids so it applies identically whether the engine result came from the worker or\n * its synchronous fallback.\n *\n * @param options - Engine, data, filters and search inputs.\n * @returns The ids currently visible.\n */\nexport function useVisibleIds<TItem extends object>({\n ready,\n data,\n currentFilters,\n search,\n searchFields,\n engineApplyFilters,\n}: UseVisibleIdsOptions<TItem>): Uint32Array {\n const [visibleIds, setVisibleIds] = useState<Uint32Array>(new Uint32Array(0));\n\n useEffect(() => {\n if (!ready) return;\n\n let cancelled = false;\n void engineApplyFilters(currentFilters).then((result) => {\n if (cancelled) return;\n let ids = result.visibleIds;\n\n // If the engine failed to return any IDs while no filters are active,\n // fall back to showing the full dataset so the canvas never renders empty.\n if (ids.length === 0 && currentFilters.length === 0 && data.length > 0) {\n ids = allIds(data.length);\n }\n\n setVisibleIds(filterVisibleIdsBySearch(data, ids, search, searchFields));\n });\n return () => {\n cancelled = true;\n };\n }, [ready, currentFilters, engineApplyFilters, data, search, searchFields]);\n\n return visibleIds;\n}\n"],"names":[],"mappings":";;;AAmBA,SAAS,MAAM,CAAC,KAAa,EAAA;AACzB,IAAA,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,KAAK,CAAC;AAClC,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;AAC5B,QAAA,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACd;AACA,IAAA,OAAO,GAAG;AACd;AAUM,SAAU,aAAa,CAAuB,EAChD,KAAK,EACL,IAAI,EACJ,cAAc,EACd,MAAM,EACN,YAAY,EACZ,kBAAkB,GACQ,EAAA;AAC1B,IAAA,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAc,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;IAE7E,SAAS,CAAC,MAAK;AACX,QAAA,IAAI,CAAC,KAAK;YAAE;QAEZ,IAAI,SAAS,GAAG,KAAK;QACrB,KAAK,kBAAkB,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAI;AACpD,YAAA,IAAI,SAAS;gBAAE;AACf,YAAA,IAAI,GAAG,GAAG,MAAM,CAAC,UAAU;AAI3B,YAAA,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;AACpE,gBAAA,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;YAC7B;AAEA,YAAA,aAAa,CAAC,wBAAwB,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;AAC5E,QAAA,CAAC,CAAC;AACF,QAAA,OAAO,MAAK;YACR,SAAS,GAAG,IAAI;AACpB,QAAA,CAAC;AACL,IAAA,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;AAE3E,IAAA,OAAO,UAAU;AACrB;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"CratisComponentsDefaults.d.ts","sourceRoot":"","sources":["../../../configuration/CratisComponentsDefaults.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uCAAoC,CAAC;AAEjF,sDAAsD;AACtD,eAAO,MAAM,cAAc,EAAE,sBA+D5B,CAAC"}
1
+ {"version":3,"file":"CratisComponentsDefaults.d.ts","sourceRoot":"","sources":["../../../configuration/CratisComponentsDefaults.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uCAAoC,CAAC;AAEjF,sDAAsD;AACtD,eAAO,MAAM,cAAc,EAAE,sBAiE5B,CAAC"}
@@ -7,6 +7,8 @@ const cratisDefaults = {
7
7
  previous: 'Previous page',
8
8
  next: 'Next page',
9
9
  last: 'Last page',
10
+ page: (page) => `Page ${page}`,
11
+ pages: 'Pages',
10
12
  },
11
13
  datePicker: {
12
14
  today: 'Today',
@@ -1 +1 @@
1
- {"version":3,"file":"CratisComponentsDefaults.js","sources":["../../../configuration/CratisComponentsDefaults.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport type { CratisComponentsConfig } from '../Common/CratisComponentsProvider';\n\n/** Default locale and English Components messages. */\nexport const cratisDefaults: CratisComponentsConfig = {\n locale: 'en-US',\n messages: {\n paginator: {\n navigation: 'Pagination',\n first: 'First page',\n previous: 'Previous page',\n next: 'Next page',\n last: 'Last page',\n },\n datePicker: {\n today: 'Today',\n clear: 'Clear',\n openCalendar: 'Open calendar',\n previousMonth: 'Previous month',\n nextMonth: 'Next month',\n label: 'Date',\n },\n dropdown: {\n showOptions: 'Show options',\n clearSelection: 'Clear selection',\n },\n dialog: {\n ok: 'Ok',\n cancel: 'Cancel',\n yes: 'Yes',\n no: 'No',\n close: 'Close',\n },\n stepper: {\n next: 'Next',\n previous: 'Previous',\n submit: 'Submit',\n },\n notifications: {\n dismiss: 'Dismiss',\n region: 'Notifications',\n },\n dataTable: {\n selectRow: 'Select row',\n selectAllRows: 'Select all rows',\n search: 'Search…',\n searchAriaLabel: 'Search table',\n loading: 'Loading…',\n failed: 'Could not load data.',\n unauthorized: 'You are not authorized to view this data.',\n },\n filter: {\n label: 'Filters',\n // Leave searchAriaLabel unset: existing placeholders remain search names by default.\n },\n columnFilter: {\n matchModeAriaLabel: 'Match mode',\n clear: 'Clear',\n apply: 'Apply',\n true: 'True',\n false: 'False',\n },\n toolbar: {\n label: 'Tools',\n closeDrawer: 'Close',\n },\n },\n};\n"],"names":[],"mappings":"AAMO,MAAM,cAAc,GAA2B;AAClD,IAAA,MAAM,EAAE,OAAO;AACf,IAAA,QAAQ,EAAE;AACN,QAAA,SAAS,EAAE;AACP,YAAA,UAAU,EAAE,YAAY;AACxB,YAAA,KAAK,EAAE,YAAY;AACnB,YAAA,QAAQ,EAAE,eAAe;AACzB,YAAA,IAAI,EAAE,WAAW;AACjB,YAAA,IAAI,EAAE,WAAW;AACpB,SAAA;AACD,QAAA,UAAU,EAAE;AACR,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,YAAY,EAAE,eAAe;AAC7B,YAAA,aAAa,EAAE,gBAAgB;AAC/B,YAAA,SAAS,EAAE,YAAY;AACvB,YAAA,KAAK,EAAE,MAAM;AAChB,SAAA;AACD,QAAA,QAAQ,EAAE;AACN,YAAA,WAAW,EAAE,cAAc;AAC3B,YAAA,cAAc,EAAE,iBAAiB;AACpC,SAAA;AACD,QAAA,MAAM,EAAE;AACJ,YAAA,EAAE,EAAE,IAAI;AACR,YAAA,MAAM,EAAE,QAAQ;AAChB,YAAA,GAAG,EAAE,KAAK;AACV,YAAA,EAAE,EAAE,IAAI;AACR,YAAA,KAAK,EAAE,OAAO;AACjB,SAAA;AACD,QAAA,OAAO,EAAE;AACL,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,QAAQ,EAAE,UAAU;AACpB,YAAA,MAAM,EAAE,QAAQ;AACnB,SAAA;AACD,QAAA,aAAa,EAAE;AACX,YAAA,OAAO,EAAE,SAAS;AAClB,YAAA,MAAM,EAAE,eAAe;AAC1B,SAAA;AACD,QAAA,SAAS,EAAE;AACP,YAAA,SAAS,EAAE,YAAY;AACvB,YAAA,aAAa,EAAE,iBAAiB;AAChC,YAAA,MAAM,EAAE,SAAS;AACjB,YAAA,eAAe,EAAE,cAAc;AAC/B,YAAA,OAAO,EAAE,UAAU;AACnB,YAAA,MAAM,EAAE,sBAAsB;AAC9B,YAAA,YAAY,EAAE,2CAA2C;AAC5D,SAAA;AACD,QAAA,MAAM,EAAE;AACJ,YAAA,KAAK,EAAE,SAAS;AAEnB,SAAA;AACD,QAAA,YAAY,EAAE;AACV,YAAA,kBAAkB,EAAE,YAAY;AAChC,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,KAAK,EAAE,OAAO;AACjB,SAAA;AACD,QAAA,OAAO,EAAE;AACL,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,WAAW,EAAE,OAAO;AACvB,SAAA;AACJ,KAAA;;;"}
1
+ {"version":3,"file":"CratisComponentsDefaults.js","sources":["../../../configuration/CratisComponentsDefaults.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport type { CratisComponentsConfig } from '../Common/CratisComponentsProvider';\n\n/** Default locale and English Components messages. */\nexport const cratisDefaults: CratisComponentsConfig = {\n locale: 'en-US',\n messages: {\n paginator: {\n navigation: 'Pagination',\n first: 'First page',\n previous: 'Previous page',\n next: 'Next page',\n last: 'Last page',\n page: (page) => `Page ${page}`,\n pages: 'Pages',\n },\n datePicker: {\n today: 'Today',\n clear: 'Clear',\n openCalendar: 'Open calendar',\n previousMonth: 'Previous month',\n nextMonth: 'Next month',\n label: 'Date',\n },\n dropdown: {\n showOptions: 'Show options',\n clearSelection: 'Clear selection',\n },\n dialog: {\n ok: 'Ok',\n cancel: 'Cancel',\n yes: 'Yes',\n no: 'No',\n close: 'Close',\n },\n stepper: {\n next: 'Next',\n previous: 'Previous',\n submit: 'Submit',\n },\n notifications: {\n dismiss: 'Dismiss',\n region: 'Notifications',\n },\n dataTable: {\n selectRow: 'Select row',\n selectAllRows: 'Select all rows',\n search: 'Search…',\n searchAriaLabel: 'Search table',\n loading: 'Loading…',\n failed: 'Could not load data.',\n unauthorized: 'You are not authorized to view this data.',\n },\n filter: {\n label: 'Filters',\n // Leave searchAriaLabel unset: existing placeholders remain search names by default.\n },\n columnFilter: {\n matchModeAriaLabel: 'Match mode',\n clear: 'Clear',\n apply: 'Apply',\n true: 'True',\n false: 'False',\n },\n toolbar: {\n label: 'Tools',\n closeDrawer: 'Close',\n },\n },\n};\n"],"names":[],"mappings":"AAMO,MAAM,cAAc,GAA2B;AAClD,IAAA,MAAM,EAAE,OAAO;AACf,IAAA,QAAQ,EAAE;AACN,QAAA,SAAS,EAAE;AACP,YAAA,UAAU,EAAE,YAAY;AACxB,YAAA,KAAK,EAAE,YAAY;AACnB,YAAA,QAAQ,EAAE,eAAe;AACzB,YAAA,IAAI,EAAE,WAAW;AACjB,YAAA,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,CAAC,IAAI,KAAK,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAE;AAC9B,YAAA,KAAK,EAAE,OAAO;AACjB,SAAA;AACD,QAAA,UAAU,EAAE;AACR,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,YAAY,EAAE,eAAe;AAC7B,YAAA,aAAa,EAAE,gBAAgB;AAC/B,YAAA,SAAS,EAAE,YAAY;AACvB,YAAA,KAAK,EAAE,MAAM;AAChB,SAAA;AACD,QAAA,QAAQ,EAAE;AACN,YAAA,WAAW,EAAE,cAAc;AAC3B,YAAA,cAAc,EAAE,iBAAiB;AACpC,SAAA;AACD,QAAA,MAAM,EAAE;AACJ,YAAA,EAAE,EAAE,IAAI;AACR,YAAA,MAAM,EAAE,QAAQ;AAChB,YAAA,GAAG,EAAE,KAAK;AACV,YAAA,EAAE,EAAE,IAAI;AACR,YAAA,KAAK,EAAE,OAAO;AACjB,SAAA;AACD,QAAA,OAAO,EAAE;AACL,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,QAAQ,EAAE,UAAU;AACpB,YAAA,MAAM,EAAE,QAAQ;AACnB,SAAA;AACD,QAAA,aAAa,EAAE;AACX,YAAA,OAAO,EAAE,SAAS;AAClB,YAAA,MAAM,EAAE,eAAe;AAC1B,SAAA;AACD,QAAA,SAAS,EAAE;AACP,YAAA,SAAS,EAAE,YAAY;AACvB,YAAA,aAAa,EAAE,iBAAiB;AAChC,YAAA,MAAM,EAAE,SAAS;AACjB,YAAA,eAAe,EAAE,cAAc;AAC/B,YAAA,OAAO,EAAE,UAAU;AACnB,YAAA,MAAM,EAAE,sBAAsB;AAC9B,YAAA,YAAY,EAAE,2CAA2C;AAC5D,SAAA;AACD,QAAA,MAAM,EAAE;AACJ,YAAA,KAAK,EAAE,SAAS;AAEnB,SAAA;AACD,QAAA,YAAY,EAAE;AACV,YAAA,kBAAkB,EAAE,YAAY;AAChC,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,KAAK,EAAE,OAAO;AACjB,SAAA;AACD,QAAA,OAAO,EAAE;AACL,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,WAAW,EAAE,OAAO;AACvB,SAAA;AACJ,KAAA;;;"}
@@ -1501,25 +1501,70 @@
1501
1501
  /* Copyright (c) Cratis. All rights reserved. */
1502
1502
  /* Licensed under the MIT license. See LICENSE file in the project root for full license information. */
1503
1503
 
1504
- .cratis-table-paginator {
1504
+ .cratis-table-paginator,
1505
+ .cratis-table-paginator-pages {
1505
1506
  display: flex;
1506
1507
  align-items: center;
1507
- justify-content: center;
1508
1508
  gap: 0.25rem;
1509
+ }
1510
+
1511
+ .cratis-table-paginator {
1512
+ justify-content: center;
1509
1513
  padding: 0.25rem;
1510
1514
  }
1511
1515
 
1512
- .cratis-table-paginator-info {
1513
- font-size: 0.875rem;
1516
+ .cratis-table-paginator-info,
1517
+ .cratis-table-paginator-ellipsis,
1518
+ .cratis-table-paginator-range {
1514
1519
  color: var(--cratis-text-color-secondary);
1515
1520
  padding: 0 0.5rem;
1516
1521
  }
1517
1522
 
1523
+ .cratis-table-paginator-info {
1524
+ font-size: 0.875rem;
1525
+ }
1526
+
1527
+ .cratis-table-paginator-page {
1528
+ min-width: var(--cratis-control-height);
1529
+ min-height: var(--cratis-control-height);
1530
+ padding: 0.5rem;
1531
+ border: 1px solid transparent;
1532
+ border-radius: var(--cratis-border-radius);
1533
+ background: transparent;
1534
+ color: var(--cratis-text-color);
1535
+ font: inherit;
1536
+ font-weight: 600;
1537
+ cursor: pointer;
1538
+ }
1539
+
1540
+ .cratis-table-paginator-page:hover:not(:disabled, [data-selected]) {
1541
+ background: color-mix(in srgb, currentColor 4%, transparent);
1542
+ }
1543
+
1544
+ .cratis-table-paginator-page[data-selected] {
1545
+ border-color: var(--cratis-action-background);
1546
+ background: var(--cratis-action-background);
1547
+ color: var(--cratis-action-text);
1548
+ }
1549
+
1550
+ .cratis-table-paginator-page:focus-visible {
1551
+ outline: none;
1552
+ box-shadow: var(--cratis-focus-ring);
1553
+ }
1554
+
1555
+ @media (forced-colors: active) {
1556
+ .cratis-table-paginator-page:focus-visible {
1557
+ outline: 2px solid Highlight;
1558
+ }
1559
+
1560
+ .cratis-table-paginator-page[data-selected] {
1561
+ border-color: Highlight;
1562
+ }
1563
+ }
1564
+
1518
1565
  .cratis-table-paginator-range {
1519
1566
  font-size: 0.8125rem;
1520
- color: var(--cratis-text-color-secondary);
1521
1567
  margin-right: auto;
1522
- padding: 0 0.5rem;
1523
1568
  }
1524
1569
 
1525
1570
  /* ── ./Dropdown/Dropdown.css ─────────────────────────────────────── */
@@ -1300,25 +1300,70 @@
1300
1300
  /* Copyright (c) Cratis. All rights reserved. */
1301
1301
  /* Licensed under the MIT license. See LICENSE file in the project root for full license information. */
1302
1302
 
1303
- .cratis-table-paginator {
1303
+ .cratis-table-paginator,
1304
+ .cratis-table-paginator-pages {
1304
1305
  display: flex;
1305
1306
  align-items: center;
1306
- justify-content: center;
1307
1307
  gap: 0.25rem;
1308
+ }
1309
+
1310
+ .cratis-table-paginator {
1311
+ justify-content: center;
1308
1312
  padding: 0.25rem;
1309
1313
  }
1310
1314
 
1311
- .cratis-table-paginator-info {
1312
- font-size: 0.875rem;
1315
+ .cratis-table-paginator-info,
1316
+ .cratis-table-paginator-ellipsis,
1317
+ .cratis-table-paginator-range {
1313
1318
  color: var(--cratis-text-color-secondary);
1314
1319
  padding: 0 0.5rem;
1315
1320
  }
1316
1321
 
1322
+ .cratis-table-paginator-info {
1323
+ font-size: 0.875rem;
1324
+ }
1325
+
1326
+ .cratis-table-paginator-page {
1327
+ min-width: var(--cratis-control-height);
1328
+ min-height: var(--cratis-control-height);
1329
+ padding: 0.5rem;
1330
+ border: 1px solid transparent;
1331
+ border-radius: var(--cratis-border-radius);
1332
+ background: transparent;
1333
+ color: var(--cratis-text-color);
1334
+ font: inherit;
1335
+ font-weight: 600;
1336
+ cursor: pointer;
1337
+ }
1338
+
1339
+ .cratis-table-paginator-page:hover:not(:disabled, [data-selected]) {
1340
+ background: color-mix(in srgb, currentColor 4%, transparent);
1341
+ }
1342
+
1343
+ .cratis-table-paginator-page[data-selected] {
1344
+ border-color: var(--cratis-action-background);
1345
+ background: var(--cratis-action-background);
1346
+ color: var(--cratis-action-text);
1347
+ }
1348
+
1349
+ .cratis-table-paginator-page:focus-visible {
1350
+ outline: none;
1351
+ box-shadow: var(--cratis-focus-ring);
1352
+ }
1353
+
1354
+ @media (forced-colors: active) {
1355
+ .cratis-table-paginator-page:focus-visible {
1356
+ outline: 2px solid Highlight;
1357
+ }
1358
+
1359
+ .cratis-table-paginator-page[data-selected] {
1360
+ border-color: Highlight;
1361
+ }
1362
+ }
1363
+
1317
1364
  .cratis-table-paginator-range {
1318
1365
  font-size: 0.8125rem;
1319
- color: var(--cratis-text-color-secondary);
1320
1366
  margin-right: auto;
1321
- padding: 0 0.5rem;
1322
1367
  }
1323
1368
 
1324
1369
  /* ── ./Dropdown/Dropdown.css ─────────────────────────────────────── */
@@ -1300,25 +1300,70 @@
1300
1300
  /* Copyright (c) Cratis. All rights reserved. */
1301
1301
  /* Licensed under the MIT license. See LICENSE file in the project root for full license information. */
1302
1302
 
1303
- .cratis-table-paginator {
1303
+ .cratis-table-paginator,
1304
+ .cratis-table-paginator-pages {
1304
1305
  display: flex;
1305
1306
  align-items: center;
1306
- justify-content: center;
1307
1307
  gap: 0.25rem;
1308
+ }
1309
+
1310
+ .cratis-table-paginator {
1311
+ justify-content: center;
1308
1312
  padding: 0.25rem;
1309
1313
  }
1310
1314
 
1311
- .cratis-table-paginator-info {
1312
- font-size: 0.875rem;
1315
+ .cratis-table-paginator-info,
1316
+ .cratis-table-paginator-ellipsis,
1317
+ .cratis-table-paginator-range {
1313
1318
  color: var(--cratis-text-color-secondary);
1314
1319
  padding: 0 0.5rem;
1315
1320
  }
1316
1321
 
1322
+ .cratis-table-paginator-info {
1323
+ font-size: 0.875rem;
1324
+ }
1325
+
1326
+ .cratis-table-paginator-page {
1327
+ min-width: var(--cratis-control-height);
1328
+ min-height: var(--cratis-control-height);
1329
+ padding: 0.5rem;
1330
+ border: 1px solid transparent;
1331
+ border-radius: var(--cratis-border-radius);
1332
+ background: transparent;
1333
+ color: var(--cratis-text-color);
1334
+ font: inherit;
1335
+ font-weight: 600;
1336
+ cursor: pointer;
1337
+ }
1338
+
1339
+ .cratis-table-paginator-page:hover:not(:disabled, [data-selected]) {
1340
+ background: color-mix(in srgb, currentColor 4%, transparent);
1341
+ }
1342
+
1343
+ .cratis-table-paginator-page[data-selected] {
1344
+ border-color: var(--cratis-action-background);
1345
+ background: var(--cratis-action-background);
1346
+ color: var(--cratis-action-text);
1347
+ }
1348
+
1349
+ .cratis-table-paginator-page:focus-visible {
1350
+ outline: none;
1351
+ box-shadow: var(--cratis-focus-ring);
1352
+ }
1353
+
1354
+ @media (forced-colors: active) {
1355
+ .cratis-table-paginator-page:focus-visible {
1356
+ outline: 2px solid Highlight;
1357
+ }
1358
+
1359
+ .cratis-table-paginator-page[data-selected] {
1360
+ border-color: Highlight;
1361
+ }
1362
+ }
1363
+
1317
1364
  .cratis-table-paginator-range {
1318
1365
  font-size: 0.8125rem;
1319
- color: var(--cratis-text-color-secondary);
1320
1366
  margin-right: auto;
1321
- padding: 0 0.5rem;
1322
1367
  }
1323
1368
 
1324
1369
  /* ── ./Display/Display.css ─────────────────────────────────────── */