@shohojdhara/atomix 0.3.15 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (245) hide show
  1. package/build-tools/index.d.ts +31 -30
  2. package/build-tools/package.json +4 -21
  3. package/dist/atomix.css +20924 -2611
  4. package/dist/atomix.css.map +1 -1
  5. package/dist/atomix.min.css +76 -2
  6. package/dist/atomix.min.css.map +1 -1
  7. package/dist/build-tools/index.d.ts +31 -30
  8. package/dist/build-tools/package.json +4 -21
  9. package/dist/charts.js.map +1 -1
  10. package/dist/core.js.map +1 -1
  11. package/dist/forms.js.map +1 -1
  12. package/dist/heavy.js.map +1 -1
  13. package/dist/index.d.ts +144 -18
  14. package/dist/index.esm.js +110 -55
  15. package/dist/index.esm.js.map +1 -1
  16. package/dist/index.js +110 -55
  17. package/dist/index.js.map +1 -1
  18. package/dist/index.min.js +1 -1
  19. package/dist/index.min.js.map +1 -1
  20. package/dist/layout.js.map +1 -1
  21. package/dist/theme.d.ts +9 -9
  22. package/dist/theme.js.map +1 -1
  23. package/package.json +1 -1
  24. package/src/components/Accordion/Accordion.stories.tsx +32 -23
  25. package/src/components/Accordion/Accordion.test.tsx +70 -50
  26. package/src/components/Accordion/Accordion.tsx +99 -94
  27. package/src/components/AtomixGlass/AtomixGlass.test.tsx +1 -1
  28. package/src/components/AtomixGlass/GlassFilter.tsx +9 -16
  29. package/src/components/AtomixGlass/glass-utils.ts +4 -3
  30. package/src/components/AtomixGlass/shader-utils.ts +128 -52
  31. package/src/components/AtomixGlass/stories/Playground.stories.tsx +1 -1
  32. package/src/components/AtomixGlass/stories/Shaders.stories.tsx +1 -1
  33. package/src/components/Avatar/Avatar.stories.tsx +45 -62
  34. package/src/components/Avatar/Avatar.tsx +58 -56
  35. package/src/components/Badge/Badge.stories.tsx +20 -9
  36. package/src/components/Badge/Badge.test.tsx +41 -41
  37. package/src/components/Badge/Badge.tsx +64 -62
  38. package/src/components/Block/Block.stories.tsx +14 -4
  39. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +9 -8
  40. package/src/components/Breadcrumb/Breadcrumb.tsx +62 -60
  41. package/src/components/Button/Button.stories.tsx +13 -22
  42. package/src/components/Button/Button.test.tsx +97 -81
  43. package/src/components/Button/Button.tsx +46 -14
  44. package/src/components/Button/ButtonGroup.stories.tsx +37 -32
  45. package/src/components/Button/ButtonGroup.tsx +4 -15
  46. package/src/components/Callout/Callout.stories.tsx +109 -16
  47. package/src/components/Card/Card.stories.tsx +67 -36
  48. package/src/components/Card/Card.tsx +30 -14
  49. package/src/components/Chart/AreaChart.tsx +1 -1
  50. package/src/components/Chart/CandlestickChart.tsx +23 -16
  51. package/src/components/Chart/Chart.stories.tsx +4 -9
  52. package/src/components/Chart/Chart.tsx +40 -44
  53. package/src/components/Chart/ChartRenderer.tsx +39 -12
  54. package/src/components/Chart/ChartToolbar.tsx +21 -5
  55. package/src/components/Chart/DonutChart.tsx +1 -1
  56. package/src/components/Chart/FunnelChart.tsx +4 -1
  57. package/src/components/Chart/GaugeChart.tsx +3 -1
  58. package/src/components/Chart/HeatmapChart.tsx +50 -37
  59. package/src/components/Chart/LineChart.tsx +3 -2
  60. package/src/components/Chart/MultiAxisChart.tsx +24 -16
  61. package/src/components/Chart/RadarChart.tsx +19 -17
  62. package/src/components/Chart/ScatterChart.tsx +29 -21
  63. package/src/components/ColorModeToggle/ColorModeToggle.stories.tsx +6 -2
  64. package/src/components/ColorModeToggle/ColorModeToggle.tsx +15 -3
  65. package/src/components/Countdown/Countdown.stories.tsx +7 -7
  66. package/src/components/DataTable/DataTable.stories.tsx +43 -38
  67. package/src/components/DataTable/DataTable.test.tsx +26 -148
  68. package/src/components/DataTable/DataTable.tsx +485 -456
  69. package/src/components/DatePicker/DatePicker.stories.tsx +32 -47
  70. package/src/components/DatePicker/DatePicker.tsx +31 -26
  71. package/src/components/Dropdown/Dropdown.stories.tsx +2 -5
  72. package/src/components/Dropdown/Dropdown.tsx +313 -299
  73. package/src/components/EdgePanel/EdgePanel.stories.tsx +6 -19
  74. package/src/components/EdgePanel/EdgePanel.tsx +1 -3
  75. package/src/components/Footer/Footer.stories.tsx +21 -16
  76. package/src/components/Footer/Footer.tsx +130 -128
  77. package/src/components/Footer/FooterLink.tsx +2 -2
  78. package/src/components/Form/Checkbox.test.tsx +49 -49
  79. package/src/components/Form/Checkbox.tsx +108 -100
  80. package/src/components/Form/Form.stories.tsx +2 -10
  81. package/src/components/Form/Input.stories.tsx +22 -39
  82. package/src/components/Form/Input.test.tsx +38 -44
  83. package/src/components/Form/Radio.stories.tsx +6 -12
  84. package/src/components/Form/Radio.tsx +68 -66
  85. package/src/components/Form/Select.tsx +184 -182
  86. package/src/components/Form/Textarea.test.tsx +27 -32
  87. package/src/components/Hero/Hero.stories.tsx +56 -23
  88. package/src/components/Hero/Hero.tsx +201 -55
  89. package/src/components/Icon/index.ts +7 -1
  90. package/src/components/List/List.tsx +19 -23
  91. package/src/components/Modal/Modal.stories.tsx +2 -1
  92. package/src/components/Modal/Modal.tsx +130 -127
  93. package/src/components/Navigation/Menu/MegaMenu.tsx +70 -70
  94. package/src/components/Navigation/Nav/NavDropdown.tsx +1 -5
  95. package/src/components/Navigation/SideMenu/SideMenu.stories.tsx +128 -28
  96. package/src/components/Navigation/SideMenu/SideMenu.tsx +5 -7
  97. package/src/components/Navigation/SideMenu/SideMenuItem.tsx +4 -5
  98. package/src/components/Pagination/Pagination.stories.tsx +7 -4
  99. package/src/components/Pagination/Pagination.tsx +199 -202
  100. package/src/components/PhotoViewer/PhotoViewer.tsx +4 -1
  101. package/src/components/Popover/Popover.stories.tsx +99 -192
  102. package/src/components/Popover/Popover.tsx +41 -37
  103. package/src/components/Progress/Progress.stories.tsx +35 -44
  104. package/src/components/River/River.stories.tsx +2 -1
  105. package/src/components/SectionIntro/SectionIntro.stories.tsx +71 -71
  106. package/src/components/Slider/Slider.stories.tsx +12 -4
  107. package/src/components/Spinner/Spinner.stories.tsx +3 -1
  108. package/src/components/Spinner/Spinner.test.tsx +23 -23
  109. package/src/components/Spinner/Spinner.tsx +43 -46
  110. package/src/components/Steps/Steps.stories.tsx +8 -6
  111. package/src/components/Tabs/Tabs.stories.tsx +12 -9
  112. package/src/components/Tabs/Tabs.tsx +74 -72
  113. package/src/components/Toggle/Toggle.stories.tsx +27 -13
  114. package/src/components/Toggle/Toggle.test.tsx +65 -70
  115. package/src/components/Toggle/Toggle.tsx +4 -1
  116. package/src/components/Tooltip/Tooltip.stories.tsx +24 -20
  117. package/src/components/Tooltip/Tooltip.tsx +104 -106
  118. package/src/components/Upload/Upload.stories.tsx +129 -127
  119. package/src/components/Upload/Upload.tsx +287 -283
  120. package/src/components/VideoPlayer/VideoPlayer.tsx +6 -1
  121. package/src/components/index.ts +13 -2
  122. package/src/layouts/Grid/Grid.stories.tsx +9 -3
  123. package/src/layouts/MasonryGrid/MasonryGrid.tsx +5 -1
  124. package/src/lib/__tests__/theme-tools.test.ts +32 -6
  125. package/src/lib/composables/shared-mouse-tracker.ts +13 -14
  126. package/src/lib/composables/useAtomixGlass.ts +106 -49
  127. package/src/lib/composables/useChartExport.ts +1 -1
  128. package/src/lib/composables/useDataTable.ts +29 -17
  129. package/src/lib/composables/useHero.ts +58 -14
  130. package/src/lib/composables/useHeroBackgroundSlider.ts +2 -9
  131. package/src/lib/composables/useInput.ts +10 -8
  132. package/src/lib/composables/useSideMenu.ts +6 -5
  133. package/src/lib/composables/useTooltip.ts +1 -2
  134. package/src/lib/composables/useVideoPlayer.ts +44 -35
  135. package/src/lib/config/index.ts +154 -154
  136. package/src/lib/constants/cssVariables.ts +29 -29
  137. package/src/lib/hooks/__tests__/useComponentCustomization.test.ts +2 -6
  138. package/src/lib/hooks/index.ts +1 -1
  139. package/src/lib/hooks/useComponentCustomization.ts +11 -17
  140. package/src/lib/hooks/usePerformanceMonitor.ts +6 -7
  141. package/src/lib/patterns/__tests__/slots.test.ts +1 -1
  142. package/src/lib/patterns/index.ts +1 -1
  143. package/src/lib/patterns/slots.tsx +8 -13
  144. package/src/lib/storybook/InteractiveDemo.tsx +13 -18
  145. package/src/lib/storybook/PreviewContainer.tsx +1 -1
  146. package/src/lib/storybook/VariantsGrid.tsx +3 -7
  147. package/src/lib/storybook/index.ts +1 -1
  148. package/src/lib/theme/adapters/cssVariableMapper.ts +47 -74
  149. package/src/lib/theme/adapters/index.ts +3 -9
  150. package/src/lib/theme/adapters/themeAdapter.ts +41 -26
  151. package/src/lib/theme/config/index.ts +1 -1
  152. package/src/lib/theme/config/types.ts +2 -2
  153. package/src/lib/theme/config/validator.ts +10 -5
  154. package/src/lib/theme/constants/constants.ts +2 -2
  155. package/src/lib/theme/constants/index.ts +1 -2
  156. package/src/lib/theme/core/__tests__/createTheme.test.ts +20 -22
  157. package/src/lib/theme/core/composeTheme.ts +32 -26
  158. package/src/lib/theme/core/createTheme.ts +1 -1
  159. package/src/lib/theme/core/createThemeObject.ts +308 -301
  160. package/src/lib/theme/core/index.ts +3 -3
  161. package/src/lib/theme/devtools/CLI.ts +106 -104
  162. package/src/lib/theme/devtools/Comparator.tsx +50 -32
  163. package/src/lib/theme/devtools/DesignTokensCustomizer.stories.tsx +50 -48
  164. package/src/lib/theme/devtools/DesignTokensCustomizer.tsx +257 -63
  165. package/src/lib/theme/devtools/Inspector.tsx +75 -60
  166. package/src/lib/theme/devtools/LiveEditor.tsx +97 -76
  167. package/src/lib/theme/devtools/Preview.tsx +150 -106
  168. package/src/lib/theme/devtools/ThemeValidator.ts +29 -21
  169. package/src/lib/theme/devtools/index.ts +3 -9
  170. package/src/lib/theme/devtools/useHistory.ts +23 -21
  171. package/src/lib/theme/errors/errors.ts +12 -11
  172. package/src/lib/theme/errors/index.ts +2 -7
  173. package/src/lib/theme/generators/generateCSS.ts +9 -13
  174. package/src/lib/theme/generators/generateCSSNested.ts +1 -6
  175. package/src/lib/theme/generators/generateCSSVariables.ts +673 -630
  176. package/src/lib/theme/generators/index.ts +1 -4
  177. package/src/lib/theme/i18n/index.ts +1 -1
  178. package/src/lib/theme/i18n/rtl.ts +13 -13
  179. package/src/lib/theme/index.ts +7 -16
  180. package/src/lib/theme/runtime/ThemeApplicator.ts +4 -4
  181. package/src/lib/theme/runtime/ThemeContext.tsx +1 -1
  182. package/src/lib/theme/runtime/ThemeErrorBoundary.tsx +19 -23
  183. package/src/lib/theme/runtime/ThemeProvider.tsx +230 -239
  184. package/src/lib/theme/runtime/__tests__/ThemeProvider.integration.test.tsx +1 -1
  185. package/src/lib/theme/runtime/__tests__/ThemeProvider.test.tsx +24 -29
  186. package/src/lib/theme/runtime/index.ts +2 -5
  187. package/src/lib/theme/runtime/useTheme.ts +18 -18
  188. package/src/lib/theme/runtime/useThemeTokens.ts +22 -22
  189. package/src/lib/theme/test/testTheme.ts +15 -16
  190. package/src/lib/theme/tokens/index.ts +2 -7
  191. package/src/lib/theme/tokens/tokens.ts +25 -24
  192. package/src/lib/theme/types.ts +428 -411
  193. package/src/lib/theme/utils/__tests__/themeValidation.test.ts +3 -3
  194. package/src/lib/theme/utils/componentTheming.ts +18 -18
  195. package/src/lib/theme/utils/domUtils.ts +277 -289
  196. package/src/lib/theme/utils/index.ts +1 -2
  197. package/src/lib/theme/utils/injectCSS.ts +10 -14
  198. package/src/lib/theme/utils/naming.ts +20 -16
  199. package/src/lib/theme/utils/themeHelpers.ts +10 -12
  200. package/src/lib/theme/utils/themeUtils.ts +85 -86
  201. package/src/lib/theme/utils/themeValidation.ts +82 -33
  202. package/src/lib/theme-tools.ts +8 -6
  203. package/src/lib/types/components.ts +172 -71
  204. package/src/lib/types/partProps.ts +1 -1
  205. package/src/lib/utils/__tests__/csv.test.ts +1 -1
  206. package/src/lib/utils/componentUtils.ts +8 -12
  207. package/src/lib/utils/csv.ts +3 -1
  208. package/src/lib/utils/dataTableExport.ts +1 -5
  209. package/src/lib/utils/fontPreloader.ts +10 -19
  210. package/src/lib/utils/icons.ts +4 -1
  211. package/src/lib/utils/index.ts +2 -6
  212. package/src/lib/utils/memoryMonitor.ts +10 -8
  213. package/src/lib/utils/themeNaming.ts +2 -2
  214. package/src/styles/01-settings/_index.scss +0 -1
  215. package/src/styles/01-settings/_settings.colors.scss +8 -8
  216. package/src/styles/01-settings/_settings.design-tokens.scss +61 -50
  217. package/src/styles/01-settings/_settings.navbar.scss +1 -1
  218. package/src/styles/01-settings/_settings.spacing.scss +3 -4
  219. package/src/styles/01-settings/_settings.tooltip.scss +1 -1
  220. package/src/styles/01-settings/_settings.typography.scss +1 -1
  221. package/src/styles/02-tools/_tools.button.scss +51 -21
  222. package/src/styles/02-tools/_tools.utility-api.scss +30 -18
  223. package/src/styles/03-generic/_generic.root.scss +4 -3
  224. package/src/styles/06-components/_components.atomix-glass.scss +13 -9
  225. package/src/styles/06-components/_components.button.scss +16 -4
  226. package/src/styles/06-components/_components.callout.scss +27 -21
  227. package/src/styles/06-components/_components.card.scss +5 -14
  228. package/src/styles/06-components/_components.chart.scss +22 -19
  229. package/src/styles/06-components/_components.checkbox.scss +3 -1
  230. package/src/styles/06-components/_components.color-mode-toggle.scss +3 -1
  231. package/src/styles/06-components/_components.edge-panel.scss +9 -2
  232. package/src/styles/06-components/_components.footer.scss +1 -1
  233. package/src/styles/06-components/_components.side-menu.scss +5 -5
  234. package/src/styles/06-components/_components.toggle.scss +18 -0
  235. package/src/styles/06-components/_index.scss +1 -1
  236. package/src/styles/06-components/old.chart.styles.scss +0 -2
  237. package/src/styles/99-utilities/_utilities.border.scss +69 -27
  238. package/src/styles/99-utilities/_utilities.display.scss +1 -1
  239. package/src/styles/99-utilities/_utilities.opacity.scss +10 -0
  240. package/src/styles/99-utilities/_utilities.position.scss +16 -9
  241. package/src/styles/99-utilities/_utilities.scss +1 -1
  242. package/src/styles/99-utilities/_utilities.sizes.scss +47 -18
  243. package/src/styles/99-utilities/_utilities.spacing.scss +118 -66
  244. package/src/styles/99-utilities/_utilities.text-gradient.scss +30 -30
  245. package/src/styles/99-utilities/_utilities.text.scss +67 -46
@@ -15,12 +15,12 @@ interface UseHeroResult {
15
15
  /**
16
16
  * Generate image column class based on size
17
17
  */
18
- generateImageColClass: (size?: number) => string;
18
+ generateImageColClass: (size?: number, customClass?: string) => string;
19
19
 
20
20
  /**
21
21
  * Generate content column class based on size
22
22
  */
23
- generateContentColClass: (size?: number) => string;
23
+ generateContentColClass: (size?: number, customClass?: string) => string;
24
24
 
25
25
  /**
26
26
  * Determine if the hero has a background image
@@ -73,7 +73,7 @@ interface UseHeroResult {
73
73
  * @param initialProps - Initial hero props
74
74
  * @returns Hero methods
75
75
  */
76
- export function useHero(initialProps?: Partial<HeroProps>): UseHeroResult {
76
+ export function useHero(initialProps?: HeroProps): UseHeroResult {
77
77
  const heroRef = useRef<HTMLDivElement>(null);
78
78
  const videoRef = useRef<HTMLVideoElement>(null);
79
79
  const parallaxHandlerRef = useRef<((event: Event) => void) | null>(null);
@@ -88,6 +88,8 @@ export function useHero(initialProps?: Partial<HeroProps>): UseHeroResult {
88
88
  contentWidth: undefined,
89
89
  parallax: false,
90
90
  parallaxIntensity: 0.5,
91
+ headingLevel: 'h1',
92
+ reverseOnMobile: false,
91
93
  ...initialProps,
92
94
  };
93
95
 
@@ -100,15 +102,16 @@ export function useHero(initialProps?: Partial<HeroProps>): UseHeroResult {
100
102
  * Initialize background slider hook - always call hook, conditionally use result
101
103
  */
102
104
  const backgroundSliderResult = useHeroBackgroundSlider(
103
- defaultProps.backgroundSlider || {
104
- slides: [],
105
- autoplay: { delay: 5000, pauseOnHover: true }
105
+ defaultProps.backgroundSlider || {
106
+ slides: [],
107
+ autoplay: { delay: 5000, pauseOnHover: true },
108
+ transition: 'fade',
109
+ transitionDuration: 1000,
106
110
  }
107
111
  );
108
-
109
- const backgroundSlider = hasBackgroundSlider && defaultProps.backgroundSlider
110
- ? backgroundSliderResult
111
- : undefined;
112
+
113
+ const backgroundSlider =
114
+ hasBackgroundSlider && defaultProps.backgroundSlider ? backgroundSliderResult : undefined;
112
115
 
113
116
  /**
114
117
  * Check if the hero has a background image
@@ -198,7 +201,12 @@ export function useHero(initialProps?: Partial<HeroProps>): UseHeroResult {
198
201
  removeParallaxEffect(heroElement);
199
202
  }
200
203
  };
201
- }, [defaultProps.parallax, defaultProps.parallaxIntensity, hasBackgroundImage, hasBackgroundSlider]);
204
+ }, [
205
+ defaultProps.parallax,
206
+ defaultProps.parallaxIntensity,
207
+ hasBackgroundImage,
208
+ hasBackgroundSlider,
209
+ ]);
202
210
 
203
211
  /**
204
212
  * Generate hero class names based on props
@@ -247,9 +255,13 @@ export function useHero(initialProps?: Partial<HeroProps>): UseHeroResult {
247
255
  /**
248
256
  * Generate image column class based on size
249
257
  * @param size - Column size (1-12)
258
+ * @param customClass - Optional custom class name
250
259
  * @returns Column class
251
260
  */
252
- const generateImageColClass = (size: number = defaultProps.imageColSize || 7): string => {
261
+ const generateImageColClass = (
262
+ size: number = defaultProps.imageColSize || 7,
263
+ customClass?: string
264
+ ): string => {
253
265
  const classes = [`o-grid__col o-grid__col--md-${size}`];
254
266
 
255
267
  // Add responsive margin if needed for mobile view
@@ -257,16 +269,48 @@ export function useHero(initialProps?: Partial<HeroProps>): UseHeroResult {
257
269
  classes.push('u-mt-5 u-mt-md-0');
258
270
  }
259
271
 
272
+ // Handle mobile stacking order
273
+ if (defaultProps.reverseOnMobile) {
274
+ if (defaultProps.alignment === 'right' || defaultProps.alignment === 'center') {
275
+ classes.push('u-order-first u-order-md-last');
276
+ } else {
277
+ classes.push('u-order-last u-order-md-first');
278
+ }
279
+ }
280
+
281
+ if (customClass) {
282
+ classes.push(customClass);
283
+ }
284
+
260
285
  return classes.join(' ');
261
286
  };
262
287
 
263
288
  /**
264
289
  * Generate content column class based on size
265
290
  * @param size - Column size (1-12)
291
+ * @param customClass - Optional custom class name
266
292
  * @returns Column class
267
293
  */
268
- const generateContentColClass = (size: number = defaultProps.contentColSize || 5): string => {
269
- return `o-grid__col o-grid__col--md-${size}`;
294
+ const generateContentColClass = (
295
+ size: number = defaultProps.contentColSize || 5,
296
+ customClass?: string
297
+ ): string => {
298
+ const classes = [`o-grid__col o-grid__col--md-${size}`];
299
+
300
+ // Handle mobile stacking order
301
+ if (defaultProps.reverseOnMobile) {
302
+ if (defaultProps.alignment === 'right' || defaultProps.alignment === 'center') {
303
+ classes.push('u-order-last u-order-md-first');
304
+ } else {
305
+ classes.push('u-order-first u-order-md-last');
306
+ }
307
+ }
308
+
309
+ if (customClass) {
310
+ classes.push(customClass);
311
+ }
312
+
313
+ return classes.join(' ');
270
314
  };
271
315
 
272
316
  return {
@@ -49,13 +49,7 @@ export interface UseHeroBackgroundSliderResult {
49
49
  export function useHeroBackgroundSlider(
50
50
  config: HeroBackgroundSliderConfig
51
51
  ): UseHeroBackgroundSliderResult {
52
- const {
53
- slides,
54
- autoplay,
55
- loop = true,
56
- transition = 'fade',
57
- transitionDuration = 1000,
58
- } = config;
52
+ const { slides, autoplay, loop = true, transition = 'fade', transitionDuration = 1000 } = config;
59
53
 
60
54
  const [currentIndex, setCurrentIndex] = useState(0);
61
55
  const [isTransitioning, setIsTransitioning] = useState(false);
@@ -148,7 +142,7 @@ export function useHeroBackgroundSlider(
148
142
  if (isPausedRef.current && autoplay && slides.length > 1) {
149
143
  isPausedRef.current = false;
150
144
  const delay = typeof autoplay === 'object' ? autoplay.delay : 3000;
151
-
145
+
152
146
  // Restart autoplay
153
147
  if (!autoplayRef.current) {
154
148
  autoplayRef.current = setInterval(() => {
@@ -227,4 +221,3 @@ export function useHeroBackgroundSlider(
227
221
  resumeAutoplay,
228
222
  };
229
223
  }
230
-
@@ -6,14 +6,16 @@ import { INPUT } from '../constants/components';
6
6
  * @param initialProps - Initial input properties
7
7
  * @returns Input state and methods
8
8
  */
9
- export function useInput(initialProps?: Partial<InputProps> & {
10
- prefixIcon?: boolean;
11
- suffixIcon?: boolean;
12
- clearable?: boolean;
13
- showCounter?: boolean;
14
- showPasswordToggle?: boolean;
15
- fullWidth?: boolean;
16
- }) {
9
+ export function useInput(
10
+ initialProps?: Partial<InputProps> & {
11
+ prefixIcon?: boolean;
12
+ suffixIcon?: boolean;
13
+ clearable?: boolean;
14
+ showCounter?: boolean;
15
+ showPasswordToggle?: boolean;
16
+ fullWidth?: boolean;
17
+ }
18
+ ) {
17
19
  // Default input properties
18
20
  const defaultProps: Partial<InputProps> = {
19
21
  size: 'md',
@@ -19,9 +19,9 @@ export function useSideMenu(initialProps?: Partial<SideMenuProps>) {
19
19
 
20
20
  // Local open state for when not controlled externally
21
21
  const [isOpenState, setIsOpenState] = useState(
22
- defaultProps.defaultCollapsedDesktop !== undefined
23
- ? !defaultProps.defaultCollapsedDesktop
24
- : (defaultProps.isOpen || false)
22
+ defaultProps.defaultCollapsedDesktop !== undefined
23
+ ? !defaultProps.defaultCollapsedDesktop
24
+ : defaultProps.isOpen || false
25
25
  );
26
26
 
27
27
  // Refs for managing responsive behavior
@@ -42,7 +42,8 @@ export function useSideMenu(initialProps?: Partial<SideMenuProps>) {
42
42
  useEffect(() => {
43
43
  const isMobile = window.innerWidth < 768;
44
44
  const shouldCollapse = isMobile ? defaultProps.collapsible : defaultProps.collapsibleDesktop;
45
- const currentOpen = typeof defaultProps.isOpen !== 'undefined' ? defaultProps.isOpen : isOpenState;
45
+ const currentOpen =
46
+ typeof defaultProps.isOpen !== 'undefined' ? defaultProps.isOpen : isOpenState;
46
47
 
47
48
  if (shouldCollapse && wrapperRef.current && innerRef.current) {
48
49
  // Use setTimeout to ensure DOM is fully rendered
@@ -78,7 +79,7 @@ export function useSideMenu(initialProps?: Partial<SideMenuProps>) {
78
79
  // Set proper height for vertical animation (both mobile and desktop)
79
80
  const currentOpen =
80
81
  typeof defaultProps.isOpen !== 'undefined' ? defaultProps.isOpen : isOpenState;
81
-
82
+
82
83
  // Use requestAnimationFrame to ensure DOM is ready
83
84
  requestAnimationFrame(() => {
84
85
  if (wrapperRef.current && innerRef.current) {
@@ -160,7 +160,7 @@ export const useTooltip = ({
160
160
  const [isPositioned, setIsPositioned] = useState(false);
161
161
  const [tooltipStyle, setTooltipStyle] = useState<React.CSSProperties>({});
162
162
  const [arrowStyle, setArrowStyle] = useState<React.CSSProperties>({});
163
-
163
+
164
164
  const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);
165
165
  const triggerRef = useRef<HTMLDivElement>(null);
166
166
  const tooltipRef = useRef<HTMLDivElement>(null);
@@ -282,4 +282,3 @@ export const useTooltip = ({
282
282
  };
283
283
 
284
284
  export default useTooltip;
285
-
@@ -170,7 +170,13 @@ export function useVideoPlayer({
170
170
 
171
171
  // Validate and sanitize the source URL
172
172
  const sanitizedSrc = String(newQuality.src).replace(/[<>"']/g, '');
173
- if (sanitizedSrc && (sanitizedSrc.startsWith('http://') || sanitizedSrc.startsWith('https://') || sanitizedSrc.startsWith('blob:') || sanitizedSrc.startsWith('data:'))) {
173
+ if (
174
+ sanitizedSrc &&
175
+ (sanitizedSrc.startsWith('http://') ||
176
+ sanitizedSrc.startsWith('https://') ||
177
+ sanitizedSrc.startsWith('blob:') ||
178
+ sanitizedSrc.startsWith('data:'))
179
+ ) {
174
180
  videoRef.current.src = sanitizedSrc;
175
181
  videoRef.current.currentTime = currentTime;
176
182
 
@@ -299,40 +305,43 @@ export function useVideoPlayer({
299
305
  }, [onFullscreenChange]);
300
306
 
301
307
  // Keyboard shortcuts
302
- const handleKeyDown = useCallback((e: KeyboardEvent) => {
303
- if (!containerRef.current?.contains(document.activeElement)) return;
304
-
305
- switch (e.code) {
306
- case 'Space':
307
- e.preventDefault();
308
- togglePlay();
309
- break;
310
- case 'ArrowLeft':
311
- e.preventDefault();
312
- seek(currentTime - 10);
313
- break;
314
- case 'ArrowRight':
315
- e.preventDefault();
316
- seek(currentTime + 10);
317
- break;
318
- case 'ArrowUp':
319
- e.preventDefault();
320
- setVolume(Math.min(1, volume + 0.1));
321
- break;
322
- case 'ArrowDown':
323
- e.preventDefault();
324
- setVolume(Math.max(0, volume - 0.1));
325
- break;
326
- case 'KeyM':
327
- e.preventDefault();
328
- toggleMute();
329
- break;
330
- case 'KeyF':
331
- e.preventDefault();
332
- toggleFullscreen();
333
- break;
334
- }
335
- }, [togglePlay, seek, currentTime, setVolume, volume, toggleMute, toggleFullscreen, containerRef]);
308
+ const handleKeyDown = useCallback(
309
+ (e: KeyboardEvent) => {
310
+ if (!containerRef.current?.contains(document.activeElement)) return;
311
+
312
+ switch (e.code) {
313
+ case 'Space':
314
+ e.preventDefault();
315
+ togglePlay();
316
+ break;
317
+ case 'ArrowLeft':
318
+ e.preventDefault();
319
+ seek(currentTime - 10);
320
+ break;
321
+ case 'ArrowRight':
322
+ e.preventDefault();
323
+ seek(currentTime + 10);
324
+ break;
325
+ case 'ArrowUp':
326
+ e.preventDefault();
327
+ setVolume(Math.min(1, volume + 0.1));
328
+ break;
329
+ case 'ArrowDown':
330
+ e.preventDefault();
331
+ setVolume(Math.max(0, volume - 0.1));
332
+ break;
333
+ case 'KeyM':
334
+ e.preventDefault();
335
+ toggleMute();
336
+ break;
337
+ case 'KeyF':
338
+ e.preventDefault();
339
+ toggleFullscreen();
340
+ break;
341
+ }
342
+ },
343
+ [togglePlay, seek, currentTime, setVolume, volume, toggleMute, toggleFullscreen, containerRef]
344
+ );
336
345
 
337
346
  useEffect(() => {
338
347
  document.addEventListener('keydown', handleKeyDown);