@shohojdhara/atomix 0.3.14 → 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/CHANGELOG.md +20 -0
- package/build-tools/EXAMPLES.md +372 -0
- package/build-tools/README.md +242 -0
- package/build-tools/__tests__/error-handler.test.js +230 -0
- package/build-tools/__tests__/index.test.js +141 -0
- package/build-tools/__tests__/rollup-plugin.test.js +194 -0
- package/build-tools/__tests__/utils.test.js +161 -0
- package/build-tools/__tests__/vite-plugin.test.js +129 -0
- package/build-tools/__tests__/webpack-loader.test.js +190 -0
- package/build-tools/error-handler.js +308 -0
- package/build-tools/index.d.ts +44 -0
- package/build-tools/index.js +88 -0
- package/build-tools/package.json +50 -0
- package/build-tools/rollup-plugin.js +236 -0
- package/build-tools/types.d.ts +163 -0
- package/build-tools/utils.js +203 -0
- package/build-tools/vite-plugin.js +161 -0
- package/build-tools/webpack-loader.js +123 -0
- package/dist/atomix.css +21044 -2618
- package/dist/atomix.css.map +1 -1
- package/dist/atomix.min.css +77 -3
- package/dist/atomix.min.css.map +1 -1
- package/dist/build-tools/EXAMPLES.md +372 -0
- package/dist/build-tools/README.md +242 -0
- package/dist/build-tools/__tests__/error-handler.test.js +230 -0
- package/dist/build-tools/__tests__/index.test.js +141 -0
- package/dist/build-tools/__tests__/rollup-plugin.test.js +194 -0
- package/dist/build-tools/__tests__/utils.test.js +161 -0
- package/dist/build-tools/__tests__/vite-plugin.test.js +129 -0
- package/dist/build-tools/__tests__/webpack-loader.test.js +190 -0
- package/dist/build-tools/error-handler.js +308 -0
- package/dist/build-tools/index.d.ts +44 -0
- package/dist/build-tools/index.js +88 -0
- package/dist/build-tools/package.json +50 -0
- package/dist/build-tools/rollup-plugin.js +236 -0
- package/dist/build-tools/types.d.ts +163 -0
- package/dist/build-tools/utils.js +203 -0
- package/dist/build-tools/vite-plugin.js +161 -0
- package/dist/build-tools/webpack-loader.js +123 -0
- package/dist/charts.d.ts +1 -1
- package/dist/charts.js +86 -57
- package/dist/charts.js.map +1 -1
- package/dist/core.d.ts +1 -1
- package/dist/core.js +136 -112
- package/dist/core.js.map +1 -1
- package/dist/forms.d.ts +2 -5
- package/dist/forms.js +140 -128
- package/dist/forms.js.map +1 -1
- package/dist/heavy.d.ts +1 -1
- package/dist/heavy.js +136 -112
- package/dist/heavy.js.map +1 -1
- package/dist/index.d.ts +152 -78
- package/dist/index.esm.js +346 -340
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +359 -353
- 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 +23 -8
- package/scripts/atomix-cli.js +170 -73
- package/scripts/cli/__tests__/README.md +81 -0
- package/scripts/cli/__tests__/basic.test.js +115 -0
- package/scripts/cli/__tests__/component-generator.test.js +332 -0
- package/scripts/cli/__tests__/integration.test.js +327 -0
- package/scripts/cli/__tests__/test-setup.js +133 -0
- package/scripts/cli/__tests__/token-manager.test.js +251 -0
- package/scripts/cli/__tests__/utils.test.js +161 -0
- package/scripts/cli/component-generator.js +253 -299
- package/scripts/cli/dependency-checker.js +355 -0
- package/scripts/cli/interactive-init.js +46 -5
- package/scripts/cli/template-manager.js +0 -2
- package/scripts/cli/templates/common-templates.js +636 -0
- package/scripts/cli/templates/composable-templates.js +148 -126
- package/scripts/cli/templates/index.js +23 -16
- package/scripts/cli/templates/project-templates.js +151 -23
- package/scripts/cli/templates/react-templates.js +280 -210
- package/scripts/cli/templates/scss-templates.js +90 -91
- package/scripts/cli/templates/testing-templates.js +206 -27
- package/scripts/cli/templates/testing-utils.js +278 -0
- package/scripts/cli/templates/types-templates.js +70 -56
- package/scripts/cli/theme-bridge.js +8 -2
- package/scripts/cli/token-manager.js +318 -206
- package/scripts/cli/utils.js +0 -1
- package/src/components/Accordion/Accordion.stories.tsx +358 -850
- 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/AtomixGlass.tsx +80 -39
- package/src/components/AtomixGlass/AtomixGlassContainer.tsx +103 -81
- package/src/components/AtomixGlass/GlassFilter.tsx +9 -16
- package/src/components/AtomixGlass/__snapshots__/AtomixGlass.test.tsx.snap +8 -7
- package/src/components/AtomixGlass/glass-utils.ts +6 -5
- package/src/components/AtomixGlass/shader-utils.ts +133 -52
- package/src/components/AtomixGlass/stories/Customization.stories.tsx +131 -0
- package/src/components/AtomixGlass/stories/Examples.stories.tsx +2957 -2853
- package/src/components/AtomixGlass/stories/Modes.stories.tsx +1 -1
- package/src/components/AtomixGlass/stories/Overview.stories.tsx +348 -0
- package/src/components/AtomixGlass/stories/Performance.stories.tsx +103 -0
- package/src/components/AtomixGlass/stories/Playground.stories.tsx +51 -36
- package/src/components/AtomixGlass/stories/{ShaderVariants.stories.tsx → Shaders.stories.tsx} +2 -2
- package/src/components/AtomixGlass/stories/shared-components.tsx +90 -190
- package/src/components/Avatar/Avatar.stories.tsx +195 -0
- package/src/components/Avatar/Avatar.tsx +58 -56
- package/src/components/Badge/Badge.stories.tsx +122 -352
- package/src/components/Badge/Badge.test.tsx +41 -41
- package/src/components/Badge/Badge.tsx +64 -62
- package/src/components/Block/Block.stories.tsx +30 -11
- package/src/components/Breadcrumb/Breadcrumb.stories.tsx +142 -23
- package/src/components/Breadcrumb/Breadcrumb.tsx +62 -60
- package/src/components/Button/Button.stories.tsx +454 -1126
- package/src/components/Button/Button.test.tsx +123 -0
- package/src/components/Button/Button.tsx +88 -60
- package/src/components/Button/ButtonGroup.stories.tsx +376 -215
- package/src/components/Button/ButtonGroup.tsx +4 -15
- package/src/components/Callout/Callout.stories.tsx +316 -568
- package/src/components/Card/Card.stories.tsx +292 -81
- 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 +153 -16
- 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 +152 -66
- package/src/components/ColorModeToggle/ColorModeToggle.tsx +15 -3
- package/src/components/Countdown/Countdown.stories.tsx +114 -7
- package/src/components/DataTable/DataTable.stories.tsx +349 -144
- package/src/components/DataTable/DataTable.test.tsx +26 -148
- package/src/components/DataTable/DataTable.tsx +485 -456
- package/src/components/DatePicker/DatePicker.stories.tsx +310 -1066
- package/src/components/DatePicker/DatePicker.tsx +31 -26
- package/src/components/Dropdown/Dropdown.stories.tsx +153 -36
- package/src/components/Dropdown/Dropdown.tsx +313 -299
- package/src/components/EdgePanel/EdgePanel.stories.tsx +221 -25
- package/src/components/EdgePanel/EdgePanel.tsx +1 -3
- package/src/components/Footer/Footer.stories.tsx +396 -327
- package/src/components/Footer/Footer.tsx +130 -128
- package/src/components/Footer/FooterLink.tsx +2 -2
- package/src/components/Form/Checkbox.stories.tsx +140 -6
- package/src/components/Form/Checkbox.test.tsx +63 -0
- package/src/components/Form/Checkbox.tsx +122 -78
- package/src/components/Form/Form.stories.tsx +110 -19
- package/src/components/Form/FormGroup.stories.tsx +127 -4
- 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 +146 -17
- package/src/components/Form/Radio.tsx +68 -66
- package/src/components/Form/Select.stories.tsx +140 -8
- package/src/components/Form/Select.tsx +184 -182
- package/src/components/Form/Textarea.stories.tsx +149 -6
- package/src/components/Form/Textarea.test.tsx +27 -32
- package/src/components/Hero/Hero.stories.tsx +372 -38
- package/src/components/Hero/Hero.tsx +201 -55
- package/src/components/Icon/index.ts +7 -1
- package/src/components/List/List.stories.tsx +141 -3
- package/src/components/List/List.tsx +19 -23
- package/src/components/Modal/Modal.stories.tsx +183 -43
- 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 +354 -97
- package/src/components/Popover/Popover.tsx +41 -37
- package/src/components/Progress/Progress.stories.tsx +160 -7
- package/src/components/River/River.stories.tsx +3 -2
- package/src/components/SectionIntro/SectionIntro.stories.tsx +239 -47
- package/src/components/Slider/Slider.stories.tsx +12 -4
- package/src/components/Spinner/Spinner.stories.tsx +104 -8
- package/src/components/Spinner/Spinner.test.tsx +23 -23
- package/src/components/Spinner/Spinner.tsx +43 -46
- package/src/components/Steps/Steps.stories.tsx +173 -42
- package/src/components/Tabs/Tabs.stories.tsx +141 -12
- package/src/components/Tabs/Tabs.tsx +74 -72
- package/src/components/Testimonial/Testimonial.stories.tsx +120 -3
- package/src/components/Todo/Todo.stories.tsx +198 -9
- package/src/components/Toggle/Toggle.stories.tsx +137 -36
- package/src/components/Toggle/Toggle.test.tsx +65 -70
- package/src/components/Toggle/Toggle.tsx +4 -1
- package/src/components/Tooltip/Tooltip.stories.tsx +194 -100
- package/src/components/Tooltip/Tooltip.tsx +104 -106
- package/src/components/Upload/Upload.stories.tsx +241 -150
- 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/README.md +2 -2
- package/src/lib/__tests__/theme-tools.test.ts +219 -0
- package/src/lib/composables/index.ts +2 -2
- package/src/lib/composables/shared-mouse-tracker.ts +13 -14
- package/src/lib/composables/useAtomixGlass.ts +126 -97
- package/src/lib/composables/useChartExport.ts +3 -8
- package/src/lib/composables/useDataTable.ts +72 -43
- 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/components.ts +9 -32
- 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 +107 -105
- 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 +45 -0
- package/src/lib/utils/componentUtils.ts +8 -12
- package/src/lib/utils/csv.ts +19 -0
- package/src/lib/utils/dataTableExport.ts +2 -15
- 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 +1 -1
- package/src/styles/01-settings/_settings.accordion.scss +28 -7
- package/src/styles/01-settings/_settings.colors.scss +11 -11
- 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 +4 -4
- package/src/styles/02-tools/_tools.button.scss +51 -21
- package/src/styles/02-tools/_tools.utility-api.scss +38 -12
- package/src/styles/03-generic/_generic.root.scss +4 -3
- package/src/styles/06-components/_components.accordion.scss +56 -14
- 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 +25 -17
- 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/_index.scss +2 -0
- 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 +2 -0
- 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 +45 -0
- package/src/styles/99-utilities/_utilities.text.scss +67 -46
- package/themes/dark-complementary/README.md +98 -0
- package/themes/dark-complementary/index.scss +158 -0
- package/themes/default-light/README.md +81 -0
- package/themes/default-light/index.scss +154 -0
- package/themes/high-contrast/README.md +105 -0
- package/themes/high-contrast/index.scss +172 -0
- package/themes/test-theme/README.md +38 -0
- package/themes/test-theme/index.scss +47 -0
- package/scripts/cli/templates-original-backup.js +0 -1655
- package/scripts/cli/templates_backup.js +0 -684
- package/src/components/AtomixGlass/stories/AtomixGlass.stories.tsx +0 -1438
- package/src/lib/composables/useButton.ts +0 -93
- package/src/lib/composables/useCheckbox.ts +0 -70
|
@@ -1,18 +1,90 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import type { Meta, StoryObj } from '@storybook/react';
|
|
3
|
+
import { fn } from '@storybook/test';
|
|
3
4
|
import { Popover, PopoverTrigger } from './Popover';
|
|
4
5
|
import { Toggle } from '../Toggle/Toggle';
|
|
5
6
|
import { Button } from '../Button/Button';
|
|
6
7
|
|
|
7
|
-
const meta = {
|
|
8
|
+
const meta: Meta<typeof Popover> = {
|
|
8
9
|
title: 'Components/Popover',
|
|
9
10
|
component: Popover,
|
|
10
11
|
parameters: {
|
|
11
12
|
layout: 'fullscreen',
|
|
12
13
|
docs: {
|
|
13
14
|
description: {
|
|
14
|
-
component:
|
|
15
|
-
|
|
15
|
+
component: `
|
|
16
|
+
# Popover
|
|
17
|
+
|
|
18
|
+
## Overview
|
|
19
|
+
|
|
20
|
+
Popover displays floating content relative to a trigger element. It provides a flexible way to show additional information, actions, or controls without navigating away from the current context. Popovers support multiple positions, click or hover triggers, and can include rich interactive content.
|
|
21
|
+
|
|
22
|
+
## Features
|
|
23
|
+
|
|
24
|
+
- Multiple position options (top, bottom, left, right, auto)
|
|
25
|
+
- Click or hover triggers
|
|
26
|
+
- Configurable delays and offsets
|
|
27
|
+
- Click outside and escape key closing
|
|
28
|
+
- Glass morphism effect
|
|
29
|
+
- Rich content support
|
|
30
|
+
- Accessible design
|
|
31
|
+
- Responsive behavior
|
|
32
|
+
|
|
33
|
+
## Accessibility
|
|
34
|
+
|
|
35
|
+
- Keyboard support: Navigate and activate with keyboard
|
|
36
|
+
- Screen reader: Popover content and purpose announced appropriately
|
|
37
|
+
- ARIA support: Proper roles and properties for popover components
|
|
38
|
+
- Focus management: Traps focus within the popover when open
|
|
39
|
+
|
|
40
|
+
## Usage Examples
|
|
41
|
+
|
|
42
|
+
### Basic Usage
|
|
43
|
+
|
|
44
|
+
\`\`\`tsx
|
|
45
|
+
<Popover
|
|
46
|
+
position="top"
|
|
47
|
+
trigger="click"
|
|
48
|
+
>
|
|
49
|
+
<PopoverTrigger>
|
|
50
|
+
<button>Trigger</button>
|
|
51
|
+
</PopoverTrigger>
|
|
52
|
+
<div>Popover content</div>
|
|
53
|
+
</Popover>
|
|
54
|
+
\`\`\`
|
|
55
|
+
|
|
56
|
+
### With Configuration
|
|
57
|
+
|
|
58
|
+
\`\`\`tsx
|
|
59
|
+
<Popover
|
|
60
|
+
position="right"
|
|
61
|
+
trigger="hover"
|
|
62
|
+
delay={200}
|
|
63
|
+
offset={10}
|
|
64
|
+
>
|
|
65
|
+
<PopoverTrigger>
|
|
66
|
+
<button>Trigger</button>
|
|
67
|
+
</PopoverTrigger>
|
|
68
|
+
<div>Popover content</div>
|
|
69
|
+
</Popover>
|
|
70
|
+
\`\`\`
|
|
71
|
+
|
|
72
|
+
## API Reference
|
|
73
|
+
|
|
74
|
+
### Props
|
|
75
|
+
|
|
76
|
+
| Prop | Type | Default | Description |
|
|
77
|
+
| ---- | ---- | ------- | ----------- |
|
|
78
|
+
| position | 'top' \\| 'bottom' \\| 'left' \\| 'right' \\| 'auto' | 'top' | Position of the popover relative to the trigger |
|
|
79
|
+
| trigger | 'click' \\| 'hover' | 'click' | How the popover is triggered |
|
|
80
|
+
| delay | number | 0 | Delay in milliseconds before showing the popover |
|
|
81
|
+
| offset | number | 12 | Offset distance from the trigger element |
|
|
82
|
+
| defaultOpen | boolean | false | Whether the popover is initially open |
|
|
83
|
+
| closeOnClickOutside | boolean | true | Whether to close the popover when clicking outside |
|
|
84
|
+
| closeOnEscape | boolean | true | Whether to close the popover when pressing Escape key |
|
|
85
|
+
| glass | boolean | false | Enable glass morphism effect |
|
|
86
|
+
| className | string | - | Additional CSS classes for the component |
|
|
87
|
+
`,
|
|
16
88
|
},
|
|
17
89
|
},
|
|
18
90
|
},
|
|
@@ -21,42 +93,79 @@ const meta = {
|
|
|
21
93
|
position: {
|
|
22
94
|
control: { type: 'select' },
|
|
23
95
|
options: ['top', 'bottom', 'left', 'right', 'auto'],
|
|
24
|
-
|
|
96
|
+
description: 'Position of the popover relative to the trigger',
|
|
97
|
+
table: {
|
|
98
|
+
type: { summary: '"top" | "bottom" | "left" | "right" | "auto"' },
|
|
99
|
+
defaultValue: { summary: 'top' },
|
|
100
|
+
},
|
|
25
101
|
},
|
|
26
102
|
trigger: {
|
|
27
103
|
control: { type: 'select' },
|
|
28
104
|
options: ['click', 'hover'],
|
|
29
|
-
|
|
105
|
+
description: 'How the popover is triggered',
|
|
106
|
+
table: {
|
|
107
|
+
type: { summary: '"click" | "hover"' },
|
|
108
|
+
defaultValue: { summary: 'click' },
|
|
109
|
+
},
|
|
30
110
|
},
|
|
31
111
|
delay: {
|
|
32
112
|
control: { type: 'number' },
|
|
33
|
-
|
|
113
|
+
description: 'Delay in milliseconds before showing the popover',
|
|
114
|
+
table: {
|
|
115
|
+
type: { summary: 'number' },
|
|
116
|
+
defaultValue: { summary: '0' },
|
|
117
|
+
},
|
|
34
118
|
},
|
|
35
119
|
offset: {
|
|
36
120
|
control: { type: 'number' },
|
|
37
|
-
|
|
121
|
+
description: 'Offset distance from the trigger element',
|
|
122
|
+
table: {
|
|
123
|
+
type: { summary: 'number' },
|
|
124
|
+
defaultValue: { summary: '12' },
|
|
125
|
+
},
|
|
38
126
|
},
|
|
39
127
|
defaultOpen: {
|
|
40
128
|
control: { type: 'boolean' },
|
|
41
|
-
|
|
129
|
+
description: 'Whether the popover is initially open',
|
|
130
|
+
table: {
|
|
131
|
+
type: { summary: 'boolean' },
|
|
132
|
+
defaultValue: { summary: 'false' },
|
|
133
|
+
},
|
|
42
134
|
},
|
|
43
135
|
closeOnClickOutside: {
|
|
44
136
|
control: { type: 'boolean' },
|
|
45
|
-
|
|
137
|
+
description: 'Whether to close the popover when clicking outside',
|
|
138
|
+
table: {
|
|
139
|
+
type: { summary: 'boolean' },
|
|
140
|
+
defaultValue: { summary: 'true' },
|
|
141
|
+
},
|
|
46
142
|
},
|
|
47
143
|
closeOnEscape: {
|
|
48
144
|
control: { type: 'boolean' },
|
|
49
|
-
|
|
145
|
+
description: 'Whether to close the popover when pressing Escape key',
|
|
146
|
+
table: {
|
|
147
|
+
type: { summary: 'boolean' },
|
|
148
|
+
defaultValue: { summary: 'true' },
|
|
149
|
+
},
|
|
50
150
|
},
|
|
51
151
|
className: {
|
|
52
152
|
control: { type: 'text' },
|
|
153
|
+
description: 'Additional CSS classes for the component',
|
|
154
|
+
table: {
|
|
155
|
+
type: { summary: 'string' },
|
|
156
|
+
defaultValue: { summary: '-' },
|
|
157
|
+
},
|
|
53
158
|
},
|
|
54
159
|
glass: {
|
|
55
160
|
control: { type: 'boolean' },
|
|
56
161
|
description: 'Enable glass morphism effect',
|
|
162
|
+
table: {
|
|
163
|
+
type: { summary: 'boolean' },
|
|
164
|
+
defaultValue: { summary: 'false' },
|
|
165
|
+
},
|
|
57
166
|
},
|
|
58
167
|
},
|
|
59
|
-
}
|
|
168
|
+
};
|
|
60
169
|
|
|
61
170
|
export default meta;
|
|
62
171
|
type Story = StoryObj<typeof meta>;
|
|
@@ -103,101 +212,125 @@ const InteractivePopover = (args: React.ComponentProps<typeof Popover>) => {
|
|
|
103
212
|
);
|
|
104
213
|
|
|
105
214
|
return (
|
|
106
|
-
<div
|
|
107
|
-
style={{ padding: '80px', display: 'flex', justifyContent: 'center', background: '#f5f5f5' }}
|
|
108
|
-
>
|
|
215
|
+
<div style={{ display: 'flex', justifyContent: 'center', padding: '100px' }}>
|
|
109
216
|
<Popover {...args} content={content}>
|
|
110
|
-
<PopoverTrigger
|
|
111
|
-
<Button variant="primary"
|
|
217
|
+
<PopoverTrigger>
|
|
218
|
+
<Button variant="primary">Open Popover</Button>
|
|
112
219
|
</PopoverTrigger>
|
|
113
220
|
</Popover>
|
|
114
221
|
</div>
|
|
115
222
|
);
|
|
116
223
|
};
|
|
117
224
|
|
|
118
|
-
export const
|
|
119
|
-
render: args => <InteractivePopover {...args} />,
|
|
225
|
+
export const BasicUsage: Story = {
|
|
226
|
+
render: args => <InteractivePopover {...args} content={undefined} />,
|
|
120
227
|
args: {
|
|
121
228
|
position: 'top',
|
|
122
229
|
trigger: 'click',
|
|
123
|
-
offset: 12,
|
|
124
|
-
delay: 0,
|
|
125
|
-
defaultOpen: false,
|
|
126
230
|
closeOnClickOutside: true,
|
|
127
231
|
closeOnEscape: true,
|
|
128
|
-
}
|
|
232
|
+
},
|
|
233
|
+
parameters: {
|
|
234
|
+
docs: {
|
|
235
|
+
description: {
|
|
236
|
+
story: 'Basic popover with top position and click trigger.',
|
|
237
|
+
},
|
|
238
|
+
},
|
|
239
|
+
},
|
|
129
240
|
};
|
|
130
241
|
|
|
131
|
-
export const
|
|
132
|
-
render:
|
|
133
|
-
|
|
134
|
-
position: 'top',
|
|
135
|
-
trigger: 'hover',
|
|
136
|
-
offset: 12,
|
|
137
|
-
delay: 200,
|
|
138
|
-
defaultOpen: false,
|
|
139
|
-
closeOnClickOutside: true,
|
|
140
|
-
closeOnEscape: true,
|
|
141
|
-
} as any,
|
|
142
|
-
};
|
|
242
|
+
export const AllPositions: Story = {
|
|
243
|
+
render: () => {
|
|
244
|
+
const content = <div style={{ padding: '20px' }}>Popover Content</div>;
|
|
143
245
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
}
|
|
246
|
+
return (
|
|
247
|
+
<div
|
|
248
|
+
style={{
|
|
249
|
+
display: 'flex',
|
|
250
|
+
justifyContent: 'center',
|
|
251
|
+
gap: '20px',
|
|
252
|
+
padding: '50px',
|
|
253
|
+
alignItems: 'center',
|
|
254
|
+
height: '300px',
|
|
255
|
+
}}
|
|
256
|
+
>
|
|
257
|
+
<Popover position="left" content={content}>
|
|
258
|
+
<PopoverTrigger>
|
|
259
|
+
<Button variant="primary">Left</Button>
|
|
260
|
+
</PopoverTrigger>
|
|
261
|
+
</Popover>
|
|
156
262
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
offset: 12,
|
|
163
|
-
delay: 0,
|
|
164
|
-
defaultOpen: false,
|
|
165
|
-
closeOnClickOutside: true,
|
|
166
|
-
closeOnEscape: true,
|
|
167
|
-
} as any,
|
|
168
|
-
};
|
|
263
|
+
<Popover position="top" content={content}>
|
|
264
|
+
<PopoverTrigger>
|
|
265
|
+
<Button variant="primary">Top</Button>
|
|
266
|
+
</PopoverTrigger>
|
|
267
|
+
</Popover>
|
|
169
268
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
269
|
+
<Popover position="bottom" content={content}>
|
|
270
|
+
<PopoverTrigger>
|
|
271
|
+
<Button variant="primary">Bottom</Button>
|
|
272
|
+
</PopoverTrigger>
|
|
273
|
+
</Popover>
|
|
274
|
+
|
|
275
|
+
<Popover position="right" content={content}>
|
|
276
|
+
<PopoverTrigger>
|
|
277
|
+
<Button variant="primary">Right</Button>
|
|
278
|
+
</PopoverTrigger>
|
|
279
|
+
</Popover>
|
|
280
|
+
</div>
|
|
281
|
+
);
|
|
282
|
+
},
|
|
283
|
+
parameters: {
|
|
284
|
+
docs: {
|
|
285
|
+
description: {
|
|
286
|
+
story: 'All available popover positions demonstrated.',
|
|
287
|
+
},
|
|
288
|
+
},
|
|
289
|
+
},
|
|
181
290
|
};
|
|
182
291
|
|
|
183
|
-
export const
|
|
184
|
-
render: args =>
|
|
292
|
+
export const WithGlassEffect: Story = {
|
|
293
|
+
render: args => (
|
|
294
|
+
<div
|
|
295
|
+
style={{
|
|
296
|
+
display: 'flex',
|
|
297
|
+
justifyContent: 'center',
|
|
298
|
+
padding: '100px',
|
|
299
|
+
background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
|
|
300
|
+
minHeight: '300px',
|
|
301
|
+
}}
|
|
302
|
+
>
|
|
303
|
+
<Popover
|
|
304
|
+
{...args}
|
|
305
|
+
content={<div style={{ padding: '20px' }}>Glass Effect Popover Content</div>}
|
|
306
|
+
>
|
|
307
|
+
<PopoverTrigger>
|
|
308
|
+
<Button variant="primary">Open Glass Popover</Button>
|
|
309
|
+
</PopoverTrigger>
|
|
310
|
+
</Popover>
|
|
311
|
+
</div>
|
|
312
|
+
),
|
|
185
313
|
args: {
|
|
186
|
-
position: '
|
|
314
|
+
position: 'top',
|
|
187
315
|
trigger: 'click',
|
|
188
|
-
|
|
189
|
-
delay: 0,
|
|
190
|
-
defaultOpen: true, // Open by default to showcase auto-positioning
|
|
316
|
+
glass: true,
|
|
191
317
|
closeOnClickOutside: true,
|
|
192
318
|
closeOnEscape: true,
|
|
193
|
-
}
|
|
319
|
+
},
|
|
320
|
+
parameters: {
|
|
321
|
+
docs: {
|
|
322
|
+
description: {
|
|
323
|
+
story: 'Popover with glass morphism effect applied.',
|
|
324
|
+
},
|
|
325
|
+
},
|
|
326
|
+
},
|
|
194
327
|
};
|
|
195
328
|
|
|
196
329
|
/**
|
|
197
330
|
* Glass morphism popover example.
|
|
198
331
|
*/
|
|
199
332
|
export const GlassPopover: Story = {
|
|
200
|
-
render: args => <InteractivePopover {...args} />,
|
|
333
|
+
render: args => <InteractivePopover {...args} content={undefined} />,
|
|
201
334
|
args: {
|
|
202
335
|
position: 'top',
|
|
203
336
|
trigger: 'click',
|
|
@@ -227,7 +360,56 @@ export const GlassPopover: Story = {
|
|
|
227
360
|
* Glass popover with custom settings.
|
|
228
361
|
*/
|
|
229
362
|
export const GlassPopoverCustom: Story = {
|
|
230
|
-
render: args =>
|
|
363
|
+
render: args => {
|
|
364
|
+
const selectOptions = [
|
|
365
|
+
{ value: '1', label: 'Option 1' },
|
|
366
|
+
{ value: '2', label: 'Option 2' },
|
|
367
|
+
{ value: '3', label: 'Option 3' },
|
|
368
|
+
{ value: '4', label: 'Option 4' },
|
|
369
|
+
];
|
|
370
|
+
|
|
371
|
+
const [selectedOption, setSelectedOption] = React.useState('1');
|
|
372
|
+
const [showInternalOnly, setShowInternalOnly] = React.useState(false);
|
|
373
|
+
|
|
374
|
+
const handleSelectChange = (e: React.ChangeEvent<HTMLSelectElement>) => {
|
|
375
|
+
setSelectedOption(e.target.value);
|
|
376
|
+
};
|
|
377
|
+
|
|
378
|
+
const handleToggleChange = () => {
|
|
379
|
+
setShowInternalOnly(!showInternalOnly);
|
|
380
|
+
};
|
|
381
|
+
|
|
382
|
+
const content = (
|
|
383
|
+
<>
|
|
384
|
+
<div className="u-flex u-items-center u-gap-7">
|
|
385
|
+
<span className="u-text-nowrap">Sort by</span>
|
|
386
|
+
<div className="c-select">
|
|
387
|
+
<select value={selectedOption} onChange={handleSelectChange}>
|
|
388
|
+
{selectOptions.map(option => (
|
|
389
|
+
<option key={option.value} value={option.value}>
|
|
390
|
+
{option.label}
|
|
391
|
+
</option>
|
|
392
|
+
))}
|
|
393
|
+
</select>
|
|
394
|
+
</div>
|
|
395
|
+
</div>
|
|
396
|
+
<div className="c-toggle" onClick={handleToggleChange}>
|
|
397
|
+
<div className="c-toggle__label">Show internal comments only</div>
|
|
398
|
+
<div className="c-toggle__switch"></div>
|
|
399
|
+
</div>
|
|
400
|
+
</>
|
|
401
|
+
);
|
|
402
|
+
|
|
403
|
+
return (
|
|
404
|
+
<div style={{ display: 'flex', justifyContent: 'center', padding: '100px' }}>
|
|
405
|
+
<Popover {...args} content={content}>
|
|
406
|
+
<PopoverTrigger>
|
|
407
|
+
<Button variant="primary">Open Popover</Button>
|
|
408
|
+
</PopoverTrigger>
|
|
409
|
+
</Popover>
|
|
410
|
+
</div>
|
|
411
|
+
);
|
|
412
|
+
},
|
|
231
413
|
args: {
|
|
232
414
|
position: 'top',
|
|
233
415
|
trigger: 'click',
|
|
@@ -244,7 +426,7 @@ export const GlassPopoverCustom: Story = {
|
|
|
244
426
|
cornerRadius: 16,
|
|
245
427
|
mode: 'polar',
|
|
246
428
|
} as any,
|
|
247
|
-
}
|
|
429
|
+
},
|
|
248
430
|
decorators: [
|
|
249
431
|
Story => (
|
|
250
432
|
<div
|
|
@@ -264,7 +446,56 @@ export const GlassPopoverCustom: Story = {
|
|
|
264
446
|
* Glass popover with hover trigger.
|
|
265
447
|
*/
|
|
266
448
|
export const GlassPopoverHover: Story = {
|
|
267
|
-
render: args =>
|
|
449
|
+
render: args => {
|
|
450
|
+
const selectOptions = [
|
|
451
|
+
{ value: '1', label: 'Option 1' },
|
|
452
|
+
{ value: '2', label: 'Option 2' },
|
|
453
|
+
{ value: '3', label: 'Option 3' },
|
|
454
|
+
{ value: '4', label: 'Option 4' },
|
|
455
|
+
];
|
|
456
|
+
|
|
457
|
+
const [selectedOption, setSelectedOption] = React.useState('1');
|
|
458
|
+
const [showInternalOnly, setShowInternalOnly] = React.useState(false);
|
|
459
|
+
|
|
460
|
+
const handleSelectChange = (e: React.ChangeEvent<HTMLSelectElement>) => {
|
|
461
|
+
setSelectedOption(e.target.value);
|
|
462
|
+
};
|
|
463
|
+
|
|
464
|
+
const handleToggleChange = () => {
|
|
465
|
+
setShowInternalOnly(!showInternalOnly);
|
|
466
|
+
};
|
|
467
|
+
|
|
468
|
+
const content = (
|
|
469
|
+
<>
|
|
470
|
+
<div className="u-flex u-items-center u-gap-7">
|
|
471
|
+
<span className="u-text-nowrap">Sort by</span>
|
|
472
|
+
<div className="c-select">
|
|
473
|
+
<select value={selectedOption} onChange={handleSelectChange}>
|
|
474
|
+
{selectOptions.map(option => (
|
|
475
|
+
<option key={option.value} value={option.value}>
|
|
476
|
+
{option.label}
|
|
477
|
+
</option>
|
|
478
|
+
))}
|
|
479
|
+
</select>
|
|
480
|
+
</div>
|
|
481
|
+
</div>
|
|
482
|
+
<div className="c-toggle" onClick={handleToggleChange}>
|
|
483
|
+
<div className="c-toggle__label">Show internal comments only</div>
|
|
484
|
+
<div className="c-toggle__switch"></div>
|
|
485
|
+
</div>
|
|
486
|
+
</>
|
|
487
|
+
);
|
|
488
|
+
|
|
489
|
+
return (
|
|
490
|
+
<div style={{ display: 'flex', justifyContent: 'center', padding: '100px' }}>
|
|
491
|
+
<Popover {...args} content={content}>
|
|
492
|
+
<PopoverTrigger>
|
|
493
|
+
<Button variant="primary">Open Popover</Button>
|
|
494
|
+
</PopoverTrigger>
|
|
495
|
+
</Popover>
|
|
496
|
+
</div>
|
|
497
|
+
);
|
|
498
|
+
},
|
|
268
499
|
args: {
|
|
269
500
|
position: 'top',
|
|
270
501
|
trigger: 'hover',
|
|
@@ -274,7 +505,7 @@ export const GlassPopoverHover: Story = {
|
|
|
274
505
|
closeOnClickOutside: true,
|
|
275
506
|
closeOnEscape: true,
|
|
276
507
|
glass: true,
|
|
277
|
-
}
|
|
508
|
+
},
|
|
278
509
|
decorators: [
|
|
279
510
|
Story => (
|
|
280
511
|
<div
|
|
@@ -294,9 +525,48 @@ export const GlassPopoverHover: Story = {
|
|
|
294
525
|
* Glass popover with different positions.
|
|
295
526
|
*/
|
|
296
527
|
export const GlassPopoverPositions: Story = {
|
|
297
|
-
render: args =>
|
|
528
|
+
render: args => {
|
|
529
|
+
const content = <div style={{ padding: '20px' }}>Popover Content</div>;
|
|
530
|
+
|
|
531
|
+
return (
|
|
532
|
+
<div
|
|
533
|
+
style={{
|
|
534
|
+
display: 'flex',
|
|
535
|
+
justifyContent: 'center',
|
|
536
|
+
gap: '20px',
|
|
537
|
+
padding: '50px',
|
|
538
|
+
alignItems: 'center',
|
|
539
|
+
height: '300px',
|
|
540
|
+
background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
|
|
541
|
+
}}
|
|
542
|
+
>
|
|
543
|
+
<Popover {...args} position="left" content={content}>
|
|
544
|
+
<PopoverTrigger>
|
|
545
|
+
<Button variant="primary">Left</Button>
|
|
546
|
+
</PopoverTrigger>
|
|
547
|
+
</Popover>
|
|
548
|
+
|
|
549
|
+
<Popover {...args} position="top" content={content}>
|
|
550
|
+
<PopoverTrigger>
|
|
551
|
+
<Button variant="primary">Top</Button>
|
|
552
|
+
</PopoverTrigger>
|
|
553
|
+
</Popover>
|
|
554
|
+
|
|
555
|
+
<Popover {...args} position="bottom" content={content}>
|
|
556
|
+
<PopoverTrigger>
|
|
557
|
+
<Button variant="primary">Bottom</Button>
|
|
558
|
+
</PopoverTrigger>
|
|
559
|
+
</Popover>
|
|
560
|
+
|
|
561
|
+
<Popover {...args} position="right" content={content}>
|
|
562
|
+
<PopoverTrigger>
|
|
563
|
+
<Button variant="primary">Right</Button>
|
|
564
|
+
</PopoverTrigger>
|
|
565
|
+
</Popover>
|
|
566
|
+
</div>
|
|
567
|
+
);
|
|
568
|
+
},
|
|
298
569
|
args: {
|
|
299
|
-
position: 'top',
|
|
300
570
|
trigger: 'click',
|
|
301
571
|
offset: 12,
|
|
302
572
|
delay: 0,
|
|
@@ -304,18 +574,5 @@ export const GlassPopoverPositions: Story = {
|
|
|
304
574
|
closeOnClickOutside: true,
|
|
305
575
|
closeOnEscape: true,
|
|
306
576
|
glass: true,
|
|
307
|
-
}
|
|
308
|
-
decorators: [
|
|
309
|
-
Story => (
|
|
310
|
-
<div
|
|
311
|
-
style={{
|
|
312
|
-
background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
|
|
313
|
-
minHeight: '100vh',
|
|
314
|
-
padding: '2rem',
|
|
315
|
-
}}
|
|
316
|
-
>
|
|
317
|
-
<Story />
|
|
318
|
-
</div>
|
|
319
|
-
),
|
|
320
|
-
],
|
|
577
|
+
},
|
|
321
578
|
};
|
|
@@ -106,7 +106,10 @@ export const Popover: React.FC<PopoverProps> = ({
|
|
|
106
106
|
<div className="c-popover__content-inner">{content}</div>
|
|
107
107
|
</div>
|
|
108
108
|
)}
|
|
109
|
-
<div
|
|
109
|
+
<div
|
|
110
|
+
ref={arrowRef as React.RefObject<HTMLDivElement>}
|
|
111
|
+
className="c-popover__arrow"
|
|
112
|
+
></div>
|
|
110
113
|
</div>,
|
|
111
114
|
document.body
|
|
112
115
|
)}
|
|
@@ -119,43 +122,44 @@ export const Popover: React.FC<PopoverProps> = ({
|
|
|
119
122
|
*/
|
|
120
123
|
export const PopoverTrigger = forwardRef<HTMLElement, PopoverTriggerProps>(
|
|
121
124
|
({ children, trigger: triggerProp }, ref) => {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
125
|
+
const { isOpen, setIsOpen, triggerRef, popoverId, triggerType } =
|
|
126
|
+
React.useContext(PopoverContext);
|
|
127
|
+
|
|
128
|
+
// Determine which trigger type to use - prop from PopoverTrigger or from context
|
|
129
|
+
const effectiveTrigger = triggerProp || triggerType;
|
|
130
|
+
|
|
131
|
+
// Handle trigger events
|
|
132
|
+
const handleClick = () => {
|
|
133
|
+
setIsOpen(!isOpen);
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
const handleMouseEnter = () => {
|
|
137
|
+
setIsOpen(true);
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
const handleMouseLeave = () => {
|
|
141
|
+
setIsOpen(false);
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
// Clone the children element with additional props
|
|
145
|
+
const child = React.Children.only(children) as React.ReactElement;
|
|
146
|
+
|
|
147
|
+
const triggerProps: any = {
|
|
148
|
+
ref: ref || triggerRef,
|
|
149
|
+
'aria-describedby': popoverId,
|
|
150
|
+
'aria-expanded': isOpen,
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
if (effectiveTrigger === 'click') {
|
|
154
|
+
triggerProps.onClick = handleClick;
|
|
155
|
+
} else if (effectiveTrigger === 'hover') {
|
|
156
|
+
triggerProps.onMouseEnter = handleMouseEnter;
|
|
157
|
+
triggerProps.onMouseLeave = handleMouseLeave;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
return React.cloneElement(child, triggerProps);
|
|
155
161
|
}
|
|
156
|
-
|
|
157
|
-
return React.cloneElement(child, triggerProps);
|
|
158
|
-
});
|
|
162
|
+
);
|
|
159
163
|
|
|
160
164
|
PopoverTrigger.displayName = 'PopoverTrigger';
|
|
161
165
|
|