@shohojdhara/atomix 0.5.0 → 0.5.2
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/atomix.config.ts +12 -0
- package/build-tools/webpack-loader.js +5 -4
- package/dist/atomix.css +230 -83
- package/dist/atomix.css.map +1 -1
- package/dist/atomix.min.css +1 -1
- package/dist/atomix.min.css.map +1 -1
- package/dist/build-tools/webpack-loader.js +5 -4
- package/dist/charts.d.ts +24 -23
- package/dist/charts.js +271 -369
- package/dist/charts.js.map +1 -1
- package/dist/config.d.ts +624 -0
- package/dist/config.js +59 -0
- package/dist/config.js.map +1 -0
- package/dist/core.d.ts +3 -2
- package/dist/core.js +342 -382
- package/dist/core.js.map +1 -1
- package/dist/forms.d.ts +4 -6
- package/dist/forms.js +233 -334
- package/dist/forms.js.map +1 -1
- package/dist/heavy.d.ts +11 -2
- package/dist/heavy.js +406 -445
- package/dist/heavy.js.map +1 -1
- package/dist/index.d.ts +109 -65
- package/dist/index.esm.js +654 -748
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +621 -717
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/dist/layout.js +59 -60
- package/dist/layout.js.map +1 -1
- package/dist/theme.js +4 -4
- package/dist/theme.js.map +1 -1
- package/package.json +24 -9
- package/scripts/atomix-cli.js +15 -1
- package/scripts/cli/__tests__/complexity-utils.test.js +24 -0
- package/scripts/cli/__tests__/detector.test.js +50 -0
- package/scripts/cli/__tests__/template-engine.test.js +23 -0
- package/scripts/cli/__tests__/test-setup.js +1 -133
- package/scripts/cli/commands/doctor.js +15 -3
- package/scripts/cli/commands/generate.js +113 -51
- package/scripts/cli/internal/ai-engine.js +30 -10
- package/scripts/cli/internal/complexity-utils.js +60 -0
- package/scripts/cli/internal/component-validator.js +49 -16
- package/scripts/cli/internal/generator.js +89 -36
- package/scripts/cli/internal/hook-generator.js +5 -2
- package/scripts/cli/internal/itcss-generator.js +16 -12
- package/scripts/cli/templates/next-templates.js +81 -30
- package/scripts/cli/templates/storybook-templates.js +12 -2
- package/scripts/cli/utils/detector.js +45 -7
- package/scripts/cli/utils/diagnostics.js +78 -0
- package/scripts/cli/utils/telemetry.js +13 -0
- package/src/components/Accordion/Accordion.stories.tsx +4 -0
- package/src/components/AtomixGlass/AtomixGlass.tsx +188 -128
- package/src/components/AtomixGlass/AtomixGlassContainer.tsx +63 -91
- package/src/components/AtomixGlass/PerformanceDashboard.tsx +153 -201
- package/src/components/AtomixGlass/__snapshots__/AtomixGlass.test.tsx.snap +9 -6
- package/src/components/AtomixGlass/glass-utils.ts +51 -1
- package/src/components/AtomixGlass/stories/AnimationFeatures.stories.tsx +52 -46
- package/src/components/AtomixGlass/stories/Examples.stories.tsx +573 -236
- package/src/components/AtomixGlass/stories/Playground.stories.tsx +88 -41
- package/src/components/AtomixGlass/stories/argTypes.ts +19 -19
- package/src/components/AtomixGlass/stories/shared-components.tsx +7 -12
- package/src/components/AtomixGlass/stories/types.ts +3 -3
- package/src/components/Button/Button.tsx +114 -57
- package/src/components/Callout/Callout.tsx +4 -4
- package/src/components/Chart/ChartRenderer.tsx +1 -1
- package/src/components/Chart/DonutChart.tsx +11 -8
- package/src/components/EdgePanel/EdgePanel.tsx +119 -115
- package/src/components/Form/Select.tsx +4 -4
- package/src/components/List/List.tsx +4 -4
- package/src/components/Navigation/SideMenu/SideMenu.tsx +6 -6
- package/src/components/PhotoViewer/PhotoViewerImage.tsx +1 -1
- package/src/components/ProductReview/ProductReview.tsx +4 -2
- package/src/components/Rating/Rating.tsx +4 -2
- package/src/components/SectionIntro/SectionIntro.tsx +4 -2
- package/src/components/Steps/Steps.tsx +1 -1
- package/src/components/Tabs/Tabs.tsx +5 -5
- package/src/components/Testimonial/Testimonial.tsx +4 -2
- package/src/components/VideoPlayer/VideoPlayer.tsx +4 -2
- package/src/layouts/CssGrid/CssGrid.stories.tsx +464 -0
- package/src/layouts/CssGrid/CssGrid.tsx +215 -0
- package/src/layouts/CssGrid/index.ts +8 -0
- package/src/layouts/CssGrid/scripts/CssGrid.js +284 -0
- package/src/layouts/CssGrid/scripts/index.js +43 -0
- package/src/layouts/Grid/scripts/Container.js +139 -0
- package/src/layouts/Grid/scripts/Grid.js +184 -0
- package/src/layouts/Grid/scripts/GridCol.js +273 -0
- package/src/layouts/Grid/scripts/Row.js +154 -0
- package/src/layouts/Grid/scripts/index.js +48 -0
- package/src/layouts/MasonryGrid/MasonryGrid.tsx +71 -59
- package/src/lib/composables/atomix-glass/useGlassSize.ts +1 -1
- package/src/lib/composables/useAccordion.ts +5 -5
- package/src/lib/composables/useAtomixGlass.ts +111 -74
- package/src/lib/composables/useAtomixGlassStyles.ts +0 -2
- package/src/lib/composables/useBarChart.ts +2 -2
- package/src/lib/composables/useChart.ts +3 -2
- package/src/lib/composables/useChartToolbar.ts +48 -66
- package/src/lib/composables/useDataTable.ts +1 -1
- package/src/lib/composables/useDatePicker.ts +2 -2
- package/src/lib/composables/useEdgePanel.ts +45 -54
- package/src/lib/composables/useHeroBackgroundSlider.ts +5 -5
- package/src/lib/composables/usePhotoViewer.ts +2 -3
- package/src/lib/composables/usePieChart.ts +1 -1
- package/src/lib/composables/usePopover.ts +151 -139
- package/src/lib/composables/useSideMenu.ts +28 -41
- package/src/lib/composables/useSlider.ts +2 -6
- package/src/lib/composables/useTooltip.ts +2 -2
- package/src/lib/config/index.ts +39 -0
- package/src/lib/constants/components.ts +1 -0
- package/src/lib/theme/devtools/Comparator.tsx +1 -1
- package/src/lib/theme/devtools/Inspector.tsx +1 -1
- package/src/lib/theme/devtools/LiveEditor.tsx +1 -1
- package/src/lib/theme/runtime/ThemeProvider.tsx +1 -1
- package/src/lib/types/components.ts +1 -0
- package/src/styles/01-settings/_index.scss +1 -0
- package/src/styles/01-settings/_settings.atomix-glass.scss +174 -0
- package/src/styles/01-settings/_settings.masonry-grid.scss +42 -6
- package/src/styles/02-tools/_tools.glass.scss +6 -0
- package/src/styles/05-objects/_objects.masonry-grid.scss +162 -24
- package/src/styles/06-components/_components.atomix-glass.scss +160 -99
- package/scripts/cli/__tests__/README.md +0 -81
- package/scripts/cli/__tests__/basic.test.js +0 -116
- package/scripts/cli/__tests__/clean.test.js +0 -278
- package/scripts/cli/__tests__/component-generator.test.js +0 -332
- package/scripts/cli/__tests__/component-validator.test.js +0 -433
- package/scripts/cli/__tests__/generator.test.js +0 -613
- package/scripts/cli/__tests__/glass-motion.test.js +0 -256
- package/scripts/cli/__tests__/integration.test.js +0 -938
- package/scripts/cli/__tests__/migrate.test.js +0 -74
- package/scripts/cli/__tests__/security.test.js +0 -206
- package/scripts/cli/__tests__/theme-bridge.test.js +0 -507
- package/scripts/cli/__tests__/token-manager.test.js +0 -251
- package/scripts/cli/__tests__/token-provider.test.js +0 -361
- package/scripts/cli/__tests__/utils.test.js +0 -165
- package/src/components/AtomixGlass/stories/AnimationTests.stories.tsx +0 -95
- package/src/components/AtomixGlass/stories/CardExamples.stories.tsx +0 -212
- package/src/components/AtomixGlass/stories/Customization.stories.tsx +0 -131
- package/src/components/AtomixGlass/stories/DashboardExamples.stories.tsx +0 -348
- package/src/components/AtomixGlass/stories/EcommerceExamples.stories.tsx +0 -410
- package/src/components/AtomixGlass/stories/FormExamples.stories.tsx +0 -436
- package/src/components/AtomixGlass/stories/HeroExamples.stories.tsx +0 -264
- package/src/components/AtomixGlass/stories/InteractivePlayground.stories.tsx +0 -247
- package/src/components/AtomixGlass/stories/MobileUIExamples.stories.tsx +0 -418
- package/src/components/AtomixGlass/stories/ModalExamples.stories.tsx +0 -402
- package/src/components/AtomixGlass/stories/Modes.stories.tsx +0 -1082
- package/src/components/AtomixGlass/stories/Overview.stories.tsx +0 -497
- package/src/components/AtomixGlass/stories/Performance.stories.tsx +0 -103
- package/src/components/AtomixGlass/stories/PresetGallery.stories.tsx +0 -335
- package/src/components/AtomixGlass/stories/Shaders.stories.tsx +0 -395
- package/src/components/AtomixGlass/stories/WidgetExamples.stories.tsx +0 -441
- package/src/components/TypedButton/TypedButton.stories.tsx +0 -59
- package/src/components/TypedButton/TypedButton.tsx +0 -39
- package/src/components/TypedButton/index.ts +0 -2
- package/src/lib/composables/useBreadcrumb.ts +0 -81
- package/src/lib/composables/useChartInteractions.ts +0 -123
- package/src/lib/composables/useChartPerformance.ts +0 -347
- package/src/lib/composables/useDropdown.ts +0 -338
- package/src/lib/composables/useModal.ts +0 -110
- package/src/lib/composables/useTypedButton.ts +0 -66
- package/src/lib/hooks/usePerformanceMonitor.ts +0 -148
- package/src/lib/utils/displacement-generator.ts +0 -92
- package/src/lib/utils/memoryMonitor.ts +0 -191
- package/src/styles/01-settings/_settings.testtypecheck.scss +0 -53
- package/src/styles/01-settings/_settings.typedbutton.scss +0 -53
- package/src/styles/06-components/_components.testbutton.scss +0 -212
- package/src/styles/06-components/_components.testtypecheck.scss +0 -212
- package/src/styles/06-components/_components.typedbutton.scss +0 -212
|
@@ -148,17 +148,17 @@ export function useChartToolbar(
|
|
|
148
148
|
return { ...getChartDefaults(), ...defaults };
|
|
149
149
|
}, [getChartDefaults, defaults]);
|
|
150
150
|
|
|
151
|
-
const enhancedHandlers =
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
async (format: string) => {
|
|
151
|
+
const enhancedHandlers = useMemo(
|
|
152
|
+
() => ({
|
|
153
|
+
onRefresh: () => {
|
|
154
|
+
setState(prev => ({ ...prev, isRefreshing: true }));
|
|
155
|
+
handlers.onRefresh?.();
|
|
156
|
+
setTimeout(() => {
|
|
157
|
+
setState(prev => ({ ...prev, isRefreshing: false }));
|
|
158
|
+
}, 1000);
|
|
159
|
+
},
|
|
160
|
+
|
|
161
|
+
onExport: async (format: string) => {
|
|
162
162
|
setState(prev => ({ ...prev, isExporting: true }));
|
|
163
163
|
try {
|
|
164
164
|
await handlers.onExport?.(format);
|
|
@@ -166,83 +166,65 @@ export function useChartToolbar(
|
|
|
166
166
|
setState(prev => ({ ...prev, isExporting: false }));
|
|
167
167
|
}
|
|
168
168
|
},
|
|
169
|
-
[handlers.onExport]
|
|
170
|
-
),
|
|
171
169
|
|
|
172
|
-
|
|
173
|
-
(isFullscreen: boolean) => {
|
|
170
|
+
onFullscreen: (isFullscreen: boolean) => {
|
|
174
171
|
setState(prev => ({ ...prev, isFullscreen }));
|
|
175
172
|
handlers.onFullscreen?.(isFullscreen);
|
|
176
173
|
},
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
onPanToggle: useCallback(
|
|
196
|
-
(enabled: boolean) => {
|
|
174
|
+
|
|
175
|
+
onZoomIn: () => {
|
|
176
|
+
setState(prev => ({ ...prev, zoomLevel: Math.min(prev.zoomLevel * 1.2, 5) }));
|
|
177
|
+
handlers.onZoomIn?.();
|
|
178
|
+
},
|
|
179
|
+
|
|
180
|
+
onZoomOut: () => {
|
|
181
|
+
setState(prev => ({ ...prev, zoomLevel: Math.max(prev.zoomLevel / 1.2, 0.2) }));
|
|
182
|
+
handlers.onZoomOut?.();
|
|
183
|
+
},
|
|
184
|
+
|
|
185
|
+
onZoomReset: () => {
|
|
186
|
+
setState(prev => ({ ...prev, zoomLevel: 1 }));
|
|
187
|
+
handlers.onZoomReset?.();
|
|
188
|
+
},
|
|
189
|
+
|
|
190
|
+
onPanToggle: (enabled: boolean) => {
|
|
197
191
|
setState(prev => ({ ...prev, panEnabled: enabled }));
|
|
198
192
|
handlers.onPanToggle?.(enabled);
|
|
199
193
|
},
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
onGridToggle: useCallback(
|
|
213
|
-
(show: boolean) => {
|
|
194
|
+
|
|
195
|
+
onReset: () => {
|
|
196
|
+
setState(prev => ({
|
|
197
|
+
...prev,
|
|
198
|
+
zoomLevel: 1,
|
|
199
|
+
panEnabled: false,
|
|
200
|
+
}));
|
|
201
|
+
handlers.onReset?.();
|
|
202
|
+
},
|
|
203
|
+
|
|
204
|
+
onGridToggle: (show: boolean) => {
|
|
214
205
|
setState(prev => ({ ...prev, showGrid: show }));
|
|
215
206
|
handlers.onGridToggle?.(show);
|
|
216
207
|
},
|
|
217
|
-
[handlers.onGridToggle]
|
|
218
|
-
),
|
|
219
208
|
|
|
220
|
-
|
|
221
|
-
(show: boolean) => {
|
|
209
|
+
onLegendToggle: (show: boolean) => {
|
|
222
210
|
setState(prev => ({ ...prev, showLegend: show }));
|
|
223
211
|
handlers.onLegendToggle?.(show);
|
|
224
212
|
},
|
|
225
|
-
[handlers.onLegendToggle]
|
|
226
|
-
),
|
|
227
213
|
|
|
228
|
-
|
|
229
|
-
(show: boolean) => {
|
|
214
|
+
onTooltipsToggle: (show: boolean) => {
|
|
230
215
|
setState(prev => ({ ...prev, showTooltips: show }));
|
|
231
216
|
handlers.onTooltipsToggle?.(show);
|
|
232
217
|
},
|
|
233
|
-
[handlers.onTooltipsToggle]
|
|
234
|
-
),
|
|
235
218
|
|
|
236
|
-
|
|
237
|
-
(enabled: boolean) => {
|
|
219
|
+
onAnimationsToggle: (enabled: boolean) => {
|
|
238
220
|
setState(prev => ({ ...prev, animationsEnabled: enabled }));
|
|
239
221
|
handlers.onAnimationsToggle?.(enabled);
|
|
240
222
|
},
|
|
241
|
-
[handlers.onAnimationsToggle]
|
|
242
|
-
),
|
|
243
223
|
|
|
244
|
-
|
|
245
|
-
|
|
224
|
+
onSettings: () => {},
|
|
225
|
+
}),
|
|
226
|
+
[handlers]
|
|
227
|
+
);
|
|
246
228
|
|
|
247
229
|
// Generate chart-specific toolbar groups
|
|
248
230
|
const generateToolbarGroups = useCallback((): ChartToolbarGroup[] => {
|
|
@@ -441,7 +423,7 @@ export function useChartToolbar(
|
|
|
441
423
|
}
|
|
442
424
|
|
|
443
425
|
return groups;
|
|
444
|
-
}, [
|
|
426
|
+
}, [finalDefaults, state, enhancedHandlers, customActions, customGroups]);
|
|
445
427
|
|
|
446
428
|
// Keyboard shortcuts
|
|
447
429
|
useEffect(() => {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useState, useRef, useCallback, useEffect } from 'react';
|
|
1
|
+
import { useState, useRef, useCallback, useEffect, useMemo } from 'react';
|
|
2
2
|
import {
|
|
3
3
|
DatePickerViewMode,
|
|
4
4
|
DatePickerSelectionMode,
|
|
@@ -106,7 +106,7 @@ export function useDatePicker({
|
|
|
106
106
|
const datePickerRef = useRef<HTMLDivElement>(null);
|
|
107
107
|
const inputRef = useRef<HTMLInputElement>(null);
|
|
108
108
|
|
|
109
|
-
const today = new Date();
|
|
109
|
+
const today = useMemo(() => new Date(), []);
|
|
110
110
|
const currentMonth = viewDate.getMonth();
|
|
111
111
|
const currentYear = viewDate.getFullYear();
|
|
112
112
|
const daysInMonth = getDaysInMonth(currentYear, currentMonth);
|
|
@@ -8,19 +8,19 @@ import { EDGE_PANEL } from '../constants/components';
|
|
|
8
8
|
* @returns EdgePanel state and methods
|
|
9
9
|
*/
|
|
10
10
|
export function useEdgePanel(initialProps?: Partial<EdgePanelProps>) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
const [isOpen, setIsOpen] = useState(
|
|
11
|
+
const {
|
|
12
|
+
position = 'start',
|
|
13
|
+
mode = 'slide',
|
|
14
|
+
isOpen: propIsOpen = false,
|
|
15
|
+
backdrop = true,
|
|
16
|
+
closeOnBackdropClick = true,
|
|
17
|
+
closeOnEscape = true,
|
|
18
|
+
glass,
|
|
19
|
+
onOpenChange,
|
|
20
|
+
className = '',
|
|
21
|
+
} = initialProps || {};
|
|
22
|
+
|
|
23
|
+
const [isOpen, setIsOpen] = useState(propIsOpen || false);
|
|
24
24
|
const containerRef = useRef<HTMLDivElement>(null);
|
|
25
25
|
const backdropRef = useRef<HTMLDivElement>(null);
|
|
26
26
|
|
|
@@ -30,22 +30,21 @@ export function useEdgePanel(initialProps?: Partial<EdgePanelProps>) {
|
|
|
30
30
|
* @returns Class string
|
|
31
31
|
*/
|
|
32
32
|
const generateEdgePanelClass = (props: Partial<EdgePanelProps>): string => {
|
|
33
|
-
const { position =
|
|
33
|
+
const { position: propPosition = position, className: propClassName = className, isOpen: argIsOpen } = props;
|
|
34
34
|
|
|
35
35
|
const baseClass = EDGE_PANEL.CLASSES.BASE;
|
|
36
|
-
const positionClass =
|
|
37
|
-
const openClass = (
|
|
36
|
+
const positionClass = propPosition ? `${baseClass}--${propPosition}` : '';
|
|
37
|
+
const openClass = (argIsOpen ?? isOpen) ? EDGE_PANEL.CLASSES.IS_OPEN : '';
|
|
38
38
|
|
|
39
|
-
return `${baseClass} ${positionClass} ${openClass} ${
|
|
39
|
+
return `${baseClass} ${positionClass} ${openClass} ${propClassName}`.trim();
|
|
40
40
|
};
|
|
41
41
|
|
|
42
42
|
/**
|
|
43
43
|
* Adjust body padding in push mode
|
|
44
44
|
*/
|
|
45
45
|
const adjustBodyPadding = useCallback(() => {
|
|
46
|
-
if (!containerRef.current ||
|
|
46
|
+
if (!containerRef.current || mode !== 'push') return;
|
|
47
47
|
|
|
48
|
-
const { position } = defaultProps;
|
|
49
48
|
const size =
|
|
50
49
|
position === 'top' || position === 'bottom'
|
|
51
50
|
? containerRef.current.clientHeight
|
|
@@ -67,15 +66,13 @@ export function useEdgePanel(initialProps?: Partial<EdgePanelProps>) {
|
|
|
67
66
|
|
|
68
67
|
document.body.style[paddingProperty as any] = `${size}px`;
|
|
69
68
|
document.body.classList.add('is-pushed');
|
|
70
|
-
}, [
|
|
69
|
+
}, [mode, position]);
|
|
71
70
|
|
|
72
71
|
/**
|
|
73
72
|
* Reset body padding
|
|
74
73
|
*/
|
|
75
74
|
const resetBodyPadding = useCallback(() => {
|
|
76
|
-
if (
|
|
77
|
-
|
|
78
|
-
const { position } = defaultProps;
|
|
75
|
+
if (mode !== 'push') return;
|
|
79
76
|
|
|
80
77
|
// Map position to CSS padding property
|
|
81
78
|
let paddingProperty: string;
|
|
@@ -93,7 +90,7 @@ export function useEdgePanel(initialProps?: Partial<EdgePanelProps>) {
|
|
|
93
90
|
|
|
94
91
|
document.body.style[paddingProperty as any] = '';
|
|
95
92
|
document.body.classList.remove('is-pushed');
|
|
96
|
-
}, [
|
|
93
|
+
}, [mode, position]);
|
|
97
94
|
|
|
98
95
|
/**
|
|
99
96
|
* Open the panel
|
|
@@ -104,8 +101,6 @@ export function useEdgePanel(initialProps?: Partial<EdgePanelProps>) {
|
|
|
104
101
|
document.body.classList.add('is-edgepanel-open');
|
|
105
102
|
|
|
106
103
|
if (containerRef.current) {
|
|
107
|
-
const { mode } = defaultProps;
|
|
108
|
-
|
|
109
104
|
// Only add animation if not in 'none' mode
|
|
110
105
|
if (mode !== 'none') {
|
|
111
106
|
if (useFadeAnimation) {
|
|
@@ -148,16 +143,16 @@ export function useEdgePanel(initialProps?: Partial<EdgePanelProps>) {
|
|
|
148
143
|
}
|
|
149
144
|
|
|
150
145
|
// If push mode, adjust body padding
|
|
151
|
-
if (
|
|
146
|
+
if (mode === 'push') {
|
|
152
147
|
adjustBodyPadding();
|
|
153
148
|
}
|
|
154
149
|
}
|
|
155
150
|
|
|
156
|
-
if (
|
|
157
|
-
|
|
151
|
+
if (onOpenChange) {
|
|
152
|
+
onOpenChange(true);
|
|
158
153
|
}
|
|
159
154
|
},
|
|
160
|
-
[
|
|
155
|
+
[mode, adjustBodyPadding, onOpenChange]
|
|
161
156
|
);
|
|
162
157
|
|
|
163
158
|
/**
|
|
@@ -166,8 +161,6 @@ export function useEdgePanel(initialProps?: Partial<EdgePanelProps>) {
|
|
|
166
161
|
const closePanel = useCallback(
|
|
167
162
|
(useFadeAnimation = false) => {
|
|
168
163
|
if (containerRef.current) {
|
|
169
|
-
const { position, mode } = defaultProps;
|
|
170
|
-
|
|
171
164
|
// Only add animation if not in 'none' mode
|
|
172
165
|
if (mode !== 'none') {
|
|
173
166
|
if (useFadeAnimation) {
|
|
@@ -209,7 +202,7 @@ export function useEdgePanel(initialProps?: Partial<EdgePanelProps>) {
|
|
|
209
202
|
}
|
|
210
203
|
|
|
211
204
|
// Reset body padding if push mode
|
|
212
|
-
if (
|
|
205
|
+
if (mode === 'push') {
|
|
213
206
|
resetBodyPadding();
|
|
214
207
|
}
|
|
215
208
|
|
|
@@ -220,20 +213,20 @@ export function useEdgePanel(initialProps?: Partial<EdgePanelProps>) {
|
|
|
220
213
|
setIsOpen(false);
|
|
221
214
|
document.body.classList.remove('is-edgepanel-open');
|
|
222
215
|
|
|
223
|
-
if (
|
|
224
|
-
|
|
216
|
+
if (onOpenChange) {
|
|
217
|
+
onOpenChange(false);
|
|
225
218
|
}
|
|
226
219
|
}, hideDelay);
|
|
227
220
|
} else {
|
|
228
221
|
setIsOpen(false);
|
|
229
222
|
document.body.classList.remove('is-edgepanel-open');
|
|
230
223
|
|
|
231
|
-
if (
|
|
232
|
-
|
|
224
|
+
if (onOpenChange) {
|
|
225
|
+
onOpenChange(false);
|
|
233
226
|
}
|
|
234
227
|
}
|
|
235
228
|
},
|
|
236
|
-
[
|
|
229
|
+
[mode, position, onOpenChange, resetBodyPadding]
|
|
237
230
|
);
|
|
238
231
|
|
|
239
232
|
/**
|
|
@@ -241,11 +234,11 @@ export function useEdgePanel(initialProps?: Partial<EdgePanelProps>) {
|
|
|
241
234
|
*/
|
|
242
235
|
const handleEscapeKey = useCallback(
|
|
243
236
|
(event: KeyboardEvent) => {
|
|
244
|
-
if (
|
|
237
|
+
if (closeOnEscape && event.key === 'Escape' && isOpen) {
|
|
245
238
|
closePanel();
|
|
246
239
|
}
|
|
247
240
|
},
|
|
248
|
-
[closePanel,
|
|
241
|
+
[closePanel, closeOnEscape, isOpen]
|
|
249
242
|
);
|
|
250
243
|
|
|
251
244
|
/**
|
|
@@ -253,55 +246,53 @@ export function useEdgePanel(initialProps?: Partial<EdgePanelProps>) {
|
|
|
253
246
|
*/
|
|
254
247
|
const handleBackdropClick = useCallback(
|
|
255
248
|
(event: React.MouseEvent<HTMLDivElement>) => {
|
|
256
|
-
if (
|
|
249
|
+
if (closeOnBackdropClick && event.target === event.currentTarget) {
|
|
257
250
|
closePanel();
|
|
258
251
|
}
|
|
259
252
|
},
|
|
260
|
-
[closePanel,
|
|
253
|
+
[closePanel, closeOnBackdropClick]
|
|
261
254
|
);
|
|
262
255
|
|
|
263
256
|
/**
|
|
264
257
|
* Set up event listeners for keyboard events
|
|
265
258
|
*/
|
|
266
259
|
useEffect(() => {
|
|
267
|
-
if (isOpen &&
|
|
260
|
+
if (isOpen && closeOnEscape) {
|
|
268
261
|
document.addEventListener('keydown', handleEscapeKey);
|
|
269
262
|
}
|
|
270
263
|
|
|
271
264
|
return () => {
|
|
272
265
|
document.removeEventListener('keydown', handleEscapeKey);
|
|
273
266
|
};
|
|
274
|
-
}, [isOpen, handleEscapeKey,
|
|
267
|
+
}, [isOpen, handleEscapeKey, closeOnEscape]);
|
|
275
268
|
|
|
276
269
|
/**
|
|
277
270
|
* Set initial transform values
|
|
278
271
|
*/
|
|
279
272
|
useEffect(() => {
|
|
280
273
|
if (containerRef.current) {
|
|
281
|
-
const { position, mode } = defaultProps;
|
|
282
|
-
|
|
283
274
|
if (!isOpen && (mode === 'slide' || mode === 'push') && position) {
|
|
284
|
-
containerRef.current.style.transform = EDGE_PANEL.TRANSFORM_VALUES[position];
|
|
275
|
+
containerRef.current.style.transform = EDGE_PANEL.TRANSFORM_VALUES[position as keyof typeof EDGE_PANEL.TRANSFORM_VALUES];
|
|
285
276
|
// Set initial opacity for fade animations
|
|
286
|
-
if (
|
|
277
|
+
if (glass) {
|
|
287
278
|
containerRef.current.style.opacity = '0';
|
|
288
279
|
}
|
|
289
280
|
}
|
|
290
281
|
}
|
|
291
|
-
}, [
|
|
282
|
+
}, [mode, position, glass, isOpen]);
|
|
292
283
|
|
|
293
284
|
/**
|
|
294
285
|
* Sync with prop changes
|
|
295
286
|
*/
|
|
296
287
|
useEffect(() => {
|
|
297
|
-
if (
|
|
298
|
-
if (
|
|
299
|
-
openPanel(!!
|
|
288
|
+
if (propIsOpen !== undefined && propIsOpen !== isOpen) {
|
|
289
|
+
if (propIsOpen) {
|
|
290
|
+
openPanel(!!glass);
|
|
300
291
|
} else {
|
|
301
|
-
closePanel(!!
|
|
292
|
+
closePanel(!!glass);
|
|
302
293
|
}
|
|
303
294
|
}
|
|
304
|
-
}, [
|
|
295
|
+
}, [propIsOpen, closePanel, isOpen, openPanel, glass]);
|
|
305
296
|
|
|
306
297
|
return {
|
|
307
298
|
isOpen,
|
|
@@ -18,12 +18,12 @@ export interface UseHeroBackgroundSliderResult {
|
|
|
18
18
|
/**
|
|
19
19
|
* Array of refs for slide container elements
|
|
20
20
|
*/
|
|
21
|
-
slideRefs: React.RefObject<HTMLDivElement>[];
|
|
21
|
+
slideRefs: React.RefObject<HTMLDivElement | null>[];
|
|
22
22
|
|
|
23
23
|
/**
|
|
24
24
|
* Array of refs for video elements
|
|
25
25
|
*/
|
|
26
|
-
videoRefs: React.RefObject<HTMLVideoElement>[];
|
|
26
|
+
videoRefs: React.RefObject<HTMLVideoElement | null>[];
|
|
27
27
|
|
|
28
28
|
/**
|
|
29
29
|
* Handle slide transition to next index
|
|
@@ -55,18 +55,18 @@ export function useHeroBackgroundSlider(
|
|
|
55
55
|
const [isTransitioning, setIsTransitioning] = useState(false);
|
|
56
56
|
const autoplayRef = useRef<NodeJS.Timeout | null>(null);
|
|
57
57
|
const isPausedRef = useRef(false);
|
|
58
|
-
const callbackRef = useRef<() => void>();
|
|
58
|
+
const callbackRef = useRef<() => void | undefined>(undefined);
|
|
59
59
|
|
|
60
60
|
// Create refs for slide containers
|
|
61
61
|
const slideRefs = useMemo(
|
|
62
62
|
() => slides.map(() => React.createRef<HTMLDivElement>()),
|
|
63
|
-
[slides
|
|
63
|
+
[slides]
|
|
64
64
|
);
|
|
65
65
|
|
|
66
66
|
// Create refs for video elements
|
|
67
67
|
const videoRefs = useMemo(
|
|
68
68
|
() => slides.map(() => React.createRef<HTMLVideoElement>()),
|
|
69
|
-
[slides
|
|
69
|
+
[slides]
|
|
70
70
|
);
|
|
71
71
|
|
|
72
72
|
/**
|
|
@@ -305,7 +305,7 @@ export const usePhotoViewer = ({
|
|
|
305
305
|
};
|
|
306
306
|
});
|
|
307
307
|
},
|
|
308
|
-
[
|
|
308
|
+
[currentIndex, calculateBounds, constrainPosition]
|
|
309
309
|
);
|
|
310
310
|
|
|
311
311
|
const setImagePosition = useCallback(
|
|
@@ -366,7 +366,7 @@ export const usePhotoViewer = ({
|
|
|
366
366
|
};
|
|
367
367
|
});
|
|
368
368
|
},
|
|
369
|
-
[
|
|
369
|
+
[currentIndex, calculateBounds, constrainPosition]
|
|
370
370
|
);
|
|
371
371
|
|
|
372
372
|
// Handle mouse wheel for zooming with proper bounds
|
|
@@ -866,7 +866,6 @@ export const usePhotoViewer = ({
|
|
|
866
866
|
});
|
|
867
867
|
},
|
|
868
868
|
[
|
|
869
|
-
isMounted,
|
|
870
869
|
enableGestures,
|
|
871
870
|
isDragging,
|
|
872
871
|
startDragPosition,
|
|
@@ -294,7 +294,7 @@ export function usePieChart(data: ChartDataPoint[], options: PieChartOptions = {
|
|
|
294
294
|
|
|
295
295
|
return parts.join(' - ');
|
|
296
296
|
},
|
|
297
|
-
[options
|
|
297
|
+
[options]
|
|
298
298
|
);
|
|
299
299
|
|
|
300
300
|
// Get slice transform for hover effect
|