@shohojdhara/atomix 0.3.3 → 0.3.5
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/README.md +46 -28
- package/dist/atomix.css +15 -9
- package/dist/atomix.css.map +1 -0
- package/dist/atomix.min.css +15108 -11
- package/dist/atomix.min.css.map +1 -0
- package/dist/charts.d.ts +1929 -0
- package/dist/charts.js +6482 -0
- package/dist/charts.js.map +1 -0
- package/dist/core.d.ts +1289 -0
- package/dist/core.js +3357 -0
- package/dist/core.js.map +1 -0
- package/dist/forms.d.ts +1085 -0
- package/dist/forms.js +2450 -0
- package/dist/forms.js.map +1 -0
- package/dist/heavy.d.ts +636 -0
- package/dist/heavy.js +4550 -0
- package/dist/heavy.js.map +1 -0
- package/dist/index.d.ts +5196 -4618
- package/dist/index.esm.js +4240 -2776
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +4057 -2571
- 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.d.ts +300 -0
- package/dist/layout.js +336 -0
- package/dist/layout.js.map +1 -0
- package/dist/theme.d.ts +1992 -0
- package/dist/theme.js +5348 -0
- package/dist/theme.js.map +1 -0
- package/package.json +63 -68
- package/scripts/atomix-cli.js +879 -15
- package/scripts/cli/__tests__/cli-commands.test.js +204 -0
- package/scripts/cli/__tests__/utils.test.js +201 -0
- package/scripts/cli/__tests__/vitest.config.js +26 -0
- package/scripts/cli/interactive-init.js +37 -45
- package/scripts/cli/theme-bridge.js +129 -0
- package/scripts/cli/token-manager.js +32 -7
- package/scripts/cli/utils.js +347 -0
- package/scripts/sync-theme-config.js +22 -22
- package/src/components/Accordion/Accordion.tsx +5 -54
- package/src/components/Accordion/index.ts +1 -1
- package/src/components/Avatar/Avatar.tsx +3 -3
- package/src/components/Badge/Badge.tsx +3 -3
- package/src/components/Breadcrumb/Breadcrumb.tsx +3 -3
- package/src/components/Button/Button.tsx +36 -1
- package/src/components/Card/ElevationCard.tsx +1 -1
- package/src/components/Chart/AnimatedChart.tsx +19 -17
- package/src/components/Chart/AreaChart.tsx +5 -1
- package/src/components/Chart/BarChart.tsx +1 -0
- package/src/components/Chart/BubbleChart.tsx +6 -5
- package/src/components/Chart/ChartToolbar.tsx +1 -0
- package/src/components/Chart/FunnelChart.tsx +1 -1
- package/src/components/Chart/RadarChart.tsx +19 -12
- package/src/components/Chart/ScatterChart.tsx +3 -3
- package/src/components/Chart/TreemapChart.tsx +2 -1
- package/src/components/Chart/WaterfallChart.tsx +0 -1
- package/src/components/Chart/types.ts +12 -2
- package/src/components/Chart/utils.ts +4 -3
- package/src/components/DataTable/DataTable.tsx +3 -3
- package/src/components/Dropdown/Dropdown.tsx +12 -9
- package/src/components/Footer/FooterSection.tsx +3 -3
- package/src/components/Form/Checkbox.tsx +3 -3
- package/src/components/Form/Input.tsx +4 -2
- package/src/components/Form/Radio.tsx +3 -3
- package/src/components/Form/Select.tsx +3 -3
- package/src/components/Form/Textarea.tsx +4 -2
- package/src/components/List/List.stories.tsx +3 -3
- package/src/components/List/List.tsx +3 -3
- package/src/components/List/ListGroup.tsx +3 -1
- package/src/components/Modal/Modal.tsx +3 -3
- package/src/components/Navigation/Menu/MegaMenu.tsx +9 -3
- package/src/components/Navigation/Menu/Menu.tsx +9 -3
- package/src/components/Pagination/Pagination.tsx +6 -5
- package/src/components/PhotoViewer/PhotoViewerImage.tsx +2 -2
- package/src/components/Popover/Popover.tsx +4 -4
- package/src/components/Progress/Progress.tsx +6 -2
- package/src/components/Rating/Rating.tsx +5 -2
- package/src/components/Slider/Slider.tsx +10 -9
- package/src/components/Spinner/Spinner.tsx +3 -3
- package/src/components/Tabs/Tabs.tsx +3 -3
- package/src/components/Tooltip/Tooltip.tsx +3 -3
- package/src/components/index.ts +5 -2
- package/src/layouts/MasonryGrid/MasonryGrid.tsx +2 -2
- package/src/lib/composables/useChartPerformance.ts +102 -78
- package/src/lib/composables/useChartScale.ts +10 -0
- package/src/lib/composables/useHero.ts +9 -2
- package/src/lib/composables/useHeroBackgroundSlider.ts +5 -3
- package/src/lib/composables/useSideMenu.ts +1 -0
- package/src/lib/composables/useVideoPlayer.ts +3 -2
- package/src/lib/config/index.ts +275 -0
- package/src/lib/config/loader.ts +147 -0
- package/src/lib/hooks/index.ts +0 -1
- package/src/lib/hooks/useComponentCustomization.ts +10 -14
- package/src/lib/hooks/usePerformanceMonitor.ts +149 -0
- package/src/lib/index.ts +1 -0
- package/src/lib/patterns/index.ts +2 -2
- package/src/lib/patterns/slots.tsx +2 -2
- package/src/lib/theme/composeTheme.ts +1 -6
- package/src/lib/theme/config/index.ts +1 -1
- package/src/lib/theme/config/loader.ts +75 -41
- package/src/lib/theme/config/types.ts +21 -7
- package/src/lib/theme/config/validator.ts +1 -1
- package/src/lib/theme/constants.ts +12 -2
- package/src/lib/theme/core/ThemeEngine.ts +8 -0
- package/src/lib/theme/core/ThemeValidator.ts +5 -2
- package/src/lib/theme/createTheme.ts +0 -1
- package/src/lib/theme/createThemeFromConfig.ts +132 -0
- package/src/lib/theme/devtools/CLI.ts +161 -76
- package/src/lib/theme/devtools/Comparator.tsx +343 -0
- package/src/lib/theme/devtools/IMPROVEMENTS.md +429 -0
- package/src/lib/theme/devtools/Inspector.tsx +22 -7
- package/src/lib/theme/devtools/LiveEditor.tsx +399 -0
- package/src/lib/theme/devtools/README.md +433 -0
- package/src/lib/theme/devtools/index.ts +12 -11
- package/src/lib/theme/generateCSSVariables.ts +80 -39
- package/src/lib/theme/i18n/rtl.ts +2 -1
- package/src/lib/theme/index.ts +18 -2
- package/src/lib/theme/runtime/ThemeApplicator.ts +28 -11
- package/src/lib/theme/runtime/ThemeErrorBoundary.tsx +3 -3
- package/src/lib/theme/runtime/ThemeManager.test.ts +17 -1
- package/src/lib/theme/runtime/ThemeManager.ts +11 -7
- package/src/lib/theme/types.ts +42 -43
- package/src/lib/theme-tools.ts +8 -68
- package/src/lib/types/components.ts +252 -109
- package/src/lib/types/partProps.ts +0 -16
- package/src/lib/utils/fontPreloader.ts +148 -0
- package/src/lib/utils/index.ts +11 -0
- package/src/lib/utils/memoryMonitor.ts +189 -0
- package/src/styles/01-settings/_settings.fonts.scss +2 -5
- package/src/styles/01-settings/_settings.navbar.scss +1 -1
- package/src/styles/03-generic/_generated-root.css +26 -0
- package/src/styles/06-components/_components.navbar.scss +6 -5
- package/src/themes/README.md +1 -2
- package/src/themes/themes.config.js +30 -181
- package/dist/themes/applemix.css +0 -16576
- package/dist/themes/applemix.css.map +0 -1
- package/dist/themes/applemix.min.css +0 -73
- package/dist/themes/boomdevs.css +0 -16007
- package/dist/themes/boomdevs.css.map +0 -1
- package/dist/themes/boomdevs.min.css +0 -406
- package/dist/themes/esrar.css +0 -18424
- package/dist/themes/esrar.css.map +0 -1
- package/dist/themes/esrar.min.css +0 -221
- package/dist/themes/flashtrade.css +0 -17596
- package/dist/themes/flashtrade.css.map +0 -1
- package/dist/themes/flashtrade.min.css +0 -196
- package/dist/themes/mashroom.css +0 -31082
- package/dist/themes/mashroom.css.map +0 -1
- package/dist/themes/mashroom.min.css +0 -450
- package/dist/themes/shaj-default.css +0 -17200
- package/dist/themes/shaj-default.css.map +0 -1
- package/dist/themes/shaj-default.min.css +0 -502
- package/scripts/build-themes.js +0 -208
- package/src/components/AtomixGlass/atomixGLass.old.tsx +0 -1263
- package/src/lib/theme/__tests__/ThemeBuilder.test.ts +0 -223
- package/src/lib/theme/builders/ThemeBuilder.ts +0 -372
- package/src/lib/theme/errors.test.ts +0 -207
- package/src/lib/theme/generators/CSSGenerator.ts +0 -311
- package/src/lib/theme/generators/ConfigGenerator.ts +0 -287
- package/src/lib/theme/generators/TypeGenerator.ts +0 -228
- package/src/lib/theme/generators/index.ts +0 -21
- package/src/lib/theme/monitoring/ThemeAnalytics.ts +0 -409
- package/src/lib/theme/monitoring/index.ts +0 -17
- package/src/lib/theme/overrides/ComponentOverrides.ts +0 -243
- package/src/lib/theme/overrides/index.ts +0 -15
- package/src/lib/theme/whitelabel/WhiteLabelManager.ts +0 -364
- package/src/lib/theme/whitelabel/index.ts +0 -13
- package/src/themes/THEME_CHECKLIST.md +0 -74
- package/src/themes/applemix/01-settings/_index.scss +0 -24
- package/src/themes/applemix/01-settings/_settings.animations.scss +0 -0
- package/src/themes/applemix/01-settings/_settings.background.scss +0 -6
- package/src/themes/applemix/01-settings/_settings.colors.scss +0 -75
- package/src/themes/applemix/01-settings/_settings.config.scss +0 -15
- package/src/themes/applemix/01-settings/_settings.typography.scss +0 -30
- package/src/themes/applemix/02-tools/_index.scss +0 -4
- package/src/themes/applemix/03-generic/_index.scss +0 -7
- package/src/themes/applemix/04-elements/_index.scss +0 -7
- package/src/themes/applemix/05-objects/_index.scss +0 -7
- package/src/themes/applemix/06-components/_index.scss +0 -15
- package/src/themes/applemix/99-utilities/_index.scss +0 -7
- package/src/themes/applemix/README.md +0 -378
- package/src/themes/applemix/index.scss +0 -33
- package/src/themes/boomdevs/01-settings/_index.scss +0 -38
- package/src/themes/boomdevs/01-settings/_settings.accordion.scss +0 -12
- package/src/themes/boomdevs/01-settings/_settings.animations.scss +0 -11
- package/src/themes/boomdevs/01-settings/_settings.avatar.scss +0 -9
- package/src/themes/boomdevs/01-settings/_settings.badge.scss +0 -11
- package/src/themes/boomdevs/01-settings/_settings.border-radius.scss +0 -16
- package/src/themes/boomdevs/01-settings/_settings.border.scss +0 -10
- package/src/themes/boomdevs/01-settings/_settings.box-shadow.scss +0 -14
- package/src/themes/boomdevs/01-settings/_settings.breadcrumb.scss +0 -13
- package/src/themes/boomdevs/01-settings/_settings.breakpoints.scss +0 -15
- package/src/themes/boomdevs/01-settings/_settings.button.scss +0 -9
- package/src/themes/boomdevs/01-settings/_settings.callout.scss +0 -9
- package/src/themes/boomdevs/01-settings/_settings.card.scss +0 -11
- package/src/themes/boomdevs/01-settings/_settings.checkbox.scss +0 -9
- package/src/themes/boomdevs/01-settings/_settings.colors.scss +0 -145
- package/src/themes/boomdevs/01-settings/_settings.dropdown.scss +0 -11
- package/src/themes/boomdevs/01-settings/_settings.grid.scss +0 -16
- package/src/themes/boomdevs/01-settings/_settings.input.scss +0 -14
- package/src/themes/boomdevs/01-settings/_settings.link.scss +0 -11
- package/src/themes/boomdevs/01-settings/_settings.list.scss +0 -10
- package/src/themes/boomdevs/01-settings/_settings.modal.scss +0 -16
- package/src/themes/boomdevs/01-settings/_settings.navbar.scss +0 -16
- package/src/themes/boomdevs/01-settings/_settings.pagination.scss +0 -13
- package/src/themes/boomdevs/01-settings/_settings.progress.scss +0 -11
- package/src/themes/boomdevs/01-settings/_settings.rating.scss +0 -10
- package/src/themes/boomdevs/01-settings/_settings.spacing.scss +0 -33
- package/src/themes/boomdevs/01-settings/_settings.spinner.scss +0 -11
- package/src/themes/boomdevs/01-settings/_settings.steps.scss +0 -12
- package/src/themes/boomdevs/01-settings/_settings.tabs.scss +0 -12
- package/src/themes/boomdevs/01-settings/_settings.todo.scss +0 -15
- package/src/themes/boomdevs/01-settings/_settings.toggle.scss +0 -14
- package/src/themes/boomdevs/01-settings/_settings.tooltip.scss +0 -13
- package/src/themes/boomdevs/01-settings/_settings.typography.scss +0 -58
- package/src/themes/boomdevs/01-settings/_settings.video-player.scss +0 -12
- package/src/themes/boomdevs/02-tools/_index.scss +0 -7
- package/src/themes/boomdevs/03-generic/_index.scss +0 -7
- package/src/themes/boomdevs/04-elements/_index.scss +0 -7
- package/src/themes/boomdevs/05-objects/_index.scss +0 -7
- package/src/themes/boomdevs/06-components/_components.button.scss +0 -11
- package/src/themes/boomdevs/06-components/_index.scss +0 -11
- package/src/themes/boomdevs/99-utilities/_index.scss +0 -7
- package/src/themes/boomdevs/index.scss +0 -26
- package/src/themes/esrar/01-settings/_index.scss +0 -15
- package/src/themes/esrar/01-settings/_settings.colors.scss +0 -91
- package/src/themes/esrar/02-tools/_index.scss +0 -8
- package/src/themes/esrar/02-tools/_tools.animations.scss +0 -342
- package/src/themes/esrar/06-components/_components.accordion.scss +0 -49
- package/src/themes/esrar/06-components/_components.avatar-group.scss +0 -14
- package/src/themes/esrar/06-components/_components.avatar.scss +0 -61
- package/src/themes/esrar/06-components/_components.badge.scss +0 -117
- package/src/themes/esrar/06-components/_components.breadcrumb.scss +0 -65
- package/src/themes/esrar/06-components/_components.btn-group.scss +0 -19
- package/src/themes/esrar/06-components/_components.button.scss +0 -224
- package/src/themes/esrar/06-components/_components.callout.scss +0 -51
- package/src/themes/esrar/06-components/_components.card.scss +0 -134
- package/src/themes/esrar/06-components/_components.chart.scss +0 -24
- package/src/themes/esrar/06-components/_components.checkbox-group.scss +0 -26
- package/src/themes/esrar/06-components/_components.checkbox.scss +0 -71
- package/src/themes/esrar/06-components/_components.color-mode-toggle.scss +0 -29
- package/src/themes/esrar/06-components/_components.countdown.scss +0 -67
- package/src/themes/esrar/06-components/_components.data-table.scss +0 -22
- package/src/themes/esrar/06-components/_components.datepicker.scss +0 -20
- package/src/themes/esrar/06-components/_components.dropdown.scss +0 -272
- package/src/themes/esrar/06-components/_components.edge-panel.scss +0 -10
- package/src/themes/esrar/06-components/_components.form-group.scss +0 -15
- package/src/themes/esrar/06-components/_components.form.scss +0 -66
- package/src/themes/esrar/06-components/_components.hero.scss +0 -251
- package/src/themes/esrar/06-components/_components.icon.scss +0 -33
- package/src/themes/esrar/06-components/_components.image-gallery.scss +0 -29
- package/src/themes/esrar/06-components/_components.input.scss +0 -91
- package/src/themes/esrar/06-components/_components.list-group.scss +0 -26
- package/src/themes/esrar/06-components/_components.modal.scss +0 -148
- package/src/themes/esrar/06-components/_components.notification.scss +0 -80
- package/src/themes/esrar/06-components/_components.pagination.scss +0 -84
- package/src/themes/esrar/06-components/_components.popover.scss +0 -10
- package/src/themes/esrar/06-components/_components.progress.scss +0 -64
- package/src/themes/esrar/06-components/_components.rating.scss +0 -26
- package/src/themes/esrar/06-components/_components.skeleton.scss +0 -15
- package/src/themes/esrar/06-components/_components.slider.scss +0 -90
- package/src/themes/esrar/06-components/_components.spinner.scss +0 -71
- package/src/themes/esrar/06-components/_components.steps.scss +0 -76
- package/src/themes/esrar/06-components/_components.tab.scss +0 -58
- package/src/themes/esrar/06-components/_components.tag.scss +0 -21
- package/src/themes/esrar/06-components/_components.timeline.scss +0 -19
- package/src/themes/esrar/06-components/_components.toast.scss +0 -91
- package/src/themes/esrar/06-components/_components.toggle.scss +0 -74
- package/src/themes/esrar/06-components/_components.tooltip.scss +0 -45
- package/src/themes/esrar/06-components/_components.upload.scss +0 -102
- package/src/themes/esrar/06-components/_index.scss +0 -42
- package/src/themes/esrar/index.scss +0 -30
- package/src/themes/flashtrade/01-settings/_index.scss +0 -19
- package/src/themes/flashtrade/01-settings/_settings.animations.scss +0 -11
- package/src/themes/flashtrade/01-settings/_settings.background.scss +0 -9
- package/src/themes/flashtrade/01-settings/_settings.colors.scss +0 -79
- package/src/themes/flashtrade/01-settings/_settings.config.scss +0 -16
- package/src/themes/flashtrade/01-settings/_settings.typography.scss +0 -35
- package/src/themes/flashtrade/02-tools/_index.scss +0 -8
- package/src/themes/flashtrade/03-generic/_index.scss +0 -8
- package/src/themes/flashtrade/04-elements/_index.scss +0 -12
- package/src/themes/flashtrade/05-objects/_index.scss +0 -8
- package/src/themes/flashtrade/06-components/_components.badge.scss +0 -156
- package/src/themes/flashtrade/06-components/_components.button.scss +0 -135
- package/src/themes/flashtrade/06-components/_components.card.scss +0 -214
- package/src/themes/flashtrade/06-components/_components.navbar.scss +0 -227
- package/src/themes/flashtrade/06-components/_index.scss +0 -13
- package/src/themes/flashtrade/99-utilities/_index.scss +0 -9
- package/src/themes/flashtrade/99-utilities/_utilities.trading.scss +0 -187
- package/src/themes/flashtrade/README.md +0 -386
- package/src/themes/flashtrade/demo.html +0 -272
- package/src/themes/flashtrade/index.scss +0 -36
- package/src/themes/mashroom/01-settings/_index.scss +0 -69
- package/src/themes/mashroom/01-settings/_settings.accordion.scss +0 -32
- package/src/themes/mashroom/01-settings/_settings.animations.scss +0 -26
- package/src/themes/mashroom/01-settings/_settings.avatar-group.scss +0 -22
- package/src/themes/mashroom/01-settings/_settings.avatar.scss +0 -57
- package/src/themes/mashroom/01-settings/_settings.badge.scss +0 -19
- package/src/themes/mashroom/01-settings/_settings.border-radius.scss +0 -24
- package/src/themes/mashroom/01-settings/_settings.border.scss +0 -14
- package/src/themes/mashroom/01-settings/_settings.box-shadow.scss +0 -40
- package/src/themes/mashroom/01-settings/_settings.breadcrumb.scss +0 -0
- package/src/themes/mashroom/01-settings/_settings.breakpoints.scss +0 -17
- package/src/themes/mashroom/01-settings/_settings.btn-group.scss +0 -5
- package/src/themes/mashroom/01-settings/_settings.button.scss +0 -50
- package/src/themes/mashroom/01-settings/_settings.callout.scss +0 -81
- package/src/themes/mashroom/01-settings/_settings.card.scss +0 -52
- package/src/themes/mashroom/01-settings/_settings.checkbox-group.scss +0 -5
- package/src/themes/mashroom/01-settings/_settings.checkbox.scss +0 -23
- package/src/themes/mashroom/01-settings/_settings.color-mode.scss +0 -7
- package/src/themes/mashroom/01-settings/_settings.colors.scss +0 -180
- package/src/themes/mashroom/01-settings/_settings.config.scss +0 -4
- package/src/themes/mashroom/01-settings/_settings.countdown.scss +0 -20
- package/src/themes/mashroom/01-settings/_settings.data-table.scss +0 -56
- package/src/themes/mashroom/01-settings/_settings.datepicker.scss +0 -45
- package/src/themes/mashroom/01-settings/_settings.design-tokens.scss +0 -3
- package/src/themes/mashroom/01-settings/_settings.dropdown.scss +0 -45
- package/src/themes/mashroom/01-settings/_settings.edge-panel.scss +0 -24
- package/src/themes/mashroom/01-settings/_settings.fonts.scss +0 -8
- package/src/themes/mashroom/01-settings/_settings.form-group.scss +0 -14
- package/src/themes/mashroom/01-settings/_settings.form.scss +0 -6
- package/src/themes/mashroom/01-settings/_settings.grid.scss +0 -23
- package/src/themes/mashroom/01-settings/_settings.hero.scss +0 -41
- package/src/themes/mashroom/01-settings/_settings.input.scss +0 -51
- package/src/themes/mashroom/01-settings/_settings.link.scss +0 -13
- package/src/themes/mashroom/01-settings/_settings.list-group.scss +0 -16
- package/src/themes/mashroom/01-settings/_settings.list.scss +0 -13
- package/src/themes/mashroom/01-settings/_settings.masonry-grid.scss +0 -23
- package/src/themes/mashroom/01-settings/_settings.menu.scss +0 -50
- package/src/themes/mashroom/01-settings/_settings.messages.scss +0 -98
- package/src/themes/mashroom/01-settings/_settings.modal.scss +0 -41
- package/src/themes/mashroom/01-settings/_settings.nav.scss +0 -20
- package/src/themes/mashroom/01-settings/_settings.navbar.scss +0 -54
- package/src/themes/mashroom/01-settings/_settings.pagination.scss +0 -30
- package/src/themes/mashroom/01-settings/_settings.photoviewer.scss +0 -45
- package/src/themes/mashroom/01-settings/_settings.popover.scss +0 -20
- package/src/themes/mashroom/01-settings/_settings.position.scss +0 -9
- package/src/themes/mashroom/01-settings/_settings.progress.scss +0 -17
- package/src/themes/mashroom/01-settings/_settings.rating.scss +0 -11
- package/src/themes/mashroom/01-settings/_settings.river.scss +0 -50
- package/src/themes/mashroom/01-settings/_settings.sectionintro.scss +0 -31
- package/src/themes/mashroom/01-settings/_settings.select.scss +0 -47
- package/src/themes/mashroom/01-settings/_settings.side-menu.scss +0 -79
- package/src/themes/mashroom/01-settings/_settings.skeleton.scss +0 -24
- package/src/themes/mashroom/01-settings/_settings.spacing.scss +0 -66
- package/src/themes/mashroom/01-settings/_settings.spinner.scss +0 -34
- package/src/themes/mashroom/01-settings/_settings.steps.scss +0 -33
- package/src/themes/mashroom/01-settings/_settings.tabs.scss +0 -33
- package/src/themes/mashroom/01-settings/_settings.testimonials.scss +0 -24
- package/src/themes/mashroom/01-settings/_settings.todo.scss +0 -52
- package/src/themes/mashroom/01-settings/_settings.toggle.scss +0 -49
- package/src/themes/mashroom/01-settings/_settings.tooltip.scss +0 -20
- package/src/themes/mashroom/01-settings/_settings.typography.scss +0 -95
- package/src/themes/mashroom/01-settings/_settings.upload.scss +0 -96
- package/src/themes/mashroom/01-settings/_settings.z-layers.scss +0 -19
- package/src/themes/mashroom/02-tools/_index.scss +0 -8
- package/src/themes/mashroom/02-tools/_tools.psychedelic-gradients.scss +0 -78
- package/src/themes/mashroom/02-tools/_tools.trippy-effects.scss +0 -114
- package/src/themes/mashroom/03-generic/_index.scss +0 -6
- package/src/themes/mashroom/04-elements/_index.scss +0 -6
- package/src/themes/mashroom/05-objects/_index.scss +0 -6
- package/src/themes/mashroom/06-components/_components.accordion.scss +0 -187
- package/src/themes/mashroom/06-components/_components.avatar-group.scss +0 -276
- package/src/themes/mashroom/06-components/_components.avatar.scss +0 -114
- package/src/themes/mashroom/06-components/_components.badge.scss +0 -152
- package/src/themes/mashroom/06-components/_components.breadcrumb.scss +0 -162
- package/src/themes/mashroom/06-components/_components.btn-group.scss +0 -404
- package/src/themes/mashroom/06-components/_components.button.scss +0 -160
- package/src/themes/mashroom/06-components/_components.callout.scss +0 -140
- package/src/themes/mashroom/06-components/_components.card.scss +0 -225
- package/src/themes/mashroom/06-components/_components.checkbox.scss +0 -186
- package/src/themes/mashroom/06-components/_components.color-mode-toggle.scss +0 -308
- package/src/themes/mashroom/06-components/_components.countdown.scss +0 -402
- package/src/themes/mashroom/06-components/_components.data-table.scss +0 -354
- package/src/themes/mashroom/06-components/_components.datepicker.scss +0 -349
- package/src/themes/mashroom/06-components/_components.dropdown.scss +0 -334
- package/src/themes/mashroom/06-components/_components.edge-panel.scss +0 -413
- package/src/themes/mashroom/06-components/_components.form-group.scss +0 -433
- package/src/themes/mashroom/06-components/_components.form.scss +0 -358
- package/src/themes/mashroom/06-components/_components.hero.scss +0 -151
- package/src/themes/mashroom/06-components/_components.input.scss +0 -147
- package/src/themes/mashroom/06-components/_components.list-group.scss +0 -456
- package/src/themes/mashroom/06-components/_components.list.scss +0 -145
- package/src/themes/mashroom/06-components/_components.menu.scss +0 -497
- package/src/themes/mashroom/06-components/_components.messages.scss +0 -277
- package/src/themes/mashroom/06-components/_components.modal.scss +0 -264
- package/src/themes/mashroom/06-components/_components.nav.scss +0 -181
- package/src/themes/mashroom/06-components/_components.navbar.scss +0 -538
- package/src/themes/mashroom/06-components/_components.pagination.scss +0 -400
- package/src/themes/mashroom/06-components/_components.photoviewer.scss +0 -498
- package/src/themes/mashroom/06-components/_components.popover.scss +0 -383
- package/src/themes/mashroom/06-components/_components.product-review.scss +0 -408
- package/src/themes/mashroom/06-components/_components.progress.scss +0 -249
- package/src/themes/mashroom/06-components/_components.rating.scss +0 -300
- package/src/themes/mashroom/06-components/_components.river.scss +0 -570
- package/src/themes/mashroom/06-components/_components.sectionintro.scss +0 -546
- package/src/themes/mashroom/06-components/_components.select.scss +0 -455
- package/src/themes/mashroom/06-components/_components.side-menu.scss +0 -635
- package/src/themes/mashroom/06-components/_components.skeleton.scss +0 -447
- package/src/themes/mashroom/06-components/_components.slider.scss +0 -414
- package/src/themes/mashroom/06-components/_components.spinner.scss +0 -198
- package/src/themes/mashroom/06-components/_components.steps.scss +0 -350
- package/src/themes/mashroom/06-components/_components.tabs.scss +0 -269
- package/src/themes/mashroom/06-components/_components.testimonials.scss +0 -561
- package/src/themes/mashroom/06-components/_components.toggle.scss +0 -231
- package/src/themes/mashroom/06-components/_components.tooltip.scss +0 -167
- package/src/themes/mashroom/06-components/_components.upload.scss +0 -537
- package/src/themes/mashroom/06-components/_components.video-player.scss +0 -560
- package/src/themes/mashroom/06-components/_index.scss +0 -55
- package/src/themes/mashroom/99-utilities/_index.scss +0 -6
- package/src/themes/mashroom/index.scss +0 -26
- package/src/themes/shaj-default/01-settings/_index.scss +0 -69
- package/src/themes/shaj-default/01-settings/_settings.accordion.scss +0 -38
- package/src/themes/shaj-default/01-settings/_settings.animations.scss +0 -32
- package/src/themes/shaj-default/01-settings/_settings.avatar-group.scss +0 -28
- package/src/themes/shaj-default/01-settings/_settings.avatar.scss +0 -63
- package/src/themes/shaj-default/01-settings/_settings.badge.scss +0 -25
- package/src/themes/shaj-default/01-settings/_settings.border-radius.scss +0 -24
- package/src/themes/shaj-default/01-settings/_settings.border.scss +0 -20
- package/src/themes/shaj-default/01-settings/_settings.box-shadow.scss +0 -46
- package/src/themes/shaj-default/01-settings/_settings.breadcrumb.scss +0 -0
- package/src/themes/shaj-default/01-settings/_settings.breakpoints.scss +0 -23
- package/src/themes/shaj-default/01-settings/_settings.btn-group.scss +0 -11
- package/src/themes/shaj-default/01-settings/_settings.button.scss +0 -56
- package/src/themes/shaj-default/01-settings/_settings.callout.scss +0 -87
- package/src/themes/shaj-default/01-settings/_settings.card.scss +0 -52
- package/src/themes/shaj-default/01-settings/_settings.checkbox-group.scss +0 -11
- package/src/themes/shaj-default/01-settings/_settings.checkbox.scss +0 -29
- package/src/themes/shaj-default/01-settings/_settings.color-mode.scss +0 -13
- package/src/themes/shaj-default/01-settings/_settings.colors.scss +0 -91
- package/src/themes/shaj-default/01-settings/_settings.config.scss +0 -4
- package/src/themes/shaj-default/01-settings/_settings.countdown.scss +0 -26
- package/src/themes/shaj-default/01-settings/_settings.data-table.scss +0 -62
- package/src/themes/shaj-default/01-settings/_settings.datepicker.scss +0 -51
- package/src/themes/shaj-default/01-settings/_settings.design-tokens.scss +0 -9
- package/src/themes/shaj-default/01-settings/_settings.dropdown.scss +0 -51
- package/src/themes/shaj-default/01-settings/_settings.edge-panel.scss +0 -30
- package/src/themes/shaj-default/01-settings/_settings.fonts.scss +0 -13
- package/src/themes/shaj-default/01-settings/_settings.form-group.scss +0 -20
- package/src/themes/shaj-default/01-settings/_settings.form.scss +0 -12
- package/src/themes/shaj-default/01-settings/_settings.grid.scss +0 -29
- package/src/themes/shaj-default/01-settings/_settings.hero.scss +0 -47
- package/src/themes/shaj-default/01-settings/_settings.input.scss +0 -57
- package/src/themes/shaj-default/01-settings/_settings.link.scss +0 -19
- package/src/themes/shaj-default/01-settings/_settings.list-group.scss +0 -22
- package/src/themes/shaj-default/01-settings/_settings.list.scss +0 -19
- package/src/themes/shaj-default/01-settings/_settings.masonry-grid.scss +0 -29
- package/src/themes/shaj-default/01-settings/_settings.menu.scss +0 -56
- package/src/themes/shaj-default/01-settings/_settings.messages.scss +0 -104
- package/src/themes/shaj-default/01-settings/_settings.modal.scss +0 -47
- package/src/themes/shaj-default/01-settings/_settings.nav.scss +0 -26
- package/src/themes/shaj-default/01-settings/_settings.navbar.scss +0 -60
- package/src/themes/shaj-default/01-settings/_settings.pagination.scss +0 -36
- package/src/themes/shaj-default/01-settings/_settings.photoviewer.scss +0 -51
- package/src/themes/shaj-default/01-settings/_settings.popover.scss +0 -26
- package/src/themes/shaj-default/01-settings/_settings.position.scss +0 -15
- package/src/themes/shaj-default/01-settings/_settings.progress.scss +0 -23
- package/src/themes/shaj-default/01-settings/_settings.rating.scss +0 -17
- package/src/themes/shaj-default/01-settings/_settings.river.scss +0 -56
- package/src/themes/shaj-default/01-settings/_settings.sectionintro.scss +0 -37
- package/src/themes/shaj-default/01-settings/_settings.select.scss +0 -53
- package/src/themes/shaj-default/01-settings/_settings.side-menu.scss +0 -85
- package/src/themes/shaj-default/01-settings/_settings.skeleton.scss +0 -30
- package/src/themes/shaj-default/01-settings/_settings.spacing.scss +0 -72
- package/src/themes/shaj-default/01-settings/_settings.spinner.scss +0 -24
- package/src/themes/shaj-default/01-settings/_settings.steps.scss +0 -39
- package/src/themes/shaj-default/01-settings/_settings.tabs.scss +0 -39
- package/src/themes/shaj-default/01-settings/_settings.testimonials.scss +0 -30
- package/src/themes/shaj-default/01-settings/_settings.todo.scss +0 -58
- package/src/themes/shaj-default/01-settings/_settings.toggle.scss +0 -55
- package/src/themes/shaj-default/01-settings/_settings.tooltip.scss +0 -26
- package/src/themes/shaj-default/01-settings/_settings.typography.scss +0 -101
- package/src/themes/shaj-default/01-settings/_settings.upload.scss +0 -102
- package/src/themes/shaj-default/01-settings/_settings.z-layers.scss +0 -25
- package/src/themes/shaj-default/02-tools/_index.scss +0 -0
- package/src/themes/shaj-default/03-generic/_generic.root.scss +0 -0
- package/src/themes/shaj-default/03-generic/_index.scss +0 -2
- package/src/themes/shaj-default/04-elements/_index.scss +0 -0
- package/src/themes/shaj-default/05-objects/_index.scss +0 -0
- package/src/themes/shaj-default/06-components/_components.button.scss +0 -55
- package/src/themes/shaj-default/06-components/_components.card.scss +0 -57
- package/src/themes/shaj-default/06-components/_components.input.scss +0 -58
- package/src/themes/shaj-default/06-components/_components.navbar.scss +0 -99
- package/src/themes/shaj-default/06-components/_components.tooltip.scss +0 -0
- package/src/themes/shaj-default/06-components/_index.scss +0 -13
- package/src/themes/shaj-default/99-utilities/_index.scss +0 -0
- package/src/themes/shaj-default/index.scss +0 -25
- package/theme.config.ts +0 -360
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Atomix Config Loader
|
|
3
|
+
*
|
|
4
|
+
* Helper functions to load atomix.config.ts from external projects.
|
|
5
|
+
* Similar to how Tailwind loads tailwind.config.js
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { AtomixConfig } from './index';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Load Atomix configuration from project root
|
|
12
|
+
*
|
|
13
|
+
* Attempts to load atomix.config.ts from the current working directory.
|
|
14
|
+
* Falls back to default config if file doesn't exist.
|
|
15
|
+
*
|
|
16
|
+
* @param options - Loader options
|
|
17
|
+
* @returns Loaded configuration or default
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* import { loadAtomixConfig } from '@shohojdhara/atomix/config';
|
|
22
|
+
*
|
|
23
|
+
* const config = loadAtomixConfig();
|
|
24
|
+
* const theme = createThemeFromConfig(config);
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export function loadAtomixConfig(
|
|
28
|
+
options: {
|
|
29
|
+
/** Custom config path (default: 'atomix.config.ts') */
|
|
30
|
+
configPath?: string;
|
|
31
|
+
/** Whether to throw error if config not found (default: false) */
|
|
32
|
+
required?: boolean;
|
|
33
|
+
} = {}
|
|
34
|
+
): AtomixConfig {
|
|
35
|
+
const { configPath = 'atomix.config.ts', required = false } = options;
|
|
36
|
+
|
|
37
|
+
// Default config
|
|
38
|
+
const defaultConfig: AtomixConfig = {
|
|
39
|
+
prefix: 'atomix',
|
|
40
|
+
theme: {
|
|
41
|
+
extend: {},
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
// In browser environments, config loading is not supported
|
|
46
|
+
if (typeof window !== 'undefined') {
|
|
47
|
+
if (required) {
|
|
48
|
+
throw new Error('Config loading not supported in browser environment');
|
|
49
|
+
}
|
|
50
|
+
return defaultConfig;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Try to load config file
|
|
54
|
+
try {
|
|
55
|
+
// Use dynamic import for ESM compatibility
|
|
56
|
+
const configModule = require(configPath);
|
|
57
|
+
const config = configModule.default || configModule;
|
|
58
|
+
|
|
59
|
+
// Validate it's an AtomixConfig
|
|
60
|
+
if (config && typeof config === 'object') {
|
|
61
|
+
return config as AtomixConfig;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
throw new Error('Invalid config format');
|
|
65
|
+
} catch (error: any) {
|
|
66
|
+
if (required) {
|
|
67
|
+
throw new Error(`Failed to load config from ${configPath}: ${error.message}`);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Return default config if not required
|
|
71
|
+
return defaultConfig;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Resolve config path
|
|
77
|
+
*
|
|
78
|
+
* Finds atomix.config.ts in the project, checking common locations.
|
|
79
|
+
* Returns null in browser environments where file system access is not available.
|
|
80
|
+
*
|
|
81
|
+
* This function is designed to work in Node.js environments only.
|
|
82
|
+
* In browser builds, it will always return null without attempting to access Node.js modules.
|
|
83
|
+
*
|
|
84
|
+
* @internal This function uses Node.js modules and should not be called in browser environments.
|
|
85
|
+
*/
|
|
86
|
+
export function resolveConfigPath(): string | null {
|
|
87
|
+
// Early return for browser environments - prevents any Node.js module access
|
|
88
|
+
// This check happens before any require() calls, preventing bundlers from analyzing them
|
|
89
|
+
if (typeof window !== 'undefined' || typeof process === 'undefined' || !process.cwd) {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Only attempt to load Node.js modules in Node.js runtime
|
|
94
|
+
// Use a lazy-loading pattern that prevents static analysis by bundlers
|
|
95
|
+
try {
|
|
96
|
+
// Create a function that only executes in Node.js runtime
|
|
97
|
+
// Use string-based module names to prevent static analysis by bundlers
|
|
98
|
+
const loadNodeModules = () => {
|
|
99
|
+
// These requires are only executed at runtime in Node.js environments
|
|
100
|
+
// They are marked as external in Rollup config and should not be bundled
|
|
101
|
+
// Using string concatenation and computed property access to prevent static analysis
|
|
102
|
+
if (typeof require === 'undefined') {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Use a try-catch wrapper to safely access require
|
|
107
|
+
try {
|
|
108
|
+
// Build module names dynamically to prevent static analysis
|
|
109
|
+
const moduleNames: [string, string] = ['f' + 's', 'p' + 'a' + 't' + 'h'];
|
|
110
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires
|
|
111
|
+
const fs = require(moduleNames[0]);
|
|
112
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires
|
|
113
|
+
const path = require(moduleNames[1]);
|
|
114
|
+
return { fs, path };
|
|
115
|
+
} catch {
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
const modules = loadNodeModules();
|
|
121
|
+
if (!modules) {
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const { fs, path } = modules;
|
|
126
|
+
const cwd = process.cwd();
|
|
127
|
+
const possiblePaths = [
|
|
128
|
+
path.join(cwd, 'atomix.config.ts'),
|
|
129
|
+
path.join(cwd, 'atomix.config.js'),
|
|
130
|
+
path.join(cwd, 'atomix.config.mjs'),
|
|
131
|
+
];
|
|
132
|
+
|
|
133
|
+
for (const configPath of possiblePaths) {
|
|
134
|
+
if (fs.existsSync(configPath)) {
|
|
135
|
+
return configPath;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
} catch (error) {
|
|
139
|
+
// Silently fail in browser environments or when modules are unavailable
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export default loadAtomixConfig;
|
|
147
|
+
|
package/src/lib/hooks/index.ts
CHANGED
|
@@ -11,6 +11,7 @@ import type { ComponentPartsMap } from '../types/partProps';
|
|
|
11
11
|
import type { ComponentCSSVariables } from '../constants/cssVariables';
|
|
12
12
|
import { mergeCSSVars } from '../theme/cssVariableMapper';
|
|
13
13
|
import { mergePartStyles } from '../types/partProps';
|
|
14
|
+
import { mergeClassNames } from '../utils/componentUtils';
|
|
14
15
|
|
|
15
16
|
/**
|
|
16
17
|
* Component names that support customization
|
|
@@ -22,7 +23,9 @@ export type ComponentName = keyof ComponentPartsMap;
|
|
|
22
23
|
*/
|
|
23
24
|
export interface CustomizableComponentProps<T extends ComponentName> {
|
|
24
25
|
/** CSS variable overrides */
|
|
25
|
-
cssVars?:
|
|
26
|
+
cssVars?: T extends keyof ComponentCSSVariables
|
|
27
|
+
? Partial<Record<ComponentCSSVariables[T], string | number>>
|
|
28
|
+
: Record<string, string | number>;
|
|
26
29
|
/** Part-based styling */
|
|
27
30
|
parts?: ComponentPartsMap[T];
|
|
28
31
|
/** Additional className */
|
|
@@ -72,17 +75,17 @@ export function useComponentCustomization<T extends ComponentName>(
|
|
|
72
75
|
|
|
73
76
|
// Merge CSS variables
|
|
74
77
|
const cssVars = useMemo(() => {
|
|
75
|
-
const themeVars = theme?.components?.[component]?.cssVars || {};
|
|
78
|
+
const themeVars = (theme as any)?.components?.[component]?.cssVars || {};
|
|
76
79
|
const propVars = props.cssVars || {};
|
|
77
80
|
return mergeCSSVars(themeVars, propVars as any);
|
|
78
81
|
}, [theme, component, props.cssVars]);
|
|
79
82
|
|
|
80
83
|
// Merge parts
|
|
81
84
|
const parts = useMemo(() => {
|
|
82
|
-
const themeParts = theme?.components?.[component]?.parts || {};
|
|
83
|
-
const propParts = props.parts || {}
|
|
85
|
+
const themeParts = (theme as any)?.components?.[component]?.parts || {};
|
|
86
|
+
const propParts = (props.parts || {}) as Record<string, any>;
|
|
84
87
|
|
|
85
|
-
const merged: any = {};
|
|
88
|
+
const merged: Record<string, any> = {};
|
|
86
89
|
const allPartNames = new Set([
|
|
87
90
|
...Object.keys(themeParts),
|
|
88
91
|
...Object.keys(propParts),
|
|
@@ -100,7 +103,7 @@ export function useComponentCustomization<T extends ComponentName>(
|
|
|
100
103
|
|
|
101
104
|
// Merge className
|
|
102
105
|
const className = useMemo(() => {
|
|
103
|
-
const themeClassName = theme?.components?.[component]?.className || '';
|
|
106
|
+
const themeClassName = (theme as any)?.components?.[component]?.className || '';
|
|
104
107
|
const propClassName = props.className || '';
|
|
105
108
|
return [themeClassName, propClassName].filter(Boolean).join(' ');
|
|
106
109
|
}, [theme, component, props.className]);
|
|
@@ -136,7 +139,7 @@ export function useComponentDefaultProps<T extends ComponentName>(
|
|
|
136
139
|
const { theme } = useTheme();
|
|
137
140
|
|
|
138
141
|
return useMemo(() => {
|
|
139
|
-
return theme?.components?.[component]?.defaultProps || {};
|
|
142
|
+
return (theme as any)?.components?.[component]?.defaultProps || {};
|
|
140
143
|
}, [theme, component]);
|
|
141
144
|
}
|
|
142
145
|
|
|
@@ -152,13 +155,6 @@ export function useMergedProps<T extends Record<string, any>>(
|
|
|
152
155
|
}, [defaultProps, props]);
|
|
153
156
|
}
|
|
154
157
|
|
|
155
|
-
/**
|
|
156
|
-
* Utility to create className from parts
|
|
157
|
-
*/
|
|
158
|
-
export function mergeClassNames(...classNames: Array<string | undefined | null | false>): string {
|
|
159
|
-
return classNames.filter(Boolean).join(' ');
|
|
160
|
-
}
|
|
161
|
-
|
|
162
158
|
/**
|
|
163
159
|
* Utility to apply CSS variables to style object
|
|
164
160
|
*/
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Performance Monitoring Hook
|
|
3
|
+
*
|
|
4
|
+
* Tracks component render times and re-render counts
|
|
5
|
+
* for performance analysis and optimization
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { useEffect, useRef } from 'react';
|
|
9
|
+
|
|
10
|
+
export interface PerformanceMetrics {
|
|
11
|
+
/**
|
|
12
|
+
* Component name
|
|
13
|
+
*/
|
|
14
|
+
componentName: string;
|
|
15
|
+
/**
|
|
16
|
+
* Number of renders
|
|
17
|
+
*/
|
|
18
|
+
renderCount: number;
|
|
19
|
+
/**
|
|
20
|
+
* Average render time in milliseconds
|
|
21
|
+
*/
|
|
22
|
+
averageRenderTime: number;
|
|
23
|
+
/**
|
|
24
|
+
* Total render time in milliseconds
|
|
25
|
+
*/
|
|
26
|
+
totalRenderTime: number;
|
|
27
|
+
/**
|
|
28
|
+
* Maximum render time in milliseconds
|
|
29
|
+
*/
|
|
30
|
+
maxRenderTime: number;
|
|
31
|
+
/**
|
|
32
|
+
* Minimum render time in milliseconds
|
|
33
|
+
*/
|
|
34
|
+
minRenderTime: number;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Options for performance monitoring
|
|
39
|
+
*/
|
|
40
|
+
export interface UsePerformanceMonitorOptions {
|
|
41
|
+
/**
|
|
42
|
+
* Component name to track
|
|
43
|
+
*/
|
|
44
|
+
componentName: string;
|
|
45
|
+
/**
|
|
46
|
+
* Whether to log metrics to console (development only)
|
|
47
|
+
*/
|
|
48
|
+
logToConsole?: boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Threshold in milliseconds to warn about slow renders
|
|
51
|
+
*/
|
|
52
|
+
warnThreshold?: number;
|
|
53
|
+
/**
|
|
54
|
+
* Callback to report metrics (e.g., to analytics)
|
|
55
|
+
*/
|
|
56
|
+
onMetrics?: (metrics: PerformanceMetrics) => void;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Hook to monitor component performance
|
|
61
|
+
*
|
|
62
|
+
* @param options - Performance monitoring options
|
|
63
|
+
* @returns Performance metrics
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```tsx
|
|
67
|
+
* function MyComponent() {
|
|
68
|
+
* usePerformanceMonitor({
|
|
69
|
+
* componentName: 'MyComponent',
|
|
70
|
+
* warnThreshold: 16, // Warn if render takes > 16ms (1 frame)
|
|
71
|
+
* });
|
|
72
|
+
*
|
|
73
|
+
* return <div>Content</div>;
|
|
74
|
+
* }
|
|
75
|
+
* ```
|
|
76
|
+
*/
|
|
77
|
+
export function usePerformanceMonitor(options: UsePerformanceMonitorOptions) {
|
|
78
|
+
const {
|
|
79
|
+
componentName,
|
|
80
|
+
logToConsole = process.env.NODE_ENV === 'development',
|
|
81
|
+
warnThreshold = 16,
|
|
82
|
+
onMetrics,
|
|
83
|
+
} = options;
|
|
84
|
+
|
|
85
|
+
const metricsRef = useRef<PerformanceMetrics>({
|
|
86
|
+
componentName,
|
|
87
|
+
renderCount: 0,
|
|
88
|
+
averageRenderTime: 0,
|
|
89
|
+
totalRenderTime: 0,
|
|
90
|
+
maxRenderTime: 0,
|
|
91
|
+
minRenderTime: Infinity,
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
const renderStartRef = useRef<number>(0);
|
|
95
|
+
|
|
96
|
+
useEffect(() => {
|
|
97
|
+
// Start timing the render
|
|
98
|
+
renderStartRef.current = performance.now();
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
useEffect(() => {
|
|
102
|
+
// Calculate render time
|
|
103
|
+
const renderTime = performance.now() - renderStartRef.current;
|
|
104
|
+
const metrics = metricsRef.current;
|
|
105
|
+
|
|
106
|
+
// Update metrics
|
|
107
|
+
metrics.renderCount += 1;
|
|
108
|
+
metrics.totalRenderTime += renderTime;
|
|
109
|
+
metrics.averageRenderTime = metrics.totalRenderTime / metrics.renderCount;
|
|
110
|
+
metrics.maxRenderTime = Math.max(metrics.maxRenderTime, renderTime);
|
|
111
|
+
metrics.minRenderTime = Math.min(metrics.minRenderTime, renderTime);
|
|
112
|
+
|
|
113
|
+
// Warn if render is slow
|
|
114
|
+
if (renderTime > warnThreshold && logToConsole) {
|
|
115
|
+
console.warn(
|
|
116
|
+
`[Performance] ${componentName} render took ${renderTime.toFixed(2)}ms ` +
|
|
117
|
+
`(threshold: ${warnThreshold}ms)`
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Log metrics in development
|
|
122
|
+
if (logToConsole && metrics.renderCount % 10 === 0) {
|
|
123
|
+
console.log(`[Performance] ${componentName} metrics:`, {
|
|
124
|
+
renderCount: metrics.renderCount,
|
|
125
|
+
averageRenderTime: metrics.averageRenderTime.toFixed(2) + 'ms',
|
|
126
|
+
maxRenderTime: metrics.maxRenderTime.toFixed(2) + 'ms',
|
|
127
|
+
minRenderTime: metrics.minRenderTime.toFixed(2) + 'ms',
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Report metrics via callback
|
|
132
|
+
if (onMetrics) {
|
|
133
|
+
onMetrics({ ...metrics });
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
return metricsRef.current;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Get all performance metrics for all monitored components
|
|
142
|
+
* (useful for debugging and analytics)
|
|
143
|
+
*/
|
|
144
|
+
export function getPerformanceMetrics(): PerformanceMetrics[] {
|
|
145
|
+
// This would need to be implemented with a global store
|
|
146
|
+
// For now, this is a placeholder
|
|
147
|
+
return [];
|
|
148
|
+
}
|
|
149
|
+
|
package/src/lib/index.ts
CHANGED
|
@@ -11,7 +11,7 @@ export {
|
|
|
11
11
|
createSlotComponent,
|
|
12
12
|
useSlot,
|
|
13
13
|
createSlotProps,
|
|
14
|
-
} from './slots
|
|
14
|
+
} from './slots';
|
|
15
15
|
|
|
16
16
|
export type {
|
|
17
17
|
SlotProps,
|
|
@@ -32,4 +32,4 @@ export type {
|
|
|
32
32
|
DropdownRootSlotProps,
|
|
33
33
|
DropdownToggleSlotProps,
|
|
34
34
|
DropdownMenuSlotProps,
|
|
35
|
-
} from './slots
|
|
35
|
+
} from './slots';
|
|
@@ -59,7 +59,7 @@ export function renderSlot<T>(
|
|
|
59
59
|
// Priority 2: component
|
|
60
60
|
if (slotObj.component) {
|
|
61
61
|
const Component = slotObj.component;
|
|
62
|
-
return <Component {...props} />;
|
|
62
|
+
return <Component {...(props as any)} />;
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
// Priority 3: children
|
|
@@ -133,7 +133,7 @@ export function createSlotComponent<T>(
|
|
|
133
133
|
return <Element {...(props as any)}>{children}</Element>;
|
|
134
134
|
}
|
|
135
135
|
|
|
136
|
-
const Component = defaultElement
|
|
136
|
+
const Component = defaultElement as React.ComponentType<any>;
|
|
137
137
|
return <Component {...slotProps}>{children}</Component>;
|
|
138
138
|
};
|
|
139
139
|
}
|
|
@@ -33,7 +33,7 @@ export function deepMerge<T extends Record<string, any>>(...objects: Partial<T>[
|
|
|
33
33
|
if (!source) continue;
|
|
34
34
|
|
|
35
35
|
for (const key in source) {
|
|
36
|
-
if (!
|
|
36
|
+
if (!Object.prototype.hasOwnProperty.call(source, key)) continue;
|
|
37
37
|
|
|
38
38
|
const targetValue = result[key];
|
|
39
39
|
const sourceValue = source[key];
|
|
@@ -185,7 +185,6 @@ export function createThemeVariants(baseTheme: ThemeOptions): {
|
|
|
185
185
|
...baseTheme.palette,
|
|
186
186
|
background: {
|
|
187
187
|
default: '#121212',
|
|
188
|
-
paper: '#1E1E1E',
|
|
189
188
|
subtle: '#2A2A2A',
|
|
190
189
|
...baseTheme.palette?.background,
|
|
191
190
|
},
|
|
@@ -304,7 +303,6 @@ export function createThemePreset(
|
|
|
304
303
|
secondary: { main: '#FFFFFF' },
|
|
305
304
|
background: {
|
|
306
305
|
default: '#FFFFFF',
|
|
307
|
-
paper: '#F5F5F5',
|
|
308
306
|
subtle: '#FAFAFA',
|
|
309
307
|
},
|
|
310
308
|
},
|
|
@@ -319,7 +317,6 @@ export function createThemePreset(
|
|
|
319
317
|
secondary: { main: '#FF5733' },
|
|
320
318
|
background: {
|
|
321
319
|
default: '#FAFAFA',
|
|
322
|
-
paper: '#FFFFFF',
|
|
323
320
|
subtle: '#F5F5F5',
|
|
324
321
|
},
|
|
325
322
|
},
|
|
@@ -334,7 +331,6 @@ export function createThemePreset(
|
|
|
334
331
|
secondary: { main: '#DC004E' },
|
|
335
332
|
background: {
|
|
336
333
|
default: '#FFFFFF',
|
|
337
|
-
paper: '#F5F5F5',
|
|
338
334
|
subtle: '#EEEEEE',
|
|
339
335
|
},
|
|
340
336
|
},
|
|
@@ -349,7 +345,6 @@ export function createThemePreset(
|
|
|
349
345
|
secondary: { main: '#4ECDC4' },
|
|
350
346
|
background: {
|
|
351
347
|
default: '#FFF8F0',
|
|
352
|
-
paper: '#FFFFFF',
|
|
353
348
|
subtle: '#FFF0E0',
|
|
354
349
|
},
|
|
355
350
|
},
|
|
@@ -13,7 +13,9 @@ import { validateConfig } from './validator';
|
|
|
13
13
|
import { ThemeError, ThemeErrorCode, getLogger } from '../errors';
|
|
14
14
|
import {
|
|
15
15
|
DEFAULT_CONFIG_PATH,
|
|
16
|
+
DEFAULT_ATOMIX_CONFIG_PATH,
|
|
16
17
|
DEFAULT_CONFIG_RELATIVE_PATH,
|
|
18
|
+
DEFAULT_LEGACY_CONFIG_RELATIVE_PATH,
|
|
17
19
|
DEFAULT_BASE_PATH,
|
|
18
20
|
DEFAULT_STORAGE_KEY,
|
|
19
21
|
DEFAULT_DATA_ATTRIBUTE,
|
|
@@ -50,7 +52,7 @@ export function loadThemeConfig(
|
|
|
50
52
|
options: ConfigLoaderOptions = {}
|
|
51
53
|
): LoadedThemeConfig {
|
|
52
54
|
const {
|
|
53
|
-
configPath =
|
|
55
|
+
configPath = DEFAULT_ATOMIX_CONFIG_PATH,
|
|
54
56
|
validate = true,
|
|
55
57
|
env = typeof process !== 'undefined' && process.env ? (process.env.NODE_ENV === 'production' ? 'production' : 'development') : 'development',
|
|
56
58
|
} = options;
|
|
@@ -62,67 +64,99 @@ export function loadThemeConfig(
|
|
|
62
64
|
|
|
63
65
|
// Try to load config dynamically
|
|
64
66
|
let config: LoadedThemeConfig;
|
|
65
|
-
|
|
67
|
+
|
|
66
68
|
try {
|
|
67
|
-
// In browser/Vite environment, we can't load
|
|
68
|
-
// This is expected and we'll use the fallback config
|
|
69
|
+
// In browser/Vite environment, we can't load config dynamically
|
|
69
70
|
if (typeof window !== 'undefined') {
|
|
70
71
|
throw new Error('Theme config loading not supported in browser environment');
|
|
71
72
|
}
|
|
72
|
-
|
|
73
|
-
// In
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
73
|
+
|
|
74
|
+
// In ESM environments, require might be undefined.
|
|
75
|
+
let nodeRequire: any;
|
|
76
|
+
try {
|
|
77
|
+
nodeRequire = require;
|
|
78
|
+
} catch {
|
|
79
|
+
// require is not defined
|
|
77
80
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
81
|
+
|
|
82
|
+
if (!nodeRequire) {
|
|
83
|
+
throw new Error('Theme config loading not supported in this environment (require is undefined)');
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Type for config module
|
|
87
|
+
interface ConfigModule {
|
|
88
|
+
default?: any;
|
|
82
89
|
[key: string]: unknown;
|
|
83
90
|
}
|
|
84
|
-
|
|
85
|
-
let
|
|
86
|
-
|
|
87
|
-
// Try require (Node.js/CommonJS)
|
|
91
|
+
|
|
92
|
+
let configModule: ConfigModule;
|
|
93
|
+
|
|
94
|
+
// Try require (Node.js/CommonJS)
|
|
88
95
|
try {
|
|
89
|
-
// Try relative path first
|
|
96
|
+
// Try relative path first
|
|
90
97
|
try {
|
|
91
|
-
|
|
98
|
+
configModule = nodeRequire(DEFAULT_CONFIG_RELATIVE_PATH) as ConfigModule;
|
|
92
99
|
} catch {
|
|
93
|
-
//
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
100
|
+
// Try fallback to legacy relative path
|
|
101
|
+
try {
|
|
102
|
+
configModule = nodeRequire(DEFAULT_LEGACY_CONFIG_RELATIVE_PATH) as ConfigModule;
|
|
103
|
+
} catch {
|
|
104
|
+
// If relative paths fail, try to resolve from process.cwd()
|
|
105
|
+
const path = nodeRequire('path') as typeof import('path');
|
|
106
|
+
const fs = nodeRequire('fs') as typeof import('fs');
|
|
107
|
+
|
|
108
|
+
let configFilePath = path.resolve(process.cwd(), configPath);
|
|
109
|
+
|
|
110
|
+
// Fallback if atomix.config.ts not found
|
|
111
|
+
if (!fs.existsSync(configFilePath) && configPath === DEFAULT_ATOMIX_CONFIG_PATH) {
|
|
112
|
+
configFilePath = path.resolve(process.cwd(), DEFAULT_CONFIG_PATH);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
if (fs.existsSync(configFilePath)) {
|
|
116
|
+
const resolvedPath = nodeRequire.resolve(configFilePath);
|
|
117
|
+
if (nodeRequire.cache && nodeRequire.cache[resolvedPath]) {
|
|
118
|
+
delete nodeRequire.cache[resolvedPath];
|
|
119
|
+
}
|
|
120
|
+
configModule = nodeRequire(configFilePath) as ConfigModule;
|
|
121
|
+
} else {
|
|
122
|
+
throw new Error(`Config file not found: ${configFilePath}`);
|
|
104
123
|
}
|
|
105
|
-
themeConfigModule = require(configFilePath) as ThemeConfigModule;
|
|
106
|
-
} else {
|
|
107
|
-
throw new Error(`Config file not found: ${configFilePath}`);
|
|
108
124
|
}
|
|
109
125
|
}
|
|
110
126
|
} catch (requireError) {
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
? requireError.message
|
|
127
|
+
const errorMessage = requireError instanceof Error
|
|
128
|
+
? requireError.message
|
|
114
129
|
: String(requireError);
|
|
115
130
|
throw new ThemeError(
|
|
116
|
-
`Cannot load
|
|
131
|
+
`Cannot load config: ${errorMessage}`,
|
|
117
132
|
ThemeErrorCode.CONFIG_LOAD_FAILED,
|
|
118
133
|
{ configPath, error: errorMessage }
|
|
119
134
|
);
|
|
120
135
|
}
|
|
121
|
-
|
|
122
|
-
const rawConfig =
|
|
136
|
+
|
|
137
|
+
const rawConfig = configModule.default || configModule;
|
|
138
|
+
|
|
139
|
+
// Handle new AtomixConfig structure vs legacy ThemeConfig
|
|
140
|
+
let processedConfig: any;
|
|
141
|
+
if (rawConfig.theme && (rawConfig.theme.themes || rawConfig.theme.tokens || rawConfig.theme.extend)) {
|
|
142
|
+
// New AtomixConfig structure
|
|
143
|
+
processedConfig = {
|
|
144
|
+
themes: rawConfig.theme.themes || {},
|
|
145
|
+
build: rawConfig.build || {},
|
|
146
|
+
runtime: rawConfig.runtime || {},
|
|
147
|
+
integration: rawConfig.integration || {},
|
|
148
|
+
dependencies: rawConfig.dependencies || {},
|
|
149
|
+
// Store tokens for generator
|
|
150
|
+
__tokens: rawConfig.theme.tokens,
|
|
151
|
+
__extend: rawConfig.theme.extend,
|
|
152
|
+
};
|
|
153
|
+
} else {
|
|
154
|
+
// Legacy ThemeConfig structure
|
|
155
|
+
processedConfig = { ...rawConfig };
|
|
156
|
+
}
|
|
123
157
|
|
|
124
158
|
// Apply environment-specific overrides
|
|
125
|
-
|
|
159
|
+
processedConfig = applyEnvOverrides(processedConfig, env);
|
|
126
160
|
|
|
127
161
|
// Validate if requested
|
|
128
162
|
let validationResult: ConfigValidationResult | null = null;
|
|
@@ -143,7 +177,7 @@ export function loadThemeConfig(
|
|
|
143
177
|
configPath,
|
|
144
178
|
error: errorMessage,
|
|
145
179
|
});
|
|
146
|
-
|
|
180
|
+
|
|
147
181
|
config = {
|
|
148
182
|
themes: {},
|
|
149
183
|
build: {
|