@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.
Files changed (343) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/build-tools/EXAMPLES.md +372 -0
  3. package/build-tools/README.md +242 -0
  4. package/build-tools/__tests__/error-handler.test.js +230 -0
  5. package/build-tools/__tests__/index.test.js +141 -0
  6. package/build-tools/__tests__/rollup-plugin.test.js +194 -0
  7. package/build-tools/__tests__/utils.test.js +161 -0
  8. package/build-tools/__tests__/vite-plugin.test.js +129 -0
  9. package/build-tools/__tests__/webpack-loader.test.js +190 -0
  10. package/build-tools/error-handler.js +308 -0
  11. package/build-tools/index.d.ts +44 -0
  12. package/build-tools/index.js +88 -0
  13. package/build-tools/package.json +50 -0
  14. package/build-tools/rollup-plugin.js +236 -0
  15. package/build-tools/types.d.ts +163 -0
  16. package/build-tools/utils.js +203 -0
  17. package/build-tools/vite-plugin.js +161 -0
  18. package/build-tools/webpack-loader.js +123 -0
  19. package/dist/atomix.css +21044 -2618
  20. package/dist/atomix.css.map +1 -1
  21. package/dist/atomix.min.css +77 -3
  22. package/dist/atomix.min.css.map +1 -1
  23. package/dist/build-tools/EXAMPLES.md +372 -0
  24. package/dist/build-tools/README.md +242 -0
  25. package/dist/build-tools/__tests__/error-handler.test.js +230 -0
  26. package/dist/build-tools/__tests__/index.test.js +141 -0
  27. package/dist/build-tools/__tests__/rollup-plugin.test.js +194 -0
  28. package/dist/build-tools/__tests__/utils.test.js +161 -0
  29. package/dist/build-tools/__tests__/vite-plugin.test.js +129 -0
  30. package/dist/build-tools/__tests__/webpack-loader.test.js +190 -0
  31. package/dist/build-tools/error-handler.js +308 -0
  32. package/dist/build-tools/index.d.ts +44 -0
  33. package/dist/build-tools/index.js +88 -0
  34. package/dist/build-tools/package.json +50 -0
  35. package/dist/build-tools/rollup-plugin.js +236 -0
  36. package/dist/build-tools/types.d.ts +163 -0
  37. package/dist/build-tools/utils.js +203 -0
  38. package/dist/build-tools/vite-plugin.js +161 -0
  39. package/dist/build-tools/webpack-loader.js +123 -0
  40. package/dist/charts.d.ts +1 -1
  41. package/dist/charts.js +86 -57
  42. package/dist/charts.js.map +1 -1
  43. package/dist/core.d.ts +1 -1
  44. package/dist/core.js +136 -112
  45. package/dist/core.js.map +1 -1
  46. package/dist/forms.d.ts +2 -5
  47. package/dist/forms.js +140 -128
  48. package/dist/forms.js.map +1 -1
  49. package/dist/heavy.d.ts +1 -1
  50. package/dist/heavy.js +136 -112
  51. package/dist/heavy.js.map +1 -1
  52. package/dist/index.d.ts +152 -78
  53. package/dist/index.esm.js +346 -340
  54. package/dist/index.esm.js.map +1 -1
  55. package/dist/index.js +359 -353
  56. package/dist/index.js.map +1 -1
  57. package/dist/index.min.js +1 -1
  58. package/dist/index.min.js.map +1 -1
  59. package/dist/layout.js.map +1 -1
  60. package/dist/theme.d.ts +9 -9
  61. package/dist/theme.js.map +1 -1
  62. package/package.json +23 -8
  63. package/scripts/atomix-cli.js +170 -73
  64. package/scripts/cli/__tests__/README.md +81 -0
  65. package/scripts/cli/__tests__/basic.test.js +115 -0
  66. package/scripts/cli/__tests__/component-generator.test.js +332 -0
  67. package/scripts/cli/__tests__/integration.test.js +327 -0
  68. package/scripts/cli/__tests__/test-setup.js +133 -0
  69. package/scripts/cli/__tests__/token-manager.test.js +251 -0
  70. package/scripts/cli/__tests__/utils.test.js +161 -0
  71. package/scripts/cli/component-generator.js +253 -299
  72. package/scripts/cli/dependency-checker.js +355 -0
  73. package/scripts/cli/interactive-init.js +46 -5
  74. package/scripts/cli/template-manager.js +0 -2
  75. package/scripts/cli/templates/common-templates.js +636 -0
  76. package/scripts/cli/templates/composable-templates.js +148 -126
  77. package/scripts/cli/templates/index.js +23 -16
  78. package/scripts/cli/templates/project-templates.js +151 -23
  79. package/scripts/cli/templates/react-templates.js +280 -210
  80. package/scripts/cli/templates/scss-templates.js +90 -91
  81. package/scripts/cli/templates/testing-templates.js +206 -27
  82. package/scripts/cli/templates/testing-utils.js +278 -0
  83. package/scripts/cli/templates/types-templates.js +70 -56
  84. package/scripts/cli/theme-bridge.js +8 -2
  85. package/scripts/cli/token-manager.js +318 -206
  86. package/scripts/cli/utils.js +0 -1
  87. package/src/components/Accordion/Accordion.stories.tsx +358 -850
  88. package/src/components/Accordion/Accordion.test.tsx +70 -50
  89. package/src/components/Accordion/Accordion.tsx +99 -94
  90. package/src/components/AtomixGlass/AtomixGlass.test.tsx +1 -1
  91. package/src/components/AtomixGlass/AtomixGlass.tsx +80 -39
  92. package/src/components/AtomixGlass/AtomixGlassContainer.tsx +103 -81
  93. package/src/components/AtomixGlass/GlassFilter.tsx +9 -16
  94. package/src/components/AtomixGlass/__snapshots__/AtomixGlass.test.tsx.snap +8 -7
  95. package/src/components/AtomixGlass/glass-utils.ts +6 -5
  96. package/src/components/AtomixGlass/shader-utils.ts +133 -52
  97. package/src/components/AtomixGlass/stories/Customization.stories.tsx +131 -0
  98. package/src/components/AtomixGlass/stories/Examples.stories.tsx +2957 -2853
  99. package/src/components/AtomixGlass/stories/Modes.stories.tsx +1 -1
  100. package/src/components/AtomixGlass/stories/Overview.stories.tsx +348 -0
  101. package/src/components/AtomixGlass/stories/Performance.stories.tsx +103 -0
  102. package/src/components/AtomixGlass/stories/Playground.stories.tsx +51 -36
  103. package/src/components/AtomixGlass/stories/{ShaderVariants.stories.tsx → Shaders.stories.tsx} +2 -2
  104. package/src/components/AtomixGlass/stories/shared-components.tsx +90 -190
  105. package/src/components/Avatar/Avatar.stories.tsx +195 -0
  106. package/src/components/Avatar/Avatar.tsx +58 -56
  107. package/src/components/Badge/Badge.stories.tsx +122 -352
  108. package/src/components/Badge/Badge.test.tsx +41 -41
  109. package/src/components/Badge/Badge.tsx +64 -62
  110. package/src/components/Block/Block.stories.tsx +30 -11
  111. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +142 -23
  112. package/src/components/Breadcrumb/Breadcrumb.tsx +62 -60
  113. package/src/components/Button/Button.stories.tsx +454 -1126
  114. package/src/components/Button/Button.test.tsx +123 -0
  115. package/src/components/Button/Button.tsx +88 -60
  116. package/src/components/Button/ButtonGroup.stories.tsx +376 -215
  117. package/src/components/Button/ButtonGroup.tsx +4 -15
  118. package/src/components/Callout/Callout.stories.tsx +316 -568
  119. package/src/components/Card/Card.stories.tsx +292 -81
  120. package/src/components/Card/Card.tsx +30 -14
  121. package/src/components/Chart/AreaChart.tsx +1 -1
  122. package/src/components/Chart/CandlestickChart.tsx +23 -16
  123. package/src/components/Chart/Chart.stories.tsx +153 -16
  124. package/src/components/Chart/Chart.tsx +40 -44
  125. package/src/components/Chart/ChartRenderer.tsx +39 -12
  126. package/src/components/Chart/ChartToolbar.tsx +21 -5
  127. package/src/components/Chart/DonutChart.tsx +1 -1
  128. package/src/components/Chart/FunnelChart.tsx +4 -1
  129. package/src/components/Chart/GaugeChart.tsx +3 -1
  130. package/src/components/Chart/HeatmapChart.tsx +50 -37
  131. package/src/components/Chart/LineChart.tsx +3 -2
  132. package/src/components/Chart/MultiAxisChart.tsx +24 -16
  133. package/src/components/Chart/RadarChart.tsx +19 -17
  134. package/src/components/Chart/ScatterChart.tsx +29 -21
  135. package/src/components/ColorModeToggle/ColorModeToggle.stories.tsx +152 -66
  136. package/src/components/ColorModeToggle/ColorModeToggle.tsx +15 -3
  137. package/src/components/Countdown/Countdown.stories.tsx +114 -7
  138. package/src/components/DataTable/DataTable.stories.tsx +349 -144
  139. package/src/components/DataTable/DataTable.test.tsx +26 -148
  140. package/src/components/DataTable/DataTable.tsx +485 -456
  141. package/src/components/DatePicker/DatePicker.stories.tsx +310 -1066
  142. package/src/components/DatePicker/DatePicker.tsx +31 -26
  143. package/src/components/Dropdown/Dropdown.stories.tsx +153 -36
  144. package/src/components/Dropdown/Dropdown.tsx +313 -299
  145. package/src/components/EdgePanel/EdgePanel.stories.tsx +221 -25
  146. package/src/components/EdgePanel/EdgePanel.tsx +1 -3
  147. package/src/components/Footer/Footer.stories.tsx +396 -327
  148. package/src/components/Footer/Footer.tsx +130 -128
  149. package/src/components/Footer/FooterLink.tsx +2 -2
  150. package/src/components/Form/Checkbox.stories.tsx +140 -6
  151. package/src/components/Form/Checkbox.test.tsx +63 -0
  152. package/src/components/Form/Checkbox.tsx +122 -78
  153. package/src/components/Form/Form.stories.tsx +110 -19
  154. package/src/components/Form/FormGroup.stories.tsx +127 -4
  155. package/src/components/Form/Input.stories.tsx +22 -39
  156. package/src/components/Form/Input.test.tsx +38 -44
  157. package/src/components/Form/Radio.stories.tsx +146 -17
  158. package/src/components/Form/Radio.tsx +68 -66
  159. package/src/components/Form/Select.stories.tsx +140 -8
  160. package/src/components/Form/Select.tsx +184 -182
  161. package/src/components/Form/Textarea.stories.tsx +149 -6
  162. package/src/components/Form/Textarea.test.tsx +27 -32
  163. package/src/components/Hero/Hero.stories.tsx +372 -38
  164. package/src/components/Hero/Hero.tsx +201 -55
  165. package/src/components/Icon/index.ts +7 -1
  166. package/src/components/List/List.stories.tsx +141 -3
  167. package/src/components/List/List.tsx +19 -23
  168. package/src/components/Modal/Modal.stories.tsx +183 -43
  169. package/src/components/Modal/Modal.tsx +130 -127
  170. package/src/components/Navigation/Menu/MegaMenu.tsx +70 -70
  171. package/src/components/Navigation/Nav/NavDropdown.tsx +1 -5
  172. package/src/components/Navigation/SideMenu/SideMenu.stories.tsx +128 -28
  173. package/src/components/Navigation/SideMenu/SideMenu.tsx +5 -7
  174. package/src/components/Navigation/SideMenu/SideMenuItem.tsx +4 -5
  175. package/src/components/Pagination/Pagination.stories.tsx +7 -4
  176. package/src/components/Pagination/Pagination.tsx +199 -202
  177. package/src/components/PhotoViewer/PhotoViewer.tsx +4 -1
  178. package/src/components/Popover/Popover.stories.tsx +354 -97
  179. package/src/components/Popover/Popover.tsx +41 -37
  180. package/src/components/Progress/Progress.stories.tsx +160 -7
  181. package/src/components/River/River.stories.tsx +3 -2
  182. package/src/components/SectionIntro/SectionIntro.stories.tsx +239 -47
  183. package/src/components/Slider/Slider.stories.tsx +12 -4
  184. package/src/components/Spinner/Spinner.stories.tsx +104 -8
  185. package/src/components/Spinner/Spinner.test.tsx +23 -23
  186. package/src/components/Spinner/Spinner.tsx +43 -46
  187. package/src/components/Steps/Steps.stories.tsx +173 -42
  188. package/src/components/Tabs/Tabs.stories.tsx +141 -12
  189. package/src/components/Tabs/Tabs.tsx +74 -72
  190. package/src/components/Testimonial/Testimonial.stories.tsx +120 -3
  191. package/src/components/Todo/Todo.stories.tsx +198 -9
  192. package/src/components/Toggle/Toggle.stories.tsx +137 -36
  193. package/src/components/Toggle/Toggle.test.tsx +65 -70
  194. package/src/components/Toggle/Toggle.tsx +4 -1
  195. package/src/components/Tooltip/Tooltip.stories.tsx +194 -100
  196. package/src/components/Tooltip/Tooltip.tsx +104 -106
  197. package/src/components/Upload/Upload.stories.tsx +241 -150
  198. package/src/components/Upload/Upload.tsx +287 -283
  199. package/src/components/VideoPlayer/VideoPlayer.tsx +6 -1
  200. package/src/components/index.ts +13 -2
  201. package/src/layouts/Grid/Grid.stories.tsx +9 -3
  202. package/src/layouts/MasonryGrid/MasonryGrid.tsx +5 -1
  203. package/src/lib/README.md +2 -2
  204. package/src/lib/__tests__/theme-tools.test.ts +219 -0
  205. package/src/lib/composables/index.ts +2 -2
  206. package/src/lib/composables/shared-mouse-tracker.ts +13 -14
  207. package/src/lib/composables/useAtomixGlass.ts +126 -97
  208. package/src/lib/composables/useChartExport.ts +3 -8
  209. package/src/lib/composables/useDataTable.ts +72 -43
  210. package/src/lib/composables/useHero.ts +58 -14
  211. package/src/lib/composables/useHeroBackgroundSlider.ts +2 -9
  212. package/src/lib/composables/useInput.ts +10 -8
  213. package/src/lib/composables/useSideMenu.ts +6 -5
  214. package/src/lib/composables/useTooltip.ts +1 -2
  215. package/src/lib/composables/useVideoPlayer.ts +44 -35
  216. package/src/lib/config/index.ts +154 -154
  217. package/src/lib/constants/components.ts +9 -32
  218. package/src/lib/constants/cssVariables.ts +29 -29
  219. package/src/lib/hooks/__tests__/useComponentCustomization.test.ts +2 -6
  220. package/src/lib/hooks/index.ts +1 -1
  221. package/src/lib/hooks/useComponentCustomization.ts +11 -17
  222. package/src/lib/hooks/usePerformanceMonitor.ts +6 -7
  223. package/src/lib/patterns/__tests__/slots.test.ts +1 -1
  224. package/src/lib/patterns/index.ts +1 -1
  225. package/src/lib/patterns/slots.tsx +8 -13
  226. package/src/lib/storybook/InteractiveDemo.tsx +13 -18
  227. package/src/lib/storybook/PreviewContainer.tsx +1 -1
  228. package/src/lib/storybook/VariantsGrid.tsx +3 -7
  229. package/src/lib/storybook/index.ts +1 -1
  230. package/src/lib/theme/adapters/cssVariableMapper.ts +47 -74
  231. package/src/lib/theme/adapters/index.ts +3 -9
  232. package/src/lib/theme/adapters/themeAdapter.ts +41 -26
  233. package/src/lib/theme/config/index.ts +1 -1
  234. package/src/lib/theme/config/types.ts +2 -2
  235. package/src/lib/theme/config/validator.ts +10 -5
  236. package/src/lib/theme/constants/constants.ts +2 -2
  237. package/src/lib/theme/constants/index.ts +1 -2
  238. package/src/lib/theme/core/__tests__/createTheme.test.ts +20 -22
  239. package/src/lib/theme/core/composeTheme.ts +32 -26
  240. package/src/lib/theme/core/createTheme.ts +1 -1
  241. package/src/lib/theme/core/createThemeObject.ts +308 -301
  242. package/src/lib/theme/core/index.ts +3 -3
  243. package/src/lib/theme/devtools/CLI.ts +107 -105
  244. package/src/lib/theme/devtools/Comparator.tsx +50 -32
  245. package/src/lib/theme/devtools/DesignTokensCustomizer.stories.tsx +50 -48
  246. package/src/lib/theme/devtools/DesignTokensCustomizer.tsx +257 -63
  247. package/src/lib/theme/devtools/Inspector.tsx +75 -60
  248. package/src/lib/theme/devtools/LiveEditor.tsx +97 -76
  249. package/src/lib/theme/devtools/Preview.tsx +150 -106
  250. package/src/lib/theme/devtools/ThemeValidator.ts +29 -21
  251. package/src/lib/theme/devtools/index.ts +3 -9
  252. package/src/lib/theme/devtools/useHistory.ts +23 -21
  253. package/src/lib/theme/errors/errors.ts +12 -11
  254. package/src/lib/theme/errors/index.ts +2 -7
  255. package/src/lib/theme/generators/generateCSS.ts +9 -13
  256. package/src/lib/theme/generators/generateCSSNested.ts +1 -6
  257. package/src/lib/theme/generators/generateCSSVariables.ts +673 -630
  258. package/src/lib/theme/generators/index.ts +1 -4
  259. package/src/lib/theme/i18n/index.ts +1 -1
  260. package/src/lib/theme/i18n/rtl.ts +13 -13
  261. package/src/lib/theme/index.ts +7 -16
  262. package/src/lib/theme/runtime/ThemeApplicator.ts +4 -4
  263. package/src/lib/theme/runtime/ThemeContext.tsx +1 -1
  264. package/src/lib/theme/runtime/ThemeErrorBoundary.tsx +19 -23
  265. package/src/lib/theme/runtime/ThemeProvider.tsx +230 -239
  266. package/src/lib/theme/runtime/__tests__/ThemeProvider.integration.test.tsx +1 -1
  267. package/src/lib/theme/runtime/__tests__/ThemeProvider.test.tsx +24 -29
  268. package/src/lib/theme/runtime/index.ts +2 -5
  269. package/src/lib/theme/runtime/useTheme.ts +18 -18
  270. package/src/lib/theme/runtime/useThemeTokens.ts +22 -22
  271. package/src/lib/theme/test/testTheme.ts +15 -16
  272. package/src/lib/theme/tokens/index.ts +2 -7
  273. package/src/lib/theme/tokens/tokens.ts +25 -24
  274. package/src/lib/theme/types.ts +428 -411
  275. package/src/lib/theme/utils/__tests__/themeValidation.test.ts +3 -3
  276. package/src/lib/theme/utils/componentTheming.ts +18 -18
  277. package/src/lib/theme/utils/domUtils.ts +277 -289
  278. package/src/lib/theme/utils/index.ts +1 -2
  279. package/src/lib/theme/utils/injectCSS.ts +10 -14
  280. package/src/lib/theme/utils/naming.ts +20 -16
  281. package/src/lib/theme/utils/themeHelpers.ts +10 -12
  282. package/src/lib/theme/utils/themeUtils.ts +85 -86
  283. package/src/lib/theme/utils/themeValidation.ts +82 -33
  284. package/src/lib/theme-tools.ts +8 -6
  285. package/src/lib/types/components.ts +172 -71
  286. package/src/lib/types/partProps.ts +1 -1
  287. package/src/lib/utils/__tests__/csv.test.ts +45 -0
  288. package/src/lib/utils/componentUtils.ts +8 -12
  289. package/src/lib/utils/csv.ts +19 -0
  290. package/src/lib/utils/dataTableExport.ts +2 -15
  291. package/src/lib/utils/fontPreloader.ts +10 -19
  292. package/src/lib/utils/icons.ts +4 -1
  293. package/src/lib/utils/index.ts +2 -6
  294. package/src/lib/utils/memoryMonitor.ts +10 -8
  295. package/src/lib/utils/themeNaming.ts +2 -2
  296. package/src/styles/01-settings/_index.scss +1 -1
  297. package/src/styles/01-settings/_settings.accordion.scss +28 -7
  298. package/src/styles/01-settings/_settings.colors.scss +11 -11
  299. package/src/styles/01-settings/_settings.design-tokens.scss +61 -50
  300. package/src/styles/01-settings/_settings.navbar.scss +1 -1
  301. package/src/styles/01-settings/_settings.spacing.scss +3 -4
  302. package/src/styles/01-settings/_settings.tooltip.scss +1 -1
  303. package/src/styles/01-settings/_settings.typography.scss +4 -4
  304. package/src/styles/02-tools/_tools.button.scss +51 -21
  305. package/src/styles/02-tools/_tools.utility-api.scss +38 -12
  306. package/src/styles/03-generic/_generic.root.scss +4 -3
  307. package/src/styles/06-components/_components.accordion.scss +56 -14
  308. package/src/styles/06-components/_components.atomix-glass.scss +13 -9
  309. package/src/styles/06-components/_components.button.scss +16 -4
  310. package/src/styles/06-components/_components.callout.scss +27 -21
  311. package/src/styles/06-components/_components.card.scss +5 -14
  312. package/src/styles/06-components/_components.chart.scss +22 -19
  313. package/src/styles/06-components/_components.checkbox.scss +25 -17
  314. package/src/styles/06-components/_components.color-mode-toggle.scss +3 -1
  315. package/src/styles/06-components/_components.edge-panel.scss +9 -2
  316. package/src/styles/06-components/_components.footer.scss +1 -1
  317. package/src/styles/06-components/_components.side-menu.scss +5 -5
  318. package/src/styles/06-components/_components.toggle.scss +18 -0
  319. package/src/styles/06-components/_index.scss +1 -1
  320. package/src/styles/06-components/old.chart.styles.scss +0 -2
  321. package/src/styles/99-utilities/_index.scss +2 -0
  322. package/src/styles/99-utilities/_utilities.border.scss +69 -27
  323. package/src/styles/99-utilities/_utilities.display.scss +1 -1
  324. package/src/styles/99-utilities/_utilities.opacity.scss +10 -0
  325. package/src/styles/99-utilities/_utilities.position.scss +16 -9
  326. package/src/styles/99-utilities/_utilities.scss +2 -0
  327. package/src/styles/99-utilities/_utilities.sizes.scss +47 -18
  328. package/src/styles/99-utilities/_utilities.spacing.scss +118 -66
  329. package/src/styles/99-utilities/_utilities.text-gradient.scss +45 -0
  330. package/src/styles/99-utilities/_utilities.text.scss +67 -46
  331. package/themes/dark-complementary/README.md +98 -0
  332. package/themes/dark-complementary/index.scss +158 -0
  333. package/themes/default-light/README.md +81 -0
  334. package/themes/default-light/index.scss +154 -0
  335. package/themes/high-contrast/README.md +105 -0
  336. package/themes/high-contrast/index.scss +172 -0
  337. package/themes/test-theme/README.md +38 -0
  338. package/themes/test-theme/index.scss +47 -0
  339. package/scripts/cli/templates-original-backup.js +0 -1655
  340. package/scripts/cli/templates_backup.js +0 -684
  341. package/src/components/AtomixGlass/stories/AtomixGlass.stories.tsx +0 -1438
  342. package/src/lib/composables/useButton.ts +0 -93
  343. 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
- 'The Popover component 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.',
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
- defaultValue: 'top',
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
- defaultValue: 'click',
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
- defaultValue: 0,
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
- defaultValue: 12,
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
- defaultValue: false,
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
- defaultValue: true,
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
- defaultValue: true,
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
- } satisfies Meta<typeof Popover>;
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 trigger={args.trigger}>
111
- <Button variant="primary" label="Open Popover" />
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 Default: Story = {
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
- } as any,
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 Hover: Story = {
132
- render: args => <InteractivePopover {...args} />,
133
- args: {
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
- export const BottomPosition: Story = {
145
- render: args => <InteractivePopover {...args} />,
146
- args: {
147
- position: 'bottom',
148
- trigger: 'click',
149
- offset: 12,
150
- delay: 0,
151
- defaultOpen: false,
152
- closeOnClickOutside: true,
153
- closeOnEscape: true,
154
- } as any,
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
- export const LeftPosition: Story = {
158
- render: args => <InteractivePopover {...args} />,
159
- args: {
160
- position: 'left',
161
- trigger: 'click',
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
- export const RightPosition: Story = {
171
- render: args => <InteractivePopover {...args} />,
172
- args: {
173
- position: 'right',
174
- trigger: 'click',
175
- offset: 12,
176
- delay: 0,
177
- defaultOpen: false,
178
- closeOnClickOutside: true,
179
- closeOnEscape: true,
180
- } as any,
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 AutoPosition: Story = {
184
- render: args => <InteractivePopover {...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: 'auto',
314
+ position: 'top',
187
315
  trigger: 'click',
188
- offset: 12,
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
- } as any,
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 => <InteractivePopover {...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
- } as any,
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 => <InteractivePopover {...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
- } as any,
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 => <InteractivePopover {...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
- } as any,
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 ref={arrowRef as React.RefObject<HTMLDivElement>} className="c-popover__arrow"></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
- const { isOpen, setIsOpen, triggerRef, popoverId, triggerType } =
123
- React.useContext(PopoverContext);
124
-
125
- // Determine which trigger type to use - prop from PopoverTrigger or from context
126
- const effectiveTrigger = triggerProp || triggerType;
127
-
128
- // Handle trigger events
129
- const handleClick = () => {
130
- setIsOpen(!isOpen);
131
- };
132
-
133
- const handleMouseEnter = () => {
134
- setIsOpen(true);
135
- };
136
-
137
- const handleMouseLeave = () => {
138
- setIsOpen(false);
139
- };
140
-
141
- // Clone the children element with additional props
142
- const child = React.Children.only(children) as React.ReactElement;
143
-
144
- const triggerProps: any = {
145
- ref: ref || triggerRef,
146
- 'aria-describedby': popoverId,
147
- 'aria-expanded': isOpen,
148
- };
149
-
150
- if (effectiveTrigger === 'click') {
151
- triggerProps.onClick = handleClick;
152
- } else if (effectiveTrigger === 'hover') {
153
- triggerProps.onMouseEnter = handleMouseEnter;
154
- triggerProps.onMouseLeave = handleMouseLeave;
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