@shohojdhara/atomix 0.1.30 → 0.2.2

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 (481) hide show
  1. package/CHANGELOG.md +0 -0
  2. package/LICENSE +0 -0
  3. package/README.md +128 -43
  4. package/dist/atomix.css +15025 -0
  5. package/dist/atomix.min.css +15 -0
  6. package/dist/index.d.ts +6459 -1748
  7. package/dist/index.esm.js +17559 -8364
  8. package/dist/index.esm.js.map +1 -1
  9. package/dist/index.js +17603 -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 +14677 -0
  14. package/dist/themes/boomdevs.min.css +405 -0
  15. package/dist/themes/esrar.css +16870 -0
  16. package/dist/themes/esrar.min.css +189 -0
  17. package/dist/themes/mashroom.css +29578 -0
  18. package/dist/themes/mashroom.min.css +403 -0
  19. package/dist/themes/shaj-default.css +15702 -0
  20. package/dist/themes/shaj-default.min.css +500 -0
  21. package/dist/themes/yabai.css +15207 -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/Footer/Footer.stories.tsx +388 -0
  102. package/src/components/Footer/Footer.tsx +197 -0
  103. package/src/components/Footer/FooterLink.tsx +72 -0
  104. package/src/components/Footer/FooterSection.tsx +87 -0
  105. package/src/components/Footer/FooterSocialLink.tsx +117 -0
  106. package/src/components/Footer/README.md +261 -0
  107. package/src/components/Footer/index.ts +13 -0
  108. package/src/components/Form/Checkbox.stories.tsx +76 -0
  109. package/src/components/Form/Checkbox.tsx +69 -0
  110. package/src/components/Form/Form.stories.tsx +497 -0
  111. package/src/components/Form/Form.tsx +46 -0
  112. package/src/components/Form/FormGroup.stories.tsx +162 -0
  113. package/src/components/Form/FormGroup.tsx +53 -0
  114. package/src/components/Form/Input.stories.tsx +106 -0
  115. package/src/components/Form/Input.tsx +87 -0
  116. package/src/components/Form/Radio.stories.tsx +94 -0
  117. package/src/components/Form/Radio.tsx +65 -0
  118. package/src/components/Form/Select.stories.tsx +151 -0
  119. package/src/components/Form/Select.tsx +191 -0
  120. package/src/components/Form/Textarea.stories.tsx +123 -0
  121. package/src/components/Form/Textarea.tsx +78 -0
  122. package/src/components/Form/index.ts +7 -0
  123. package/src/components/Hero/Hero.stories.tsx +295 -0
  124. package/src/components/Hero/Hero.tsx +175 -0
  125. package/src/components/Hero/index.ts +6 -0
  126. package/src/components/Icon/Icon.tsx +87 -0
  127. package/src/components/Icon/index.ts +2 -0
  128. package/src/components/List/List.stories.tsx +122 -0
  129. package/src/components/List/List.tsx +35 -0
  130. package/src/components/List/ListGroup.tsx +35 -0
  131. package/src/components/List/index.ts +2 -0
  132. package/src/components/Messages/Messages.stories.tsx +160 -0
  133. package/src/components/Messages/Messages.tsx +172 -0
  134. package/src/components/Messages/index.ts +3 -0
  135. package/src/components/Modal/Modal.stories.tsx +284 -0
  136. package/src/components/Modal/Modal.tsx +198 -0
  137. package/src/components/Modal/README.md +169 -0
  138. package/src/components/Modal/index.ts +1 -0
  139. package/src/components/Navigation/Menu/MegaMenu.tsx +109 -0
  140. package/src/components/Navigation/Menu/Menu.stories.tsx +339 -0
  141. package/src/components/Navigation/Menu/Menu.tsx +111 -0
  142. package/src/components/Navigation/Nav/Nav.stories.tsx +456 -0
  143. package/src/components/Navigation/Nav/Nav.tsx +51 -0
  144. package/src/components/Navigation/Nav/NavDropdown.tsx +105 -0
  145. package/src/components/Navigation/Nav/NavItem.tsx +168 -0
  146. package/src/components/Navigation/Navbar/Navbar.stories.tsx +569 -0
  147. package/src/components/Navigation/Navbar/Navbar.tsx +150 -0
  148. package/src/components/Navigation/README.md +314 -0
  149. package/src/components/Navigation/SideMenu/SideMenu.README.md +494 -0
  150. package/src/components/Navigation/SideMenu/SideMenu.stories.tsx +609 -0
  151. package/src/components/Navigation/SideMenu/SideMenu.tsx +101 -0
  152. package/src/components/Navigation/SideMenu/SideMenuItem.tsx +103 -0
  153. package/src/components/Navigation/SideMenu/SideMenuList.tsx +41 -0
  154. package/src/components/Navigation/index.ts +23 -0
  155. package/src/components/Pagination/Pagination.stories.tsx +188 -0
  156. package/src/components/Pagination/Pagination.tsx +162 -0
  157. package/src/components/Pagination/index.ts +1 -0
  158. package/src/components/PhotoViewer/PhotoViewer.stories.tsx +397 -0
  159. package/src/components/PhotoViewer/PhotoViewer.tsx +246 -0
  160. package/src/components/PhotoViewer/PhotoViewerHeader.tsx +184 -0
  161. package/src/components/PhotoViewer/PhotoViewerImage.tsx +173 -0
  162. package/src/components/PhotoViewer/PhotoViewerInfo.tsx +91 -0
  163. package/src/components/PhotoViewer/PhotoViewerNavigation.tsx +85 -0
  164. package/src/components/PhotoViewer/PhotoViewerThumbnails.tsx +63 -0
  165. package/src/components/PhotoViewer/README.md +358 -0
  166. package/src/components/PhotoViewer/examples/ImageGallery.tsx +187 -0
  167. package/src/components/PhotoViewer/examples/SimpleGallery.tsx +73 -0
  168. package/src/components/PhotoViewer/examples/index.ts +2 -0
  169. package/src/components/PhotoViewer/index.ts +14 -0
  170. package/src/components/Popover/Popover.stories.tsx +143 -0
  171. package/src/components/Popover/Popover.tsx +137 -0
  172. package/src/components/Popover/index.ts +5 -0
  173. package/src/components/Popover/readme.md +120 -0
  174. package/src/components/ProductReview/ProductReview.stories.tsx +88 -0
  175. package/src/components/ProductReview/ProductReview.tsx +169 -0
  176. package/src/components/ProductReview/index.ts +3 -0
  177. package/src/components/Progress/Progress.stories.tsx +75 -0
  178. package/src/components/Progress/Progress.tsx +45 -0
  179. package/src/components/Progress/index.ts +1 -0
  180. package/src/components/Rating/Rating.stories.tsx +109 -0
  181. package/src/components/Rating/Rating.tsx +286 -0
  182. package/src/components/Rating/index.ts +6 -0
  183. package/src/components/River/River.stories.tsx +230 -0
  184. package/src/components/River/River.tsx +134 -0
  185. package/src/components/River/index.ts +2 -0
  186. package/src/components/SectionIntro/SectionIntro.stories.tsx +143 -0
  187. package/src/components/SectionIntro/SectionIntro.tsx +182 -0
  188. package/src/components/SectionIntro/index.ts +3 -0
  189. package/src/components/Slider/Slider.stories.tsx +825 -0
  190. package/src/components/Slider/Slider.tsx +227 -0
  191. package/src/components/Slider/index.ts +24 -0
  192. package/src/components/Spinner/Spinner.stories.tsx +65 -0
  193. package/src/components/Spinner/Spinner.tsx +36 -0
  194. package/src/components/Spinner/index.ts +2 -0
  195. package/src/components/Steps/Steps.stories.tsx +158 -0
  196. package/src/components/Steps/Steps.tsx +115 -0
  197. package/src/components/Steps/index.ts +3 -0
  198. package/src/components/Tab/Tab.stories.tsx +129 -0
  199. package/src/components/Tab/Tab.tsx +111 -0
  200. package/src/components/Tab/index.ts +2 -0
  201. package/src/components/Testimonial/Testimonial.stories.tsx +180 -0
  202. package/src/components/Testimonial/Testimonial.tsx +138 -0
  203. package/src/components/Testimonial/index.ts +3 -0
  204. package/src/components/Todo/Todo.stories.tsx +103 -0
  205. package/src/components/Todo/Todo.tsx +158 -0
  206. package/src/components/Todo/index.ts +1 -0
  207. package/src/components/Toggle/Toggle.stories.tsx +49 -0
  208. package/src/components/Toggle/Toggle.tsx +84 -0
  209. package/src/components/Toggle/index.ts +2 -0
  210. package/src/components/Tooltip/Tooltip.stories.tsx +115 -0
  211. package/src/components/Tooltip/Tooltip.tsx +150 -0
  212. package/src/components/Tooltip/index.ts +3 -0
  213. package/src/components/Upload/Upload.stories.tsx +220 -0
  214. package/src/components/Upload/Upload.tsx +354 -0
  215. package/src/components/Upload/index.ts +3 -0
  216. package/src/components/VideoPlayer/VideoPlayer.stories.tsx +484 -0
  217. package/src/components/VideoPlayer/VideoPlayer.tsx +574 -0
  218. package/src/components/VideoPlayer/index.ts +7 -0
  219. package/src/components/index.ts +124 -0
  220. package/src/layouts/Grid/Container.tsx +58 -0
  221. package/src/layouts/Grid/Grid.stories.tsx +928 -0
  222. package/src/layouts/Grid/Grid.tsx +68 -0
  223. package/src/layouts/Grid/GridCol.tsx +161 -0
  224. package/src/layouts/Grid/README.md +108 -0
  225. package/src/layouts/Grid/Row.tsx +70 -0
  226. package/src/layouts/Grid/index.ts +8 -0
  227. package/src/layouts/MasonryGrid/MasonryGrid.stories.tsx +387 -0
  228. package/src/layouts/MasonryGrid/MasonryGrid.tsx +408 -0
  229. package/src/layouts/MasonryGrid/MasonryGridItem.tsx +44 -0
  230. package/src/layouts/MasonryGrid/README.md +117 -0
  231. package/src/layouts/MasonryGrid/index.ts +4 -0
  232. package/src/layouts/index.ts +7 -0
  233. package/src/lib/README.md +89 -0
  234. package/src/lib/composables/index.ts +63 -0
  235. package/src/lib/composables/useAccordion.ts +129 -0
  236. package/src/lib/composables/useAmbientMode.ts +90 -0
  237. package/src/lib/composables/useBadge.ts +42 -0
  238. package/src/lib/composables/useBarChart.ts +365 -0
  239. package/src/lib/composables/useBlock.ts +56 -0
  240. package/src/lib/composables/useBreadcrumb.ts +81 -0
  241. package/src/lib/composables/useButton.ts +59 -0
  242. package/src/lib/composables/useCallout.ts +55 -0
  243. package/src/lib/composables/useCard.ts +155 -0
  244. package/src/lib/composables/useChart.ts +1082 -0
  245. package/src/lib/composables/useChartAnalytics.ts +505 -0
  246. package/src/lib/composables/useChartData.ts +38 -0
  247. package/src/lib/composables/useChartExport.ts +392 -0
  248. package/src/lib/composables/useChartInteraction.ts +34 -0
  249. package/src/lib/composables/useChartInteractions.ts +123 -0
  250. package/src/lib/composables/useChartPerformance.ts +323 -0
  251. package/src/lib/composables/useChartScale.ts +48 -0
  252. package/src/lib/composables/useChartToolbar.ts +532 -0
  253. package/src/lib/composables/useCheckbox.ts +70 -0
  254. package/src/lib/composables/useDataTable.ts +208 -0
  255. package/src/lib/composables/useDatePicker.ts +564 -0
  256. package/src/lib/composables/useDropdown.ts +272 -0
  257. package/src/lib/composables/useEdgePanel.ts +261 -0
  258. package/src/lib/composables/useFooter.ts +85 -0
  259. package/src/lib/composables/useForm.ts +62 -0
  260. package/src/lib/composables/useFormGroup.ts +51 -0
  261. package/src/lib/composables/useHero.ts +250 -0
  262. package/src/lib/composables/useInput.ts +58 -0
  263. package/src/lib/composables/useLineChart.ts +319 -0
  264. package/src/lib/composables/useMessages.ts +77 -0
  265. package/src/lib/composables/useModal.ts +110 -0
  266. package/src/lib/composables/useNavbar.ts +288 -0
  267. package/src/lib/composables/usePagination.ts +101 -0
  268. package/src/lib/composables/usePhotoViewer.ts +937 -0
  269. package/src/lib/composables/usePieChart.ts +362 -0
  270. package/src/lib/composables/usePopover.ts +354 -0
  271. package/src/lib/composables/useProgress.ts +74 -0
  272. package/src/lib/composables/useRadio.ts +47 -0
  273. package/src/lib/composables/useRating.ts +174 -0
  274. package/src/lib/composables/useRiver.ts +205 -0
  275. package/src/lib/composables/useSelect.ts +52 -0
  276. package/src/lib/composables/useSideMenu.ts +197 -0
  277. package/src/lib/composables/useSlider.ts +526 -0
  278. package/src/lib/composables/useSpinner.ts +42 -0
  279. package/src/lib/composables/useTextarea.ts +55 -0
  280. package/src/lib/composables/useTodo.ts +141 -0
  281. package/src/lib/composables/useVideoPlayer.ts +398 -0
  282. package/src/lib/constants/components.ts +1518 -0
  283. package/src/lib/constants/index.ts +4 -0
  284. package/src/lib/index.ts +11 -0
  285. package/src/lib/types/components.ts +5020 -0
  286. package/src/lib/types/index.ts +2 -0
  287. package/src/lib/utils/dom.ts +41 -0
  288. package/src/lib/utils/icons.ts +74 -0
  289. package/src/lib/utils/index.ts +55 -0
  290. package/src/lib/utils/useForkRef.test.tsx +64 -0
  291. package/src/lib/utils/useForkRef.ts +36 -0
  292. package/src/lib/utils.test.ts +14 -0
  293. package/src/styles/01-settings/_index.scss +3 -0
  294. package/src/styles/01-settings/_settings.accordion.scss +22 -19
  295. package/src/styles/01-settings/_settings.animations.scss +5 -5
  296. package/src/styles/01-settings/_settings.avatar-group.scss +7 -4
  297. package/src/styles/01-settings/_settings.avatar.scss +19 -20
  298. package/src/styles/01-settings/_settings.background.scss +9 -0
  299. package/src/styles/01-settings/_settings.badge.scss +15 -9
  300. package/src/styles/01-settings/_settings.block.scss +11 -0
  301. package/src/styles/01-settings/_settings.border-radius.scss +12 -9
  302. package/src/styles/01-settings/_settings.border.scss +4 -1
  303. package/src/styles/01-settings/_settings.box-shadow.scss +1 -1
  304. package/src/styles/01-settings/_settings.breadcrumb.scss +16 -9
  305. package/src/styles/01-settings/_settings.breakpoints.scss +0 -0
  306. package/src/styles/01-settings/_settings.btn-group.scss +4 -1
  307. package/src/styles/01-settings/_settings.button.scss +19 -21
  308. package/src/styles/01-settings/_settings.callout.scss +42 -24
  309. package/src/styles/01-settings/_settings.card.scss +13 -11
  310. package/src/styles/01-settings/_settings.chart.scss +199 -0
  311. package/src/styles/01-settings/_settings.checkbox-group.scss +5 -2
  312. package/src/styles/01-settings/_settings.checkbox.scss +10 -4
  313. package/src/styles/01-settings/_settings.color-mode.scss +0 -0
  314. package/src/styles/01-settings/_settings.colors.scss +20 -0
  315. package/src/styles/01-settings/_settings.config.scss +1 -1
  316. package/src/styles/01-settings/_settings.countdown.scss +6 -4
  317. package/src/styles/01-settings/_settings.data-table.scss +0 -0
  318. package/src/styles/01-settings/_settings.datepicker.scss +0 -0
  319. package/src/styles/01-settings/_settings.dropdown.scss +9 -7
  320. package/src/styles/01-settings/_settings.edge-panel.scss +3 -2
  321. package/src/styles/01-settings/_settings.fonts.scss +1 -1
  322. package/src/styles/01-settings/_settings.footer.scss +125 -0
  323. package/src/styles/01-settings/_settings.form-group.scss +3 -1
  324. package/src/styles/01-settings/_settings.form.scss +4 -2
  325. package/src/styles/01-settings/_settings.grid.scss +3 -3
  326. package/src/styles/01-settings/_settings.hero.scss +10 -8
  327. package/src/styles/01-settings/_settings.input.scss +9 -7
  328. package/src/styles/01-settings/_settings.link.scss +0 -0
  329. package/src/styles/01-settings/_settings.list-group.scss +4 -2
  330. package/src/styles/01-settings/_settings.list.scss +4 -2
  331. package/src/styles/01-settings/_settings.maps.scss +43 -8
  332. package/src/styles/01-settings/_settings.masonry-grid.scss +0 -0
  333. package/src/styles/01-settings/_settings.menu.scss +10 -8
  334. package/src/styles/01-settings/_settings.messages.scss +19 -17
  335. package/src/styles/01-settings/_settings.modal.scss +7 -5
  336. package/src/styles/01-settings/_settings.nav.scss +6 -4
  337. package/src/styles/01-settings/_settings.navbar.scss +8 -5
  338. package/src/styles/01-settings/_settings.pagination.scss +5 -3
  339. package/src/styles/01-settings/_settings.photoviewer.scss +89 -23
  340. package/src/styles/01-settings/_settings.popover.scss +6 -4
  341. package/src/styles/01-settings/_settings.position.scss +0 -0
  342. package/src/styles/01-settings/_settings.progress.scss +0 -0
  343. package/src/styles/01-settings/_settings.rating.scss +5 -3
  344. package/src/styles/01-settings/_settings.river.scss +8 -6
  345. package/src/styles/01-settings/_settings.sectionintro.scss +8 -6
  346. package/src/styles/01-settings/_settings.select.scss +7 -5
  347. package/src/styles/01-settings/_settings.side-menu.scss +15 -13
  348. package/src/styles/01-settings/_settings.skeleton.scss +0 -0
  349. package/src/styles/01-settings/_settings.slider.scss +59 -0
  350. package/src/styles/01-settings/_settings.spacing.scss +15 -3
  351. package/src/styles/01-settings/_settings.spinner.scss +0 -0
  352. package/src/styles/01-settings/_settings.steps.scss +8 -6
  353. package/src/styles/01-settings/_settings.tabs.scss +11 -9
  354. package/src/styles/01-settings/_settings.testimonials.scss +6 -4
  355. package/src/styles/01-settings/_settings.todo.scss +0 -0
  356. package/src/styles/01-settings/_settings.toggle.scss +4 -2
  357. package/src/styles/01-settings/_settings.tooltip.scss +5 -3
  358. package/src/styles/01-settings/_settings.typography.scss +2 -0
  359. package/src/styles/01-settings/_settings.upload.scss +22 -20
  360. package/src/styles/01-settings/_settings.video-player.scss +64 -0
  361. package/src/styles/01-settings/_settings.z-layers.scss +0 -0
  362. package/src/styles/02-tools/_index.scss +1 -0
  363. package/src/styles/02-tools/_tools.animations.scss +82 -0
  364. package/src/styles/02-tools/_tools.background.scss +85 -0
  365. package/src/styles/02-tools/_tools.border-radius.scss +0 -0
  366. package/src/styles/02-tools/_tools.breakpoints.scss +0 -0
  367. package/src/styles/02-tools/_tools.button.scss +5 -0
  368. package/src/styles/02-tools/_tools.clearfix.scss +0 -0
  369. package/src/styles/02-tools/_tools.color-functions.scss +0 -0
  370. package/src/styles/02-tools/_tools.color-mode.scss +1 -1
  371. package/src/styles/02-tools/_tools.component.scss +479 -0
  372. package/src/styles/02-tools/_tools.event.scss +0 -0
  373. package/src/styles/02-tools/_tools.grid.scss +0 -0
  374. package/src/styles/02-tools/_tools.hidden-visually.scss +0 -0
  375. package/src/styles/02-tools/_tools.hidden.scss +0 -0
  376. package/src/styles/02-tools/_tools.map-loop.scss +0 -0
  377. package/src/styles/02-tools/_tools.media-queries.scss +0 -0
  378. package/src/styles/02-tools/_tools.object-fit.scss +0 -0
  379. package/src/styles/02-tools/_tools.placeholder.scss +0 -0
  380. package/src/styles/02-tools/_tools.rem.scss +19 -2
  381. package/src/styles/02-tools/_tools.size.scss +0 -0
  382. package/src/styles/02-tools/_tools.spacing.scss +0 -0
  383. package/src/styles/02-tools/_tools.to-rgb.scss +0 -0
  384. package/src/styles/02-tools/_tools.transition.scss +0 -0
  385. package/src/styles/02-tools/_tools.utilities.scss +0 -0
  386. package/src/styles/02-tools/_tools.utility-api.scss +55 -28
  387. package/src/styles/03-generic/_generic.fonts.scss +0 -0
  388. package/src/styles/03-generic/_generic.reset.scss +0 -0
  389. package/src/styles/03-generic/_generic.root.scss +19 -3
  390. package/src/styles/03-generic/_generic.selection.scss +0 -0
  391. package/src/styles/03-generic/_index.scss +0 -0
  392. package/src/styles/04-elements/_elements.all.scss +0 -0
  393. package/src/styles/04-elements/_elements.body.scss +24 -0
  394. package/src/styles/04-elements/_elements.heading.scss +0 -0
  395. package/src/styles/04-elements/_elements.html.scss +0 -0
  396. package/src/styles/04-elements/_elements.links.scss +0 -0
  397. package/src/styles/04-elements/_index.scss +0 -0
  398. package/src/styles/05-objects/_index.scss +1 -0
  399. package/src/styles/05-objects/_objects.block.scss +122 -0
  400. package/src/styles/05-objects/_objects.container.scss +14 -10
  401. package/src/styles/05-objects/_objects.grid.scss +0 -0
  402. package/src/styles/05-objects/_objects.masonry-grid.scss +0 -0
  403. package/src/styles/06-components/_components.accordion.scss +10 -4
  404. package/src/styles/06-components/_components.avatar-group.scss +2 -1
  405. package/src/styles/06-components/_components.avatar.scss +2 -1
  406. package/src/styles/06-components/_components.badge.scss +11 -10
  407. package/src/styles/06-components/_components.breadcrumb.scss +2 -1
  408. package/src/styles/06-components/_components.btn-group.scss +0 -0
  409. package/src/styles/06-components/_components.button.scss +4 -3
  410. package/src/styles/06-components/_components.callout.scss +5 -3
  411. package/src/styles/06-components/_components.card.scss +4 -3
  412. package/src/styles/06-components/_components.chart.scss +2103 -0
  413. package/src/styles/06-components/_components.checkbox-group.scss +0 -0
  414. package/src/styles/06-components/_components.checkbox.scss +2 -1
  415. package/src/styles/06-components/_components.color-mode-toggle.scss +3 -2
  416. package/src/styles/06-components/_components.countdown.scss +2 -1
  417. package/src/styles/06-components/_components.data-table.scss +7 -6
  418. package/src/styles/06-components/_components.datepicker.scss +2 -1
  419. package/src/styles/06-components/_components.dropdown.scss +4 -3
  420. package/src/styles/06-components/_components.edge-panel.scss +4 -3
  421. package/src/styles/06-components/_components.footer.scss +825 -0
  422. package/src/styles/06-components/_components.form-group.scss +1 -0
  423. package/src/styles/06-components/_components.form.scss +0 -0
  424. package/src/styles/06-components/_components.hero.scss +4 -2
  425. package/src/styles/06-components/_components.icon.scss +2 -2
  426. package/src/styles/06-components/_components.image-gallery.scss +1 -0
  427. package/src/styles/06-components/_components.input.scss +2 -1
  428. package/src/styles/06-components/_components.list-group.scss +3 -2
  429. package/src/styles/06-components/_components.list.scss +2 -1
  430. package/src/styles/06-components/_components.menu.scss +5 -4
  431. package/src/styles/06-components/_components.messages.scss +8 -7
  432. package/src/styles/06-components/_components.modal.scss +6 -2
  433. package/src/styles/06-components/_components.nav.scss +6 -5
  434. package/src/styles/06-components/_components.navbar.scss +4 -3
  435. package/src/styles/06-components/_components.pagination.scss +2 -1
  436. package/src/styles/06-components/_components.photoviewer.scss +604 -545
  437. package/src/styles/06-components/_components.popover.scss +3 -2
  438. package/src/styles/06-components/_components.product-review.scss +3 -2
  439. package/src/styles/06-components/_components.progress.scss +3 -2
  440. package/src/styles/06-components/_components.rating.scss +0 -0
  441. package/src/styles/06-components/_components.river.scss +3 -2
  442. package/src/styles/06-components/_components.sectionintro.scss +2 -1
  443. package/src/styles/06-components/_components.select.scss +5 -4
  444. package/src/styles/06-components/_components.side-menu.scss +8 -7
  445. package/src/styles/06-components/_components.skeleton.scss +3 -2
  446. package/src/styles/06-components/_components.slider.scss +274 -0
  447. package/src/styles/06-components/_components.spinner.scss +1 -0
  448. package/src/styles/06-components/_components.steps.scss +4 -2
  449. package/src/styles/06-components/_components.tabs.scss +4 -3
  450. package/src/styles/06-components/_components.testimonials.scss +2 -1
  451. package/src/styles/06-components/_components.todo.scss +3 -2
  452. package/src/styles/06-components/_components.toggle.scss +5 -4
  453. package/src/styles/06-components/_components.tooltip.scss +7 -11
  454. package/src/styles/06-components/_components.upload.scss +4 -3
  455. package/src/styles/06-components/_components.video-player.scss +624 -0
  456. package/src/styles/06-components/_index.scss +4 -0
  457. package/src/styles/06-components/old.chart.styles.scss +2819 -0
  458. package/src/styles/99-utilities/_index.scss +0 -0
  459. package/src/styles/99-utilities/_utilities.background.scss +0 -0
  460. package/src/styles/99-utilities/_utilities.border.scss +0 -0
  461. package/src/styles/99-utilities/_utilities.clearfix.scss +0 -0
  462. package/src/styles/99-utilities/_utilities.display.scss +0 -0
  463. package/src/styles/99-utilities/_utilities.flex.scss +0 -0
  464. package/src/styles/99-utilities/_utilities.link.scss +0 -0
  465. package/src/styles/99-utilities/_utilities.object-fit.scss +0 -0
  466. package/src/styles/99-utilities/_utilities.opacity.scss +0 -0
  467. package/src/styles/99-utilities/_utilities.overflow.scss +0 -0
  468. package/src/styles/99-utilities/_utilities.position.scss +0 -0
  469. package/src/styles/99-utilities/_utilities.scss +2 -1
  470. package/src/styles/99-utilities/_utilities.shadow.scss +0 -0
  471. package/src/styles/99-utilities/_utilities.sizes.scss +0 -0
  472. package/src/styles/99-utilities/_utilities.spacing.scss +0 -0
  473. package/src/styles/99-utilities/_utilities.text.scss +5 -0
  474. package/src/styles/99-utilities/_utilities.visibility.scss +0 -0
  475. package/src/styles/99-utilities/_utilities.visually-hidden.scss +0 -0
  476. package/src/styles/99-utilities/_utilities.z-index.scss +0 -0
  477. package/src/styles/css-modules.d.ts +0 -0
  478. package/src/styles/index.scss +0 -0
  479. package/dist/index.css +0 -15
  480. package/dist/index.esm.css +0 -15
  481. package/dist/index.min.css +0 -15
@@ -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
+ }
@@ -0,0 +1,250 @@
1
+ import { useEffect, useRef } from 'react';
2
+ import { HeroProps, HeroAlignment } from '../types/components';
3
+ import { HERO } from '../constants/components';
4
+
5
+ /**
6
+ * Hero hook result interface
7
+ */
8
+ interface UseHeroResult {
9
+ /**
10
+ * Generate hero class names based on props
11
+ */
12
+ generateHeroClassNames: (baseClassName?: string) => string;
13
+
14
+ /**
15
+ * Generate image column class based on size
16
+ */
17
+ generateImageColClass: (size?: number) => string;
18
+
19
+ /**
20
+ * Generate content column class based on size
21
+ */
22
+ generateContentColClass: (size?: number) => string;
23
+
24
+ /**
25
+ * Determine if the hero has a background image
26
+ */
27
+ hasBackgroundImage: boolean;
28
+
29
+ /**
30
+ * Determine if the hero has a foreground image
31
+ */
32
+ hasForegroundImage: boolean;
33
+
34
+ /**
35
+ * Determine if content should be displayed in a grid
36
+ */
37
+ useGridLayout: boolean;
38
+
39
+ /**
40
+ * Reference to the hero element
41
+ */
42
+ heroRef: React.RefObject<HTMLDivElement | null>;
43
+
44
+ /**
45
+ * Reference to the video element
46
+ */
47
+ videoRef: React.RefObject<HTMLVideoElement | null>;
48
+
49
+ /**
50
+ * Apply parallax effect
51
+ */
52
+ applyParallaxEffect: (element: HTMLElement, intensity: number) => void;
53
+
54
+ /**
55
+ * Remove parallax effect
56
+ */
57
+ removeParallaxEffect: (element: HTMLElement) => void;
58
+ }
59
+
60
+ /**
61
+ * Hook for Hero component functionality
62
+ * @param initialProps - Initial hero props
63
+ * @returns Hero methods
64
+ */
65
+ export function useHero(initialProps?: Partial<HeroProps>): UseHeroResult {
66
+ const heroRef = useRef<HTMLDivElement>(null);
67
+ const videoRef = useRef<HTMLVideoElement>(null);
68
+ const parallaxHandlerRef = useRef<((event: Event) => void) | null>(null);
69
+
70
+ const defaultProps: Partial<HeroProps> = {
71
+ alignment: 'left',
72
+ imageColSize: 7,
73
+ contentColSize: 5,
74
+ imageAlt: 'Hero image',
75
+ showOverlay: true,
76
+ fullViewportHeight: false,
77
+ contentWidth: undefined,
78
+ parallax: false,
79
+ parallaxIntensity: 0.5,
80
+ ...initialProps,
81
+ };
82
+
83
+ /**
84
+ * Check if the hero has a background image
85
+ */
86
+ const hasBackgroundImage = !!defaultProps.backgroundImageSrc;
87
+
88
+ /**
89
+ * Check if the hero has a foreground image
90
+ */
91
+ const hasForegroundImage = !!defaultProps.imageSrc;
92
+
93
+ /**
94
+ * Check if content should be displayed in a grid
95
+ */
96
+ const useGridLayout = hasForegroundImage && defaultProps.alignment !== 'center';
97
+
98
+ /**
99
+ * Apply parallax effect to hero background
100
+ */
101
+ const applyParallaxEffect = (element: HTMLElement, intensity: number = 0.5): void => {
102
+ if (!element) return;
103
+
104
+ // Ensure intensity is between 0 and 1
105
+ const safeIntensity = Math.max(0, Math.min(1, intensity));
106
+
107
+ // Add parallax class
108
+ element.classList.add('c-hero--parallax');
109
+
110
+ // Handle scroll event
111
+ const handleScroll = (): void => {
112
+ const scrollPosition = window.pageYOffset;
113
+ const offset = scrollPosition * safeIntensity;
114
+
115
+ // Apply transform to background
116
+ const bgElement = element.querySelector(HERO.SELECTORS.BG);
117
+ if (bgElement) {
118
+ (bgElement as HTMLElement).style.transform = `translateY(${offset}px)`;
119
+ }
120
+ };
121
+
122
+ // Store the handler for cleanup
123
+ parallaxHandlerRef.current = handleScroll;
124
+
125
+ // Add event listener
126
+ window.addEventListener('scroll', handleScroll);
127
+
128
+ // Initial call
129
+ handleScroll();
130
+ };
131
+
132
+ /**
133
+ * Remove parallax effect from hero
134
+ */
135
+ const removeParallaxEffect = (element: HTMLElement): void => {
136
+ if (!element) return;
137
+
138
+ // Remove class
139
+ element.classList.remove('c-hero--parallax');
140
+
141
+ // Remove transform
142
+ const bgElement = element.querySelector(HERO.SELECTORS.BG);
143
+ if (bgElement) {
144
+ (bgElement as HTMLElement).style.transform = '';
145
+ }
146
+
147
+ // Remove event listener
148
+ if (parallaxHandlerRef.current) {
149
+ window.removeEventListener('scroll', parallaxHandlerRef.current);
150
+ parallaxHandlerRef.current = null;
151
+ }
152
+ };
153
+
154
+ // Apply parallax effect if enabled
155
+ useEffect(() => {
156
+ const heroElement = heroRef.current;
157
+
158
+ if (heroElement && defaultProps.parallax && hasBackgroundImage) {
159
+ applyParallaxEffect(heroElement, defaultProps.parallaxIntensity);
160
+ }
161
+
162
+ return () => {
163
+ if (heroElement && parallaxHandlerRef.current) {
164
+ removeParallaxEffect(heroElement);
165
+ }
166
+ };
167
+ }, [defaultProps.parallax, defaultProps.parallaxIntensity, hasBackgroundImage]);
168
+
169
+ /**
170
+ * Generate hero class names based on props
171
+ * @param baseClassName - Additional class names
172
+ * @returns Combined class names string
173
+ */
174
+ const generateHeroClassNames = (baseClassName: string = ''): string => {
175
+ const classes = [HERO.SELECTORS.HERO.replace('.', '')];
176
+
177
+ // Add alignment class
178
+ if (defaultProps.alignment === 'center') {
179
+ classes.push(HERO.CLASSES.CENTER);
180
+ } else if (defaultProps.alignment === 'right') {
181
+ classes.push(HERO.CLASSES.RIGHT);
182
+ } else if (defaultProps.alignment === 'left') {
183
+ classes.push(HERO.CLASSES.LEFT);
184
+ }
185
+
186
+ // Add full viewport height class if needed
187
+ if (defaultProps.fullViewportHeight) {
188
+ classes.push(HERO.CLASSES.FULL_VH);
189
+ }
190
+
191
+ // Add parallax class if enabled
192
+ if (defaultProps.parallax) {
193
+ classes.push('c-hero--parallax');
194
+ }
195
+
196
+ // Add video background class if provided
197
+ if (defaultProps.videoBackground) {
198
+ classes.push('c-hero--video');
199
+ }
200
+
201
+ if (baseClassName) {
202
+ classes.push(baseClassName);
203
+ }
204
+
205
+ return classes.join(' ');
206
+ };
207
+
208
+ /**
209
+ * Determine content column order based on alignment
210
+ */
211
+ const contentFirst = defaultProps.alignment === 'left';
212
+
213
+ /**
214
+ * Generate image column class based on size
215
+ * @param size - Column size (1-12)
216
+ * @returns Column class
217
+ */
218
+ const generateImageColClass = (size: number = defaultProps.imageColSize || 7): string => {
219
+ const classes = [`o-grid__col o-grid__col--md-${size}`];
220
+
221
+ // Add responsive margin if needed for mobile view
222
+ if (defaultProps.alignment === 'left') {
223
+ classes.push('u-mt-5 u-mt-md-0');
224
+ }
225
+
226
+ return classes.join(' ');
227
+ };
228
+
229
+ /**
230
+ * Generate content column class based on size
231
+ * @param size - Column size (1-12)
232
+ * @returns Column class
233
+ */
234
+ const generateContentColClass = (size: number = defaultProps.contentColSize || 5): string => {
235
+ return `o-grid__col o-grid__col--md-${size}`;
236
+ };
237
+
238
+ return {
239
+ generateHeroClassNames,
240
+ generateImageColClass,
241
+ generateContentColClass,
242
+ hasBackgroundImage,
243
+ hasForegroundImage,
244
+ useGridLayout,
245
+ heroRef,
246
+ videoRef,
247
+ applyParallaxEffect,
248
+ removeParallaxEffect,
249
+ };
250
+ }
@@ -0,0 +1,58 @@
1
+ import { InputProps, ThemeColor } from '../types/components';
2
+ import { INPUT } from '../constants/components';
3
+
4
+ /**
5
+ * Input state and functionality
6
+ * @param initialProps - Initial input properties
7
+ * @returns Input state and methods
8
+ */
9
+ export function useInput(initialProps?: Partial<InputProps>) {
10
+ // Default input properties
11
+ const defaultProps: Partial<InputProps> = {
12
+ size: 'md',
13
+ disabled: false,
14
+ invalid: false,
15
+ valid: false,
16
+ ...initialProps,
17
+ };
18
+
19
+ /**
20
+ * Generate input class based on properties
21
+ * @param props - Input properties
22
+ * @returns Class string
23
+ */
24
+ const generateInputClass = (props: Partial<InputProps> & { type?: string }): string => {
25
+ const {
26
+ size = defaultProps.size,
27
+ variant = defaultProps.variant,
28
+ disabled = defaultProps.disabled,
29
+ invalid = defaultProps.invalid,
30
+ valid = defaultProps.valid,
31
+ className = '',
32
+ type,
33
+ } = props;
34
+
35
+ const sizeClass =
36
+ size === 'md' ? '' : size === 'sm' ? INPUT.CLASSES.SMALL : INPUT.CLASSES.LARGE;
37
+
38
+ const variantClass = variant ? `c-input--${variant}` : '';
39
+
40
+ const textareaClass = type === 'textarea' ? 'c-input--textarea' : '';
41
+
42
+ let validationClass = '';
43
+ if (invalid) {
44
+ validationClass = INPUT.CLASSES.INVALID;
45
+ } else if (valid) {
46
+ validationClass = INPUT.CLASSES.VALID;
47
+ }
48
+
49
+ const disabledClass = disabled ? INPUT.CLASSES.DISABLED : '';
50
+
51
+ return `${INPUT.CLASSES.BASE} ${sizeClass} ${variantClass} ${textareaClass} ${validationClass} ${disabledClass} ${className}`.trim();
52
+ };
53
+
54
+ return {
55
+ defaultProps,
56
+ generateInputClass,
57
+ };
58
+ }
@@ -0,0 +1,319 @@
1
+ import { useCallback, useMemo, useState } from 'react';
2
+ import { ChartDataPoint, ChartDataset } from '../types/components';
3
+
4
+ /**
5
+ * Line chart specific options
6
+ */
7
+ export interface LineChartOptions {
8
+ /**
9
+ * Whether to show area fill under the line
10
+ */
11
+ showArea?: boolean;
12
+
13
+ /**
14
+ * Whether to show data points
15
+ */
16
+ showDataPoints?: boolean;
17
+
18
+ /**
19
+ * Whether to use smooth curves
20
+ */
21
+ smooth?: boolean;
22
+
23
+ /**
24
+ * Curve tension (0-1)
25
+ */
26
+ tension?: number;
27
+
28
+ /**
29
+ * Fill opacity for area charts
30
+ */
31
+ fillOpacity?: number;
32
+
33
+ /**
34
+ * Whether to use gradient fills
35
+ */
36
+ useGradient?: boolean;
37
+
38
+ /**
39
+ * Gradient direction
40
+ */
41
+ gradientDirection?: 'horizontal' | 'vertical';
42
+
43
+ /**
44
+ * Line width in pixels
45
+ */
46
+ lineWidth?: number;
47
+
48
+ /**
49
+ * Point radius in pixels
50
+ */
51
+ pointRadius?: number;
52
+
53
+ /**
54
+ * Whether to show point labels
55
+ */
56
+ showPointLabels?: boolean;
57
+
58
+ /**
59
+ * Whether to enable zoom functionality
60
+ */
61
+ enableZoom?: boolean;
62
+
63
+ /**
64
+ * Whether to enable pan functionality
65
+ */
66
+ enablePan?: boolean;
67
+
68
+ /**
69
+ * Whether to show crosshair
70
+ */
71
+ showCrosshair?: boolean;
72
+
73
+ /**
74
+ * Whether to enable keyboard navigation
75
+ */
76
+ enableKeyboardNavigation?: boolean;
77
+
78
+ /**
79
+ * Whether to show trend lines
80
+ */
81
+ showTrendLines?: boolean;
82
+
83
+ /**
84
+ * Whether to show moving averages
85
+ */
86
+ showMovingAverages?: boolean;
87
+
88
+ /**
89
+ * Moving average periods
90
+ */
91
+ movingAveragePeriods?: number[];
92
+
93
+ /**
94
+ * Whether to enable real-time updates
95
+ */
96
+ enableRealTime?: boolean;
97
+
98
+ /**
99
+ * Real-time update interval in milliseconds
100
+ */
101
+ realTimeInterval?: number;
102
+
103
+ /**
104
+ * Maximum number of data points for performance
105
+ */
106
+ maxDataPoints?: number;
107
+
108
+ /**
109
+ * Whether to enable data decimation
110
+ */
111
+ enableDecimation?: boolean;
112
+ }
113
+
114
+ /**
115
+ * Hook for line chart functionality
116
+ */
117
+ export function useLineChart(datasets: ChartDataset[], options: LineChartOptions = {}) {
118
+ const [zoomLevel, setZoomLevel] = useState(1);
119
+ const [panOffset, setPanOffset] = useState({ x: 0, y: 0 });
120
+ const [hoveredPoint, setHoveredPoint] = useState<{
121
+ datasetIndex: number;
122
+ pointIndex: number;
123
+ x: number;
124
+ y: number;
125
+ } | null>(null);
126
+
127
+ // Calculate moving averages
128
+ const calculateMovingAverage = useCallback((data: ChartDataPoint[], period: number) => {
129
+ const result: ChartDataPoint[] = [];
130
+
131
+ for (let i = period - 1; i < data.length; i++) {
132
+ const sum = data.slice(i - period + 1, i + 1).reduce((acc, point) => acc + point.value, 0);
133
+ const average = sum / period;
134
+
135
+ const dataPoint = data[i];
136
+ if (dataPoint) {
137
+ result.push({
138
+ label: dataPoint.label,
139
+ value: average,
140
+ color: 'rgba(255, 255, 255, 0.5)',
141
+ });
142
+ }
143
+ }
144
+
145
+ return result;
146
+ }, []);
147
+
148
+ // Calculate trend line using linear regression
149
+ const calculateTrendLine = useCallback((data: ChartDataPoint[]): (ChartDataPoint | null)[] => {
150
+ const n = data.length;
151
+ if (n < 2) return data.map((): null => null);
152
+
153
+ const xSum = data.reduce((sum, _, i) => sum + i, 0);
154
+ const ySum = data.reduce((sum, point) => sum + point.value, 0);
155
+ const xySum = data.reduce((sum, point, i) => sum + i * point.value, 0);
156
+ const x2Sum = data.reduce((sum, _, i) => sum + i * i, 0);
157
+
158
+ const slope = (n * xySum - xSum * ySum) / (n * x2Sum - xSum * xSum);
159
+ const intercept = (ySum - slope * xSum) / n;
160
+
161
+ return data.map((point, i) => ({
162
+ label: point.label,
163
+ value: slope * i + intercept,
164
+ color: 'rgba(255, 255, 255, 0.3)',
165
+ }));
166
+ }, []);
167
+
168
+ // Generate SVG path for smooth curves
169
+ const generateSmoothPath = useCallback(
170
+ (points: Array<{ x: number; y: number }>, tension = 0.4) => {
171
+ if (points.length < 2) return '';
172
+
173
+ const controlPoints = points.map((point, i) => {
174
+ if (i === 0 || i === points.length - 1) {
175
+ return { cp1x: point.x, cp1y: point.y, cp2x: point.x, cp2y: point.y };
176
+ }
177
+
178
+ const prev = points[i - 1];
179
+ const next = points[i + 1];
180
+ if (!prev || !next) {
181
+ return { cp1x: point.x, cp1y: point.y, cp2x: point.x, cp2y: point.y };
182
+ }
183
+ const dx = next.x - prev.x;
184
+ const dy = next.y - prev.y;
185
+
186
+ return {
187
+ cp1x: point.x - dx * tension,
188
+ cp1y: point.y - dy * tension,
189
+ cp2x: point.x + dx * tension,
190
+ cp2y: point.y + dy * tension,
191
+ };
192
+ });
193
+
194
+ const firstPoint = points[0];
195
+ if (!firstPoint) return '';
196
+ let path = `M ${firstPoint.x},${firstPoint.y}`;
197
+
198
+ for (let i = 1; i < points.length; i++) {
199
+ const cp = controlPoints[i - 1];
200
+ const currentControlPoint = controlPoints[i];
201
+ const currentPoint = points[i];
202
+
203
+ if (!cp || !currentControlPoint || !currentPoint) continue;
204
+
205
+ path += ` C ${cp.cp2x},${cp.cp2y} ${currentControlPoint.cp1x},${currentControlPoint.cp1y} ${currentPoint.x},${currentPoint.y}`;
206
+ }
207
+
208
+ return path;
209
+ },
210
+ []
211
+ );
212
+
213
+ // Zoom handlers
214
+ const handleZoom = useCallback(
215
+ (delta: number, centerX: number, centerY: number) => {
216
+ if (!options.enableZoom) return;
217
+
218
+ const zoomFactor = delta > 0 ? 0.9 : 1.1;
219
+ const newZoomLevel = Math.max(0.1, Math.min(10, zoomLevel * zoomFactor));
220
+
221
+ setZoomLevel(newZoomLevel);
222
+
223
+ // Adjust pan offset to zoom towards center
224
+ const zoomRatio = newZoomLevel / zoomLevel;
225
+ setPanOffset(prev => ({
226
+ x: centerX - (centerX - prev.x) * zoomRatio,
227
+ y: centerY - (centerY - prev.y) * zoomRatio,
228
+ }));
229
+ },
230
+ [zoomLevel, options.enableZoom]
231
+ );
232
+
233
+ // Pan handlers
234
+ const handlePan = useCallback(
235
+ (deltaX: number, deltaY: number) => {
236
+ if (!options.enablePan) return;
237
+
238
+ setPanOffset(prev => ({
239
+ x: prev.x + deltaX,
240
+ y: prev.y + deltaY,
241
+ }));
242
+ },
243
+ [options.enablePan]
244
+ );
245
+
246
+ // Reset view
247
+ const resetView = useCallback(() => {
248
+ setZoomLevel(1);
249
+ setPanOffset({ x: 0, y: 0 });
250
+ }, []);
251
+
252
+ // Point hover handlers
253
+ const handlePointHover = useCallback(
254
+ (datasetIndex: number, pointIndex: number, x: number, y: number) => {
255
+ setHoveredPoint({ datasetIndex, pointIndex, x, y });
256
+ },
257
+ []
258
+ );
259
+
260
+ const handlePointLeave = useCallback(() => {
261
+ setHoveredPoint(null);
262
+ }, []);
263
+
264
+ // Process datasets with additional data
265
+ const processedDatasets = useMemo(() => {
266
+ return datasets.map(dataset => {
267
+ const processed = { ...dataset } as any;
268
+
269
+ // Add moving averages if enabled
270
+ if (options.showMovingAverages && options.movingAveragePeriods) {
271
+ processed.movingAverages = options.movingAveragePeriods.map(period => ({
272
+ period,
273
+ data: calculateMovingAverage(dataset.data, period),
274
+ }));
275
+ }
276
+
277
+ // Add trend line if enabled
278
+ if (options.showTrendLines) {
279
+ processed.trendLine = calculateTrendLine(dataset.data);
280
+ }
281
+
282
+ return processed;
283
+ });
284
+ }, [
285
+ datasets,
286
+ options.showMovingAverages,
287
+ options.movingAveragePeriods,
288
+ options.showTrendLines,
289
+ calculateMovingAverage,
290
+ calculateTrendLine,
291
+ ]);
292
+
293
+ return {
294
+ // State
295
+ zoomLevel,
296
+ panOffset,
297
+ hoveredPoint,
298
+
299
+ // Data
300
+ processedDatasets,
301
+
302
+ // Handlers
303
+ handleZoom,
304
+ handlePan,
305
+ resetView,
306
+ handlePointHover,
307
+ handlePointLeave,
308
+
309
+ // Utilities
310
+ calculateMovingAverage,
311
+ calculateTrendLine,
312
+ generateSmoothPath,
313
+
314
+ // State setters
315
+ setZoomLevel,
316
+ setPanOffset,
317
+ setHoveredPoint,
318
+ };
319
+ }