@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.
- package/compat-manifest.json +11 -11
- package/dist/esm/Common/CratisComponentsProvider.d.ts +4 -0
- package/dist/esm/Common/CratisComponentsProvider.d.ts.map +1 -1
- package/dist/esm/Common/CratisComponentsProvider.js +1 -0
- package/dist/esm/Common/CratisComponentsProvider.js.map +1 -1
- package/dist/esm/DataPage/DataPage.d.ts +2 -0
- package/dist/esm/DataPage/DataPage.d.ts.map +1 -1
- package/dist/esm/DataPage/DataPage.js.map +1 -1
- package/dist/esm/DataTables/DataTableForObservableQuery.d.ts +2 -0
- package/dist/esm/DataTables/DataTableForObservableQuery.d.ts.map +1 -1
- package/dist/esm/DataTables/DataTableForObservableQuery.js +1 -1
- package/dist/esm/DataTables/DataTableForObservableQuery.js.map +1 -1
- package/dist/esm/DataTables/DataTableForQuery.d.ts +2 -0
- package/dist/esm/DataTables/DataTableForQuery.d.ts.map +1 -1
- package/dist/esm/DataTables/DataTableForQuery.js +1 -1
- package/dist/esm/DataTables/DataTableForQuery.js.map +1 -1
- package/dist/esm/DataTables/PaginatorPageItem.d.ts +13 -0
- package/dist/esm/DataTables/PaginatorPageItem.d.ts.map +1 -0
- package/dist/esm/DataTables/PaginatorPageItem.js +4 -0
- package/dist/esm/DataTables/PaginatorPageItem.js.map +1 -0
- package/dist/esm/DataTables/TablePaginator.d.ts +22 -2
- package/dist/esm/DataTables/TablePaginator.d.ts.map +1 -1
- package/dist/esm/DataTables/TablePaginator.js.map +1 -1
- package/dist/esm/DataTables/TablePaginatorImplementation.d.ts +1 -1
- package/dist/esm/DataTables/TablePaginatorImplementation.d.ts.map +1 -1
- package/dist/esm/DataTables/TablePaginatorImplementation.js +8 -3
- package/dist/esm/DataTables/TablePaginatorImplementation.js.map +1 -1
- package/dist/esm/DataTables/TablePaginatorPages.d.ts +9 -0
- package/dist/esm/DataTables/TablePaginatorPages.d.ts.map +1 -0
- package/dist/esm/DataTables/TablePaginatorPages.js +20 -0
- package/dist/esm/DataTables/TablePaginatorPages.js.map +1 -0
- package/dist/esm/DataTables/index.d.ts +2 -0
- package/dist/esm/DataTables/index.d.ts.map +1 -1
- package/dist/esm/DataTables/index.js +1 -0
- package/dist/esm/DataTables/index.js.map +1 -1
- package/dist/esm/DataTables/paginatorPages.d.ts +15 -0
- package/dist/esm/DataTables/paginatorPages.d.ts.map +1 -0
- package/dist/esm/DataTables/paginatorPages.js +40 -0
- package/dist/esm/DataTables/paginatorPages.js.map +1 -0
- package/dist/esm/Filter/FilterGroup.d.ts +23 -0
- package/dist/esm/Filter/FilterGroup.d.ts.map +1 -0
- package/dist/esm/Filter/FilterGroup.js +51 -0
- package/dist/esm/Filter/FilterGroup.js.map +1 -0
- package/dist/esm/Filter/FilterPanel.d.ts.map +1 -1
- package/dist/esm/Filter/FilterPanel.js +24 -257
- package/dist/esm/Filter/FilterPanel.js.map +1 -1
- package/dist/esm/Filter/FilterSearchBox.d.ts +10 -0
- package/dist/esm/Filter/FilterSearchBox.d.ts.map +1 -0
- package/dist/esm/Filter/FilterSearchBox.js +10 -0
- package/dist/esm/Filter/FilterSearchBox.js.map +1 -0
- package/dist/esm/Filter/measurePanelPlacement.d.ts +31 -0
- package/dist/esm/Filter/measurePanelPlacement.d.ts.map +1 -0
- package/dist/esm/Filter/measurePanelPlacement.js +132 -0
- package/dist/esm/Filter/measurePanelPlacement.js.map +1 -0
- package/dist/esm/Filter/usePanelDismissal.d.ts +32 -0
- package/dist/esm/Filter/usePanelDismissal.d.ts.map +1 -0
- package/dist/esm/Filter/usePanelDismissal.js +63 -0
- package/dist/esm/Filter/usePanelDismissal.js.map +1 -0
- package/dist/esm/Filter/usePanelPosition.d.ts +24 -0
- package/dist/esm/Filter/usePanelPosition.d.ts.map +1 -0
- package/dist/esm/Filter/usePanelPosition.js +85 -0
- package/dist/esm/Filter/usePanelPosition.js.map +1 -0
- package/dist/esm/Filter/useResolvedAnchor.d.ts +17 -0
- package/dist/esm/Filter/useResolvedAnchor.d.ts.map +1 -0
- package/dist/esm/Filter/useResolvedAnchor.js +16 -0
- package/dist/esm/Filter/useResolvedAnchor.js.map +1 -0
- package/dist/esm/PivotViewer/PivotViewer.d.ts.map +1 -1
- package/dist/esm/PivotViewer/PivotViewer.js +47 -207
- package/dist/esm/PivotViewer/PivotViewer.js.map +1 -1
- package/dist/esm/PivotViewer/components/pivot/visibility.d.ts +1 -1
- package/dist/esm/PivotViewer/components/pivot/visibility.d.ts.map +1 -1
- package/dist/esm/PivotViewer/components/pivot/visibility.js +24 -222
- package/dist/esm/PivotViewer/components/pivot/visibility.js.map +1 -1
- package/dist/esm/PivotViewer/components/pivot/visibilityHelpers.d.ts +114 -0
- package/dist/esm/PivotViewer/components/pivot/visibilityHelpers.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/visibilityHelpers.js +306 -0
- package/dist/esm/PivotViewer/components/pivot/visibilityHelpers.js.map +1 -0
- package/dist/esm/PivotViewer/hooks/useColorCssVariables.d.ts +9 -0
- package/dist/esm/PivotViewer/hooks/useColorCssVariables.d.ts.map +1 -0
- package/dist/esm/PivotViewer/hooks/useColorCssVariables.js +32 -0
- package/dist/esm/PivotViewer/hooks/useColorCssVariables.js.map +1 -0
- package/dist/esm/PivotViewer/hooks/usePivotViewerGrouping.d.ts +27 -0
- package/dist/esm/PivotViewer/hooks/usePivotViewerGrouping.d.ts.map +1 -0
- package/dist/esm/PivotViewer/hooks/usePivotViewerGrouping.js +40 -0
- package/dist/esm/PivotViewer/hooks/usePivotViewerGrouping.js.map +1 -0
- package/dist/esm/PivotViewer/hooks/usePivotViewerInteractions.d.ts +27 -0
- package/dist/esm/PivotViewer/hooks/usePivotViewerInteractions.d.ts.map +1 -0
- package/dist/esm/PivotViewer/hooks/usePivotViewerInteractions.js +46 -0
- package/dist/esm/PivotViewer/hooks/usePivotViewerInteractions.js.map +1 -0
- package/dist/esm/PivotViewer/hooks/useRawGrouping.d.ts +22 -0
- package/dist/esm/PivotViewer/hooks/useRawGrouping.d.ts.map +1 -0
- package/dist/esm/PivotViewer/hooks/useRawGrouping.js +56 -0
- package/dist/esm/PivotViewer/hooks/useRawGrouping.js.map +1 -0
- package/dist/esm/PivotViewer/hooks/useScrollPositionTracking.d.ts +12 -0
- package/dist/esm/PivotViewer/hooks/useScrollPositionTracking.d.ts.map +1 -0
- package/dist/esm/PivotViewer/hooks/useScrollPositionTracking.js +20 -0
- package/dist/esm/PivotViewer/hooks/useScrollPositionTracking.js.map +1 -0
- package/dist/esm/PivotViewer/hooks/useViewerLayout.d.ts +16 -0
- package/dist/esm/PivotViewer/hooks/useViewerLayout.d.ts.map +1 -0
- package/dist/esm/PivotViewer/hooks/useViewerLayout.js +29 -0
- package/dist/esm/PivotViewer/hooks/useViewerLayout.js.map +1 -0
- package/dist/esm/PivotViewer/hooks/useVisibleIds.d.ts +21 -0
- package/dist/esm/PivotViewer/hooks/useVisibleIds.d.ts.map +1 -0
- package/dist/esm/PivotViewer/hooks/useVisibleIds.js +34 -0
- package/dist/esm/PivotViewer/hooks/useVisibleIds.js.map +1 -0
- package/dist/esm/configuration/CratisComponentsDefaults.d.ts.map +1 -1
- package/dist/esm/configuration/CratisComponentsDefaults.js +2 -0
- package/dist/esm/configuration/CratisComponentsDefaults.js.map +1 -1
- package/dist/esm/styles.DataPage.css +51 -6
- package/dist/esm/styles.DataTables.css +51 -6
- package/dist/esm/styles.SchemaEditor.css +51 -6
- package/dist/esm/styles.css +51 -6
- package/dist/esm/styles.renderer.builtin.css +51 -6
- package/dist/esm/types/parts.d.ts +4 -1
- package/dist/esm/types/parts.d.ts.map +1 -1
- package/dist/esm/types/parts.js +4 -1
- package/dist/esm/types/parts.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
import { CARD_GAP } from './constants.js';
|
|
2
|
+
import { destroySprite } from './sprites.js';
|
|
3
|
+
|
|
4
|
+
function createVisibleRect(source) {
|
|
5
|
+
return {
|
|
6
|
+
left: source.panWorldX,
|
|
7
|
+
right: source.panWorldX + source.worldWidth,
|
|
8
|
+
top: source.panWorldY,
|
|
9
|
+
bottom: source.panWorldY + source.worldHeight,
|
|
10
|
+
epsilon: Math.max(0.5, 0.5 * source.invScale),
|
|
11
|
+
cardWidth: source.cardWidth,
|
|
12
|
+
cardHeight: source.cardHeight,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function rectIntersects(rect, x, y) {
|
|
16
|
+
return x + rect.cardWidth >= rect.left - rect.epsilon &&
|
|
17
|
+
x <= rect.right + rect.epsilon &&
|
|
18
|
+
y + rect.cardHeight >= rect.top - rect.epsilon &&
|
|
19
|
+
y <= rect.bottom + rect.epsilon;
|
|
20
|
+
}
|
|
21
|
+
function sweepableHiddenAt(sprite, position, rect) {
|
|
22
|
+
if (position && rectIntersects(rect, position.x, position.y))
|
|
23
|
+
return undefined;
|
|
24
|
+
return sprite.__lastHiddenAt;
|
|
25
|
+
}
|
|
26
|
+
function tryConsumeCreationBudget(budget, isVisible) {
|
|
27
|
+
if (isVisible)
|
|
28
|
+
return true;
|
|
29
|
+
if (budget.created >= budget.max) {
|
|
30
|
+
budget.pending = true;
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
budget.created++;
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
function createIdCollector() {
|
|
37
|
+
const ids = [];
|
|
38
|
+
const set = new Set();
|
|
39
|
+
return {
|
|
40
|
+
ids,
|
|
41
|
+
set,
|
|
42
|
+
add: (id) => {
|
|
43
|
+
if (!set.has(id)) {
|
|
44
|
+
ids.push(id);
|
|
45
|
+
set.add(id);
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function scrollOrPan(scroll, pan) {
|
|
51
|
+
return typeof scroll === 'number' ? scroll : (pan || 0);
|
|
52
|
+
}
|
|
53
|
+
function measureViewport(params, container) {
|
|
54
|
+
const { layout, viewportWidth, viewportHeight, zoomLevel, viewMode, panX, panY } = params;
|
|
55
|
+
const viewportPxWidth = container.clientWidth || viewportWidth;
|
|
56
|
+
const viewportPxHeight = container.clientHeight || viewportHeight;
|
|
57
|
+
const contentHeightPx = (layout.totalHeight || 0) * zoomLevel;
|
|
58
|
+
let offsetY = 0;
|
|
59
|
+
if (viewMode === 'grouped' && contentHeightPx < viewportPxHeight) {
|
|
60
|
+
offsetY = viewportPxHeight - contentHeightPx;
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
viewportPxWidth,
|
|
64
|
+
viewportPxHeight,
|
|
65
|
+
offsetY,
|
|
66
|
+
scrollX: scrollOrPan(container.scrollLeft, panX),
|
|
67
|
+
scrollY: scrollOrPan(container.scrollTop, panY),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
function applyContainerTransforms(params, metrics) {
|
|
71
|
+
const { root, groupsContainer, zoomLevel } = params;
|
|
72
|
+
const { scrollX, scrollY, offsetY } = metrics;
|
|
73
|
+
if (root) {
|
|
74
|
+
root.scale.set(zoomLevel);
|
|
75
|
+
root.position.set(-scrollX, offsetY - scrollY);
|
|
76
|
+
}
|
|
77
|
+
if (groupsContainer) {
|
|
78
|
+
groupsContainer.scale.set(zoomLevel);
|
|
79
|
+
groupsContainer.position.set(-scrollX, offsetY - scrollY);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function computeWorldViewport(params, metrics) {
|
|
83
|
+
const { cardWidth, cardHeight, zoomLevel } = params;
|
|
84
|
+
const baseBufferWorld = Math.max(cardWidth, cardHeight) * 4;
|
|
85
|
+
const invScale = zoomLevel && zoomLevel !== 0 ? 1 / zoomLevel : 1;
|
|
86
|
+
const panWorldX = metrics.scrollX * invScale;
|
|
87
|
+
const panWorldY = (metrics.scrollY - metrics.offsetY) * invScale;
|
|
88
|
+
const worldWidth = metrics.viewportPxWidth * invScale;
|
|
89
|
+
const worldHeight = metrics.viewportPxHeight * invScale;
|
|
90
|
+
const bufferWorld = Math.max(baseBufferWorld * invScale, Math.max(worldWidth, worldHeight) * 2.0, baseBufferWorld);
|
|
91
|
+
return {
|
|
92
|
+
invScale,
|
|
93
|
+
panWorldX,
|
|
94
|
+
panWorldY,
|
|
95
|
+
worldWidth,
|
|
96
|
+
worldHeight,
|
|
97
|
+
bufferedLeft: panWorldX - bufferWorld,
|
|
98
|
+
bufferedRight: panWorldX + worldWidth + bufferWorld,
|
|
99
|
+
bufferedTop: panWorldY - bufferWorld,
|
|
100
|
+
bufferedBottom: panWorldY + worldHeight + bufferWorld,
|
|
101
|
+
epsilon: Math.max(0.5, 0.5 * invScale),
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
function overlapsRange(start, size, low, high, epsilon) {
|
|
105
|
+
return start + size >= low - epsilon && start <= high + epsilon;
|
|
106
|
+
}
|
|
107
|
+
function intersectsBufferedViewport(viewport, card, x, y) {
|
|
108
|
+
const { bufferedLeft, bufferedRight, bufferedTop, bufferedBottom, epsilon } = viewport;
|
|
109
|
+
return overlapsRange(x, card.cardWidth, bufferedLeft, bufferedRight, epsilon) &&
|
|
110
|
+
overlapsRange(y, card.cardHeight, bufferedTop, bufferedBottom, epsilon);
|
|
111
|
+
}
|
|
112
|
+
function addIntersectingTargets(params, intersects, collector) {
|
|
113
|
+
for (const [id, position] of params.layout.positions) {
|
|
114
|
+
if (position && intersects(position.x, position.y))
|
|
115
|
+
collector.add(id);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function isUnseenPreviousCard(params, id) {
|
|
119
|
+
return !params.sprites.has(id) && !params.transitionSeenIds.has(id) && params.layout.positions.has(id);
|
|
120
|
+
}
|
|
121
|
+
function addIntersectingPreviousPositions(params, intersects, collector) {
|
|
122
|
+
for (const [id, position] of params.prevLayout?.positions ?? []) {
|
|
123
|
+
if (!isUnseenPreviousCard(params, id))
|
|
124
|
+
continue;
|
|
125
|
+
if (position && intersects(position.x, position.y))
|
|
126
|
+
collector.add(id);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
function addIntersectingCurrentSprites(params, intersects, collector) {
|
|
130
|
+
for (const [id, sprite] of params.sprites) {
|
|
131
|
+
params.transitionSeenIds.add(id);
|
|
132
|
+
if (params.layout.positions.has(id) && intersects(sprite.currentX, sprite.currentY))
|
|
133
|
+
collector.add(id);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
function collectInViewportIds(params, viewport) {
|
|
137
|
+
const collector = createIdCollector();
|
|
138
|
+
const intersects = (x, y) => intersectsBufferedViewport(viewport, params, x, y);
|
|
139
|
+
addIntersectingTargets(params, intersects, collector);
|
|
140
|
+
if (params.isViewTransition) {
|
|
141
|
+
addIntersectingPreviousPositions(params, intersects, collector);
|
|
142
|
+
addIntersectingCurrentSprites(params, intersects, collector);
|
|
143
|
+
}
|
|
144
|
+
return collector;
|
|
145
|
+
}
|
|
146
|
+
function addLastRowIds(params, viewport, collector) {
|
|
147
|
+
const { layout, cardHeight } = params;
|
|
148
|
+
try {
|
|
149
|
+
const slotHeight = cardHeight + (CARD_GAP || 8);
|
|
150
|
+
const totalRows = Math.ceil((layout.totalHeight || 0) / slotHeight) || 0;
|
|
151
|
+
const rowsVisible = Math.max(1, Math.ceil(viewport.worldHeight / slotHeight));
|
|
152
|
+
const prefetchMultiplier = 0.75;
|
|
153
|
+
const prefetchRows = Math.max(2, Math.ceil(rowsVisible * prefetchMultiplier * Math.max(1, viewport.invScale)));
|
|
154
|
+
const lastRowThresholdY = Math.max(0, (totalRows - prefetchRows) * slotHeight);
|
|
155
|
+
for (const [id, position] of layout.positions) {
|
|
156
|
+
if (position.y >= lastRowThresholdY)
|
|
157
|
+
collector.add(id);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
catch (e) {
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
function showSprite(sprite) {
|
|
164
|
+
try {
|
|
165
|
+
if (sprite.container) {
|
|
166
|
+
sprite.container.visible = true;
|
|
167
|
+
}
|
|
168
|
+
if (sprite.__lastHiddenAt)
|
|
169
|
+
delete sprite.__lastHiddenAt;
|
|
170
|
+
}
|
|
171
|
+
catch (e) {
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
function hideSprite(sprite) {
|
|
175
|
+
try {
|
|
176
|
+
if (sprite.container) {
|
|
177
|
+
sprite.container.visible = false;
|
|
178
|
+
}
|
|
179
|
+
sprite.__lastHiddenAt ??= Date.now();
|
|
180
|
+
}
|
|
181
|
+
catch (e) {
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
function applySpriteVisibility(sprites, visibleSet, aggressiveCull) {
|
|
185
|
+
for (const [id, sprite] of sprites) {
|
|
186
|
+
applyVisibilityToSprite(sprite, visibleSet.has(id), aggressiveCull);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
function applyVisibilityToSprite(sprite, wanted, aggressiveCull) {
|
|
190
|
+
if (wanted) {
|
|
191
|
+
showSprite(sprite);
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
if (!aggressiveCull) {
|
|
195
|
+
hideSprite(sprite);
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
try {
|
|
199
|
+
if (sprite.container)
|
|
200
|
+
sprite.container.visible = true;
|
|
201
|
+
}
|
|
202
|
+
catch (e) {
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
function removeSprite(sprite) {
|
|
206
|
+
try {
|
|
207
|
+
if (sprite.container && sprite.container.parent)
|
|
208
|
+
sprite.container.parent.removeChild(sprite.container);
|
|
209
|
+
}
|
|
210
|
+
catch (e) {
|
|
211
|
+
}
|
|
212
|
+
try {
|
|
213
|
+
destroySprite(sprite);
|
|
214
|
+
}
|
|
215
|
+
catch (e) {
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
function isSweepDue(lastHidden, now, thresholdMs, readImmediately) {
|
|
219
|
+
if (!lastHidden)
|
|
220
|
+
return false;
|
|
221
|
+
return !!readImmediately() || now - lastHidden > thresholdMs;
|
|
222
|
+
}
|
|
223
|
+
function sweepHiddenSprites(sprites, layout, visibleRect, readSweepImmediately) {
|
|
224
|
+
try {
|
|
225
|
+
const SWEEP_MS = 100;
|
|
226
|
+
const now = Date.now();
|
|
227
|
+
for (const [id, sprite] of sprites) {
|
|
228
|
+
const lastHidden = sweepableHiddenAt(sprite, layout.positions.get(id), visibleRect);
|
|
229
|
+
if (isSweepDue(lastHidden, now, SWEEP_MS, readSweepImmediately)) {
|
|
230
|
+
removeSprite(sprite);
|
|
231
|
+
sprites.delete(id);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
catch (e) {
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
function resolveSpawnStart(params, viewport, id, position) {
|
|
239
|
+
const oldPos = findPreviousPositionInViewport(params, viewport, id);
|
|
240
|
+
if (!oldPos)
|
|
241
|
+
return { startX: position.x, startY: position.y, shouldAnimate: false };
|
|
242
|
+
const { deltaX, deltaY } = panDeltaInWorld(params);
|
|
243
|
+
return { startX: oldPos.x + deltaX, startY: oldPos.y + deltaY, shouldAnimate: true };
|
|
244
|
+
}
|
|
245
|
+
function findPreviousPositionInViewport(params, viewport, id) {
|
|
246
|
+
const { isViewTransition, prevLayout } = params;
|
|
247
|
+
if (!isViewTransition || !prevLayout)
|
|
248
|
+
return undefined;
|
|
249
|
+
const oldPos = prevLayout.positions.get(id);
|
|
250
|
+
return oldPos && intersectsBufferedViewport(viewport, params, oldPos.x, oldPos.y) ? oldPos : undefined;
|
|
251
|
+
}
|
|
252
|
+
function panDeltaInWorld(params) {
|
|
253
|
+
const { panDeltaX, panDeltaY, zoomLevel } = params;
|
|
254
|
+
if (!panDeltaX && !panDeltaY)
|
|
255
|
+
return { deltaX: 0, deltaY: 0 };
|
|
256
|
+
return {
|
|
257
|
+
deltaX: (panDeltaX || 0) / (zoomLevel || 1),
|
|
258
|
+
deltaY: (panDeltaY || 0) / (zoomLevel || 1),
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
function spawnSprite(params, viewport, root, id, position, createCardSprite) {
|
|
262
|
+
const { startX, startY, shouldAnimate } = resolveSpawnStart(params, viewport, id, position);
|
|
263
|
+
const sprite = createCardSprite(id, startX, startY);
|
|
264
|
+
params.sprites.set(id, sprite);
|
|
265
|
+
if (params.isViewTransition)
|
|
266
|
+
params.transitionSeenIds.add(id);
|
|
267
|
+
if (sprite.container) {
|
|
268
|
+
root.addChild(sprite.container);
|
|
269
|
+
sprite.currentX = startX;
|
|
270
|
+
sprite.currentY = startY;
|
|
271
|
+
sprite.container.position.set(startX, startY);
|
|
272
|
+
}
|
|
273
|
+
if (shouldAnimate) {
|
|
274
|
+
sprite.targetX = position.x;
|
|
275
|
+
sprite.targetY = position.y;
|
|
276
|
+
sprite.startX = startX;
|
|
277
|
+
sprite.startY = startY;
|
|
278
|
+
sprite.animationStartTime = Date.now();
|
|
279
|
+
sprite.animationDelay = Math.random() * 300;
|
|
280
|
+
}
|
|
281
|
+
return sprite;
|
|
282
|
+
}
|
|
283
|
+
function retargetSprite(sprite, position, isViewTransition) {
|
|
284
|
+
const targetChanged = sprite.targetX !== position.x || sprite.targetY !== position.y;
|
|
285
|
+
if (!targetChanged)
|
|
286
|
+
return;
|
|
287
|
+
if (isViewTransition) {
|
|
288
|
+
if (sprite.animationStartTime === undefined) {
|
|
289
|
+
sprite.startX = sprite.currentX;
|
|
290
|
+
sprite.startY = sprite.currentY;
|
|
291
|
+
sprite.animationStartTime = Date.now();
|
|
292
|
+
sprite.animationDelay = Math.random() * 300;
|
|
293
|
+
}
|
|
294
|
+
sprite.targetX = position.x;
|
|
295
|
+
sprite.targetY = position.y;
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
sprite.targetX = position.x;
|
|
299
|
+
sprite.targetY = position.y;
|
|
300
|
+
delete sprite.animationStartTime;
|
|
301
|
+
delete sprite.animationDelay;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
export { addLastRowIds, applyContainerTransforms, applySpriteVisibility, collectInViewportIds, computeWorldViewport, createIdCollector, createVisibleRect, hideSprite, intersectsBufferedViewport, measureViewport, rectIntersects, removeSprite, resolveSpawnStart, retargetSprite, scrollOrPan, showSprite, spawnSprite, sweepHiddenSprites, sweepableHiddenAt, tryConsumeCreationBudget };
|
|
306
|
+
//# sourceMappingURL=visibilityHelpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visibilityHelpers.js","sources":["../../../../../PivotViewer/components/pivot/visibilityHelpers.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 * as PIXI from 'pixi.js';\nimport type { CardSprite } from './constants';\nimport { CARD_GAP } from './constants';\nimport type { LayoutResult } from '../../engine/types';\nimport { destroySprite } from './sprites';\nimport type { SyncParams } from './visibility';\n\nexport interface VisibleRect {\n left: number;\n right: number;\n top: number;\n bottom: number;\n epsilon: number;\n cardWidth: number;\n cardHeight: number;\n}\n\nexport interface VisibleRectSource {\n panWorldX: number;\n panWorldY: number;\n worldWidth: number;\n worldHeight: number;\n invScale: number;\n cardWidth: number;\n cardHeight: number;\n}\n\n/**\n * Builds the unbuffered visible rect in world units, with a zoom-aware rounding tolerance. Cards\n * intersecting it are created first and are never subject to the per-frame budget or the sweep.\n */\nexport function createVisibleRect(source: VisibleRectSource): VisibleRect {\n return {\n left: source.panWorldX,\n right: source.panWorldX + source.worldWidth,\n top: source.panWorldY,\n bottom: source.panWorldY + source.worldHeight,\n epsilon: Math.max(0.5, 0.5 * source.invScale),\n cardWidth: source.cardWidth,\n cardHeight: source.cardHeight,\n };\n}\n\nexport function rectIntersects(rect: VisibleRect, x: number, y: number) {\n return x + rect.cardWidth >= rect.left - rect.epsilon &&\n x <= rect.right + rect.epsilon &&\n y + rect.cardHeight >= rect.top - rect.epsilon &&\n y <= rect.bottom + rect.epsilon;\n}\n\n/** When the sprite was hidden, or undefined when it is not hidden or its card is on screen (never swept). */\nexport function sweepableHiddenAt(sprite: CardSprite, position: { x: number; y: number } | undefined, rect: VisibleRect) {\n if (position && rectIntersects(rect, position.x, position.y)) return undefined;\n return (sprite as unknown as { __lastHiddenAt?: number }).__lastHiddenAt;\n}\n\n/**\n * Decides whether a sprite may be created this frame. Visible cards are always allowed;\n * buffer-only cards are limited by the budget and mark the sync as pending when deferred.\n */\nexport function tryConsumeCreationBudget(budget: { created: number; pending: boolean; max: number }, isVisible: boolean) {\n if (isVisible) return true;\n if (budget.created >= budget.max) {\n budget.pending = true;\n return false;\n }\n budget.created++;\n return true;\n}\n\nexport type SpriteId = string | number;\nexport type SpriteMap = Map<SpriteId, CardSprite>;\nexport type Point = { x: number; y: number };\nexport type HiddenAwareSprite = { __lastHiddenAt?: number };\n\n/** The measured viewport in pixels, the vertical alignment offset and the live scroll position. */\nexport interface ViewportMetrics {\n viewportPxWidth: number;\n viewportPxHeight: number;\n offsetY: number;\n scrollX: number;\n scrollY: number;\n}\n\n/** The viewport in world units, with the pre-creation buffer applied to its edges. */\nexport interface WorldViewport {\n invScale: number;\n panWorldX: number;\n panWorldY: number;\n worldWidth: number;\n worldHeight: number;\n bufferedLeft: number;\n bufferedRight: number;\n bufferedTop: number;\n bufferedBottom: number;\n epsilon: number;\n}\n\n/** Collects ids to keep, preserving first-seen order. */\nexport interface IdCollector {\n ids: SpriteId[];\n set: Set<SpriteId>;\n add: (id: SpriteId) => void;\n}\n\nexport function createIdCollector(): IdCollector {\n const ids: SpriteId[] = [];\n const set = new Set<SpriteId>();\n return {\n ids,\n set,\n add: (id) => {\n if (!set.has(id)) {\n ids.push(id);\n set.add(id);\n }\n },\n };\n}\n\nexport function scrollOrPan(scroll: number, pan: number | undefined): number {\n return typeof scroll === 'number' ? scroll : (pan || 0);\n}\n\nexport function measureViewport<TItem>(params: SyncParams<TItem>, container: HTMLDivElement): ViewportMetrics {\n const { layout, viewportWidth, viewportHeight, zoomLevel, viewMode, panX, panY } = params;\n // Use the container's measured client size for the viewport dimensions\n // (in pixels). The passed `viewportWidth`/`viewportHeight` can be stale\n // when the browser/device zoom changes; `clientWidth/clientHeight` are\n // authoritative for the actual visible pixel area.\n const viewportPxWidth = container.clientWidth || viewportWidth;\n const viewportPxHeight = container.clientHeight || viewportHeight;\n\n const contentHeightPx = (layout.totalHeight || 0) * zoomLevel;\n let offsetY = 0;\n\n // If content fits vertically within the viewport, align relative to bottom.\n // The spacer ensures container isn't scrollable in this case (scrollTop=0).\n // The items are at large Y coordinates relative to layout.totalHeight.\n // We want the bottom of the layout (totalHeight) to align with viewport bottom.\n if (viewMode === 'grouped' && contentHeightPx < viewportPxHeight) {\n // Calculate offset in pixels to shift the content down\n offsetY = viewportPxHeight - contentHeightPx;\n }\n\n // Use the container's actual scroll position for positioning, not the passed panX/panY\n // which may be stale (from React state) compared to live DOM scroll values.\n return {\n viewportPxWidth,\n viewportPxHeight,\n offsetY,\n scrollX: scrollOrPan(container.scrollLeft, panX),\n scrollY: scrollOrPan(container.scrollTop, panY),\n };\n}\n\n/** Applies scaling and position to the root (and groups) container. */\nexport function applyContainerTransforms<TItem>(params: SyncParams<TItem>, metrics: ViewportMetrics) {\n const { root, groupsContainer, zoomLevel } = params;\n const { scrollX, scrollY, offsetY } = metrics;\n if (root) {\n root.scale.set(zoomLevel);\n // Standard position: -scrollX, -scrollY\n // Plus vertical alignment offset if zoomed out\n root.position.set(-scrollX, offsetY - scrollY);\n }\n\n // Apply synchronization to groups container if present\n if (groupsContainer) {\n groupsContainer.scale.set(zoomLevel);\n groupsContainer.position.set(-scrollX, offsetY - scrollY);\n }\n}\n\nexport function computeWorldViewport<TItem>(params: SyncParams<TItem>, metrics: ViewportMetrics): WorldViewport {\n const { cardWidth, cardHeight, zoomLevel } = params;\n // Increase buffer (in world units) to reduce edge cases where rapid\n // scrolling skips sprite creation. Keep buffer in world units and convert\n // DOM pixel measurements into world coordinates below to avoid mixing\n // coordinate spaces which can cause precision drift at browser zooms.\n const baseBufferWorld = Math.max(cardWidth, cardHeight) * 4;\n // Ensure buffer scales with viewport size (in world units) so that when\n // zoomed out we still pre-create enough sprites ahead of the viewport.\n const invScale = zoomLevel && zoomLevel !== 0 ? 1 / zoomLevel : 1;\n\n // Convert pixel-based DOM measurements into world units so we compare like\n // with like. root.position is set using -pixels, so the mapping\n // from DOM scroll (pixels) to world units is: world = pixels / zoomLevel.\n // OffsetY is already in pixels and doesn't need scaling in panWorldY calc\n // because panWorldY is used for viewport buffering/culling, which is relative\n // to the \"camera\" position in world space.\n // The camera world Y = (scrollTop - offsetY) / zoomLevel.\n const panWorldX = metrics.scrollX * invScale;\n const panWorldY = (metrics.scrollY - metrics.offsetY) * invScale;\n\n const worldWidth = metrics.viewportPxWidth * invScale;\n const worldHeight = metrics.viewportPxHeight * invScale;\n\n // Ensure bufferWorld is calculated from the actual measured viewport\n // in world units (after converting client pixel dims using invScale).\n // Make buffer adaptive to zoom: when zoomed out (invScale > 1) a small\n // pixel scroll maps to a larger world delta, so increase the buffer.\n // Use the larger of width/height to ensure we buffer enough in both directions.\n const bufferWorld = Math.max(baseBufferWorld * invScale, Math.max(worldWidth, worldHeight) * 2.0, baseBufferWorld);\n\n // Do not clamp viewport edges to 0 — allow negative top/left values so the\n // visible window correctly follows the scroll even when the buffer is\n // larger than the current scroll offset.\n return {\n invScale,\n panWorldX,\n panWorldY,\n worldWidth,\n worldHeight,\n bufferedLeft: panWorldX - bufferWorld,\n bufferedRight: panWorldX + worldWidth + bufferWorld,\n bufferedTop: panWorldY - bufferWorld,\n bufferedBottom: panWorldY + worldHeight + bufferWorld,\n // Small tolerance in world units to avoid floating-point edge cases when\n // browser/device zoom or high scroll values produce tiny rounding errors.\n epsilon: Math.max(0.5, 0.5 * invScale),\n };\n}\n\nexport interface CardSize {\n cardWidth: number;\n cardHeight: number;\n}\n\nfunction overlapsRange(start: number, size: number, low: number, high: number, epsilon: number) {\n return start + size >= low - epsilon && start <= high + epsilon;\n}\n\nexport function intersectsBufferedViewport(viewport: WorldViewport, card: CardSize, x: number, y: number) {\n const { bufferedLeft, bufferedRight, bufferedTop, bufferedBottom, epsilon } = viewport;\n return overlapsRange(x, card.cardWidth, bufferedLeft, bufferedRight, epsilon) &&\n overlapsRange(y, card.cardHeight, bufferedTop, bufferedBottom, epsilon);\n}\n\ntype PositionTest = (x: number, y: number) => boolean;\n\nfunction addIntersectingTargets<TItem>(params: SyncParams<TItem>, intersects: PositionTest, collector: IdCollector) {\n for (const [id, position] of params.layout.positions) {\n if (position && intersects(position.x, position.y)) collector.add(id);\n }\n}\n\nfunction isUnseenPreviousCard<TItem>(params: SyncParams<TItem>, id: SpriteId) {\n return !params.sprites.has(id) && !params.transitionSeenIds.has(id) && params.layout.positions.has(id);\n}\n\nfunction addIntersectingPreviousPositions<TItem>(params: SyncParams<TItem>, intersects: PositionTest, collector: IdCollector) {\n for (const [id, position] of params.prevLayout?.positions ?? []) {\n if (!isUnseenPreviousCard(params, id)) continue;\n if (position && intersects(position.x, position.y)) collector.add(id);\n }\n}\n\nfunction addIntersectingCurrentSprites<TItem>(params: SyncParams<TItem>, intersects: PositionTest, collector: IdCollector) {\n for (const [id, sprite] of params.sprites) {\n params.transitionSeenIds.add(id);\n if (params.layout.positions.has(id) && intersects(sprite.currentX, sprite.currentY)) collector.add(id);\n }\n}\n\n/** Collects the ids whose target positions, or (during a transition) current positions, are in the buffered viewport. */\nexport function collectInViewportIds<TItem>(\n params: SyncParams<TItem>,\n viewport: WorldViewport,\n): IdCollector {\n const collector = createIdCollector();\n const intersects: PositionTest = (x, y) => intersectsBufferedViewport(viewport, params, x, y);\n\n // Target positions are authoritative, but during a transition cards may\n // still be at their old positions while the camera catches up.\n addIntersectingTargets(params, intersects, collector);\n if (params.isViewTransition) {\n addIntersectingPreviousPositions(params, intersects, collector);\n addIntersectingCurrentSprites(params, intersects, collector);\n }\n return collector;\n}\n\n/**\n * Ensures last rows are present when the user scrolls near the bottom.\n * Computes slot/row information and force-inserts IDs from the last few\n * rows to avoid missing tiles due to rounding/precision at zoom levels.\n */\nexport function addLastRowIds<TItem>(params: SyncParams<TItem>, viewport: WorldViewport, collector: IdCollector) {\n const { layout, cardHeight } = params;\n try {\n const slotHeight = cardHeight + (CARD_GAP || 8);\n const totalRows = Math.ceil((layout.totalHeight || 0) / slotHeight) || 0;\n // Determine how many rows are visible in the viewport (world units),\n // then prefetch a fraction of that adjusted by zoom (invScale).\n const rowsVisible = Math.max(1, Math.ceil(viewport.worldHeight / slotHeight));\n const prefetchMultiplier = 0.75; // fraction of viewport to prefetch\n const prefetchRows = Math.max(2, Math.ceil(rowsVisible * prefetchMultiplier * Math.max(1, viewport.invScale)));\n const lastRowThresholdY = Math.max(0, (totalRows - prefetchRows) * slotHeight);\n for (const [id, position] of layout.positions) {\n if (position.y >= lastRowThresholdY) collector.add(id);\n }\n } catch (e) {\n void e;\n }\n}\n\nexport function showSprite(sprite: CardSprite) {\n try {\n if (sprite.container) {\n sprite.container.visible = true;\n }\n if ((sprite as unknown as HiddenAwareSprite).__lastHiddenAt) delete (sprite as unknown as HiddenAwareSprite).__lastHiddenAt;\n } catch (e) { void e; }\n}\n\nexport function hideSprite(sprite: CardSprite) {\n try {\n if (sprite.container) {\n sprite.container.visible = false;\n }\n (sprite as unknown as HiddenAwareSprite).__lastHiddenAt ??= Date.now();\n } catch (e) {\n void e;\n }\n}\n\n/** Shows sprites that are wanted and hides the rest (unless culling would risk visual holes). */\nexport function applySpriteVisibility(sprites: SpriteMap, visibleSet: Set<SpriteId>, aggressiveCull: boolean) {\n for (const [id, sprite] of sprites) {\n applyVisibilityToSprite(sprite, visibleSet.has(id), aggressiveCull);\n }\n}\n\nfunction applyVisibilityToSprite(sprite: CardSprite, wanted: boolean, aggressiveCull: boolean) {\n if (wanted) {\n showSprite(sprite);\n return;\n }\n if (!aggressiveCull) {\n hideSprite(sprite);\n return;\n }\n // Keep sprite visible this frame to avoid visual holes\n try { if (sprite.container) sprite.container.visible = true; } catch (e) { void e; }\n}\n\nexport function removeSprite(sprite: CardSprite) {\n try {\n // remove from parent if present\n if (sprite.container && sprite.container.parent) sprite.container.parent.removeChild(sprite.container);\n } catch (e) {\n void e;\n }\n try {\n destroySprite(sprite);\n } catch (e) {\n void e;\n }\n}\n\n/** The immediate-sweep flag is read lazily, only for sprites that are hidden and off screen. */\nfunction isSweepDue(lastHidden: number | undefined, now: number, thresholdMs: number, readImmediately: () => boolean | undefined) {\n if (!lastHidden) return false;\n return !!readImmediately() || now - lastHidden > thresholdMs;\n}\n\n/** Sweep: actually destroy sprites that have been hidden longer than threshold. */\nexport function sweepHiddenSprites(\n sprites: SpriteMap,\n layout: LayoutResult,\n visibleRect: VisibleRect,\n readSweepImmediately: () => boolean | undefined,\n) {\n try {\n const SWEEP_MS = 100; // keep hidden sprites for 100ms before destruction (reduced from 500ms for faster mode transitions)\n const now = Date.now();\n for (const [id, sprite] of sprites) {\n const lastHidden = sweepableHiddenAt(sprite, layout.positions.get(id), visibleRect);\n if (isSweepDue(lastHidden, now, SWEEP_MS, readSweepImmediately)) {\n removeSprite(sprite);\n sprites.delete(id);\n }\n }\n } catch (e) {\n void e;\n }\n}\n\n/** Where a new sprite starts, and whether it flies in from a previous position. */\nexport function resolveSpawnStart<TItem>(\n params: SyncParams<TItem>,\n viewport: WorldViewport,\n id: SpriteId,\n position: Point,\n): { startX: number; startY: number; shouldAnimate: boolean } {\n const oldPos = findPreviousPositionInViewport(params, viewport, id);\n if (!oldPos) return { startX: position.x, startY: position.y, shouldAnimate: false };\n\n // If we have a pan delta (camera jump), we need to adjust the start position\n // so that the sprite appears at the same visual location relative to the NEW camera.\n // StartWorld = OldWorld + PanDelta\n const { deltaX, deltaY } = panDeltaInWorld(params);\n return { startX: oldPos.x + deltaX, startY: oldPos.y + deltaY, shouldAnimate: true };\n}\n\n/** During a view transition, the previous position of the card if it was inside the buffered viewport. */\nfunction findPreviousPositionInViewport<TItem>(params: SyncParams<TItem>, viewport: WorldViewport, id: SpriteId) {\n const { isViewTransition, prevLayout } = params;\n if (!isViewTransition || !prevLayout) return undefined;\n const oldPos = prevLayout.positions.get(id);\n return oldPos && intersectsBufferedViewport(viewport, params, oldPos.x, oldPos.y) ? oldPos : undefined;\n}\n\nfunction panDeltaInWorld<TItem>(params: SyncParams<TItem>) {\n const { panDeltaX, panDeltaY, zoomLevel } = params;\n if (!panDeltaX && !panDeltaY) return { deltaX: 0, deltaY: 0 };\n return {\n deltaX: (panDeltaX || 0) / (zoomLevel || 1),\n deltaY: (panDeltaY || 0) / (zoomLevel || 1),\n };\n}\n\nexport function spawnSprite<TItem>(\n params: SyncParams<TItem>,\n viewport: WorldViewport,\n root: PIXI.Container,\n id: SpriteId,\n position: Point,\n createCardSprite: SyncParams<TItem>['createCardSprite'],\n): CardSprite {\n const { startX, startY, shouldAnimate } = resolveSpawnStart(params, viewport, id, position);\n\n const sprite = createCardSprite(id, startX, startY);\n params.sprites.set(id, sprite);\n if (params.isViewTransition) params.transitionSeenIds.add(id);\n if (sprite.container) {\n root.addChild(sprite.container);\n sprite.currentX = startX;\n sprite.currentY = startY;\n // Keep sprite.container positioned in world units; animation/update\n // loop will apply root.scale/position to convert to pixels.\n sprite.container.position.set(startX, startY);\n }\n\n if (shouldAnimate) {\n sprite.targetX = position.x;\n sprite.targetY = position.y;\n sprite.startX = startX;\n sprite.startY = startY;\n sprite.animationStartTime = Date.now();\n sprite.animationDelay = Math.random() * 300;\n }\n return sprite;\n}\n\n/** Check if target changed to trigger animation. */\nexport function retargetSprite(sprite: CardSprite, position: Point, isViewTransition: boolean | undefined) {\n const targetChanged = sprite.targetX !== position.x || sprite.targetY !== position.y;\n if (!targetChanged) return;\n\n if (isViewTransition) {\n // Only set up animation if not already animating - don't reset animation\n // when targets change during layout recalculations\n if (sprite.animationStartTime === undefined) {\n sprite.startX = sprite.currentX;\n sprite.startY = sprite.currentY;\n sprite.animationStartTime = Date.now();\n // Add random delay for \"organic\" fly effect\n sprite.animationDelay = Math.random() * 300;\n }\n // Always update target to the new position (animation will smoothly\n // adjust to the new target)\n sprite.targetX = position.x;\n sprite.targetY = position.y;\n } else {\n sprite.targetX = position.x;\n sprite.targetY = position.y;\n delete sprite.animationStartTime;\n delete sprite.animationDelay;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { PivotViewerColors } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Maps provided color overrides to CSS variables understood by the component.
|
|
4
|
+
*
|
|
5
|
+
* @param colors - Optional color overrides.
|
|
6
|
+
* @returns CSS variables for the overrides that are set.
|
|
7
|
+
*/
|
|
8
|
+
export declare function useColorCssVariables(colors: Partial<PivotViewerColors> | undefined): Record<string, string>;
|
|
9
|
+
//# sourceMappingURL=useColorCssVariables.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useColorCssVariables.d.ts","sourceRoot":"","sources":["../../../../PivotViewer/hooks/useColorCssVariables.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAU,CAAC;AAmBlD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAChC,MAAM,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,SAAS,GAC/C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAUxB"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { useMemo } from 'react';
|
|
2
|
+
|
|
3
|
+
const colorVariables = [
|
|
4
|
+
['primaryColor', '--cratis-primary-color'],
|
|
5
|
+
['primaryColorText', '--cratis-primary-color-text'],
|
|
6
|
+
['primary500', '--cratis-primary-500'],
|
|
7
|
+
['surfaceGround', '--cratis-surface-ground'],
|
|
8
|
+
['surfaceCard', '--cratis-surface-card'],
|
|
9
|
+
['surfaceSection', '--cratis-surface-section'],
|
|
10
|
+
['surfaceOverlay', '--cratis-surface-overlay'],
|
|
11
|
+
['surfaceBorder', '--cratis-surface-border'],
|
|
12
|
+
['textColor', '--cratis-text-color'],
|
|
13
|
+
['textColorSecondary', '--cratis-text-color-secondary'],
|
|
14
|
+
['highlightBg', '--cratis-highlight-bg'],
|
|
15
|
+
['maskbg', '--cratis-maskbg'],
|
|
16
|
+
['focusRing', '--cratis-focus-ring'],
|
|
17
|
+
];
|
|
18
|
+
function useColorCssVariables(colors) {
|
|
19
|
+
return useMemo(() => {
|
|
20
|
+
const vars = {};
|
|
21
|
+
if (!colors)
|
|
22
|
+
return vars;
|
|
23
|
+
for (const [colorKey, variable] of colorVariables) {
|
|
24
|
+
if (colors[colorKey])
|
|
25
|
+
vars[variable] = colors[colorKey];
|
|
26
|
+
}
|
|
27
|
+
return vars;
|
|
28
|
+
}, [colors]);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export { useColorCssVariables };
|
|
32
|
+
//# sourceMappingURL=useColorCssVariables.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useColorCssVariables.js","sources":["../../../../PivotViewer/hooks/useColorCssVariables.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 { PivotViewerColors } from '../types';\n\n/** Maps each color override to the CSS variable understood by the component. */\nconst colorVariables: ReadonlyArray<readonly [keyof PivotViewerColors, string]> = [\n ['primaryColor', '--cratis-primary-color'],\n ['primaryColorText', '--cratis-primary-color-text'],\n ['primary500', '--cratis-primary-500'],\n ['surfaceGround', '--cratis-surface-ground'],\n ['surfaceCard', '--cratis-surface-card'],\n ['surfaceSection', '--cratis-surface-section'],\n ['surfaceOverlay', '--cratis-surface-overlay'],\n ['surfaceBorder', '--cratis-surface-border'],\n ['textColor', '--cratis-text-color'],\n ['textColorSecondary', '--cratis-text-color-secondary'],\n ['highlightBg', '--cratis-highlight-bg'],\n ['maskbg', '--cratis-maskbg'],\n ['focusRing', '--cratis-focus-ring'],\n];\n\n/**\n * Maps provided color overrides to CSS variables understood by the component.\n *\n * @param colors - Optional color overrides.\n * @returns CSS variables for the overrides that are set.\n */\nexport function useColorCssVariables(\n colors: Partial<PivotViewerColors> | undefined,\n): Record<string, string> {\n return useMemo(() => {\n const vars: Record<string, string> = {};\n if (!colors) return vars;\n for (const [colorKey, variable] of colorVariables) {\n // Read the property twice (condition, then assignment), exactly as the original did.\n if (colors[colorKey]) vars[variable] = colors[colorKey] as string;\n }\n return vars;\n }, [colors]);\n}\n"],"names":[],"mappings":";;AAOA,MAAM,cAAc,GAA8D;IAC9E,CAAC,cAAc,EAAE,wBAAwB,CAAC;IAC1C,CAAC,kBAAkB,EAAE,6BAA6B,CAAC;IACnD,CAAC,YAAY,EAAE,sBAAsB,CAAC;IACtC,CAAC,eAAe,EAAE,yBAAyB,CAAC;IAC5C,CAAC,aAAa,EAAE,uBAAuB,CAAC;IACxC,CAAC,gBAAgB,EAAE,0BAA0B,CAAC;IAC9C,CAAC,gBAAgB,EAAE,0BAA0B,CAAC;IAC9C,CAAC,eAAe,EAAE,yBAAyB,CAAC;IAC5C,CAAC,WAAW,EAAE,qBAAqB,CAAC;IACpC,CAAC,oBAAoB,EAAE,+BAA+B,CAAC;IACvD,CAAC,aAAa,EAAE,uBAAuB,CAAC;IACxC,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IAC7B,CAAC,WAAW,EAAE,qBAAqB,CAAC;CACvC;AAQK,SAAU,oBAAoB,CAChC,MAA8C,EAAA;IAE9C,OAAO,OAAO,CAAC,MAAK;QAChB,MAAM,IAAI,GAA2B,EAAE;AACvC,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,IAAI;QACxB,KAAK,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,cAAc,EAAE;YAE/C,IAAI,MAAM,CAAC,QAAQ,CAAC;gBAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAW;QACrE;AACA,QAAA,OAAO,IAAI;AACf,IAAA,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;AAChB;;"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { PivotDimension, PivotFilter, PivotViewerProps } from '../types.js';
|
|
2
|
+
import type { ViewMode } from '../components/Toolbar.js';
|
|
3
|
+
export interface UsePivotViewerGroupingOptions<TItem extends object> {
|
|
4
|
+
data: TItem[];
|
|
5
|
+
dimensions: PivotDimension<TItem>[];
|
|
6
|
+
filters: PivotFilter<TItem>[] | undefined;
|
|
7
|
+
filterState: Record<string, Set<string>>;
|
|
8
|
+
rangeFilterState: Record<string, [number | null, number | null] | null>;
|
|
9
|
+
dimensionFilter: string | null;
|
|
10
|
+
activeDimension: PivotDimension<TItem> | undefined;
|
|
11
|
+
activeDimensionKey: string;
|
|
12
|
+
searchFields: PivotViewerProps<TItem>['searchFields'];
|
|
13
|
+
search: string;
|
|
14
|
+
viewMode: ViewMode;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Runs the worker engine pipeline: field extraction, filtering, search, grouping and presentation.
|
|
18
|
+
*
|
|
19
|
+
* @param options - The data, filter, dimension, search and view-mode inputs.
|
|
20
|
+
* @returns Engine readiness, the visible ids and the presented grouping.
|
|
21
|
+
*/
|
|
22
|
+
export declare function usePivotViewerGrouping<TItem extends object>({ data, dimensions, filters, filterState, rangeFilterState, dimensionFilter, activeDimension, activeDimensionKey, searchFields, search, viewMode, }: UsePivotViewerGroupingOptions<TItem>): {
|
|
23
|
+
ready: boolean;
|
|
24
|
+
visibleIds: Uint32Array<ArrayBufferLike>;
|
|
25
|
+
grouping: import("../engine/types.js").GroupingResult;
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=usePivotViewerGrouping.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePivotViewerGrouping.d.ts","sourceRoot":"","sources":["../../../../PivotViewer/hooks/usePivotViewerGrouping.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAU,CAAC;AAC9E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAAuB,CAAC;AAQtD,MAAM,WAAW,6BAA6B,CAAC,KAAK,SAAS,MAAM;IAC/D,IAAI,EAAE,KAAK,EAAE,CAAC;IACd,UAAU,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;IACpC,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,EAAE,GAAG,SAAS,CAAC;IAC1C,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACzC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,GAAG,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IACxE,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,eAAe,EAAE,cAAc,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;IACnD,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,gBAAgB,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,CAAC;IACtD,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,QAAQ,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,SAAS,MAAM,EAAE,EACzD,IAAI,EACJ,UAAU,EACV,OAAO,EACP,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,YAAY,EACZ,MAAM,EACN,QAAQ,GACX,EAAE,6BAA6B,CAAC,KAAK,CAAC;;;;EAoDtC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { useMemo } from 'react';
|
|
2
|
+
import { usePivotEngine } from './usePivotEngine.js';
|
|
3
|
+
import { useFieldExtractors } from './useFieldExtractors.js';
|
|
4
|
+
import { useCurrentFilters, useCurrentGroupBy } from './useCurrentFilters.js';
|
|
5
|
+
import { useVisibleIds } from './useVisibleIds.js';
|
|
6
|
+
import { useRawGrouping } from './useRawGrouping.js';
|
|
7
|
+
import { presentGrouping } from '../utils/presentGrouping.js';
|
|
8
|
+
|
|
9
|
+
function usePivotViewerGrouping({ data, dimensions, filters, filterState, rangeFilterState, dimensionFilter, activeDimension, activeDimensionKey, searchFields, search, viewMode, }) {
|
|
10
|
+
const { fieldExtractors, indexFields } = useFieldExtractors(dimensions, filters);
|
|
11
|
+
const { ready, applyFilters: engineApplyFilters, computeGrouping, sortIds, } = usePivotEngine({
|
|
12
|
+
data,
|
|
13
|
+
fieldExtractors,
|
|
14
|
+
indexFields,
|
|
15
|
+
});
|
|
16
|
+
const currentFilters = useCurrentFilters(filters, filterState, rangeFilterState, dimensionFilter, activeDimension);
|
|
17
|
+
const currentGroupBy = useCurrentGroupBy(activeDimensionKey, dimensions);
|
|
18
|
+
const visibleIds = useVisibleIds({
|
|
19
|
+
ready,
|
|
20
|
+
data,
|
|
21
|
+
currentFilters,
|
|
22
|
+
search,
|
|
23
|
+
searchFields,
|
|
24
|
+
engineApplyFilters,
|
|
25
|
+
});
|
|
26
|
+
const rawGrouping = useRawGrouping({
|
|
27
|
+
ready,
|
|
28
|
+
visibleIds,
|
|
29
|
+
currentGroupBy,
|
|
30
|
+
viewMode,
|
|
31
|
+
activeDimensionKey,
|
|
32
|
+
computeGrouping,
|
|
33
|
+
sortIds,
|
|
34
|
+
});
|
|
35
|
+
const grouping = useMemo(() => viewMode === 'grouped' ? presentGrouping(rawGrouping, activeDimension, data) : rawGrouping, [viewMode, rawGrouping, activeDimension, data]);
|
|
36
|
+
return { ready, visibleIds, grouping };
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export { usePivotViewerGrouping };
|
|
40
|
+
//# sourceMappingURL=usePivotViewerGrouping.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePivotViewerGrouping.js","sources":["../../../../PivotViewer/hooks/usePivotViewerGrouping.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 { PivotDimension, PivotFilter, PivotViewerProps } from '../types';\nimport type { ViewMode } from '../components/Toolbar';\nimport { usePivotEngine } from './usePivotEngine';\nimport { useFieldExtractors } from './useFieldExtractors';\nimport { useCurrentFilters, useCurrentGroupBy } from './useCurrentFilters';\nimport { useVisibleIds } from './useVisibleIds';\nimport { useRawGrouping } from './useRawGrouping';\nimport { presentGrouping } from '../utils/presentGrouping';\n\nexport interface UsePivotViewerGroupingOptions<TItem extends object> {\n data: TItem[];\n dimensions: PivotDimension<TItem>[];\n filters: PivotFilter<TItem>[] | undefined;\n filterState: Record<string, Set<string>>;\n rangeFilterState: Record<string, [number | null, number | null] | null>;\n dimensionFilter: string | null;\n activeDimension: PivotDimension<TItem> | undefined;\n activeDimensionKey: string;\n searchFields: PivotViewerProps<TItem>['searchFields'];\n search: string;\n viewMode: ViewMode;\n}\n\n/**\n * Runs the worker engine pipeline: field extraction, filtering, search, grouping and presentation.\n *\n * @param options - The data, filter, dimension, search and view-mode inputs.\n * @returns Engine readiness, the visible ids and the presented grouping.\n */\nexport function usePivotViewerGrouping<TItem extends object>({\n data,\n dimensions,\n filters,\n filterState,\n rangeFilterState,\n dimensionFilter,\n activeDimension,\n activeDimensionKey,\n searchFields,\n search,\n viewMode,\n}: UsePivotViewerGroupingOptions<TItem>) {\n // Build field extractors for the columnar store\n const { fieldExtractors, indexFields } = useFieldExtractors(dimensions, filters);\n\n // Initialize the Web Worker engine\n const {\n ready,\n applyFilters: engineApplyFilters,\n computeGrouping,\n sortIds,\n } = usePivotEngine({\n data,\n fieldExtractors,\n indexFields,\n });\n\n // Build filter specs from UI state\n const currentFilters = useCurrentFilters(\n filters,\n filterState,\n rangeFilterState,\n dimensionFilter,\n activeDimension,\n );\n\n const currentGroupBy = useCurrentGroupBy(activeDimensionKey, dimensions);\n\n const visibleIds = useVisibleIds({\n ready,\n data,\n currentFilters,\n search,\n searchFields,\n engineApplyFilters,\n });\n\n const rawGrouping = useRawGrouping({\n ready,\n visibleIds,\n currentGroupBy,\n viewMode,\n activeDimensionKey,\n computeGrouping,\n sortIds,\n });\n\n const grouping = useMemo(\n () => viewMode === 'grouped' ? presentGrouping(rawGrouping, activeDimension, data) : rawGrouping,\n [viewMode, rawGrouping, activeDimension, data],\n );\n\n return { ready, visibleIds, grouping };\n}\n"],"names":[],"mappings":";;;;;;;;AAiCM,SAAU,sBAAsB,CAAuB,EACzD,IAAI,EACJ,UAAU,EACV,OAAO,EACP,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,YAAY,EACZ,MAAM,EACN,QAAQ,GAC2B,EAAA;AAEnC,IAAA,MAAM,EAAE,eAAe,EAAE,WAAW,EAAE,GAAG,kBAAkB,CAAC,UAAU,EAAE,OAAO,CAAC;AAGhF,IAAA,MAAM,EACF,KAAK,EACL,YAAY,EAAE,kBAAkB,EAChC,eAAe,EACf,OAAO,GACV,GAAG,cAAc,CAAC;QACf,IAAI;QACJ,eAAe;QACf,WAAW;AACd,KAAA,CAAC;AAGF,IAAA,MAAM,cAAc,GAAG,iBAAiB,CACpC,OAAO,EACP,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,eAAe,CAClB;IAED,MAAM,cAAc,GAAG,iBAAiB,CAAC,kBAAkB,EAAE,UAAU,CAAC;IAExE,MAAM,UAAU,GAAG,aAAa,CAAC;QAC7B,KAAK;QACL,IAAI;QACJ,cAAc;QACd,MAAM;QACN,YAAY;QACZ,kBAAkB;AACrB,KAAA,CAAC;IAEF,MAAM,WAAW,GAAG,cAAc,CAAC;QAC/B,KAAK;QACL,UAAU;QACV,cAAc;QACd,QAAQ;QACR,kBAAkB;QAClB,eAAe;QACf,OAAO;AACV,KAAA,CAAC;AAEF,IAAA,MAAM,QAAQ,GAAG,OAAO,CACpB,MAAM,QAAQ,KAAK,SAAS,GAAG,eAAe,CAAC,WAAW,EAAE,eAAe,EAAE,IAAI,CAAC,GAAG,WAAW,EAChG,CAAC,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAE,IAAI,CAAC,CACjD;AAED,IAAA,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE;AAC1C;;"}
|
|
@@ -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"}
|