@shohojdhara/atomix 0.3.14 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (343) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/build-tools/EXAMPLES.md +372 -0
  3. package/build-tools/README.md +242 -0
  4. package/build-tools/__tests__/error-handler.test.js +230 -0
  5. package/build-tools/__tests__/index.test.js +141 -0
  6. package/build-tools/__tests__/rollup-plugin.test.js +194 -0
  7. package/build-tools/__tests__/utils.test.js +161 -0
  8. package/build-tools/__tests__/vite-plugin.test.js +129 -0
  9. package/build-tools/__tests__/webpack-loader.test.js +190 -0
  10. package/build-tools/error-handler.js +308 -0
  11. package/build-tools/index.d.ts +44 -0
  12. package/build-tools/index.js +88 -0
  13. package/build-tools/package.json +50 -0
  14. package/build-tools/rollup-plugin.js +236 -0
  15. package/build-tools/types.d.ts +163 -0
  16. package/build-tools/utils.js +203 -0
  17. package/build-tools/vite-plugin.js +161 -0
  18. package/build-tools/webpack-loader.js +123 -0
  19. package/dist/atomix.css +21044 -2618
  20. package/dist/atomix.css.map +1 -1
  21. package/dist/atomix.min.css +77 -3
  22. package/dist/atomix.min.css.map +1 -1
  23. package/dist/build-tools/EXAMPLES.md +372 -0
  24. package/dist/build-tools/README.md +242 -0
  25. package/dist/build-tools/__tests__/error-handler.test.js +230 -0
  26. package/dist/build-tools/__tests__/index.test.js +141 -0
  27. package/dist/build-tools/__tests__/rollup-plugin.test.js +194 -0
  28. package/dist/build-tools/__tests__/utils.test.js +161 -0
  29. package/dist/build-tools/__tests__/vite-plugin.test.js +129 -0
  30. package/dist/build-tools/__tests__/webpack-loader.test.js +190 -0
  31. package/dist/build-tools/error-handler.js +308 -0
  32. package/dist/build-tools/index.d.ts +44 -0
  33. package/dist/build-tools/index.js +88 -0
  34. package/dist/build-tools/package.json +50 -0
  35. package/dist/build-tools/rollup-plugin.js +236 -0
  36. package/dist/build-tools/types.d.ts +163 -0
  37. package/dist/build-tools/utils.js +203 -0
  38. package/dist/build-tools/vite-plugin.js +161 -0
  39. package/dist/build-tools/webpack-loader.js +123 -0
  40. package/dist/charts.d.ts +1 -1
  41. package/dist/charts.js +86 -57
  42. package/dist/charts.js.map +1 -1
  43. package/dist/core.d.ts +1 -1
  44. package/dist/core.js +136 -112
  45. package/dist/core.js.map +1 -1
  46. package/dist/forms.d.ts +2 -5
  47. package/dist/forms.js +140 -128
  48. package/dist/forms.js.map +1 -1
  49. package/dist/heavy.d.ts +1 -1
  50. package/dist/heavy.js +136 -112
  51. package/dist/heavy.js.map +1 -1
  52. package/dist/index.d.ts +152 -78
  53. package/dist/index.esm.js +346 -340
  54. package/dist/index.esm.js.map +1 -1
  55. package/dist/index.js +359 -353
  56. package/dist/index.js.map +1 -1
  57. package/dist/index.min.js +1 -1
  58. package/dist/index.min.js.map +1 -1
  59. package/dist/layout.js.map +1 -1
  60. package/dist/theme.d.ts +9 -9
  61. package/dist/theme.js.map +1 -1
  62. package/package.json +23 -8
  63. package/scripts/atomix-cli.js +170 -73
  64. package/scripts/cli/__tests__/README.md +81 -0
  65. package/scripts/cli/__tests__/basic.test.js +115 -0
  66. package/scripts/cli/__tests__/component-generator.test.js +332 -0
  67. package/scripts/cli/__tests__/integration.test.js +327 -0
  68. package/scripts/cli/__tests__/test-setup.js +133 -0
  69. package/scripts/cli/__tests__/token-manager.test.js +251 -0
  70. package/scripts/cli/__tests__/utils.test.js +161 -0
  71. package/scripts/cli/component-generator.js +253 -299
  72. package/scripts/cli/dependency-checker.js +355 -0
  73. package/scripts/cli/interactive-init.js +46 -5
  74. package/scripts/cli/template-manager.js +0 -2
  75. package/scripts/cli/templates/common-templates.js +636 -0
  76. package/scripts/cli/templates/composable-templates.js +148 -126
  77. package/scripts/cli/templates/index.js +23 -16
  78. package/scripts/cli/templates/project-templates.js +151 -23
  79. package/scripts/cli/templates/react-templates.js +280 -210
  80. package/scripts/cli/templates/scss-templates.js +90 -91
  81. package/scripts/cli/templates/testing-templates.js +206 -27
  82. package/scripts/cli/templates/testing-utils.js +278 -0
  83. package/scripts/cli/templates/types-templates.js +70 -56
  84. package/scripts/cli/theme-bridge.js +8 -2
  85. package/scripts/cli/token-manager.js +318 -206
  86. package/scripts/cli/utils.js +0 -1
  87. package/src/components/Accordion/Accordion.stories.tsx +358 -850
  88. package/src/components/Accordion/Accordion.test.tsx +70 -50
  89. package/src/components/Accordion/Accordion.tsx +99 -94
  90. package/src/components/AtomixGlass/AtomixGlass.test.tsx +1 -1
  91. package/src/components/AtomixGlass/AtomixGlass.tsx +80 -39
  92. package/src/components/AtomixGlass/AtomixGlassContainer.tsx +103 -81
  93. package/src/components/AtomixGlass/GlassFilter.tsx +9 -16
  94. package/src/components/AtomixGlass/__snapshots__/AtomixGlass.test.tsx.snap +8 -7
  95. package/src/components/AtomixGlass/glass-utils.ts +6 -5
  96. package/src/components/AtomixGlass/shader-utils.ts +133 -52
  97. package/src/components/AtomixGlass/stories/Customization.stories.tsx +131 -0
  98. package/src/components/AtomixGlass/stories/Examples.stories.tsx +2957 -2853
  99. package/src/components/AtomixGlass/stories/Modes.stories.tsx +1 -1
  100. package/src/components/AtomixGlass/stories/Overview.stories.tsx +348 -0
  101. package/src/components/AtomixGlass/stories/Performance.stories.tsx +103 -0
  102. package/src/components/AtomixGlass/stories/Playground.stories.tsx +51 -36
  103. package/src/components/AtomixGlass/stories/{ShaderVariants.stories.tsx → Shaders.stories.tsx} +2 -2
  104. package/src/components/AtomixGlass/stories/shared-components.tsx +90 -190
  105. package/src/components/Avatar/Avatar.stories.tsx +195 -0
  106. package/src/components/Avatar/Avatar.tsx +58 -56
  107. package/src/components/Badge/Badge.stories.tsx +122 -352
  108. package/src/components/Badge/Badge.test.tsx +41 -41
  109. package/src/components/Badge/Badge.tsx +64 -62
  110. package/src/components/Block/Block.stories.tsx +30 -11
  111. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +142 -23
  112. package/src/components/Breadcrumb/Breadcrumb.tsx +62 -60
  113. package/src/components/Button/Button.stories.tsx +454 -1126
  114. package/src/components/Button/Button.test.tsx +123 -0
  115. package/src/components/Button/Button.tsx +88 -60
  116. package/src/components/Button/ButtonGroup.stories.tsx +376 -215
  117. package/src/components/Button/ButtonGroup.tsx +4 -15
  118. package/src/components/Callout/Callout.stories.tsx +316 -568
  119. package/src/components/Card/Card.stories.tsx +292 -81
  120. package/src/components/Card/Card.tsx +30 -14
  121. package/src/components/Chart/AreaChart.tsx +1 -1
  122. package/src/components/Chart/CandlestickChart.tsx +23 -16
  123. package/src/components/Chart/Chart.stories.tsx +153 -16
  124. package/src/components/Chart/Chart.tsx +40 -44
  125. package/src/components/Chart/ChartRenderer.tsx +39 -12
  126. package/src/components/Chart/ChartToolbar.tsx +21 -5
  127. package/src/components/Chart/DonutChart.tsx +1 -1
  128. package/src/components/Chart/FunnelChart.tsx +4 -1
  129. package/src/components/Chart/GaugeChart.tsx +3 -1
  130. package/src/components/Chart/HeatmapChart.tsx +50 -37
  131. package/src/components/Chart/LineChart.tsx +3 -2
  132. package/src/components/Chart/MultiAxisChart.tsx +24 -16
  133. package/src/components/Chart/RadarChart.tsx +19 -17
  134. package/src/components/Chart/ScatterChart.tsx +29 -21
  135. package/src/components/ColorModeToggle/ColorModeToggle.stories.tsx +152 -66
  136. package/src/components/ColorModeToggle/ColorModeToggle.tsx +15 -3
  137. package/src/components/Countdown/Countdown.stories.tsx +114 -7
  138. package/src/components/DataTable/DataTable.stories.tsx +349 -144
  139. package/src/components/DataTable/DataTable.test.tsx +26 -148
  140. package/src/components/DataTable/DataTable.tsx +485 -456
  141. package/src/components/DatePicker/DatePicker.stories.tsx +310 -1066
  142. package/src/components/DatePicker/DatePicker.tsx +31 -26
  143. package/src/components/Dropdown/Dropdown.stories.tsx +153 -36
  144. package/src/components/Dropdown/Dropdown.tsx +313 -299
  145. package/src/components/EdgePanel/EdgePanel.stories.tsx +221 -25
  146. package/src/components/EdgePanel/EdgePanel.tsx +1 -3
  147. package/src/components/Footer/Footer.stories.tsx +396 -327
  148. package/src/components/Footer/Footer.tsx +130 -128
  149. package/src/components/Footer/FooterLink.tsx +2 -2
  150. package/src/components/Form/Checkbox.stories.tsx +140 -6
  151. package/src/components/Form/Checkbox.test.tsx +63 -0
  152. package/src/components/Form/Checkbox.tsx +122 -78
  153. package/src/components/Form/Form.stories.tsx +110 -19
  154. package/src/components/Form/FormGroup.stories.tsx +127 -4
  155. package/src/components/Form/Input.stories.tsx +22 -39
  156. package/src/components/Form/Input.test.tsx +38 -44
  157. package/src/components/Form/Radio.stories.tsx +146 -17
  158. package/src/components/Form/Radio.tsx +68 -66
  159. package/src/components/Form/Select.stories.tsx +140 -8
  160. package/src/components/Form/Select.tsx +184 -182
  161. package/src/components/Form/Textarea.stories.tsx +149 -6
  162. package/src/components/Form/Textarea.test.tsx +27 -32
  163. package/src/components/Hero/Hero.stories.tsx +372 -38
  164. package/src/components/Hero/Hero.tsx +201 -55
  165. package/src/components/Icon/index.ts +7 -1
  166. package/src/components/List/List.stories.tsx +141 -3
  167. package/src/components/List/List.tsx +19 -23
  168. package/src/components/Modal/Modal.stories.tsx +183 -43
  169. package/src/components/Modal/Modal.tsx +130 -127
  170. package/src/components/Navigation/Menu/MegaMenu.tsx +70 -70
  171. package/src/components/Navigation/Nav/NavDropdown.tsx +1 -5
  172. package/src/components/Navigation/SideMenu/SideMenu.stories.tsx +128 -28
  173. package/src/components/Navigation/SideMenu/SideMenu.tsx +5 -7
  174. package/src/components/Navigation/SideMenu/SideMenuItem.tsx +4 -5
  175. package/src/components/Pagination/Pagination.stories.tsx +7 -4
  176. package/src/components/Pagination/Pagination.tsx +199 -202
  177. package/src/components/PhotoViewer/PhotoViewer.tsx +4 -1
  178. package/src/components/Popover/Popover.stories.tsx +354 -97
  179. package/src/components/Popover/Popover.tsx +41 -37
  180. package/src/components/Progress/Progress.stories.tsx +160 -7
  181. package/src/components/River/River.stories.tsx +3 -2
  182. package/src/components/SectionIntro/SectionIntro.stories.tsx +239 -47
  183. package/src/components/Slider/Slider.stories.tsx +12 -4
  184. package/src/components/Spinner/Spinner.stories.tsx +104 -8
  185. package/src/components/Spinner/Spinner.test.tsx +23 -23
  186. package/src/components/Spinner/Spinner.tsx +43 -46
  187. package/src/components/Steps/Steps.stories.tsx +173 -42
  188. package/src/components/Tabs/Tabs.stories.tsx +141 -12
  189. package/src/components/Tabs/Tabs.tsx +74 -72
  190. package/src/components/Testimonial/Testimonial.stories.tsx +120 -3
  191. package/src/components/Todo/Todo.stories.tsx +198 -9
  192. package/src/components/Toggle/Toggle.stories.tsx +137 -36
  193. package/src/components/Toggle/Toggle.test.tsx +65 -70
  194. package/src/components/Toggle/Toggle.tsx +4 -1
  195. package/src/components/Tooltip/Tooltip.stories.tsx +194 -100
  196. package/src/components/Tooltip/Tooltip.tsx +104 -106
  197. package/src/components/Upload/Upload.stories.tsx +241 -150
  198. package/src/components/Upload/Upload.tsx +287 -283
  199. package/src/components/VideoPlayer/VideoPlayer.tsx +6 -1
  200. package/src/components/index.ts +13 -2
  201. package/src/layouts/Grid/Grid.stories.tsx +9 -3
  202. package/src/layouts/MasonryGrid/MasonryGrid.tsx +5 -1
  203. package/src/lib/README.md +2 -2
  204. package/src/lib/__tests__/theme-tools.test.ts +219 -0
  205. package/src/lib/composables/index.ts +2 -2
  206. package/src/lib/composables/shared-mouse-tracker.ts +13 -14
  207. package/src/lib/composables/useAtomixGlass.ts +126 -97
  208. package/src/lib/composables/useChartExport.ts +3 -8
  209. package/src/lib/composables/useDataTable.ts +72 -43
  210. package/src/lib/composables/useHero.ts +58 -14
  211. package/src/lib/composables/useHeroBackgroundSlider.ts +2 -9
  212. package/src/lib/composables/useInput.ts +10 -8
  213. package/src/lib/composables/useSideMenu.ts +6 -5
  214. package/src/lib/composables/useTooltip.ts +1 -2
  215. package/src/lib/composables/useVideoPlayer.ts +44 -35
  216. package/src/lib/config/index.ts +154 -154
  217. package/src/lib/constants/components.ts +9 -32
  218. package/src/lib/constants/cssVariables.ts +29 -29
  219. package/src/lib/hooks/__tests__/useComponentCustomization.test.ts +2 -6
  220. package/src/lib/hooks/index.ts +1 -1
  221. package/src/lib/hooks/useComponentCustomization.ts +11 -17
  222. package/src/lib/hooks/usePerformanceMonitor.ts +6 -7
  223. package/src/lib/patterns/__tests__/slots.test.ts +1 -1
  224. package/src/lib/patterns/index.ts +1 -1
  225. package/src/lib/patterns/slots.tsx +8 -13
  226. package/src/lib/storybook/InteractiveDemo.tsx +13 -18
  227. package/src/lib/storybook/PreviewContainer.tsx +1 -1
  228. package/src/lib/storybook/VariantsGrid.tsx +3 -7
  229. package/src/lib/storybook/index.ts +1 -1
  230. package/src/lib/theme/adapters/cssVariableMapper.ts +47 -74
  231. package/src/lib/theme/adapters/index.ts +3 -9
  232. package/src/lib/theme/adapters/themeAdapter.ts +41 -26
  233. package/src/lib/theme/config/index.ts +1 -1
  234. package/src/lib/theme/config/types.ts +2 -2
  235. package/src/lib/theme/config/validator.ts +10 -5
  236. package/src/lib/theme/constants/constants.ts +2 -2
  237. package/src/lib/theme/constants/index.ts +1 -2
  238. package/src/lib/theme/core/__tests__/createTheme.test.ts +20 -22
  239. package/src/lib/theme/core/composeTheme.ts +32 -26
  240. package/src/lib/theme/core/createTheme.ts +1 -1
  241. package/src/lib/theme/core/createThemeObject.ts +308 -301
  242. package/src/lib/theme/core/index.ts +3 -3
  243. package/src/lib/theme/devtools/CLI.ts +107 -105
  244. package/src/lib/theme/devtools/Comparator.tsx +50 -32
  245. package/src/lib/theme/devtools/DesignTokensCustomizer.stories.tsx +50 -48
  246. package/src/lib/theme/devtools/DesignTokensCustomizer.tsx +257 -63
  247. package/src/lib/theme/devtools/Inspector.tsx +75 -60
  248. package/src/lib/theme/devtools/LiveEditor.tsx +97 -76
  249. package/src/lib/theme/devtools/Preview.tsx +150 -106
  250. package/src/lib/theme/devtools/ThemeValidator.ts +29 -21
  251. package/src/lib/theme/devtools/index.ts +3 -9
  252. package/src/lib/theme/devtools/useHistory.ts +23 -21
  253. package/src/lib/theme/errors/errors.ts +12 -11
  254. package/src/lib/theme/errors/index.ts +2 -7
  255. package/src/lib/theme/generators/generateCSS.ts +9 -13
  256. package/src/lib/theme/generators/generateCSSNested.ts +1 -6
  257. package/src/lib/theme/generators/generateCSSVariables.ts +673 -630
  258. package/src/lib/theme/generators/index.ts +1 -4
  259. package/src/lib/theme/i18n/index.ts +1 -1
  260. package/src/lib/theme/i18n/rtl.ts +13 -13
  261. package/src/lib/theme/index.ts +7 -16
  262. package/src/lib/theme/runtime/ThemeApplicator.ts +4 -4
  263. package/src/lib/theme/runtime/ThemeContext.tsx +1 -1
  264. package/src/lib/theme/runtime/ThemeErrorBoundary.tsx +19 -23
  265. package/src/lib/theme/runtime/ThemeProvider.tsx +230 -239
  266. package/src/lib/theme/runtime/__tests__/ThemeProvider.integration.test.tsx +1 -1
  267. package/src/lib/theme/runtime/__tests__/ThemeProvider.test.tsx +24 -29
  268. package/src/lib/theme/runtime/index.ts +2 -5
  269. package/src/lib/theme/runtime/useTheme.ts +18 -18
  270. package/src/lib/theme/runtime/useThemeTokens.ts +22 -22
  271. package/src/lib/theme/test/testTheme.ts +15 -16
  272. package/src/lib/theme/tokens/index.ts +2 -7
  273. package/src/lib/theme/tokens/tokens.ts +25 -24
  274. package/src/lib/theme/types.ts +428 -411
  275. package/src/lib/theme/utils/__tests__/themeValidation.test.ts +3 -3
  276. package/src/lib/theme/utils/componentTheming.ts +18 -18
  277. package/src/lib/theme/utils/domUtils.ts +277 -289
  278. package/src/lib/theme/utils/index.ts +1 -2
  279. package/src/lib/theme/utils/injectCSS.ts +10 -14
  280. package/src/lib/theme/utils/naming.ts +20 -16
  281. package/src/lib/theme/utils/themeHelpers.ts +10 -12
  282. package/src/lib/theme/utils/themeUtils.ts +85 -86
  283. package/src/lib/theme/utils/themeValidation.ts +82 -33
  284. package/src/lib/theme-tools.ts +8 -6
  285. package/src/lib/types/components.ts +172 -71
  286. package/src/lib/types/partProps.ts +1 -1
  287. package/src/lib/utils/__tests__/csv.test.ts +45 -0
  288. package/src/lib/utils/componentUtils.ts +8 -12
  289. package/src/lib/utils/csv.ts +19 -0
  290. package/src/lib/utils/dataTableExport.ts +2 -15
  291. package/src/lib/utils/fontPreloader.ts +10 -19
  292. package/src/lib/utils/icons.ts +4 -1
  293. package/src/lib/utils/index.ts +2 -6
  294. package/src/lib/utils/memoryMonitor.ts +10 -8
  295. package/src/lib/utils/themeNaming.ts +2 -2
  296. package/src/styles/01-settings/_index.scss +1 -1
  297. package/src/styles/01-settings/_settings.accordion.scss +28 -7
  298. package/src/styles/01-settings/_settings.colors.scss +11 -11
  299. package/src/styles/01-settings/_settings.design-tokens.scss +61 -50
  300. package/src/styles/01-settings/_settings.navbar.scss +1 -1
  301. package/src/styles/01-settings/_settings.spacing.scss +3 -4
  302. package/src/styles/01-settings/_settings.tooltip.scss +1 -1
  303. package/src/styles/01-settings/_settings.typography.scss +4 -4
  304. package/src/styles/02-tools/_tools.button.scss +51 -21
  305. package/src/styles/02-tools/_tools.utility-api.scss +38 -12
  306. package/src/styles/03-generic/_generic.root.scss +4 -3
  307. package/src/styles/06-components/_components.accordion.scss +56 -14
  308. package/src/styles/06-components/_components.atomix-glass.scss +13 -9
  309. package/src/styles/06-components/_components.button.scss +16 -4
  310. package/src/styles/06-components/_components.callout.scss +27 -21
  311. package/src/styles/06-components/_components.card.scss +5 -14
  312. package/src/styles/06-components/_components.chart.scss +22 -19
  313. package/src/styles/06-components/_components.checkbox.scss +25 -17
  314. package/src/styles/06-components/_components.color-mode-toggle.scss +3 -1
  315. package/src/styles/06-components/_components.edge-panel.scss +9 -2
  316. package/src/styles/06-components/_components.footer.scss +1 -1
  317. package/src/styles/06-components/_components.side-menu.scss +5 -5
  318. package/src/styles/06-components/_components.toggle.scss +18 -0
  319. package/src/styles/06-components/_index.scss +1 -1
  320. package/src/styles/06-components/old.chart.styles.scss +0 -2
  321. package/src/styles/99-utilities/_index.scss +2 -0
  322. package/src/styles/99-utilities/_utilities.border.scss +69 -27
  323. package/src/styles/99-utilities/_utilities.display.scss +1 -1
  324. package/src/styles/99-utilities/_utilities.opacity.scss +10 -0
  325. package/src/styles/99-utilities/_utilities.position.scss +16 -9
  326. package/src/styles/99-utilities/_utilities.scss +2 -0
  327. package/src/styles/99-utilities/_utilities.sizes.scss +47 -18
  328. package/src/styles/99-utilities/_utilities.spacing.scss +118 -66
  329. package/src/styles/99-utilities/_utilities.text-gradient.scss +45 -0
  330. package/src/styles/99-utilities/_utilities.text.scss +67 -46
  331. package/themes/dark-complementary/README.md +98 -0
  332. package/themes/dark-complementary/index.scss +158 -0
  333. package/themes/default-light/README.md +81 -0
  334. package/themes/default-light/index.scss +154 -0
  335. package/themes/high-contrast/README.md +105 -0
  336. package/themes/high-contrast/index.scss +172 -0
  337. package/themes/test-theme/README.md +38 -0
  338. package/themes/test-theme/index.scss +47 -0
  339. package/scripts/cli/templates-original-backup.js +0 -1655
  340. package/scripts/cli/templates_backup.js +0 -684
  341. package/src/components/AtomixGlass/stories/AtomixGlass.stories.tsx +0 -1438
  342. package/src/lib/composables/useButton.ts +0 -93
  343. package/src/lib/composables/useCheckbox.ts +0 -70
@@ -0,0 +1,236 @@
1
+ /**
2
+ * @fileoverview Rollup Plugin for Atomix Design System
3
+ * Provides integration of Atomix components and styles into Rollup projects
4
+ */
5
+
6
+ import fs from 'fs';
7
+ import path from 'path';
8
+ import {
9
+ resolveAtomixRoot,
10
+ filterComponents,
11
+ removeAtomImports,
12
+ generateThemeCss,
13
+ applyThemeToCSS,
14
+ getAvailableThemes,
15
+ generateThemeModule,
16
+ createLogger,
17
+ } from './utils.js';
18
+ import { Validator } from './error-handler.js';
19
+
20
+ /**
21
+ * @typedef {Object} AtomixRollupPluginOptions
22
+ * @property {string} [theme='default'] - Theme to use
23
+ * @property {string[]} [components=[]] - Specific components to include
24
+ * @property {boolean} [optimize=true] - Whether to optimize imports
25
+ * @property {boolean} [includeAtoms=false] - Whether to include atoms
26
+ * @property {boolean} [verbose=false] - Enable verbose logging
27
+ */
28
+
29
+ /**
30
+ * Atomix Rollup Plugin
31
+ * @param {AtomixRollupPluginOptions} options - Plugin options
32
+ * @returns {import('rollup').Plugin}
33
+ */
34
+ export default function atomixRollupPlugin(options = {}) {
35
+ const {
36
+ theme = 'default',
37
+ components = [],
38
+ optimize = true,
39
+ includeAtoms = false,
40
+ verbose = false,
41
+ } = options;
42
+
43
+ const log = createLogger('[Atomix Rollup Plugin]', verbose);
44
+ let atomixRoot = null;
45
+
46
+ // Validate options — throws AtomixBuildError on failure
47
+ Validator.validateOptions({ theme, components }, [], []);
48
+
49
+ log.log(`Initializing with theme: ${theme}`);
50
+ if (components.length > 0) {
51
+ log.log(`Selected components: ${components.join(', ')}`);
52
+ }
53
+
54
+ return {
55
+ name: 'atomix',
56
+
57
+ /**
58
+ * Plugin initialization
59
+ */
60
+ buildStart() {
61
+ if (verbose) {
62
+ this.warn(`Starting build with Atomix plugin (theme: ${theme})`);
63
+ }
64
+
65
+ // Resolve Atomix package location
66
+ atomixRoot = resolveAtomixRoot();
67
+ if (atomixRoot) {
68
+ log.log(`Found Atomix at: ${atomixRoot}`);
69
+ } else if (verbose) {
70
+ this.warn('[Atomix Rollup Plugin] Could not resolve Atomix package location');
71
+ }
72
+
73
+ // Validate that requested components exist
74
+ if (components.length > 0 && atomixRoot) {
75
+ validateComponentsExist(components, atomixRoot, this);
76
+ }
77
+
78
+ // Validate theme exists
79
+ if (theme !== 'default' && atomixRoot) {
80
+ const themePath = path.join(atomixRoot, 'themes', theme);
81
+ if (!fs.existsSync(themePath)) {
82
+ const available = getAvailableThemes(atomixRoot);
83
+ this.warn(`[Atomix Rollup Plugin] Theme '${theme}' not found. Available themes: ${available.join(', ') || 'none detected'}`);
84
+ }
85
+ }
86
+ },
87
+
88
+ /**
89
+ * Transform Atomix imports to optimize for production
90
+ */
91
+ transform(code, id) {
92
+ const isAtomixFile =
93
+ id.includes('@shohojdhara/atomix') ||
94
+ (atomixRoot && id.includes(atomixRoot)) ||
95
+ code.includes('@shohojdhara/atomix');
96
+
97
+ if (!isAtomixFile) {
98
+ return null;
99
+ }
100
+
101
+ log.log(`Processing: ${id}`);
102
+
103
+ let transformedCode = code;
104
+
105
+ if (optimize) {
106
+ if (components.length > 0) {
107
+ transformedCode = filterComponents(transformedCode, components, includeAtoms);
108
+ }
109
+
110
+ if (!includeAtoms) {
111
+ transformedCode = removeAtomImports(transformedCode);
112
+ }
113
+ }
114
+
115
+ return {
116
+ code: transformedCode,
117
+ map: null,
118
+ };
119
+ },
120
+
121
+ /**
122
+ * Resolve import paths for Atomix components
123
+ */
124
+ resolveId(importee, _importer) {
125
+ if (!importee.startsWith('@shohojdhara/atomix/')) {
126
+ return null;
127
+ }
128
+
129
+ log.log(`Resolving: ${importee}`);
130
+
131
+ // Handle theme imports
132
+ if (importee === '@shohojdhara/atomix/theme' || importee === '@shohojdhara/atomix/themes') {
133
+ if (atomixRoot) {
134
+ const themePath = path.join(atomixRoot, 'themes', theme, 'index.scss');
135
+ if (fs.existsSync(themePath)) {
136
+ return themePath;
137
+ }
138
+ }
139
+ return importee;
140
+ }
141
+
142
+ // Handle component imports
143
+ if (importee.includes('/components/') && optimize && components.length > 0) {
144
+ log.log(`Component import detected: ${importee}`);
145
+ }
146
+
147
+ return null;
148
+ },
149
+
150
+ /**
151
+ * Load virtual modules
152
+ */
153
+ load(id) {
154
+ if (id.includes('virtual:atomix-theme')) {
155
+ log.log('Loading virtual theme module');
156
+ return generateThemeModule(theme, atomixRoot);
157
+ }
158
+
159
+ if (id.includes('.atomix-theme.css')) {
160
+ try {
161
+ return generateThemeCss(theme, atomixRoot);
162
+ } catch (error) {
163
+ if (verbose) {
164
+ this.warn(`[Atomix Rollup Plugin] Error loading theme CSS: ${error.message}`);
165
+ }
166
+ return `/* Error loading theme: ${theme} */`;
167
+ }
168
+ }
169
+
170
+ return null;
171
+ },
172
+
173
+ /**
174
+ * Generate bundle
175
+ */
176
+ generateBundle(outputOptions, bundle) {
177
+ if (!optimize) return;
178
+
179
+ for (const fileName in bundle) {
180
+ const chunk = bundle[fileName];
181
+
182
+ if (chunk.type === 'asset' && chunk.fileName.endsWith('.css')) {
183
+ if (chunk.fileName.includes('atomix')) {
184
+ try {
185
+ chunk.source = applyThemeToCSS(chunk.source.toString(), theme, atomixRoot);
186
+ log.log(`Applied theme ${theme} to ${fileName}`);
187
+ } catch (error) {
188
+ if (verbose) {
189
+ this.warn(`[Atomix Rollup Plugin] Error applying theme to ${fileName}: ${error.message}`);
190
+ }
191
+ }
192
+ }
193
+ }
194
+ }
195
+ },
196
+ };
197
+ }
198
+
199
+ /**
200
+ * Validate that requested components exist on disk.
201
+ * @param {string[]} components - Requested components.
202
+ * @param {string} atomixRoot - Atomix root path.
203
+ * @param {import('rollup').PluginContext} context - Rollup plugin context.
204
+ */
205
+ function validateComponentsExist(components, atomixRoot, context) {
206
+ const componentsDir = path.join(atomixRoot, 'src', 'components');
207
+
208
+ if (!fs.existsSync(componentsDir)) {
209
+ context.warn('[Atomix Rollup Plugin] Could not find components directory');
210
+ return;
211
+ }
212
+
213
+ try {
214
+ const availableComponents = fs.readdirSync(componentsDir)
215
+ .filter(item => {
216
+ try {
217
+ return fs.statSync(path.join(componentsDir, item)).isDirectory();
218
+ } catch {
219
+ return false;
220
+ }
221
+ });
222
+
223
+ const missingComponents = components.filter(comp => !availableComponents.includes(comp));
224
+
225
+ if (missingComponents.length > 0) {
226
+ const available = availableComponents.slice(0, 10).join(', ');
227
+ const suffix = availableComponents.length > 10 ? '...' : '';
228
+ context.warn(`[Atomix Rollup Plugin] Requested components not found: ${missingComponents.join(', ')}. Available: ${available}${suffix}`);
229
+ }
230
+ } catch {
231
+ context.warn('[Atomix Rollup Plugin] Error validating components');
232
+ }
233
+ }
234
+
235
+ // Re-export helpers for external consumption
236
+ export { resolveAtomixRoot as getAtomixPackageLocation, getAvailableThemes } from './utils.js';
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Type definitions for Atomix Build Tool Integrations
3
+ */
4
+
5
+ // ─── Plugin Option Interfaces ────────────────────────────────────────────────
6
+
7
+ /** Options for the Vite plugin */
8
+ export interface AtomixVitePluginOptions {
9
+ /** Theme to use (default: 'default') */
10
+ theme?: string;
11
+ /** Specific components to include (default: all) */
12
+ components?: string[];
13
+ /** Whether to optimize CSS (default: true) */
14
+ optimizeCss?: boolean;
15
+ /** Whether to include atomic styles (default: false) */
16
+ includeAtoms?: boolean;
17
+ /** Enable verbose logging (default: false) */
18
+ verbose?: boolean;
19
+ }
20
+
21
+ /** Options for the Webpack loader */
22
+ export interface AtomixLoaderOptions {
23
+ /** Whether to include atomic styles (default: false) */
24
+ includeAtoms?: boolean;
25
+ /** Specific components to include (default: all) */
26
+ components?: string[];
27
+ /** Enable verbose logging (default: false) */
28
+ verbose?: boolean;
29
+ /** Theme to use (default: 'default') */
30
+ theme?: string;
31
+ }
32
+
33
+ /** Options for the Rollup plugin */
34
+ export interface AtomixRollupPluginOptions {
35
+ /** Theme to use (default: 'default') */
36
+ theme?: string;
37
+ /** Specific components to include (default: all) */
38
+ components?: string[];
39
+ /** Whether to optimize imports (default: true) */
40
+ optimize?: boolean;
41
+ /** Whether to include atoms (default: false) */
42
+ includeAtoms?: boolean;
43
+ /** Enable verbose logging (default: false) */
44
+ verbose?: boolean;
45
+ }
46
+
47
+ /** Generic options accepted by `getIntegration` / `initAutoIntegration` */
48
+ export interface AtomixBuildToolOptions {
49
+ /** Theme to use */
50
+ theme?: string;
51
+ /** Specific components to include */
52
+ components?: string[];
53
+ /** Whether to optimize */
54
+ optimize?: boolean;
55
+ /** Whether to include atomic styles */
56
+ includeAtoms?: boolean;
57
+ /** Enable verbose logging */
58
+ verbose?: boolean;
59
+ }
60
+
61
+ // ─── Plugin Return Types ─────────────────────────────────────────────────────
62
+
63
+ /** Shape of the object returned by the Vite plugin factory */
64
+ export interface VitePluginResult {
65
+ name: string;
66
+ configResolved?(config: unknown): void;
67
+ transform?(code: string, id: string): Promise<TransformResult | null>;
68
+ configureServer?(server: unknown): void;
69
+ generateBundle?(options: unknown, bundle: Record<string, unknown>): void;
70
+ buildStart?(): void;
71
+ }
72
+
73
+ /** Shape of the object returned by the Rollup plugin factory */
74
+ export interface RollupPluginResult {
75
+ name: string;
76
+ buildStart?(): void;
77
+ transform?(code: string, id: string): TransformResult | null;
78
+ resolveId?(importee: string, importer?: string): string | null;
79
+ load?(id: string): string | null;
80
+ generateBundle?(options: unknown, bundle: Record<string, unknown>): void;
81
+ }
82
+
83
+ // ─── Theme Types ─────────────────────────────────────────────────────────────
84
+
85
+ export interface ThemeConfig {
86
+ /** Theme name */
87
+ name: string;
88
+ /** Theme CSS custom properties */
89
+ variables: Record<string, string>;
90
+ /** Theme CSS content */
91
+ css: string;
92
+ }
93
+
94
+ // ─── Component Types ─────────────────────────────────────────────────────────
95
+
96
+ export interface ComponentInfo {
97
+ /** Component name */
98
+ name: string;
99
+ /** Component path */
100
+ path: string;
101
+ /** Whether component is available */
102
+ available: boolean;
103
+ }
104
+
105
+ // ─── Build Tool Detection ────────────────────────────────────────────────────
106
+
107
+ export type BuildTool = 'vite' | 'webpack' | 'rollup' | null;
108
+
109
+ export interface BuildToolDetectionResult {
110
+ /** Detected build tool */
111
+ tool: BuildTool;
112
+ /** Confidence level (0-1) */
113
+ confidence: number;
114
+ /** Detection method used */
115
+ method: string;
116
+ }
117
+
118
+ // ─── Transform Result ────────────────────────────────────────────────────────
119
+
120
+ export interface TransformResult {
121
+ /** Transformed code */
122
+ code: string;
123
+ /** Source map (null when not generated) */
124
+ map: null | object;
125
+ }
126
+
127
+ // ─── Error Types ─────────────────────────────────────────────────────────────
128
+
129
+ export interface AtomixBuildError extends Error {
130
+ /** Error code */
131
+ code: string;
132
+ /** Additional error details */
133
+ details?: Record<string, unknown>;
134
+ /** Suggested solutions */
135
+ suggestions?: string[];
136
+ }
137
+
138
+ // ─── Utility Types ───────────────────────────────────────────────────────────
139
+
140
+ export interface Logger {
141
+ log(message: string): void;
142
+ warn(message: string): void;
143
+ error(message: string, err?: unknown): void;
144
+ }
145
+
146
+ // ─── Configuration ───────────────────────────────────────────────────────────
147
+
148
+ export interface AtomixConfig {
149
+ /** Theme configuration */
150
+ theme: string;
151
+ /** Optimization settings */
152
+ optimize: boolean;
153
+ /** Include atoms */
154
+ includeAtoms: boolean;
155
+ /** Component list */
156
+ components: string[];
157
+ /** Build tool specific settings */
158
+ buildTools: {
159
+ vite?: Partial<AtomixVitePluginOptions>;
160
+ webpack?: Partial<AtomixLoaderOptions>;
161
+ rollup?: Partial<AtomixRollupPluginOptions>;
162
+ };
163
+ }
@@ -0,0 +1,203 @@
1
+ /**
2
+ * @fileoverview Shared utilities for Atomix build tool integrations
3
+ * Centralizes common functions used across Vite, Rollup, and Webpack plugins.
4
+ * @module @shohojdhara/atomix/build-tools/utils
5
+ */
6
+
7
+ import fs from 'fs';
8
+ import path from 'path';
9
+ import { createRequire } from 'module';
10
+
11
+ const require = createRequire(import.meta.url);
12
+
13
+ // ─── Package Resolution ──────────────────────────────────────────────────────
14
+
15
+ /**
16
+ * Resolve the root directory of the installed Atomix package.
17
+ * Uses createRequire for ESM-safe resolution.
18
+ * @returns {string | null} Absolute path to the Atomix package root, or null.
19
+ */
20
+ export function resolveAtomixRoot() {
21
+ try {
22
+ return path.dirname(require.resolve('@shohojdhara/atomix/package.json'));
23
+ } catch {
24
+ return null;
25
+ }
26
+ }
27
+
28
+ // ─── Theme Helpers ───────────────────────────────────────────────────────────
29
+
30
+ /**
31
+ * Read the raw SCSS content of a theme.
32
+ * @param {string} themeName - Theme directory name.
33
+ * @param {string | null} atomixRoot - Atomix package root (from resolveAtomixRoot).
34
+ * @returns {string} Theme SCSS content.
35
+ * @throws {Error} If atomixRoot is null or the theme file doesn't exist.
36
+ */
37
+ export function generateThemeCss(themeName, atomixRoot) {
38
+ if (!atomixRoot) {
39
+ throw new Error('Atomix package location not found');
40
+ }
41
+
42
+ const themePath = path.join(atomixRoot, 'themes', themeName, 'index.scss');
43
+
44
+ if (!fs.existsSync(themePath)) {
45
+ throw new Error(`Theme '${themeName}' not found at ${themePath}`);
46
+ }
47
+
48
+ return fs.readFileSync(themePath, 'utf-8');
49
+ }
50
+
51
+ /**
52
+ * Prepend theme CSS to an existing stylesheet.
53
+ * Falls back to a comment header if the theme can't be loaded.
54
+ * @param {string} css - Original stylesheet content.
55
+ * @param {string} themeName - Theme directory name.
56
+ * @param {string | null} atomixRoot - Atomix package root.
57
+ * @returns {string} Stylesheet with theme CSS prepended.
58
+ */
59
+ export function applyThemeToCSS(css, themeName, atomixRoot) {
60
+ try {
61
+ const themeCss = generateThemeCss(themeName, atomixRoot);
62
+ return `${themeCss}\n\n${css}`;
63
+ } catch {
64
+ return `/* Theme: ${themeName} - Error loading theme CSS */\n${css}`;
65
+ }
66
+ }
67
+
68
+ /**
69
+ * List all available theme directories.
70
+ * Returns an empty array when the themes directory can't be read — never
71
+ * returns hardcoded fallback values that would mask real errors.
72
+ * @param {string | null} atomixPath - Atomix package root.
73
+ * @returns {string[]} Theme directory names.
74
+ */
75
+ export function getAvailableThemes(atomixPath) {
76
+ if (!atomixPath) {
77
+ return [];
78
+ }
79
+
80
+ try {
81
+ const themesDir = path.join(atomixPath, 'themes');
82
+ if (fs.existsSync(themesDir)) {
83
+ return fs.readdirSync(themesDir)
84
+ .filter(item => {
85
+ try {
86
+ return fs.statSync(path.join(themesDir, item)).isDirectory();
87
+ } catch {
88
+ return false;
89
+ }
90
+ });
91
+ }
92
+ } catch {
93
+ // Intentionally empty — return empty array below.
94
+ }
95
+
96
+ return [];
97
+ }
98
+
99
+ /**
100
+ * Generate a virtual module that exports a theme's CSS as a string.
101
+ * @param {string} themeName - Theme directory name.
102
+ * @param {string | null} atomixRoot - Atomix package root.
103
+ * @returns {string} JavaScript module source code.
104
+ */
105
+ export function generateThemeModule(themeName, atomixRoot) {
106
+ try {
107
+ const themeCss = generateThemeCss(themeName, atomixRoot);
108
+ // Use JSON.stringify to safely embed the CSS string (handles backticks, etc.)
109
+ return `// Generated theme module for "${themeName}"\nconst themeCss = ${JSON.stringify(themeCss)};\nexport default themeCss;\n`;
110
+ } catch {
111
+ return `// Error generating theme module for "${themeName}"\nexport default '/* Error loading theme */';\n`;
112
+ }
113
+ }
114
+
115
+ // ─── Import Transform Helpers ────────────────────────────────────────────────
116
+
117
+ /**
118
+ * Filter Atomix component imports to only keep selected components.
119
+ * Strips import statements that reference unselected components.
120
+ * @param {string} code - Source code.
121
+ * @param {string[]} selectedComponents - Components to keep.
122
+ * @param {boolean} includeAtoms - Whether to also keep Atom-prefixed imports.
123
+ * @returns {string} Transformed source code.
124
+ */
125
+ export function filterComponents(code, selectedComponents, includeAtoms) {
126
+ // Matches both '@shohojdhara/atomix/components' and '@shohojdhara/atomix'
127
+ const componentImportRegex = /import\s+{([^}]+)}\s+from\s+['"]@shohojdhara\/atomix(?:\/components)?['"]/g;
128
+
129
+ return code.replace(componentImportRegex, (match, importList) => {
130
+ const imports = importList.split(',').map(i => i.trim()).filter(Boolean);
131
+ const filteredImports = imports.filter(imp =>
132
+ selectedComponents.includes(imp) ||
133
+ (includeAtoms && imp.startsWith('Atom'))
134
+ );
135
+
136
+ if (filteredImports.length === 0) {
137
+ return '';
138
+ }
139
+
140
+ // Always rewrite to the root import for consistency, or keep as is if we want to be safe.
141
+ // But since /components doesn't exist in exports, we should probably rewrite to root.
142
+ // However, if the user wrote /components, they might have a reason (aliases?).
143
+ // Given the audit finding that /components isn't exported, let's standardize on the root import.
144
+ return `import { ${filteredImports.join(', ')} } from '@shohojdhara/atomix'`;
145
+ });
146
+ }
147
+
148
+ /**
149
+ * Remove import statements that pull from any .../atoms path.
150
+ * @param {string} code - Source code.
151
+ * @returns {string} Source code without atom imports.
152
+ */
153
+ export function removeAtomImports(code) {
154
+ const atomImportRegex = /import\s+{[^}]*}\s+from\s+['"][^'"]*\/atoms['"];?\s*/g;
155
+ return code.replace(atomImportRegex, '');
156
+ }
157
+
158
+ /**
159
+ * Determine whether a file should be processed by an Atomix build tool.
160
+ * Uses strict matching to avoid false positives on user files that happen
161
+ * to contain the word "atomix".
162
+ * @param {string} resourcePath - Absolute path to the file.
163
+ * @param {string} source - File source code.
164
+ * @returns {boolean} true if the file should be processed.
165
+ */
166
+ export function shouldProcessFile(resourcePath, source) {
167
+ // Files that explicitly import Atomix
168
+ if (source.includes('@shohojdhara/atomix')) {
169
+ return true;
170
+ }
171
+
172
+ // Files inside the Atomix node_modules installation
173
+ if (resourcePath.includes('node_modules/@shohojdhara/atomix')) {
174
+ return true;
175
+ }
176
+
177
+ return false;
178
+ }
179
+
180
+ // ─── Logger ──────────────────────────────────────────────────────────────────
181
+
182
+ /**
183
+ * Create a prefixed logger that respects a verbose flag.
184
+ * When verbose is false, only warnings and errors are emitted.
185
+ * @param {string} prefix - Log prefix, e.g. "[Atomix Vite Plugin]".
186
+ * @param {boolean} verbose - Whether to enable informational logging.
187
+ * @returns {{ log: Function, warn: Function, error: Function }}
188
+ */
189
+ export function createLogger(prefix, verbose = false) {
190
+ return {
191
+ log(message) {
192
+ if (verbose) {
193
+ console.log(`${prefix} ${message}`);
194
+ }
195
+ },
196
+ warn(message) {
197
+ console.warn(`${prefix} ${message}`);
198
+ },
199
+ error(message, err) {
200
+ console.error(`${prefix} ${message}`, err || '');
201
+ },
202
+ };
203
+ }