@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.
Files changed (168) hide show
  1. package/atomix.config.ts +12 -0
  2. package/build-tools/webpack-loader.js +5 -4
  3. package/dist/atomix.css +230 -83
  4. package/dist/atomix.css.map +1 -1
  5. package/dist/atomix.min.css +1 -1
  6. package/dist/atomix.min.css.map +1 -1
  7. package/dist/build-tools/webpack-loader.js +5 -4
  8. package/dist/charts.d.ts +24 -23
  9. package/dist/charts.js +271 -369
  10. package/dist/charts.js.map +1 -1
  11. package/dist/config.d.ts +624 -0
  12. package/dist/config.js +59 -0
  13. package/dist/config.js.map +1 -0
  14. package/dist/core.d.ts +3 -2
  15. package/dist/core.js +342 -382
  16. package/dist/core.js.map +1 -1
  17. package/dist/forms.d.ts +4 -6
  18. package/dist/forms.js +233 -334
  19. package/dist/forms.js.map +1 -1
  20. package/dist/heavy.d.ts +11 -2
  21. package/dist/heavy.js +406 -445
  22. package/dist/heavy.js.map +1 -1
  23. package/dist/index.d.ts +109 -65
  24. package/dist/index.esm.js +654 -748
  25. package/dist/index.esm.js.map +1 -1
  26. package/dist/index.js +621 -717
  27. package/dist/index.js.map +1 -1
  28. package/dist/index.min.js +1 -1
  29. package/dist/index.min.js.map +1 -1
  30. package/dist/layout.js +59 -60
  31. package/dist/layout.js.map +1 -1
  32. package/dist/theme.js +4 -4
  33. package/dist/theme.js.map +1 -1
  34. package/package.json +24 -9
  35. package/scripts/atomix-cli.js +15 -1
  36. package/scripts/cli/__tests__/complexity-utils.test.js +24 -0
  37. package/scripts/cli/__tests__/detector.test.js +50 -0
  38. package/scripts/cli/__tests__/template-engine.test.js +23 -0
  39. package/scripts/cli/__tests__/test-setup.js +1 -133
  40. package/scripts/cli/commands/doctor.js +15 -3
  41. package/scripts/cli/commands/generate.js +113 -51
  42. package/scripts/cli/internal/ai-engine.js +30 -10
  43. package/scripts/cli/internal/complexity-utils.js +60 -0
  44. package/scripts/cli/internal/component-validator.js +49 -16
  45. package/scripts/cli/internal/generator.js +89 -36
  46. package/scripts/cli/internal/hook-generator.js +5 -2
  47. package/scripts/cli/internal/itcss-generator.js +16 -12
  48. package/scripts/cli/templates/next-templates.js +81 -30
  49. package/scripts/cli/templates/storybook-templates.js +12 -2
  50. package/scripts/cli/utils/detector.js +45 -7
  51. package/scripts/cli/utils/diagnostics.js +78 -0
  52. package/scripts/cli/utils/telemetry.js +13 -0
  53. package/src/components/Accordion/Accordion.stories.tsx +4 -0
  54. package/src/components/AtomixGlass/AtomixGlass.tsx +188 -128
  55. package/src/components/AtomixGlass/AtomixGlassContainer.tsx +63 -91
  56. package/src/components/AtomixGlass/PerformanceDashboard.tsx +153 -201
  57. package/src/components/AtomixGlass/__snapshots__/AtomixGlass.test.tsx.snap +9 -6
  58. package/src/components/AtomixGlass/glass-utils.ts +51 -1
  59. package/src/components/AtomixGlass/stories/AnimationFeatures.stories.tsx +52 -46
  60. package/src/components/AtomixGlass/stories/Examples.stories.tsx +573 -236
  61. package/src/components/AtomixGlass/stories/Playground.stories.tsx +88 -41
  62. package/src/components/AtomixGlass/stories/argTypes.ts +19 -19
  63. package/src/components/AtomixGlass/stories/shared-components.tsx +7 -12
  64. package/src/components/AtomixGlass/stories/types.ts +3 -3
  65. package/src/components/Button/Button.tsx +114 -57
  66. package/src/components/Callout/Callout.tsx +4 -4
  67. package/src/components/Chart/ChartRenderer.tsx +1 -1
  68. package/src/components/Chart/DonutChart.tsx +11 -8
  69. package/src/components/EdgePanel/EdgePanel.tsx +119 -115
  70. package/src/components/Form/Select.tsx +4 -4
  71. package/src/components/List/List.tsx +4 -4
  72. package/src/components/Navigation/SideMenu/SideMenu.tsx +6 -6
  73. package/src/components/PhotoViewer/PhotoViewerImage.tsx +1 -1
  74. package/src/components/ProductReview/ProductReview.tsx +4 -2
  75. package/src/components/Rating/Rating.tsx +4 -2
  76. package/src/components/SectionIntro/SectionIntro.tsx +4 -2
  77. package/src/components/Steps/Steps.tsx +1 -1
  78. package/src/components/Tabs/Tabs.tsx +5 -5
  79. package/src/components/Testimonial/Testimonial.tsx +4 -2
  80. package/src/components/VideoPlayer/VideoPlayer.tsx +4 -2
  81. package/src/layouts/CssGrid/CssGrid.stories.tsx +464 -0
  82. package/src/layouts/CssGrid/CssGrid.tsx +215 -0
  83. package/src/layouts/CssGrid/index.ts +8 -0
  84. package/src/layouts/CssGrid/scripts/CssGrid.js +284 -0
  85. package/src/layouts/CssGrid/scripts/index.js +43 -0
  86. package/src/layouts/Grid/scripts/Container.js +139 -0
  87. package/src/layouts/Grid/scripts/Grid.js +184 -0
  88. package/src/layouts/Grid/scripts/GridCol.js +273 -0
  89. package/src/layouts/Grid/scripts/Row.js +154 -0
  90. package/src/layouts/Grid/scripts/index.js +48 -0
  91. package/src/layouts/MasonryGrid/MasonryGrid.tsx +71 -59
  92. package/src/lib/composables/atomix-glass/useGlassSize.ts +1 -1
  93. package/src/lib/composables/useAccordion.ts +5 -5
  94. package/src/lib/composables/useAtomixGlass.ts +111 -74
  95. package/src/lib/composables/useAtomixGlassStyles.ts +0 -2
  96. package/src/lib/composables/useBarChart.ts +2 -2
  97. package/src/lib/composables/useChart.ts +3 -2
  98. package/src/lib/composables/useChartToolbar.ts +48 -66
  99. package/src/lib/composables/useDataTable.ts +1 -1
  100. package/src/lib/composables/useDatePicker.ts +2 -2
  101. package/src/lib/composables/useEdgePanel.ts +45 -54
  102. package/src/lib/composables/useHeroBackgroundSlider.ts +5 -5
  103. package/src/lib/composables/usePhotoViewer.ts +2 -3
  104. package/src/lib/composables/usePieChart.ts +1 -1
  105. package/src/lib/composables/usePopover.ts +151 -139
  106. package/src/lib/composables/useSideMenu.ts +28 -41
  107. package/src/lib/composables/useSlider.ts +2 -6
  108. package/src/lib/composables/useTooltip.ts +2 -2
  109. package/src/lib/config/index.ts +39 -0
  110. package/src/lib/constants/components.ts +1 -0
  111. package/src/lib/theme/devtools/Comparator.tsx +1 -1
  112. package/src/lib/theme/devtools/Inspector.tsx +1 -1
  113. package/src/lib/theme/devtools/LiveEditor.tsx +1 -1
  114. package/src/lib/theme/runtime/ThemeProvider.tsx +1 -1
  115. package/src/lib/types/components.ts +1 -0
  116. package/src/styles/01-settings/_index.scss +1 -0
  117. package/src/styles/01-settings/_settings.atomix-glass.scss +174 -0
  118. package/src/styles/01-settings/_settings.masonry-grid.scss +42 -6
  119. package/src/styles/02-tools/_tools.glass.scss +6 -0
  120. package/src/styles/05-objects/_objects.masonry-grid.scss +162 -24
  121. package/src/styles/06-components/_components.atomix-glass.scss +160 -99
  122. package/scripts/cli/__tests__/README.md +0 -81
  123. package/scripts/cli/__tests__/basic.test.js +0 -116
  124. package/scripts/cli/__tests__/clean.test.js +0 -278
  125. package/scripts/cli/__tests__/component-generator.test.js +0 -332
  126. package/scripts/cli/__tests__/component-validator.test.js +0 -433
  127. package/scripts/cli/__tests__/generator.test.js +0 -613
  128. package/scripts/cli/__tests__/glass-motion.test.js +0 -256
  129. package/scripts/cli/__tests__/integration.test.js +0 -938
  130. package/scripts/cli/__tests__/migrate.test.js +0 -74
  131. package/scripts/cli/__tests__/security.test.js +0 -206
  132. package/scripts/cli/__tests__/theme-bridge.test.js +0 -507
  133. package/scripts/cli/__tests__/token-manager.test.js +0 -251
  134. package/scripts/cli/__tests__/token-provider.test.js +0 -361
  135. package/scripts/cli/__tests__/utils.test.js +0 -165
  136. package/src/components/AtomixGlass/stories/AnimationTests.stories.tsx +0 -95
  137. package/src/components/AtomixGlass/stories/CardExamples.stories.tsx +0 -212
  138. package/src/components/AtomixGlass/stories/Customization.stories.tsx +0 -131
  139. package/src/components/AtomixGlass/stories/DashboardExamples.stories.tsx +0 -348
  140. package/src/components/AtomixGlass/stories/EcommerceExamples.stories.tsx +0 -410
  141. package/src/components/AtomixGlass/stories/FormExamples.stories.tsx +0 -436
  142. package/src/components/AtomixGlass/stories/HeroExamples.stories.tsx +0 -264
  143. package/src/components/AtomixGlass/stories/InteractivePlayground.stories.tsx +0 -247
  144. package/src/components/AtomixGlass/stories/MobileUIExamples.stories.tsx +0 -418
  145. package/src/components/AtomixGlass/stories/ModalExamples.stories.tsx +0 -402
  146. package/src/components/AtomixGlass/stories/Modes.stories.tsx +0 -1082
  147. package/src/components/AtomixGlass/stories/Overview.stories.tsx +0 -497
  148. package/src/components/AtomixGlass/stories/Performance.stories.tsx +0 -103
  149. package/src/components/AtomixGlass/stories/PresetGallery.stories.tsx +0 -335
  150. package/src/components/AtomixGlass/stories/Shaders.stories.tsx +0 -395
  151. package/src/components/AtomixGlass/stories/WidgetExamples.stories.tsx +0 -441
  152. package/src/components/TypedButton/TypedButton.stories.tsx +0 -59
  153. package/src/components/TypedButton/TypedButton.tsx +0 -39
  154. package/src/components/TypedButton/index.ts +0 -2
  155. package/src/lib/composables/useBreadcrumb.ts +0 -81
  156. package/src/lib/composables/useChartInteractions.ts +0 -123
  157. package/src/lib/composables/useChartPerformance.ts +0 -347
  158. package/src/lib/composables/useDropdown.ts +0 -338
  159. package/src/lib/composables/useModal.ts +0 -110
  160. package/src/lib/composables/useTypedButton.ts +0 -66
  161. package/src/lib/hooks/usePerformanceMonitor.ts +0 -148
  162. package/src/lib/utils/displacement-generator.ts +0 -92
  163. package/src/lib/utils/memoryMonitor.ts +0 -191
  164. package/src/styles/01-settings/_settings.testtypecheck.scss +0 -53
  165. package/src/styles/01-settings/_settings.typedbutton.scss +0 -53
  166. package/src/styles/06-components/_components.testbutton.scss +0 -212
  167. package/src/styles/06-components/_components.testtypecheck.scss +0 -212
  168. 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
- onRefresh: useCallback(() => {
153
- setState(prev => ({ ...prev, isRefreshing: true }));
154
- handlers.onRefresh?.();
155
- setTimeout(() => {
156
- setState(prev => ({ ...prev, isRefreshing: false }));
157
- }, 1000);
158
- }, [handlers.onRefresh]),
159
-
160
- onExport: useCallback(
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
- onFullscreen: useCallback(
173
- (isFullscreen: boolean) => {
170
+ onFullscreen: (isFullscreen: boolean) => {
174
171
  setState(prev => ({ ...prev, isFullscreen }));
175
172
  handlers.onFullscreen?.(isFullscreen);
176
173
  },
177
- [handlers.onFullscreen]
178
- ),
179
-
180
- onZoomIn: useCallback(() => {
181
- setState(prev => ({ ...prev, zoomLevel: Math.min(prev.zoomLevel * 1.2, 5) }));
182
- handlers.onZoomIn?.();
183
- }, [handlers.onZoomIn]),
184
-
185
- onZoomOut: useCallback(() => {
186
- setState(prev => ({ ...prev, zoomLevel: Math.max(prev.zoomLevel / 1.2, 0.2) }));
187
- handlers.onZoomOut?.();
188
- }, [handlers.onZoomOut]),
189
-
190
- onZoomReset: useCallback(() => {
191
- setState(prev => ({ ...prev, zoomLevel: 1 }));
192
- handlers.onZoomReset?.();
193
- }, [handlers.onZoomReset]),
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
- [handlers.onPanToggle]
201
- ),
202
-
203
- onReset: useCallback(() => {
204
- setState(prev => ({
205
- ...prev,
206
- zoomLevel: 1,
207
- panEnabled: false,
208
- }));
209
- handlers.onReset?.();
210
- }, [handlers.onReset]),
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
- onLegendToggle: useCallback(
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
- onTooltipsToggle: useCallback(
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
- onAnimationsToggle: useCallback(
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
- onSettings: useCallback(() => {}, []),
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
- }, [chartType, finalDefaults, state, enhancedHandlers, customActions, customGroups]);
426
+ }, [finalDefaults, state, enhancedHandlers, customActions, customGroups]);
445
427
 
446
428
  // Keyboard shortcuts
447
429
  useEffect(() => {
@@ -255,7 +255,7 @@ export function useDataTable({
255
255
  ) {
256
256
  setColumnOrder(newOrder);
257
257
  }
258
- }, [columns]);
258
+ }, [columns, columnOrder]);
259
259
 
260
260
  // Update column visibility when columns prop changes
261
261
  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
- // Default EdgePanel properties
12
- const defaultProps: Partial<EdgePanelProps> = {
13
- position: 'start',
14
- mode: 'slide',
15
- isOpen: false,
16
- backdrop: true,
17
- closeOnBackdropClick: true,
18
- closeOnEscape: true,
19
- glass: undefined,
20
- ...initialProps,
21
- };
22
-
23
- const [isOpen, setIsOpen] = useState(defaultProps.isOpen || false);
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 = defaultProps.position, className = '', isOpen: propIsOpen } = props;
33
+ const { position: propPosition = position, className: propClassName = className, isOpen: argIsOpen } = props;
34
34
 
35
35
  const baseClass = EDGE_PANEL.CLASSES.BASE;
36
- const positionClass = position ? `${baseClass}--${position}` : '';
37
- const openClass = (propIsOpen ?? isOpen) ? EDGE_PANEL.CLASSES.IS_OPEN : '';
36
+ const positionClass = propPosition ? `${baseClass}--${propPosition}` : '';
37
+ const openClass = (argIsOpen ?? isOpen) ? EDGE_PANEL.CLASSES.IS_OPEN : '';
38
38
 
39
- return `${baseClass} ${positionClass} ${openClass} ${className}`.trim();
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 || defaultProps.mode !== 'push') return;
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
- }, [defaultProps.mode, defaultProps.position]);
69
+ }, [mode, position]);
71
70
 
72
71
  /**
73
72
  * Reset body padding
74
73
  */
75
74
  const resetBodyPadding = useCallback(() => {
76
- if (defaultProps.mode !== 'push') return;
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
- }, [defaultProps.mode, defaultProps.position]);
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 (defaultProps.mode === 'push') {
146
+ if (mode === 'push') {
152
147
  adjustBodyPadding();
153
148
  }
154
149
  }
155
150
 
156
- if (defaultProps.onOpenChange) {
157
- defaultProps.onOpenChange(true);
151
+ if (onOpenChange) {
152
+ onOpenChange(true);
158
153
  }
159
154
  },
160
- [defaultProps, adjustBodyPadding]
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 (defaultProps.mode === 'push') {
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 (defaultProps.onOpenChange) {
224
- defaultProps.onOpenChange(false);
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 (defaultProps.onOpenChange) {
232
- defaultProps.onOpenChange(false);
224
+ if (onOpenChange) {
225
+ onOpenChange(false);
233
226
  }
234
227
  }
235
228
  },
236
- [defaultProps, resetBodyPadding]
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 (defaultProps.closeOnEscape && event.key === 'Escape' && isOpen) {
237
+ if (closeOnEscape && event.key === 'Escape' && isOpen) {
245
238
  closePanel();
246
239
  }
247
240
  },
248
- [closePanel, defaultProps.closeOnEscape, isOpen]
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 (defaultProps.closeOnBackdropClick && event.target === event.currentTarget) {
249
+ if (closeOnBackdropClick && event.target === event.currentTarget) {
257
250
  closePanel();
258
251
  }
259
252
  },
260
- [closePanel, defaultProps.closeOnBackdropClick]
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 && defaultProps.closeOnEscape) {
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, defaultProps.closeOnEscape]);
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 (defaultProps.glass) {
277
+ if (glass) {
287
278
  containerRef.current.style.opacity = '0';
288
279
  }
289
280
  }
290
281
  }
291
- }, [defaultProps.mode, defaultProps.position, defaultProps.glass, isOpen]);
282
+ }, [mode, position, glass, isOpen]);
292
283
 
293
284
  /**
294
285
  * Sync with prop changes
295
286
  */
296
287
  useEffect(() => {
297
- if (defaultProps.isOpen !== undefined && defaultProps.isOpen !== isOpen) {
298
- if (defaultProps.isOpen) {
299
- openPanel(!!defaultProps.glass);
288
+ if (propIsOpen !== undefined && propIsOpen !== isOpen) {
289
+ if (propIsOpen) {
290
+ openPanel(!!glass);
300
291
  } else {
301
- closePanel(!!defaultProps.glass);
292
+ closePanel(!!glass);
302
293
  }
303
294
  }
304
- }, [defaultProps.isOpen, closePanel, isOpen, openPanel, defaultProps.glass]);
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.length]
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.length]
69
+ [slides]
70
70
  );
71
71
 
72
72
  /**
@@ -305,7 +305,7 @@ export const usePhotoViewer = ({
305
305
  };
306
306
  });
307
307
  },
308
- [isMounted, currentIndex, calculateBounds, constrainPosition]
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
- [isMounted, currentIndex, calculateBounds, constrainPosition]
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.labelFormatter, options.showLabels, options.showPercentages, options.showValues]
297
+ [options]
298
298
  );
299
299
 
300
300
  // Get slice transform for hover effect