storybook-addon-design-system-docs 1.0.1 → 1.0.2
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/README.md +143 -15
- package/dist/components/assets/index.cjs +2 -2
- package/dist/components/assets/index.cjs.map +1 -1
- package/dist/components/assets/index.js +2 -2
- package/dist/components/assets/index.js.map +1 -1
- package/dist/components/primitives/index.cjs +2 -2
- package/dist/components/primitives/index.cjs.map +1 -1
- package/dist/components/primitives/index.js +2 -2
- package/dist/components/primitives/index.js.map +1 -1
- package/dist/index.cjs +29 -23
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +29 -23
- package/dist/index.js.map +1 -1
- package/dist/preset.cjs +215 -81
- package/dist/preset.cjs.map +1 -1
- package/dist/preset.js +215 -81
- package/dist/preset.js.map +1 -1
- package/package.json +141 -141
- package/templates/spacing.mdx +1 -1
package/README.md
CHANGED
|
@@ -64,35 +64,163 @@ export default config;
|
|
|
64
64
|
|
|
65
65
|
### Options
|
|
66
66
|
|
|
67
|
-
| Option | Type
|
|
68
|
-
| ---------------- |
|
|
69
|
-
| `tailwindConfig` | `string`
|
|
70
|
-
| `sidebarGroup` | `string`
|
|
71
|
-
| `
|
|
72
|
-
| `
|
|
67
|
+
| Option | Type | Required | Default | Description |
|
|
68
|
+
| ---------------- | --------------- | -------- | ------------------ | ------------------------------------------------ |
|
|
69
|
+
| `tailwindConfig` | `string` | **Yes** | - | Path to `tailwind.config.js` |
|
|
70
|
+
| `sidebarGroup` | `string` | No | `'Design System/'` | Global sidebar group prefix for all docs |
|
|
71
|
+
| `sections` | `Section[]` | No | Default sections | Customize which theme sections to display |
|
|
72
|
+
| `assets` | `AssetGroup[]` | No | `[]` | Asset groups to generate galleries for |
|
|
73
|
+
| `showOnlyCustom` | `boolean` | No | `false` | If true, only shows custom Tailwind values |
|
|
74
|
+
| `templates` | `TemplateConfig`| No | Built-in templates | Override default MDX templates |
|
|
75
|
+
|
|
76
|
+
### Sidebar Organization
|
|
77
|
+
|
|
78
|
+
The addon provides flexible control over where documentation pages appear in Storybook's sidebar through the `sidebarGroup` option and individual `path` properties.
|
|
79
|
+
|
|
80
|
+
#### Understanding `sidebarGroup` and `path`
|
|
81
|
+
|
|
82
|
+
- **`sidebarGroup`**: A global prefix applied to all generated documentation (both sections and assets)
|
|
83
|
+
- **`path`**: An optional per-section or per-asset path that controls placement relative to the `sidebarGroup`
|
|
84
|
+
|
|
85
|
+
#### Path Resolution Rules
|
|
86
|
+
|
|
87
|
+
The final sidebar location is determined by combining `sidebarGroup` and `path`:
|
|
88
|
+
|
|
89
|
+
1. **Absolute path** (starts with `/`): Ignores `sidebarGroup` entirely
|
|
90
|
+
```ts
|
|
91
|
+
sidebarGroup: 'Design System/'
|
|
92
|
+
sections: [{ name: 'Colors', path: '/' }]
|
|
93
|
+
// Result: "Colors" (at root level)
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
2. **Relative path**: Appends to `sidebarGroup`
|
|
97
|
+
```ts
|
|
98
|
+
sidebarGroup: 'Design System/'
|
|
99
|
+
sections: [{ name: 'Colors', path: 'Theme/' }]
|
|
100
|
+
// Result: "Design System/Theme/Colors"
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
3. **No path specified**: Uses `sidebarGroup` directly
|
|
104
|
+
```ts
|
|
105
|
+
sidebarGroup: 'Design System/'
|
|
106
|
+
sections: [{ name: 'Colors' }]
|
|
107
|
+
// Result: "Design System/Colors"
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
4. **Empty `sidebarGroup`**: Uses only the `path` (or just the name if no path)
|
|
111
|
+
```ts
|
|
112
|
+
sidebarGroup: ''
|
|
113
|
+
sections: [{ name: 'Colors', path: 'Theme/' }]
|
|
114
|
+
// Result: "Theme/Colors"
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
#### Examples
|
|
118
|
+
|
|
119
|
+
```ts
|
|
120
|
+
{
|
|
121
|
+
name: 'storybook-addon-design-system-docs',
|
|
122
|
+
options: {
|
|
123
|
+
tailwindConfig: '../tailwind.config.js',
|
|
124
|
+
sidebarGroup: 'Design System/',
|
|
125
|
+
|
|
126
|
+
// Customize section placement
|
|
127
|
+
sections: [
|
|
128
|
+
{ name: 'Colors', path: '/' }, // → "Colors" (root level)
|
|
129
|
+
{ name: 'Typography', path: '/' }, // → "Typography" (root level)
|
|
130
|
+
{ name: 'Spacing', path: 'Layout/' }, // → "Design System/Layout/Spacing"
|
|
131
|
+
{ name: 'Shadows', path: 'Layout/' }, // → "Design System/Layout/Shadows"
|
|
132
|
+
],
|
|
133
|
+
|
|
134
|
+
// Asset paths work the same way
|
|
135
|
+
assets: [
|
|
136
|
+
{
|
|
137
|
+
name: 'Icons',
|
|
138
|
+
source: './src/icons',
|
|
139
|
+
path: '/Resources/', // → "Resources/Icons" (absolute path, ignores sidebarGroup)
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
name: 'Illustrations',
|
|
143
|
+
source: './src/illustrations',
|
|
144
|
+
path: 'Assets/', // → "Design System/Assets/Illustrations" (relative to sidebarGroup)
|
|
145
|
+
},
|
|
146
|
+
],
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Section Configuration
|
|
152
|
+
|
|
153
|
+
Customize which Tailwind theme sections to display and where they appear:
|
|
154
|
+
|
|
155
|
+
```ts
|
|
156
|
+
sections: [
|
|
157
|
+
'Colors', // Simple string uses defaults
|
|
158
|
+
{
|
|
159
|
+
name: 'Typography',
|
|
160
|
+
path: 'Theme/', // Custom sidebar location
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
name: 'Spacing',
|
|
164
|
+
path: '/', // Place at root level
|
|
165
|
+
},
|
|
166
|
+
]
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
Available sections: `Colors`, `Typography`, `Spacing`, `Shadows`, `BorderRadius` (or `Radius`)
|
|
73
170
|
|
|
74
171
|
### Asset Configuration
|
|
75
172
|
|
|
173
|
+
Generate asset galleries from your file system:
|
|
174
|
+
|
|
76
175
|
```ts
|
|
77
176
|
assets: [
|
|
78
177
|
{
|
|
79
|
-
name: 'Icons',
|
|
80
|
-
source: './src/icons',
|
|
81
|
-
|
|
178
|
+
name: 'Icons', // Display name
|
|
179
|
+
source: './src/icons', // Source directory (relative to project root)
|
|
180
|
+
path: 'Assets/', // Optional: sidebar location (relative to sidebarGroup)
|
|
181
|
+
staticPath: '/icons', // Optional: URL path to serve assets from
|
|
82
182
|
variants: {
|
|
83
|
-
//
|
|
84
|
-
|
|
85
|
-
suffixes: ['.light', '.dark'],
|
|
183
|
+
enabled: true, // Enable variant detection
|
|
184
|
+
suffixes: ['.light', '.dark'], // Filename suffixes for variants
|
|
86
185
|
},
|
|
87
186
|
display: {
|
|
88
|
-
//
|
|
89
|
-
|
|
90
|
-
showFilename: true,
|
|
187
|
+
layout: 'grid', // 'grid' or 'list'
|
|
188
|
+
showFilename: true, // Show filenames below assets
|
|
91
189
|
},
|
|
92
190
|
},
|
|
93
191
|
];
|
|
94
192
|
```
|
|
95
193
|
|
|
194
|
+
**Asset Path Resolution**: Works exactly like section paths - supports both absolute (`/`) and relative paths, combined with `sidebarGroup`.
|
|
195
|
+
|
|
196
|
+
### Template Customization
|
|
197
|
+
|
|
198
|
+
Override the default MDX templates for any section:
|
|
199
|
+
|
|
200
|
+
```ts
|
|
201
|
+
{
|
|
202
|
+
templates: {
|
|
203
|
+
directory: './.storybook/design-system-docs', // Custom template directory
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
Place custom MDX files in the specified directory with names matching sections (e.g., `colors.mdx`, `typography.mdx`).
|
|
209
|
+
|
|
210
|
+
## Tailwind v4 Support
|
|
211
|
+
|
|
212
|
+
The addon automatically detects and supports both Tailwind CSS v3 (config file) and v4 (CSS `@theme` directive):
|
|
213
|
+
|
|
214
|
+
**Tailwind v3:**
|
|
215
|
+
```ts
|
|
216
|
+
{ tailwindConfig: './tailwind.config.js' }
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
**Tailwind v4:**
|
|
220
|
+
```ts
|
|
221
|
+
{ tailwindConfig: './src/app.css' } // CSS file with @theme directive
|
|
222
|
+
```
|
|
223
|
+
|
|
96
224
|
## Contributing
|
|
97
225
|
|
|
98
226
|
We welcome contributions! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for details.
|
|
@@ -418,11 +418,11 @@ function AssetSection({
|
|
|
418
418
|
};
|
|
419
419
|
const getImportPath = (asset) => {
|
|
420
420
|
if (!copy.import) return "";
|
|
421
|
-
return copy.import.replace(/\{\{name\}\}/g, asset.id).replace(/\{\{ext\}\}/g, asset.ext).replace(/\{\{path\}\}/g, asset.relativePath).replace(/\{\{basename\}\}/g, asset.filename
|
|
421
|
+
return copy.import.replace(/\{\{name\}\}/g, asset.id).replace(/\{\{ext\}\}/g, asset.ext).replace(/\{\{path\}\}/g, asset.relativePath).replace(/\{\{basename\}\}/g, `${asset.filename}.${asset.ext}`);
|
|
422
422
|
};
|
|
423
423
|
const getComponentUsage = (asset) => {
|
|
424
424
|
if (!copy.component) return "";
|
|
425
|
-
return copy.component.replace(/\{\{name\}\}/g, asset.id).replace(/\{\{ext\}\}/g, asset.ext).replace(/\{\{path\}\}/g, asset.relativePath).replace(/\{\{basename\}\}/g, asset.filename
|
|
425
|
+
return copy.component.replace(/\{\{name\}\}/g, asset.id).replace(/\{\{ext\}\}/g, asset.ext).replace(/\{\{path\}\}/g, asset.relativePath).replace(/\{\{basename\}\}/g, `${asset.filename}.${asset.ext}`);
|
|
426
426
|
};
|
|
427
427
|
const filteredAssets = react.useMemo(() => {
|
|
428
428
|
if (!searchTerm.trim()) return assets;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/addon/components/assets/Icons.tsx","../../../src/addon/components/assets/styled.ts","../../../src/addon/components/assets/AssetSection.tsx"],"names":["jsxs","jsx","styled","useState","useMemo","assets","Fragment"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * SVG icon components for asset documentation.\n */\n\nexport function CheckerboardIcon() {\n\treturn (\n\t\t<svg\n\t\t\tviewBox=\"0 0 16 16\"\n\t\t\tfill=\"currentColor\"\n\t\t\trole=\"img\"\n\t\t\taria-label=\"Checkerboard background\"\n\t\t>\n\t\t\t<title>Checkerboard background</title>\n\t\t\t<path d=\"M0 0h4v4H0V0zm4 4h4v4H4V4zm4-4h4v4H8V0zm4 4h4v4h-4V4zM0 8h4v4H0V8zm8 0h4v4H8V8zm-4 4h4v4H4v-4zm8 0h4v4h-4v-4z\" />\n\t\t</svg>\n\t);\n}\n\nexport function InverseIcon() {\n\treturn (\n\t\t<svg\n\t\t\tviewBox=\"0 0 16 16\"\n\t\t\tfill=\"currentColor\"\n\t\t\trole=\"img\"\n\t\t\taria-label=\"Inverse background\"\n\t\t>\n\t\t\t<title>Inverse background</title>\n\t\t\t<circle\n\t\t\t\tcx=\"8\"\n\t\t\t\tcy=\"8\"\n\t\t\t\tr=\"7\"\n\t\t\t\tfill=\"none\"\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstrokeWidth=\"1.5\"\n\t\t\t/>\n\t\t\t<path d=\"M8 1a7 7 0 0 1 0 14V1z\" />\n\t\t</svg>\n\t);\n}\n\nexport function ResetIcon() {\n\treturn (\n\t\t<svg viewBox=\"0 0 16 16\" fill=\"currentColor\" role=\"img\" aria-label=\"Reset\">\n\t\t\t<title>Reset</title>\n\t\t\t<path d=\"M8 3a5 5 0 1 0 4.546 2.914.5.5 0 0 1 .908-.417A6 6 0 1 1 8 2v1z\" />\n\t\t\t<path d=\"M8 4.466V.534a.25.25 0 0 1 .41-.192l2.36 1.966c.12.1.12.284 0 .384L8.41 4.658A.25.25 0 0 1 8 4.466z\" />\n\t\t</svg>\n\t);\n}\n","/**\n * Styled components for asset documentation pages.\n * Extracted from templates/default/assets/_common.edge\n */\n\nimport { styled } from \"storybook/theming\";\n\n// Base wrapper and container\nexport const Wrapper = styled.div(({ theme }) => ({\n\tbackground: theme.background?.content || \"#ffffff\",\n\tminHeight: \"100vh\",\n\tpadding: \"40px 20px\",\n\tboxSizing: \"border-box\",\n}));\n\nexport const Container = styled.div({\n\tmaxWidth: \"1200px\",\n\tmargin: \"0 auto\",\n});\n\n// Typography\nexport const Title = styled.h1(({ theme }) => ({\n\tfontFamily: theme.typography?.fonts?.base || \"sans-serif\",\n\tfontSize: \"32px\",\n\tfontWeight: 700,\n\tcolor: theme.color?.defaultText || \"#333333\",\n\tmarginBottom: \"8px\",\n\tmarginTop: 0,\n}));\n\nexport const Description = styled.p(({ theme }) => ({\n\tfontFamily: theme.typography?.fonts?.base || \"sans-serif\",\n\tfontSize: \"16px\",\n\tcolor: theme.color?.defaultText || \"#333333\",\n\topacity: 0.8,\n\tmarginBottom: \"24px\",\n\tmarginTop: 0,\n}));\n\n// Controls\nexport const ControlsBar = styled.div({\n\tdisplay: \"flex\",\n\tgap: \"16px\",\n\tmarginBottom: \"32px\",\n\tflexWrap: \"wrap\",\n\talignItems: \"center\",\n});\n\nexport const SearchInput = styled.input(({ theme }) => ({\n\tflex: \"1 1 300px\",\n\tmaxWidth: \"400px\",\n\tpadding: \"10px 14px\",\n\tfontSize: \"14px\",\n\n\tborder: `1px solid ${theme.appBorderColor || \"#eaeaea\"}`,\n\tborderRadius: \"6px\",\n\tcolor: theme.color?.defaultText || \"#333333\",\n\tbackground: theme.background?.content || \"#ffffff\",\n\toutline: \"none\",\n\ttransition: \"border-color 0.2s, box-shadow 0.2s\",\n\t\"&:focus\": {\n\t\tborderColor: theme.color?.secondary || \"#0271b6\",\n\t\tboxShadow: `0 0 0 2px ${theme.color?.secondary || \"#0271b6\"}22`,\n\t},\n\t\"&::placeholder\": {\n\t\tcolor: theme.color?.defaultText || \"#333333\",\n\t\topacity: 0.5,\n\t},\n}));\n\nexport const VariantToggle = styled.button(({ theme }) => ({\n\tpadding: \"10px 16px\",\n\tfontSize: \"14px\",\n\tfontWeight: 500,\n\n\tborder: `1px solid ${theme.appBorderColor || \"#eaeaea\"}`,\n\tborderRadius: \"6px\",\n\tcursor: \"pointer\",\n\tbackground: theme.background?.content || \"#ffffff\",\n\tcolor: theme.color?.defaultText || \"#333333\",\n\ttransition: \"all 0.2s\",\n\t\"&:hover\": {\n\t\tborderColor: theme.color?.secondary || \"#0271b6\",\n\t\tbackground: theme.background?.hoverable || \"#f5f5f5\",\n\t},\n}));\n\nexport const BackgroundControls = styled.div({\n\tdisplay: \"flex\",\n\talignItems: \"center\",\n\tgap: \"12px\",\n\tmarginLeft: \"auto\",\n});\n\nexport const BackgroundToggle = styled.div(({ theme }) => ({\n\tdisplay: \"flex\",\n\talignItems: \"center\",\n\tgap: \"6px\",\n\tpadding: \"4px\",\n\tborder: `1px solid ${theme.appBorderColor || \"#eaeaea\"}`,\n\tborderRadius: \"6px\",\n\tbackground: theme.background?.content || \"#ffffff\",\n}));\n\nexport const ToggleOption = styled.button(({ theme }) => ({\n\tdisplay: \"flex\",\n\talignItems: \"center\",\n\tjustifyContent: \"center\",\n\twidth: \"28px\",\n\theight: \"28px\",\n\tborder: \"none\",\n\tborderRadius: \"4px\",\n\tcursor: \"pointer\",\n\tbackground: \"transparent\",\n\tcolor: theme.color?.defaultText || \"#333333\",\n\topacity: 0.5,\n\ttransition: \"all 0.15s\",\n\t'&[data-active=\"true\"]': {\n\t\tbackground: theme.color?.secondary || \"#0271b6\",\n\t\tcolor: \"#fff\",\n\t\topacity: 1,\n\t},\n\t'&:hover:not([data-active=\"true\"])': {\n\t\topacity: 0.8,\n\t\tbackground: theme.background?.hoverable || \"#f5f5f5\",\n\t},\n\t\"& svg\": {\n\t\twidth: \"16px\",\n\t\theight: \"16px\",\n\t},\n}));\n\nexport const ColorPickerGroup = styled.div(({ theme }) => ({\n\tdisplay: \"flex\",\n\talignItems: \"center\",\n\tgap: \"4px\",\n\tpadding: \"4px 6px\",\n\tborder: `1px solid ${theme.appBorderColor || \"#eaeaea\"}`,\n\tborderRadius: \"6px\",\n\tbackground: theme.background?.content || \"#ffffff\",\n\ttransition: \"border-color 0.2s\",\n\t\"&:focus-within\": {\n\t\tborderColor: theme.color?.secondary || \"#0271b6\",\n\t},\n}));\n\nexport const ColorLabel = styled.span(({ theme }) => ({\n\tfontFamily: theme.typography?.fonts?.base || \"sans-serif\",\n\tfontSize: \"11px\",\n\tcolor: theme.color?.defaultText || \"#333333\",\n\topacity: 0.6,\n\ttextTransform: \"uppercase\",\n\tletterSpacing: \"0.5px\",\n}));\n\nexport const ColorInput = styled.input({\n\twidth: \"24px\",\n\theight: \"24px\",\n\tpadding: 0,\n\tborder: \"none\",\n\tborderRadius: \"4px\",\n\tcursor: \"pointer\",\n\tbackground: \"transparent\",\n\t\"&::-webkit-color-swatch-wrapper\": {\n\t\tpadding: 0,\n\t},\n\t\"&::-webkit-color-swatch\": {\n\t\tborder: \"none\",\n\t\tborderRadius: \"4px\",\n\t},\n\t\"&::-moz-color-swatch\": {\n\t\tborder: \"none\",\n\t\tborderRadius: \"4px\",\n\t},\n});\n\nexport const ResetButton = styled.button(({ theme }) => ({\n\tdisplay: \"flex\",\n\talignItems: \"center\",\n\tjustifyContent: \"center\",\n\twidth: \"20px\",\n\theight: \"20px\",\n\tpadding: 0,\n\tborder: \"none\",\n\tborderRadius: \"4px\",\n\tcursor: \"pointer\",\n\tbackground: \"transparent\",\n\tcolor: theme.color?.defaultText || \"#333333\",\n\topacity: 0.4,\n\ttransition: \"all 0.15s\",\n\t\"&:hover\": {\n\t\topacity: 1,\n\t\tbackground: theme.background?.hoverable || \"#f5f5f5\",\n\t},\n\t\"& svg\": {\n\t\twidth: \"12px\",\n\t\theight: \"12px\",\n\t},\n}));\n\nexport const AssetCard = styled.div(({ theme }) => ({\n\tdisplay: \"flex\",\n\tflexDirection: \"column\",\n\talignItems: \"center\",\n\tpadding: \"16px\",\n\tborderRadius: \"8px\",\n\tborder: `1px solid ${theme.appBorderColor || \"#eaeaea\"}`,\n\tbackground: theme.background?.content || \"#ffffff\",\n\ttransition: \"all 0.2s\",\n\tcursor: \"pointer\",\n\t\"&:hover\": {\n\t\tborderColor: theme.color?.secondary || \"#0271b6\",\n\t\tboxShadow: \"0 4px 12px rgba(0,0,0,0.1)\",\n\t},\n}));\n\nexport const AssetPreview = styled.div({\n\twidth: \"var(--preview-size, 200px)\",\n\theight: \"var(--preview-size, 200px)\",\n\tdisplay: \"flex\",\n\talignItems: \"center\",\n\tjustifyContent: \"center\",\n\tmarginBottom: \"12px\",\n\tborderRadius: \"4px\",\n});\n\nexport const AssetImage = styled.img({\n\tmaxWidth: \"100%\",\n\tmaxHeight: \"100%\",\n\tobjectFit: \"contain\",\n});\n\nexport const AssetName = styled.div(({ theme }) => ({\n\tfontFamily: theme.typography?.fonts?.base || \"sans-serif\",\n\tfontSize: \"13px\",\n\tfontWeight: 500,\n\tcolor: theme.color?.defaultText || \"#333333\",\n\ttextAlign: \"center\",\n\twordBreak: \"break-word\",\n\tlineHeight: 1.3,\n}));\n\nexport const AssetFilename = styled.div(({ theme }) => ({\n\tfontFamily: theme.typography?.fonts?.mono || \"monospace\",\n\tfontSize: \"11px\",\n\tcolor: theme.color?.defaultText || \"#333333\",\n\topacity: 0.6,\n\ttextAlign: \"center\",\n\tmarginTop: \"4px\",\n}));\n\nexport const CopyButtons = styled.div({\n\tdisplay: \"flex\",\n\tgap: \"8px\",\n\tmarginTop: \"8px\",\n\topacity: 0,\n\ttransition: \"opacity 0.2s\",\n\t\".asset-card:hover &\": {\n\t\topacity: 1,\n\t},\n});\n\nexport const CopyButton = styled.button(({ theme }) => ({\n\tpadding: \"4px 8px\",\n\tfontSize: \"11px\",\n\tborder: `1px solid ${theme.appBorderColor || \"#eaeaea\"}`,\n\tborderRadius: \"4px\",\n\tcursor: \"pointer\",\n\tbackground: theme.background?.content || \"#ffffff\",\n\tcolor: theme.color?.defaultText || \"#333333\",\n\ttransition: \"all 0.15s\",\n\t\"&:hover\": {\n\t\tbackground: theme.color?.secondary || \"#0271b6\",\n\t\tcolor: \"#fff\",\n\t\tborderColor: theme.color?.secondary || \"#0271b6\",\n\t},\n}));\n\nexport const NoResults = styled.div(({ theme }) => ({\n\tfontFamily: theme.typography?.fonts?.base || \"sans-serif\",\n\tfontSize: \"16px\",\n\tcolor: theme.color?.defaultText || \"#333333\",\n\topacity: 0.6,\n\ttextAlign: \"center\",\n\tpadding: \"60px 20px\",\n}));\n\n// Folder sections (for groupByFolder mode)\nexport const FolderSection = styled.div({\n\tmarginBottom: \"48px\",\n});\n\nexport const FolderTitle = styled.h2(({ theme }) => ({\n\tfontFamily: theme.typography?.fonts?.base || \"sans-serif\",\n\tfontSize: \"20px\",\n\tfontWeight: 600,\n\tcolor: theme.color?.defaultText || \"#333333\",\n\tmarginBottom: \"16px\",\n\tmarginTop: 0,\n\tpaddingBottom: \"8px\",\n\tborderBottom: `1px solid ${theme.appBorderColor || \"#eaeaea\"}`,\n}));\n\n// Toast notifications\nexport const Toast = styled.div(({ theme }) => ({\n\tposition: \"fixed\",\n\tbottom: \"24px\",\n\tright: \"24px\",\n\tpadding: \"12px 20px\",\n\tbackground: theme.color?.positive || \"#44bb44\",\n\tcolor: \"#fff\",\n\tborderRadius: \"8px\",\n\tfontSize: \"14px\",\n\tfontWeight: 500,\n\tboxShadow: \"0 4px 12px rgba(0,0,0,0.15)\",\n\tzIndex: 1000,\n\tanimation: \"fadeInUp 0.3s ease\",\n}));\n","/**\n * AssetSection - Complete asset grid with search, variants, and background controls.\n */\n\nimport { useMemo, useState } from \"react\";\nimport type { Asset } from \"@/types\";\nimport { CheckerboardIcon, InverseIcon, ResetIcon } from \"./Icons\";\nimport {\n\tAssetCard,\n\tAssetFilename,\n\tAssetImage,\n\tAssetName,\n\tAssetPreview,\n\tBackgroundControls,\n\tBackgroundToggle,\n\tColorInput,\n\tColorLabel,\n\tColorPickerGroup,\n\tContainer,\n\tControlsBar,\n\tCopyButton,\n\tCopyButtons,\n\tDescription,\n\tFolderSection,\n\tFolderTitle,\n\tNoResults,\n\tResetButton,\n\tSearchInput,\n\tTitle,\n\tToast,\n\tToggleOption,\n\tVariantToggle,\n\tWrapper,\n} from \"./styled\";\n\nexport interface AssetSectionProps {\n\t/** Title for the page */\n\ttitle: string;\n\t/** Optional description */\n\tdescription?: string;\n\t/** Asset data array */\n\tassets: Asset[];\n\t/** Whether to group assets by folder */\n\tgroupByFolder: boolean;\n\t/** Variants configuration */\n\tvariants: {\n\t\tenabled: boolean;\n\t\tdefaultVariant: \"light\" | \"dark\";\n\t};\n\t/** Copy configuration */\n\tcopy: {\n\t\timport?: string;\n\t\tcomponent?: string;\n\t};\n\t/** Display configuration */\n\tdisplay: {\n\t\tpreviewSize: number;\n\t\tshowFilename: boolean;\n\t};\n\t/** Storage key prefix for localStorage */\n\tstorageKeyPrefix: string;\n}\n\n/**\n * Complete asset grid with search, variants, background controls, and copy functionality.\n */\nexport function AssetSection({\n\ttitle,\n\tdescription,\n\tassets,\n\tgroupByFolder,\n\tvariants,\n\tcopy,\n\tdisplay,\n\tstorageKeyPrefix,\n}: AssetSectionProps) {\n\t// Constants\n\tconst DEFAULT_LIGHT_BG = \"#eeeeee\";\n\tconst DEFAULT_DARK_BG = \"#181818\";\n\tconst STORAGE_KEY_LIGHT = `${storageKeyPrefix}-light`;\n\tconst STORAGE_KEY_DARK = `${storageKeyPrefix}-dark`;\n\tconst STORAGE_KEY_MODE = `${storageKeyPrefix}-mode`;\n\n\t// Load from localStorage\n\tconst getStoredValue = (key: string, defaultValue: string) => {\n\t\ttry {\n\t\t\tconst stored = localStorage.getItem(key);\n\t\t\treturn stored !== null ? stored : defaultValue;\n\t\t} catch {\n\t\t\treturn defaultValue;\n\t\t}\n\t};\n\n\tconst setStoredValue = (key: string, value: string) => {\n\t\ttry {\n\t\t\tlocalStorage.setItem(key, value);\n\t\t} catch {}\n\t};\n\n\tconst removeStoredValue = (key: string) => {\n\t\ttry {\n\t\t\tlocalStorage.removeItem(key);\n\t\t} catch {}\n\t};\n\n\t// State\n\tconst [searchTerm, setSearchTerm] = useState(\"\");\n\tconst [currentVariant, setCurrentVariant] = useState(variants.defaultVariant);\n\tconst [toastMessage, setToastMessage] = useState<string | null>(null);\n\tconst [bgMode, setBgMode] = useState(() =>\n\t\tgetStoredValue(STORAGE_KEY_MODE, \"checkered\"),\n\t);\n\tconst [lightBgColor, setLightBgColor] = useState(() =>\n\t\tgetStoredValue(STORAGE_KEY_LIGHT, DEFAULT_LIGHT_BG),\n\t);\n\tconst [darkBgColor, setDarkBgColor] = useState(() =>\n\t\tgetStoredValue(STORAGE_KEY_DARK, DEFAULT_DARK_BG),\n\t);\n\n\t// Handlers\n\tconst handleBgModeChange = (mode: string) => {\n\t\tsetBgMode(mode);\n\t\tsetStoredValue(STORAGE_KEY_MODE, mode);\n\t};\n\n\tconst handleLightBgChange = (color: string) => {\n\t\tsetLightBgColor(color);\n\t\tsetStoredValue(STORAGE_KEY_LIGHT, color);\n\t};\n\n\tconst handleDarkBgChange = (color: string) => {\n\t\tsetDarkBgColor(color);\n\t\tsetStoredValue(STORAGE_KEY_DARK, color);\n\t};\n\n\tconst resetLightBg = () => {\n\t\tsetLightBgColor(DEFAULT_LIGHT_BG);\n\t\tremoveStoredValue(STORAGE_KEY_LIGHT);\n\t};\n\n\tconst resetDarkBg = () => {\n\t\tsetDarkBgColor(DEFAULT_DARK_BG);\n\t\tremoveStoredValue(STORAGE_KEY_DARK);\n\t};\n\n\tconst isLightVariant = currentVariant === \"light\";\n\n\tconst getPreviewBackground = () => {\n\t\tif (bgMode === \"checkered\") {\n\t\t\treturn \"repeating-conic-gradient(#e0e0e0 0% 25%, #ffffff 0% 50%) 50% / 16px 16px\";\n\t\t}\n\t\t// Inverse mode: use opposite background of the variant\n\t\treturn isLightVariant ? darkBgColor : lightBgColor;\n\t};\n\n\tconst showToast = (message: string) => {\n\t\tsetToastMessage(message);\n\t\tsetTimeout(() => setToastMessage(null), 2000);\n\t};\n\n\tconst copyToClipboard = (text: string, type: string) => {\n\t\tnavigator.clipboard.writeText(text).then(() => {\n\t\t\tshowToast(`${type} copied to clipboard!`);\n\t\t});\n\t};\n\n\tconst getImportPath = (asset: Asset) => {\n\t\tif (!copy.import) return \"\";\n\t\treturn copy.import\n\t\t\t.replace(/\\{\\{name\\}\\}/g, asset.id)\n\t\t\t.replace(/\\{\\{ext\\}\\}/g, asset.ext)\n\t\t\t.replace(/\\{\\{path\\}\\}/g, asset.relativePath)\n\t\t\t.replace(/\\{\\{basename\\}\\}/g, asset.filename + \".\" + asset.ext);\n\t};\n\n\tconst getComponentUsage = (asset: Asset) => {\n\t\tif (!copy.component) return \"\";\n\t\treturn copy.component\n\t\t\t.replace(/\\{\\{name\\}\\}/g, asset.id)\n\t\t\t.replace(/\\{\\{ext\\}\\}/g, asset.ext)\n\t\t\t.replace(/\\{\\{path\\}\\}/g, asset.relativePath)\n\t\t\t.replace(/\\{\\{basename\\}\\}/g, asset.filename + \".\" + asset.ext);\n\t};\n\n\t// Filter assets\n\tconst filteredAssets = useMemo(() => {\n\t\tif (!searchTerm.trim()) return assets;\n\t\tconst term = searchTerm.toLowerCase();\n\t\treturn assets.filter(\n\t\t\t(asset) =>\n\t\t\t\tasset.name.toLowerCase().includes(term) ||\n\t\t\t\tasset.filename.toLowerCase().includes(term),\n\t\t);\n\t}, [assets, searchTerm]);\n\n\t// Group by folder if enabled\n\tconst groupedAssets = useMemo(() => {\n\t\tif (!groupByFolder) return new Map();\n\t\tconst groups = new Map<string, Asset[]>();\n\t\tfor (const asset of filteredAssets) {\n\t\t\tconst folder = asset.folder || \"root\";\n\t\t\tif (!groups.has(folder)) {\n\t\t\t\tgroups.set(folder, []);\n\t\t\t}\n\t\t\tgroups.get(folder)!.push(asset);\n\t\t}\n\t\treturn groups;\n\t}, [filteredAssets, groupByFolder]);\n\n\tconst renderAsset = (asset: Asset) => {\n\t\tconst imageSrc =\n\t\t\tcurrentVariant === \"dark\" && asset.variants.dark\n\t\t\t\t? asset.variants.dark\n\t\t\t\t: asset.variants.light;\n\n\t\tconst hasCopyAction = copy.import || copy.component;\n\t\tconst copyType = copy.import ? \"Import\" : \"Component\";\n\t\tconst copyText = copy.import\n\t\t\t? getImportPath(asset)\n\t\t\t: getComponentUsage(asset);\n\n\t\treturn (\n\t\t\t<AssetCard\n\t\t\t\tkey={asset.id}\n\t\t\t\tclassName=\"asset-card\"\n\t\t\t\tonClick={() => hasCopyAction && copyToClipboard(copyText, copyType)}\n\t\t\t>\n\t\t\t\t<AssetPreview\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\twidth: `${display.previewSize}px`,\n\t\t\t\t\t\theight: `${display.previewSize}px`,\n\t\t\t\t\t\tbackground: getPreviewBackground(),\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<AssetImage src={imageSrc} alt={asset.name} />\n\t\t\t\t</AssetPreview>\n\t\t\t\t<AssetName>{asset.name}</AssetName>\n\t\t\t\t{display.showFilename && (\n\t\t\t\t\t<AssetFilename>\n\t\t\t\t\t\t{asset.filename}.{asset.ext}\n\t\t\t\t\t</AssetFilename>\n\t\t\t\t)}\n\t\t\t\t{hasCopyAction && (\n\t\t\t\t\t<CopyButtons>\n\t\t\t\t\t\t<CopyButton\n\t\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\tcopyToClipboard(copyText, copyType);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{copyType}\n\t\t\t\t\t\t</CopyButton>\n\t\t\t\t\t</CopyButtons>\n\t\t\t\t)}\n\t\t\t</AssetCard>\n\t\t);\n\t};\n\n\tconst renderGroupedAssets = () => {\n\t\tconst entries = Array.from(groupedAssets.entries());\n\t\treturn entries.map(([folder, assets]) => (\n\t\t\t<FolderSection key={folder}>\n\t\t\t\t<FolderTitle>{folder === \"root\" ? \"Root\" : folder}</FolderTitle>\n\t\t\t\t<div\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tdisplay: \"grid\",\n\t\t\t\t\t\tgridTemplateColumns: `repeat(auto-fill, minmax(${display.previewSize + 40}px, 1fr))`,\n\t\t\t\t\t\tgap: \"24px\",\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{assets.map(renderAsset)}\n\t\t\t\t</div>\n\t\t\t</FolderSection>\n\t\t));\n\t};\n\n\treturn (\n\t\t<Wrapper>\n\t\t\t<Container>\n\t\t\t\t<Title>{title}</Title>\n\t\t\t\t{description && <Description>{description}</Description>}\n\n\t\t\t\t<ControlsBar>\n\t\t\t\t\t<SearchInput\n\t\t\t\t\t\tvalue={searchTerm}\n\t\t\t\t\t\tonChange={(e) => setSearchTerm(e.target.value)}\n\t\t\t\t\t\tplaceholder={`Search ${title.toLowerCase()}...`}\n\t\t\t\t\t/>\n\n\t\t\t\t\t{variants.enabled && (\n\t\t\t\t\t\t<VariantToggle\n\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\tsetCurrentVariant((v) => (v === \"light\" ? \"dark\" : \"light\"))\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{currentVariant === \"light\" ? \"Light\" : \"Dark\"}\n\t\t\t\t\t\t</VariantToggle>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<BackgroundControls>\n\t\t\t\t\t\t<BackgroundToggle>\n\t\t\t\t\t\t\t<ToggleOption\n\t\t\t\t\t\t\t\tdata-active={bgMode === \"inverse\"}\n\t\t\t\t\t\t\t\tonClick={() => handleBgModeChange(\"inverse\")}\n\t\t\t\t\t\t\t\ttitle=\"Inverse background\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<InverseIcon />\n\t\t\t\t\t\t\t</ToggleOption>\n\t\t\t\t\t\t\t<ToggleOption\n\t\t\t\t\t\t\t\tdata-active={bgMode === \"checkered\"}\n\t\t\t\t\t\t\t\tonClick={() => handleBgModeChange(\"checkered\")}\n\t\t\t\t\t\t\t\ttitle=\"Checkered background\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<CheckerboardIcon />\n\t\t\t\t\t\t\t</ToggleOption>\n\t\t\t\t\t\t</BackgroundToggle>\n\n\t\t\t\t\t\t{bgMode === \"inverse\" && (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<ColorPickerGroup>\n\t\t\t\t\t\t\t\t\t<ColorLabel>Light</ColorLabel>\n\t\t\t\t\t\t\t\t\t<ColorInput\n\t\t\t\t\t\t\t\t\t\ttype=\"color\"\n\t\t\t\t\t\t\t\t\t\tvalue={lightBgColor}\n\t\t\t\t\t\t\t\t\t\tonChange={(e) => handleLightBgChange(e.target.value)}\n\t\t\t\t\t\t\t\t\t\ttitle=\"Background for dark illustrations\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t{lightBgColor !== DEFAULT_LIGHT_BG && (\n\t\t\t\t\t\t\t\t\t\t<ResetButton\n\t\t\t\t\t\t\t\t\t\t\tonClick={resetLightBg}\n\t\t\t\t\t\t\t\t\t\t\ttitle=\"Reset to default\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<ResetIcon />\n\t\t\t\t\t\t\t\t\t\t</ResetButton>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</ColorPickerGroup>\n\t\t\t\t\t\t\t\t<ColorPickerGroup>\n\t\t\t\t\t\t\t\t\t<ColorLabel>Dark</ColorLabel>\n\t\t\t\t\t\t\t\t\t<ColorInput\n\t\t\t\t\t\t\t\t\t\ttype=\"color\"\n\t\t\t\t\t\t\t\t\t\tvalue={darkBgColor}\n\t\t\t\t\t\t\t\t\t\tonChange={(e) => handleDarkBgChange(e.target.value)}\n\t\t\t\t\t\t\t\t\t\ttitle=\"Background for light illustrations\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t{darkBgColor !== DEFAULT_DARK_BG && (\n\t\t\t\t\t\t\t\t\t\t<ResetButton onClick={resetDarkBg} title=\"Reset to default\">\n\t\t\t\t\t\t\t\t\t\t\t<ResetIcon />\n\t\t\t\t\t\t\t\t\t\t</ResetButton>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</ColorPickerGroup>\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</BackgroundControls>\n\t\t\t\t</ControlsBar>\n\n\t\t\t\t{filteredAssets.length === 0 ? (\n\t\t\t\t\t<NoResults>\n\t\t\t\t\t\tNo {title.toLowerCase()} found matching \"{searchTerm}\"\n\t\t\t\t\t</NoResults>\n\t\t\t\t) : groupByFolder ? (\n\t\t\t\t\trenderGroupedAssets()\n\t\t\t\t) : (\n\t\t\t\t\t<div\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tdisplay: \"grid\",\n\t\t\t\t\t\t\tgridTemplateColumns: `repeat(auto-fill, minmax(${display.previewSize + 40}px, 1fr))`,\n\t\t\t\t\t\t\tgap: \"24px\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{filteredAssets.map(renderAsset)}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{toastMessage && <Toast>{toastMessage}</Toast>}\n\t\t\t</Container>\n\t\t</Wrapper>\n\t);\n}\n\n/**\n * Props for export-only mode (no wrapper, just the grid component).\n */\nexport interface AssetGridProps\n\textends Omit<AssetSectionProps, \"title\" | \"description\"> {\n\t/** Grid column configuration */\n\tcolumns?: number;\n}\n\n/**\n * Asset grid component for export-only mode (no page wrapper).\n */\nexport function AssetGrid(props: AssetGridProps) {\n\t// Reuse AssetSection but without the wrapper\n\tconst { columns = 4, ...rest } = props;\n\n\treturn (\n\t\t<AssetSection\n\t\t\ttitle=\"\"\n\t\t\tdescription=\"\"\n\t\t\tdisplay={{ ...rest.display, previewSize: rest.display.previewSize }}\n\t\t\t{...rest}\n\t\t/>\n\t);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/addon/components/assets/Icons.tsx","../../../src/addon/components/assets/styled.ts","../../../src/addon/components/assets/AssetSection.tsx"],"names":["jsxs","jsx","styled","useState","useMemo","assets","Fragment"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * SVG icon components for asset documentation.\n */\n\nexport function CheckerboardIcon() {\n\treturn (\n\t\t<svg\n\t\t\tviewBox=\"0 0 16 16\"\n\t\t\tfill=\"currentColor\"\n\t\t\trole=\"img\"\n\t\t\taria-label=\"Checkerboard background\"\n\t\t>\n\t\t\t<title>Checkerboard background</title>\n\t\t\t<path d=\"M0 0h4v4H0V0zm4 4h4v4H4V4zm4-4h4v4H8V0zm4 4h4v4h-4V4zM0 8h4v4H0V8zm8 0h4v4H8V8zm-4 4h4v4H4v-4zm8 0h4v4h-4v-4z\" />\n\t\t</svg>\n\t);\n}\n\nexport function InverseIcon() {\n\treturn (\n\t\t<svg\n\t\t\tviewBox=\"0 0 16 16\"\n\t\t\tfill=\"currentColor\"\n\t\t\trole=\"img\"\n\t\t\taria-label=\"Inverse background\"\n\t\t>\n\t\t\t<title>Inverse background</title>\n\t\t\t<circle\n\t\t\t\tcx=\"8\"\n\t\t\t\tcy=\"8\"\n\t\t\t\tr=\"7\"\n\t\t\t\tfill=\"none\"\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstrokeWidth=\"1.5\"\n\t\t\t/>\n\t\t\t<path d=\"M8 1a7 7 0 0 1 0 14V1z\" />\n\t\t</svg>\n\t);\n}\n\nexport function ResetIcon() {\n\treturn (\n\t\t<svg viewBox=\"0 0 16 16\" fill=\"currentColor\" role=\"img\" aria-label=\"Reset\">\n\t\t\t<title>Reset</title>\n\t\t\t<path d=\"M8 3a5 5 0 1 0 4.546 2.914.5.5 0 0 1 .908-.417A6 6 0 1 1 8 2v1z\" />\n\t\t\t<path d=\"M8 4.466V.534a.25.25 0 0 1 .41-.192l2.36 1.966c.12.1.12.284 0 .384L8.41 4.658A.25.25 0 0 1 8 4.466z\" />\n\t\t</svg>\n\t);\n}\n","/**\n * Styled components for asset documentation pages.\n * Extracted from templates/default/assets/_common.edge\n */\n\nimport { styled } from \"storybook/theming\";\n\n// Base wrapper and container\nexport const Wrapper = styled.div(({ theme }) => ({\n\tbackground: theme.background?.content || \"#ffffff\",\n\tminHeight: \"100vh\",\n\tpadding: \"40px 20px\",\n\tboxSizing: \"border-box\",\n}));\n\nexport const Container = styled.div({\n\tmaxWidth: \"1200px\",\n\tmargin: \"0 auto\",\n});\n\n// Typography\nexport const Title = styled.h1(({ theme }) => ({\n\tfontFamily: theme.typography?.fonts?.base || \"sans-serif\",\n\tfontSize: \"32px\",\n\tfontWeight: 700,\n\tcolor: theme.color?.defaultText || \"#333333\",\n\tmarginBottom: \"8px\",\n\tmarginTop: 0,\n}));\n\nexport const Description = styled.p(({ theme }) => ({\n\tfontFamily: theme.typography?.fonts?.base || \"sans-serif\",\n\tfontSize: \"16px\",\n\tcolor: theme.color?.defaultText || \"#333333\",\n\topacity: 0.8,\n\tmarginBottom: \"24px\",\n\tmarginTop: 0,\n}));\n\n// Controls\nexport const ControlsBar = styled.div({\n\tdisplay: \"flex\",\n\tgap: \"16px\",\n\tmarginBottom: \"32px\",\n\tflexWrap: \"wrap\",\n\talignItems: \"center\",\n});\n\nexport const SearchInput = styled.input(({ theme }) => ({\n\tflex: \"1 1 300px\",\n\tmaxWidth: \"400px\",\n\tpadding: \"10px 14px\",\n\tfontSize: \"14px\",\n\n\tborder: `1px solid ${theme.appBorderColor || \"#eaeaea\"}`,\n\tborderRadius: \"6px\",\n\tcolor: theme.color?.defaultText || \"#333333\",\n\tbackground: theme.background?.content || \"#ffffff\",\n\toutline: \"none\",\n\ttransition: \"border-color 0.2s, box-shadow 0.2s\",\n\t\"&:focus\": {\n\t\tborderColor: theme.color?.secondary || \"#0271b6\",\n\t\tboxShadow: `0 0 0 2px ${theme.color?.secondary || \"#0271b6\"}22`,\n\t},\n\t\"&::placeholder\": {\n\t\tcolor: theme.color?.defaultText || \"#333333\",\n\t\topacity: 0.5,\n\t},\n}));\n\nexport const VariantToggle = styled.button(({ theme }) => ({\n\tpadding: \"10px 16px\",\n\tfontSize: \"14px\",\n\tfontWeight: 500,\n\n\tborder: `1px solid ${theme.appBorderColor || \"#eaeaea\"}`,\n\tborderRadius: \"6px\",\n\tcursor: \"pointer\",\n\tbackground: theme.background?.content || \"#ffffff\",\n\tcolor: theme.color?.defaultText || \"#333333\",\n\ttransition: \"all 0.2s\",\n\t\"&:hover\": {\n\t\tborderColor: theme.color?.secondary || \"#0271b6\",\n\t\tbackground: theme.background?.hoverable || \"#f5f5f5\",\n\t},\n}));\n\nexport const BackgroundControls = styled.div({\n\tdisplay: \"flex\",\n\talignItems: \"center\",\n\tgap: \"12px\",\n\tmarginLeft: \"auto\",\n});\n\nexport const BackgroundToggle = styled.div(({ theme }) => ({\n\tdisplay: \"flex\",\n\talignItems: \"center\",\n\tgap: \"6px\",\n\tpadding: \"4px\",\n\tborder: `1px solid ${theme.appBorderColor || \"#eaeaea\"}`,\n\tborderRadius: \"6px\",\n\tbackground: theme.background?.content || \"#ffffff\",\n}));\n\nexport const ToggleOption = styled.button(({ theme }) => ({\n\tdisplay: \"flex\",\n\talignItems: \"center\",\n\tjustifyContent: \"center\",\n\twidth: \"28px\",\n\theight: \"28px\",\n\tborder: \"none\",\n\tborderRadius: \"4px\",\n\tcursor: \"pointer\",\n\tbackground: \"transparent\",\n\tcolor: theme.color?.defaultText || \"#333333\",\n\topacity: 0.5,\n\ttransition: \"all 0.15s\",\n\t'&[data-active=\"true\"]': {\n\t\tbackground: theme.color?.secondary || \"#0271b6\",\n\t\tcolor: \"#fff\",\n\t\topacity: 1,\n\t},\n\t'&:hover:not([data-active=\"true\"])': {\n\t\topacity: 0.8,\n\t\tbackground: theme.background?.hoverable || \"#f5f5f5\",\n\t},\n\t\"& svg\": {\n\t\twidth: \"16px\",\n\t\theight: \"16px\",\n\t},\n}));\n\nexport const ColorPickerGroup = styled.div(({ theme }) => ({\n\tdisplay: \"flex\",\n\talignItems: \"center\",\n\tgap: \"4px\",\n\tpadding: \"4px 6px\",\n\tborder: `1px solid ${theme.appBorderColor || \"#eaeaea\"}`,\n\tborderRadius: \"6px\",\n\tbackground: theme.background?.content || \"#ffffff\",\n\ttransition: \"border-color 0.2s\",\n\t\"&:focus-within\": {\n\t\tborderColor: theme.color?.secondary || \"#0271b6\",\n\t},\n}));\n\nexport const ColorLabel = styled.span(({ theme }) => ({\n\tfontFamily: theme.typography?.fonts?.base || \"sans-serif\",\n\tfontSize: \"11px\",\n\tcolor: theme.color?.defaultText || \"#333333\",\n\topacity: 0.6,\n\ttextTransform: \"uppercase\",\n\tletterSpacing: \"0.5px\",\n}));\n\nexport const ColorInput = styled.input({\n\twidth: \"24px\",\n\theight: \"24px\",\n\tpadding: 0,\n\tborder: \"none\",\n\tborderRadius: \"4px\",\n\tcursor: \"pointer\",\n\tbackground: \"transparent\",\n\t\"&::-webkit-color-swatch-wrapper\": {\n\t\tpadding: 0,\n\t},\n\t\"&::-webkit-color-swatch\": {\n\t\tborder: \"none\",\n\t\tborderRadius: \"4px\",\n\t},\n\t\"&::-moz-color-swatch\": {\n\t\tborder: \"none\",\n\t\tborderRadius: \"4px\",\n\t},\n});\n\nexport const ResetButton = styled.button(({ theme }) => ({\n\tdisplay: \"flex\",\n\talignItems: \"center\",\n\tjustifyContent: \"center\",\n\twidth: \"20px\",\n\theight: \"20px\",\n\tpadding: 0,\n\tborder: \"none\",\n\tborderRadius: \"4px\",\n\tcursor: \"pointer\",\n\tbackground: \"transparent\",\n\tcolor: theme.color?.defaultText || \"#333333\",\n\topacity: 0.4,\n\ttransition: \"all 0.15s\",\n\t\"&:hover\": {\n\t\topacity: 1,\n\t\tbackground: theme.background?.hoverable || \"#f5f5f5\",\n\t},\n\t\"& svg\": {\n\t\twidth: \"12px\",\n\t\theight: \"12px\",\n\t},\n}));\n\nexport const AssetCard = styled.div(({ theme }) => ({\n\tdisplay: \"flex\",\n\tflexDirection: \"column\",\n\talignItems: \"center\",\n\tpadding: \"16px\",\n\tborderRadius: \"8px\",\n\tborder: `1px solid ${theme.appBorderColor || \"#eaeaea\"}`,\n\tbackground: theme.background?.content || \"#ffffff\",\n\ttransition: \"all 0.2s\",\n\tcursor: \"pointer\",\n\t\"&:hover\": {\n\t\tborderColor: theme.color?.secondary || \"#0271b6\",\n\t\tboxShadow: \"0 4px 12px rgba(0,0,0,0.1)\",\n\t},\n}));\n\nexport const AssetPreview = styled.div({\n\twidth: \"var(--preview-size, 200px)\",\n\theight: \"var(--preview-size, 200px)\",\n\tdisplay: \"flex\",\n\talignItems: \"center\",\n\tjustifyContent: \"center\",\n\tmarginBottom: \"12px\",\n\tborderRadius: \"4px\",\n});\n\nexport const AssetImage = styled.img({\n\tmaxWidth: \"100%\",\n\tmaxHeight: \"100%\",\n\tobjectFit: \"contain\",\n});\n\nexport const AssetName = styled.div(({ theme }) => ({\n\tfontFamily: theme.typography?.fonts?.base || \"sans-serif\",\n\tfontSize: \"13px\",\n\tfontWeight: 500,\n\tcolor: theme.color?.defaultText || \"#333333\",\n\ttextAlign: \"center\",\n\twordBreak: \"break-word\",\n\tlineHeight: 1.3,\n}));\n\nexport const AssetFilename = styled.div(({ theme }) => ({\n\tfontFamily: theme.typography?.fonts?.mono || \"monospace\",\n\tfontSize: \"11px\",\n\tcolor: theme.color?.defaultText || \"#333333\",\n\topacity: 0.6,\n\ttextAlign: \"center\",\n\tmarginTop: \"4px\",\n}));\n\nexport const CopyButtons = styled.div({\n\tdisplay: \"flex\",\n\tgap: \"8px\",\n\tmarginTop: \"8px\",\n\topacity: 0,\n\ttransition: \"opacity 0.2s\",\n\t\".asset-card:hover &\": {\n\t\topacity: 1,\n\t},\n});\n\nexport const CopyButton = styled.button(({ theme }) => ({\n\tpadding: \"4px 8px\",\n\tfontSize: \"11px\",\n\tborder: `1px solid ${theme.appBorderColor || \"#eaeaea\"}`,\n\tborderRadius: \"4px\",\n\tcursor: \"pointer\",\n\tbackground: theme.background?.content || \"#ffffff\",\n\tcolor: theme.color?.defaultText || \"#333333\",\n\ttransition: \"all 0.15s\",\n\t\"&:hover\": {\n\t\tbackground: theme.color?.secondary || \"#0271b6\",\n\t\tcolor: \"#fff\",\n\t\tborderColor: theme.color?.secondary || \"#0271b6\",\n\t},\n}));\n\nexport const NoResults = styled.div(({ theme }) => ({\n\tfontFamily: theme.typography?.fonts?.base || \"sans-serif\",\n\tfontSize: \"16px\",\n\tcolor: theme.color?.defaultText || \"#333333\",\n\topacity: 0.6,\n\ttextAlign: \"center\",\n\tpadding: \"60px 20px\",\n}));\n\n// Folder sections (for groupByFolder mode)\nexport const FolderSection = styled.div({\n\tmarginBottom: \"48px\",\n});\n\nexport const FolderTitle = styled.h2(({ theme }) => ({\n\tfontFamily: theme.typography?.fonts?.base || \"sans-serif\",\n\tfontSize: \"20px\",\n\tfontWeight: 600,\n\tcolor: theme.color?.defaultText || \"#333333\",\n\tmarginBottom: \"16px\",\n\tmarginTop: 0,\n\tpaddingBottom: \"8px\",\n\tborderBottom: `1px solid ${theme.appBorderColor || \"#eaeaea\"}`,\n}));\n\n// Toast notifications\nexport const Toast = styled.div(({ theme }) => ({\n\tposition: \"fixed\",\n\tbottom: \"24px\",\n\tright: \"24px\",\n\tpadding: \"12px 20px\",\n\tbackground: theme.color?.positive || \"#44bb44\",\n\tcolor: \"#fff\",\n\tborderRadius: \"8px\",\n\tfontSize: \"14px\",\n\tfontWeight: 500,\n\tboxShadow: \"0 4px 12px rgba(0,0,0,0.15)\",\n\tzIndex: 1000,\n\tanimation: \"fadeInUp 0.3s ease\",\n}));\n","/**\n * AssetSection - Complete asset grid with search, variants, and background controls.\n */\n\nimport { useMemo, useState } from \"react\";\nimport type { Asset } from \"@/types\";\nimport { CheckerboardIcon, InverseIcon, ResetIcon } from \"./Icons\";\nimport {\n\tAssetCard,\n\tAssetFilename,\n\tAssetImage,\n\tAssetName,\n\tAssetPreview,\n\tBackgroundControls,\n\tBackgroundToggle,\n\tColorInput,\n\tColorLabel,\n\tColorPickerGroup,\n\tContainer,\n\tControlsBar,\n\tCopyButton,\n\tCopyButtons,\n\tDescription,\n\tFolderSection,\n\tFolderTitle,\n\tNoResults,\n\tResetButton,\n\tSearchInput,\n\tTitle,\n\tToast,\n\tToggleOption,\n\tVariantToggle,\n\tWrapper,\n} from \"./styled\";\n\nexport interface AssetSectionProps {\n\t/** Title for the page */\n\ttitle: string;\n\t/** Optional description */\n\tdescription?: string;\n\t/** Asset data array */\n\tassets: Asset[];\n\t/** Whether to group assets by folder */\n\tgroupByFolder: boolean;\n\t/** Variants configuration */\n\tvariants: {\n\t\tenabled: boolean;\n\t\tdefaultVariant: \"light\" | \"dark\";\n\t};\n\t/** Copy configuration */\n\tcopy: {\n\t\timport?: string;\n\t\tcomponent?: string;\n\t};\n\t/** Display configuration */\n\tdisplay: {\n\t\tpreviewSize: number;\n\t\tshowFilename: boolean;\n\t};\n\t/** Storage key prefix for localStorage */\n\tstorageKeyPrefix: string;\n}\n\n/**\n * Complete asset grid with search, variants, background controls, and copy functionality.\n */\nexport function AssetSection({\n\ttitle,\n\tdescription,\n\tassets,\n\tgroupByFolder,\n\tvariants,\n\tcopy,\n\tdisplay,\n\tstorageKeyPrefix,\n}: AssetSectionProps) {\n\t// Constants\n\tconst DEFAULT_LIGHT_BG = \"#eeeeee\";\n\tconst DEFAULT_DARK_BG = \"#181818\";\n\tconst STORAGE_KEY_LIGHT = `${storageKeyPrefix}-light`;\n\tconst STORAGE_KEY_DARK = `${storageKeyPrefix}-dark`;\n\tconst STORAGE_KEY_MODE = `${storageKeyPrefix}-mode`;\n\n\t// Load from localStorage\n\tconst getStoredValue = (key: string, defaultValue: string) => {\n\t\ttry {\n\t\t\tconst stored = localStorage.getItem(key);\n\t\t\treturn stored !== null ? stored : defaultValue;\n\t\t} catch {\n\t\t\treturn defaultValue;\n\t\t}\n\t};\n\n\tconst setStoredValue = (key: string, value: string) => {\n\t\ttry {\n\t\t\tlocalStorage.setItem(key, value);\n\t\t} catch {}\n\t};\n\n\tconst removeStoredValue = (key: string) => {\n\t\ttry {\n\t\t\tlocalStorage.removeItem(key);\n\t\t} catch {}\n\t};\n\n\t// State\n\tconst [searchTerm, setSearchTerm] = useState(\"\");\n\tconst [currentVariant, setCurrentVariant] = useState(variants.defaultVariant);\n\tconst [toastMessage, setToastMessage] = useState<string | null>(null);\n\tconst [bgMode, setBgMode] = useState(() =>\n\t\tgetStoredValue(STORAGE_KEY_MODE, \"checkered\"),\n\t);\n\tconst [lightBgColor, setLightBgColor] = useState(() =>\n\t\tgetStoredValue(STORAGE_KEY_LIGHT, DEFAULT_LIGHT_BG),\n\t);\n\tconst [darkBgColor, setDarkBgColor] = useState(() =>\n\t\tgetStoredValue(STORAGE_KEY_DARK, DEFAULT_DARK_BG),\n\t);\n\n\t// Handlers\n\tconst handleBgModeChange = (mode: string) => {\n\t\tsetBgMode(mode);\n\t\tsetStoredValue(STORAGE_KEY_MODE, mode);\n\t};\n\n\tconst handleLightBgChange = (color: string) => {\n\t\tsetLightBgColor(color);\n\t\tsetStoredValue(STORAGE_KEY_LIGHT, color);\n\t};\n\n\tconst handleDarkBgChange = (color: string) => {\n\t\tsetDarkBgColor(color);\n\t\tsetStoredValue(STORAGE_KEY_DARK, color);\n\t};\n\n\tconst resetLightBg = () => {\n\t\tsetLightBgColor(DEFAULT_LIGHT_BG);\n\t\tremoveStoredValue(STORAGE_KEY_LIGHT);\n\t};\n\n\tconst resetDarkBg = () => {\n\t\tsetDarkBgColor(DEFAULT_DARK_BG);\n\t\tremoveStoredValue(STORAGE_KEY_DARK);\n\t};\n\n\tconst isLightVariant = currentVariant === \"light\";\n\n\tconst getPreviewBackground = () => {\n\t\tif (bgMode === \"checkered\") {\n\t\t\treturn \"repeating-conic-gradient(#e0e0e0 0% 25%, #ffffff 0% 50%) 50% / 16px 16px\";\n\t\t}\n\t\t// Inverse mode: use opposite background of the variant\n\t\treturn isLightVariant ? darkBgColor : lightBgColor;\n\t};\n\n\tconst showToast = (message: string) => {\n\t\tsetToastMessage(message);\n\t\tsetTimeout(() => setToastMessage(null), 2000);\n\t};\n\n\tconst copyToClipboard = (text: string, type: string) => {\n\t\tnavigator.clipboard.writeText(text).then(() => {\n\t\t\tshowToast(`${type} copied to clipboard!`);\n\t\t});\n\t};\n\n\tconst getImportPath = (asset: Asset) => {\n\t\tif (!copy.import) return \"\";\n\t\treturn copy.import\n\t\t\t.replace(/\\{\\{name\\}\\}/g, asset.id)\n\t\t\t.replace(/\\{\\{ext\\}\\}/g, asset.ext)\n\t\t\t.replace(/\\{\\{path\\}\\}/g, asset.relativePath)\n\t\t\t.replace(/\\{\\{basename\\}\\}/g, `${asset.filename}.${asset.ext}`);\n\t};\n\n\tconst getComponentUsage = (asset: Asset) => {\n\t\tif (!copy.component) return \"\";\n\t\treturn copy.component\n\t\t\t.replace(/\\{\\{name\\}\\}/g, asset.id)\n\t\t\t.replace(/\\{\\{ext\\}\\}/g, asset.ext)\n\t\t\t.replace(/\\{\\{path\\}\\}/g, asset.relativePath)\n\t\t\t.replace(/\\{\\{basename\\}\\}/g, `${asset.filename}.${asset.ext}`);\n\t};\n\n\t// Filter assets\n\tconst filteredAssets = useMemo(() => {\n\t\tif (!searchTerm.trim()) return assets;\n\t\tconst term = searchTerm.toLowerCase();\n\t\treturn assets.filter(\n\t\t\t(asset) =>\n\t\t\t\tasset.name.toLowerCase().includes(term) ||\n\t\t\t\tasset.filename.toLowerCase().includes(term),\n\t\t);\n\t}, [assets, searchTerm]);\n\n\t// Group by folder if enabled\n\tconst groupedAssets = useMemo(() => {\n\t\tif (!groupByFolder) return new Map();\n\t\tconst groups = new Map<string, Asset[]>();\n\t\tfor (const asset of filteredAssets) {\n\t\t\tconst folder = asset.folder || \"root\";\n\t\t\tif (!groups.has(folder)) {\n\t\t\t\tgroups.set(folder, []);\n\t\t\t}\n\t\t\tgroups.get(folder)!.push(asset);\n\t\t}\n\t\treturn groups;\n\t}, [filteredAssets, groupByFolder]);\n\n\tconst renderAsset = (asset: Asset) => {\n\t\tconst imageSrc =\n\t\t\tcurrentVariant === \"dark\" && asset.variants.dark\n\t\t\t\t? asset.variants.dark\n\t\t\t\t: asset.variants.light;\n\n\t\tconst hasCopyAction = copy.import || copy.component;\n\t\tconst copyType = copy.import ? \"Import\" : \"Component\";\n\t\tconst copyText = copy.import\n\t\t\t? getImportPath(asset)\n\t\t\t: getComponentUsage(asset);\n\n\t\treturn (\n\t\t\t<AssetCard\n\t\t\t\tkey={asset.id}\n\t\t\t\tclassName=\"asset-card\"\n\t\t\t\tonClick={() => hasCopyAction && copyToClipboard(copyText, copyType)}\n\t\t\t>\n\t\t\t\t<AssetPreview\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\twidth: `${display.previewSize}px`,\n\t\t\t\t\t\theight: `${display.previewSize}px`,\n\t\t\t\t\t\tbackground: getPreviewBackground(),\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<AssetImage src={imageSrc} alt={asset.name} />\n\t\t\t\t</AssetPreview>\n\t\t\t\t<AssetName>{asset.name}</AssetName>\n\t\t\t\t{display.showFilename && (\n\t\t\t\t\t<AssetFilename>\n\t\t\t\t\t\t{asset.filename}.{asset.ext}\n\t\t\t\t\t</AssetFilename>\n\t\t\t\t)}\n\t\t\t\t{hasCopyAction && (\n\t\t\t\t\t<CopyButtons>\n\t\t\t\t\t\t<CopyButton\n\t\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\tcopyToClipboard(copyText, copyType);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{copyType}\n\t\t\t\t\t\t</CopyButton>\n\t\t\t\t\t</CopyButtons>\n\t\t\t\t)}\n\t\t\t</AssetCard>\n\t\t);\n\t};\n\n\tconst renderGroupedAssets = () => {\n\t\tconst entries = Array.from(groupedAssets.entries());\n\t\treturn entries.map(([folder, assets]) => (\n\t\t\t<FolderSection key={folder}>\n\t\t\t\t<FolderTitle>{folder === \"root\" ? \"Root\" : folder}</FolderTitle>\n\t\t\t\t<div\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tdisplay: \"grid\",\n\t\t\t\t\t\tgridTemplateColumns: `repeat(auto-fill, minmax(${display.previewSize + 40}px, 1fr))`,\n\t\t\t\t\t\tgap: \"24px\",\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{assets.map(renderAsset)}\n\t\t\t\t</div>\n\t\t\t</FolderSection>\n\t\t));\n\t};\n\n\treturn (\n\t\t<Wrapper>\n\t\t\t<Container>\n\t\t\t\t<Title>{title}</Title>\n\t\t\t\t{description && <Description>{description}</Description>}\n\n\t\t\t\t<ControlsBar>\n\t\t\t\t\t<SearchInput\n\t\t\t\t\t\tvalue={searchTerm}\n\t\t\t\t\t\tonChange={(e) => setSearchTerm(e.target.value)}\n\t\t\t\t\t\tplaceholder={`Search ${title.toLowerCase()}...`}\n\t\t\t\t\t/>\n\n\t\t\t\t\t{variants.enabled && (\n\t\t\t\t\t\t<VariantToggle\n\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\tsetCurrentVariant((v) => (v === \"light\" ? \"dark\" : \"light\"))\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{currentVariant === \"light\" ? \"Light\" : \"Dark\"}\n\t\t\t\t\t\t</VariantToggle>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<BackgroundControls>\n\t\t\t\t\t\t<BackgroundToggle>\n\t\t\t\t\t\t\t<ToggleOption\n\t\t\t\t\t\t\t\tdata-active={bgMode === \"inverse\"}\n\t\t\t\t\t\t\t\tonClick={() => handleBgModeChange(\"inverse\")}\n\t\t\t\t\t\t\t\ttitle=\"Inverse background\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<InverseIcon />\n\t\t\t\t\t\t\t</ToggleOption>\n\t\t\t\t\t\t\t<ToggleOption\n\t\t\t\t\t\t\t\tdata-active={bgMode === \"checkered\"}\n\t\t\t\t\t\t\t\tonClick={() => handleBgModeChange(\"checkered\")}\n\t\t\t\t\t\t\t\ttitle=\"Checkered background\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<CheckerboardIcon />\n\t\t\t\t\t\t\t</ToggleOption>\n\t\t\t\t\t\t</BackgroundToggle>\n\n\t\t\t\t\t\t{bgMode === \"inverse\" && (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<ColorPickerGroup>\n\t\t\t\t\t\t\t\t\t<ColorLabel>Light</ColorLabel>\n\t\t\t\t\t\t\t\t\t<ColorInput\n\t\t\t\t\t\t\t\t\t\ttype=\"color\"\n\t\t\t\t\t\t\t\t\t\tvalue={lightBgColor}\n\t\t\t\t\t\t\t\t\t\tonChange={(e) => handleLightBgChange(e.target.value)}\n\t\t\t\t\t\t\t\t\t\ttitle=\"Background for dark illustrations\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t{lightBgColor !== DEFAULT_LIGHT_BG && (\n\t\t\t\t\t\t\t\t\t\t<ResetButton\n\t\t\t\t\t\t\t\t\t\t\tonClick={resetLightBg}\n\t\t\t\t\t\t\t\t\t\t\ttitle=\"Reset to default\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<ResetIcon />\n\t\t\t\t\t\t\t\t\t\t</ResetButton>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</ColorPickerGroup>\n\t\t\t\t\t\t\t\t<ColorPickerGroup>\n\t\t\t\t\t\t\t\t\t<ColorLabel>Dark</ColorLabel>\n\t\t\t\t\t\t\t\t\t<ColorInput\n\t\t\t\t\t\t\t\t\t\ttype=\"color\"\n\t\t\t\t\t\t\t\t\t\tvalue={darkBgColor}\n\t\t\t\t\t\t\t\t\t\tonChange={(e) => handleDarkBgChange(e.target.value)}\n\t\t\t\t\t\t\t\t\t\ttitle=\"Background for light illustrations\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t{darkBgColor !== DEFAULT_DARK_BG && (\n\t\t\t\t\t\t\t\t\t\t<ResetButton onClick={resetDarkBg} title=\"Reset to default\">\n\t\t\t\t\t\t\t\t\t\t\t<ResetIcon />\n\t\t\t\t\t\t\t\t\t\t</ResetButton>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</ColorPickerGroup>\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</BackgroundControls>\n\t\t\t\t</ControlsBar>\n\n\t\t\t\t{filteredAssets.length === 0 ? (\n\t\t\t\t\t<NoResults>\n\t\t\t\t\t\tNo {title.toLowerCase()} found matching \"{searchTerm}\"\n\t\t\t\t\t</NoResults>\n\t\t\t\t) : groupByFolder ? (\n\t\t\t\t\trenderGroupedAssets()\n\t\t\t\t) : (\n\t\t\t\t\t<div\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tdisplay: \"grid\",\n\t\t\t\t\t\t\tgridTemplateColumns: `repeat(auto-fill, minmax(${display.previewSize + 40}px, 1fr))`,\n\t\t\t\t\t\t\tgap: \"24px\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{filteredAssets.map(renderAsset)}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{toastMessage && <Toast>{toastMessage}</Toast>}\n\t\t\t</Container>\n\t\t</Wrapper>\n\t);\n}\n\n/**\n * Props for export-only mode (no wrapper, just the grid component).\n */\nexport interface AssetGridProps\n\textends Omit<AssetSectionProps, \"title\" | \"description\"> {\n\t/** Grid column configuration */\n\tcolumns?: number;\n}\n\n/**\n * Asset grid component for export-only mode (no page wrapper).\n */\nexport function AssetGrid(props: AssetGridProps) {\n\t// Reuse AssetSection but without the wrapper\n\tconst { columns = 4, ...rest } = props;\n\n\treturn (\n\t\t<AssetSection\n\t\t\ttitle=\"\"\n\t\t\tdescription=\"\"\n\t\t\tdisplay={{ ...rest.display, previewSize: rest.display.previewSize }}\n\t\t\t{...rest}\n\t\t/>\n\t);\n}\n"]}
|
|
@@ -416,11 +416,11 @@ function AssetSection({
|
|
|
416
416
|
};
|
|
417
417
|
const getImportPath = (asset) => {
|
|
418
418
|
if (!copy.import) return "";
|
|
419
|
-
return copy.import.replace(/\{\{name\}\}/g, asset.id).replace(/\{\{ext\}\}/g, asset.ext).replace(/\{\{path\}\}/g, asset.relativePath).replace(/\{\{basename\}\}/g, asset.filename
|
|
419
|
+
return copy.import.replace(/\{\{name\}\}/g, asset.id).replace(/\{\{ext\}\}/g, asset.ext).replace(/\{\{path\}\}/g, asset.relativePath).replace(/\{\{basename\}\}/g, `${asset.filename}.${asset.ext}`);
|
|
420
420
|
};
|
|
421
421
|
const getComponentUsage = (asset) => {
|
|
422
422
|
if (!copy.component) return "";
|
|
423
|
-
return copy.component.replace(/\{\{name\}\}/g, asset.id).replace(/\{\{ext\}\}/g, asset.ext).replace(/\{\{path\}\}/g, asset.relativePath).replace(/\{\{basename\}\}/g, asset.filename
|
|
423
|
+
return copy.component.replace(/\{\{name\}\}/g, asset.id).replace(/\{\{ext\}\}/g, asset.ext).replace(/\{\{path\}\}/g, asset.relativePath).replace(/\{\{basename\}\}/g, `${asset.filename}.${asset.ext}`);
|
|
424
424
|
};
|
|
425
425
|
const filteredAssets = useMemo(() => {
|
|
426
426
|
if (!searchTerm.trim()) return assets;
|