@shohojdhara/atomix 0.3.1 → 0.3.3

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 (449) hide show
  1. package/CHANGELOG.md +0 -1
  2. package/README.md +41 -24
  3. package/dist/atomix.css +540 -666
  4. package/dist/atomix.min.css +3 -3
  5. package/dist/index.d.ts +7559 -5717
  6. package/dist/index.esm.js +5013 -2301
  7. package/dist/index.esm.js.map +1 -1
  8. package/dist/index.js +5084 -2356
  9. package/dist/index.js.map +1 -1
  10. package/dist/index.min.js +1 -1
  11. package/dist/index.min.js.map +1 -1
  12. package/dist/themes/applemix.css +1683 -722
  13. package/dist/themes/applemix.css.map +1 -0
  14. package/dist/themes/applemix.min.css +13 -10
  15. package/dist/themes/boomdevs.css +1358 -544
  16. package/dist/themes/boomdevs.css.map +1 -0
  17. package/dist/themes/boomdevs.min.css +13 -10
  18. package/dist/themes/esrar.css +1743 -718
  19. package/dist/themes/esrar.css.map +1 -0
  20. package/dist/themes/esrar.min.css +41 -7
  21. package/dist/themes/flashtrade.css +1735 -752
  22. package/dist/themes/flashtrade.css.map +1 -0
  23. package/dist/themes/flashtrade.min.css +19 -13
  24. package/dist/themes/mashroom.css +1765 -787
  25. package/dist/themes/mashroom.css.map +1 -0
  26. package/dist/themes/mashroom.min.css +87 -38
  27. package/dist/themes/shaj-default.css +1685 -713
  28. package/dist/themes/shaj-default.css.map +1 -0
  29. package/dist/themes/shaj-default.min.css +11 -7
  30. package/package.json +95 -26
  31. package/scripts/atomix-cli.js +1428 -0
  32. package/scripts/build-themes.js +208 -0
  33. package/scripts/cli/interactive-init.js +528 -0
  34. package/scripts/cli/migration-tools.js +603 -0
  35. package/scripts/cli/token-manager.js +519 -0
  36. package/scripts/sync-theme-config.js +309 -0
  37. package/src/components/List/ListGroup.tsx +1 -2
  38. package/src/components/Popover/Popover.tsx +2 -2
  39. package/src/components/Tooltip/Tooltip.stories.tsx +49 -12
  40. package/src/components/Tooltip/Tooltip.tsx +32 -58
  41. package/src/lib/composables/useAtomixGlass.ts +46 -46
  42. package/src/lib/composables/useTooltip.ts +285 -0
  43. package/src/lib/constants/cssVariables.ts +390 -0
  44. package/src/lib/hooks/__tests__/useComponentCustomization.test.ts +151 -0
  45. package/src/lib/hooks/index.ts +19 -0
  46. package/src/lib/hooks/useComponentCustomization.ts +175 -0
  47. package/src/lib/index.ts +10 -1
  48. package/src/lib/patterns/__tests__/slots.test.ts +108 -0
  49. package/src/lib/patterns/index.ts +35 -0
  50. package/src/lib/patterns/slots.tsx +421 -0
  51. package/src/lib/theme/__tests__/ThemeBuilder.test.ts +223 -0
  52. package/src/lib/theme/builders/ThemeBuilder.ts +372 -0
  53. package/src/lib/theme/config/index.ts +21 -0
  54. package/src/lib/theme/config/loader.ts +276 -0
  55. package/src/lib/theme/config/types.ts +98 -0
  56. package/src/lib/theme/config/validator.ts +326 -0
  57. package/src/lib/theme/constants.ts +183 -0
  58. package/src/lib/theme/core/ThemeCache.ts +283 -0
  59. package/src/lib/theme/core/ThemeEngine.test.ts +146 -0
  60. package/src/lib/theme/core/ThemeEngine.ts +657 -0
  61. package/src/lib/theme/core/ThemeRegistry.ts +284 -0
  62. package/src/lib/theme/core/ThemeValidator.ts +530 -0
  63. package/src/lib/theme/core/index.ts +24 -0
  64. package/src/lib/theme/createTheme.ts +83 -204
  65. package/src/lib/theme/cssVariableMapper.ts +261 -0
  66. package/src/lib/theme/devtools/CLI.ts +279 -0
  67. package/src/lib/theme/devtools/Inspector.tsx +594 -0
  68. package/src/lib/theme/devtools/Preview.tsx +392 -0
  69. package/src/lib/theme/devtools/index.ts +21 -0
  70. package/src/lib/theme/errors.test.ts +207 -0
  71. package/src/lib/theme/errors.ts +233 -0
  72. package/src/lib/theme/generateCSSVariables.ts +93 -9
  73. package/src/lib/theme/generators/CSSGenerator.ts +311 -0
  74. package/src/lib/theme/generators/ConfigGenerator.ts +287 -0
  75. package/src/lib/theme/generators/TypeGenerator.ts +228 -0
  76. package/src/lib/theme/generators/index.ts +21 -0
  77. package/src/lib/theme/i18n/index.ts +9 -0
  78. package/src/lib/theme/i18n/rtl.ts +325 -0
  79. package/src/lib/theme/index.ts +36 -109
  80. package/src/lib/theme/monitoring/ThemeAnalytics.ts +409 -0
  81. package/src/lib/theme/monitoring/index.ts +17 -0
  82. package/src/lib/theme/overrides/ComponentOverrides.ts +243 -0
  83. package/src/lib/theme/overrides/index.ts +15 -0
  84. package/src/lib/theme/runtime/ThemeApplicator.ts +252 -0
  85. package/src/lib/theme/runtime/ThemeErrorBoundary.tsx +233 -0
  86. package/src/lib/theme/runtime/ThemeManager.test.ts +176 -0
  87. package/src/lib/theme/runtime/ThemeManager.ts +442 -0
  88. package/src/lib/theme/runtime/ThemeProvider.tsx +318 -0
  89. package/src/lib/theme/runtime/index.ts +17 -0
  90. package/src/lib/theme/runtime/useTheme.ts +52 -0
  91. package/src/lib/theme/themeUtils.ts +27 -5
  92. package/src/lib/theme/types.ts +62 -1
  93. package/src/lib/theme/utils.ts +23 -22
  94. package/src/lib/theme/whitelabel/WhiteLabelManager.ts +364 -0
  95. package/src/lib/theme/whitelabel/index.ts +13 -0
  96. package/src/lib/theme-tools.ts +185 -0
  97. package/src/lib/types/components.ts +194 -0
  98. package/src/lib/types/partProps.ts +426 -0
  99. package/src/lib/utils/__tests__/componentUtils.test.ts +144 -0
  100. package/src/lib/utils/componentUtils.ts +163 -0
  101. package/src/lib/utils/index.ts +17 -57
  102. package/src/styles/01-settings/_settings.badge.scss +1 -1
  103. package/src/styles/01-settings/_settings.callout.scss +1 -1
  104. package/src/styles/01-settings/_settings.card.scss +1 -1
  105. package/src/styles/01-settings/_settings.colors.scss +10 -10
  106. package/src/styles/01-settings/_settings.input.scss +1 -1
  107. package/src/styles/01-settings/_settings.navbar.scss +1 -1
  108. package/src/styles/01-settings/_settings.tooltip.scss +1 -1
  109. package/src/styles/01-settings/_settings.upload.scss +1 -1
  110. package/src/styles/06-components/_components.chart.scss +2 -2
  111. package/src/styles/06-components/_components.tooltip.scss +31 -81
  112. package/src/styles/99-utilities/_utilities.border.scss +27 -58
  113. package/src/styles/99-utilities/_utilities.gradient.scss +12 -0
  114. package/src/styles/99-utilities/_utilities.position.scss +8 -15
  115. package/src/styles/99-utilities/_utilities.scss +2 -0
  116. package/src/styles/99-utilities/_utilities.spacing.scss +76 -121
  117. package/src/styles/99-utilities/_utilities.text.scss +30 -49
  118. package/src/themes/README.md +443 -0
  119. package/src/themes/THEME_CHECKLIST.md +74 -0
  120. package/src/themes/applemix/01-settings/_index.scss +24 -0
  121. package/src/themes/applemix/01-settings/_settings.animations.scss +0 -0
  122. package/src/themes/applemix/01-settings/_settings.background.scss +6 -0
  123. package/src/themes/applemix/01-settings/_settings.colors.scss +75 -0
  124. package/src/themes/applemix/01-settings/_settings.config.scss +15 -0
  125. package/src/themes/applemix/01-settings/_settings.typography.scss +30 -0
  126. package/src/themes/applemix/02-tools/_index.scss +4 -0
  127. package/src/themes/applemix/03-generic/_index.scss +7 -0
  128. package/src/themes/applemix/04-elements/_index.scss +7 -0
  129. package/src/themes/applemix/05-objects/_index.scss +7 -0
  130. package/src/themes/applemix/06-components/_index.scss +15 -0
  131. package/src/themes/applemix/99-utilities/_index.scss +7 -0
  132. package/src/themes/applemix/README.md +378 -0
  133. package/src/themes/applemix/index.scss +33 -0
  134. package/src/themes/boomdevs/01-settings/_index.scss +38 -0
  135. package/src/themes/boomdevs/01-settings/_settings.accordion.scss +12 -0
  136. package/src/themes/boomdevs/01-settings/_settings.animations.scss +11 -0
  137. package/src/themes/boomdevs/01-settings/_settings.avatar.scss +9 -0
  138. package/src/themes/boomdevs/01-settings/_settings.badge.scss +11 -0
  139. package/src/themes/boomdevs/01-settings/_settings.border-radius.scss +16 -0
  140. package/src/themes/boomdevs/01-settings/_settings.border.scss +10 -0
  141. package/src/themes/boomdevs/01-settings/_settings.box-shadow.scss +14 -0
  142. package/src/themes/boomdevs/01-settings/_settings.breadcrumb.scss +13 -0
  143. package/src/themes/boomdevs/01-settings/_settings.breakpoints.scss +15 -0
  144. package/src/themes/boomdevs/01-settings/_settings.button.scss +9 -0
  145. package/src/themes/boomdevs/01-settings/_settings.callout.scss +9 -0
  146. package/src/themes/boomdevs/01-settings/_settings.card.scss +11 -0
  147. package/src/themes/boomdevs/01-settings/_settings.checkbox.scss +9 -0
  148. package/src/themes/boomdevs/01-settings/_settings.colors.scss +145 -0
  149. package/src/themes/boomdevs/01-settings/_settings.dropdown.scss +11 -0
  150. package/src/themes/boomdevs/01-settings/_settings.grid.scss +16 -0
  151. package/src/themes/boomdevs/01-settings/_settings.input.scss +14 -0
  152. package/src/themes/boomdevs/01-settings/_settings.link.scss +11 -0
  153. package/src/themes/boomdevs/01-settings/_settings.list.scss +10 -0
  154. package/src/themes/boomdevs/01-settings/_settings.modal.scss +16 -0
  155. package/src/themes/boomdevs/01-settings/_settings.navbar.scss +16 -0
  156. package/src/themes/boomdevs/01-settings/_settings.pagination.scss +13 -0
  157. package/src/themes/boomdevs/01-settings/_settings.progress.scss +11 -0
  158. package/src/themes/boomdevs/01-settings/_settings.rating.scss +10 -0
  159. package/src/themes/boomdevs/01-settings/_settings.spacing.scss +33 -0
  160. package/src/themes/boomdevs/01-settings/_settings.spinner.scss +11 -0
  161. package/src/themes/boomdevs/01-settings/_settings.steps.scss +12 -0
  162. package/src/themes/boomdevs/01-settings/_settings.tabs.scss +12 -0
  163. package/src/themes/boomdevs/01-settings/_settings.todo.scss +15 -0
  164. package/src/themes/boomdevs/01-settings/_settings.toggle.scss +14 -0
  165. package/src/themes/boomdevs/01-settings/_settings.tooltip.scss +13 -0
  166. package/src/themes/boomdevs/01-settings/_settings.typography.scss +58 -0
  167. package/src/themes/boomdevs/01-settings/_settings.video-player.scss +12 -0
  168. package/src/themes/boomdevs/02-tools/_index.scss +7 -0
  169. package/src/themes/boomdevs/03-generic/_index.scss +7 -0
  170. package/src/themes/boomdevs/04-elements/_index.scss +7 -0
  171. package/src/themes/boomdevs/05-objects/_index.scss +7 -0
  172. package/src/themes/boomdevs/06-components/_components.button.scss +11 -0
  173. package/src/themes/boomdevs/06-components/_index.scss +11 -0
  174. package/src/themes/boomdevs/99-utilities/_index.scss +7 -0
  175. package/src/themes/boomdevs/index.scss +26 -0
  176. package/src/themes/esrar/01-settings/_index.scss +15 -0
  177. package/src/themes/esrar/01-settings/_settings.colors.scss +91 -0
  178. package/src/themes/esrar/02-tools/_index.scss +8 -0
  179. package/src/themes/esrar/02-tools/_tools.animations.scss +342 -0
  180. package/src/themes/esrar/06-components/_components.accordion.scss +49 -0
  181. package/src/themes/esrar/06-components/_components.avatar-group.scss +14 -0
  182. package/src/themes/esrar/06-components/_components.avatar.scss +61 -0
  183. package/src/themes/esrar/06-components/_components.badge.scss +117 -0
  184. package/src/themes/esrar/06-components/_components.breadcrumb.scss +65 -0
  185. package/src/themes/esrar/06-components/_components.btn-group.scss +19 -0
  186. package/src/themes/esrar/06-components/_components.button.scss +224 -0
  187. package/src/themes/esrar/06-components/_components.callout.scss +51 -0
  188. package/src/themes/esrar/06-components/_components.card.scss +134 -0
  189. package/src/themes/esrar/06-components/_components.chart.scss +24 -0
  190. package/src/themes/esrar/06-components/_components.checkbox-group.scss +26 -0
  191. package/src/themes/esrar/06-components/_components.checkbox.scss +71 -0
  192. package/src/themes/esrar/06-components/_components.color-mode-toggle.scss +29 -0
  193. package/src/themes/esrar/06-components/_components.countdown.scss +67 -0
  194. package/src/themes/esrar/06-components/_components.data-table.scss +22 -0
  195. package/src/themes/esrar/06-components/_components.datepicker.scss +20 -0
  196. package/src/themes/esrar/06-components/_components.dropdown.scss +272 -0
  197. package/src/themes/esrar/06-components/_components.edge-panel.scss +10 -0
  198. package/src/themes/esrar/06-components/_components.form-group.scss +15 -0
  199. package/src/themes/esrar/06-components/_components.form.scss +66 -0
  200. package/src/themes/esrar/06-components/_components.hero.scss +251 -0
  201. package/src/themes/esrar/06-components/_components.icon.scss +33 -0
  202. package/src/themes/esrar/06-components/_components.image-gallery.scss +29 -0
  203. package/src/themes/esrar/06-components/_components.input.scss +91 -0
  204. package/src/themes/esrar/06-components/_components.list-group.scss +26 -0
  205. package/src/themes/esrar/06-components/_components.modal.scss +148 -0
  206. package/src/themes/esrar/06-components/_components.notification.scss +80 -0
  207. package/src/themes/esrar/06-components/_components.pagination.scss +84 -0
  208. package/src/themes/esrar/06-components/_components.popover.scss +10 -0
  209. package/src/themes/esrar/06-components/_components.progress.scss +64 -0
  210. package/src/themes/esrar/06-components/_components.rating.scss +26 -0
  211. package/src/themes/esrar/06-components/_components.skeleton.scss +15 -0
  212. package/src/themes/esrar/06-components/_components.slider.scss +90 -0
  213. package/src/themes/esrar/06-components/_components.spinner.scss +71 -0
  214. package/src/themes/esrar/06-components/_components.steps.scss +76 -0
  215. package/src/themes/esrar/06-components/_components.tab.scss +58 -0
  216. package/src/themes/esrar/06-components/_components.tag.scss +21 -0
  217. package/src/themes/esrar/06-components/_components.timeline.scss +19 -0
  218. package/src/themes/esrar/06-components/_components.toast.scss +91 -0
  219. package/src/themes/esrar/06-components/_components.toggle.scss +74 -0
  220. package/src/themes/esrar/06-components/_components.tooltip.scss +45 -0
  221. package/src/themes/esrar/06-components/_components.upload.scss +102 -0
  222. package/src/themes/esrar/06-components/_index.scss +42 -0
  223. package/src/themes/esrar/index.scss +30 -0
  224. package/src/themes/flashtrade/01-settings/_index.scss +19 -0
  225. package/src/themes/flashtrade/01-settings/_settings.animations.scss +11 -0
  226. package/src/themes/flashtrade/01-settings/_settings.background.scss +9 -0
  227. package/src/themes/flashtrade/01-settings/_settings.colors.scss +79 -0
  228. package/src/themes/flashtrade/01-settings/_settings.config.scss +16 -0
  229. package/src/themes/flashtrade/01-settings/_settings.typography.scss +35 -0
  230. package/src/themes/flashtrade/02-tools/_index.scss +8 -0
  231. package/src/themes/flashtrade/03-generic/_index.scss +8 -0
  232. package/src/themes/flashtrade/04-elements/_index.scss +12 -0
  233. package/src/themes/flashtrade/05-objects/_index.scss +8 -0
  234. package/src/themes/flashtrade/06-components/_components.badge.scss +156 -0
  235. package/src/themes/flashtrade/06-components/_components.button.scss +135 -0
  236. package/src/themes/flashtrade/06-components/_components.card.scss +214 -0
  237. package/src/themes/flashtrade/06-components/_components.navbar.scss +227 -0
  238. package/src/themes/flashtrade/06-components/_index.scss +13 -0
  239. package/src/themes/flashtrade/99-utilities/_index.scss +9 -0
  240. package/src/themes/flashtrade/99-utilities/_utilities.trading.scss +187 -0
  241. package/src/themes/flashtrade/README.md +386 -0
  242. package/src/themes/flashtrade/demo.html +272 -0
  243. package/src/themes/flashtrade/index.scss +36 -0
  244. package/src/themes/mashroom/01-settings/_index.scss +69 -0
  245. package/src/themes/mashroom/01-settings/_settings.accordion.scss +32 -0
  246. package/src/themes/mashroom/01-settings/_settings.animations.scss +26 -0
  247. package/src/themes/mashroom/01-settings/_settings.avatar-group.scss +22 -0
  248. package/src/themes/mashroom/01-settings/_settings.avatar.scss +57 -0
  249. package/src/themes/mashroom/01-settings/_settings.badge.scss +19 -0
  250. package/src/themes/mashroom/01-settings/_settings.border-radius.scss +24 -0
  251. package/src/themes/mashroom/01-settings/_settings.border.scss +14 -0
  252. package/src/themes/mashroom/01-settings/_settings.box-shadow.scss +40 -0
  253. package/src/themes/mashroom/01-settings/_settings.breadcrumb.scss +0 -0
  254. package/src/themes/mashroom/01-settings/_settings.breakpoints.scss +17 -0
  255. package/src/themes/mashroom/01-settings/_settings.btn-group.scss +5 -0
  256. package/src/themes/mashroom/01-settings/_settings.button.scss +50 -0
  257. package/src/themes/mashroom/01-settings/_settings.callout.scss +81 -0
  258. package/src/themes/mashroom/01-settings/_settings.card.scss +52 -0
  259. package/src/themes/mashroom/01-settings/_settings.checkbox-group.scss +5 -0
  260. package/src/themes/mashroom/01-settings/_settings.checkbox.scss +23 -0
  261. package/src/themes/mashroom/01-settings/_settings.color-mode.scss +7 -0
  262. package/src/themes/mashroom/01-settings/_settings.colors.scss +180 -0
  263. package/src/themes/mashroom/01-settings/_settings.config.scss +4 -0
  264. package/src/themes/mashroom/01-settings/_settings.countdown.scss +20 -0
  265. package/src/themes/mashroom/01-settings/_settings.data-table.scss +56 -0
  266. package/src/themes/mashroom/01-settings/_settings.datepicker.scss +45 -0
  267. package/src/themes/mashroom/01-settings/_settings.design-tokens.scss +3 -0
  268. package/src/themes/mashroom/01-settings/_settings.dropdown.scss +45 -0
  269. package/src/themes/mashroom/01-settings/_settings.edge-panel.scss +24 -0
  270. package/src/themes/mashroom/01-settings/_settings.fonts.scss +8 -0
  271. package/src/themes/mashroom/01-settings/_settings.form-group.scss +14 -0
  272. package/src/themes/mashroom/01-settings/_settings.form.scss +6 -0
  273. package/src/themes/mashroom/01-settings/_settings.grid.scss +23 -0
  274. package/src/themes/mashroom/01-settings/_settings.hero.scss +41 -0
  275. package/src/themes/mashroom/01-settings/_settings.input.scss +51 -0
  276. package/src/themes/mashroom/01-settings/_settings.link.scss +13 -0
  277. package/src/themes/mashroom/01-settings/_settings.list-group.scss +16 -0
  278. package/src/themes/mashroom/01-settings/_settings.list.scss +13 -0
  279. package/src/themes/mashroom/01-settings/_settings.masonry-grid.scss +23 -0
  280. package/src/themes/mashroom/01-settings/_settings.menu.scss +50 -0
  281. package/src/themes/mashroom/01-settings/_settings.messages.scss +98 -0
  282. package/src/themes/mashroom/01-settings/_settings.modal.scss +41 -0
  283. package/src/themes/mashroom/01-settings/_settings.nav.scss +20 -0
  284. package/src/themes/mashroom/01-settings/_settings.navbar.scss +54 -0
  285. package/src/themes/mashroom/01-settings/_settings.pagination.scss +30 -0
  286. package/src/themes/mashroom/01-settings/_settings.photoviewer.scss +45 -0
  287. package/src/themes/mashroom/01-settings/_settings.popover.scss +20 -0
  288. package/src/themes/mashroom/01-settings/_settings.position.scss +9 -0
  289. package/src/themes/mashroom/01-settings/_settings.progress.scss +17 -0
  290. package/src/themes/mashroom/01-settings/_settings.rating.scss +11 -0
  291. package/src/themes/mashroom/01-settings/_settings.river.scss +50 -0
  292. package/src/themes/mashroom/01-settings/_settings.sectionintro.scss +31 -0
  293. package/src/themes/mashroom/01-settings/_settings.select.scss +47 -0
  294. package/src/themes/mashroom/01-settings/_settings.side-menu.scss +79 -0
  295. package/src/themes/mashroom/01-settings/_settings.skeleton.scss +24 -0
  296. package/src/themes/mashroom/01-settings/_settings.spacing.scss +66 -0
  297. package/src/themes/mashroom/01-settings/_settings.spinner.scss +34 -0
  298. package/src/themes/mashroom/01-settings/_settings.steps.scss +33 -0
  299. package/src/themes/mashroom/01-settings/_settings.tabs.scss +33 -0
  300. package/src/themes/mashroom/01-settings/_settings.testimonials.scss +24 -0
  301. package/src/themes/mashroom/01-settings/_settings.todo.scss +52 -0
  302. package/src/themes/mashroom/01-settings/_settings.toggle.scss +49 -0
  303. package/src/themes/mashroom/01-settings/_settings.tooltip.scss +20 -0
  304. package/src/themes/mashroom/01-settings/_settings.typography.scss +95 -0
  305. package/src/themes/mashroom/01-settings/_settings.upload.scss +96 -0
  306. package/src/themes/mashroom/01-settings/_settings.z-layers.scss +19 -0
  307. package/src/themes/mashroom/02-tools/_index.scss +8 -0
  308. package/src/themes/mashroom/02-tools/_tools.psychedelic-gradients.scss +78 -0
  309. package/src/themes/mashroom/02-tools/_tools.trippy-effects.scss +114 -0
  310. package/src/themes/mashroom/03-generic/_index.scss +6 -0
  311. package/src/themes/mashroom/04-elements/_index.scss +6 -0
  312. package/src/themes/mashroom/05-objects/_index.scss +6 -0
  313. package/src/themes/mashroom/06-components/_components.accordion.scss +187 -0
  314. package/src/themes/mashroom/06-components/_components.avatar-group.scss +276 -0
  315. package/src/themes/mashroom/06-components/_components.avatar.scss +114 -0
  316. package/src/themes/mashroom/06-components/_components.badge.scss +152 -0
  317. package/src/themes/mashroom/06-components/_components.breadcrumb.scss +162 -0
  318. package/src/themes/mashroom/06-components/_components.btn-group.scss +404 -0
  319. package/src/themes/mashroom/06-components/_components.button.scss +160 -0
  320. package/src/themes/mashroom/06-components/_components.callout.scss +140 -0
  321. package/src/themes/mashroom/06-components/_components.card.scss +225 -0
  322. package/src/themes/mashroom/06-components/_components.checkbox.scss +186 -0
  323. package/src/themes/mashroom/06-components/_components.color-mode-toggle.scss +308 -0
  324. package/src/themes/mashroom/06-components/_components.countdown.scss +402 -0
  325. package/src/themes/mashroom/06-components/_components.data-table.scss +354 -0
  326. package/src/themes/mashroom/06-components/_components.datepicker.scss +349 -0
  327. package/src/themes/mashroom/06-components/_components.dropdown.scss +334 -0
  328. package/src/themes/mashroom/06-components/_components.edge-panel.scss +413 -0
  329. package/src/themes/mashroom/06-components/_components.form-group.scss +433 -0
  330. package/src/themes/mashroom/06-components/_components.form.scss +358 -0
  331. package/src/themes/mashroom/06-components/_components.hero.scss +151 -0
  332. package/src/themes/mashroom/06-components/_components.input.scss +147 -0
  333. package/src/themes/mashroom/06-components/_components.list-group.scss +456 -0
  334. package/src/themes/mashroom/06-components/_components.list.scss +145 -0
  335. package/src/themes/mashroom/06-components/_components.menu.scss +497 -0
  336. package/src/themes/mashroom/06-components/_components.messages.scss +277 -0
  337. package/src/themes/mashroom/06-components/_components.modal.scss +264 -0
  338. package/src/themes/mashroom/06-components/_components.nav.scss +181 -0
  339. package/src/themes/mashroom/06-components/_components.navbar.scss +538 -0
  340. package/src/themes/mashroom/06-components/_components.pagination.scss +400 -0
  341. package/src/themes/mashroom/06-components/_components.photoviewer.scss +498 -0
  342. package/src/themes/mashroom/06-components/_components.popover.scss +383 -0
  343. package/src/themes/mashroom/06-components/_components.product-review.scss +408 -0
  344. package/src/themes/mashroom/06-components/_components.progress.scss +249 -0
  345. package/src/themes/mashroom/06-components/_components.rating.scss +300 -0
  346. package/src/themes/mashroom/06-components/_components.river.scss +570 -0
  347. package/src/themes/mashroom/06-components/_components.sectionintro.scss +546 -0
  348. package/src/themes/mashroom/06-components/_components.select.scss +455 -0
  349. package/src/themes/mashroom/06-components/_components.side-menu.scss +635 -0
  350. package/src/themes/mashroom/06-components/_components.skeleton.scss +447 -0
  351. package/src/themes/mashroom/06-components/_components.slider.scss +414 -0
  352. package/src/themes/mashroom/06-components/_components.spinner.scss +198 -0
  353. package/src/themes/mashroom/06-components/_components.steps.scss +350 -0
  354. package/src/themes/mashroom/06-components/_components.tabs.scss +269 -0
  355. package/src/themes/mashroom/06-components/_components.testimonials.scss +561 -0
  356. package/src/themes/mashroom/06-components/_components.toggle.scss +231 -0
  357. package/src/themes/mashroom/06-components/_components.tooltip.scss +167 -0
  358. package/src/themes/mashroom/06-components/_components.upload.scss +537 -0
  359. package/src/themes/mashroom/06-components/_components.video-player.scss +560 -0
  360. package/src/themes/mashroom/06-components/_index.scss +55 -0
  361. package/src/themes/mashroom/99-utilities/_index.scss +6 -0
  362. package/src/themes/mashroom/index.scss +26 -0
  363. package/src/themes/shaj-default/01-settings/_index.scss +69 -0
  364. package/src/themes/shaj-default/01-settings/_settings.accordion.scss +38 -0
  365. package/src/themes/shaj-default/01-settings/_settings.animations.scss +32 -0
  366. package/src/themes/shaj-default/01-settings/_settings.avatar-group.scss +28 -0
  367. package/src/themes/shaj-default/01-settings/_settings.avatar.scss +63 -0
  368. package/src/themes/shaj-default/01-settings/_settings.badge.scss +25 -0
  369. package/src/themes/shaj-default/01-settings/_settings.border-radius.scss +24 -0
  370. package/src/themes/shaj-default/01-settings/_settings.border.scss +20 -0
  371. package/src/themes/shaj-default/01-settings/_settings.box-shadow.scss +46 -0
  372. package/src/themes/shaj-default/01-settings/_settings.breadcrumb.scss +0 -0
  373. package/src/themes/shaj-default/01-settings/_settings.breakpoints.scss +23 -0
  374. package/src/themes/shaj-default/01-settings/_settings.btn-group.scss +11 -0
  375. package/src/themes/shaj-default/01-settings/_settings.button.scss +56 -0
  376. package/src/themes/shaj-default/01-settings/_settings.callout.scss +87 -0
  377. package/src/themes/shaj-default/01-settings/_settings.card.scss +52 -0
  378. package/src/themes/shaj-default/01-settings/_settings.checkbox-group.scss +11 -0
  379. package/src/themes/shaj-default/01-settings/_settings.checkbox.scss +29 -0
  380. package/src/themes/shaj-default/01-settings/_settings.color-mode.scss +13 -0
  381. package/src/themes/shaj-default/01-settings/_settings.colors.scss +91 -0
  382. package/src/themes/shaj-default/01-settings/_settings.config.scss +4 -0
  383. package/src/themes/shaj-default/01-settings/_settings.countdown.scss +26 -0
  384. package/src/themes/shaj-default/01-settings/_settings.data-table.scss +62 -0
  385. package/src/themes/shaj-default/01-settings/_settings.datepicker.scss +51 -0
  386. package/src/themes/shaj-default/01-settings/_settings.design-tokens.scss +9 -0
  387. package/src/themes/shaj-default/01-settings/_settings.dropdown.scss +51 -0
  388. package/src/themes/shaj-default/01-settings/_settings.edge-panel.scss +30 -0
  389. package/src/themes/shaj-default/01-settings/_settings.fonts.scss +13 -0
  390. package/src/themes/shaj-default/01-settings/_settings.form-group.scss +20 -0
  391. package/src/themes/shaj-default/01-settings/_settings.form.scss +12 -0
  392. package/src/themes/shaj-default/01-settings/_settings.grid.scss +29 -0
  393. package/src/themes/shaj-default/01-settings/_settings.hero.scss +47 -0
  394. package/src/themes/shaj-default/01-settings/_settings.input.scss +57 -0
  395. package/src/themes/shaj-default/01-settings/_settings.link.scss +19 -0
  396. package/src/themes/shaj-default/01-settings/_settings.list-group.scss +22 -0
  397. package/src/themes/shaj-default/01-settings/_settings.list.scss +19 -0
  398. package/src/themes/shaj-default/01-settings/_settings.masonry-grid.scss +29 -0
  399. package/src/themes/shaj-default/01-settings/_settings.menu.scss +56 -0
  400. package/src/themes/shaj-default/01-settings/_settings.messages.scss +104 -0
  401. package/src/themes/shaj-default/01-settings/_settings.modal.scss +47 -0
  402. package/src/themes/shaj-default/01-settings/_settings.nav.scss +26 -0
  403. package/src/themes/shaj-default/01-settings/_settings.navbar.scss +60 -0
  404. package/src/themes/shaj-default/01-settings/_settings.pagination.scss +36 -0
  405. package/src/themes/shaj-default/01-settings/_settings.photoviewer.scss +51 -0
  406. package/src/themes/shaj-default/01-settings/_settings.popover.scss +26 -0
  407. package/src/themes/shaj-default/01-settings/_settings.position.scss +15 -0
  408. package/src/themes/shaj-default/01-settings/_settings.progress.scss +23 -0
  409. package/src/themes/shaj-default/01-settings/_settings.rating.scss +17 -0
  410. package/src/themes/shaj-default/01-settings/_settings.river.scss +56 -0
  411. package/src/themes/shaj-default/01-settings/_settings.sectionintro.scss +37 -0
  412. package/src/themes/shaj-default/01-settings/_settings.select.scss +53 -0
  413. package/src/themes/shaj-default/01-settings/_settings.side-menu.scss +85 -0
  414. package/src/themes/shaj-default/01-settings/_settings.skeleton.scss +30 -0
  415. package/src/themes/shaj-default/01-settings/_settings.spacing.scss +72 -0
  416. package/src/themes/shaj-default/01-settings/_settings.spinner.scss +24 -0
  417. package/src/themes/shaj-default/01-settings/_settings.steps.scss +39 -0
  418. package/src/themes/shaj-default/01-settings/_settings.tabs.scss +39 -0
  419. package/src/themes/shaj-default/01-settings/_settings.testimonials.scss +30 -0
  420. package/src/themes/shaj-default/01-settings/_settings.todo.scss +58 -0
  421. package/src/themes/shaj-default/01-settings/_settings.toggle.scss +55 -0
  422. package/src/themes/shaj-default/01-settings/_settings.tooltip.scss +26 -0
  423. package/src/themes/shaj-default/01-settings/_settings.typography.scss +101 -0
  424. package/src/themes/shaj-default/01-settings/_settings.upload.scss +102 -0
  425. package/src/themes/shaj-default/01-settings/_settings.z-layers.scss +25 -0
  426. package/src/themes/shaj-default/02-tools/_index.scss +0 -0
  427. package/src/themes/shaj-default/03-generic/_generic.root.scss +0 -0
  428. package/src/themes/shaj-default/03-generic/_index.scss +2 -0
  429. package/src/themes/shaj-default/04-elements/_index.scss +0 -0
  430. package/src/themes/shaj-default/05-objects/_index.scss +0 -0
  431. package/src/themes/shaj-default/06-components/_components.button.scss +55 -0
  432. package/src/themes/shaj-default/06-components/_components.card.scss +57 -0
  433. package/src/themes/shaj-default/06-components/_components.input.scss +58 -0
  434. package/src/themes/shaj-default/06-components/_components.navbar.scss +99 -0
  435. package/src/themes/shaj-default/06-components/_components.tooltip.scss +0 -0
  436. package/src/themes/shaj-default/06-components/_index.scss +13 -0
  437. package/src/themes/shaj-default/99-utilities/_index.scss +0 -0
  438. package/src/themes/shaj-default/index.scss +25 -0
  439. package/src/themes/themes.config.js +219 -0
  440. package/theme.config.ts +360 -0
  441. package/src/lib/theme/ThemeManager.integration.test.ts +0 -124
  442. package/src/lib/theme/ThemeManager.stories.tsx +0 -472
  443. package/src/lib/theme/ThemeManager.test.ts +0 -190
  444. package/src/lib/theme/ThemeManager.ts +0 -645
  445. package/src/lib/theme/ThemeProvider.tsx +0 -377
  446. package/src/lib/theme/createTheme.test.ts +0 -475
  447. package/src/lib/theme/useTheme.test.tsx +0 -67
  448. package/src/lib/theme/useTheme.ts +0 -64
  449. package/src/lib/theme/utils.test.ts +0 -140
@@ -1,472 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react';
2
- import React, { useState } from 'react';
3
- import { ThemeMetadata, ThemeProvider, useTheme } from './index';
4
- import { themesConfig } from '../../themes/themes.config';
5
- import { Button } from '../../components/Button/Button';
6
- import { Card } from '../../components/Card/Card';
7
- import { ColorModeToggle } from '../../components/ColorModeToggle/ColorModeToggle';
8
-
9
- /**
10
- * Theme Manager
11
- *
12
- * The Atomix Theme Manager provides dynamic theme switching capabilities
13
- * for both React and vanilla JavaScript applications.
14
- *
15
- * ## Features
16
- * - Dynamic theme loading
17
- * - Theme persistence
18
- * - Preloading support
19
- * - SSR compatible
20
- * - Event system
21
- */
22
- const meta = {
23
- title: 'Utilities/Theme Manager',
24
- parameters: {
25
- docs: {
26
- description: {
27
- component: 'Dynamic theme management system for Atomix Design System. Supports theme switching, persistence, and preloading.',
28
- },
29
- },
30
- },
31
- } satisfies Meta;
32
-
33
- export default meta;
34
- type Story = StoryObj<typeof meta>;
35
-
36
- /**
37
- * Theme Switcher Component
38
- */
39
- function ThemeSwitcher() {
40
- const { theme, setTheme, availableThemes, isLoading, error } = useTheme();
41
-
42
- if (error) {
43
- return (
44
- <div style={{ padding: '1rem', background: 'var(--atomix-red-1)', border: '1px solid var(--atomix-red-4)', borderRadius: '8px' }}>
45
- <strong>Error:</strong> {error.message}
46
- </div>
47
- );
48
- }
49
-
50
- return (
51
- <div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>
52
- <div>
53
- <strong>Current Theme:</strong> {theme}
54
- {isLoading && <span style={{ marginLeft: '0.5rem', color: 'var(--atomix-primary-6)' }}>Loading...</span>}
55
- </div>
56
-
57
- <div style={{ display: 'flex', flexWrap: 'wrap', gap: '0.5rem' }}>
58
- {availableThemes.map((t) => (
59
- <Button
60
- key={t.class}
61
- variant={theme === t.class ? 'primary' : 'secondary'}
62
- size="sm"
63
- onClick={() => setTheme(t.class!)}
64
- disabled={isLoading}
65
- aria-label={`Switch to ${t.name} theme`}
66
- aria-pressed={theme === t.class}
67
- >
68
- {t.name}
69
- </Button>
70
- ))}
71
- </div>
72
- </div>
73
- );
74
- }
75
-
76
- /**
77
- * Theme Info Display
78
- */
79
- function ThemeInfo() {
80
- const { theme, availableThemes } = useTheme();
81
- const currentThemeMetadata = availableThemes.find(t => t.class === theme);
82
-
83
- if (!currentThemeMetadata) {
84
- return null;
85
- }
86
-
87
- return (
88
- <div style={{ display: 'grid', gap: '0.5rem', fontSize: '0.875rem' }}>
89
- <div><strong>Name:</strong> {currentThemeMetadata.name}</div>
90
- {currentThemeMetadata.description && (
91
- <div><strong>Description:</strong> {currentThemeMetadata.description}</div>
92
- )}
93
- {currentThemeMetadata.author && (
94
- <div><strong>Author:</strong> {currentThemeMetadata.author}</div>
95
- )}
96
- {currentThemeMetadata.version && (
97
- <div><strong>Version:</strong> {currentThemeMetadata.version}</div>
98
- )}
99
- {currentThemeMetadata.status && (
100
- <div><strong>Status:</strong> {currentThemeMetadata.status}</div>
101
- )}
102
- </div>
103
- );
104
- }
105
-
106
- /**
107
- * Basic Theme Switching
108
- *
109
- * Demonstrates basic theme switching functionality with the ThemeProvider and useTheme hook.
110
- */
111
- export const BasicThemeSwitching: Story = {
112
- render: () => (
113
- <ThemeProvider
114
- themes={themesConfig.metadata as Record<string, ThemeMetadata>}
115
- defaultTheme="shaj-default"
116
- enablePersistence={false}
117
- >
118
- <div style={{ padding: '2rem' }}>
119
- <h2>Theme Switcher</h2>
120
- <p>Click a button to switch themes</p>
121
- <ThemeSwitcher />
122
- </div>
123
- </ThemeProvider>
124
- ),
125
- };
126
-
127
- /**
128
- * With Persistence
129
- *
130
- * Theme manager with localStorage persistence enabled.
131
- * The selected theme will be remembered across page reloads.
132
- */
133
- export const WithPersistence: Story = {
134
- render: () => (
135
- <ThemeProvider
136
- themes={themesConfig.metadata as Record<string, ThemeMetadata>}
137
- defaultTheme="shaj-default"
138
- enablePersistence={true}
139
- storageKey="storybook-theme-demo"
140
- >
141
- <div style={{ padding: '2rem' }}>
142
- <h2>Theme Switcher with Persistence</h2>
143
- <p>Your theme selection will be saved to localStorage</p>
144
- <ThemeSwitcher />
145
- <div style={{ marginTop: '1rem', padding: '1rem', background: 'var(--atomix-gray-1)', borderRadius: '8px' }}>
146
- <small>
147
- <strong>Note:</strong> Reload the page to see persistence in action.
148
- The theme will be restored from localStorage.
149
- </small>
150
- </div>
151
- </div>
152
- </ThemeProvider>
153
- ),
154
- };
155
-
156
- /**
157
- * Theme Info Display
158
- *
159
- * Shows detailed information about the current theme.
160
- */
161
- export const ThemeInfoDisplay: Story = {
162
- render: () => (
163
- <ThemeProvider
164
- themes={themesConfig.metadata as Record<string, ThemeMetadata>}
165
- defaultTheme="shaj-default"
166
- >
167
- <div style={{ padding: '2rem', display: 'grid', gap: '1.5rem' }}>
168
- <Card>
169
- <h2>Theme Switcher</h2>
170
- <ThemeSwitcher />
171
- </Card>
172
-
173
- <Card>
174
- <h2>Current Theme Details</h2>
175
- <ThemeInfo />
176
- </Card>
177
- </div>
178
- </ThemeProvider>
179
- ),
180
- };
181
-
182
- /**
183
- * With Preloading
184
- *
185
- * Demonstrates theme preloading for faster switching.
186
- */
187
- export const WithPreloading: Story = {
188
- render: () => {
189
- function PreloadDemo() {
190
- const { preloadTheme, availableThemes } = useTheme();
191
- const [preloading, setPreloading] = useState<string | null>(null);
192
- const [preloaded, setPreloaded] = useState<Set<string>>(new Set());
193
-
194
- const handlePreload = async (themeName: string) => {
195
- setPreloading(themeName);
196
- try {
197
- await preloadTheme(themeName);
198
- setPreloaded(prev => new Set([...prev, themeName]));
199
- } catch (error) {
200
- console.error('Failed to preload theme:', error);
201
- } finally {
202
- setPreloading(null);
203
- }
204
- };
205
-
206
- return (
207
- <div style={{ display: 'grid', gap: '1.5rem' }}>
208
- <Card>
209
- <h2>Theme Switcher</h2>
210
- <ThemeSwitcher />
211
- </Card>
212
-
213
- <Card>
214
- <h2>Preload Themes</h2>
215
- <p style={{ fontSize: '0.875rem', color: 'var(--atomix-gray-7)' }}>
216
- Preload themes for instant switching
217
- </p>
218
- <div style={{ display: 'flex', flexWrap: 'wrap', gap: '0.5rem', marginTop: '1rem' }}>
219
- {availableThemes.map((t) => (
220
- <Button
221
- key={t.class}
222
- variant={preloaded.has(t.class!) ? 'success' : 'outline'}
223
- size="sm"
224
- onClick={() => handlePreload(t.class!)}
225
- disabled={preloading === t.class}
226
- >
227
- {preloading === t.class ? 'Preloading...' :
228
- preloaded.has(t.class!) ? `✓ ${t.name}` :
229
- `Preload ${t.name}`}
230
- </Button>
231
- ))}
232
- </div>
233
- </Card>
234
- </div>
235
- );
236
- }
237
-
238
- return (
239
- <ThemeProvider
240
- themes={themesConfig.metadata as Record<string, ThemeMetadata>}
241
- defaultTheme="shaj-default"
242
- preload={['shaj-default']}
243
- >
244
- <div style={{ padding: '2rem' }}>
245
- <PreloadDemo />
246
- </div>
247
- </ThemeProvider>
248
- );
249
- },
250
- };
251
-
252
- /**
253
- * With Color Mode Toggle
254
- *
255
- * Demonstrates integration with the ColorModeToggle component.
256
- */
257
- export const WithColorModeToggle: Story = {
258
- render: () => (
259
- <ThemeProvider
260
- themes={themesConfig.metadata as Record<string, ThemeMetadata>}
261
- defaultTheme="shaj-default"
262
- >
263
- <div style={{ padding: '2rem' }}>
264
- <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: '2rem' }}>
265
- <h2>Theme & Color Mode Controls</h2>
266
- <ColorModeToggle />
267
- </div>
268
-
269
- <Card>
270
- <ThemeSwitcher />
271
- </Card>
272
-
273
- <div style={{ marginTop: '1.5rem', padding: '1rem', background: 'var(--atomix-gray-1)', borderRadius: '8px' }}>
274
- <p style={{ fontSize: '0.875rem', margin: 0 }}>
275
- <strong>Tip:</strong> Use the moon/sun icon to toggle between light and dark modes.
276
- Each theme supports both color modes.
277
- </p>
278
- </div>
279
- </div>
280
- </ThemeProvider>
281
- ),
282
- };
283
-
284
- /**
285
- * Component Showcase
286
- *
287
- * Shows how different components look in the current theme.
288
- */
289
- export const ComponentShowcase: Story = {
290
- render: () => (
291
- <ThemeProvider
292
- themes={themesConfig.metadata as Record<string, ThemeMetadata>}
293
- defaultTheme="shaj-default"
294
- >
295
- <div style={{ padding: '2rem', display: 'grid', gap: '1.5rem' }}>
296
- <Card>
297
- <h2>Theme Switcher</h2>
298
- <ThemeSwitcher />
299
- </Card>
300
-
301
- <Card>
302
- <h2>Component Showcase</h2>
303
- <p>See how components look in the current theme</p>
304
-
305
- <div style={{ display: 'grid', gap: '1.5rem', marginTop: '1rem' }}>
306
- <div>
307
- <h3 style={{ marginBottom: '0.5rem' }}>Buttons</h3>
308
- <div style={{ display: 'flex', gap: '0.5rem', flexWrap: 'wrap' }}>
309
- <Button variant="primary">Primary</Button>
310
- <Button variant="secondary">Secondary</Button>
311
- <Button variant="success">Success</Button>
312
- <Button variant="outline">Outline</Button>
313
- </div>
314
- </div>
315
-
316
- <div>
317
- <h3 style={{ marginBottom: '0.5rem' }}>Cards</h3>
318
- <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(150px, 1fr))', gap: '1rem' }}>
319
- <Card style={{ padding: '1rem' }}>
320
- <h4 style={{ margin: '0 0 0.5rem 0' }}>Card 1</h4>
321
- <p style={{ margin: 0, fontSize: '0.875rem' }}>Content here</p>
322
- </Card>
323
- <Card style={{ padding: '1rem' }}>
324
- <h4 style={{ margin: '0 0 0.5rem 0' }}>Card 2</h4>
325
- <p style={{ margin: 0, fontSize: '0.875rem' }}>Content here</p>
326
- </Card>
327
- <Card style={{ padding: '1rem' }}>
328
- <h4 style={{ margin: '0 0 0.5rem 0' }}>Card 3</h4>
329
- <p style={{ margin: 0, fontSize: '0.875rem' }}>Content here</p>
330
- </Card>
331
- </div>
332
- </div>
333
- </div>
334
- </Card>
335
- </div>
336
- </ThemeProvider>
337
- ),
338
- };
339
-
340
- /**
341
- * Error Handling
342
- *
343
- * Demonstrates error handling when theme loading fails.
344
- */
345
- export const ErrorHandling: Story = {
346
- render: () => {
347
- function ErrorDemo() {
348
- const { setTheme, error } = useTheme();
349
- const [customError, setCustomError] = useState<string | null>(null);
350
-
351
- const handleInvalidTheme = async () => {
352
- try {
353
- await setTheme('non-existent-theme');
354
- } catch (err) {
355
- setCustomError(err instanceof Error ? err.message : 'Unknown error');
356
- }
357
- };
358
-
359
- return (
360
- <div style={{ display: 'grid', gap: '1.5rem' }}>
361
- <Card>
362
- <h2>Theme Switcher</h2>
363
- <ThemeSwitcher />
364
- </Card>
365
-
366
- <Card>
367
- <h2>Error Handling Demo</h2>
368
- <p style={{ fontSize: '0.875rem', color: 'var(--atomix-gray-7)' }}>
369
- Click the button below to trigger an error by trying to load a non-existent theme
370
- </p>
371
- <Button variant="outline" onClick={handleInvalidTheme}>
372
- Try Invalid Theme
373
- </Button>
374
-
375
- {(error || customError) && (
376
- <div style={{
377
- marginTop: '1rem',
378
- padding: '1rem',
379
- background: 'var(--atomix-red-1)',
380
- border: '1px solid var(--atomix-red-4)',
381
- borderRadius: '8px',
382
- color: 'var(--atomix-red-9)'
383
- }}>
384
- <strong>Error:</strong> {error?.message || customError}
385
- </div>
386
- )}
387
- </Card>
388
- </div>
389
- );
390
- }
391
-
392
- return (
393
- <ThemeProvider
394
- themes={themesConfig.metadata as Record<string, ThemeMetadata>}
395
- defaultTheme="shaj-default"
396
- onError={(error, themeName) => {
397
- console.error(`Failed to load theme "${themeName}":`, error);
398
- }}
399
- >
400
- <div style={{ padding: '2rem' }}>
401
- <ErrorDemo />
402
- </div>
403
- </ThemeProvider>
404
- );
405
- },
406
- };
407
-
408
- /**
409
- * Custom Callbacks
410
- *
411
- * Demonstrates using custom callbacks for theme changes.
412
- */
413
- export const CustomCallbacks: Story = {
414
- render: () => {
415
- function CallbackDemo() {
416
- const [log, setLog] = useState<string[]>([]);
417
-
418
- const addLog = (message: string) => {
419
- setLog(prev => [...prev, `${new Date().toLocaleTimeString()}: ${message}`]);
420
- };
421
-
422
- return (
423
- <ThemeProvider
424
- themes={themesConfig.metadata as Record<string, ThemeMetadata>}
425
- defaultTheme="shaj-default"
426
- onThemeChange={(theme) => {
427
- addLog(`Theme changed to: ${theme}`);
428
- }}
429
- onError={(error, themeName) => {
430
- addLog(`Error loading theme "${themeName}": ${error.message}`);
431
- }}
432
- >
433
- <div style={{ display: 'grid', gap: '1.5rem' }}>
434
- <Card>
435
- <h2>Theme Switcher</h2>
436
- <ThemeSwitcher />
437
- </Card>
438
-
439
- <Card>
440
- <h2>Event Log</h2>
441
- <div style={{
442
- maxHeight: '200px',
443
- overflowY: 'auto',
444
- padding: '1rem',
445
- background: 'var(--atomix-gray-1)',
446
- borderRadius: '8px',
447
- fontFamily: 'monospace',
448
- fontSize: '0.75rem'
449
- }}>
450
- {log.length === 0 ? (
451
- <div style={{ color: 'var(--atomix-gray-6)' }}>No events yet. Switch themes to see logs.</div>
452
- ) : (
453
- log.map((entry, index) => (
454
- <div key={index} style={{ marginBottom: '0.25rem' }}>
455
- {entry}
456
- </div>
457
- ))
458
- )}
459
- </div>
460
- </Card>
461
- </div>
462
- </ThemeProvider>
463
- );
464
- }
465
-
466
- return (
467
- <div style={{ padding: '2rem' }}>
468
- <CallbackDemo />
469
- </div>
470
- );
471
- },
472
- };
@@ -1,190 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
- import { ThemeManager } from './ThemeManager';
3
- import * as utils from './utils';
4
- import type { ThemeManagerConfig } from './types';
5
-
6
- // Mock utils
7
- vi.mock('./utils', () => ({
8
- isBrowser: vi.fn(() => true),
9
- isServer: vi.fn(() => false),
10
- loadThemeCSS: vi.fn(() => Promise.resolve()),
11
- removeThemeCSS: vi.fn(),
12
- removeAllThemeCSS: vi.fn(),
13
- applyThemeAttributes: vi.fn(),
14
- removeThemeAttributes: vi.fn(),
15
- getCurrentThemeFromDOM: vi.fn(() => null),
16
- getSystemTheme: vi.fn(() => 'light'),
17
- isThemeLoaded: vi.fn(() => false),
18
- validateThemeMetadata: vi.fn(() => ({ valid: true, errors: [], warnings: [] })),
19
- isValidThemeName: vi.fn(() => true),
20
- createLocalStorageAdapter: vi.fn(() => ({
21
- getItem: vi.fn(),
22
- setItem: vi.fn(),
23
- removeItem: vi.fn(),
24
- isAvailable: vi.fn(() => true),
25
- })),
26
- }));
27
-
28
- describe('ThemeManager', () => {
29
- const mockThemes = {
30
- 'theme-1': { name: 'Theme 1', class: 'theme-1' },
31
- 'theme-2': { name: 'Theme 2', class: 'theme-2' },
32
- };
33
-
34
- const defaultConfig: ThemeManagerConfig = {
35
- themes: mockThemes,
36
- defaultTheme: 'theme-1',
37
- };
38
-
39
- let themeManager: ThemeManager;
40
-
41
- beforeEach(() => {
42
- vi.clearAllMocks();
43
- themeManager = new ThemeManager(defaultConfig);
44
- });
45
-
46
- afterEach(() => {
47
- themeManager.destroy();
48
- });
49
-
50
- describe('Initialization', () => {
51
- it('should initialize with default theme', () => {
52
- expect(themeManager.getTheme()).toBe('theme-1');
53
- });
54
-
55
- it('should throw error if themes config is missing', () => {
56
- expect(() => new ThemeManager({} as any)).toThrow('ThemeManager: themes configuration is required');
57
- });
58
-
59
- it('should throw error if default theme is not found', () => {
60
- expect(() => new ThemeManager({
61
- themes: mockThemes,
62
- defaultTheme: 'non-existent',
63
- })).toThrow('ThemeManager: default theme "non-existent" not found');
64
- });
65
-
66
- it('should load theme from storage if persistence is enabled', () => {
67
- const mockGetItem = vi.fn(() => 'theme-2');
68
- vi.mocked(utils.createLocalStorageAdapter).mockReturnValue({
69
- getItem: mockGetItem,
70
- setItem: vi.fn(),
71
- removeItem: vi.fn(),
72
- isAvailable: vi.fn(() => true),
73
- });
74
-
75
- const tm = new ThemeManager({
76
- ...defaultConfig,
77
- enablePersistence: true,
78
- });
79
-
80
- expect(tm.getTheme()).toBe('theme-2');
81
- });
82
- });
83
-
84
- describe('Theme Switching', () => {
85
- it('should set theme successfully', async () => {
86
- await themeManager.setTheme('theme-2');
87
- expect(themeManager.getTheme()).toBe('theme-2');
88
- expect(utils.loadThemeCSS).toHaveBeenCalledWith('theme-2', '/themes', false, null);
89
- expect(utils.applyThemeAttributes).toHaveBeenCalledWith('theme-2', 'data-theme');
90
- });
91
-
92
- it('should not reload if theme is already active', async () => {
93
- // Wait for init to potentially settle
94
- await new Promise(resolve => setTimeout(resolve, 0));
95
- vi.clearAllMocks();
96
-
97
- await themeManager.setTheme('theme-1');
98
- expect(utils.loadThemeCSS).not.toHaveBeenCalled();
99
- });
100
-
101
- it('should force reload if force option is true', async () => {
102
- await themeManager.setTheme('theme-1', { force: true });
103
- expect(utils.loadThemeCSS).toHaveBeenCalledWith('theme-1', '/themes', false, null);
104
- });
105
-
106
- it('should throw error for invalid theme', async () => {
107
- await expect(themeManager.setTheme('invalid-theme')).rejects.toThrow('Theme "invalid-theme" not found');
108
- });
109
-
110
- it('should emit themeChange event', async () => {
111
- const spy = vi.fn();
112
- themeManager.on('themeChange', spy);
113
- await themeManager.setTheme('theme-2');
114
- expect(spy).toHaveBeenCalledWith(expect.objectContaining({
115
- previousTheme: 'theme-1',
116
- currentTheme: 'theme-2',
117
- source: 'user',
118
- }));
119
- });
120
-
121
- it('should fallback to default theme on error if fallbackOnError is true', async () => {
122
- vi.mocked(utils.loadThemeCSS).mockRejectedValueOnce(new Error('Load failed'));
123
-
124
- await themeManager.setTheme('theme-2', { fallbackOnError: true });
125
-
126
- expect(themeManager.getTheme()).toBe('theme-1');
127
- // Should have tried to load theme-2 first
128
- expect(utils.loadThemeCSS).toHaveBeenCalledWith('theme-2', '/themes', false, null);
129
- // Then should have tried to load theme-1 (default) - actually default might be loaded or not
130
- // If default is already loaded (it is initialized), it might skip loading CSS unless forced
131
- // But setTheme calls preloadTheme which checks isThemeLoaded.
132
- });
133
- });
134
-
135
- describe('Preloading', () => {
136
- it('should preload theme', async () => {
137
- await themeManager.preloadTheme('theme-2');
138
- expect(utils.loadThemeCSS).toHaveBeenCalledWith('theme-2', '/themes', false, null);
139
- expect(themeManager.isThemeLoaded('theme-2')).toBe(true);
140
- });
141
-
142
- it('should not preload if already loaded', async () => {
143
- vi.mocked(utils.isThemeLoaded).mockReturnValue(true);
144
- await themeManager.preloadTheme('theme-2');
145
- // ThemeManager checks its own loadedThemes set OR utils.isThemeLoaded
146
- // Since we mocked utils.isThemeLoaded to return true, it might skip loading
147
- // But ThemeManager.isThemeLoaded calls utils.isThemeLoaded
148
- });
149
- });
150
-
151
- describe('Persistence', () => {
152
- it('should save theme to storage on change', async () => {
153
- const mockSetItem = vi.fn();
154
- vi.mocked(utils.createLocalStorageAdapter).mockReturnValue({
155
- getItem: vi.fn(),
156
- setItem: mockSetItem,
157
- removeItem: vi.fn(),
158
- isAvailable: vi.fn(() => true),
159
- });
160
-
161
- const tm = new ThemeManager({
162
- ...defaultConfig,
163
- enablePersistence: true,
164
- storageKey: 'test-key',
165
- });
166
-
167
- await tm.setTheme('theme-2');
168
- expect(mockSetItem).toHaveBeenCalledWith('test-key', 'theme-2');
169
- });
170
-
171
- it('should enable/disable persistence', () => {
172
- const mockSetItem = vi.fn();
173
- const mockRemoveItem = vi.fn();
174
- vi.mocked(utils.createLocalStorageAdapter).mockReturnValue({
175
- getItem: vi.fn(),
176
- setItem: mockSetItem,
177
- removeItem: mockRemoveItem,
178
- isAvailable: vi.fn(() => true),
179
- });
180
-
181
- const tm = new ThemeManager(defaultConfig);
182
-
183
- tm.enablePersistence('new-key');
184
- expect(mockSetItem).toHaveBeenCalledWith('new-key', 'theme-1');
185
-
186
- tm.disablePersistence();
187
- expect(mockRemoveItem).toHaveBeenCalledWith('new-key');
188
- });
189
- });
190
- });