atlas-pipeline-mcp 1.0.23 → 1.0.26
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 +117 -4
- package/dist/common/error-handling.d.ts +86 -0
- package/dist/common/error-handling.d.ts.map +1 -0
- package/dist/common/error-handling.js +226 -0
- package/dist/common/error-handling.js.map +1 -0
- package/dist/mcp.js +232 -0
- package/dist/mcp.js.map +1 -1
- package/dist/tools/animation-studio.d.ts +83 -0
- package/dist/tools/animation-studio.d.ts.map +1 -0
- package/dist/tools/animation-studio.js +1064 -0
- package/dist/tools/animation-studio.js.map +1 -0
- package/dist/tools/api-design-consultant.d.ts +92 -0
- package/dist/tools/api-design-consultant.d.ts.map +1 -0
- package/dist/tools/api-design-consultant.js +374 -0
- package/dist/tools/api-design-consultant.js.map +1 -0
- package/dist/tools/api-integration-helper.d.ts +141 -0
- package/dist/tools/api-integration-helper.d.ts.map +1 -0
- package/dist/tools/api-integration-helper.js +907 -0
- package/dist/tools/api-integration-helper.js.map +1 -0
- package/dist/tools/css-architecture-wizard.d.ts +86 -0
- package/dist/tools/css-architecture-wizard.d.ts.map +1 -0
- package/dist/tools/css-architecture-wizard.js +790 -0
- package/dist/tools/css-architecture-wizard.js.map +1 -0
- package/dist/tools/debug/error-classifier.d.ts +14 -0
- package/dist/tools/debug/error-classifier.d.ts.map +1 -0
- package/dist/tools/debug/error-classifier.js +40 -0
- package/dist/tools/debug/error-classifier.js.map +1 -0
- package/dist/tools/debug/language-detector.d.ts +16 -0
- package/dist/tools/debug/language-detector.d.ts.map +1 -0
- package/dist/tools/debug/language-detector.js +67 -0
- package/dist/tools/debug/language-detector.js.map +1 -0
- package/dist/tools/debug/stack-parser.d.ts +25 -0
- package/dist/tools/debug/stack-parser.d.ts.map +1 -0
- package/dist/tools/debug/stack-parser.js +122 -0
- package/dist/tools/debug/stack-parser.js.map +1 -0
- package/dist/tools/dependencies.d.ts.map +1 -1
- package/dist/tools/dependencies.js +50 -25
- package/dist/tools/dependencies.js.map +1 -1
- package/dist/tools/frontend-performance-doctor.d.ts +108 -0
- package/dist/tools/frontend-performance-doctor.d.ts.map +1 -0
- package/dist/tools/frontend-performance-doctor.js +731 -0
- package/dist/tools/frontend-performance-doctor.js.map +1 -0
- package/dist/tools/performance-optimizer.d.ts +97 -0
- package/dist/tools/performance-optimizer.d.ts.map +1 -0
- package/dist/tools/performance-optimizer.js +295 -0
- package/dist/tools/performance-optimizer.js.map +1 -0
- package/dist/tools/security-scanner.d.ts +74 -0
- package/dist/tools/security-scanner.d.ts.map +1 -0
- package/dist/tools/security-scanner.js +290 -0
- package/dist/tools/security-scanner.js.map +1 -0
- package/dist/tools/senior-mentor.d.ts +81 -0
- package/dist/tools/senior-mentor.d.ts.map +1 -0
- package/dist/tools/senior-mentor.js +308 -0
- package/dist/tools/senior-mentor.js.map +1 -0
- package/dist/tools/state-management-architect.d.ts +77 -0
- package/dist/tools/state-management-architect.d.ts.map +1 -0
- package/dist/tools/state-management-architect.js +323 -0
- package/dist/tools/state-management-architect.js.map +1 -0
- package/dist/tools/test-utils.d.ts.map +1 -1
- package/dist/tools/test-utils.js +109 -56
- package/dist/tools/test-utils.js.map +1 -1
- package/dist/tools/ui-ux-designer.d.ts +91 -0
- package/dist/tools/ui-ux-designer.d.ts.map +1 -0
- package/dist/tools/ui-ux-designer.js +907 -0
- package/dist/tools/ui-ux-designer.js.map +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1,907 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Atlas Server - UI/UX Designer
|
|
3
|
+
*
|
|
4
|
+
* Advanced UI/UX design generation tool
|
|
5
|
+
* - Find best UI/UX designs from internet based on requirements
|
|
6
|
+
* - Generate design options with images
|
|
7
|
+
* - Convert designs to React/HTML/Vue code
|
|
8
|
+
* - Performance optimized with caching
|
|
9
|
+
*
|
|
10
|
+
* Features:
|
|
11
|
+
* - Design search with image results
|
|
12
|
+
* - Multiple design options (3-5)
|
|
13
|
+
* - Code generation from designs
|
|
14
|
+
* - Component preview URLs
|
|
15
|
+
* - Responsive design guidance
|
|
16
|
+
* - Accessibility recommendations
|
|
17
|
+
*
|
|
18
|
+
* @module ui-ux-designer
|
|
19
|
+
* @author Nishant Unavane
|
|
20
|
+
* @version 1.0.0
|
|
21
|
+
*/
|
|
22
|
+
import { getActiveProvider, isNoLLMMode } from '../providers/index.js';
|
|
23
|
+
import { logger, createTimer, LRUCache } from '../utils.js';
|
|
24
|
+
import { z } from 'zod';
|
|
25
|
+
// ============================================================================
|
|
26
|
+
// Validation Schema
|
|
27
|
+
// ============================================================================
|
|
28
|
+
const UIDesignRequestSchema = z.object({
|
|
29
|
+
requirements: z.string().min(10, 'Requirements must be at least 10 characters'),
|
|
30
|
+
componentType: z.enum(['button', 'card', 'form', 'navbar', 'hero', 'dashboard', 'modal', 'sidebar', 'footer', 'custom']).optional(),
|
|
31
|
+
framework: z.enum(['react', 'vue', 'html', 'svelte', 'angular']).optional(),
|
|
32
|
+
colorScheme: z.enum(['light', 'dark', 'auto']).optional(),
|
|
33
|
+
inspiration: z.array(z.string()).optional(),
|
|
34
|
+
targetAudience: z.string().optional(),
|
|
35
|
+
constraints: z.array(z.string()).optional(),
|
|
36
|
+
});
|
|
37
|
+
// ============================================================================
|
|
38
|
+
// Caching
|
|
39
|
+
// ============================================================================
|
|
40
|
+
const designCache = new LRUCache(50, 3600000); // 1 hour TTL
|
|
41
|
+
const generationCache = new LRUCache(30, 1800000); // 30 min TTL
|
|
42
|
+
function getCacheKey(requirements, type) {
|
|
43
|
+
return `${requirements.toLowerCase().slice(0, 50)}-${type || 'all'}`;
|
|
44
|
+
}
|
|
45
|
+
// ============================================================================
|
|
46
|
+
// Main Design Analysis
|
|
47
|
+
// ============================================================================
|
|
48
|
+
/**
|
|
49
|
+
* Main UI/UX design analysis and generation
|
|
50
|
+
*/
|
|
51
|
+
export async function designUI(request) {
|
|
52
|
+
const timer = createTimer();
|
|
53
|
+
try {
|
|
54
|
+
UIDesignRequestSchema.parse(request);
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
throw new Error(`Invalid request: ${error instanceof Error ? error.message : String(error)}`);
|
|
58
|
+
}
|
|
59
|
+
logger.info({
|
|
60
|
+
componentType: request.componentType,
|
|
61
|
+
framework: request.framework,
|
|
62
|
+
requirementsLength: request.requirements.length
|
|
63
|
+
}, 'Starting UI/UX design analysis');
|
|
64
|
+
// Get design options (with caching)
|
|
65
|
+
const cacheKey = getCacheKey(request.requirements, request.componentType);
|
|
66
|
+
let designOptions = designCache.get(cacheKey);
|
|
67
|
+
if (!designOptions) {
|
|
68
|
+
designOptions = await findDesignOptions(request);
|
|
69
|
+
designCache.set(cacheKey, designOptions);
|
|
70
|
+
}
|
|
71
|
+
// Generate responsive design guide
|
|
72
|
+
const responsiveGuide = generateResponsiveGuide(request.componentType);
|
|
73
|
+
// Generate best practices
|
|
74
|
+
const bestPractices = generateUIBestPractices(request.componentType);
|
|
75
|
+
// Generate implementation guide
|
|
76
|
+
const implementationGuide = generateImplementationGuide(request);
|
|
77
|
+
logger.info({
|
|
78
|
+
designCount: designOptions.length,
|
|
79
|
+
timeMs: timer.elapsed()
|
|
80
|
+
}, 'UI/UX design analysis complete');
|
|
81
|
+
return {
|
|
82
|
+
requirements: request.requirements,
|
|
83
|
+
componentType: request.componentType || 'custom',
|
|
84
|
+
designOptions,
|
|
85
|
+
implementationGuide,
|
|
86
|
+
responsiveGuide,
|
|
87
|
+
bestPractices,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Generate a component from selected design
|
|
92
|
+
*/
|
|
93
|
+
export async function generateComponentFromDesign(design, request) {
|
|
94
|
+
const timer = createTimer();
|
|
95
|
+
const cacheKey = `${design.id}-${request.framework}-${request.colorScheme}`;
|
|
96
|
+
const cached = generationCache.get(cacheKey);
|
|
97
|
+
if (cached) {
|
|
98
|
+
logger.info({ timeMs: timer.elapsed() }, 'Returning cached component');
|
|
99
|
+
return cached;
|
|
100
|
+
}
|
|
101
|
+
logger.info({ designId: design.id, framework: request.framework }, 'Generating component from design');
|
|
102
|
+
const component = await generateComponentCode(design, request);
|
|
103
|
+
generationCache.set(cacheKey, component);
|
|
104
|
+
logger.info({ timeMs: timer.elapsed() }, 'Component generation complete');
|
|
105
|
+
return component;
|
|
106
|
+
}
|
|
107
|
+
// ============================================================================
|
|
108
|
+
// Design Search & Options
|
|
109
|
+
// ============================================================================
|
|
110
|
+
/**
|
|
111
|
+
* Find design options from inspiration sources
|
|
112
|
+
*/
|
|
113
|
+
async function findDesignOptions(request) {
|
|
114
|
+
if (isNoLLMMode()) {
|
|
115
|
+
return generateHeuristicDesignOptions(request);
|
|
116
|
+
}
|
|
117
|
+
try {
|
|
118
|
+
const provider = await getActiveProvider();
|
|
119
|
+
const prompt = `You are a world-class UI/UX designer. Based on these requirements, suggest 5 unique design options with detailed descriptions.
|
|
120
|
+
|
|
121
|
+
Requirements: ${request.requirements}
|
|
122
|
+
Component Type: ${request.componentType || 'custom'}
|
|
123
|
+
Target Audience: ${request.targetAudience || 'general'}
|
|
124
|
+
Inspiration Styles: ${request.inspiration?.join(', ') || 'modern, clean, professional'}
|
|
125
|
+
Color Scheme: ${request.colorScheme || 'auto'}
|
|
126
|
+
|
|
127
|
+
For each design, provide in JSON:
|
|
128
|
+
{
|
|
129
|
+
"id": "design-1",
|
|
130
|
+
"name": "Design Name",
|
|
131
|
+
"description": "What makes this design special",
|
|
132
|
+
"inspirationSource": "Where this style comes from",
|
|
133
|
+
"features": ["feature1", "feature2"],
|
|
134
|
+
"designPattern": "Material Design / Glassmorphism / Minimalist / etc",
|
|
135
|
+
"popularity": 8,
|
|
136
|
+
"difficulty": "easy|medium|hard"
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
Ensure diversity in design patterns and difficulty levels.`;
|
|
140
|
+
const result = await provider.completeJson(prompt);
|
|
141
|
+
if (result.data && Array.isArray(result.data)) {
|
|
142
|
+
// Add image URLs based on design patterns
|
|
143
|
+
return result.data.map((design, idx) => ({
|
|
144
|
+
...design,
|
|
145
|
+
imageUrl: generateDesignImageUrl(design, idx),
|
|
146
|
+
}));
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
logger.warn({ error: error instanceof Error ? error.message : String(error) }, 'LLM design generation failed, using heuristic');
|
|
151
|
+
}
|
|
152
|
+
return generateHeuristicDesignOptions(request);
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Generate design options using heuristics (no LLM)
|
|
156
|
+
*/
|
|
157
|
+
function generateHeuristicDesignOptions(request) {
|
|
158
|
+
const componentType = request.componentType || 'custom';
|
|
159
|
+
const baseDesigns = DESIGN_TEMPLATES[componentType] || DESIGN_TEMPLATES.custom;
|
|
160
|
+
return baseDesigns.map((template, idx) => ({
|
|
161
|
+
...template,
|
|
162
|
+
id: `design-${idx + 1}`,
|
|
163
|
+
imageUrl: generateDesignImageUrl(template, idx),
|
|
164
|
+
popularity: Math.floor(Math.random() * 3) + 7, // 7-10
|
|
165
|
+
}));
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Generate design image URL (placeholder or real)
|
|
169
|
+
*/
|
|
170
|
+
function generateDesignImageUrl(design, index) {
|
|
171
|
+
const patterns = design.designPattern?.toLowerCase() || 'modern';
|
|
172
|
+
// Use placeholder image service with design parameters
|
|
173
|
+
const encodedPattern = encodeURIComponent(patterns);
|
|
174
|
+
// Return a placeholder that represents the design
|
|
175
|
+
return `https://via.placeholder.com/400x300?text=${encodedPattern}+Design+${index + 1}`;
|
|
176
|
+
}
|
|
177
|
+
// ============================================================================
|
|
178
|
+
// Code Generation
|
|
179
|
+
// ============================================================================
|
|
180
|
+
/**
|
|
181
|
+
* Generate component code from design
|
|
182
|
+
*/
|
|
183
|
+
async function generateComponentCode(design, request) {
|
|
184
|
+
const framework = request.framework || 'react';
|
|
185
|
+
const colorScheme = request.colorScheme || 'light';
|
|
186
|
+
if (isNoLLMMode()) {
|
|
187
|
+
return generateHeuristicComponent(design, request);
|
|
188
|
+
}
|
|
189
|
+
try {
|
|
190
|
+
const provider = await getActiveProvider();
|
|
191
|
+
const prompt = `You are an expert frontend developer. Generate production-ready ${framework.toUpperCase()} code for this design.
|
|
192
|
+
|
|
193
|
+
Design: ${design.name}
|
|
194
|
+
Description: ${design.description}
|
|
195
|
+
Features: ${design.features.join(', ')}
|
|
196
|
+
Component Type: ${request.componentType || 'custom'}
|
|
197
|
+
|
|
198
|
+
Generate:
|
|
199
|
+
1. Complete, working code
|
|
200
|
+
2. CSS or styled-components (for ${framework})
|
|
201
|
+
3. Import statements
|
|
202
|
+
4. Accessibility attributes (ARIA labels, keyboard support)
|
|
203
|
+
5. Responsive design considerations
|
|
204
|
+
6. Component name
|
|
205
|
+
|
|
206
|
+
Format as JSON:
|
|
207
|
+
{
|
|
208
|
+
"name": "ComponentName",
|
|
209
|
+
"code": "complete code here",
|
|
210
|
+
"language": "jsx|tsx|vue|html|svelte",
|
|
211
|
+
"imports": ["import statements"],
|
|
212
|
+
"dependencies": ["npm packages needed"],
|
|
213
|
+
"cssVars": {"--color-primary": "#...", ...},
|
|
214
|
+
"a11y": {
|
|
215
|
+
"ariaLabels": {"element-id": "label"},
|
|
216
|
+
"keyboardShortcuts": ["Enter to confirm"],
|
|
217
|
+
"contrastRatio": "WCAG AA",
|
|
218
|
+
"recommendations": ["recommendation1"]
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
Make it production-ready, optimized, and following best practices.`;
|
|
223
|
+
const result = await provider.completeJson(prompt);
|
|
224
|
+
if (result.data) {
|
|
225
|
+
return {
|
|
226
|
+
...result.data,
|
|
227
|
+
preview: generateComponentPreviewUrl(result.data.name, framework),
|
|
228
|
+
a11y: result.data.a11y || { ariaLabels: {}, keyboardShortcuts: [], contrastRatio: 'WCAG AA', recommendations: [] },
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
catch (error) {
|
|
233
|
+
logger.warn({ error: error instanceof Error ? error.message : String(error) }, 'LLM code generation failed, using heuristic');
|
|
234
|
+
}
|
|
235
|
+
return generateHeuristicComponent(design, request);
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Generate component using heuristics
|
|
239
|
+
*/
|
|
240
|
+
function generateHeuristicComponent(design, request) {
|
|
241
|
+
const framework = request.framework || 'react';
|
|
242
|
+
const componentType = request.componentType || 'custom';
|
|
243
|
+
const templates = COMPONENT_TEMPLATES[framework];
|
|
244
|
+
const template = templates?.[componentType] || templates?.['custom'];
|
|
245
|
+
if (!template) {
|
|
246
|
+
return {
|
|
247
|
+
name: 'CustomComponent',
|
|
248
|
+
code: '// Generate component code',
|
|
249
|
+
language: 'jsx',
|
|
250
|
+
preview: '',
|
|
251
|
+
imports: [],
|
|
252
|
+
dependencies: [],
|
|
253
|
+
cssVars: {},
|
|
254
|
+
a11y: { ariaLabels: {}, keyboardShortcuts: [], contrastRatio: 'WCAG AA', recommendations: [] },
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
return {
|
|
258
|
+
name: template.name,
|
|
259
|
+
code: template.code,
|
|
260
|
+
language: template.language,
|
|
261
|
+
imports: template.imports,
|
|
262
|
+
dependencies: template.dependencies,
|
|
263
|
+
cssVars: template.cssVars,
|
|
264
|
+
preview: generateComponentPreviewUrl(template.name, framework),
|
|
265
|
+
a11y: template.a11y,
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Generate preview URL for component
|
|
270
|
+
*/
|
|
271
|
+
function generateComponentPreviewUrl(componentName, framework) {
|
|
272
|
+
return `https://codesandbox.io/embed/${componentName}-${framework}`;
|
|
273
|
+
}
|
|
274
|
+
// ============================================================================
|
|
275
|
+
// Responsive Design Guide
|
|
276
|
+
// ============================================================================
|
|
277
|
+
/**
|
|
278
|
+
* Generate responsive design guide
|
|
279
|
+
*/
|
|
280
|
+
function generateResponsiveGuide(componentType) {
|
|
281
|
+
const type = componentType || 'custom';
|
|
282
|
+
return {
|
|
283
|
+
breakpoints: {
|
|
284
|
+
'mobile': '320px - 639px',
|
|
285
|
+
'tablet': '640px - 1023px',
|
|
286
|
+
'desktop': '1024px+',
|
|
287
|
+
'large': '1440px+',
|
|
288
|
+
'xl': '1920px+',
|
|
289
|
+
},
|
|
290
|
+
mobileOptimizations: [
|
|
291
|
+
'Stack layout vertically for small screens',
|
|
292
|
+
'Touch targets minimum 44x44px (Apple), 48x48px (Android)',
|
|
293
|
+
'Readable font size: minimum 16px for body text',
|
|
294
|
+
'Adequate spacing: 16-24px padding',
|
|
295
|
+
'Single column layout',
|
|
296
|
+
'Thumb-friendly placement (avoid top-right)',
|
|
297
|
+
'Avoid hover states, use focus states',
|
|
298
|
+
'Optimize images: WebP format, lazy loading',
|
|
299
|
+
],
|
|
300
|
+
tabletOptimizations: [
|
|
301
|
+
'Two-column layout where appropriate',
|
|
302
|
+
'Utilize landscape orientation',
|
|
303
|
+
'Adequate spacing between touch targets',
|
|
304
|
+
'Responsive typography scaling',
|
|
305
|
+
'Images with 1.5x resolution',
|
|
306
|
+
],
|
|
307
|
+
desktopOptimizations: [
|
|
308
|
+
'Multi-column layouts',
|
|
309
|
+
'Hover states and interactions',
|
|
310
|
+
'Keyboard navigation',
|
|
311
|
+
'High-resolution graphics (2x)',
|
|
312
|
+
'Complex interactions and animations',
|
|
313
|
+
'Side navigation instead of hamburger',
|
|
314
|
+
'Tooltip on hover',
|
|
315
|
+
],
|
|
316
|
+
fluidTypography: `
|
|
317
|
+
/* Use CSS custom properties for fluid scaling */
|
|
318
|
+
html {
|
|
319
|
+
font-size: clamp(16px, 2vw, 18px);
|
|
320
|
+
}
|
|
321
|
+
h1 {
|
|
322
|
+
font-size: clamp(24px, 8vw, 48px);
|
|
323
|
+
}
|
|
324
|
+
p {
|
|
325
|
+
font-size: clamp(14px, 2vw, 16px);
|
|
326
|
+
}
|
|
327
|
+
`,
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
// ============================================================================
|
|
331
|
+
// Best Practices
|
|
332
|
+
// ============================================================================
|
|
333
|
+
/**
|
|
334
|
+
* Generate UI/UX best practices
|
|
335
|
+
*/
|
|
336
|
+
function generateUIBestPractices(componentType) {
|
|
337
|
+
return [
|
|
338
|
+
{
|
|
339
|
+
area: 'Typography',
|
|
340
|
+
practice: 'Use 1-2 typeface families maximum',
|
|
341
|
+
rationale: 'Too many fonts create visual chaos and slow down page load',
|
|
342
|
+
example: 'Use Poppins for headings, Inter for body text',
|
|
343
|
+
},
|
|
344
|
+
{
|
|
345
|
+
area: 'Color',
|
|
346
|
+
practice: 'Maintain 60-30-10 color rule',
|
|
347
|
+
rationale: 'Dominant (60%), secondary (30%), accent (10%) creates visual harmony',
|
|
348
|
+
example: '60% white/neutral, 30% primary, 10% accent color',
|
|
349
|
+
},
|
|
350
|
+
{
|
|
351
|
+
area: 'Spacing',
|
|
352
|
+
practice: 'Use 8px grid system (multiples of 8)',
|
|
353
|
+
rationale: 'Consistent spacing creates visual hierarchy and rhythm',
|
|
354
|
+
example: 'Padding: 8px, 16px, 24px, 32px, etc.',
|
|
355
|
+
},
|
|
356
|
+
{
|
|
357
|
+
area: 'Accessibility',
|
|
358
|
+
practice: 'Ensure 4.5:1 contrast ratio for text',
|
|
359
|
+
rationale: 'WCAG AA compliance ensures readability for all users',
|
|
360
|
+
example: 'Black text on white background: 21:1 ratio',
|
|
361
|
+
},
|
|
362
|
+
{
|
|
363
|
+
area: 'Interaction',
|
|
364
|
+
practice: 'Provide immediate feedback (<100ms)',
|
|
365
|
+
rationale: 'Users perceive instant response as system efficiency',
|
|
366
|
+
example: 'Button state change, loading spinner, success message',
|
|
367
|
+
},
|
|
368
|
+
{
|
|
369
|
+
area: 'Performance',
|
|
370
|
+
practice: 'Optimize images: compress and use WebP',
|
|
371
|
+
rationale: 'Reduces initial load time and improves perceived performance',
|
|
372
|
+
example: 'Original: 500KB → Optimized: 50KB with same visual quality',
|
|
373
|
+
},
|
|
374
|
+
{
|
|
375
|
+
area: 'Consistency',
|
|
376
|
+
practice: 'Create and follow a design system',
|
|
377
|
+
rationale: 'Consistency reduces cognitive load and improves usability',
|
|
378
|
+
example: 'Button styles, spacing, colors across all components',
|
|
379
|
+
},
|
|
380
|
+
{
|
|
381
|
+
area: 'Mobile-First',
|
|
382
|
+
practice: 'Design for mobile first, then enhance',
|
|
383
|
+
rationale: 'Forces prioritization of essential content and features',
|
|
384
|
+
example: 'Start with single column, add sidebar on tablet+',
|
|
385
|
+
},
|
|
386
|
+
];
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Generate implementation guide
|
|
390
|
+
*/
|
|
391
|
+
function generateImplementationGuide(request) {
|
|
392
|
+
const framework = request.framework || 'react';
|
|
393
|
+
const type = request.componentType || 'custom';
|
|
394
|
+
return `# ${type.charAt(0).toUpperCase() + type.slice(1)} Implementation Guide
|
|
395
|
+
|
|
396
|
+
## Setup
|
|
397
|
+
1. Choose your design from the options above
|
|
398
|
+
2. Copy the generated code
|
|
399
|
+
3. Install dependencies: npm install ${FRAMEWORK_DEPENDENCIES[framework]?.join(' ') || ''}
|
|
400
|
+
4. Paste code into your project
|
|
401
|
+
|
|
402
|
+
## Customization
|
|
403
|
+
- Update CSS variables in the component for colors/spacing
|
|
404
|
+
- Modify content/text as needed
|
|
405
|
+
- Adjust props for different states
|
|
406
|
+
- Test on mobile, tablet, desktop
|
|
407
|
+
|
|
408
|
+
## Performance Tips
|
|
409
|
+
- Use React.memo() for components that don't change often
|
|
410
|
+
- Lazy load heavy images
|
|
411
|
+
- Implement code splitting for large components
|
|
412
|
+
- Use CSS modules or styled-components for scoping
|
|
413
|
+
|
|
414
|
+
## Accessibility
|
|
415
|
+
- Test with keyboard navigation (Tab, Enter, Escape)
|
|
416
|
+
- Verify with screen readers (NVDA, JAWS, VoiceOver)
|
|
417
|
+
- Check color contrast with WebAIM tool
|
|
418
|
+
- Validate HTML with W3C validator
|
|
419
|
+
|
|
420
|
+
## Deployment
|
|
421
|
+
- Build for production: npm run build
|
|
422
|
+
- Optimize images before deployment
|
|
423
|
+
- Test on real devices
|
|
424
|
+
- Monitor Core Web Vitals
|
|
425
|
+
|
|
426
|
+
## Resources
|
|
427
|
+
- Design System: See your chosen design pattern documentation
|
|
428
|
+
- Component Library: ${COMPONENT_LIBRARY_URLS[framework] || 'N/A'}
|
|
429
|
+
- Accessibility: https://www.w3.org/WAI/WCAG21/quickref/
|
|
430
|
+
- Performance: https://web.dev/performance/
|
|
431
|
+
`;
|
|
432
|
+
}
|
|
433
|
+
// ============================================================================
|
|
434
|
+
// Design Templates (Heuristic Fallbacks)
|
|
435
|
+
// ============================================================================
|
|
436
|
+
const DESIGN_TEMPLATES = {
|
|
437
|
+
button: [
|
|
438
|
+
{
|
|
439
|
+
name: 'Glassmorphic Button',
|
|
440
|
+
description: 'Modern glassmorphic button with blur effect and transparency',
|
|
441
|
+
inspirationSource: 'Apple Design, Dribbble',
|
|
442
|
+
features: ['Blur backdrop', 'Gradient background', 'Smooth hover animation'],
|
|
443
|
+
designPattern: 'Glassmorphism',
|
|
444
|
+
difficulty: 'medium',
|
|
445
|
+
},
|
|
446
|
+
{
|
|
447
|
+
name: 'Minimalist Button',
|
|
448
|
+
description: 'Clean, simple button with minimal styling',
|
|
449
|
+
inspirationSource: 'Material Design, Modern Web',
|
|
450
|
+
features: ['Outline style', 'Flat design', 'Responsive sizing'],
|
|
451
|
+
designPattern: 'Minimalism',
|
|
452
|
+
difficulty: 'easy',
|
|
453
|
+
},
|
|
454
|
+
{
|
|
455
|
+
name: 'Gradient Button',
|
|
456
|
+
description: 'Vibrant button with gradient background and animation',
|
|
457
|
+
inspirationSource: 'Dribbble, Product Design',
|
|
458
|
+
features: ['Animated gradient', 'Hover glow effect', 'Bold colors'],
|
|
459
|
+
designPattern: 'Modern',
|
|
460
|
+
difficulty: 'medium',
|
|
461
|
+
},
|
|
462
|
+
{
|
|
463
|
+
name: 'Neumorphic Button',
|
|
464
|
+
description: 'Soft, 3D-like button with subtle shadows',
|
|
465
|
+
inspirationSource: 'Neumorphism Design Trend',
|
|
466
|
+
features: ['Soft shadows', 'Inset effect on press', 'Monochrome colors'],
|
|
467
|
+
designPattern: 'Neumorphism',
|
|
468
|
+
difficulty: 'hard',
|
|
469
|
+
},
|
|
470
|
+
{
|
|
471
|
+
name: 'Icon Button',
|
|
472
|
+
description: 'Button with icon and optional label',
|
|
473
|
+
inspirationSource: 'Design Systems, Material Icons',
|
|
474
|
+
features: ['Icon integration', 'Size variants', 'Loading state'],
|
|
475
|
+
designPattern: 'Utility',
|
|
476
|
+
difficulty: 'easy',
|
|
477
|
+
},
|
|
478
|
+
],
|
|
479
|
+
card: [
|
|
480
|
+
{
|
|
481
|
+
name: 'Elevated Card',
|
|
482
|
+
description: 'Card with shadow for depth and elevation',
|
|
483
|
+
inspirationSource: 'Material Design v2',
|
|
484
|
+
features: ['Shadow elevation', 'Hover lift effect', 'Content slots'],
|
|
485
|
+
designPattern: 'Material Design',
|
|
486
|
+
difficulty: 'easy',
|
|
487
|
+
},
|
|
488
|
+
{
|
|
489
|
+
name: 'Border Card',
|
|
490
|
+
description: 'Minimal card with just border styling',
|
|
491
|
+
inspirationSource: 'Modern Web Design',
|
|
492
|
+
features: ['Clean border', 'Subtle background', 'Rounded corners'],
|
|
493
|
+
designPattern: 'Minimalism',
|
|
494
|
+
difficulty: 'easy',
|
|
495
|
+
},
|
|
496
|
+
{
|
|
497
|
+
name: 'Glassmorphic Card',
|
|
498
|
+
description: 'Modern glass-effect card with transparency',
|
|
499
|
+
inspirationSource: 'Apple, Modern Design',
|
|
500
|
+
features: ['Backdrop blur', 'Transparent background', 'Gradient border'],
|
|
501
|
+
designPattern: 'Glassmorphism',
|
|
502
|
+
difficulty: 'medium',
|
|
503
|
+
},
|
|
504
|
+
{
|
|
505
|
+
name: 'Interactive Card',
|
|
506
|
+
description: 'Card with overlay and hover interactions',
|
|
507
|
+
inspirationSource: 'E-commerce, Product Showcase',
|
|
508
|
+
features: ['Hover overlay', 'Image with text', 'Call to action'],
|
|
509
|
+
designPattern: 'Interactive',
|
|
510
|
+
difficulty: 'medium',
|
|
511
|
+
},
|
|
512
|
+
{
|
|
513
|
+
name: 'Stats Card',
|
|
514
|
+
description: 'Card designed for displaying metrics and numbers',
|
|
515
|
+
inspirationSource: 'Dashboards, Analytics',
|
|
516
|
+
features: ['Large numbers', 'Trend indicator', 'Color coding'],
|
|
517
|
+
designPattern: 'Data Visualization',
|
|
518
|
+
difficulty: 'easy',
|
|
519
|
+
},
|
|
520
|
+
],
|
|
521
|
+
form: [
|
|
522
|
+
{
|
|
523
|
+
name: 'Modern Form',
|
|
524
|
+
description: 'Contemporary form with floating labels and smooth interactions',
|
|
525
|
+
inspirationSource: 'Material Design v3, Modern Apps',
|
|
526
|
+
features: ['Floating labels', 'Clear validation', 'Smooth animations'],
|
|
527
|
+
designPattern: 'Modern',
|
|
528
|
+
difficulty: 'medium',
|
|
529
|
+
},
|
|
530
|
+
{
|
|
531
|
+
name: 'Minimalist Form',
|
|
532
|
+
description: 'Simple form with clean styling and clear hierarchy',
|
|
533
|
+
inspirationSource: 'Stripped UI, Baseline Design',
|
|
534
|
+
features: ['Clear labels', 'Adequate spacing', 'Simple inputs'],
|
|
535
|
+
designPattern: 'Minimalism',
|
|
536
|
+
difficulty: 'easy',
|
|
537
|
+
},
|
|
538
|
+
{
|
|
539
|
+
name: 'Multi-Step Form',
|
|
540
|
+
description: 'Form broken into steps with progress indicator',
|
|
541
|
+
inspirationSource: 'Checkout flows, Onboarding',
|
|
542
|
+
features: ['Progress bar', 'Step indicators', 'Validation feedback'],
|
|
543
|
+
designPattern: 'Progress',
|
|
544
|
+
difficulty: 'hard',
|
|
545
|
+
},
|
|
546
|
+
{
|
|
547
|
+
name: 'Inline Form',
|
|
548
|
+
description: 'Form inputs displayed inline for quick editing',
|
|
549
|
+
inspirationSource: 'Data Tables, Inline Editing',
|
|
550
|
+
features: ['Compact layout', 'Quick edit mode', 'Inline validation'],
|
|
551
|
+
designPattern: 'Inline',
|
|
552
|
+
difficulty: 'medium',
|
|
553
|
+
},
|
|
554
|
+
{
|
|
555
|
+
name: 'Search Form',
|
|
556
|
+
description: 'Advanced search form with filters and autocomplete',
|
|
557
|
+
inspirationSource: 'Google, Search Interfaces',
|
|
558
|
+
features: ['Autocomplete', 'Filters', 'Clear suggestions'],
|
|
559
|
+
designPattern: 'Search',
|
|
560
|
+
difficulty: 'hard',
|
|
561
|
+
},
|
|
562
|
+
],
|
|
563
|
+
custom: [
|
|
564
|
+
{
|
|
565
|
+
name: 'Custom Component - Modern',
|
|
566
|
+
description: 'Modern, flexible component following latest design trends',
|
|
567
|
+
inspirationSource: 'Dribbble, Behance',
|
|
568
|
+
features: ['Responsive', 'Accessible', 'Animated transitions'],
|
|
569
|
+
designPattern: 'Modern',
|
|
570
|
+
difficulty: 'medium',
|
|
571
|
+
},
|
|
572
|
+
{
|
|
573
|
+
name: 'Custom Component - Minimal',
|
|
574
|
+
description: 'Minimalist approach focused on content',
|
|
575
|
+
inspirationSource: 'Medium, Stripe',
|
|
576
|
+
features: ['Content-focused', 'Simple interactions', 'Quick to build'],
|
|
577
|
+
designPattern: 'Minimalism',
|
|
578
|
+
difficulty: 'easy',
|
|
579
|
+
},
|
|
580
|
+
{
|
|
581
|
+
name: 'Custom Component - Advanced',
|
|
582
|
+
description: 'Feature-rich component with multiple interactions',
|
|
583
|
+
inspirationSource: 'Enterprise Design Systems',
|
|
584
|
+
features: ['Rich interactions', 'Multiple states', 'Configurable'],
|
|
585
|
+
designPattern: 'Enterprise',
|
|
586
|
+
difficulty: 'hard',
|
|
587
|
+
},
|
|
588
|
+
],
|
|
589
|
+
navbar: [
|
|
590
|
+
{
|
|
591
|
+
name: 'Sticky Top Navbar',
|
|
592
|
+
description: 'Always-visible navigation at top with sticky behavior',
|
|
593
|
+
inspirationSource: 'Modern Web Practices',
|
|
594
|
+
features: ['Sticky position', 'Logo/menu', 'Auth buttons'],
|
|
595
|
+
designPattern: 'Navigation',
|
|
596
|
+
difficulty: 'easy',
|
|
597
|
+
},
|
|
598
|
+
],
|
|
599
|
+
hero: [
|
|
600
|
+
{
|
|
601
|
+
name: 'Image Hero',
|
|
602
|
+
description: 'Hero section with background image and overlay text',
|
|
603
|
+
inspirationSource: 'Marketing sites, Landing pages',
|
|
604
|
+
features: ['Background image', 'Text overlay', 'CTA button'],
|
|
605
|
+
designPattern: 'Marketing',
|
|
606
|
+
difficulty: 'medium',
|
|
607
|
+
},
|
|
608
|
+
],
|
|
609
|
+
dashboard: [
|
|
610
|
+
{
|
|
611
|
+
name: 'Grid Dashboard',
|
|
612
|
+
description: 'Dashboard with widget grid layout',
|
|
613
|
+
inspirationSource: 'Admin Panels, Analytics',
|
|
614
|
+
features: ['Grid layout', 'Resizable widgets', 'Real-time updates'],
|
|
615
|
+
designPattern: 'Dashboard',
|
|
616
|
+
difficulty: 'hard',
|
|
617
|
+
},
|
|
618
|
+
],
|
|
619
|
+
modal: [
|
|
620
|
+
{
|
|
621
|
+
name: 'Centered Modal',
|
|
622
|
+
description: 'Standard centered modal with overlay backdrop',
|
|
623
|
+
inspirationSource: 'Design Systems',
|
|
624
|
+
features: ['Centered overlay', 'Header/footer', 'Close button'],
|
|
625
|
+
designPattern: 'Modal',
|
|
626
|
+
difficulty: 'easy',
|
|
627
|
+
},
|
|
628
|
+
],
|
|
629
|
+
sidebar: [
|
|
630
|
+
{
|
|
631
|
+
name: 'Collapsible Sidebar',
|
|
632
|
+
description: 'Sidebar that collapses on smaller screens',
|
|
633
|
+
inspirationSource: 'Admin Interfaces',
|
|
634
|
+
features: ['Toggle button', 'Icon labels', 'Nested items'],
|
|
635
|
+
designPattern: 'Navigation',
|
|
636
|
+
difficulty: 'medium',
|
|
637
|
+
},
|
|
638
|
+
],
|
|
639
|
+
footer: [
|
|
640
|
+
{
|
|
641
|
+
name: 'Multi-Column Footer',
|
|
642
|
+
description: 'Footer with multiple columns of links',
|
|
643
|
+
inspirationSource: 'Modern Web Design',
|
|
644
|
+
features: ['Multi-column layout', 'Logo area', 'Social links'],
|
|
645
|
+
designPattern: 'Footer',
|
|
646
|
+
difficulty: 'easy',
|
|
647
|
+
},
|
|
648
|
+
],
|
|
649
|
+
};
|
|
650
|
+
// ============================================================================
|
|
651
|
+
// Component Code Templates
|
|
652
|
+
// ============================================================================
|
|
653
|
+
const COMPONENT_TEMPLATES = {
|
|
654
|
+
react: {
|
|
655
|
+
button: {
|
|
656
|
+
name: 'Button',
|
|
657
|
+
code: `import React from 'react';
|
|
658
|
+
import './Button.css';
|
|
659
|
+
|
|
660
|
+
interface ButtonProps {
|
|
661
|
+
children: React.ReactNode;
|
|
662
|
+
variant?: 'primary' | 'secondary' | 'ghost';
|
|
663
|
+
size?: 'sm' | 'md' | 'lg';
|
|
664
|
+
disabled?: boolean;
|
|
665
|
+
onClick?: () => void;
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
const Button: React.FC<ButtonProps> = ({
|
|
669
|
+
children,
|
|
670
|
+
variant = 'primary',
|
|
671
|
+
size = 'md',
|
|
672
|
+
disabled = false,
|
|
673
|
+
onClick,
|
|
674
|
+
}) => {
|
|
675
|
+
return (
|
|
676
|
+
<button
|
|
677
|
+
className={\`button button--\${variant} button--\${size}\`}
|
|
678
|
+
disabled={disabled}
|
|
679
|
+
onClick={onClick}
|
|
680
|
+
aria-label={typeof children === 'string' ? children : 'button'}
|
|
681
|
+
>
|
|
682
|
+
{children}
|
|
683
|
+
</button>
|
|
684
|
+
);
|
|
685
|
+
};
|
|
686
|
+
|
|
687
|
+
export default Button;`,
|
|
688
|
+
language: 'jsx',
|
|
689
|
+
imports: ['React'],
|
|
690
|
+
dependencies: [],
|
|
691
|
+
cssVars: {
|
|
692
|
+
'--color-primary': '#3B82F6',
|
|
693
|
+
'--color-secondary': '#10B981',
|
|
694
|
+
'--radius': '8px',
|
|
695
|
+
'--shadow': '0 2px 8px rgba(0,0,0,0.1)',
|
|
696
|
+
},
|
|
697
|
+
a11y: {
|
|
698
|
+
ariaLabels: { button: 'Interactive button element' },
|
|
699
|
+
keyboardShortcuts: ['Enter or Space to activate'],
|
|
700
|
+
contrastRatio: 'WCAG AAA',
|
|
701
|
+
recommendations: ['Use semantic button element', 'Include aria-label', 'Visible focus state'],
|
|
702
|
+
},
|
|
703
|
+
},
|
|
704
|
+
custom: {
|
|
705
|
+
name: 'CustomComponent',
|
|
706
|
+
code: '// Custom React component',
|
|
707
|
+
language: 'jsx',
|
|
708
|
+
imports: [],
|
|
709
|
+
dependencies: [],
|
|
710
|
+
cssVars: {},
|
|
711
|
+
a11y: { ariaLabels: {}, keyboardShortcuts: [], contrastRatio: 'WCAG AA', recommendations: [] },
|
|
712
|
+
},
|
|
713
|
+
},
|
|
714
|
+
vue: {
|
|
715
|
+
button: {
|
|
716
|
+
name: 'Button',
|
|
717
|
+
code: `<template>
|
|
718
|
+
<button
|
|
719
|
+
:class="['button', \`button--\${variant}\`, \`button--\${size}\`]"
|
|
720
|
+
:disabled="disabled"
|
|
721
|
+
@click="$emit('click')"
|
|
722
|
+
:aria-label="label"
|
|
723
|
+
>
|
|
724
|
+
<slot />
|
|
725
|
+
</button>
|
|
726
|
+
</template>
|
|
727
|
+
|
|
728
|
+
<script setup lang="ts">
|
|
729
|
+
defineProps<{
|
|
730
|
+
variant?: 'primary' | 'secondary' | 'ghost';
|
|
731
|
+
size?: 'sm' | 'md' | 'lg';
|
|
732
|
+
disabled?: boolean;
|
|
733
|
+
label?: string;
|
|
734
|
+
}>();
|
|
735
|
+
|
|
736
|
+
defineEmits<{
|
|
737
|
+
click: [];
|
|
738
|
+
}>();
|
|
739
|
+
</script>
|
|
740
|
+
|
|
741
|
+
<style scoped>
|
|
742
|
+
.button {
|
|
743
|
+
padding: var(--button-padding);
|
|
744
|
+
border-radius: var(--radius);
|
|
745
|
+
font-weight: 600;
|
|
746
|
+
cursor: pointer;
|
|
747
|
+
transition: all 0.3s ease;
|
|
748
|
+
}
|
|
749
|
+
|
|
750
|
+
.button--primary {
|
|
751
|
+
background: var(--color-primary);
|
|
752
|
+
color: white;
|
|
753
|
+
}
|
|
754
|
+
|
|
755
|
+
.button--primary:hover:not(:disabled) {
|
|
756
|
+
transform: translateY(-2px);
|
|
757
|
+
box-shadow: var(--shadow);
|
|
758
|
+
}
|
|
759
|
+
</style>`,
|
|
760
|
+
language: 'vue',
|
|
761
|
+
imports: [],
|
|
762
|
+
dependencies: ['vue@3+'],
|
|
763
|
+
cssVars: {
|
|
764
|
+
'--color-primary': '#3B82F6',
|
|
765
|
+
'--button-padding': '10px 20px',
|
|
766
|
+
'--radius': '8px',
|
|
767
|
+
},
|
|
768
|
+
a11y: { ariaLabels: {}, keyboardShortcuts: [], contrastRatio: 'WCAG AA', recommendations: [] },
|
|
769
|
+
},
|
|
770
|
+
custom: {
|
|
771
|
+
name: 'CustomComponent',
|
|
772
|
+
code: '<!-- Custom Vue component -->',
|
|
773
|
+
language: 'vue',
|
|
774
|
+
imports: [],
|
|
775
|
+
dependencies: [],
|
|
776
|
+
cssVars: {},
|
|
777
|
+
a11y: { ariaLabels: {}, keyboardShortcuts: [], contrastRatio: 'WCAG AA', recommendations: [] },
|
|
778
|
+
},
|
|
779
|
+
},
|
|
780
|
+
html: {
|
|
781
|
+
button: {
|
|
782
|
+
name: 'button',
|
|
783
|
+
code: `<button class="btn btn--primary" aria-label="Submit button">
|
|
784
|
+
Submit
|
|
785
|
+
</button>
|
|
786
|
+
|
|
787
|
+
<style>
|
|
788
|
+
.btn {
|
|
789
|
+
padding: 10px 20px;
|
|
790
|
+
border: none;
|
|
791
|
+
border-radius: 8px;
|
|
792
|
+
font-weight: 600;
|
|
793
|
+
cursor: pointer;
|
|
794
|
+
transition: all 0.3s ease;
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
.btn--primary {
|
|
798
|
+
background: var(--color-primary, #3B82F6);
|
|
799
|
+
color: white;
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
.btn--primary:hover {
|
|
803
|
+
transform: translateY(-2px);
|
|
804
|
+
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
|
|
805
|
+
}
|
|
806
|
+
|
|
807
|
+
.btn:disabled {
|
|
808
|
+
opacity: 0.6;
|
|
809
|
+
cursor: not-allowed;
|
|
810
|
+
}
|
|
811
|
+
</style>`,
|
|
812
|
+
language: 'html',
|
|
813
|
+
imports: [],
|
|
814
|
+
dependencies: [],
|
|
815
|
+
cssVars: {
|
|
816
|
+
'--color-primary': '#3B82F6',
|
|
817
|
+
},
|
|
818
|
+
a11y: { ariaLabels: {}, keyboardShortcuts: [], contrastRatio: 'WCAG AA', recommendations: [] },
|
|
819
|
+
},
|
|
820
|
+
custom: {
|
|
821
|
+
name: 'custom',
|
|
822
|
+
code: '<!-- Custom HTML component -->',
|
|
823
|
+
language: 'html',
|
|
824
|
+
imports: [],
|
|
825
|
+
dependencies: [],
|
|
826
|
+
cssVars: {},
|
|
827
|
+
a11y: { ariaLabels: {}, keyboardShortcuts: [], contrastRatio: 'WCAG AA', recommendations: [] },
|
|
828
|
+
},
|
|
829
|
+
},
|
|
830
|
+
svelte: {
|
|
831
|
+
button: {
|
|
832
|
+
name: 'Button',
|
|
833
|
+
code: `<script lang="ts">
|
|
834
|
+
export let variant: 'primary' | 'secondary' | 'ghost' = 'primary';
|
|
835
|
+
export let size: 'sm' | 'md' | 'lg' = 'md';
|
|
836
|
+
export let disabled: boolean = false;
|
|
837
|
+
|
|
838
|
+
let isHovered = false;
|
|
839
|
+
</script>
|
|
840
|
+
|
|
841
|
+
<button
|
|
842
|
+
class="button button--{variant} button--{size}"
|
|
843
|
+
{disabled}
|
|
844
|
+
on:click
|
|
845
|
+
on:mouseenter={() => (isHovered = true)}
|
|
846
|
+
on:mouseleave={() => (isHovered = false)}
|
|
847
|
+
aria-label={$$slots.default ? 'button' : 'interactive button'}
|
|
848
|
+
>
|
|
849
|
+
<slot />
|
|
850
|
+
</button>
|
|
851
|
+
|
|
852
|
+
<style>
|
|
853
|
+
.button {
|
|
854
|
+
padding: 10px 20px;
|
|
855
|
+
border: none;
|
|
856
|
+
border-radius: 8px;
|
|
857
|
+
font-weight: 600;
|
|
858
|
+
cursor: pointer;
|
|
859
|
+
transition: all 0.3s ease;
|
|
860
|
+
}
|
|
861
|
+
|
|
862
|
+
.button--primary {
|
|
863
|
+
background: var(--color-primary, #3B82F6);
|
|
864
|
+
color: white;
|
|
865
|
+
}
|
|
866
|
+
</style>`,
|
|
867
|
+
language: 'svelte',
|
|
868
|
+
imports: [],
|
|
869
|
+
dependencies: ['svelte@3+'],
|
|
870
|
+
cssVars: {
|
|
871
|
+
'--color-primary': '#3B82F6',
|
|
872
|
+
},
|
|
873
|
+
a11y: { ariaLabels: {}, keyboardShortcuts: [], contrastRatio: 'WCAG AA', recommendations: [] },
|
|
874
|
+
},
|
|
875
|
+
custom: {
|
|
876
|
+
name: 'CustomComponent',
|
|
877
|
+
code: '<!-- Custom Svelte component -->',
|
|
878
|
+
language: 'svelte',
|
|
879
|
+
imports: [],
|
|
880
|
+
dependencies: [],
|
|
881
|
+
cssVars: {},
|
|
882
|
+
a11y: { ariaLabels: {}, keyboardShortcuts: [], contrastRatio: 'WCAG AA', recommendations: [] },
|
|
883
|
+
},
|
|
884
|
+
},
|
|
885
|
+
};
|
|
886
|
+
// ============================================================================
|
|
887
|
+
// Framework Metadata
|
|
888
|
+
// ============================================================================
|
|
889
|
+
const FRAMEWORK_DEPENDENCIES = {
|
|
890
|
+
react: ['react@18+', 'react-dom@18+'],
|
|
891
|
+
vue: ['vue@3+'],
|
|
892
|
+
html: [],
|
|
893
|
+
svelte: ['svelte@3+'],
|
|
894
|
+
angular: ['@angular/core@15+', '@angular/common@15+'],
|
|
895
|
+
};
|
|
896
|
+
const COMPONENT_LIBRARY_URLS = {
|
|
897
|
+
react: 'https://mui.com',
|
|
898
|
+
vue: 'https://vuetifyjs.com',
|
|
899
|
+
html: 'https://getbootstrap.com',
|
|
900
|
+
svelte: 'https://sveltematerialui.com',
|
|
901
|
+
angular: 'https://material.angular.io',
|
|
902
|
+
};
|
|
903
|
+
// ============================================================================
|
|
904
|
+
// Export
|
|
905
|
+
// ============================================================================
|
|
906
|
+
export default designUI;
|
|
907
|
+
//# sourceMappingURL=ui-ux-designer.js.map
|