@shohojdhara/atomix 0.1.30 → 0.2.1

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 (469) hide show
  1. package/CHANGELOG.md +0 -0
  2. package/LICENSE +0 -0
  3. package/README.md +151 -39
  4. package/dist/atomix.css +13529 -0
  5. package/dist/atomix.min.css +15 -0
  6. package/dist/index.d.ts +6112 -1757
  7. package/dist/index.esm.js +16852 -8364
  8. package/dist/index.esm.js.map +1 -1
  9. package/dist/index.js +16892 -8369
  10. package/dist/index.js.map +1 -1
  11. package/dist/index.min.js +1 -1
  12. package/dist/index.min.js.map +1 -1
  13. package/dist/themes/boomdevs.css +13241 -0
  14. package/dist/themes/boomdevs.min.css +353 -0
  15. package/dist/themes/esrar.css +15374 -0
  16. package/dist/themes/esrar.min.css +189 -0
  17. package/dist/themes/mashroom.css +28079 -0
  18. package/dist/themes/mashroom.min.css +403 -0
  19. package/dist/themes/shaj-default.css +14203 -0
  20. package/dist/themes/shaj-default.min.css +500 -0
  21. package/dist/themes/yabai.css +13711 -0
  22. package/dist/themes/yabai.min.css +189 -0
  23. package/package.json +126 -99
  24. package/src/components/Accordion/Accordion.stories.tsx +271 -0
  25. package/src/components/Accordion/Accordion.tsx +131 -0
  26. package/src/components/Accordion/index.ts +3 -0
  27. package/src/components/AtomixLogo/AtomixLogo.tsx +36 -0
  28. package/src/components/AtomixLogo/index.ts +3 -0
  29. package/src/components/AtomixLogo.tsx +40 -0
  30. package/src/components/Avatar/Avatar.stories.tsx +257 -0
  31. package/src/components/Avatar/Avatar.tsx +68 -0
  32. package/src/components/Avatar/AvatarGroup.tsx +73 -0
  33. package/src/components/Avatar/index.ts +3 -0
  34. package/src/components/Badge/Badge.stories.tsx +371 -0
  35. package/src/components/Badge/Badge.tsx +39 -0
  36. package/src/components/Badge/index.ts +3 -0
  37. package/src/components/Block/Block.stories.tsx +408 -0
  38. package/src/components/Block/Block.tsx +137 -0
  39. package/src/components/Block/index.ts +1 -0
  40. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +106 -0
  41. package/src/components/Breadcrumb/Breadcrumb.tsx +112 -0
  42. package/src/components/Breadcrumb/index.ts +3 -0
  43. package/src/components/Button/Button.stories.tsx +312 -0
  44. package/src/components/Button/Button.tsx +69 -0
  45. package/src/components/Button/index.ts +3 -0
  46. package/src/components/Callout/Callout.stories.tsx +588 -0
  47. package/src/components/Callout/Callout.tsx +78 -0
  48. package/src/components/Callout/index.ts +1 -0
  49. package/src/components/Card/Card.stories.tsx +105 -0
  50. package/src/components/Card/Card.tsx +69 -0
  51. package/src/components/Card/ElevationCard.tsx +47 -0
  52. package/src/components/Card/index.ts +15 -0
  53. package/src/components/Chart/AdvancedChart.tsx +624 -0
  54. package/src/components/Chart/AnimatedChart.tsx +206 -0
  55. package/src/components/Chart/AreaChart.tsx +27 -0
  56. package/src/components/Chart/BarChart.tsx +148 -0
  57. package/src/components/Chart/BubbleChart.tsx +411 -0
  58. package/src/components/Chart/CandlestickChart.tsx +765 -0
  59. package/src/components/Chart/Chart.stories.tsx +527 -0
  60. package/src/components/Chart/Chart.tsx +218 -0
  61. package/src/components/Chart/ChartRenderer.tsx +322 -0
  62. package/src/components/Chart/ChartToolbar.tsx +436 -0
  63. package/src/components/Chart/ChartTooltip.tsx +101 -0
  64. package/src/components/Chart/DonutChart.tsx +370 -0
  65. package/src/components/Chart/FunnelChart.tsx +393 -0
  66. package/src/components/Chart/GaugeChart.tsx +550 -0
  67. package/src/components/Chart/HeatmapChart.tsx +614 -0
  68. package/src/components/Chart/LineChart.tsx +172 -0
  69. package/src/components/Chart/LineChartNew.tsx +167 -0
  70. package/src/components/Chart/MultiAxisChart.tsx +498 -0
  71. package/src/components/Chart/PieChart.tsx +103 -0
  72. package/src/components/Chart/RadarChart.tsx +332 -0
  73. package/src/components/Chart/RealTimeChart.tsx +436 -0
  74. package/src/components/Chart/ScatterChart.tsx +152 -0
  75. package/src/components/Chart/TreemapChart.tsx +574 -0
  76. package/src/components/Chart/WaterfallChart.tsx +450 -0
  77. package/src/components/Chart/index.ts +119 -0
  78. package/src/components/Chart/types.ts +338 -0
  79. package/src/components/ColorModeToggle/ColorModeToggle.stories.tsx +44 -0
  80. package/src/components/ColorModeToggle/ColorModeToggle.tsx +85 -0
  81. package/src/components/ColorModeToggle/index.ts +2 -0
  82. package/src/components/Countdown/Countdown.stories.tsx +46 -0
  83. package/src/components/Countdown/Countdown.tsx +90 -0
  84. package/src/components/Countdown/index.ts +2 -0
  85. package/src/components/DataTable/DataTable.stories.tsx +248 -0
  86. package/src/components/DataTable/DataTable.tsx +213 -0
  87. package/src/components/DataTable/index.ts +3 -0
  88. package/src/components/DatePicker/DatePicker.stories.tsx +364 -0
  89. package/src/components/DatePicker/DatePicker.tsx +504 -0
  90. package/src/components/DatePicker/index.ts +4 -0
  91. package/src/components/DatePicker/readme.md +106 -0
  92. package/src/components/DatePicker/types.ts +167 -0
  93. package/src/components/DatePicker/utils.ts +185 -0
  94. package/src/components/Dropdown/Dropdown.stories.tsx +358 -0
  95. package/src/components/Dropdown/Dropdown.tsx +352 -0
  96. package/src/components/Dropdown/index.ts +14 -0
  97. package/src/components/Dropdown/readme.md +151 -0
  98. package/src/components/EdgePanel/EdgePanel.stories.tsx +266 -0
  99. package/src/components/EdgePanel/EdgePanel.tsx +73 -0
  100. package/src/components/EdgePanel/index.ts +1 -0
  101. package/src/components/Form/Checkbox.stories.tsx +76 -0
  102. package/src/components/Form/Checkbox.tsx +69 -0
  103. package/src/components/Form/Form.stories.tsx +497 -0
  104. package/src/components/Form/Form.tsx +46 -0
  105. package/src/components/Form/FormGroup.stories.tsx +162 -0
  106. package/src/components/Form/FormGroup.tsx +53 -0
  107. package/src/components/Form/Input.stories.tsx +106 -0
  108. package/src/components/Form/Input.tsx +87 -0
  109. package/src/components/Form/Radio.stories.tsx +94 -0
  110. package/src/components/Form/Radio.tsx +65 -0
  111. package/src/components/Form/Select.stories.tsx +151 -0
  112. package/src/components/Form/Select.tsx +191 -0
  113. package/src/components/Form/Textarea.stories.tsx +123 -0
  114. package/src/components/Form/Textarea.tsx +78 -0
  115. package/src/components/Form/index.ts +7 -0
  116. package/src/components/Hero/Hero.stories.tsx +295 -0
  117. package/src/components/Hero/Hero.tsx +175 -0
  118. package/src/components/Hero/index.ts +6 -0
  119. package/src/components/Icon/Icon.tsx +87 -0
  120. package/src/components/Icon/index.ts +2 -0
  121. package/src/components/List/List.stories.tsx +122 -0
  122. package/src/components/List/List.tsx +35 -0
  123. package/src/components/List/ListGroup.tsx +35 -0
  124. package/src/components/List/index.ts +2 -0
  125. package/src/components/Messages/Messages.stories.tsx +160 -0
  126. package/src/components/Messages/Messages.tsx +172 -0
  127. package/src/components/Messages/index.ts +3 -0
  128. package/src/components/Modal/Modal.stories.tsx +284 -0
  129. package/src/components/Modal/Modal.tsx +198 -0
  130. package/src/components/Modal/README.md +169 -0
  131. package/src/components/Modal/index.ts +1 -0
  132. package/src/components/Navigation/Menu/MegaMenu.tsx +109 -0
  133. package/src/components/Navigation/Menu/Menu.stories.tsx +339 -0
  134. package/src/components/Navigation/Menu/Menu.tsx +111 -0
  135. package/src/components/Navigation/Nav/Nav.stories.tsx +456 -0
  136. package/src/components/Navigation/Nav/Nav.tsx +51 -0
  137. package/src/components/Navigation/Nav/NavDropdown.tsx +105 -0
  138. package/src/components/Navigation/Nav/NavItem.tsx +168 -0
  139. package/src/components/Navigation/Navbar/Navbar.stories.tsx +569 -0
  140. package/src/components/Navigation/Navbar/Navbar.tsx +150 -0
  141. package/src/components/Navigation/README.md +314 -0
  142. package/src/components/Navigation/SideMenu/SideMenu.README.md +494 -0
  143. package/src/components/Navigation/SideMenu/SideMenu.stories.tsx +609 -0
  144. package/src/components/Navigation/SideMenu/SideMenu.tsx +101 -0
  145. package/src/components/Navigation/SideMenu/SideMenuItem.tsx +103 -0
  146. package/src/components/Navigation/SideMenu/SideMenuList.tsx +41 -0
  147. package/src/components/Navigation/index.ts +23 -0
  148. package/src/components/Pagination/Pagination.stories.tsx +188 -0
  149. package/src/components/Pagination/Pagination.tsx +162 -0
  150. package/src/components/Pagination/index.ts +1 -0
  151. package/src/components/PhotoViewer/PhotoViewer.stories.tsx +397 -0
  152. package/src/components/PhotoViewer/PhotoViewer.tsx +246 -0
  153. package/src/components/PhotoViewer/PhotoViewerHeader.tsx +184 -0
  154. package/src/components/PhotoViewer/PhotoViewerImage.tsx +173 -0
  155. package/src/components/PhotoViewer/PhotoViewerInfo.tsx +91 -0
  156. package/src/components/PhotoViewer/PhotoViewerNavigation.tsx +85 -0
  157. package/src/components/PhotoViewer/PhotoViewerThumbnails.tsx +63 -0
  158. package/src/components/PhotoViewer/README.md +358 -0
  159. package/src/components/PhotoViewer/examples/ImageGallery.tsx +187 -0
  160. package/src/components/PhotoViewer/examples/SimpleGallery.tsx +73 -0
  161. package/src/components/PhotoViewer/examples/index.ts +2 -0
  162. package/src/components/PhotoViewer/index.ts +14 -0
  163. package/src/components/Popover/Popover.stories.tsx +143 -0
  164. package/src/components/Popover/Popover.tsx +137 -0
  165. package/src/components/Popover/index.ts +5 -0
  166. package/src/components/Popover/readme.md +120 -0
  167. package/src/components/ProductReview/ProductReview.stories.tsx +88 -0
  168. package/src/components/ProductReview/ProductReview.tsx +169 -0
  169. package/src/components/ProductReview/index.ts +3 -0
  170. package/src/components/Progress/Progress.stories.tsx +75 -0
  171. package/src/components/Progress/Progress.tsx +45 -0
  172. package/src/components/Progress/index.ts +1 -0
  173. package/src/components/Rating/Rating.stories.tsx +109 -0
  174. package/src/components/Rating/Rating.tsx +286 -0
  175. package/src/components/Rating/index.ts +6 -0
  176. package/src/components/River/River.stories.tsx +230 -0
  177. package/src/components/River/River.tsx +134 -0
  178. package/src/components/River/index.ts +2 -0
  179. package/src/components/SectionIntro/SectionIntro.stories.tsx +143 -0
  180. package/src/components/SectionIntro/SectionIntro.tsx +184 -0
  181. package/src/components/SectionIntro/index.ts +3 -0
  182. package/src/components/Slider/Slider.stories.tsx +241 -0
  183. package/src/components/Slider/Slider.tsx +225 -0
  184. package/src/components/Slider/index.ts +24 -0
  185. package/src/components/Spinner/Spinner.stories.tsx +65 -0
  186. package/src/components/Spinner/Spinner.tsx +36 -0
  187. package/src/components/Spinner/index.ts +2 -0
  188. package/src/components/Steps/Steps.stories.tsx +158 -0
  189. package/src/components/Steps/Steps.tsx +115 -0
  190. package/src/components/Steps/index.ts +3 -0
  191. package/src/components/Tab/Tab.stories.tsx +129 -0
  192. package/src/components/Tab/Tab.tsx +111 -0
  193. package/src/components/Tab/index.ts +2 -0
  194. package/src/components/Testimonial/Testimonial.stories.tsx +180 -0
  195. package/src/components/Testimonial/Testimonial.tsx +138 -0
  196. package/src/components/Testimonial/index.ts +3 -0
  197. package/src/components/Todo/Todo.stories.tsx +103 -0
  198. package/src/components/Todo/Todo.tsx +158 -0
  199. package/src/components/Todo/index.ts +1 -0
  200. package/src/components/Toggle/Toggle.stories.tsx +49 -0
  201. package/src/components/Toggle/Toggle.tsx +84 -0
  202. package/src/components/Toggle/index.ts +2 -0
  203. package/src/components/Tooltip/Tooltip.stories.tsx +115 -0
  204. package/src/components/Tooltip/Tooltip.tsx +150 -0
  205. package/src/components/Tooltip/index.ts +3 -0
  206. package/src/components/Upload/Upload.stories.tsx +220 -0
  207. package/src/components/Upload/Upload.tsx +354 -0
  208. package/src/components/Upload/index.ts +3 -0
  209. package/src/components/VideoPlayer/VideoPlayer.stories.tsx +484 -0
  210. package/src/components/VideoPlayer/VideoPlayer.tsx +574 -0
  211. package/src/components/VideoPlayer/index.ts +7 -0
  212. package/src/components/index.ts +111 -0
  213. package/src/layouts/Grid/Container.tsx +58 -0
  214. package/src/layouts/Grid/Grid.stories.tsx +861 -0
  215. package/src/layouts/Grid/Grid.tsx +68 -0
  216. package/src/layouts/Grid/GridCol.tsx +161 -0
  217. package/src/layouts/Grid/README.md +108 -0
  218. package/src/layouts/Grid/Row.tsx +70 -0
  219. package/src/layouts/Grid/index.ts +8 -0
  220. package/src/layouts/MasonryGrid/MasonryGrid.stories.tsx +387 -0
  221. package/src/layouts/MasonryGrid/MasonryGrid.tsx +408 -0
  222. package/src/layouts/MasonryGrid/MasonryGridItem.tsx +44 -0
  223. package/src/layouts/MasonryGrid/README.md +117 -0
  224. package/src/layouts/MasonryGrid/index.ts +4 -0
  225. package/src/layouts/index.ts +7 -0
  226. package/src/lib/README.md +89 -0
  227. package/src/lib/composables/index.ts +63 -0
  228. package/src/lib/composables/useAccordion.ts +129 -0
  229. package/src/lib/composables/useAmbientMode.ts +90 -0
  230. package/src/lib/composables/useBadge.ts +42 -0
  231. package/src/lib/composables/useBarChart.ts +365 -0
  232. package/src/lib/composables/useBlock.ts +56 -0
  233. package/src/lib/composables/useBreadcrumb.ts +81 -0
  234. package/src/lib/composables/useButton.ts +59 -0
  235. package/src/lib/composables/useCallout.ts +55 -0
  236. package/src/lib/composables/useCard.ts +155 -0
  237. package/src/lib/composables/useChart.ts +1082 -0
  238. package/src/lib/composables/useChartAnalytics.ts +505 -0
  239. package/src/lib/composables/useChartData.ts +38 -0
  240. package/src/lib/composables/useChartExport.ts +392 -0
  241. package/src/lib/composables/useChartInteraction.ts +34 -0
  242. package/src/lib/composables/useChartInteractions.ts +123 -0
  243. package/src/lib/composables/useChartPerformance.ts +323 -0
  244. package/src/lib/composables/useChartScale.ts +48 -0
  245. package/src/lib/composables/useChartToolbar.ts +532 -0
  246. package/src/lib/composables/useCheckbox.ts +70 -0
  247. package/src/lib/composables/useDataTable.ts +208 -0
  248. package/src/lib/composables/useDatePicker.ts +564 -0
  249. package/src/lib/composables/useDropdown.ts +272 -0
  250. package/src/lib/composables/useEdgePanel.ts +261 -0
  251. package/src/lib/composables/useForm.ts +62 -0
  252. package/src/lib/composables/useFormGroup.ts +51 -0
  253. package/src/lib/composables/useHero.ts +250 -0
  254. package/src/lib/composables/useInput.ts +58 -0
  255. package/src/lib/composables/useLineChart.ts +319 -0
  256. package/src/lib/composables/useMessages.ts +77 -0
  257. package/src/lib/composables/useModal.ts +110 -0
  258. package/src/lib/composables/useNavbar.ts +288 -0
  259. package/src/lib/composables/usePagination.ts +101 -0
  260. package/src/lib/composables/usePhotoViewer.ts +937 -0
  261. package/src/lib/composables/usePieChart.ts +362 -0
  262. package/src/lib/composables/usePopover.ts +354 -0
  263. package/src/lib/composables/useProgress.ts +74 -0
  264. package/src/lib/composables/useRadio.ts +47 -0
  265. package/src/lib/composables/useRating.ts +174 -0
  266. package/src/lib/composables/useRiver.ts +205 -0
  267. package/src/lib/composables/useSelect.ts +52 -0
  268. package/src/lib/composables/useSideMenu.ts +197 -0
  269. package/src/lib/composables/useSlider.ts +339 -0
  270. package/src/lib/composables/useSpinner.ts +42 -0
  271. package/src/lib/composables/useTextarea.ts +55 -0
  272. package/src/lib/composables/useTodo.ts +141 -0
  273. package/src/lib/composables/useVideoPlayer.ts +398 -0
  274. package/src/lib/constants/components.ts +1433 -0
  275. package/src/lib/constants/index.ts +4 -0
  276. package/src/lib/index.ts +11 -0
  277. package/src/lib/types/components.ts +4750 -0
  278. package/src/lib/types/index.ts +2 -0
  279. package/src/lib/utils/dom.ts +41 -0
  280. package/src/lib/utils/icons.ts +74 -0
  281. package/src/lib/utils/index.ts +55 -0
  282. package/src/lib/utils/useForkRef.test.tsx +64 -0
  283. package/src/lib/utils/useForkRef.ts +36 -0
  284. package/src/lib/utils.test.ts +14 -0
  285. package/src/styles/01-settings/_index.scss +2 -0
  286. package/src/styles/01-settings/_settings.accordion.scss +7 -5
  287. package/src/styles/01-settings/_settings.animations.scss +0 -0
  288. package/src/styles/01-settings/_settings.avatar-group.scss +6 -3
  289. package/src/styles/01-settings/_settings.avatar.scss +2 -2
  290. package/src/styles/01-settings/_settings.badge.scss +15 -9
  291. package/src/styles/01-settings/_settings.block.scss +11 -0
  292. package/src/styles/01-settings/_settings.border-radius.scss +12 -9
  293. package/src/styles/01-settings/_settings.border.scss +4 -1
  294. package/src/styles/01-settings/_settings.box-shadow.scss +1 -1
  295. package/src/styles/01-settings/_settings.breadcrumb.scss +9 -8
  296. package/src/styles/01-settings/_settings.breakpoints.scss +0 -0
  297. package/src/styles/01-settings/_settings.btn-group.scss +4 -1
  298. package/src/styles/01-settings/_settings.button.scss +19 -21
  299. package/src/styles/01-settings/_settings.callout.scss +42 -24
  300. package/src/styles/01-settings/_settings.card.scss +12 -10
  301. package/src/styles/01-settings/_settings.chart.scss +199 -0
  302. package/src/styles/01-settings/_settings.checkbox-group.scss +0 -0
  303. package/src/styles/01-settings/_settings.checkbox.scss +0 -0
  304. package/src/styles/01-settings/_settings.color-mode.scss +0 -0
  305. package/src/styles/01-settings/_settings.colors.scss +20 -0
  306. package/src/styles/01-settings/_settings.config.scss +1 -1
  307. package/src/styles/01-settings/_settings.countdown.scss +0 -0
  308. package/src/styles/01-settings/_settings.data-table.scss +0 -0
  309. package/src/styles/01-settings/_settings.datepicker.scss +0 -0
  310. package/src/styles/01-settings/_settings.dropdown.scss +0 -0
  311. package/src/styles/01-settings/_settings.edge-panel.scss +0 -0
  312. package/src/styles/01-settings/_settings.fonts.scss +1 -1
  313. package/src/styles/01-settings/_settings.form-group.scss +0 -0
  314. package/src/styles/01-settings/_settings.form.scss +0 -0
  315. package/src/styles/01-settings/_settings.grid.scss +3 -3
  316. package/src/styles/01-settings/_settings.hero.scss +1 -1
  317. package/src/styles/01-settings/_settings.input.scss +1 -1
  318. package/src/styles/01-settings/_settings.link.scss +0 -0
  319. package/src/styles/01-settings/_settings.list-group.scss +0 -0
  320. package/src/styles/01-settings/_settings.list.scss +0 -0
  321. package/src/styles/01-settings/_settings.maps.scss +43 -8
  322. package/src/styles/01-settings/_settings.masonry-grid.scss +0 -0
  323. package/src/styles/01-settings/_settings.menu.scss +0 -0
  324. package/src/styles/01-settings/_settings.messages.scss +0 -0
  325. package/src/styles/01-settings/_settings.modal.scss +1 -1
  326. package/src/styles/01-settings/_settings.nav.scss +0 -0
  327. package/src/styles/01-settings/_settings.navbar.scss +0 -0
  328. package/src/styles/01-settings/_settings.pagination.scss +0 -0
  329. package/src/styles/01-settings/_settings.photoviewer.scss +89 -23
  330. package/src/styles/01-settings/_settings.popover.scss +0 -0
  331. package/src/styles/01-settings/_settings.position.scss +0 -0
  332. package/src/styles/01-settings/_settings.progress.scss +0 -0
  333. package/src/styles/01-settings/_settings.rating.scss +0 -0
  334. package/src/styles/01-settings/_settings.river.scss +0 -0
  335. package/src/styles/01-settings/_settings.sectionintro.scss +0 -0
  336. package/src/styles/01-settings/_settings.select.scss +0 -0
  337. package/src/styles/01-settings/_settings.side-menu.scss +0 -0
  338. package/src/styles/01-settings/_settings.skeleton.scss +0 -0
  339. package/src/styles/01-settings/_settings.slider.scss +59 -0
  340. package/src/styles/01-settings/_settings.spacing.scss +11 -3
  341. package/src/styles/01-settings/_settings.spinner.scss +0 -0
  342. package/src/styles/01-settings/_settings.steps.scss +1 -1
  343. package/src/styles/01-settings/_settings.tabs.scss +4 -4
  344. package/src/styles/01-settings/_settings.testimonials.scss +0 -0
  345. package/src/styles/01-settings/_settings.todo.scss +0 -0
  346. package/src/styles/01-settings/_settings.toggle.scss +1 -1
  347. package/src/styles/01-settings/_settings.tooltip.scss +0 -0
  348. package/src/styles/01-settings/_settings.typography.scss +2 -0
  349. package/src/styles/01-settings/_settings.upload.scss +0 -0
  350. package/src/styles/01-settings/_settings.video-player.scss +64 -0
  351. package/src/styles/01-settings/_settings.z-layers.scss +0 -0
  352. package/src/styles/02-tools/_index.scss +1 -0
  353. package/src/styles/02-tools/_tools.animations.scss +82 -0
  354. package/src/styles/02-tools/_tools.border-radius.scss +0 -0
  355. package/src/styles/02-tools/_tools.breakpoints.scss +0 -0
  356. package/src/styles/02-tools/_tools.button.scss +5 -0
  357. package/src/styles/02-tools/_tools.clearfix.scss +0 -0
  358. package/src/styles/02-tools/_tools.color-functions.scss +0 -0
  359. package/src/styles/02-tools/_tools.color-mode.scss +1 -1
  360. package/src/styles/02-tools/_tools.component.scss +479 -0
  361. package/src/styles/02-tools/_tools.event.scss +0 -0
  362. package/src/styles/02-tools/_tools.grid.scss +0 -0
  363. package/src/styles/02-tools/_tools.hidden-visually.scss +0 -0
  364. package/src/styles/02-tools/_tools.hidden.scss +0 -0
  365. package/src/styles/02-tools/_tools.map-loop.scss +0 -0
  366. package/src/styles/02-tools/_tools.media-queries.scss +0 -0
  367. package/src/styles/02-tools/_tools.object-fit.scss +0 -0
  368. package/src/styles/02-tools/_tools.placeholder.scss +0 -0
  369. package/src/styles/02-tools/_tools.rem.scss +5 -1
  370. package/src/styles/02-tools/_tools.size.scss +0 -0
  371. package/src/styles/02-tools/_tools.spacing.scss +0 -0
  372. package/src/styles/02-tools/_tools.to-rgb.scss +0 -0
  373. package/src/styles/02-tools/_tools.transition.scss +0 -0
  374. package/src/styles/02-tools/_tools.utilities.scss +0 -0
  375. package/src/styles/02-tools/_tools.utility-api.scss +23 -2
  376. package/src/styles/03-generic/_generic.fonts.scss +0 -0
  377. package/src/styles/03-generic/_generic.reset.scss +0 -0
  378. package/src/styles/03-generic/_generic.root.scss +5 -1
  379. package/src/styles/03-generic/_generic.selection.scss +0 -0
  380. package/src/styles/03-generic/_index.scss +0 -0
  381. package/src/styles/04-elements/_elements.all.scss +0 -0
  382. package/src/styles/04-elements/_elements.body.scss +0 -0
  383. package/src/styles/04-elements/_elements.heading.scss +0 -0
  384. package/src/styles/04-elements/_elements.html.scss +0 -0
  385. package/src/styles/04-elements/_elements.links.scss +0 -0
  386. package/src/styles/04-elements/_index.scss +0 -0
  387. package/src/styles/05-objects/_index.scss +1 -0
  388. package/src/styles/05-objects/_objects.block.scss +122 -0
  389. package/src/styles/05-objects/_objects.container.scss +14 -10
  390. package/src/styles/05-objects/_objects.grid.scss +0 -0
  391. package/src/styles/05-objects/_objects.masonry-grid.scss +0 -0
  392. package/src/styles/06-components/_components.accordion.scss +3 -1
  393. package/src/styles/06-components/_components.avatar-group.scss +0 -0
  394. package/src/styles/06-components/_components.avatar.scss +0 -0
  395. package/src/styles/06-components/_components.badge.scss +9 -9
  396. package/src/styles/06-components/_components.breadcrumb.scss +0 -0
  397. package/src/styles/06-components/_components.btn-group.scss +0 -0
  398. package/src/styles/06-components/_components.button.scss +0 -0
  399. package/src/styles/06-components/_components.callout.scss +2 -1
  400. package/src/styles/06-components/_components.card.scss +0 -1
  401. package/src/styles/06-components/_components.chart.scss +2102 -0
  402. package/src/styles/06-components/_components.checkbox-group.scss +0 -0
  403. package/src/styles/06-components/_components.checkbox.scss +0 -0
  404. package/src/styles/06-components/_components.color-mode-toggle.scss +0 -0
  405. package/src/styles/06-components/_components.countdown.scss +0 -0
  406. package/src/styles/06-components/_components.data-table.scss +0 -0
  407. package/src/styles/06-components/_components.datepicker.scss +0 -0
  408. package/src/styles/06-components/_components.dropdown.scss +0 -0
  409. package/src/styles/06-components/_components.edge-panel.scss +0 -0
  410. package/src/styles/06-components/_components.form-group.scss +0 -0
  411. package/src/styles/06-components/_components.form.scss +0 -0
  412. package/src/styles/06-components/_components.hero.scss +1 -0
  413. package/src/styles/06-components/_components.icon.scss +2 -2
  414. package/src/styles/06-components/_components.image-gallery.scss +0 -0
  415. package/src/styles/06-components/_components.input.scss +0 -0
  416. package/src/styles/06-components/_components.list-group.scss +0 -0
  417. package/src/styles/06-components/_components.list.scss +0 -0
  418. package/src/styles/06-components/_components.menu.scss +0 -0
  419. package/src/styles/06-components/_components.messages.scss +0 -0
  420. package/src/styles/06-components/_components.modal.scss +3 -0
  421. package/src/styles/06-components/_components.nav.scss +0 -0
  422. package/src/styles/06-components/_components.navbar.scss +0 -0
  423. package/src/styles/06-components/_components.pagination.scss +0 -0
  424. package/src/styles/06-components/_components.photoviewer.scss +603 -545
  425. package/src/styles/06-components/_components.popover.scss +0 -0
  426. package/src/styles/06-components/_components.product-review.scss +0 -0
  427. package/src/styles/06-components/_components.progress.scss +0 -0
  428. package/src/styles/06-components/_components.rating.scss +0 -0
  429. package/src/styles/06-components/_components.river.scss +0 -0
  430. package/src/styles/06-components/_components.sectionintro.scss +0 -0
  431. package/src/styles/06-components/_components.select.scss +0 -0
  432. package/src/styles/06-components/_components.side-menu.scss +0 -0
  433. package/src/styles/06-components/_components.skeleton.scss +0 -0
  434. package/src/styles/06-components/_components.slider.scss +273 -0
  435. package/src/styles/06-components/_components.spinner.scss +0 -0
  436. package/src/styles/06-components/_components.steps.scss +1 -0
  437. package/src/styles/06-components/_components.tabs.scss +0 -0
  438. package/src/styles/06-components/_components.testimonials.scss +0 -0
  439. package/src/styles/06-components/_components.todo.scss +0 -0
  440. package/src/styles/06-components/_components.toggle.scss +0 -0
  441. package/src/styles/06-components/_components.tooltip.scss +4 -9
  442. package/src/styles/06-components/_components.upload.scss +0 -0
  443. package/src/styles/06-components/_components.video-player.scss +623 -0
  444. package/src/styles/06-components/_index.scss +3 -0
  445. package/src/styles/06-components/old.chart.styles.scss +2819 -0
  446. package/src/styles/99-utilities/_index.scss +0 -0
  447. package/src/styles/99-utilities/_utilities.background.scss +0 -0
  448. package/src/styles/99-utilities/_utilities.border.scss +0 -0
  449. package/src/styles/99-utilities/_utilities.clearfix.scss +0 -0
  450. package/src/styles/99-utilities/_utilities.display.scss +0 -0
  451. package/src/styles/99-utilities/_utilities.flex.scss +0 -0
  452. package/src/styles/99-utilities/_utilities.link.scss +0 -0
  453. package/src/styles/99-utilities/_utilities.object-fit.scss +0 -0
  454. package/src/styles/99-utilities/_utilities.opacity.scss +0 -0
  455. package/src/styles/99-utilities/_utilities.overflow.scss +0 -0
  456. package/src/styles/99-utilities/_utilities.position.scss +0 -0
  457. package/src/styles/99-utilities/_utilities.scss +2 -1
  458. package/src/styles/99-utilities/_utilities.shadow.scss +0 -0
  459. package/src/styles/99-utilities/_utilities.sizes.scss +0 -0
  460. package/src/styles/99-utilities/_utilities.spacing.scss +0 -0
  461. package/src/styles/99-utilities/_utilities.text.scss +5 -0
  462. package/src/styles/99-utilities/_utilities.visibility.scss +0 -0
  463. package/src/styles/99-utilities/_utilities.visually-hidden.scss +0 -0
  464. package/src/styles/99-utilities/_utilities.z-index.scss +0 -0
  465. package/src/styles/css-modules.d.ts +0 -0
  466. package/src/styles/index.scss +0 -0
  467. package/dist/index.css +0 -15
  468. package/dist/index.esm.css +0 -15
  469. package/dist/index.min.css +0 -15
@@ -0,0 +1,272 @@
1
+ import { useState, useRef, useEffect, useCallback } from 'react';
2
+ import { DROPDOWN } from '../constants/components';
3
+ import type { DropdownPlacement, DropdownTrigger } from '../types/components';
4
+
5
+ interface UseDropdownProps {
6
+ placement?: DropdownPlacement;
7
+ trigger?: DropdownTrigger;
8
+ offset?: number;
9
+ defaultOpen?: boolean;
10
+ isOpen?: boolean;
11
+ onOpenChange?: (isOpen: boolean) => void;
12
+ closeOnClickOutside?: boolean;
13
+ closeOnEscape?: boolean;
14
+ id?: string;
15
+ }
16
+
17
+ interface UseDropdownReturn {
18
+ isOpen: boolean;
19
+ setIsOpen: (isOpen: boolean) => void;
20
+ triggerRef: React.RefObject<HTMLElement | null>;
21
+ menuRef: React.RefObject<HTMLElement | null>;
22
+ dropdownId: string;
23
+ currentPlacement: DropdownPlacement;
24
+ updatePosition: () => void;
25
+ }
26
+
27
+ /**
28
+ * Hook for managing dropdown state and position
29
+ */
30
+ export const useDropdown = ({
31
+ placement = DROPDOWN.DEFAULTS.PLACEMENT as DropdownPlacement,
32
+ trigger = DROPDOWN.DEFAULTS.TRIGGER as DropdownTrigger,
33
+ offset = DROPDOWN.DEFAULTS.OFFSET,
34
+ defaultOpen = false,
35
+ isOpen: controlledIsOpen,
36
+ onOpenChange,
37
+ closeOnClickOutside = true,
38
+ closeOnEscape = true,
39
+ id,
40
+ }: UseDropdownProps): UseDropdownReturn => {
41
+ // Generate unique ID for the dropdown menu
42
+ const uniqueId = useRef(`dropdown-${id || Math.random().toString(36).substring(2, 9)}`);
43
+
44
+ // Setup controlled vs uncontrolled state
45
+ const [uncontrolledIsOpen, setUncontrolledIsOpen] = useState(defaultOpen);
46
+
47
+ // Use either controlled or uncontrolled state
48
+ const isOpen = controlledIsOpen !== undefined ? controlledIsOpen : uncontrolledIsOpen;
49
+
50
+ // Callback to update open state with notification to parent
51
+ const setIsOpen = useCallback(
52
+ (nextIsOpen: boolean) => {
53
+ if (controlledIsOpen === undefined) {
54
+ setUncontrolledIsOpen(nextIsOpen);
55
+ }
56
+
57
+ if (onOpenChange) {
58
+ onOpenChange(nextIsOpen);
59
+ }
60
+ },
61
+ [controlledIsOpen, onOpenChange]
62
+ );
63
+
64
+ // Refs for trigger and dropdown menu elements
65
+ const triggerRef = useRef<HTMLElement>(null);
66
+ const menuRef = useRef<HTMLElement>(null);
67
+
68
+ // Current placement state
69
+ const [currentPlacement, setCurrentPlacement] = useState(placement);
70
+
71
+ // Handle click outside
72
+ useEffect(() => {
73
+ if (!isOpen || !closeOnClickOutside) return undefined;
74
+
75
+ const handleClickOutside = (event: MouseEvent) => {
76
+ if (
77
+ menuRef.current &&
78
+ triggerRef.current &&
79
+ !menuRef.current.contains(event.target as Node) &&
80
+ !triggerRef.current.contains(event.target as Node)
81
+ ) {
82
+ setIsOpen(false);
83
+ }
84
+ };
85
+
86
+ document.addEventListener('mousedown', handleClickOutside);
87
+
88
+ return () => {
89
+ document.removeEventListener('mousedown', handleClickOutside);
90
+ };
91
+ }, [isOpen, closeOnClickOutside, setIsOpen]);
92
+
93
+ // Handle escape key
94
+ useEffect(() => {
95
+ if (!isOpen || !closeOnEscape) return undefined;
96
+
97
+ const handleEscapeKey = (event: KeyboardEvent) => {
98
+ if (event.key === 'Escape') {
99
+ setIsOpen(false);
100
+ }
101
+ };
102
+
103
+ document.addEventListener('keydown', handleEscapeKey);
104
+
105
+ return () => {
106
+ document.removeEventListener('keydown', handleEscapeKey);
107
+ };
108
+ }, [isOpen, closeOnEscape, setIsOpen]);
109
+
110
+ // Helper function to get the flipped placement if needed
111
+ const getFlippedPlacement = useCallback(
112
+ (
113
+ placement: DropdownPlacement,
114
+ triggerRect: DOMRect,
115
+ menuRect: DOMRect,
116
+ offset: number
117
+ ): DropdownPlacement => {
118
+ const viewportWidth = window.innerWidth;
119
+ const viewportHeight = window.innerHeight;
120
+
121
+ // Start with the requested placement
122
+ let newPlacement = placement;
123
+
124
+ // Flip vertical placement if needed
125
+ if (
126
+ placement.startsWith('bottom') &&
127
+ triggerRect.bottom + menuRect.height + offset > viewportHeight
128
+ ) {
129
+ newPlacement = placement.replace('bottom', 'top') as DropdownPlacement;
130
+ } else if (placement.startsWith('top') && triggerRect.top - menuRect.height - offset < 0) {
131
+ newPlacement = placement.replace('top', 'bottom') as DropdownPlacement;
132
+ }
133
+
134
+ // Flip horizontal placement if needed
135
+ if (placement.startsWith('left') && triggerRect.left - menuRect.width - offset < 0) {
136
+ newPlacement = placement.replace('left', 'right') as DropdownPlacement;
137
+ } else if (
138
+ placement.startsWith('right') &&
139
+ triggerRect.right + menuRect.width + offset > viewportWidth
140
+ ) {
141
+ newPlacement = placement.replace('right', 'left') as DropdownPlacement;
142
+ }
143
+
144
+ // Adjust alignment for top/bottom placements
145
+ if (newPlacement.startsWith('top') || newPlacement.startsWith('bottom')) {
146
+ if (newPlacement.endsWith('start') && triggerRect.left + menuRect.width > viewportWidth) {
147
+ newPlacement = newPlacement.replace('start', 'end') as DropdownPlacement;
148
+ } else if (newPlacement.endsWith('end') && triggerRect.right - menuRect.width < 0) {
149
+ newPlacement = newPlacement.replace('end', 'start') as DropdownPlacement;
150
+ }
151
+ }
152
+
153
+ return newPlacement;
154
+ },
155
+ []
156
+ );
157
+
158
+ // Helper function to calculate position based on placement
159
+ const calculatePosition = useCallback(
160
+ (
161
+ placement: DropdownPlacement,
162
+ triggerRect: DOMRect,
163
+ menuRect: DOMRect,
164
+ offset: number
165
+ ): { top: number; left: number } => {
166
+ let top = 0;
167
+ let left = 0;
168
+
169
+ // Vertical positioning
170
+ if (placement.startsWith('bottom')) {
171
+ top = triggerRect.height + offset;
172
+ } else if (placement.startsWith('top')) {
173
+ top = -menuRect.height - offset;
174
+ } else if (placement.startsWith('left') || placement.startsWith('right')) {
175
+ top = triggerRect.height / 2 - menuRect.height / 2;
176
+ }
177
+
178
+ // Horizontal positioning
179
+ if (placement.startsWith('left')) {
180
+ left = -menuRect.width - offset;
181
+ } else if (placement.startsWith('right')) {
182
+ left = triggerRect.width + offset;
183
+ } else if (placement.endsWith('start')) {
184
+ left = 0;
185
+ } else if (placement.endsWith('end')) {
186
+ left = triggerRect.width - menuRect.width;
187
+ } else {
188
+ left = triggerRect.width / 2 - menuRect.width / 2;
189
+ }
190
+
191
+ return { top, left };
192
+ },
193
+ []
194
+ );
195
+
196
+ // Calculate and update dropdown position
197
+ const updatePosition = useCallback(() => {
198
+ if (!isOpen || !triggerRef.current || !menuRef.current) return;
199
+
200
+ const triggerRect = triggerRef.current.getBoundingClientRect();
201
+ const menuRect = menuRef.current.getBoundingClientRect();
202
+
203
+ // Get the optimal placement
204
+ const newPlacement = getFlippedPlacement(placement, triggerRect, menuRect, offset);
205
+
206
+ // Calculate position based on the new placement
207
+ const { top, left } = calculatePosition(newPlacement, triggerRect, menuRect, offset);
208
+
209
+ // Apply position
210
+ menuRef.current.style.position = 'absolute';
211
+ menuRef.current.style.top = `${top}px`;
212
+ menuRef.current.style.left = `${left}px`;
213
+
214
+ // Update placement state if it changed
215
+ if (newPlacement !== currentPlacement) {
216
+ setCurrentPlacement(newPlacement);
217
+ }
218
+ }, [isOpen, offset, placement, currentPlacement, getFlippedPlacement, calculatePosition]);
219
+
220
+ // Update position when menu is opened
221
+ useEffect(() => {
222
+ if (!isOpen) return undefined;
223
+
224
+ // Initial position update
225
+ updatePosition();
226
+
227
+ // Use ResizeObserver to detect size changes in the menu
228
+ let resizeObserver: ResizeObserver | null = null;
229
+ if (menuRef.current && typeof ResizeObserver !== 'undefined') {
230
+ resizeObserver = new ResizeObserver(() => {
231
+ requestAnimationFrame(updatePosition);
232
+ });
233
+ resizeObserver.observe(menuRef.current);
234
+ }
235
+
236
+ // Update position on resize/scroll
237
+ const handleResize = () => {
238
+ requestAnimationFrame(updatePosition);
239
+ };
240
+
241
+ const handleScroll = () => {
242
+ requestAnimationFrame(updatePosition);
243
+ };
244
+
245
+ window.addEventListener('resize', handleResize);
246
+ window.addEventListener('scroll', handleScroll, { passive: true });
247
+
248
+ // Fallback for browsers without ResizeObserver or for dynamic content changes
249
+ // Use a less frequent interval (500ms instead of 200ms)
250
+ const intervalId = window.setInterval(updatePosition, 500);
251
+
252
+ return () => {
253
+ if (resizeObserver && menuRef.current) {
254
+ resizeObserver.unobserve(menuRef.current);
255
+ resizeObserver.disconnect();
256
+ }
257
+ window.removeEventListener('resize', handleResize);
258
+ window.removeEventListener('scroll', handleScroll);
259
+ window.clearInterval(intervalId);
260
+ };
261
+ }, [isOpen, updatePosition]);
262
+
263
+ return {
264
+ isOpen,
265
+ setIsOpen,
266
+ triggerRef,
267
+ menuRef,
268
+ dropdownId: uniqueId.current,
269
+ currentPlacement,
270
+ updatePosition,
271
+ };
272
+ };
@@ -0,0 +1,261 @@
1
+ import { useEffect, useRef, useState, useCallback } from 'react';
2
+ import { EdgePanelProps } from '../types/components';
3
+ import { EDGE_PANEL } from '../constants/components';
4
+
5
+ /**
6
+ * EdgePanel state and functionality
7
+ * @param initialProps - Initial EdgePanel properties
8
+ * @returns EdgePanel state and methods
9
+ */
10
+ export function useEdgePanel(initialProps?: Partial<EdgePanelProps>) {
11
+ // Default EdgePanel properties
12
+ const defaultProps: Partial<EdgePanelProps> = {
13
+ position: 'start',
14
+ mode: 'slide',
15
+ isOpen: false,
16
+ backdrop: true,
17
+ closeOnBackdropClick: true,
18
+ closeOnEscape: true,
19
+ ...initialProps,
20
+ };
21
+
22
+ const [isOpen, setIsOpen] = useState(defaultProps.isOpen || false);
23
+ const containerRef = useRef<HTMLDivElement>(null);
24
+ const backdropRef = useRef<HTMLDivElement>(null);
25
+
26
+ /**
27
+ * Generate EdgePanel class based on properties
28
+ * @param props - EdgePanel properties
29
+ * @returns Class string
30
+ */
31
+ const generateEdgePanelClass = (props: Partial<EdgePanelProps>): string => {
32
+ const { position = defaultProps.position, className = '', isOpen: propIsOpen } = props;
33
+
34
+ const baseClass = EDGE_PANEL.CLASSES.BASE;
35
+ const positionClass = position ? `${baseClass}--${position}` : '';
36
+ const openClass = (propIsOpen ?? isOpen) ? EDGE_PANEL.CLASSES.IS_OPEN : '';
37
+
38
+ return `${baseClass} ${positionClass} ${openClass} ${className}`.trim();
39
+ };
40
+
41
+ /**
42
+ * Adjust body padding in push mode
43
+ */
44
+ const adjustBodyPadding = useCallback(() => {
45
+ if (!containerRef.current || defaultProps.mode !== 'push') return;
46
+
47
+ const { position } = defaultProps;
48
+ const size =
49
+ position === 'top' || position === 'bottom'
50
+ ? containerRef.current.clientHeight
51
+ : containerRef.current.clientWidth;
52
+
53
+ // Map position to CSS padding property
54
+ let paddingProperty: string;
55
+ switch (position) {
56
+ case 'start':
57
+ paddingProperty = 'paddingLeft';
58
+ break;
59
+ case 'end':
60
+ paddingProperty = 'paddingRight';
61
+ break;
62
+ default:
63
+ // For top/bottom, capitalize first letter
64
+ paddingProperty = `padding${position!.charAt(0).toUpperCase() + position!.slice(1)}`;
65
+ }
66
+
67
+ document.body.style[paddingProperty as any] = `${size}px`;
68
+ document.body.classList.add('is-pushed');
69
+ }, [defaultProps.mode, defaultProps.position]);
70
+
71
+ /**
72
+ * Reset body padding
73
+ */
74
+ const resetBodyPadding = useCallback(() => {
75
+ if (defaultProps.mode !== 'push') return;
76
+
77
+ const { position } = defaultProps;
78
+
79
+ // Map position to CSS padding property
80
+ let paddingProperty: string;
81
+ switch (position) {
82
+ case 'start':
83
+ paddingProperty = 'paddingLeft';
84
+ break;
85
+ case 'end':
86
+ paddingProperty = 'paddingRight';
87
+ break;
88
+ default:
89
+ // For top/bottom, capitalize first letter
90
+ paddingProperty = `padding${position!.charAt(0).toUpperCase() + position!.slice(1)}`;
91
+ }
92
+
93
+ document.body.style[paddingProperty as any] = '';
94
+ document.body.classList.remove('is-pushed');
95
+ }, [defaultProps.mode, defaultProps.position]);
96
+
97
+ /**
98
+ * Open the panel
99
+ */
100
+ const openPanel = useCallback(() => {
101
+ setIsOpen(true);
102
+ document.body.classList.add('is-edgepanel-open');
103
+
104
+ if (containerRef.current) {
105
+ const { mode } = defaultProps;
106
+
107
+ // Only add animation if not in 'none' mode
108
+ if (mode !== 'none') {
109
+ // Add animation class first
110
+ containerRef.current.classList.add('is-animating');
111
+
112
+ // Force a reflow before starting the animation
113
+ void containerRef.current.offsetHeight;
114
+
115
+ // Remove animation class after animation completes
116
+ const container = containerRef.current;
117
+ setTimeout(() => {
118
+ if (container) {
119
+ container.classList.remove('is-animating');
120
+ }
121
+ }, EDGE_PANEL.ANIMATION_DURATION);
122
+ }
123
+
124
+ // Then set transform
125
+ containerRef.current.style.transform = 'translate(0)';
126
+
127
+ // If push mode, adjust body padding
128
+ if (defaultProps.mode === 'push') {
129
+ adjustBodyPadding();
130
+ }
131
+ }
132
+
133
+ if (defaultProps.onOpenChange) {
134
+ defaultProps.onOpenChange(true);
135
+ }
136
+ }, [defaultProps, adjustBodyPadding]);
137
+
138
+ /**
139
+ * Close the panel
140
+ */
141
+ const closePanel = useCallback(() => {
142
+ if (containerRef.current) {
143
+ const { position, mode } = defaultProps;
144
+
145
+ // Only add animation if not in 'none' mode
146
+ if (mode !== 'none') {
147
+ // Add animation class first
148
+ containerRef.current.classList.add('is-animating-out');
149
+
150
+ // Capture container for setTimeout
151
+ const container = containerRef.current;
152
+
153
+ setTimeout(() => {
154
+ if (container) {
155
+ container.classList.remove('is-animating-out');
156
+ }
157
+ }, EDGE_PANEL.ANIMATION_DURATION);
158
+ }
159
+
160
+ // Then set transform
161
+ containerRef.current.style.transform = position ? EDGE_PANEL.TRANSFORM_VALUES[position] : '';
162
+
163
+ // Reset body padding if push mode
164
+ if (defaultProps.mode === 'push') {
165
+ resetBodyPadding();
166
+ }
167
+
168
+ // Wait for animation to complete before hiding
169
+ const hideDelay = mode === 'none' ? 0 : EDGE_PANEL.ANIMATION_DURATION;
170
+
171
+ setTimeout(() => {
172
+ setIsOpen(false);
173
+ document.body.classList.remove('is-edgepanel-open');
174
+
175
+ if (defaultProps.onOpenChange) {
176
+ defaultProps.onOpenChange(false);
177
+ }
178
+ }, hideDelay);
179
+ } else {
180
+ setIsOpen(false);
181
+ document.body.classList.remove('is-edgepanel-open');
182
+
183
+ if (defaultProps.onOpenChange) {
184
+ defaultProps.onOpenChange(false);
185
+ }
186
+ }
187
+ }, [defaultProps, resetBodyPadding]);
188
+
189
+ /**
190
+ * Handle Escape key press
191
+ */
192
+ const handleEscapeKey = useCallback(
193
+ (event: KeyboardEvent) => {
194
+ if (defaultProps.closeOnEscape && event.key === 'Escape' && isOpen) {
195
+ closePanel();
196
+ }
197
+ },
198
+ [closePanel, defaultProps.closeOnEscape, isOpen]
199
+ );
200
+
201
+ /**
202
+ * Handle backdrop click
203
+ */
204
+ const handleBackdropClick = useCallback(
205
+ (event: React.MouseEvent<HTMLDivElement>) => {
206
+ if (defaultProps.closeOnBackdropClick && event.target === event.currentTarget) {
207
+ closePanel();
208
+ }
209
+ },
210
+ [closePanel, defaultProps.closeOnBackdropClick]
211
+ );
212
+
213
+ /**
214
+ * Set up event listeners for keyboard events
215
+ */
216
+ useEffect(() => {
217
+ if (isOpen && defaultProps.closeOnEscape) {
218
+ document.addEventListener('keydown', handleEscapeKey);
219
+ }
220
+
221
+ return () => {
222
+ document.removeEventListener('keydown', handleEscapeKey);
223
+ };
224
+ }, [isOpen, handleEscapeKey, defaultProps.closeOnEscape]);
225
+
226
+ /**
227
+ * Set initial transform values
228
+ */
229
+ useEffect(() => {
230
+ if (containerRef.current) {
231
+ const { position, mode } = defaultProps;
232
+
233
+ if (!isOpen && (mode === 'slide' || mode === 'push') && position) {
234
+ containerRef.current.style.transform = EDGE_PANEL.TRANSFORM_VALUES[position];
235
+ }
236
+ }
237
+ }, [defaultProps.mode, defaultProps.position, isOpen]);
238
+
239
+ /**
240
+ * Sync with prop changes
241
+ */
242
+ useEffect(() => {
243
+ if (defaultProps.isOpen !== undefined && defaultProps.isOpen !== isOpen) {
244
+ if (defaultProps.isOpen) {
245
+ openPanel();
246
+ } else {
247
+ closePanel();
248
+ }
249
+ }
250
+ }, [defaultProps.isOpen, closePanel, isOpen, openPanel]);
251
+
252
+ return {
253
+ isOpen,
254
+ containerRef,
255
+ backdropRef,
256
+ generateEdgePanelClass,
257
+ openPanel,
258
+ closePanel,
259
+ handleBackdropClick,
260
+ };
261
+ }
@@ -0,0 +1,62 @@
1
+ import { FormProps } from '../types/components';
2
+ import { FORM } from '../constants/components';
3
+
4
+ /**
5
+ * Form state and functionality
6
+ * @param initialProps - Initial form properties
7
+ * @returns Form state and methods
8
+ */
9
+ export function useForm(initialProps?: Partial<FormProps>) {
10
+ // Default form properties
11
+ const defaultProps: Partial<FormProps> = {
12
+ disabled: false,
13
+ ...initialProps,
14
+ };
15
+
16
+ /**
17
+ * Generate form class based on properties
18
+ * @param props - Form properties
19
+ * @returns Class string
20
+ */
21
+ const generateFormClass = (props: Partial<FormProps>): string => {
22
+ const { disabled = defaultProps.disabled, className = '' } = props;
23
+
24
+ const disabledClass = disabled ? FORM.CLASSES.DISABLED : '';
25
+
26
+ return `${FORM.CLASSES.BASE} ${disabledClass} ${className}`.trim();
27
+ };
28
+
29
+ /**
30
+ * Handle form submission with disabled check
31
+ * @param handler - Submit handler function
32
+ * @returns Function that respects disabled state
33
+ */
34
+ const handleSubmit = (handler?: (event: React.FormEvent<HTMLFormElement>) => void) => {
35
+ return (event: React.FormEvent<HTMLFormElement>) => {
36
+ event.preventDefault();
37
+ if (!defaultProps.disabled && handler) {
38
+ handler(event);
39
+ }
40
+ };
41
+ };
42
+
43
+ /**
44
+ * Handle form reset with disabled check
45
+ * @param handler - Reset handler function
46
+ * @returns Function that respects disabled state
47
+ */
48
+ const handleReset = (handler?: (event: React.FormEvent<HTMLFormElement>) => void) => {
49
+ return (event: React.FormEvent<HTMLFormElement>) => {
50
+ if (!defaultProps.disabled && handler) {
51
+ handler(event);
52
+ }
53
+ };
54
+ };
55
+
56
+ return {
57
+ defaultProps,
58
+ generateFormClass,
59
+ handleSubmit,
60
+ handleReset,
61
+ };
62
+ }
@@ -0,0 +1,51 @@
1
+ import { FormGroupProps } from '../types/components';
2
+ import { FORM_GROUP } from '../constants/components';
3
+
4
+ /**
5
+ * Form Group state and functionality
6
+ * @param initialProps - Initial form group properties
7
+ * @returns Form Group state and methods
8
+ */
9
+ export function useFormGroup(initialProps?: Partial<FormGroupProps>) {
10
+ // Default form group properties
11
+ const defaultProps: Partial<FormGroupProps> = {
12
+ size: 'md',
13
+ disabled: false,
14
+ invalid: false,
15
+ valid: false,
16
+ ...initialProps,
17
+ };
18
+
19
+ /**
20
+ * Generate form group class based on properties
21
+ * @param props - Form group properties
22
+ * @returns Class string
23
+ */
24
+ const generateFormGroupClass = (props: Partial<FormGroupProps>): string => {
25
+ const {
26
+ size = defaultProps.size,
27
+ disabled = defaultProps.disabled,
28
+ invalid = defaultProps.invalid,
29
+ valid = defaultProps.valid,
30
+ className = '',
31
+ } = props;
32
+
33
+ const sizeClass =
34
+ size === 'md' ? '' : size === 'sm' ? FORM_GROUP.CLASSES.SMALL : FORM_GROUP.CLASSES.LARGE;
35
+
36
+ const validationClass = invalid
37
+ ? FORM_GROUP.CLASSES.INVALID
38
+ : valid
39
+ ? FORM_GROUP.CLASSES.VALID
40
+ : '';
41
+
42
+ const disabledClass = disabled ? FORM_GROUP.CLASSES.DISABLED : '';
43
+
44
+ return `${FORM_GROUP.CLASSES.BASE} ${sizeClass} ${validationClass} ${disabledClass} ${className}`.trim();
45
+ };
46
+
47
+ return {
48
+ defaultProps,
49
+ generateFormGroupClass,
50
+ };
51
+ }