@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.
- package/build-tools/index.d.ts +31 -30
- package/build-tools/package.json +4 -21
- package/dist/atomix.css +20924 -2611
- package/dist/atomix.css.map +1 -1
- package/dist/atomix.min.css +76 -2
- package/dist/atomix.min.css.map +1 -1
- package/dist/build-tools/index.d.ts +31 -30
- package/dist/build-tools/package.json +4 -21
- package/dist/charts.js.map +1 -1
- package/dist/core.js.map +1 -1
- package/dist/forms.js.map +1 -1
- package/dist/heavy.js.map +1 -1
- package/dist/index.d.ts +144 -18
- package/dist/index.esm.js +110 -55
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +110 -55
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/dist/layout.js.map +1 -1
- package/dist/theme.d.ts +9 -9
- package/dist/theme.js.map +1 -1
- package/package.json +1 -1
- package/src/components/Accordion/Accordion.stories.tsx +32 -23
- package/src/components/Accordion/Accordion.test.tsx +70 -50
- package/src/components/Accordion/Accordion.tsx +99 -94
- package/src/components/AtomixGlass/AtomixGlass.test.tsx +1 -1
- package/src/components/AtomixGlass/GlassFilter.tsx +9 -16
- package/src/components/AtomixGlass/glass-utils.ts +4 -3
- package/src/components/AtomixGlass/shader-utils.ts +128 -52
- package/src/components/AtomixGlass/stories/Playground.stories.tsx +1 -1
- package/src/components/AtomixGlass/stories/Shaders.stories.tsx +1 -1
- package/src/components/Avatar/Avatar.stories.tsx +45 -62
- package/src/components/Avatar/Avatar.tsx +58 -56
- package/src/components/Badge/Badge.stories.tsx +20 -9
- package/src/components/Badge/Badge.test.tsx +41 -41
- package/src/components/Badge/Badge.tsx +64 -62
- package/src/components/Block/Block.stories.tsx +14 -4
- package/src/components/Breadcrumb/Breadcrumb.stories.tsx +9 -8
- package/src/components/Breadcrumb/Breadcrumb.tsx +62 -60
- package/src/components/Button/Button.stories.tsx +13 -22
- package/src/components/Button/Button.test.tsx +97 -81
- package/src/components/Button/Button.tsx +46 -14
- package/src/components/Button/ButtonGroup.stories.tsx +37 -32
- package/src/components/Button/ButtonGroup.tsx +4 -15
- package/src/components/Callout/Callout.stories.tsx +109 -16
- package/src/components/Card/Card.stories.tsx +67 -36
- package/src/components/Card/Card.tsx +30 -14
- package/src/components/Chart/AreaChart.tsx +1 -1
- package/src/components/Chart/CandlestickChart.tsx +23 -16
- package/src/components/Chart/Chart.stories.tsx +4 -9
- package/src/components/Chart/Chart.tsx +40 -44
- package/src/components/Chart/ChartRenderer.tsx +39 -12
- package/src/components/Chart/ChartToolbar.tsx +21 -5
- package/src/components/Chart/DonutChart.tsx +1 -1
- package/src/components/Chart/FunnelChart.tsx +4 -1
- package/src/components/Chart/GaugeChart.tsx +3 -1
- package/src/components/Chart/HeatmapChart.tsx +50 -37
- package/src/components/Chart/LineChart.tsx +3 -2
- package/src/components/Chart/MultiAxisChart.tsx +24 -16
- package/src/components/Chart/RadarChart.tsx +19 -17
- package/src/components/Chart/ScatterChart.tsx +29 -21
- package/src/components/ColorModeToggle/ColorModeToggle.stories.tsx +6 -2
- package/src/components/ColorModeToggle/ColorModeToggle.tsx +15 -3
- package/src/components/Countdown/Countdown.stories.tsx +7 -7
- package/src/components/DataTable/DataTable.stories.tsx +43 -38
- package/src/components/DataTable/DataTable.test.tsx +26 -148
- package/src/components/DataTable/DataTable.tsx +485 -456
- package/src/components/DatePicker/DatePicker.stories.tsx +32 -47
- package/src/components/DatePicker/DatePicker.tsx +31 -26
- package/src/components/Dropdown/Dropdown.stories.tsx +2 -5
- package/src/components/Dropdown/Dropdown.tsx +313 -299
- package/src/components/EdgePanel/EdgePanel.stories.tsx +6 -19
- package/src/components/EdgePanel/EdgePanel.tsx +1 -3
- package/src/components/Footer/Footer.stories.tsx +21 -16
- package/src/components/Footer/Footer.tsx +130 -128
- package/src/components/Footer/FooterLink.tsx +2 -2
- package/src/components/Form/Checkbox.test.tsx +49 -49
- package/src/components/Form/Checkbox.tsx +108 -100
- package/src/components/Form/Form.stories.tsx +2 -10
- package/src/components/Form/Input.stories.tsx +22 -39
- package/src/components/Form/Input.test.tsx +38 -44
- package/src/components/Form/Radio.stories.tsx +6 -12
- package/src/components/Form/Radio.tsx +68 -66
- package/src/components/Form/Select.tsx +184 -182
- package/src/components/Form/Textarea.test.tsx +27 -32
- package/src/components/Hero/Hero.stories.tsx +56 -23
- package/src/components/Hero/Hero.tsx +201 -55
- package/src/components/Icon/index.ts +7 -1
- package/src/components/List/List.tsx +19 -23
- package/src/components/Modal/Modal.stories.tsx +2 -1
- package/src/components/Modal/Modal.tsx +130 -127
- package/src/components/Navigation/Menu/MegaMenu.tsx +70 -70
- package/src/components/Navigation/Nav/NavDropdown.tsx +1 -5
- package/src/components/Navigation/SideMenu/SideMenu.stories.tsx +128 -28
- package/src/components/Navigation/SideMenu/SideMenu.tsx +5 -7
- package/src/components/Navigation/SideMenu/SideMenuItem.tsx +4 -5
- package/src/components/Pagination/Pagination.stories.tsx +7 -4
- package/src/components/Pagination/Pagination.tsx +199 -202
- package/src/components/PhotoViewer/PhotoViewer.tsx +4 -1
- package/src/components/Popover/Popover.stories.tsx +99 -192
- package/src/components/Popover/Popover.tsx +41 -37
- package/src/components/Progress/Progress.stories.tsx +35 -44
- package/src/components/River/River.stories.tsx +2 -1
- package/src/components/SectionIntro/SectionIntro.stories.tsx +71 -71
- package/src/components/Slider/Slider.stories.tsx +12 -4
- package/src/components/Spinner/Spinner.stories.tsx +3 -1
- package/src/components/Spinner/Spinner.test.tsx +23 -23
- package/src/components/Spinner/Spinner.tsx +43 -46
- package/src/components/Steps/Steps.stories.tsx +8 -6
- package/src/components/Tabs/Tabs.stories.tsx +12 -9
- package/src/components/Tabs/Tabs.tsx +74 -72
- package/src/components/Toggle/Toggle.stories.tsx +27 -13
- package/src/components/Toggle/Toggle.test.tsx +65 -70
- package/src/components/Toggle/Toggle.tsx +4 -1
- package/src/components/Tooltip/Tooltip.stories.tsx +24 -20
- package/src/components/Tooltip/Tooltip.tsx +104 -106
- package/src/components/Upload/Upload.stories.tsx +129 -127
- package/src/components/Upload/Upload.tsx +287 -283
- package/src/components/VideoPlayer/VideoPlayer.tsx +6 -1
- package/src/components/index.ts +13 -2
- package/src/layouts/Grid/Grid.stories.tsx +9 -3
- package/src/layouts/MasonryGrid/MasonryGrid.tsx +5 -1
- package/src/lib/__tests__/theme-tools.test.ts +32 -6
- package/src/lib/composables/shared-mouse-tracker.ts +13 -14
- package/src/lib/composables/useAtomixGlass.ts +106 -49
- package/src/lib/composables/useChartExport.ts +1 -1
- package/src/lib/composables/useDataTable.ts +29 -17
- package/src/lib/composables/useHero.ts +58 -14
- package/src/lib/composables/useHeroBackgroundSlider.ts +2 -9
- package/src/lib/composables/useInput.ts +10 -8
- package/src/lib/composables/useSideMenu.ts +6 -5
- package/src/lib/composables/useTooltip.ts +1 -2
- package/src/lib/composables/useVideoPlayer.ts +44 -35
- package/src/lib/config/index.ts +154 -154
- package/src/lib/constants/cssVariables.ts +29 -29
- package/src/lib/hooks/__tests__/useComponentCustomization.test.ts +2 -6
- package/src/lib/hooks/index.ts +1 -1
- package/src/lib/hooks/useComponentCustomization.ts +11 -17
- package/src/lib/hooks/usePerformanceMonitor.ts +6 -7
- package/src/lib/patterns/__tests__/slots.test.ts +1 -1
- package/src/lib/patterns/index.ts +1 -1
- package/src/lib/patterns/slots.tsx +8 -13
- package/src/lib/storybook/InteractiveDemo.tsx +13 -18
- package/src/lib/storybook/PreviewContainer.tsx +1 -1
- package/src/lib/storybook/VariantsGrid.tsx +3 -7
- package/src/lib/storybook/index.ts +1 -1
- package/src/lib/theme/adapters/cssVariableMapper.ts +47 -74
- package/src/lib/theme/adapters/index.ts +3 -9
- package/src/lib/theme/adapters/themeAdapter.ts +41 -26
- package/src/lib/theme/config/index.ts +1 -1
- package/src/lib/theme/config/types.ts +2 -2
- package/src/lib/theme/config/validator.ts +10 -5
- package/src/lib/theme/constants/constants.ts +2 -2
- package/src/lib/theme/constants/index.ts +1 -2
- package/src/lib/theme/core/__tests__/createTheme.test.ts +20 -22
- package/src/lib/theme/core/composeTheme.ts +32 -26
- package/src/lib/theme/core/createTheme.ts +1 -1
- package/src/lib/theme/core/createThemeObject.ts +308 -301
- package/src/lib/theme/core/index.ts +3 -3
- package/src/lib/theme/devtools/CLI.ts +106 -104
- package/src/lib/theme/devtools/Comparator.tsx +50 -32
- package/src/lib/theme/devtools/DesignTokensCustomizer.stories.tsx +50 -48
- package/src/lib/theme/devtools/DesignTokensCustomizer.tsx +257 -63
- package/src/lib/theme/devtools/Inspector.tsx +75 -60
- package/src/lib/theme/devtools/LiveEditor.tsx +97 -76
- package/src/lib/theme/devtools/Preview.tsx +150 -106
- package/src/lib/theme/devtools/ThemeValidator.ts +29 -21
- package/src/lib/theme/devtools/index.ts +3 -9
- package/src/lib/theme/devtools/useHistory.ts +23 -21
- package/src/lib/theme/errors/errors.ts +12 -11
- package/src/lib/theme/errors/index.ts +2 -7
- package/src/lib/theme/generators/generateCSS.ts +9 -13
- package/src/lib/theme/generators/generateCSSNested.ts +1 -6
- package/src/lib/theme/generators/generateCSSVariables.ts +673 -630
- package/src/lib/theme/generators/index.ts +1 -4
- package/src/lib/theme/i18n/index.ts +1 -1
- package/src/lib/theme/i18n/rtl.ts +13 -13
- package/src/lib/theme/index.ts +7 -16
- package/src/lib/theme/runtime/ThemeApplicator.ts +4 -4
- package/src/lib/theme/runtime/ThemeContext.tsx +1 -1
- package/src/lib/theme/runtime/ThemeErrorBoundary.tsx +19 -23
- package/src/lib/theme/runtime/ThemeProvider.tsx +230 -239
- package/src/lib/theme/runtime/__tests__/ThemeProvider.integration.test.tsx +1 -1
- package/src/lib/theme/runtime/__tests__/ThemeProvider.test.tsx +24 -29
- package/src/lib/theme/runtime/index.ts +2 -5
- package/src/lib/theme/runtime/useTheme.ts +18 -18
- package/src/lib/theme/runtime/useThemeTokens.ts +22 -22
- package/src/lib/theme/test/testTheme.ts +15 -16
- package/src/lib/theme/tokens/index.ts +2 -7
- package/src/lib/theme/tokens/tokens.ts +25 -24
- package/src/lib/theme/types.ts +428 -411
- package/src/lib/theme/utils/__tests__/themeValidation.test.ts +3 -3
- package/src/lib/theme/utils/componentTheming.ts +18 -18
- package/src/lib/theme/utils/domUtils.ts +277 -289
- package/src/lib/theme/utils/index.ts +1 -2
- package/src/lib/theme/utils/injectCSS.ts +10 -14
- package/src/lib/theme/utils/naming.ts +20 -16
- package/src/lib/theme/utils/themeHelpers.ts +10 -12
- package/src/lib/theme/utils/themeUtils.ts +85 -86
- package/src/lib/theme/utils/themeValidation.ts +82 -33
- package/src/lib/theme-tools.ts +8 -6
- package/src/lib/types/components.ts +172 -71
- package/src/lib/types/partProps.ts +1 -1
- package/src/lib/utils/__tests__/csv.test.ts +1 -1
- package/src/lib/utils/componentUtils.ts +8 -12
- package/src/lib/utils/csv.ts +3 -1
- package/src/lib/utils/dataTableExport.ts +1 -5
- package/src/lib/utils/fontPreloader.ts +10 -19
- package/src/lib/utils/icons.ts +4 -1
- package/src/lib/utils/index.ts +2 -6
- package/src/lib/utils/memoryMonitor.ts +10 -8
- package/src/lib/utils/themeNaming.ts +2 -2
- package/src/styles/01-settings/_index.scss +0 -1
- package/src/styles/01-settings/_settings.colors.scss +8 -8
- package/src/styles/01-settings/_settings.design-tokens.scss +61 -50
- package/src/styles/01-settings/_settings.navbar.scss +1 -1
- package/src/styles/01-settings/_settings.spacing.scss +3 -4
- package/src/styles/01-settings/_settings.tooltip.scss +1 -1
- package/src/styles/01-settings/_settings.typography.scss +1 -1
- package/src/styles/02-tools/_tools.button.scss +51 -21
- package/src/styles/02-tools/_tools.utility-api.scss +30 -18
- package/src/styles/03-generic/_generic.root.scss +4 -3
- package/src/styles/06-components/_components.atomix-glass.scss +13 -9
- package/src/styles/06-components/_components.button.scss +16 -4
- package/src/styles/06-components/_components.callout.scss +27 -21
- package/src/styles/06-components/_components.card.scss +5 -14
- package/src/styles/06-components/_components.chart.scss +22 -19
- package/src/styles/06-components/_components.checkbox.scss +3 -1
- package/src/styles/06-components/_components.color-mode-toggle.scss +3 -1
- package/src/styles/06-components/_components.edge-panel.scss +9 -2
- package/src/styles/06-components/_components.footer.scss +1 -1
- package/src/styles/06-components/_components.side-menu.scss +5 -5
- package/src/styles/06-components/_components.toggle.scss +18 -0
- package/src/styles/06-components/_index.scss +1 -1
- package/src/styles/06-components/old.chart.styles.scss +0 -2
- package/src/styles/99-utilities/_utilities.border.scss +69 -27
- package/src/styles/99-utilities/_utilities.display.scss +1 -1
- package/src/styles/99-utilities/_utilities.opacity.scss +10 -0
- package/src/styles/99-utilities/_utilities.position.scss +16 -9
- package/src/styles/99-utilities/_utilities.scss +1 -1
- package/src/styles/99-utilities/_utilities.sizes.scss +47 -18
- package/src/styles/99-utilities/_utilities.spacing.scss +118 -66
- package/src/styles/99-utilities/_utilities.text-gradient.scss +30 -30
- package/src/styles/99-utilities/_utilities.text.scss +67 -46
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Theme Inspector Component
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
4
|
* React component for inspecting and debugging themes
|
|
5
5
|
* Enhanced with search/filter and copy path functionality
|
|
6
6
|
*/
|
|
@@ -39,7 +39,7 @@ interface PropertyPath {
|
|
|
39
39
|
|
|
40
40
|
/**
|
|
41
41
|
* Theme Inspector Component
|
|
42
|
-
*
|
|
42
|
+
*
|
|
43
43
|
* Provides detailed inspection and debugging information for themes
|
|
44
44
|
*/
|
|
45
45
|
export const ThemeInspector: React.FC<ThemeInspectorProps> = ({
|
|
@@ -50,7 +50,9 @@ export const ThemeInspector: React.FC<ThemeInspectorProps> = ({
|
|
|
50
50
|
className,
|
|
51
51
|
style,
|
|
52
52
|
}) => {
|
|
53
|
-
const [activeTab, setActiveTab] = useState<'overview' | 'validation' | 'css' | 'structure'>(
|
|
53
|
+
const [activeTab, setActiveTab] = useState<'overview' | 'validation' | 'css' | 'structure'>(
|
|
54
|
+
'overview'
|
|
55
|
+
);
|
|
54
56
|
const [expandedSections, setExpandedSections] = useState<Set<string>>(new Set(['palette']));
|
|
55
57
|
const [searchQuery, setSearchQuery] = useState<string>('');
|
|
56
58
|
const [debouncedSearchQuery, setDebouncedSearchQuery] = useState<string>('');
|
|
@@ -84,7 +86,9 @@ export const ThemeInspector: React.FC<ThemeInspectorProps> = ({
|
|
|
84
86
|
console.error('Theme validation error:', error);
|
|
85
87
|
return {
|
|
86
88
|
valid: false,
|
|
87
|
-
errors: [
|
|
89
|
+
errors: [
|
|
90
|
+
'Failed to validate theme: ' + (error instanceof Error ? error.message : String(error)),
|
|
91
|
+
],
|
|
88
92
|
warnings: [],
|
|
89
93
|
a11yIssues: [],
|
|
90
94
|
};
|
|
@@ -108,10 +112,10 @@ export const ThemeInspector: React.FC<ThemeInspectorProps> = ({
|
|
|
108
112
|
// Generate all property paths for search
|
|
109
113
|
const allPropertyPaths = useMemo(() => {
|
|
110
114
|
const paths: PropertyPath[] = [];
|
|
111
|
-
|
|
115
|
+
|
|
112
116
|
const traverse = (obj: any, path: string = '', depth: number = 0): void => {
|
|
113
117
|
if (depth > 10) return; // Prevent infinite recursion
|
|
114
|
-
|
|
118
|
+
|
|
115
119
|
if (obj === null || obj === undefined) {
|
|
116
120
|
paths.push({ path, value: obj, matches: false });
|
|
117
121
|
return;
|
|
@@ -120,22 +124,23 @@ export const ThemeInspector: React.FC<ThemeInspectorProps> = ({
|
|
|
120
124
|
if (typeof obj === 'object' && !Array.isArray(obj)) {
|
|
121
125
|
Object.entries(obj).forEach(([key, value]) => {
|
|
122
126
|
if (key === '__isJSTheme') return;
|
|
123
|
-
|
|
127
|
+
|
|
124
128
|
const currentPath = path ? `${path}.${key}` : key;
|
|
125
129
|
const pathLower = currentPath.toLowerCase();
|
|
126
130
|
const queryLower = debouncedSearchQuery.toLowerCase();
|
|
127
131
|
const matches = debouncedSearchQuery ? pathLower.includes(queryLower) : true;
|
|
128
|
-
|
|
132
|
+
|
|
129
133
|
if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
|
|
130
134
|
paths.push({ path: currentPath, value: null, matches });
|
|
131
135
|
traverse(value, currentPath, depth + 1);
|
|
132
136
|
} else {
|
|
133
|
-
const valueStr =
|
|
137
|
+
const valueStr =
|
|
138
|
+
typeof value === 'string' ? value.toLowerCase() : String(value).toLowerCase();
|
|
134
139
|
const valueMatches = debouncedSearchQuery ? valueStr.includes(queryLower) : true;
|
|
135
|
-
paths.push({
|
|
136
|
-
path: currentPath,
|
|
137
|
-
value,
|
|
138
|
-
matches: matches || valueMatches
|
|
140
|
+
paths.push({
|
|
141
|
+
path: currentPath,
|
|
142
|
+
value,
|
|
143
|
+
matches: matches || valueMatches,
|
|
139
144
|
});
|
|
140
145
|
}
|
|
141
146
|
});
|
|
@@ -187,11 +192,13 @@ export const ThemeInspector: React.FC<ThemeInspectorProps> = ({
|
|
|
187
192
|
|
|
188
193
|
const highlightText = (text: string, query: string): React.ReactNode => {
|
|
189
194
|
if (!query) return text;
|
|
190
|
-
|
|
195
|
+
|
|
191
196
|
const parts = text.split(new RegExp(`(${query})`, 'gi'));
|
|
192
|
-
return parts.map((part, index) =>
|
|
197
|
+
return parts.map((part, index) =>
|
|
193
198
|
part.toLowerCase() === query.toLowerCase() ? (
|
|
194
|
-
<mark key={index} className="search-highlight">
|
|
199
|
+
<mark key={index} className="search-highlight">
|
|
200
|
+
{part}
|
|
201
|
+
</mark>
|
|
195
202
|
) : (
|
|
196
203
|
part
|
|
197
204
|
)
|
|
@@ -204,7 +211,11 @@ export const ThemeInspector: React.FC<ThemeInspectorProps> = ({
|
|
|
204
211
|
}
|
|
205
212
|
|
|
206
213
|
if (typeof value === 'string') {
|
|
207
|
-
return
|
|
214
|
+
return (
|
|
215
|
+
<span className="value-string">
|
|
216
|
+
"{highlightText(value, debouncedSearchQuery)}"
|
|
217
|
+
</span>
|
|
218
|
+
);
|
|
208
219
|
}
|
|
209
220
|
|
|
210
221
|
if (typeof value === 'number') {
|
|
@@ -222,12 +233,14 @@ export const ThemeInspector: React.FC<ThemeInspectorProps> = ({
|
|
|
222
233
|
if (Array.isArray(value)) {
|
|
223
234
|
return (
|
|
224
235
|
<div className="value-array">
|
|
225
|
-
[
|
|
236
|
+
[
|
|
237
|
+
{value.map((item, index) => (
|
|
226
238
|
<div key={index} className="array-item">
|
|
227
239
|
{renderValue(item, depth + 1, `${path}[${index}]`)}
|
|
228
240
|
{index < value.length - 1 && ','}
|
|
229
241
|
</div>
|
|
230
|
-
))}
|
|
242
|
+
))}
|
|
243
|
+
]
|
|
231
244
|
</div>
|
|
232
245
|
);
|
|
233
246
|
}
|
|
@@ -240,7 +253,7 @@ export const ThemeInspector: React.FC<ThemeInspectorProps> = ({
|
|
|
240
253
|
const currentPath = path ? `${path}.${key}` : key;
|
|
241
254
|
return (
|
|
242
255
|
<div key={key} className="object-property">
|
|
243
|
-
<span
|
|
256
|
+
<span
|
|
244
257
|
className="property-key clickable"
|
|
245
258
|
onClick={() => copyPath(currentPath)}
|
|
246
259
|
title={`Click to copy: ${currentPath}`}
|
|
@@ -248,9 +261,7 @@ export const ThemeInspector: React.FC<ThemeInspectorProps> = ({
|
|
|
248
261
|
{highlightText(key, debouncedSearchQuery)}:
|
|
249
262
|
</span>{' '}
|
|
250
263
|
{renderValue(val, depth + 1, currentPath)}
|
|
251
|
-
{copiedPath === currentPath &&
|
|
252
|
-
<span className="copy-feedback">✓ Copied!</span>
|
|
253
|
-
)}
|
|
264
|
+
{copiedPath === currentPath && <span className="copy-feedback">✓ Copied!</span>}
|
|
254
265
|
</div>
|
|
255
266
|
);
|
|
256
267
|
})}
|
|
@@ -269,47 +280,61 @@ export const ThemeInspector: React.FC<ThemeInspectorProps> = ({
|
|
|
269
280
|
<table>
|
|
270
281
|
<tbody>
|
|
271
282
|
<tr>
|
|
272
|
-
<td
|
|
283
|
+
<td>
|
|
284
|
+
<strong>Name:</strong>
|
|
285
|
+
</td>
|
|
273
286
|
<td>{theme.name}</td>
|
|
274
287
|
</tr>
|
|
275
288
|
{theme.description && (
|
|
276
289
|
<tr>
|
|
277
|
-
<td
|
|
290
|
+
<td>
|
|
291
|
+
<strong>Description:</strong>
|
|
292
|
+
</td>
|
|
278
293
|
<td>{theme.description}</td>
|
|
279
294
|
</tr>
|
|
280
295
|
)}
|
|
281
296
|
{theme.author && (
|
|
282
297
|
<tr>
|
|
283
|
-
<td
|
|
298
|
+
<td>
|
|
299
|
+
<strong>Author:</strong>
|
|
300
|
+
</td>
|
|
284
301
|
<td>{theme.author}</td>
|
|
285
302
|
</tr>
|
|
286
303
|
)}
|
|
287
304
|
{theme.version && (
|
|
288
305
|
<tr>
|
|
289
|
-
<td
|
|
306
|
+
<td>
|
|
307
|
+
<strong>Version:</strong>
|
|
308
|
+
</td>
|
|
290
309
|
<td>{theme.version}</td>
|
|
291
310
|
</tr>
|
|
292
311
|
)}
|
|
293
312
|
{theme.status && (
|
|
294
313
|
<tr>
|
|
295
|
-
<td><strong>Status:</strong></td>
|
|
296
314
|
<td>
|
|
297
|
-
<
|
|
298
|
-
|
|
299
|
-
|
|
315
|
+
<strong>Status:</strong>
|
|
316
|
+
</td>
|
|
317
|
+
<td>
|
|
318
|
+
<span className={`status-badge status-${theme.status}`}>{theme.status}</span>
|
|
300
319
|
</td>
|
|
301
320
|
</tr>
|
|
302
321
|
)}
|
|
303
322
|
<tr>
|
|
304
|
-
<td
|
|
323
|
+
<td>
|
|
324
|
+
<strong>Dark Mode:</strong>
|
|
325
|
+
</td>
|
|
305
326
|
<td>{theme.supportsDarkMode ? 'Yes' : 'No'}</td>
|
|
306
327
|
</tr>
|
|
307
328
|
{theme.tags && theme.tags.length > 0 && (
|
|
308
329
|
<tr>
|
|
309
|
-
<td
|
|
330
|
+
<td>
|
|
331
|
+
<strong>Tags:</strong>
|
|
332
|
+
</td>
|
|
310
333
|
<td>
|
|
311
334
|
{theme.tags.map(tag => (
|
|
312
|
-
<span key={tag} className="tag">
|
|
335
|
+
<span key={tag} className="tag">
|
|
336
|
+
{tag}
|
|
337
|
+
</span>
|
|
313
338
|
))}
|
|
314
339
|
</td>
|
|
315
340
|
</tr>
|
|
@@ -395,7 +420,7 @@ export const ThemeInspector: React.FC<ThemeInspectorProps> = ({
|
|
|
395
420
|
<div className="inspector-css">
|
|
396
421
|
<div className="css-header">
|
|
397
422
|
<h3>Generated CSS Variables</h3>
|
|
398
|
-
<button
|
|
423
|
+
<button
|
|
399
424
|
onClick={() => navigator.clipboard?.writeText(cssVariables)}
|
|
400
425
|
className="copy-button"
|
|
401
426
|
>
|
|
@@ -422,7 +447,7 @@ export const ThemeInspector: React.FC<ThemeInspectorProps> = ({
|
|
|
422
447
|
type="text"
|
|
423
448
|
placeholder="Search properties..."
|
|
424
449
|
value={searchQuery}
|
|
425
|
-
onChange={
|
|
450
|
+
onChange={e => setSearchQuery(e.target.value)}
|
|
426
451
|
className="search-input"
|
|
427
452
|
/>
|
|
428
453
|
{searchQuery && (
|
|
@@ -451,9 +476,10 @@ export const ThemeInspector: React.FC<ThemeInspectorProps> = ({
|
|
|
451
476
|
<div className="structure-tree">
|
|
452
477
|
{Object.entries(theme).map(([key, value]) => {
|
|
453
478
|
if (key === '__isJSTheme') return null;
|
|
454
|
-
|
|
479
|
+
|
|
455
480
|
const isExpanded = expandedSections.has(key);
|
|
456
|
-
const hasChildren =
|
|
481
|
+
const hasChildren =
|
|
482
|
+
typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
457
483
|
const pathMatches = debouncedSearchQuery
|
|
458
484
|
? allPropertyPaths.some(p => p.path.startsWith(key) && p.matches)
|
|
459
485
|
: true;
|
|
@@ -462,18 +488,13 @@ export const ThemeInspector: React.FC<ThemeInspectorProps> = ({
|
|
|
462
488
|
|
|
463
489
|
return (
|
|
464
490
|
<div key={key} className="structure-node">
|
|
465
|
-
<div
|
|
466
|
-
className="structure-header"
|
|
467
|
-
onClick={() => hasChildren && toggleSection(key)}
|
|
468
|
-
>
|
|
491
|
+
<div className="structure-header" onClick={() => hasChildren && toggleSection(key)}>
|
|
469
492
|
{hasChildren && (
|
|
470
|
-
<span className={`expand-icon ${isExpanded ? 'expanded' : ''}`}>
|
|
471
|
-
▶
|
|
472
|
-
</span>
|
|
493
|
+
<span className={`expand-icon ${isExpanded ? 'expanded' : ''}`}>▶</span>
|
|
473
494
|
)}
|
|
474
|
-
<span
|
|
495
|
+
<span
|
|
475
496
|
className="property-name clickable"
|
|
476
|
-
onClick={
|
|
497
|
+
onClick={e => {
|
|
477
498
|
e.stopPropagation();
|
|
478
499
|
copyPath(key);
|
|
479
500
|
}}
|
|
@@ -481,22 +502,16 @@ export const ThemeInspector: React.FC<ThemeInspectorProps> = ({
|
|
|
481
502
|
>
|
|
482
503
|
{highlightText(key, debouncedSearchQuery)}
|
|
483
504
|
</span>
|
|
484
|
-
{copiedPath === key &&
|
|
485
|
-
<span className="copy-feedback">✓ Copied!</span>
|
|
486
|
-
)}
|
|
505
|
+
{copiedPath === key && <span className="copy-feedback">✓ Copied!</span>}
|
|
487
506
|
<span className="property-type">
|
|
488
507
|
{Array.isArray(value) ? 'array' : typeof value}
|
|
489
508
|
</span>
|
|
490
509
|
</div>
|
|
491
510
|
{hasChildren && isExpanded && (
|
|
492
|
-
<div className="structure-children">
|
|
493
|
-
{renderValue(value, 0, key)}
|
|
494
|
-
</div>
|
|
511
|
+
<div className="structure-children">{renderValue(value, 0, key)}</div>
|
|
495
512
|
)}
|
|
496
513
|
{!hasChildren && (
|
|
497
|
-
<div className="structure-value">
|
|
498
|
-
{renderValue(value, 0, key)}
|
|
499
|
-
</div>
|
|
514
|
+
<div className="structure-value">{renderValue(value, 0, key)}</div>
|
|
500
515
|
)}
|
|
501
516
|
</div>
|
|
502
517
|
);
|
|
@@ -510,14 +525,14 @@ export const ThemeInspector: React.FC<ThemeInspectorProps> = ({
|
|
|
510
525
|
<div className={`atomix-theme-inspector ${className || ''}`} style={style}>
|
|
511
526
|
{/* Tab Navigation */}
|
|
512
527
|
<div className="inspector-tabs">
|
|
513
|
-
<button
|
|
528
|
+
<button
|
|
514
529
|
className={`tab ${activeTab === 'overview' ? 'active' : ''}`}
|
|
515
530
|
onClick={() => setActiveTab('overview')}
|
|
516
531
|
>
|
|
517
532
|
Overview
|
|
518
533
|
</button>
|
|
519
534
|
{showValidation && (
|
|
520
|
-
<button
|
|
535
|
+
<button
|
|
521
536
|
className={`tab ${activeTab === 'validation' ? 'active' : ''}`}
|
|
522
537
|
onClick={() => setActiveTab('validation')}
|
|
523
538
|
>
|
|
@@ -528,7 +543,7 @@ export const ThemeInspector: React.FC<ThemeInspectorProps> = ({
|
|
|
528
543
|
</button>
|
|
529
544
|
)}
|
|
530
545
|
{showCSSVariables && (
|
|
531
|
-
<button
|
|
546
|
+
<button
|
|
532
547
|
className={`tab ${activeTab === 'css' ? 'active' : ''}`}
|
|
533
548
|
onClick={() => setActiveTab('css')}
|
|
534
549
|
>
|
|
@@ -536,7 +551,7 @@ export const ThemeInspector: React.FC<ThemeInspectorProps> = ({
|
|
|
536
551
|
</button>
|
|
537
552
|
)}
|
|
538
553
|
{showStructure && (
|
|
539
|
-
<button
|
|
554
|
+
<button
|
|
540
555
|
className={`tab ${activeTab === 'structure' ? 'active' : ''}`}
|
|
541
556
|
onClick={() => setActiveTab('structure')}
|
|
542
557
|
>
|