@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,475 +0,0 @@
1
- /**
2
- * createTheme Tests
3
- *
4
- * Tests for the createTheme function and related utilities
5
- */
6
-
7
- import { describe, it, expect } from 'vitest';
8
- import { createTheme } from './createTheme';
9
- import { generateCSSVariables } from './generateCSSVariables';
10
- import { mergeTheme, extendTheme, createThemeVariants } from './composeTheme';
11
- import { lighten, darken, alpha, getContrastText } from './themeUtils';
12
-
13
- describe('createTheme', () => {
14
- it('should create a theme with default values', () => {
15
- const theme = createTheme();
16
-
17
- expect(theme).toBeDefined();
18
- expect(theme.__isJSTheme).toBe(true);
19
- expect(theme.palette).toBeDefined();
20
- expect(theme.typography).toBeDefined();
21
- expect(theme.spacing).toBeDefined();
22
- expect(theme.breakpoints).toBeDefined();
23
- });
24
-
25
- it('should create a theme with custom palette', () => {
26
- const theme = createTheme({
27
- palette: {
28
- primary: { main: '#FF0000' },
29
- secondary: { main: '#00FF00' },
30
- },
31
- });
32
-
33
- expect(theme.palette.primary.main).toBe('#FF0000');
34
- expect(theme.palette.secondary.main).toBe('#00FF00');
35
- expect(theme.palette.primary.light).toBeDefined();
36
- expect(theme.palette.primary.dark).toBeDefined();
37
- expect(theme.palette.primary.contrastText).toBeDefined();
38
- });
39
-
40
- it('should create a theme with custom typography', () => {
41
- const theme = createTheme({
42
- typography: {
43
- fontFamily: 'Arial, sans-serif',
44
- fontSize: 16,
45
- },
46
- });
47
-
48
- expect(theme.typography.fontFamily).toBe('Arial, sans-serif');
49
- expect(theme.typography.fontSize).toBe(16);
50
- });
51
-
52
- it('should create spacing function', () => {
53
- const theme = createTheme({ spacing: 8 });
54
-
55
- expect(theme.spacing(1)).toBe('8px');
56
- expect(theme.spacing(2)).toBe('16px');
57
- expect(theme.spacing(1, 2)).toBe('8px 16px');
58
- });
59
-
60
- it('should create breakpoints with helpers', () => {
61
- const theme = createTheme();
62
-
63
- expect(theme.breakpoints.up('sm')).toContain('min-width');
64
- expect(theme.breakpoints.down('md')).toContain('max-width');
65
- expect(theme.breakpoints.between('sm', 'lg')).toContain('min-width');
66
- });
67
-
68
- it('should merge multiple theme options', () => {
69
- const theme = createTheme(
70
- { palette: { primary: { main: '#000' } } },
71
- { palette: { secondary: { main: '#FFF' } } }
72
- );
73
-
74
- expect(theme.palette.primary.main).toBe('#000');
75
- expect(theme.palette.secondary.main).toBe('#FFF');
76
- });
77
- });
78
-
79
- describe('CSS Variable Generation', () => {
80
- it('should generate CSS variables from theme', () => {
81
- const theme = createTheme({
82
- palette: {
83
- primary: { main: '#7AFFD7' },
84
- },
85
- });
86
-
87
- const css = generateCSSVariables(theme);
88
-
89
- expect(css).toContain('--atomix-primary');
90
- expect(css).toContain('#7AFFD7');
91
- expect(css).toContain(':root');
92
- });
93
-
94
- it('should generate CSS variables with custom selector', () => {
95
- const theme = createTheme();
96
- const css = generateCSSVariables(theme, { selector: '.my-theme' });
97
-
98
- expect(css).toContain('.my-theme');
99
- });
100
-
101
- it('should generate CSS variables with custom prefix', () => {
102
- const theme = createTheme();
103
- const css = generateCSSVariables(theme, { prefix: 'custom' });
104
-
105
- expect(css).toContain('--custom-primary');
106
- });
107
-
108
- describe('Border Radius Variables', () => {
109
- it('should generate all border radius variables', () => {
110
- const theme = createTheme();
111
- const css = generateCSSVariables(theme);
112
-
113
- expect(css).toContain('--atomix-border-radius');
114
- expect(css).toContain('--atomix-border-radius-sm');
115
- expect(css).toContain('--atomix-border-radius-lg');
116
- expect(css).toContain('--atomix-border-radius-xl');
117
- expect(css).toContain('--atomix-border-radius-xxl');
118
- expect(css).toContain('--atomix-border-radius-2xl');
119
- expect(css).toContain('--atomix-border-radius-3xl');
120
- expect(css).toContain('--atomix-border-radius-4xl');
121
- expect(css).toContain('--atomix-border-radius-pill');
122
- });
123
-
124
- it('should use custom border radius values', () => {
125
- const theme = createTheme({
126
- borderRadius: {
127
- base: '1rem',
128
- sm: '0.5rem',
129
- lg: '1.5rem',
130
- },
131
- });
132
- const css = generateCSSVariables(theme);
133
-
134
- expect(css).toContain('--atomix-border-radius: 1rem');
135
- expect(css).toContain('--atomix-border-radius-sm: 0.5rem');
136
- expect(css).toContain('--atomix-border-radius-lg: 1.5rem');
137
- });
138
-
139
- it('should accept numeric border radius values', () => {
140
- const theme = createTheme({
141
- borderRadius: {
142
- base: 8,
143
- sm: 4,
144
- },
145
- });
146
- const css = generateCSSVariables(theme);
147
-
148
- expect(css).toContain('--atomix-border-radius: 8px');
149
- expect(css).toContain('--atomix-border-radius-sm: 4px');
150
- });
151
- });
152
-
153
- describe('Color Palette Scales', () => {
154
- it('should generate primary color scale (1-10)', () => {
155
- const theme = createTheme({
156
- palette: {
157
- primary: { main: '#7AFFD7' },
158
- },
159
- });
160
- const css = generateCSSVariables(theme);
161
-
162
- for (let i = 1; i <= 10; i++) {
163
- expect(css).toContain(`--atomix-primary-${i}`);
164
- }
165
- });
166
-
167
- it('should generate secondary color scale (1-10)', () => {
168
- const theme = createTheme({
169
- palette: {
170
- secondary: { main: '#FF5733' },
171
- },
172
- });
173
- const css = generateCSSVariables(theme);
174
-
175
- for (let i = 1; i <= 10; i++) {
176
- expect(css).toContain(`--atomix-secondary-${i}`);
177
- }
178
- });
179
-
180
- it('should generate gray color scale (1-10)', () => {
181
- const theme = createTheme({
182
- palette: {
183
- text: {
184
- primary: '#000000',
185
- secondary: '#666666',
186
- disabled: '#999999',
187
- },
188
- },
189
- });
190
- const css = generateCSSVariables(theme);
191
-
192
- for (let i = 1; i <= 10; i++) {
193
- expect(css).toContain(`--atomix-gray-${i}`);
194
- }
195
- });
196
-
197
- it('should generate semantic color scales (red, green, blue, yellow)', () => {
198
- const theme = createTheme({
199
- palette: {
200
- error: { main: '#F44336' },
201
- success: { main: '#4CAF50' },
202
- info: { main: '#2196F3' },
203
- warning: { main: '#FF9800' },
204
- },
205
- });
206
- const css = generateCSSVariables(theme);
207
-
208
- // Red scale from error
209
- for (let i = 1; i <= 10; i++) {
210
- expect(css).toContain(`--atomix-red-${i}`);
211
- }
212
-
213
- // Green scale from success
214
- for (let i = 1; i <= 10; i++) {
215
- expect(css).toContain(`--atomix-green-${i}`);
216
- }
217
-
218
- // Blue scale from info
219
- for (let i = 1; i <= 10; i++) {
220
- expect(css).toContain(`--atomix-blue-${i}`);
221
- }
222
-
223
- // Yellow scale from warning
224
- for (let i = 1; i <= 10; i++) {
225
- expect(css).toContain(`--atomix-yellow-${i}`);
226
- }
227
- });
228
-
229
- it('should generate color scale step 6 as the main color', () => {
230
- const theme = createTheme({
231
- palette: {
232
- primary: { main: '#7AFFD7' },
233
- },
234
- });
235
- const css = generateCSSVariables(theme);
236
-
237
- // Step 6 should be the main color
238
- expect(css).toMatch(/--atomix-primary-6:\s*#7AFFD7/i);
239
- });
240
- });
241
-
242
- describe('Typography Variables', () => {
243
- it('should generate root font size variable', () => {
244
- const theme = createTheme({
245
- typography: {
246
- fontSize: 16,
247
- },
248
- });
249
- const css = generateCSSVariables(theme);
250
-
251
- expect(css).toContain('--atomix-root-font-size');
252
- expect(css).toContain('16px');
253
- });
254
-
255
- it('should generate extended font size scale', () => {
256
- const theme = createTheme({
257
- typography: {
258
- fontSize: 16,
259
- },
260
- });
261
- const css = generateCSSVariables(theme);
262
-
263
- expect(css).toContain('--atomix-font-size-xs');
264
- expect(css).toContain('--atomix-font-size-sm');
265
- expect(css).toContain('--atomix-font-size-md');
266
- expect(css).toContain('--atomix-font-size-lg');
267
- expect(css).toContain('--atomix-font-size-xl');
268
- expect(css).toContain('--atomix-font-size-2xl');
269
- });
270
-
271
- it('should calculate font sizes correctly from base', () => {
272
- const theme = createTheme({
273
- typography: {
274
- fontSize: 16,
275
- },
276
- });
277
- const css = generateCSSVariables(theme);
278
-
279
- // xs = 0.75 * 16 = 12px
280
- expect(css).toMatch(/--atomix-font-size-xs:\s*12px/);
281
- // sm = 0.875 * 16 = 14px
282
- expect(css).toMatch(/--atomix-font-size-sm:\s*14px/);
283
- // md = 1 * 16 = 16px
284
- expect(css).toMatch(/--atomix-font-size-md:\s*16px/);
285
- // lg = 1.125 * 16 = 18px
286
- expect(css).toMatch(/--atomix-font-size-lg:\s*18px/);
287
- // xl = 1.5 * 16 = 24px
288
- expect(css).toMatch(/--atomix-font-size-xl:\s*24px/);
289
- // 2xl = 2 * 16 = 32px
290
- expect(css).toMatch(/--atomix-font-size-2xl:\s*32px/);
291
- });
292
- });
293
-
294
- describe('Link Variables', () => {
295
- it('should generate link decoration variables', () => {
296
- const theme = createTheme({
297
- palette: {
298
- primary: { main: '#7AFFD7' },
299
- },
300
- });
301
- const css = generateCSSVariables(theme);
302
-
303
- expect(css).toContain('--atomix-link-decoration');
304
- expect(css).toContain('--atomix-link-hover-decoration');
305
- });
306
-
307
- it('should set default link decoration values', () => {
308
- const theme = createTheme({
309
- palette: {
310
- primary: { main: '#7AFFD7' },
311
- },
312
- });
313
- const css = generateCSSVariables(theme);
314
-
315
- expect(css).toContain('--atomix-link-decoration: underline');
316
- expect(css).toContain('--atomix-link-hover-decoration: none');
317
- });
318
- });
319
-
320
- describe('Code and Highlight Variables', () => {
321
- it('should generate highlight background variable', () => {
322
- const theme = createTheme();
323
- const css = generateCSSVariables(theme);
324
-
325
- expect(css).toContain('--atomix-highlight-bg');
326
- });
327
-
328
- it('should generate code color variable', () => {
329
- const theme = createTheme({
330
- palette: {
331
- text: {
332
- primary: '#000000',
333
- secondary: '#666666',
334
- disabled: '#999999',
335
- },
336
- },
337
- });
338
- const css = generateCSSVariables(theme);
339
-
340
- expect(css).toContain('--atomix-code-color');
341
- // Should use text secondary color (value may vary based on theme defaults)
342
- expect(css).toMatch(/--atomix-code-color:\s*[^;]+/);
343
- });
344
-
345
- it('should use warning color for highlight background when available', () => {
346
- const theme = createTheme({
347
- palette: {
348
- warning: { main: '#FF9800' },
349
- },
350
- });
351
- const css = generateCSSVariables(theme);
352
-
353
- expect(css).toContain('--atomix-highlight-bg');
354
- // Should contain rgba with warning color
355
- expect(css).toMatch(/--atomix-highlight-bg:\s*rgba\(/);
356
- });
357
- });
358
-
359
- describe('Variable Format and Structure', () => {
360
- it('should generate valid CSS variable syntax', () => {
361
- const theme = createTheme();
362
- const css = generateCSSVariables(theme);
363
-
364
- // Check for valid CSS variable format: --name: value;
365
- const variablePattern = /--[\w-]+:\s*[^;]+;/g;
366
- const matches = css.match(variablePattern);
367
- expect(matches).toBeTruthy();
368
- expect(matches!.length).toBeGreaterThan(0);
369
- });
370
-
371
- it('should include all variable categories', () => {
372
- const theme = createTheme({
373
- palette: {
374
- primary: { main: '#7AFFD7' },
375
- secondary: { main: '#FF5733' },
376
- error: { main: '#F44336' },
377
- success: { main: '#4CAF50' },
378
- info: { main: '#2196F3' },
379
- warning: { main: '#FF9800' },
380
- },
381
- typography: {
382
- fontSize: 16,
383
- },
384
- });
385
- const css = generateCSSVariables(theme);
386
-
387
- // Check for variables from each category
388
- expect(css).toContain('--atomix-primary'); // Palette
389
- expect(css).toContain('--atomix-body-font-family'); // Typography
390
- expect(css).toContain('--atomix-box-shadow'); // Shadows
391
- expect(css).toContain('--atomix-transition-duration'); // Transitions
392
- expect(css).toContain('--atomix-z-modal'); // Z-index
393
- expect(css).toContain('--atomix-breakpoint-sm'); // Breakpoints
394
- expect(css).toContain('--atomix-spacing-4'); // Spacing
395
- expect(css).toContain('--atomix-border-width'); // Borders
396
- expect(css).toContain('--atomix-border-radius'); // Border radius
397
- expect(css).toContain('--atomix-focus-ring-width'); // Focus ring
398
- });
399
-
400
- it('should not duplicate variables', () => {
401
- const theme = createTheme();
402
- const css = generateCSSVariables(theme);
403
-
404
- // Extract all variable names
405
- const variableNames = css.match(/--([\w-]+):/g) || [];
406
- const uniqueNames = new Set(variableNames);
407
-
408
- // Should have same count (no duplicates)
409
- expect(variableNames.length).toBe(uniqueNames.size);
410
- });
411
- });
412
- });
413
-
414
- describe('Theme Composition', () => {
415
- it('should merge themes', () => {
416
- const merged = mergeTheme(
417
- { palette: { primary: { main: '#000' } } },
418
- { palette: { secondary: { main: '#FFF' } } }
419
- );
420
-
421
- const primary = merged.palette?.primary;
422
- const secondary = merged.palette?.secondary;
423
-
424
- expect(primary && typeof primary === 'object' ? primary.main : primary).toBe('#000');
425
- expect(secondary && typeof secondary === 'object' ? secondary.main : secondary).toBe('#FFF');
426
- });
427
-
428
- it('should extend theme', () => {
429
- const base = createTheme({ palette: { primary: { main: '#000' } } });
430
- const extended = extendTheme(base, {
431
- palette: { secondary: { main: '#FFF' } },
432
- });
433
-
434
- expect(extended.palette.primary.main).toBe('#000');
435
- expect(extended.palette.secondary.main).toBe('#FFF');
436
- });
437
-
438
- it('should create theme variants', () => {
439
- const { light, dark } = createThemeVariants({
440
- palette: { primary: { main: '#7AFFD7' } },
441
- });
442
-
443
- expect(light).toBeDefined();
444
- expect(dark).toBeDefined();
445
- expect(dark.palette.background.default).toBe('#121212');
446
- });
447
- });
448
-
449
- describe('Theme Utilities', () => {
450
- it('should lighten color', () => {
451
- const lightened = lighten('#000000', 0.5);
452
- expect(lightened).not.toBe('#000000');
453
- expect(lightened).toMatch(/^#[0-9a-f]{6}$/i);
454
- });
455
-
456
- it('should darken color', () => {
457
- const darkened = darken('#FFFFFF', 0.5);
458
- expect(darkened).not.toBe('#FFFFFF');
459
- expect(darkened).toMatch(/^#[0-9a-f]{6}$/i);
460
- });
461
-
462
- it('should add alpha to color', () => {
463
- const withAlpha = alpha('#FF0000', 0.5);
464
- expect(withAlpha).toContain('rgba');
465
- expect(withAlpha).toContain('0.5');
466
- });
467
-
468
- it('should get contrast text', () => {
469
- const whiteContrast = getContrastText('#000000');
470
- const blackContrast = getContrastText('#FFFFFF');
471
-
472
- expect(whiteContrast).toBe('#FFFFFF');
473
- expect(blackContrast).toBe('#000000');
474
- });
475
- });
@@ -1,67 +0,0 @@
1
- import React from 'react';
2
- import { describe, it, expect, vi } from 'vitest';
3
- import { renderHook, act } from '@testing-library/react';
4
- import { useTheme } from './useTheme';
5
- import { ThemeContext } from './ThemeContext';
6
- import type { ThemeContextValue } from './types';
7
-
8
- describe('useTheme', () => {
9
- const mockSetTheme = vi.fn(() => Promise.resolve());
10
- const mockPreloadTheme = vi.fn(() => Promise.resolve());
11
- const mockIsThemeLoaded = vi.fn(() => true);
12
-
13
- const mockContextValue: ThemeContextValue = {
14
- theme: 'default-theme',
15
- activeTheme: null,
16
- setTheme: mockSetTheme,
17
- availableThemes: [{ name: 'Default', class: 'default-theme' }],
18
- isLoading: false,
19
- error: null,
20
- isThemeLoaded: mockIsThemeLoaded,
21
- preloadTheme: mockPreloadTheme,
22
- themeManager: {} as any, // We don't need the actual manager for this test
23
- };
24
-
25
- it('should throw error when used outside ThemeProvider', () => {
26
- const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
27
-
28
- expect(() => {
29
- renderHook(() => useTheme());
30
- }).toThrow('useTheme must be used within a ThemeProvider');
31
-
32
- consoleSpy.mockRestore();
33
- });
34
-
35
- it('should return theme context values', () => {
36
- const wrapper = ({ children }: { children: React.ReactNode }) => (
37
- <ThemeContext.Provider value={mockContextValue}>
38
- {children}
39
- </ThemeContext.Provider>
40
- );
41
-
42
- const { result } = renderHook(() => useTheme(), { wrapper });
43
-
44
- expect(result.current.theme).toBe('default-theme');
45
- expect(result.current.availableThemes).toHaveLength(1);
46
- expect(result.current.isLoading).toBe(false);
47
- });
48
-
49
- it('should call onChange callback when provided', async () => {
50
- const onChangeSpy = vi.fn();
51
-
52
- const wrapper = ({ children }: { children: React.ReactNode }) => (
53
- <ThemeContext.Provider value={mockContextValue}>
54
- {children}
55
- </ThemeContext.Provider>
56
- );
57
-
58
- const { result } = renderHook(() => useTheme({ onChange: onChangeSpy }), { wrapper });
59
-
60
- await act(async () => {
61
- await result.current.setTheme('new-theme');
62
- });
63
-
64
- expect(mockSetTheme).toHaveBeenCalledWith('new-theme', undefined);
65
- expect(onChangeSpy).toHaveBeenCalledWith('new-theme');
66
- });
67
- });
@@ -1,64 +0,0 @@
1
- /**
2
- * useTheme Hook
3
- *
4
- * React hook for accessing and managing theme state
5
- */
6
-
7
- import { useContext, useCallback } from 'react';
8
- import { ThemeContext } from './ThemeContext';
9
- import type { UseThemeReturn, UseThemeOptions, ThemeLoadOptions, Theme } from './types';
10
-
11
- /**
12
- * useTheme hook
13
- *
14
- * Access theme context and manage theme state in React components.
15
- * Must be used within a ThemeProvider.
16
- */
17
- export const useTheme = (options: UseThemeOptions = {}): UseThemeReturn => {
18
- const context = useContext(ThemeContext);
19
-
20
- if (!context) {
21
- throw new Error(
22
- 'useTheme must be used within a ThemeProvider. ' +
23
- 'Wrap your component tree with <ThemeProvider> to use this hook.'
24
- );
25
- }
26
-
27
- const {
28
- theme,
29
- activeTheme,
30
- setTheme: contextSetTheme,
31
- availableThemes,
32
- isLoading,
33
- error,
34
- isThemeLoaded,
35
- preloadTheme,
36
- } = context;
37
-
38
- // Extract onChange callback to avoid dependency on entire options object
39
- const onChange = options?.onChange;
40
-
41
- // Wrap setTheme to call onChange callback if provided
42
- const setTheme = useCallback(
43
- async (themeOrName: string | Theme, themeOptions?: ThemeLoadOptions): Promise<void> => {
44
- await contextSetTheme(themeOrName, themeOptions);
45
- if (onChange) {
46
- onChange(themeOrName);
47
- }
48
- },
49
- [contextSetTheme, onChange]
50
- );
51
-
52
- return {
53
- theme,
54
- activeTheme,
55
- setTheme,
56
- availableThemes,
57
- isLoading,
58
- error,
59
- isThemeLoaded,
60
- preloadTheme,
61
- };
62
- };
63
-
64
- export default useTheme;