@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.
- package/build-tools/index.d.ts +31 -30
- package/build-tools/package.json +4 -21
- package/dist/atomix.css +20924 -2611
- package/dist/atomix.css.map +1 -1
- package/dist/atomix.min.css +76 -2
- package/dist/atomix.min.css.map +1 -1
- package/dist/build-tools/index.d.ts +31 -30
- package/dist/build-tools/package.json +4 -21
- package/dist/charts.js.map +1 -1
- package/dist/core.js.map +1 -1
- package/dist/forms.js.map +1 -1
- package/dist/heavy.js.map +1 -1
- package/dist/index.d.ts +144 -18
- package/dist/index.esm.js +110 -55
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +110 -55
- 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.map +1 -1
- package/dist/theme.d.ts +9 -9
- package/dist/theme.js.map +1 -1
- package/package.json +1 -1
- package/src/components/Accordion/Accordion.stories.tsx +32 -23
- package/src/components/Accordion/Accordion.test.tsx +70 -50
- package/src/components/Accordion/Accordion.tsx +99 -94
- package/src/components/AtomixGlass/AtomixGlass.test.tsx +1 -1
- package/src/components/AtomixGlass/GlassFilter.tsx +9 -16
- package/src/components/AtomixGlass/glass-utils.ts +4 -3
- package/src/components/AtomixGlass/shader-utils.ts +128 -52
- package/src/components/AtomixGlass/stories/Playground.stories.tsx +1 -1
- package/src/components/AtomixGlass/stories/Shaders.stories.tsx +1 -1
- package/src/components/Avatar/Avatar.stories.tsx +45 -62
- package/src/components/Avatar/Avatar.tsx +58 -56
- package/src/components/Badge/Badge.stories.tsx +20 -9
- package/src/components/Badge/Badge.test.tsx +41 -41
- package/src/components/Badge/Badge.tsx +64 -62
- package/src/components/Block/Block.stories.tsx +14 -4
- package/src/components/Breadcrumb/Breadcrumb.stories.tsx +9 -8
- package/src/components/Breadcrumb/Breadcrumb.tsx +62 -60
- package/src/components/Button/Button.stories.tsx +13 -22
- package/src/components/Button/Button.test.tsx +97 -81
- package/src/components/Button/Button.tsx +46 -14
- package/src/components/Button/ButtonGroup.stories.tsx +37 -32
- package/src/components/Button/ButtonGroup.tsx +4 -15
- package/src/components/Callout/Callout.stories.tsx +109 -16
- package/src/components/Card/Card.stories.tsx +67 -36
- package/src/components/Card/Card.tsx +30 -14
- package/src/components/Chart/AreaChart.tsx +1 -1
- package/src/components/Chart/CandlestickChart.tsx +23 -16
- package/src/components/Chart/Chart.stories.tsx +4 -9
- package/src/components/Chart/Chart.tsx +40 -44
- package/src/components/Chart/ChartRenderer.tsx +39 -12
- package/src/components/Chart/ChartToolbar.tsx +21 -5
- package/src/components/Chart/DonutChart.tsx +1 -1
- package/src/components/Chart/FunnelChart.tsx +4 -1
- package/src/components/Chart/GaugeChart.tsx +3 -1
- package/src/components/Chart/HeatmapChart.tsx +50 -37
- package/src/components/Chart/LineChart.tsx +3 -2
- package/src/components/Chart/MultiAxisChart.tsx +24 -16
- package/src/components/Chart/RadarChart.tsx +19 -17
- package/src/components/Chart/ScatterChart.tsx +29 -21
- package/src/components/ColorModeToggle/ColorModeToggle.stories.tsx +6 -2
- package/src/components/ColorModeToggle/ColorModeToggle.tsx +15 -3
- package/src/components/Countdown/Countdown.stories.tsx +7 -7
- package/src/components/DataTable/DataTable.stories.tsx +43 -38
- package/src/components/DataTable/DataTable.test.tsx +26 -148
- package/src/components/DataTable/DataTable.tsx +485 -456
- package/src/components/DatePicker/DatePicker.stories.tsx +32 -47
- package/src/components/DatePicker/DatePicker.tsx +31 -26
- package/src/components/Dropdown/Dropdown.stories.tsx +2 -5
- package/src/components/Dropdown/Dropdown.tsx +313 -299
- package/src/components/EdgePanel/EdgePanel.stories.tsx +6 -19
- package/src/components/EdgePanel/EdgePanel.tsx +1 -3
- package/src/components/Footer/Footer.stories.tsx +21 -16
- package/src/components/Footer/Footer.tsx +130 -128
- package/src/components/Footer/FooterLink.tsx +2 -2
- package/src/components/Form/Checkbox.test.tsx +49 -49
- package/src/components/Form/Checkbox.tsx +108 -100
- package/src/components/Form/Form.stories.tsx +2 -10
- package/src/components/Form/Input.stories.tsx +22 -39
- package/src/components/Form/Input.test.tsx +38 -44
- package/src/components/Form/Radio.stories.tsx +6 -12
- package/src/components/Form/Radio.tsx +68 -66
- package/src/components/Form/Select.tsx +184 -182
- package/src/components/Form/Textarea.test.tsx +27 -32
- package/src/components/Hero/Hero.stories.tsx +56 -23
- package/src/components/Hero/Hero.tsx +201 -55
- package/src/components/Icon/index.ts +7 -1
- package/src/components/List/List.tsx +19 -23
- package/src/components/Modal/Modal.stories.tsx +2 -1
- package/src/components/Modal/Modal.tsx +130 -127
- package/src/components/Navigation/Menu/MegaMenu.tsx +70 -70
- package/src/components/Navigation/Nav/NavDropdown.tsx +1 -5
- package/src/components/Navigation/SideMenu/SideMenu.stories.tsx +128 -28
- package/src/components/Navigation/SideMenu/SideMenu.tsx +5 -7
- package/src/components/Navigation/SideMenu/SideMenuItem.tsx +4 -5
- package/src/components/Pagination/Pagination.stories.tsx +7 -4
- package/src/components/Pagination/Pagination.tsx +199 -202
- package/src/components/PhotoViewer/PhotoViewer.tsx +4 -1
- package/src/components/Popover/Popover.stories.tsx +99 -192
- package/src/components/Popover/Popover.tsx +41 -37
- package/src/components/Progress/Progress.stories.tsx +35 -44
- package/src/components/River/River.stories.tsx +2 -1
- package/src/components/SectionIntro/SectionIntro.stories.tsx +71 -71
- package/src/components/Slider/Slider.stories.tsx +12 -4
- package/src/components/Spinner/Spinner.stories.tsx +3 -1
- package/src/components/Spinner/Spinner.test.tsx +23 -23
- package/src/components/Spinner/Spinner.tsx +43 -46
- package/src/components/Steps/Steps.stories.tsx +8 -6
- package/src/components/Tabs/Tabs.stories.tsx +12 -9
- package/src/components/Tabs/Tabs.tsx +74 -72
- package/src/components/Toggle/Toggle.stories.tsx +27 -13
- package/src/components/Toggle/Toggle.test.tsx +65 -70
- package/src/components/Toggle/Toggle.tsx +4 -1
- package/src/components/Tooltip/Tooltip.stories.tsx +24 -20
- package/src/components/Tooltip/Tooltip.tsx +104 -106
- package/src/components/Upload/Upload.stories.tsx +129 -127
- package/src/components/Upload/Upload.tsx +287 -283
- package/src/components/VideoPlayer/VideoPlayer.tsx +6 -1
- package/src/components/index.ts +13 -2
- package/src/layouts/Grid/Grid.stories.tsx +9 -3
- package/src/layouts/MasonryGrid/MasonryGrid.tsx +5 -1
- package/src/lib/__tests__/theme-tools.test.ts +32 -6
- package/src/lib/composables/shared-mouse-tracker.ts +13 -14
- package/src/lib/composables/useAtomixGlass.ts +106 -49
- package/src/lib/composables/useChartExport.ts +1 -1
- package/src/lib/composables/useDataTable.ts +29 -17
- package/src/lib/composables/useHero.ts +58 -14
- package/src/lib/composables/useHeroBackgroundSlider.ts +2 -9
- package/src/lib/composables/useInput.ts +10 -8
- package/src/lib/composables/useSideMenu.ts +6 -5
- package/src/lib/composables/useTooltip.ts +1 -2
- package/src/lib/composables/useVideoPlayer.ts +44 -35
- package/src/lib/config/index.ts +154 -154
- package/src/lib/constants/cssVariables.ts +29 -29
- package/src/lib/hooks/__tests__/useComponentCustomization.test.ts +2 -6
- package/src/lib/hooks/index.ts +1 -1
- package/src/lib/hooks/useComponentCustomization.ts +11 -17
- package/src/lib/hooks/usePerformanceMonitor.ts +6 -7
- package/src/lib/patterns/__tests__/slots.test.ts +1 -1
- package/src/lib/patterns/index.ts +1 -1
- package/src/lib/patterns/slots.tsx +8 -13
- package/src/lib/storybook/InteractiveDemo.tsx +13 -18
- package/src/lib/storybook/PreviewContainer.tsx +1 -1
- package/src/lib/storybook/VariantsGrid.tsx +3 -7
- package/src/lib/storybook/index.ts +1 -1
- package/src/lib/theme/adapters/cssVariableMapper.ts +47 -74
- package/src/lib/theme/adapters/index.ts +3 -9
- package/src/lib/theme/adapters/themeAdapter.ts +41 -26
- package/src/lib/theme/config/index.ts +1 -1
- package/src/lib/theme/config/types.ts +2 -2
- package/src/lib/theme/config/validator.ts +10 -5
- package/src/lib/theme/constants/constants.ts +2 -2
- package/src/lib/theme/constants/index.ts +1 -2
- package/src/lib/theme/core/__tests__/createTheme.test.ts +20 -22
- package/src/lib/theme/core/composeTheme.ts +32 -26
- package/src/lib/theme/core/createTheme.ts +1 -1
- package/src/lib/theme/core/createThemeObject.ts +308 -301
- package/src/lib/theme/core/index.ts +3 -3
- package/src/lib/theme/devtools/CLI.ts +106 -104
- package/src/lib/theme/devtools/Comparator.tsx +50 -32
- package/src/lib/theme/devtools/DesignTokensCustomizer.stories.tsx +50 -48
- package/src/lib/theme/devtools/DesignTokensCustomizer.tsx +257 -63
- package/src/lib/theme/devtools/Inspector.tsx +75 -60
- package/src/lib/theme/devtools/LiveEditor.tsx +97 -76
- package/src/lib/theme/devtools/Preview.tsx +150 -106
- package/src/lib/theme/devtools/ThemeValidator.ts +29 -21
- package/src/lib/theme/devtools/index.ts +3 -9
- package/src/lib/theme/devtools/useHistory.ts +23 -21
- package/src/lib/theme/errors/errors.ts +12 -11
- package/src/lib/theme/errors/index.ts +2 -7
- package/src/lib/theme/generators/generateCSS.ts +9 -13
- package/src/lib/theme/generators/generateCSSNested.ts +1 -6
- package/src/lib/theme/generators/generateCSSVariables.ts +673 -630
- package/src/lib/theme/generators/index.ts +1 -4
- package/src/lib/theme/i18n/index.ts +1 -1
- package/src/lib/theme/i18n/rtl.ts +13 -13
- package/src/lib/theme/index.ts +7 -16
- package/src/lib/theme/runtime/ThemeApplicator.ts +4 -4
- package/src/lib/theme/runtime/ThemeContext.tsx +1 -1
- package/src/lib/theme/runtime/ThemeErrorBoundary.tsx +19 -23
- package/src/lib/theme/runtime/ThemeProvider.tsx +230 -239
- package/src/lib/theme/runtime/__tests__/ThemeProvider.integration.test.tsx +1 -1
- package/src/lib/theme/runtime/__tests__/ThemeProvider.test.tsx +24 -29
- package/src/lib/theme/runtime/index.ts +2 -5
- package/src/lib/theme/runtime/useTheme.ts +18 -18
- package/src/lib/theme/runtime/useThemeTokens.ts +22 -22
- package/src/lib/theme/test/testTheme.ts +15 -16
- package/src/lib/theme/tokens/index.ts +2 -7
- package/src/lib/theme/tokens/tokens.ts +25 -24
- package/src/lib/theme/types.ts +428 -411
- package/src/lib/theme/utils/__tests__/themeValidation.test.ts +3 -3
- package/src/lib/theme/utils/componentTheming.ts +18 -18
- package/src/lib/theme/utils/domUtils.ts +277 -289
- package/src/lib/theme/utils/index.ts +1 -2
- package/src/lib/theme/utils/injectCSS.ts +10 -14
- package/src/lib/theme/utils/naming.ts +20 -16
- package/src/lib/theme/utils/themeHelpers.ts +10 -12
- package/src/lib/theme/utils/themeUtils.ts +85 -86
- package/src/lib/theme/utils/themeValidation.ts +82 -33
- package/src/lib/theme-tools.ts +8 -6
- package/src/lib/types/components.ts +172 -71
- package/src/lib/types/partProps.ts +1 -1
- package/src/lib/utils/__tests__/csv.test.ts +1 -1
- package/src/lib/utils/componentUtils.ts +8 -12
- package/src/lib/utils/csv.ts +3 -1
- package/src/lib/utils/dataTableExport.ts +1 -5
- package/src/lib/utils/fontPreloader.ts +10 -19
- package/src/lib/utils/icons.ts +4 -1
- package/src/lib/utils/index.ts +2 -6
- package/src/lib/utils/memoryMonitor.ts +10 -8
- package/src/lib/utils/themeNaming.ts +2 -2
- package/src/styles/01-settings/_index.scss +0 -1
- package/src/styles/01-settings/_settings.colors.scss +8 -8
- package/src/styles/01-settings/_settings.design-tokens.scss +61 -50
- package/src/styles/01-settings/_settings.navbar.scss +1 -1
- package/src/styles/01-settings/_settings.spacing.scss +3 -4
- package/src/styles/01-settings/_settings.tooltip.scss +1 -1
- package/src/styles/01-settings/_settings.typography.scss +1 -1
- package/src/styles/02-tools/_tools.button.scss +51 -21
- package/src/styles/02-tools/_tools.utility-api.scss +30 -18
- package/src/styles/03-generic/_generic.root.scss +4 -3
- package/src/styles/06-components/_components.atomix-glass.scss +13 -9
- package/src/styles/06-components/_components.button.scss +16 -4
- package/src/styles/06-components/_components.callout.scss +27 -21
- package/src/styles/06-components/_components.card.scss +5 -14
- package/src/styles/06-components/_components.chart.scss +22 -19
- package/src/styles/06-components/_components.checkbox.scss +3 -1
- package/src/styles/06-components/_components.color-mode-toggle.scss +3 -1
- package/src/styles/06-components/_components.edge-panel.scss +9 -2
- package/src/styles/06-components/_components.footer.scss +1 -1
- package/src/styles/06-components/_components.side-menu.scss +5 -5
- package/src/styles/06-components/_components.toggle.scss +18 -0
- package/src/styles/06-components/_index.scss +1 -1
- package/src/styles/06-components/old.chart.styles.scss +0 -2
- package/src/styles/99-utilities/_utilities.border.scss +69 -27
- package/src/styles/99-utilities/_utilities.display.scss +1 -1
- package/src/styles/99-utilities/_utilities.opacity.scss +10 -0
- package/src/styles/99-utilities/_utilities.position.scss +16 -9
- package/src/styles/99-utilities/_utilities.scss +1 -1
- package/src/styles/99-utilities/_utilities.sizes.scss +47 -18
- package/src/styles/99-utilities/_utilities.spacing.scss +118 -66
- package/src/styles/99-utilities/_utilities.text-gradient.scss +30 -30
- 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?:
|
|
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 =
|
|
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
|
-
}, [
|
|
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 = (
|
|
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 = (
|
|
269
|
-
|
|
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(
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
-
:
|
|
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 =
|
|
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 (
|
|
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(
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
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);
|