@cratis/components 0.1.9 → 0.1.12
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/dist/cjs/CommandForm/CommandFormFields.js +9 -3
- package/dist/cjs/CommandForm/CommandFormFields.js.map +1 -1
- package/dist/cjs/CommandForm/ValidationMessage.js +24 -0
- package/dist/cjs/CommandForm/ValidationMessage.js.map +1 -0
- package/dist/cjs/CommandForm/asCommandFormField.js +47 -0
- package/dist/cjs/CommandForm/asCommandFormField.js.map +1 -0
- package/dist/cjs/CommandForm/fields/CheckboxField.js +13 -0
- package/dist/cjs/CommandForm/fields/CheckboxField.js.map +1 -0
- package/dist/cjs/CommandForm/fields/DropdownField.js +13 -0
- package/dist/cjs/CommandForm/fields/DropdownField.js.map +1 -0
- package/dist/cjs/CommandForm/fields/InputTextField.js +13 -0
- package/dist/cjs/CommandForm/fields/InputTextField.js.map +1 -0
- package/dist/cjs/CommandForm/fields/NumberField.js +13 -0
- package/dist/cjs/CommandForm/fields/NumberField.js.map +1 -0
- package/dist/cjs/CommandForm/fields/SliderField.js +17 -0
- package/dist/cjs/CommandForm/fields/SliderField.js.map +1 -0
- package/dist/cjs/CommandForm/fields/TextAreaField.js +13 -0
- package/dist/cjs/CommandForm/fields/TextAreaField.js.map +1 -0
- package/dist/cjs/CommandForm/index.js +15 -7
- package/dist/cjs/CommandForm/index.js.map +1 -1
- package/dist/cjs/PivotViewer/PivotViewer.css +1258 -0
- package/dist/cjs/PivotViewer/PivotViewer.js +14 -0
- package/dist/cjs/PivotViewer/PivotViewer.js.map +1 -1
- package/dist/cjs/PivotViewer/components/PivotCanvas.js +33 -10
- package/dist/cjs/PivotViewer/components/PivotCanvas.js.map +1 -1
- package/dist/cjs/PivotViewer/components/PivotViewerMain.js +1 -1
- package/dist/cjs/PivotViewer/components/PivotViewerMain.js.map +1 -1
- package/dist/cjs/PivotViewer/components/Spinner.css +77 -0
- package/dist/cjs/PivotViewer/components/pivot/sprites.js +79 -15
- package/dist/cjs/PivotViewer/components/pivot/sprites.js.map +1 -1
- package/dist/cjs/PivotViewer/components/pivot/visibility.js +36 -10
- package/dist/cjs/PivotViewer/components/pivot/visibility.js.map +1 -1
- package/dist/cjs/PivotViewer/engine/layout.js +2 -1
- package/dist/cjs/PivotViewer/engine/layout.js.map +1 -1
- package/dist/cjs/PivotViewer/hooks/usePivotEngine.js +37 -2
- package/dist/cjs/PivotViewer/hooks/usePivotEngine.js.map +1 -1
- package/dist/cjs/PivotViewer/index.js +3 -0
- package/dist/cjs/PivotViewer/index.js.map +1 -1
- package/dist/cjs/PivotViewer/types.js +22 -0
- package/dist/cjs/PivotViewer/types.js.map +1 -0
- package/dist/cjs/TimeMachine/EventsView.css +213 -0
- package/dist/cjs/TimeMachine/TimeMachine.css +567 -0
- package/dist/cjs/TimeMachine/TimeMachine.js +8 -3
- package/dist/cjs/TimeMachine/TimeMachine.js.map +1 -1
- package/dist/esm/CommandForm/CommandForm.stories.d.ts +1 -0
- package/dist/esm/CommandForm/CommandForm.stories.d.ts.map +1 -1
- package/dist/esm/CommandForm/CommandForm.stories.js +34 -1
- package/dist/esm/CommandForm/CommandForm.stories.js.map +1 -1
- package/dist/esm/CommandForm/CommandFormFields.d.ts.map +1 -1
- package/dist/esm/CommandForm/CommandFormFields.js +9 -3
- package/dist/esm/CommandForm/CommandFormFields.js.map +1 -1
- package/dist/esm/CommandForm/UserRegistrationCommand.d.ts +63 -0
- package/dist/esm/CommandForm/UserRegistrationCommand.d.ts.map +1 -0
- package/dist/esm/CommandForm/UserRegistrationCommand.js +143 -0
- package/dist/esm/CommandForm/UserRegistrationCommand.js.map +1 -0
- package/dist/esm/CommandForm/ValidationMessage.d.ts +8 -0
- package/dist/esm/CommandForm/ValidationMessage.d.ts.map +1 -0
- package/dist/esm/CommandForm/ValidationMessage.js +22 -0
- package/dist/esm/CommandForm/ValidationMessage.js.map +1 -0
- package/dist/esm/CommandForm/asCommandFormField.d.ts +32 -0
- package/dist/esm/CommandForm/asCommandFormField.d.ts.map +1 -0
- package/dist/esm/CommandForm/asCommandFormField.js +45 -0
- package/dist/esm/CommandForm/asCommandFormField.js.map +1 -0
- package/dist/esm/CommandForm/fields/CheckboxField.d.ts +10 -0
- package/dist/esm/CommandForm/fields/CheckboxField.d.ts.map +1 -0
- package/dist/esm/CommandForm/fields/CheckboxField.js +11 -0
- package/dist/esm/CommandForm/fields/CheckboxField.js.map +1 -0
- package/dist/esm/CommandForm/fields/DropdownField.d.ts +15 -0
- package/dist/esm/CommandForm/fields/DropdownField.d.ts.map +1 -0
- package/dist/esm/CommandForm/fields/DropdownField.js +11 -0
- package/dist/esm/CommandForm/fields/DropdownField.js.map +1 -0
- package/dist/esm/CommandForm/fields/InputTextField.d.ts +11 -0
- package/dist/esm/CommandForm/fields/InputTextField.d.ts.map +1 -0
- package/dist/esm/CommandForm/fields/InputTextField.js +11 -0
- package/dist/esm/CommandForm/fields/InputTextField.js.map +1 -0
- package/dist/esm/CommandForm/fields/NumberField.d.ts +13 -0
- package/dist/esm/CommandForm/fields/NumberField.d.ts.map +1 -0
- package/dist/esm/CommandForm/fields/NumberField.js +11 -0
- package/dist/esm/CommandForm/fields/NumberField.js.map +1 -0
- package/dist/esm/CommandForm/fields/SliderField.d.ts +12 -0
- package/dist/esm/CommandForm/fields/SliderField.d.ts.map +1 -0
- package/dist/esm/CommandForm/fields/SliderField.js +15 -0
- package/dist/esm/CommandForm/fields/SliderField.js.map +1 -0
- package/dist/esm/CommandForm/fields/TextAreaField.d.ts +12 -0
- package/dist/esm/CommandForm/fields/TextAreaField.d.ts.map +1 -0
- package/dist/esm/CommandForm/fields/TextAreaField.js +11 -0
- package/dist/esm/CommandForm/fields/TextAreaField.js.map +1 -0
- package/dist/esm/CommandForm/fields/index.d.ts +7 -0
- package/dist/esm/CommandForm/fields/index.d.ts.map +1 -0
- package/dist/esm/CommandForm/fields/index.js +7 -0
- package/dist/esm/CommandForm/fields/index.js.map +1 -0
- package/dist/esm/CommandForm/index.d.ts +3 -4
- package/dist/esm/CommandForm/index.d.ts.map +1 -1
- package/dist/esm/CommandForm/index.js +8 -4
- package/dist/esm/CommandForm/index.js.map +1 -1
- package/dist/esm/PivotViewer/PivotViewer.css +1258 -0
- package/dist/esm/PivotViewer/PivotViewer.d.ts.map +1 -1
- package/dist/esm/PivotViewer/PivotViewer.js +14 -0
- package/dist/esm/PivotViewer/PivotViewer.js.map +1 -1
- package/dist/esm/PivotViewer/PivotViewer.stories.d.ts +1 -0
- package/dist/esm/PivotViewer/PivotViewer.stories.d.ts.map +1 -1
- package/dist/esm/PivotViewer/PivotViewer.stories.js +43 -3
- package/dist/esm/PivotViewer/PivotViewer.stories.js.map +1 -1
- package/dist/esm/PivotViewer/components/PivotCanvas.d.ts.map +1 -1
- package/dist/esm/PivotViewer/components/PivotCanvas.js +33 -10
- package/dist/esm/PivotViewer/components/PivotCanvas.js.map +1 -1
- package/dist/esm/PivotViewer/components/PivotViewerMain.js +1 -1
- package/dist/esm/PivotViewer/components/PivotViewerMain.js.map +1 -1
- package/dist/esm/PivotViewer/components/Spinner.css +77 -0
- package/dist/esm/PivotViewer/components/pivot/sprites.d.ts.map +1 -1
- package/dist/esm/PivotViewer/components/pivot/sprites.js +79 -15
- package/dist/esm/PivotViewer/components/pivot/sprites.js.map +1 -1
- package/dist/esm/PivotViewer/components/pivot/visibility.d.ts.map +1 -1
- package/dist/esm/PivotViewer/components/pivot/visibility.js +36 -10
- package/dist/esm/PivotViewer/components/pivot/visibility.js.map +1 -1
- package/dist/esm/PivotViewer/engine/layout.js +2 -1
- package/dist/esm/PivotViewer/engine/layout.js.map +1 -1
- package/dist/esm/PivotViewer/engine/pivot.worker.d.ts.map +1 -1
- package/dist/esm/PivotViewer/engine/pivot.worker.js +22 -7
- package/dist/esm/PivotViewer/engine/pivot.worker.js.map +1 -1
- package/dist/esm/PivotViewer/hooks/useFilteredData.d.ts +2 -2
- package/dist/esm/PivotViewer/hooks/useFilteredData.d.ts.map +1 -1
- package/dist/esm/PivotViewer/hooks/useFilteredData.js +4 -2
- package/dist/esm/PivotViewer/hooks/useFilteredData.js.map +1 -1
- package/dist/esm/PivotViewer/hooks/usePivotEngine.d.ts.map +1 -1
- package/dist/esm/PivotViewer/hooks/usePivotEngine.js +37 -2
- package/dist/esm/PivotViewer/hooks/usePivotEngine.js.map +1 -1
- package/dist/esm/PivotViewer/index.d.ts +2 -1
- package/dist/esm/PivotViewer/index.d.ts.map +1 -1
- package/dist/esm/PivotViewer/index.js +1 -0
- package/dist/esm/PivotViewer/index.js.map +1 -1
- package/dist/esm/PivotViewer/types.d.ts +4 -1
- package/dist/esm/PivotViewer/types.d.ts.map +1 -1
- package/dist/esm/PivotViewer/types.js +19 -2
- package/dist/esm/PivotViewer/types.js.map +1 -1
- package/dist/esm/TimeMachine/EventsView.css +213 -0
- package/dist/esm/TimeMachine/TimeMachine.css +567 -0
- package/dist/esm/TimeMachine/TimeMachine.d.ts.map +1 -1
- package/dist/esm/TimeMachine/TimeMachine.js +8 -3
- package/dist/esm/TimeMachine/TimeMachine.js.map +1 -1
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/package.json +31 -32
- package/.storybook/main.ts +0 -24
- package/CommandDialog/CommandDialog.stories.tsx +0 -25
- package/CommandDialog/CommandDialog.tsx +0 -161
- package/CommandDialog/index.ts +0 -4
- package/CommandForm/CommandForm.stories.tsx +0 -24
- package/CommandForm/CommandForm.tsx +0 -266
- package/CommandForm/CommandFormField.tsx +0 -27
- package/CommandForm/CommandFormFields.tsx +0 -142
- package/CommandForm/DatePickerField.tsx +0 -57
- package/CommandForm/DropdownField.tsx +0 -65
- package/CommandForm/InputTextField.tsx +0 -62
- package/CommandForm/SliderField.tsx +0 -68
- package/CommandForm/index.ts +0 -10
- package/Common/ErrorBoundary.stories.tsx +0 -10
- package/Common/ErrorBoundary.tsx +0 -41
- package/Common/FormElement.stories.tsx +0 -10
- package/Common/FormElement.tsx +0 -20
- package/Common/Page.stories.tsx +0 -10
- package/Common/Page.tsx +0 -21
- package/Common/index.ts +0 -6
- package/DataPage/DataPage.stories.tsx +0 -10
- package/DataPage/DataPage.tsx +0 -191
- package/DataPage/index.ts +0 -4
- package/DataTables/DataTableForObservableQuery.stories.tsx +0 -10
- package/DataTables/DataTableForObservableQuery.tsx +0 -97
- package/DataTables/DataTableForQuery.stories.tsx +0 -10
- package/DataTables/DataTableForQuery.tsx +0 -97
- package/DataTables/index.ts +0 -5
- package/Dialogs/BusyIndicatorDialog.stories.tsx +0 -26
- package/Dialogs/BusyIndicatorDialog.tsx +0 -26
- package/Dialogs/ConfirmationDialog.stories.tsx +0 -36
- package/Dialogs/ConfirmationDialog.tsx +0 -75
- package/Dialogs/index.ts +0 -5
- package/Dropdown/Dropdown.tsx +0 -23
- package/Dropdown/index.ts +0 -4
- package/PivotViewer/PivotViewer.stories.tsx +0 -24
- package/PivotViewer/PivotViewer.tsx +0 -791
- package/PivotViewer/components/AxisLabels.tsx +0 -69
- package/PivotViewer/components/DetailPanel.tsx +0 -108
- package/PivotViewer/components/FilterPanel.tsx +0 -189
- package/PivotViewer/components/FilterPanelContainer.tsx +0 -10
- package/PivotViewer/components/PivotCanvas.tsx +0 -660
- package/PivotViewer/components/PivotViewerMain.tsx +0 -229
- package/PivotViewer/components/RangeHistogramFilter.tsx +0 -220
- package/PivotViewer/components/Spinner.tsx +0 -21
- package/PivotViewer/components/Toolbar.tsx +0 -130
- package/PivotViewer/components/ToolbarContainer.tsx +0 -10
- package/PivotViewer/components/index.ts +0 -12
- package/PivotViewer/components/pivot/animation.ts +0 -108
- package/PivotViewer/components/pivot/buckets.ts +0 -152
- package/PivotViewer/components/pivot/colorResolver.ts +0 -67
- package/PivotViewer/components/pivot/constants.ts +0 -46
- package/PivotViewer/components/pivot/sprites.ts +0 -265
- package/PivotViewer/components/pivot/visibility.ts +0 -319
- package/PivotViewer/constants.ts +0 -9
- package/PivotViewer/engine/layout.ts +0 -149
- package/PivotViewer/engine/pivot.worker.ts +0 -86
- package/PivotViewer/engine/store.ts +0 -437
- package/PivotViewer/engine/types.ts +0 -255
- package/PivotViewer/hooks/index.ts +0 -13
- package/PivotViewer/hooks/useContainerDimensions.ts +0 -45
- package/PivotViewer/hooks/useDimensionState.ts +0 -53
- package/PivotViewer/hooks/useFilterOptions.ts +0 -36
- package/PivotViewer/hooks/useFilterPanelDrag.ts +0 -49
- package/PivotViewer/hooks/useFilterState.ts +0 -106
- package/PivotViewer/hooks/useFilteredData.ts +0 -119
- package/PivotViewer/hooks/usePanning.ts +0 -163
- package/PivotViewer/hooks/usePivotEngine.ts +0 -252
- package/PivotViewer/hooks/useSelectedItem.ts +0 -402
- package/PivotViewer/hooks/useWheelZoom.ts +0 -114
- package/PivotViewer/hooks/useZoomState.ts +0 -34
- package/PivotViewer/index.ts +0 -7
- package/PivotViewer/types.ts +0 -59
- package/PivotViewer/utils/animations.ts +0 -249
- package/PivotViewer/utils/constants.ts +0 -20
- package/PivotViewer/utils/index.ts +0 -6
- package/PivotViewer/utils/selection.ts +0 -292
- package/PivotViewer/utils/utils.ts +0 -259
- package/TimeMachine/EventsView.stories.tsx +0 -10
- package/TimeMachine/EventsView.tsx +0 -119
- package/TimeMachine/Properties.stories.tsx +0 -10
- package/TimeMachine/Properties.tsx +0 -98
- package/TimeMachine/ReadModelView.stories.tsx +0 -10
- package/TimeMachine/ReadModelView.tsx +0 -143
- package/TimeMachine/TimeMachine.stories.tsx +0 -10
- package/TimeMachine/TimeMachine.tsx +0 -244
- package/TimeMachine/index.ts +0 -8
- package/TimeMachine/types.ts +0 -23
- package/dist/cjs/CommandForm/DatePickerField.js +0 -31
- package/dist/cjs/CommandForm/DatePickerField.js.map +0 -1
- package/dist/cjs/CommandForm/DropdownField.js +0 -31
- package/dist/cjs/CommandForm/DropdownField.js.map +0 -1
- package/dist/cjs/CommandForm/InputTextField.js +0 -32
- package/dist/cjs/CommandForm/InputTextField.js.map +0 -1
- package/dist/cjs/CommandForm/SliderField.js +0 -34
- package/dist/cjs/CommandForm/SliderField.js.map +0 -1
- package/dist/esm/CommandForm/DatePickerField.d.ts +0 -20
- package/dist/esm/CommandForm/DatePickerField.d.ts.map +0 -1
- package/dist/esm/CommandForm/DatePickerField.js +0 -29
- package/dist/esm/CommandForm/DatePickerField.js.map +0 -1
- package/dist/esm/CommandForm/DropdownField.d.ts +0 -24
- package/dist/esm/CommandForm/DropdownField.d.ts.map +0 -1
- package/dist/esm/CommandForm/DropdownField.js +0 -29
- package/dist/esm/CommandForm/DropdownField.js.map +0 -1
- package/dist/esm/CommandForm/InputTextField.d.ts +0 -20
- package/dist/esm/CommandForm/InputTextField.d.ts.map +0 -1
- package/dist/esm/CommandForm/InputTextField.js +0 -30
- package/dist/esm/CommandForm/InputTextField.js.map +0 -1
- package/dist/esm/CommandForm/SliderField.d.ts +0 -23
- package/dist/esm/CommandForm/SliderField.d.ts.map +0 -1
- package/dist/esm/CommandForm/SliderField.js +0 -32
- package/dist/esm/CommandForm/SliderField.js.map +0 -1
- package/global.d.ts +0 -11
- package/index.ts +0 -22
- package/useOverlayZIndex.ts +0 -32
- package/vite.config.ts +0 -80
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
-
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
-
|
|
4
|
-
import type { CardSprite } from './constants';
|
|
5
|
-
import type * as PIXI from 'pixi.js';
|
|
6
|
-
|
|
7
|
-
export function updatePositions(sprites: Map<unknown, CardSprite>, isViewTransitionRef: { current: boolean }, animationSpeed = 0.15) {
|
|
8
|
-
let isAnimating = false;
|
|
9
|
-
const threshold = 0.5;
|
|
10
|
-
const shouldAnimate = isViewTransitionRef.current;
|
|
11
|
-
const now = Date.now();
|
|
12
|
-
const DURATION = 600; // ms
|
|
13
|
-
|
|
14
|
-
for (const sprite of sprites.values()) {
|
|
15
|
-
// Handle explicit time-based animation (view transitions)
|
|
16
|
-
if (sprite.animationStartTime !== undefined) {
|
|
17
|
-
const elapsed = now - sprite.animationStartTime;
|
|
18
|
-
const delay = sprite.animationDelay || 0;
|
|
19
|
-
|
|
20
|
-
if (elapsed < delay) {
|
|
21
|
-
isAnimating = true;
|
|
22
|
-
continue;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
const progress = Math.min(1, (elapsed - delay) / DURATION);
|
|
26
|
-
// Ease out cubic: 1 - (1-t)^3
|
|
27
|
-
const t = 1 - Math.pow(1 - progress, 3);
|
|
28
|
-
|
|
29
|
-
if (sprite.startX !== undefined && sprite.startY !== undefined) {
|
|
30
|
-
sprite.currentX = sprite.startX + (sprite.targetX - sprite.startX) * t;
|
|
31
|
-
sprite.currentY = sprite.startY + (sprite.targetY - sprite.startY) * t;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
sprite.container.position.set(sprite.currentX, sprite.currentY);
|
|
35
|
-
|
|
36
|
-
if (progress < 1) {
|
|
37
|
-
isAnimating = true;
|
|
38
|
-
} else {
|
|
39
|
-
// Animation finished, clean up
|
|
40
|
-
sprite.currentX = sprite.targetX;
|
|
41
|
-
sprite.currentY = sprite.targetY;
|
|
42
|
-
delete sprite.animationStartTime;
|
|
43
|
-
delete sprite.animationDelay;
|
|
44
|
-
delete sprite.startX;
|
|
45
|
-
delete sprite.startY;
|
|
46
|
-
}
|
|
47
|
-
continue;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const dx = sprite.targetX - sprite.currentX;
|
|
51
|
-
const dy = sprite.targetY - sprite.currentY;
|
|
52
|
-
const distance = Math.sqrt(dx * dx + dy * dy);
|
|
53
|
-
|
|
54
|
-
if (shouldAnimate && distance > threshold) {
|
|
55
|
-
sprite.currentX += dx * animationSpeed;
|
|
56
|
-
sprite.currentY += dy * animationSpeed;
|
|
57
|
-
sprite.container.position.set(sprite.currentX, sprite.currentY);
|
|
58
|
-
isAnimating = true;
|
|
59
|
-
} else if (distance > 0) {
|
|
60
|
-
sprite.currentX = sprite.targetX;
|
|
61
|
-
sprite.currentY = sprite.targetY;
|
|
62
|
-
sprite.container.position.set(sprite.currentX, sprite.currentY);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
if (!isAnimating && isViewTransitionRef.current) {
|
|
67
|
-
isViewTransitionRef.current = false;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
return isAnimating;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
export function startAnimationLoop(
|
|
74
|
-
refs: {
|
|
75
|
-
mountedRef: { current: boolean };
|
|
76
|
-
appRef: { current: PIXI.Application | null };
|
|
77
|
-
animationFrameRef: { current: number };
|
|
78
|
-
isAnimatingRef: { current: boolean };
|
|
79
|
-
needsRenderRef: { current: boolean };
|
|
80
|
-
spritesRef: { current: Map<unknown, CardSprite> };
|
|
81
|
-
isViewTransitionRef: { current: boolean };
|
|
82
|
-
},
|
|
83
|
-
animationSpeed = 0.15,
|
|
84
|
-
) {
|
|
85
|
-
const { mountedRef, appRef, animationFrameRef, isAnimatingRef, needsRenderRef, spritesRef, isViewTransitionRef } = refs;
|
|
86
|
-
|
|
87
|
-
const animate = () => {
|
|
88
|
-
if (!mountedRef.current) return;
|
|
89
|
-
|
|
90
|
-
const stillAnimating = updatePositions(spritesRef.current, isViewTransitionRef, animationSpeed);
|
|
91
|
-
|
|
92
|
-
if (stillAnimating || needsRenderRef.current) {
|
|
93
|
-
appRef.current?.renderer.render(appRef.current.stage);
|
|
94
|
-
needsRenderRef.current = false;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
if (stillAnimating) {
|
|
98
|
-
animationFrameRef.current = requestAnimationFrame(animate);
|
|
99
|
-
} else {
|
|
100
|
-
isAnimatingRef.current = false;
|
|
101
|
-
}
|
|
102
|
-
};
|
|
103
|
-
|
|
104
|
-
if (!isAnimatingRef.current) {
|
|
105
|
-
isAnimatingRef.current = true;
|
|
106
|
-
animate();
|
|
107
|
-
}
|
|
108
|
-
}
|
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
-
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
-
|
|
4
|
-
import * as PIXI from 'pixi.js';
|
|
5
|
-
import type { CardColors } from './constants';
|
|
6
|
-
import type { GroupingResult, LayoutResult } from '../../engine/types';
|
|
7
|
-
|
|
8
|
-
export function updateBucketBackgrounds(
|
|
9
|
-
bucketsContainer: PIXI.Container | null,
|
|
10
|
-
container: HTMLDivElement | null,
|
|
11
|
-
grouping: GroupingResult,
|
|
12
|
-
layout: LayoutResult,
|
|
13
|
-
zoomLevel: number,
|
|
14
|
-
cardColors: CardColors,
|
|
15
|
-
viewMode: string,
|
|
16
|
-
) {
|
|
17
|
-
if (!bucketsContainer) return;
|
|
18
|
-
|
|
19
|
-
// keep parameter referenced to avoid unused param lint when callers pass zoomLevel
|
|
20
|
-
void zoomLevel;
|
|
21
|
-
|
|
22
|
-
if (!container || grouping.groups.length === 0 || viewMode === 'collection') {
|
|
23
|
-
// If we shouldn't show anything, hide all existing backgrounds
|
|
24
|
-
// We keep the highlight if it exists
|
|
25
|
-
for (const child of bucketsContainer.children) {
|
|
26
|
-
if ((child as any).name !== 'highlight') {
|
|
27
|
-
child.visible = false;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
// Use layout's total height if available so backgrounds match sprite positions
|
|
34
|
-
const worldHeight = layout.totalHeight || container.clientHeight;
|
|
35
|
-
|
|
36
|
-
// Get existing background graphics (excluding highlight)
|
|
37
|
-
const backgroundGraphics = bucketsContainer.children.filter(c => (c as any).name !== 'highlight') as PIXI.Graphics[];
|
|
38
|
-
let bgIndex = 0;
|
|
39
|
-
|
|
40
|
-
// Instead of re-deriving bucket geometry from constants, compute bucket bounds
|
|
41
|
-
// directly from the positions stored in the layout so backgrounds align exactly.
|
|
42
|
-
for (let index = 0; index < grouping.groups.length; index++) {
|
|
43
|
-
const group = grouping.groups[index];
|
|
44
|
-
let minX = Infinity;
|
|
45
|
-
let maxX = -Infinity;
|
|
46
|
-
|
|
47
|
-
for (let j = 0; j < group.ids.length; j++) {
|
|
48
|
-
const id = group.ids[j];
|
|
49
|
-
const pos = layout.positions.get(id);
|
|
50
|
-
if (pos) {
|
|
51
|
-
minX = Math.min(minX, pos.x);
|
|
52
|
-
maxX = Math.max(maxX, pos.x);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
if (minX === Infinity) continue;
|
|
57
|
-
|
|
58
|
-
// Prefer explicit bucket width from layout when available
|
|
59
|
-
const bucketWidths = layout.bucketWidths || [];
|
|
60
|
-
const widthFromLayout = bucketWidths[index];
|
|
61
|
-
const width = widthFromLayout && widthFromLayout > 0 ? widthFromLayout : (maxX - minX) || 0;
|
|
62
|
-
|
|
63
|
-
if (index % 2 === 0 && width > 0) {
|
|
64
|
-
let bg: PIXI.Graphics;
|
|
65
|
-
|
|
66
|
-
if (bgIndex < backgroundGraphics.length) {
|
|
67
|
-
bg = backgroundGraphics[bgIndex];
|
|
68
|
-
bg.clear();
|
|
69
|
-
} else {
|
|
70
|
-
bg = new PIXI.Graphics();
|
|
71
|
-
// Insert before highlight if it exists, otherwise at end
|
|
72
|
-
const highlightIndex = bucketsContainer.children.findIndex(c => (c as any).name === 'highlight');
|
|
73
|
-
if (highlightIndex >= 0) {
|
|
74
|
-
bucketsContainer.addChildAt(bg, highlightIndex);
|
|
75
|
-
} else {
|
|
76
|
-
bucketsContainer.addChild(bg);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
bg.rect(minX, 0, width, worldHeight);
|
|
81
|
-
bg.fill(cardColors.base);
|
|
82
|
-
bg.alpha = 0.15;
|
|
83
|
-
bg.visible = true;
|
|
84
|
-
bgIndex++;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
// Hide unused background graphics
|
|
89
|
-
for (let i = bgIndex; i < backgroundGraphics.length; i++) {
|
|
90
|
-
backgroundGraphics[i].visible = false;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
export function updateHighlight(
|
|
95
|
-
bucketsContainer: PIXI.Container | null,
|
|
96
|
-
container: HTMLDivElement | null,
|
|
97
|
-
grouping: GroupingResult,
|
|
98
|
-
layout: LayoutResult,
|
|
99
|
-
hoveredGroupIndex: number | null,
|
|
100
|
-
cardWidth: number,
|
|
101
|
-
zoomLevel: number,
|
|
102
|
-
) {
|
|
103
|
-
if (!bucketsContainer || !container || grouping.groups.length === 0) return;
|
|
104
|
-
|
|
105
|
-
// `zoomLevel` is part of the signature for future use; reference it
|
|
106
|
-
// to avoid unused-parameter lint errors when callers pass it.
|
|
107
|
-
void zoomLevel;
|
|
108
|
-
|
|
109
|
-
let highlight = bucketsContainer.children.find(child => (child as any).name === 'highlight') as PIXI.Graphics;
|
|
110
|
-
|
|
111
|
-
if (!highlight) {
|
|
112
|
-
highlight = new PIXI.Graphics();
|
|
113
|
-
(highlight as any).name = 'highlight';
|
|
114
|
-
bucketsContainer.addChild(highlight);
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
highlight.clear();
|
|
118
|
-
|
|
119
|
-
if (hoveredGroupIndex === null || hoveredGroupIndex < 0) {
|
|
120
|
-
highlight.visible = false;
|
|
121
|
-
return;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
const group = grouping.groups[hoveredGroupIndex];
|
|
125
|
-
if (!group || group.ids.length === 0) {
|
|
126
|
-
highlight.visible = false;
|
|
127
|
-
return;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
let minX = Infinity;
|
|
131
|
-
let maxX = -Infinity;
|
|
132
|
-
|
|
133
|
-
for (let j = 0; j < group.ids.length; j++) {
|
|
134
|
-
const id = group.ids[j];
|
|
135
|
-
const pos = layout.positions.get(id);
|
|
136
|
-
if (pos) {
|
|
137
|
-
minX = Math.min(minX, pos.x);
|
|
138
|
-
maxX = Math.max(maxX, pos.x + cardWidth);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
if (minX === Infinity) {
|
|
143
|
-
highlight.visible = false;
|
|
144
|
-
return;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
const worldHeight = layout.totalHeight || container.clientHeight;
|
|
148
|
-
highlight.rect(minX, 0, maxX - minX, worldHeight);
|
|
149
|
-
highlight.fill(0xffffff);
|
|
150
|
-
highlight.alpha = 0.05;
|
|
151
|
-
highlight.visible = true;
|
|
152
|
-
}
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
-
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
-
|
|
4
|
-
import { DEFAULT_COLORS, type CardColors } from './constants';
|
|
5
|
-
|
|
6
|
-
export function createCssColorResolver() {
|
|
7
|
-
const canvas = document.createElement('canvas');
|
|
8
|
-
const ctx = canvas.getContext('2d');
|
|
9
|
-
|
|
10
|
-
const parseHex = (val: string): number | null => {
|
|
11
|
-
if (!val.startsWith('#')) return null;
|
|
12
|
-
const hex = val.slice(1);
|
|
13
|
-
const normalized = hex.length === 3
|
|
14
|
-
? hex.split('').map((c) => c + c).join('')
|
|
15
|
-
: hex.length === 4
|
|
16
|
-
? hex.slice(0, 3).split('').map((c) => c + c).join('')
|
|
17
|
-
: hex.length === 6
|
|
18
|
-
? hex
|
|
19
|
-
: hex.length === 8
|
|
20
|
-
? hex.slice(0, 6)
|
|
21
|
-
: null;
|
|
22
|
-
return normalized ? Number.parseInt(normalized, 16) : null;
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
return (cssValue: string, fallback: number): number => {
|
|
26
|
-
if (!ctx) {
|
|
27
|
-
return fallback;
|
|
28
|
-
}
|
|
29
|
-
ctx.fillStyle = cssValue.trim();
|
|
30
|
-
const resolved = ctx.fillStyle; // normalized by canvas
|
|
31
|
-
const hex = parseHex(resolved);
|
|
32
|
-
if (hex !== null && Number.isFinite(hex)) {
|
|
33
|
-
return hex;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
if (resolved.startsWith('rgb')) {
|
|
37
|
-
const nums = resolved
|
|
38
|
-
.replace(/rgba?\(/, '')
|
|
39
|
-
.replace(/\)/, '')
|
|
40
|
-
.split(',')
|
|
41
|
-
.map((n) => Number.parseFloat(n.trim()))
|
|
42
|
-
.filter((n) => !Number.isNaN(n));
|
|
43
|
-
if (nums.length >= 3) {
|
|
44
|
-
const [r, g, b] = nums;
|
|
45
|
-
return ((r & 0xff) << 16) | ((g & 0xff) << 8) | (b & 0xff);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
return fallback;
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export function resolveCardColors(cssColorResolver: (s: string, f: number) => number): CardColors {
|
|
54
|
-
const root = document.documentElement;
|
|
55
|
-
const style = getComputedStyle(root);
|
|
56
|
-
const getVar = (name: string, fallback: number) =>
|
|
57
|
-
cssColorResolver(style.getPropertyValue(name) || name, fallback);
|
|
58
|
-
|
|
59
|
-
return {
|
|
60
|
-
base: getVar('--surface-b', DEFAULT_COLORS.base),
|
|
61
|
-
mid: getVar('--surface-a', DEFAULT_COLORS.mid),
|
|
62
|
-
gradient: getVar('--surface-ground', DEFAULT_COLORS.gradient),
|
|
63
|
-
border: getVar('--surface-border', DEFAULT_COLORS.border),
|
|
64
|
-
text: getVar('--text-color', DEFAULT_COLORS.text),
|
|
65
|
-
textSecondary: getVar('--text-color-secondary', DEFAULT_COLORS.textSecondary),
|
|
66
|
-
};
|
|
67
|
-
}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
-
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
-
|
|
4
|
-
import type * as PIXI from 'pixi.js';
|
|
5
|
-
|
|
6
|
-
export const ANIMATION_SPEED = 0.15;
|
|
7
|
-
export const CARD_PADDING = 10;
|
|
8
|
-
export const CARD_RADIUS = 12;
|
|
9
|
-
export const CARD_GAP = 8; // Gap between cards (must match layout gap)
|
|
10
|
-
|
|
11
|
-
export const DEFAULT_COLORS = {
|
|
12
|
-
base: 0x1b2b2f,
|
|
13
|
-
mid: 0x234445,
|
|
14
|
-
gradient: 0x2f5b56,
|
|
15
|
-
border: 0x5ad1a0,
|
|
16
|
-
text: 0xffffff,
|
|
17
|
-
textSecondary: 0x8899aa,
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
export type CardColors = typeof DEFAULT_COLORS;
|
|
21
|
-
|
|
22
|
-
export interface CardSprite {
|
|
23
|
-
container: PIXI.Container;
|
|
24
|
-
graphics: PIXI.Graphics;
|
|
25
|
-
titleText: PIXI.Text;
|
|
26
|
-
labelsText: PIXI.Text;
|
|
27
|
-
valuesText: PIXI.Text;
|
|
28
|
-
itemId: number | string;
|
|
29
|
-
targetX: number;
|
|
30
|
-
targetY: number;
|
|
31
|
-
currentX: number;
|
|
32
|
-
currentY: number;
|
|
33
|
-
// Animation state
|
|
34
|
-
animationStartTime?: number;
|
|
35
|
-
animationDelay?: number;
|
|
36
|
-
startX?: number;
|
|
37
|
-
startY?: number;
|
|
38
|
-
// Cache state to avoid unnecessary redraws
|
|
39
|
-
lastSelectedId?: string | number | null;
|
|
40
|
-
lastCardColors?: CardColors;
|
|
41
|
-
lastTitle?: string;
|
|
42
|
-
lastLabels?: string;
|
|
43
|
-
lastValues?: string;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export default {};
|
|
@@ -1,265 +0,0 @@
|
|
|
1
|
-
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
-
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
-
|
|
4
|
-
import * as PIXI from 'pixi.js';
|
|
5
|
-
import { CARD_GAP, CARD_PADDING, CARD_RADIUS } from './constants';
|
|
6
|
-
import type { CardSprite, CardColors } from './constants';
|
|
7
|
-
|
|
8
|
-
const spritePool: CardSprite[] = [];
|
|
9
|
-
|
|
10
|
-
export function createCardSprite<TItem extends object>(
|
|
11
|
-
id: number | string,
|
|
12
|
-
x: number,
|
|
13
|
-
y: number,
|
|
14
|
-
items: TItem[],
|
|
15
|
-
onCardClick: (item: TItem, e: MouseEvent, id: number | string) => void,
|
|
16
|
-
onPanStart: (e: MouseEvent) => void,
|
|
17
|
-
cardWidth: number,
|
|
18
|
-
cardHeight: number,
|
|
19
|
-
cardColors: CardColors,
|
|
20
|
-
): CardSprite {
|
|
21
|
-
if (spritePool.length > 0) {
|
|
22
|
-
const sprite = spritePool.pop()!;
|
|
23
|
-
sprite.container.visible = true;
|
|
24
|
-
sprite.container.alpha = 1;
|
|
25
|
-
sprite.container.position.set(x, y);
|
|
26
|
-
sprite.itemId = id;
|
|
27
|
-
sprite.targetX = x;
|
|
28
|
-
sprite.targetY = y;
|
|
29
|
-
sprite.currentX = x;
|
|
30
|
-
sprite.currentY = y;
|
|
31
|
-
|
|
32
|
-
// Reset animation state
|
|
33
|
-
delete sprite.animationStartTime;
|
|
34
|
-
delete sprite.animationDelay;
|
|
35
|
-
delete sprite.startX;
|
|
36
|
-
delete sprite.startY;
|
|
37
|
-
|
|
38
|
-
// Reset cache
|
|
39
|
-
sprite.lastSelectedId = null;
|
|
40
|
-
sprite.lastCardColors = undefined;
|
|
41
|
-
sprite.lastTitle = undefined;
|
|
42
|
-
sprite.lastLabels = undefined;
|
|
43
|
-
sprite.lastValues = undefined;
|
|
44
|
-
|
|
45
|
-
// Update event context
|
|
46
|
-
(sprite.container as any)._eventContext = { items, onCardClick, id };
|
|
47
|
-
|
|
48
|
-
return sprite;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
const container = new PIXI.Container();
|
|
52
|
-
container.eventMode = 'static';
|
|
53
|
-
container.cursor = 'pointer';
|
|
54
|
-
container.position.set(x, y);
|
|
55
|
-
|
|
56
|
-
// Store context for event handlers
|
|
57
|
-
(container as any)._eventContext = { items, onCardClick, id };
|
|
58
|
-
|
|
59
|
-
const graphics = new PIXI.Graphics();
|
|
60
|
-
|
|
61
|
-
const actualWidth = cardWidth - CARD_GAP;
|
|
62
|
-
const actualHeight = cardHeight - CARD_GAP;
|
|
63
|
-
const offsetX = CARD_GAP / 2;
|
|
64
|
-
const offsetY = CARD_GAP / 2;
|
|
65
|
-
|
|
66
|
-
const gradient = new PIXI.FillGradient(0, offsetY, 0, offsetY + actualHeight);
|
|
67
|
-
gradient.addColorStop(0, cardColors.mid);
|
|
68
|
-
gradient.addColorStop(1, cardColors.base);
|
|
69
|
-
|
|
70
|
-
graphics.roundRect(offsetX, offsetY, actualWidth, actualHeight, CARD_RADIUS);
|
|
71
|
-
graphics.fill(gradient);
|
|
72
|
-
|
|
73
|
-
container.addChild(graphics);
|
|
74
|
-
|
|
75
|
-
const titleText = new PIXI.Text('', {
|
|
76
|
-
fontSize: 13,
|
|
77
|
-
fill: cardColors.text as any,
|
|
78
|
-
fontWeight: '600',
|
|
79
|
-
lineHeight: 18,
|
|
80
|
-
wordWrap: false,
|
|
81
|
-
} as any);
|
|
82
|
-
titleText.position.set(offsetX + CARD_PADDING, offsetY + CARD_PADDING);
|
|
83
|
-
container.addChild(titleText);
|
|
84
|
-
|
|
85
|
-
const labelsText = new PIXI.Text('', {
|
|
86
|
-
fontSize: 11,
|
|
87
|
-
fill: cardColors.textSecondary as any,
|
|
88
|
-
fontWeight: '400',
|
|
89
|
-
lineHeight: 18,
|
|
90
|
-
} as any);
|
|
91
|
-
labelsText.position.set(offsetX + CARD_PADDING, offsetY + CARD_PADDING + 40);
|
|
92
|
-
container.addChild(labelsText);
|
|
93
|
-
|
|
94
|
-
const valuesText = new PIXI.Text('', {
|
|
95
|
-
fontSize: 11,
|
|
96
|
-
fill: cardColors.text as any,
|
|
97
|
-
fontWeight: '500',
|
|
98
|
-
lineHeight: 18,
|
|
99
|
-
wordWrap: false,
|
|
100
|
-
} as any);
|
|
101
|
-
valuesText.position.set(offsetX + CARD_PADDING + 65, offsetY + CARD_PADDING + 40);
|
|
102
|
-
container.addChild(valuesText);
|
|
103
|
-
|
|
104
|
-
container.on('click', (e: PIXI.FederatedPointerEvent) => {
|
|
105
|
-
e.stopPropagation();
|
|
106
|
-
const ctx = (container as any)._eventContext as { items: any; onCardClick: (item: any, e: MouseEvent, id: number | string) => void; id: number | string };
|
|
107
|
-
const itemsMap = ctx.items as Record<string, any>;
|
|
108
|
-
const item = itemsMap[String(ctx.id)];
|
|
109
|
-
if (item) {
|
|
110
|
-
ctx.onCardClick(item, e.nativeEvent as MouseEvent, ctx.id);
|
|
111
|
-
}
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
container.on('pointerdown', (e: PIXI.FederatedPointerEvent) => {
|
|
115
|
-
e.stopPropagation();
|
|
116
|
-
// onPanStart(e.nativeEvent as MouseEvent);
|
|
117
|
-
});
|
|
118
|
-
|
|
119
|
-
return {
|
|
120
|
-
container,
|
|
121
|
-
graphics,
|
|
122
|
-
titleText,
|
|
123
|
-
labelsText,
|
|
124
|
-
valuesText,
|
|
125
|
-
itemId: id,
|
|
126
|
-
targetX: x,
|
|
127
|
-
targetY: y,
|
|
128
|
-
currentX: x,
|
|
129
|
-
currentY: y,
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
export function destroySprite(sprite: CardSprite) {
|
|
134
|
-
if (sprite.container && sprite.container.parent) {
|
|
135
|
-
sprite.container.parent.removeChild(sprite.container);
|
|
136
|
-
}
|
|
137
|
-
// Reset visibility to ensure it doesn't ghost if something goes wrong
|
|
138
|
-
if (sprite.container) {
|
|
139
|
-
sprite.container.visible = false;
|
|
140
|
-
}
|
|
141
|
-
spritePool.push(sprite);
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
export function clearSpritePool() {
|
|
145
|
-
for (const sprite of spritePool) {
|
|
146
|
-
try {
|
|
147
|
-
sprite.graphics?.destroy();
|
|
148
|
-
sprite.titleText?.destroy();
|
|
149
|
-
sprite.labelsText?.destroy();
|
|
150
|
-
sprite.valuesText?.destroy();
|
|
151
|
-
sprite.container?.destroy();
|
|
152
|
-
} catch (e) {
|
|
153
|
-
void e;
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
spritePool.length = 0;
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
export function updateCardContent<TItem extends object>(
|
|
160
|
-
sprite: CardSprite,
|
|
161
|
-
item: TItem,
|
|
162
|
-
selectedId: string | number | null,
|
|
163
|
-
cardWidth: number,
|
|
164
|
-
cardHeight: number,
|
|
165
|
-
cardColors: CardColors,
|
|
166
|
-
) {
|
|
167
|
-
if (!item) return;
|
|
168
|
-
|
|
169
|
-
const event = item as any;
|
|
170
|
-
const eventType = event.type || event.name || event.title || 'Event';
|
|
171
|
-
|
|
172
|
-
const timeStr = event.occurred ? new Date(event.occurred).toLocaleString('en-US', {
|
|
173
|
-
month: '2-digit',
|
|
174
|
-
day: '2-digit',
|
|
175
|
-
year: 'numeric',
|
|
176
|
-
hour: '2-digit',
|
|
177
|
-
minute: '2-digit',
|
|
178
|
-
hour12: false
|
|
179
|
-
}).replace(',', '') : '';
|
|
180
|
-
|
|
181
|
-
const correlation = event.correlationId || event.correlation || '';
|
|
182
|
-
const correlationShort = correlation ? String(correlation).substring(0, 12) + '...' : '';
|
|
183
|
-
|
|
184
|
-
const maxTitleLength = 20;
|
|
185
|
-
const titleDisplay = eventType.length > maxTitleLength
|
|
186
|
-
? eventType.substring(0, maxTitleLength) + '...'
|
|
187
|
-
: eventType;
|
|
188
|
-
|
|
189
|
-
const maxTypeLength = 16;
|
|
190
|
-
const typeDisplay = eventType.length > maxTypeLength
|
|
191
|
-
? eventType.substring(0, maxTypeLength) + '...'
|
|
192
|
-
: eventType;
|
|
193
|
-
|
|
194
|
-
const colors = cardColors;
|
|
195
|
-
const labelsText = 'Type\nOccurred\nCorrelation';
|
|
196
|
-
const valuesText = `${typeDisplay}\n${timeStr}\n${correlationShort}`;
|
|
197
|
-
const colorsChanged = sprite.lastCardColors !== colors;
|
|
198
|
-
|
|
199
|
-
if (sprite.lastTitle !== titleDisplay) {
|
|
200
|
-
sprite.titleText.text = titleDisplay;
|
|
201
|
-
sprite.lastTitle = titleDisplay;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
if (sprite.lastLabels !== labelsText) {
|
|
205
|
-
sprite.labelsText.text = labelsText;
|
|
206
|
-
sprite.lastLabels = labelsText;
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
if (colorsChanged) {
|
|
210
|
-
(sprite.labelsText.style as any).fill = colors.textSecondary as any;
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
if (sprite.lastValues !== valuesText) {
|
|
214
|
-
sprite.valuesText.text = valuesText;
|
|
215
|
-
sprite.lastValues = valuesText;
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
if (colorsChanged) {
|
|
219
|
-
(sprite.valuesText.style as any).fill = colors.text as any;
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
sprite.titleText.visible = true;
|
|
223
|
-
sprite.labelsText.visible = true;
|
|
224
|
-
sprite.valuesText.visible = true;
|
|
225
|
-
|
|
226
|
-
const isSelected = sprite.itemId === selectedId;
|
|
227
|
-
|
|
228
|
-
// Only redraw graphics if selection state or colors changed
|
|
229
|
-
if (sprite.lastSelectedId === selectedId && !colorsChanged && sprite.graphics) {
|
|
230
|
-
return;
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
sprite.lastSelectedId = selectedId;
|
|
234
|
-
sprite.lastCardColors = cardColors;
|
|
235
|
-
|
|
236
|
-
if (sprite.graphics) {
|
|
237
|
-
sprite.graphics.clear();
|
|
238
|
-
} else {
|
|
239
|
-
sprite.graphics = new PIXI.Graphics();
|
|
240
|
-
sprite.container.addChildAt(sprite.graphics, 0);
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
const actualWidth = cardWidth - CARD_GAP;
|
|
244
|
-
const actualHeight = cardHeight - CARD_GAP;
|
|
245
|
-
const offsetX = CARD_GAP / 2;
|
|
246
|
-
const offsetY = CARD_GAP / 2;
|
|
247
|
-
|
|
248
|
-
const gradient = new PIXI.FillGradient(0, offsetY, 0, offsetY + actualHeight);
|
|
249
|
-
if (isSelected) {
|
|
250
|
-
gradient.addColorStop(0, colors.gradient);
|
|
251
|
-
gradient.addColorStop(1, colors.mid);
|
|
252
|
-
} else {
|
|
253
|
-
gradient.addColorStop(0, colors.mid);
|
|
254
|
-
gradient.addColorStop(1, colors.base);
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
sprite.graphics.roundRect(offsetX, offsetY, actualWidth, actualHeight, CARD_RADIUS);
|
|
258
|
-
sprite.graphics.fill(gradient);
|
|
259
|
-
|
|
260
|
-
if (isSelected) {
|
|
261
|
-
sprite.graphics.stroke({ width: 2, color: colors.border });
|
|
262
|
-
} else {
|
|
263
|
-
sprite.graphics.stroke({ width: 1, color: colors.border, alpha: 0.35 });
|
|
264
|
-
}
|
|
265
|
-
}
|