@shohojdhara/atomix 0.3.15 → 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 (245) hide show
  1. package/build-tools/index.d.ts +31 -30
  2. package/build-tools/package.json +4 -21
  3. package/dist/atomix.css +20924 -2611
  4. package/dist/atomix.css.map +1 -1
  5. package/dist/atomix.min.css +76 -2
  6. package/dist/atomix.min.css.map +1 -1
  7. package/dist/build-tools/index.d.ts +31 -30
  8. package/dist/build-tools/package.json +4 -21
  9. package/dist/charts.js.map +1 -1
  10. package/dist/core.js.map +1 -1
  11. package/dist/forms.js.map +1 -1
  12. package/dist/heavy.js.map +1 -1
  13. package/dist/index.d.ts +144 -18
  14. package/dist/index.esm.js +110 -55
  15. package/dist/index.esm.js.map +1 -1
  16. package/dist/index.js +110 -55
  17. package/dist/index.js.map +1 -1
  18. package/dist/index.min.js +1 -1
  19. package/dist/index.min.js.map +1 -1
  20. package/dist/layout.js.map +1 -1
  21. package/dist/theme.d.ts +9 -9
  22. package/dist/theme.js.map +1 -1
  23. package/package.json +1 -1
  24. package/src/components/Accordion/Accordion.stories.tsx +32 -23
  25. package/src/components/Accordion/Accordion.test.tsx +70 -50
  26. package/src/components/Accordion/Accordion.tsx +99 -94
  27. package/src/components/AtomixGlass/AtomixGlass.test.tsx +1 -1
  28. package/src/components/AtomixGlass/GlassFilter.tsx +9 -16
  29. package/src/components/AtomixGlass/glass-utils.ts +4 -3
  30. package/src/components/AtomixGlass/shader-utils.ts +128 -52
  31. package/src/components/AtomixGlass/stories/Playground.stories.tsx +1 -1
  32. package/src/components/AtomixGlass/stories/Shaders.stories.tsx +1 -1
  33. package/src/components/Avatar/Avatar.stories.tsx +45 -62
  34. package/src/components/Avatar/Avatar.tsx +58 -56
  35. package/src/components/Badge/Badge.stories.tsx +20 -9
  36. package/src/components/Badge/Badge.test.tsx +41 -41
  37. package/src/components/Badge/Badge.tsx +64 -62
  38. package/src/components/Block/Block.stories.tsx +14 -4
  39. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +9 -8
  40. package/src/components/Breadcrumb/Breadcrumb.tsx +62 -60
  41. package/src/components/Button/Button.stories.tsx +13 -22
  42. package/src/components/Button/Button.test.tsx +97 -81
  43. package/src/components/Button/Button.tsx +46 -14
  44. package/src/components/Button/ButtonGroup.stories.tsx +37 -32
  45. package/src/components/Button/ButtonGroup.tsx +4 -15
  46. package/src/components/Callout/Callout.stories.tsx +109 -16
  47. package/src/components/Card/Card.stories.tsx +67 -36
  48. package/src/components/Card/Card.tsx +30 -14
  49. package/src/components/Chart/AreaChart.tsx +1 -1
  50. package/src/components/Chart/CandlestickChart.tsx +23 -16
  51. package/src/components/Chart/Chart.stories.tsx +4 -9
  52. package/src/components/Chart/Chart.tsx +40 -44
  53. package/src/components/Chart/ChartRenderer.tsx +39 -12
  54. package/src/components/Chart/ChartToolbar.tsx +21 -5
  55. package/src/components/Chart/DonutChart.tsx +1 -1
  56. package/src/components/Chart/FunnelChart.tsx +4 -1
  57. package/src/components/Chart/GaugeChart.tsx +3 -1
  58. package/src/components/Chart/HeatmapChart.tsx +50 -37
  59. package/src/components/Chart/LineChart.tsx +3 -2
  60. package/src/components/Chart/MultiAxisChart.tsx +24 -16
  61. package/src/components/Chart/RadarChart.tsx +19 -17
  62. package/src/components/Chart/ScatterChart.tsx +29 -21
  63. package/src/components/ColorModeToggle/ColorModeToggle.stories.tsx +6 -2
  64. package/src/components/ColorModeToggle/ColorModeToggle.tsx +15 -3
  65. package/src/components/Countdown/Countdown.stories.tsx +7 -7
  66. package/src/components/DataTable/DataTable.stories.tsx +43 -38
  67. package/src/components/DataTable/DataTable.test.tsx +26 -148
  68. package/src/components/DataTable/DataTable.tsx +485 -456
  69. package/src/components/DatePicker/DatePicker.stories.tsx +32 -47
  70. package/src/components/DatePicker/DatePicker.tsx +31 -26
  71. package/src/components/Dropdown/Dropdown.stories.tsx +2 -5
  72. package/src/components/Dropdown/Dropdown.tsx +313 -299
  73. package/src/components/EdgePanel/EdgePanel.stories.tsx +6 -19
  74. package/src/components/EdgePanel/EdgePanel.tsx +1 -3
  75. package/src/components/Footer/Footer.stories.tsx +21 -16
  76. package/src/components/Footer/Footer.tsx +130 -128
  77. package/src/components/Footer/FooterLink.tsx +2 -2
  78. package/src/components/Form/Checkbox.test.tsx +49 -49
  79. package/src/components/Form/Checkbox.tsx +108 -100
  80. package/src/components/Form/Form.stories.tsx +2 -10
  81. package/src/components/Form/Input.stories.tsx +22 -39
  82. package/src/components/Form/Input.test.tsx +38 -44
  83. package/src/components/Form/Radio.stories.tsx +6 -12
  84. package/src/components/Form/Radio.tsx +68 -66
  85. package/src/components/Form/Select.tsx +184 -182
  86. package/src/components/Form/Textarea.test.tsx +27 -32
  87. package/src/components/Hero/Hero.stories.tsx +56 -23
  88. package/src/components/Hero/Hero.tsx +201 -55
  89. package/src/components/Icon/index.ts +7 -1
  90. package/src/components/List/List.tsx +19 -23
  91. package/src/components/Modal/Modal.stories.tsx +2 -1
  92. package/src/components/Modal/Modal.tsx +130 -127
  93. package/src/components/Navigation/Menu/MegaMenu.tsx +70 -70
  94. package/src/components/Navigation/Nav/NavDropdown.tsx +1 -5
  95. package/src/components/Navigation/SideMenu/SideMenu.stories.tsx +128 -28
  96. package/src/components/Navigation/SideMenu/SideMenu.tsx +5 -7
  97. package/src/components/Navigation/SideMenu/SideMenuItem.tsx +4 -5
  98. package/src/components/Pagination/Pagination.stories.tsx +7 -4
  99. package/src/components/Pagination/Pagination.tsx +199 -202
  100. package/src/components/PhotoViewer/PhotoViewer.tsx +4 -1
  101. package/src/components/Popover/Popover.stories.tsx +99 -192
  102. package/src/components/Popover/Popover.tsx +41 -37
  103. package/src/components/Progress/Progress.stories.tsx +35 -44
  104. package/src/components/River/River.stories.tsx +2 -1
  105. package/src/components/SectionIntro/SectionIntro.stories.tsx +71 -71
  106. package/src/components/Slider/Slider.stories.tsx +12 -4
  107. package/src/components/Spinner/Spinner.stories.tsx +3 -1
  108. package/src/components/Spinner/Spinner.test.tsx +23 -23
  109. package/src/components/Spinner/Spinner.tsx +43 -46
  110. package/src/components/Steps/Steps.stories.tsx +8 -6
  111. package/src/components/Tabs/Tabs.stories.tsx +12 -9
  112. package/src/components/Tabs/Tabs.tsx +74 -72
  113. package/src/components/Toggle/Toggle.stories.tsx +27 -13
  114. package/src/components/Toggle/Toggle.test.tsx +65 -70
  115. package/src/components/Toggle/Toggle.tsx +4 -1
  116. package/src/components/Tooltip/Tooltip.stories.tsx +24 -20
  117. package/src/components/Tooltip/Tooltip.tsx +104 -106
  118. package/src/components/Upload/Upload.stories.tsx +129 -127
  119. package/src/components/Upload/Upload.tsx +287 -283
  120. package/src/components/VideoPlayer/VideoPlayer.tsx +6 -1
  121. package/src/components/index.ts +13 -2
  122. package/src/layouts/Grid/Grid.stories.tsx +9 -3
  123. package/src/layouts/MasonryGrid/MasonryGrid.tsx +5 -1
  124. package/src/lib/__tests__/theme-tools.test.ts +32 -6
  125. package/src/lib/composables/shared-mouse-tracker.ts +13 -14
  126. package/src/lib/composables/useAtomixGlass.ts +106 -49
  127. package/src/lib/composables/useChartExport.ts +1 -1
  128. package/src/lib/composables/useDataTable.ts +29 -17
  129. package/src/lib/composables/useHero.ts +58 -14
  130. package/src/lib/composables/useHeroBackgroundSlider.ts +2 -9
  131. package/src/lib/composables/useInput.ts +10 -8
  132. package/src/lib/composables/useSideMenu.ts +6 -5
  133. package/src/lib/composables/useTooltip.ts +1 -2
  134. package/src/lib/composables/useVideoPlayer.ts +44 -35
  135. package/src/lib/config/index.ts +154 -154
  136. package/src/lib/constants/cssVariables.ts +29 -29
  137. package/src/lib/hooks/__tests__/useComponentCustomization.test.ts +2 -6
  138. package/src/lib/hooks/index.ts +1 -1
  139. package/src/lib/hooks/useComponentCustomization.ts +11 -17
  140. package/src/lib/hooks/usePerformanceMonitor.ts +6 -7
  141. package/src/lib/patterns/__tests__/slots.test.ts +1 -1
  142. package/src/lib/patterns/index.ts +1 -1
  143. package/src/lib/patterns/slots.tsx +8 -13
  144. package/src/lib/storybook/InteractiveDemo.tsx +13 -18
  145. package/src/lib/storybook/PreviewContainer.tsx +1 -1
  146. package/src/lib/storybook/VariantsGrid.tsx +3 -7
  147. package/src/lib/storybook/index.ts +1 -1
  148. package/src/lib/theme/adapters/cssVariableMapper.ts +47 -74
  149. package/src/lib/theme/adapters/index.ts +3 -9
  150. package/src/lib/theme/adapters/themeAdapter.ts +41 -26
  151. package/src/lib/theme/config/index.ts +1 -1
  152. package/src/lib/theme/config/types.ts +2 -2
  153. package/src/lib/theme/config/validator.ts +10 -5
  154. package/src/lib/theme/constants/constants.ts +2 -2
  155. package/src/lib/theme/constants/index.ts +1 -2
  156. package/src/lib/theme/core/__tests__/createTheme.test.ts +20 -22
  157. package/src/lib/theme/core/composeTheme.ts +32 -26
  158. package/src/lib/theme/core/createTheme.ts +1 -1
  159. package/src/lib/theme/core/createThemeObject.ts +308 -301
  160. package/src/lib/theme/core/index.ts +3 -3
  161. package/src/lib/theme/devtools/CLI.ts +106 -104
  162. package/src/lib/theme/devtools/Comparator.tsx +50 -32
  163. package/src/lib/theme/devtools/DesignTokensCustomizer.stories.tsx +50 -48
  164. package/src/lib/theme/devtools/DesignTokensCustomizer.tsx +257 -63
  165. package/src/lib/theme/devtools/Inspector.tsx +75 -60
  166. package/src/lib/theme/devtools/LiveEditor.tsx +97 -76
  167. package/src/lib/theme/devtools/Preview.tsx +150 -106
  168. package/src/lib/theme/devtools/ThemeValidator.ts +29 -21
  169. package/src/lib/theme/devtools/index.ts +3 -9
  170. package/src/lib/theme/devtools/useHistory.ts +23 -21
  171. package/src/lib/theme/errors/errors.ts +12 -11
  172. package/src/lib/theme/errors/index.ts +2 -7
  173. package/src/lib/theme/generators/generateCSS.ts +9 -13
  174. package/src/lib/theme/generators/generateCSSNested.ts +1 -6
  175. package/src/lib/theme/generators/generateCSSVariables.ts +673 -630
  176. package/src/lib/theme/generators/index.ts +1 -4
  177. package/src/lib/theme/i18n/index.ts +1 -1
  178. package/src/lib/theme/i18n/rtl.ts +13 -13
  179. package/src/lib/theme/index.ts +7 -16
  180. package/src/lib/theme/runtime/ThemeApplicator.ts +4 -4
  181. package/src/lib/theme/runtime/ThemeContext.tsx +1 -1
  182. package/src/lib/theme/runtime/ThemeErrorBoundary.tsx +19 -23
  183. package/src/lib/theme/runtime/ThemeProvider.tsx +230 -239
  184. package/src/lib/theme/runtime/__tests__/ThemeProvider.integration.test.tsx +1 -1
  185. package/src/lib/theme/runtime/__tests__/ThemeProvider.test.tsx +24 -29
  186. package/src/lib/theme/runtime/index.ts +2 -5
  187. package/src/lib/theme/runtime/useTheme.ts +18 -18
  188. package/src/lib/theme/runtime/useThemeTokens.ts +22 -22
  189. package/src/lib/theme/test/testTheme.ts +15 -16
  190. package/src/lib/theme/tokens/index.ts +2 -7
  191. package/src/lib/theme/tokens/tokens.ts +25 -24
  192. package/src/lib/theme/types.ts +428 -411
  193. package/src/lib/theme/utils/__tests__/themeValidation.test.ts +3 -3
  194. package/src/lib/theme/utils/componentTheming.ts +18 -18
  195. package/src/lib/theme/utils/domUtils.ts +277 -289
  196. package/src/lib/theme/utils/index.ts +1 -2
  197. package/src/lib/theme/utils/injectCSS.ts +10 -14
  198. package/src/lib/theme/utils/naming.ts +20 -16
  199. package/src/lib/theme/utils/themeHelpers.ts +10 -12
  200. package/src/lib/theme/utils/themeUtils.ts +85 -86
  201. package/src/lib/theme/utils/themeValidation.ts +82 -33
  202. package/src/lib/theme-tools.ts +8 -6
  203. package/src/lib/types/components.ts +172 -71
  204. package/src/lib/types/partProps.ts +1 -1
  205. package/src/lib/utils/__tests__/csv.test.ts +1 -1
  206. package/src/lib/utils/componentUtils.ts +8 -12
  207. package/src/lib/utils/csv.ts +3 -1
  208. package/src/lib/utils/dataTableExport.ts +1 -5
  209. package/src/lib/utils/fontPreloader.ts +10 -19
  210. package/src/lib/utils/icons.ts +4 -1
  211. package/src/lib/utils/index.ts +2 -6
  212. package/src/lib/utils/memoryMonitor.ts +10 -8
  213. package/src/lib/utils/themeNaming.ts +2 -2
  214. package/src/styles/01-settings/_index.scss +0 -1
  215. package/src/styles/01-settings/_settings.colors.scss +8 -8
  216. package/src/styles/01-settings/_settings.design-tokens.scss +61 -50
  217. package/src/styles/01-settings/_settings.navbar.scss +1 -1
  218. package/src/styles/01-settings/_settings.spacing.scss +3 -4
  219. package/src/styles/01-settings/_settings.tooltip.scss +1 -1
  220. package/src/styles/01-settings/_settings.typography.scss +1 -1
  221. package/src/styles/02-tools/_tools.button.scss +51 -21
  222. package/src/styles/02-tools/_tools.utility-api.scss +30 -18
  223. package/src/styles/03-generic/_generic.root.scss +4 -3
  224. package/src/styles/06-components/_components.atomix-glass.scss +13 -9
  225. package/src/styles/06-components/_components.button.scss +16 -4
  226. package/src/styles/06-components/_components.callout.scss +27 -21
  227. package/src/styles/06-components/_components.card.scss +5 -14
  228. package/src/styles/06-components/_components.chart.scss +22 -19
  229. package/src/styles/06-components/_components.checkbox.scss +3 -1
  230. package/src/styles/06-components/_components.color-mode-toggle.scss +3 -1
  231. package/src/styles/06-components/_components.edge-panel.scss +9 -2
  232. package/src/styles/06-components/_components.footer.scss +1 -1
  233. package/src/styles/06-components/_components.side-menu.scss +5 -5
  234. package/src/styles/06-components/_components.toggle.scss +18 -0
  235. package/src/styles/06-components/_index.scss +1 -1
  236. package/src/styles/06-components/old.chart.styles.scss +0 -2
  237. package/src/styles/99-utilities/_utilities.border.scss +69 -27
  238. package/src/styles/99-utilities/_utilities.display.scss +1 -1
  239. package/src/styles/99-utilities/_utilities.opacity.scss +10 -0
  240. package/src/styles/99-utilities/_utilities.position.scss +16 -9
  241. package/src/styles/99-utilities/_utilities.scss +1 -1
  242. package/src/styles/99-utilities/_utilities.sizes.scss +47 -18
  243. package/src/styles/99-utilities/_utilities.spacing.scss +118 -66
  244. package/src/styles/99-utilities/_utilities.text-gradient.scss +30 -30
  245. package/src/styles/99-utilities/_utilities.text.scss +67 -46
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Theme Live Editor Component
3
- *
3
+ *
4
4
  * React component for live editing themes in development
5
5
  * Enhanced with undo/redo, keyboard shortcuts, resizable layout, and better color pickers
6
6
  */
@@ -36,7 +36,7 @@ type ColorFormat = 'hex' | 'rgb' | 'rgba' | 'hsl' | 'hsla';
36
36
  function convertColorFormat(color: string, format: ColorFormat): string {
37
37
  // Remove whitespace
38
38
  color = color.trim();
39
-
39
+
40
40
  // If already in target format, return as is
41
41
  if (format === 'hex' && color.startsWith('#')) return color;
42
42
  if (format === 'rgb' && color.startsWith('rgb(')) return color;
@@ -71,7 +71,7 @@ function convertColorFormat(color: string, format: ColorFormat): string {
71
71
  case 'hsla': {
72
72
  // Convert RGB to HSL (simplified)
73
73
  const hsl = rgbToHsl(r, g, b);
74
- return format === 'hsl'
74
+ return format === 'hsl'
75
75
  ? `hsl(${hsl.h}, ${hsl.s}%, ${hsl.l}%)`
76
76
  : `hsla(${hsl.h}, ${hsl.s}%, ${hsl.l}%, ${a})`;
77
77
  }
@@ -97,11 +97,17 @@ function rgbToHsl(r: number, g: number, b: number): { h: number; s: number; l: n
97
97
  if (max !== min) {
98
98
  const d = max - min;
99
99
  s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
100
-
100
+
101
101
  switch (max) {
102
- case r: h = ((g - b) / d + (g < b ? 6 : 0)) / 6; break;
103
- case g: h = ((b - r) / d + 2) / 6; break;
104
- case b: h = ((r - g) / d + 4) / 6; break;
102
+ case r:
103
+ h = ((g - b) / d + (g < b ? 6 : 0)) / 6;
104
+ break;
105
+ case g:
106
+ h = ((b - r) / d + 2) / 6;
107
+ break;
108
+ case b:
109
+ h = ((r - g) / d + 4) / 6;
110
+ break;
105
111
  }
106
112
  }
107
113
 
@@ -114,7 +120,7 @@ function rgbToHsl(r: number, g: number, b: number): { h: number; s: number; l: n
114
120
 
115
121
  /**
116
122
  * Theme Live Editor Component
117
- *
123
+ *
118
124
  * Allows live editing of theme properties with instant preview
119
125
  */
120
126
  export const ThemeLiveEditor: React.FC<ThemeLiveEditorProps> = ({
@@ -160,47 +166,53 @@ export const ThemeLiveEditor: React.FC<ThemeLiveEditorProps> = ({
160
166
  localStorage.setItem('atomix-editor-layout', resizerPosition.toString());
161
167
  }, [resizerPosition]);
162
168
 
163
- const updateTheme = useCallback((newTheme: Theme, addToHistory = true) => {
164
- if (addToHistory) {
165
- setThemeHistory(newTheme);
166
- } else {
167
- // Direct update without history (for JSON editor typing)
168
- setJsonInput(JSON.stringify(newTheme, null, 2));
169
- }
170
- onChange?.(newTheme);
171
- setError(null);
172
- }, [onChange, setThemeHistory]);
169
+ const updateTheme = useCallback(
170
+ (newTheme: Theme, addToHistory = true) => {
171
+ if (addToHistory) {
172
+ setThemeHistory(newTheme);
173
+ } else {
174
+ // Direct update without history (for JSON editor typing)
175
+ setJsonInput(JSON.stringify(newTheme, null, 2));
176
+ }
177
+ onChange?.(newTheme);
178
+ setError(null);
179
+ },
180
+ [onChange, setThemeHistory]
181
+ );
173
182
 
174
183
  // Sync JSON input with theme history
175
184
  useEffect(() => {
176
185
  setJsonInput(JSON.stringify(theme, null, 2));
177
186
  }, [theme]);
178
187
 
179
- const handleJsonChange = useCallback((value: string) => {
180
- setJsonInput(value);
181
- try {
182
- const parsed = JSON.parse(value);
183
- const newTheme = createThemeObject(parsed);
184
- updateTheme(newTheme, false); // Don't add to history on every keystroke
185
- } catch (err) {
186
- setError(err instanceof Error ? err.message : 'Invalid JSON');
187
- }
188
- }, [updateTheme]);
188
+ const handleJsonChange = useCallback(
189
+ (value: string) => {
190
+ setJsonInput(value);
191
+ try {
192
+ const parsed = JSON.parse(value);
193
+ const newTheme = createThemeObject(parsed);
194
+ updateTheme(newTheme, false); // Don't add to history on every keystroke
195
+ } catch (err) {
196
+ setError(err instanceof Error ? err.message : 'Invalid JSON');
197
+ }
198
+ },
199
+ [updateTheme]
200
+ );
189
201
 
190
202
  // Debounced JSON update to history
191
203
  const jsonUpdateTimeoutRef = useRef<NodeJS.Timeout>();
192
204
  useEffect(() => {
193
205
  if (error) return;
194
-
206
+
195
207
  try {
196
208
  const parsed = JSON.parse(jsonInput);
197
209
  const newTheme = createThemeObject(parsed);
198
-
210
+
199
211
  // Clear existing timeout
200
212
  if (jsonUpdateTimeoutRef.current) {
201
213
  clearTimeout(jsonUpdateTimeoutRef.current);
202
214
  }
203
-
215
+
204
216
  // Add to history after 1 second of no typing
205
217
  jsonUpdateTimeoutRef.current = setTimeout(() => {
206
218
  setThemeHistory(newTheme);
@@ -216,27 +228,30 @@ export const ThemeLiveEditor: React.FC<ThemeLiveEditorProps> = ({
216
228
  };
217
229
  }, [jsonInput, error, setThemeHistory]);
218
230
 
219
- const handleColorChange = useCallback((path: string, value: string | number) => {
220
- const newTheme = { ...theme };
221
- const keys = path.split('.');
222
- let current: any = newTheme;
223
-
224
- for (let i = 0; i < keys.length - 1; i++) {
225
- const key = keys[i];
226
- if (key && !current[key]) {
227
- current[key] = {};
231
+ const handleColorChange = useCallback(
232
+ (path: string, value: string | number) => {
233
+ const newTheme = { ...theme };
234
+ const keys = path.split('.');
235
+ let current: any = newTheme;
236
+
237
+ for (let i = 0; i < keys.length - 1; i++) {
238
+ const key = keys[i];
239
+ if (key && !current[key]) {
240
+ current[key] = {};
241
+ }
242
+ if (key) {
243
+ current = current[key];
244
+ }
228
245
  }
229
- if (key) {
230
- current = current[key];
246
+
247
+ const lastKey = keys[keys.length - 1];
248
+ if (lastKey) {
249
+ current[lastKey] = value;
231
250
  }
232
- }
233
-
234
- const lastKey = keys[keys.length - 1];
235
- if (lastKey) {
236
- current[lastKey] = value;
237
- }
238
- updateTheme(createThemeObject(newTheme));
239
- }, [theme, updateTheme]);
251
+ updateTheme(createThemeObject(newTheme));
252
+ },
253
+ [theme, updateTheme]
254
+ );
240
255
 
241
256
  const exportTheme = useCallback(() => {
242
257
  const dataStr = JSON.stringify(theme, null, 2);
@@ -270,7 +285,7 @@ export const ThemeLiveEditor: React.FC<ThemeLiveEditorProps> = ({
270
285
  exportTheme();
271
286
  } else if (ctrlKey && e.key === '/') {
272
287
  e.preventDefault();
273
- setEditMode(prev => prev === 'visual' ? 'json' : 'visual');
288
+ setEditMode(prev => (prev === 'visual' ? 'json' : 'visual'));
274
289
  } else if (e.key === 'Escape') {
275
290
  setError(null);
276
291
  }
@@ -291,13 +306,13 @@ export const ThemeLiveEditor: React.FC<ThemeLiveEditorProps> = ({
291
306
 
292
307
  const handleMouseMove = (e: MouseEvent) => {
293
308
  if (!editorRef.current || !previewRef.current) return;
294
-
309
+
295
310
  const container = editorRef.current.parentElement;
296
311
  if (!container) return;
297
312
 
298
313
  const containerRect = container.getBoundingClientRect();
299
314
  const newPosition = ((e.clientX - containerRect.left) / containerRect.width) * 100;
300
-
315
+
301
316
  // Constrain between 20% and 80%
302
317
  const constrainedPosition = Math.max(20, Math.min(80, newPosition));
303
318
  setResizerPosition(constrainedPosition);
@@ -316,9 +331,12 @@ export const ThemeLiveEditor: React.FC<ThemeLiveEditorProps> = ({
316
331
  };
317
332
  }, [isResizing]);
318
333
 
319
- const getColorValue = useCallback((color: string): string => {
320
- return convertColorFormat(color, colorFormat);
321
- }, [colorFormat]);
334
+ const getColorValue = useCallback(
335
+ (color: string): string => {
336
+ return convertColorFormat(color, colorFormat);
337
+ },
338
+ [colorFormat]
339
+ );
322
340
 
323
341
  return (
324
342
  <div className={`atomix-theme-live-editor ${className || ''}`} style={style}>
@@ -371,19 +389,16 @@ export const ThemeLiveEditor: React.FC<ThemeLiveEditorProps> = ({
371
389
  </div>
372
390
 
373
391
  <div className="editor-content" ref={editorRef}>
374
- <div
375
- className="editor-panel"
376
- style={{ width: `${resizerPosition}%` }}
377
- >
392
+ <div className="editor-panel" style={{ width: `${resizerPosition}%` }}>
378
393
  {editMode === 'visual' ? (
379
394
  <div className="visual-editor">
380
395
  <div className="editor-section">
381
396
  <h3>Colors</h3>
382
397
  <div className="color-format-selector">
383
398
  <label>Color Format:</label>
384
- <select
385
- value={colorFormat}
386
- onChange={(e) => setColorFormat(e.target.value as ColorFormat)}
399
+ <select
400
+ value={colorFormat}
401
+ onChange={e => setColorFormat(e.target.value as ColorFormat)}
387
402
  >
388
403
  <option value="hex">HEX</option>
389
404
  <option value="rgb">RGB</option>
@@ -392,7 +407,7 @@ export const ThemeLiveEditor: React.FC<ThemeLiveEditorProps> = ({
392
407
  <option value="hsla">HSLA</option>
393
408
  </select>
394
409
  </div>
395
-
410
+
396
411
  {/* Primary Color */}
397
412
  <div className="editor-field">
398
413
  <label>Primary Color</label>
@@ -400,12 +415,12 @@ export const ThemeLiveEditor: React.FC<ThemeLiveEditorProps> = ({
400
415
  <input
401
416
  type="color"
402
417
  value={theme.palette.primary.main}
403
- onChange={(e) => handleColorChange('palette.primary.main', e.target.value)}
418
+ onChange={e => handleColorChange('palette.primary.main', e.target.value)}
404
419
  />
405
420
  <input
406
421
  type="text"
407
422
  value={getColorValue(theme.palette.primary.main)}
408
- onChange={(e) => {
423
+ onChange={e => {
409
424
  const converted = convertColorFormat(e.target.value, 'hex');
410
425
  handleColorChange('palette.primary.main', converted);
411
426
  }}
@@ -421,12 +436,12 @@ export const ThemeLiveEditor: React.FC<ThemeLiveEditorProps> = ({
421
436
  <input
422
437
  type="color"
423
438
  value={theme.palette.secondary.main}
424
- onChange={(e) => handleColorChange('palette.secondary.main', e.target.value)}
439
+ onChange={e => handleColorChange('palette.secondary.main', e.target.value)}
425
440
  />
426
441
  <input
427
442
  type="text"
428
443
  value={getColorValue(theme.palette.secondary.main)}
429
- onChange={(e) => {
444
+ onChange={e => {
430
445
  const converted = convertColorFormat(e.target.value, 'hex');
431
446
  handleColorChange('palette.secondary.main', converted);
432
447
  }}
@@ -443,12 +458,14 @@ export const ThemeLiveEditor: React.FC<ThemeLiveEditorProps> = ({
443
458
  <input
444
459
  type="color"
445
460
  value={theme.palette.background.default}
446
- onChange={(e) => handleColorChange('palette.background.default', e.target.value)}
461
+ onChange={e =>
462
+ handleColorChange('palette.background.default', e.target.value)
463
+ }
447
464
  />
448
465
  <input
449
466
  type="text"
450
467
  value={getColorValue(theme.palette.background.default)}
451
- onChange={(e) => {
468
+ onChange={e => {
452
469
  const converted = convertColorFormat(e.target.value, 'hex');
453
470
  handleColorChange('palette.background.default', converted);
454
471
  }}
@@ -465,7 +482,7 @@ export const ThemeLiveEditor: React.FC<ThemeLiveEditorProps> = ({
465
482
  <input
466
483
  type="text"
467
484
  value={theme.typography.fontFamily}
468
- onChange={(e) => handleColorChange('typography.fontFamily', e.target.value)}
485
+ onChange={e => handleColorChange('typography.fontFamily', e.target.value)}
469
486
  placeholder="Inter, sans-serif"
470
487
  />
471
488
  </div>
@@ -475,7 +492,9 @@ export const ThemeLiveEditor: React.FC<ThemeLiveEditorProps> = ({
475
492
  <input
476
493
  type="number"
477
494
  value={theme.typography.fontSize}
478
- onChange={(e) => handleColorChange('typography.fontSize', parseInt(e.target.value))}
495
+ onChange={e =>
496
+ handleColorChange('typography.fontSize', parseInt(e.target.value))
497
+ }
479
498
  min="10"
480
499
  max="24"
481
500
  />
@@ -486,25 +505,27 @@ export const ThemeLiveEditor: React.FC<ThemeLiveEditorProps> = ({
486
505
  <div className="json-editor">
487
506
  <textarea
488
507
  value={jsonInput}
489
- onChange={(e) => handleJsonChange(e.target.value)}
508
+ onChange={e => handleJsonChange(e.target.value)}
490
509
  spellCheck={false}
491
510
  />
492
511
  {error && (
493
512
  <div className="error-message">
494
513
  ❌ {error}
495
- <button className="error-dismiss" onClick={() => setError(null)}>×</button>
514
+ <button className="error-dismiss" onClick={() => setError(null)}>
515
+ ×
516
+ </button>
496
517
  </div>
497
518
  )}
498
519
  </div>
499
520
  )}
500
521
  </div>
501
522
 
502
- <div
523
+ <div
503
524
  className={`resizer ${isResizing ? 'resizing' : ''}`}
504
525
  onMouseDown={handleResizeStart}
505
526
  />
506
527
 
507
- <div
528
+ <div
508
529
  className="preview-panel"
509
530
  ref={previewRef}
510
531
  style={{ width: `${100 - resizerPosition}%` }}