@cratis/components 4.26.4 → 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 (118) 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/visibility.d.ts +1 -1
  71. package/dist/esm/PivotViewer/components/pivot/visibility.d.ts.map +1 -1
  72. package/dist/esm/PivotViewer/components/pivot/visibility.js +24 -222
  73. package/dist/esm/PivotViewer/components/pivot/visibility.js.map +1 -1
  74. package/dist/esm/PivotViewer/components/pivot/visibilityHelpers.d.ts +114 -0
  75. package/dist/esm/PivotViewer/components/pivot/visibilityHelpers.d.ts.map +1 -0
  76. package/dist/esm/PivotViewer/components/pivot/visibilityHelpers.js +306 -0
  77. package/dist/esm/PivotViewer/components/pivot/visibilityHelpers.js.map +1 -0
  78. package/dist/esm/PivotViewer/hooks/useColorCssVariables.d.ts +9 -0
  79. package/dist/esm/PivotViewer/hooks/useColorCssVariables.d.ts.map +1 -0
  80. package/dist/esm/PivotViewer/hooks/useColorCssVariables.js +32 -0
  81. package/dist/esm/PivotViewer/hooks/useColorCssVariables.js.map +1 -0
  82. package/dist/esm/PivotViewer/hooks/usePivotViewerGrouping.d.ts +27 -0
  83. package/dist/esm/PivotViewer/hooks/usePivotViewerGrouping.d.ts.map +1 -0
  84. package/dist/esm/PivotViewer/hooks/usePivotViewerGrouping.js +40 -0
  85. package/dist/esm/PivotViewer/hooks/usePivotViewerGrouping.js.map +1 -0
  86. package/dist/esm/PivotViewer/hooks/usePivotViewerInteractions.d.ts +27 -0
  87. package/dist/esm/PivotViewer/hooks/usePivotViewerInteractions.d.ts.map +1 -0
  88. package/dist/esm/PivotViewer/hooks/usePivotViewerInteractions.js +46 -0
  89. package/dist/esm/PivotViewer/hooks/usePivotViewerInteractions.js.map +1 -0
  90. package/dist/esm/PivotViewer/hooks/useRawGrouping.d.ts +22 -0
  91. package/dist/esm/PivotViewer/hooks/useRawGrouping.d.ts.map +1 -0
  92. package/dist/esm/PivotViewer/hooks/useRawGrouping.js +56 -0
  93. package/dist/esm/PivotViewer/hooks/useRawGrouping.js.map +1 -0
  94. package/dist/esm/PivotViewer/hooks/useScrollPositionTracking.d.ts +12 -0
  95. package/dist/esm/PivotViewer/hooks/useScrollPositionTracking.d.ts.map +1 -0
  96. package/dist/esm/PivotViewer/hooks/useScrollPositionTracking.js +20 -0
  97. package/dist/esm/PivotViewer/hooks/useScrollPositionTracking.js.map +1 -0
  98. package/dist/esm/PivotViewer/hooks/useViewerLayout.d.ts +16 -0
  99. package/dist/esm/PivotViewer/hooks/useViewerLayout.d.ts.map +1 -0
  100. package/dist/esm/PivotViewer/hooks/useViewerLayout.js +29 -0
  101. package/dist/esm/PivotViewer/hooks/useViewerLayout.js.map +1 -0
  102. package/dist/esm/PivotViewer/hooks/useVisibleIds.d.ts +21 -0
  103. package/dist/esm/PivotViewer/hooks/useVisibleIds.d.ts.map +1 -0
  104. package/dist/esm/PivotViewer/hooks/useVisibleIds.js +34 -0
  105. package/dist/esm/PivotViewer/hooks/useVisibleIds.js.map +1 -0
  106. package/dist/esm/configuration/CratisComponentsDefaults.d.ts.map +1 -1
  107. package/dist/esm/configuration/CratisComponentsDefaults.js +2 -0
  108. package/dist/esm/configuration/CratisComponentsDefaults.js.map +1 -1
  109. package/dist/esm/styles.DataPage.css +51 -6
  110. package/dist/esm/styles.DataTables.css +51 -6
  111. package/dist/esm/styles.SchemaEditor.css +51 -6
  112. package/dist/esm/styles.css +51 -6
  113. package/dist/esm/styles.renderer.builtin.css +51 -6
  114. package/dist/esm/types/parts.d.ts +4 -1
  115. package/dist/esm/types/parts.d.ts.map +1 -1
  116. package/dist/esm/types/parts.js +4 -1
  117. package/dist/esm/types/parts.js.map +1 -1
  118. package/package.json +1 -1
@@ -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 ─────────────────────────────────────── */
@@ -4311,25 +4311,70 @@
4311
4311
  /* Copyright (c) Cratis. All rights reserved. */
4312
4312
  /* Licensed under the MIT license. See LICENSE file in the project root for full license information. */
4313
4313
 
4314
- .cratis-table-paginator {
4314
+ .cratis-table-paginator,
4315
+ .cratis-table-paginator-pages {
4315
4316
  display: flex;
4316
4317
  align-items: center;
4317
- justify-content: center;
4318
4318
  gap: 0.25rem;
4319
+ }
4320
+
4321
+ .cratis-table-paginator {
4322
+ justify-content: center;
4319
4323
  padding: 0.25rem;
4320
4324
  }
4321
4325
 
4322
- .cratis-table-paginator-info {
4323
- font-size: 0.875rem;
4326
+ .cratis-table-paginator-info,
4327
+ .cratis-table-paginator-ellipsis,
4328
+ .cratis-table-paginator-range {
4324
4329
  color: var(--cratis-text-color-secondary);
4325
4330
  padding: 0 0.5rem;
4326
4331
  }
4327
4332
 
4333
+ .cratis-table-paginator-info {
4334
+ font-size: 0.875rem;
4335
+ }
4336
+
4337
+ .cratis-table-paginator-page {
4338
+ min-width: var(--cratis-control-height);
4339
+ min-height: var(--cratis-control-height);
4340
+ padding: 0.5rem;
4341
+ border: 1px solid transparent;
4342
+ border-radius: var(--cratis-border-radius);
4343
+ background: transparent;
4344
+ color: var(--cratis-text-color);
4345
+ font: inherit;
4346
+ font-weight: 600;
4347
+ cursor: pointer;
4348
+ }
4349
+
4350
+ .cratis-table-paginator-page:hover:not(:disabled, [data-selected]) {
4351
+ background: color-mix(in srgb, currentColor 4%, transparent);
4352
+ }
4353
+
4354
+ .cratis-table-paginator-page[data-selected] {
4355
+ border-color: var(--cratis-action-background);
4356
+ background: var(--cratis-action-background);
4357
+ color: var(--cratis-action-text);
4358
+ }
4359
+
4360
+ .cratis-table-paginator-page:focus-visible {
4361
+ outline: none;
4362
+ box-shadow: var(--cratis-focus-ring);
4363
+ }
4364
+
4365
+ @media (forced-colors: active) {
4366
+ .cratis-table-paginator-page:focus-visible {
4367
+ outline: 2px solid Highlight;
4368
+ }
4369
+
4370
+ .cratis-table-paginator-page[data-selected] {
4371
+ border-color: Highlight;
4372
+ }
4373
+ }
4374
+
4328
4375
  .cratis-table-paginator-range {
4329
4376
  font-size: 0.8125rem;
4330
- color: var(--cratis-text-color-secondary);
4331
4377
  margin-right: auto;
4332
- padding: 0 0.5rem;
4333
4378
  }
4334
4379
 
4335
4380
  /* ── ./Dialogs/Dialog.css ─────────────────────────────────────── */