@polymorphism-tech/morph-spec 4.11.1 → 4.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/claude-plugin.json +1 -1
- package/docs/CHEATSHEET.md +1 -1
- package/docs/QUICKSTART.md +1 -1
- package/framework/agents.json +16 -6
- package/framework/hooks/claude-code/post-tool-use/agent-complete.js +122 -0
- package/framework/hooks/shared/dispatch-helpers.js +17 -0
- package/framework/skills/level-1-workflows/morph-phase-clarify/SKILL.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-codebase-analysis/SKILL.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-design/SKILL.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-implement/SKILL.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-plan/SKILL.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-setup/SKILL.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-tasks/SKILL.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-uiux/SKILL.md +248 -14
- package/framework/skills/level-1-workflows/morph-scope-escalation/SKILL.md +1 -1
- package/framework/standards/STANDARDS.json +31 -0
- package/framework/standards/frontend/design-system/aesthetic-direction.md +60 -7
- package/framework/standards/frontend/design-system/design-trends.md +171 -0
- package/framework/templates/context/CONTEXT.md +2 -2
- package/framework/templates/context/design-system.md +346 -211
- package/framework/templates/meta-prompts/squad-leaders/frontend-squad.md +1 -1
- package/package.json +1 -1
- package/src/commands/mcp/mcp-setup.js +28 -6
- package/src/commands/project/init.js +20 -1
- package/src/lib/generators/design-system-generator.js +340 -51
- package/src/lib/validators/design-system/design-system-validator.js +11 -5
- package/src/utils/hooks-installer.js +11 -1
|
@@ -1,211 +1,346 @@
|
|
|
1
|
-
# Design System — [PROJECT_NAME]
|
|
2
|
-
|
|
3
|
-
> **Template** — copy to `.morph/context/design-system.md` and fill in
|
|
4
|
-
|
|
5
|
-
Living document. All agents read this before any UI work. All design decisions land here.
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
- **
|
|
14
|
-
- **
|
|
15
|
-
- **
|
|
16
|
-
- **
|
|
17
|
-
- **
|
|
18
|
-
- **
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
--color-
|
|
33
|
-
--color-
|
|
34
|
-
|
|
35
|
-
/*
|
|
36
|
-
--color-
|
|
37
|
-
--color-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
--color-neutral-
|
|
41
|
-
--color-neutral-
|
|
42
|
-
--color-neutral-
|
|
43
|
-
--color-neutral-
|
|
44
|
-
--color-neutral-
|
|
45
|
-
--color-neutral-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
--color-
|
|
49
|
-
--color-
|
|
50
|
-
--color-
|
|
51
|
-
|
|
52
|
-
/*
|
|
53
|
-
--color-
|
|
54
|
-
--color-
|
|
55
|
-
--color-
|
|
56
|
-
--color-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
--color-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
:
|
|
71
|
-
|
|
72
|
-
--
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
/*
|
|
77
|
-
--text-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
--font-
|
|
89
|
-
--font-
|
|
90
|
-
--font-
|
|
91
|
-
|
|
92
|
-
/*
|
|
93
|
-
--
|
|
94
|
-
--
|
|
95
|
-
--
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
:
|
|
105
|
-
|
|
106
|
-
--
|
|
107
|
-
--
|
|
108
|
-
--
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
--
|
|
114
|
-
--
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
--
|
|
118
|
-
}
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
:
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
}
|
|
183
|
-
```
|
|
184
|
-
|
|
185
|
-
---
|
|
186
|
-
|
|
187
|
-
##
|
|
188
|
-
|
|
189
|
-
```css
|
|
190
|
-
:root {
|
|
191
|
-
|
|
192
|
-
--
|
|
193
|
-
--
|
|
194
|
-
--
|
|
195
|
-
--
|
|
196
|
-
--
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
1
|
+
# Design System — [PROJECT_NAME]
|
|
2
|
+
|
|
3
|
+
> **Template** — copy to `.morph/context/design-system.md` and fill in sections marked `/* CUSTOMIZE */`.
|
|
4
|
+
|
|
5
|
+
Living document. All agents read this before any UI work. All design decisions land here.
|
|
6
|
+
|
|
7
|
+
> **Ref:** Consult `framework/standards/frontend/design-system/design-trends.md` for modern techniques catalog.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Aesthetic Direction
|
|
12
|
+
|
|
13
|
+
- **Direction**: [TODO: Minimal Refined / Editorial / Soft Professional / Industrial / Modern Luxury]
|
|
14
|
+
- **Tone**: [TODO: 1-2 sentences about the feel]
|
|
15
|
+
- **Differentiator**: [TODO: The 1 memorable element of this interface]
|
|
16
|
+
- **Font Pair**: Sora Variable (display) + Plus Jakarta Sans Variable (body) /* CUSTOMIZE */
|
|
17
|
+
- **Color Philosophy**: Deep indigo dominant + Rose accent — modern, bold, not generic /* CUSTOMIZE */
|
|
18
|
+
- **Motion Personality**: spring-based, purposeful /* CUSTOMIZE */
|
|
19
|
+
- **Visual Density**: balanced /* CUSTOMIZE */
|
|
20
|
+
- **Composition**: [TODO: Layout approach — see Domain Patterns below for guidance]
|
|
21
|
+
- **Selected Trends**: [TODO: Fill from Step 1.3 trend research — e.g., Bento Grid, Glassmorphism]
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Color Tokens
|
|
26
|
+
|
|
27
|
+
```css
|
|
28
|
+
:root {
|
|
29
|
+
/* Dominant palette — deep indigo /* CUSTOMIZE */ */
|
|
30
|
+
--color-primary: #6366f1;
|
|
31
|
+
--color-primary-light: #818cf8;
|
|
32
|
+
--color-primary-dark: #4f46e5;
|
|
33
|
+
--color-primary-rgb: 99, 102, 241; /* For colored shadows: rgba(var(--color-primary-rgb), 0.3) */
|
|
34
|
+
|
|
35
|
+
/* Sharp accent — rose /* CUSTOMIZE */ */
|
|
36
|
+
--color-accent: #f43f5e;
|
|
37
|
+
--color-accent-hover: #e11d48;
|
|
38
|
+
|
|
39
|
+
/* Neutrals (dark-first) */
|
|
40
|
+
--color-neutral-50: #fafafa;
|
|
41
|
+
--color-neutral-100: #f4f4f5;
|
|
42
|
+
--color-neutral-200: #e4e4e7;
|
|
43
|
+
--color-neutral-300: #d4d4d8;
|
|
44
|
+
--color-neutral-400: #a1a1aa;
|
|
45
|
+
--color-neutral-500: #71717a;
|
|
46
|
+
--color-neutral-600: #52525b;
|
|
47
|
+
--color-neutral-700: #3f3f46;
|
|
48
|
+
--color-neutral-800: #27272a;
|
|
49
|
+
--color-neutral-900: #18181b;
|
|
50
|
+
--color-neutral-950: #09090b;
|
|
51
|
+
|
|
52
|
+
/* Surfaces (elevation via luminance — dark-first) */
|
|
53
|
+
--color-surface-0: #0a0a0f; /* Base background */
|
|
54
|
+
--color-surface-1: #12121a; /* Cards */
|
|
55
|
+
--color-surface-2: #1a1a24; /* Elevated cards, dropdowns */
|
|
56
|
+
--color-surface-3: #22222e; /* Modals, popovers */
|
|
57
|
+
--color-surface-4: #2a2a38; /* Hover states */
|
|
58
|
+
|
|
59
|
+
/* Light mode overrides (apply via .light or @media (prefers-color-scheme: light)) */
|
|
60
|
+
/* --color-surface-0: #ffffff;
|
|
61
|
+
--color-surface-1: #fafafa;
|
|
62
|
+
--color-surface-2: #f4f4f5;
|
|
63
|
+
--color-surface-3: #e4e4e7;
|
|
64
|
+
--color-surface-4: #d4d4d8; */
|
|
65
|
+
|
|
66
|
+
--color-border: rgba(255, 255, 255, 0.08);
|
|
67
|
+
|
|
68
|
+
/* Semantic */
|
|
69
|
+
--color-success: #22c55e;
|
|
70
|
+
--color-warning: #f59e0b;
|
|
71
|
+
--color-error: #ef4444;
|
|
72
|
+
--color-info: #3b82f6;
|
|
73
|
+
|
|
74
|
+
/* Text (luminance hierarchy — dark-first) */
|
|
75
|
+
--color-text-primary: #f0f0f5; /* 95% luminance */
|
|
76
|
+
--color-text-secondary: #a0a0b0; /* 65% luminance */
|
|
77
|
+
--color-text-muted: #606070; /* 40% luminance */
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Typography
|
|
84
|
+
|
|
85
|
+
```css
|
|
86
|
+
:root {
|
|
87
|
+
/* Font families — Variable Fonts /* CUSTOMIZE */ */
|
|
88
|
+
--font-display: 'Sora Variable', 'Sora', sans-serif;
|
|
89
|
+
--font-body: 'Plus Jakarta Sans Variable', 'Plus Jakarta Sans', sans-serif;
|
|
90
|
+
--font-mono: 'JetBrains Mono Variable', 'JetBrains Mono', monospace;
|
|
91
|
+
|
|
92
|
+
/* Fluid scale (clamp for responsive without breakpoints) */
|
|
93
|
+
--text-xs: clamp(0.7rem, 0.65rem + 0.25vw, 0.75rem); /* ~12px */
|
|
94
|
+
--text-sm: clamp(0.8rem, 0.75rem + 0.25vw, 0.875rem); /* ~14px */
|
|
95
|
+
--text-base: clamp(0.9rem, 0.85rem + 0.25vw, 1rem); /* ~16px */
|
|
96
|
+
--text-lg: clamp(1rem, 0.9rem + 0.5vw, 1.125rem); /* ~18px */
|
|
97
|
+
--text-xl: clamp(1.1rem, 1rem + 0.5vw, 1.25rem); /* ~20px */
|
|
98
|
+
--text-2xl: clamp(1.25rem, 1.1rem + 0.75vw, 1.5rem); /* ~24px */
|
|
99
|
+
--text-3xl: clamp(1.5rem, 1.25rem + 1.25vw, 1.875rem); /* ~30px */
|
|
100
|
+
--text-4xl: clamp(1.875rem, 1.5rem + 1.875vw, 2.25rem); /* ~36px */
|
|
101
|
+
--text-5xl: clamp(2.25rem, 1.75rem + 2.5vw, 3rem); /* ~48px */
|
|
102
|
+
|
|
103
|
+
/* Weights (variable font range) */
|
|
104
|
+
--font-weight-regular: 400;
|
|
105
|
+
--font-weight-medium: 500;
|
|
106
|
+
--font-weight-semibold: 600;
|
|
107
|
+
--font-weight-bold: 700;
|
|
108
|
+
--font-weight-extrabold: 800;
|
|
109
|
+
|
|
110
|
+
/* Line heights */
|
|
111
|
+
--leading-tight: 1.2;
|
|
112
|
+
--leading-snug: 1.35;
|
|
113
|
+
--leading-normal: 1.5;
|
|
114
|
+
--leading-relaxed: 1.75;
|
|
115
|
+
|
|
116
|
+
/* Variable font features */
|
|
117
|
+
--font-display-hover-weight: 'wght' 800; /* For interactive headings */
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## Motion Tokens
|
|
124
|
+
|
|
125
|
+
```css
|
|
126
|
+
:root {
|
|
127
|
+
/* Durations */
|
|
128
|
+
--duration-instant: 0.05s;
|
|
129
|
+
--duration-fast: 0.15s;
|
|
130
|
+
--duration-base: 0.3s;
|
|
131
|
+
--duration-slow: 0.5s;
|
|
132
|
+
--duration-slower: 0.8s;
|
|
133
|
+
|
|
134
|
+
/* Standard easings */
|
|
135
|
+
--easing-standard: cubic-bezier(0.4, 0, 0.2, 1);
|
|
136
|
+
--easing-decelerate: cubic-bezier(0, 0, 0.2, 1);
|
|
137
|
+
--easing-accelerate: cubic-bezier(0.4, 0, 1, 1);
|
|
138
|
+
|
|
139
|
+
/* Spring / bounce easings */
|
|
140
|
+
--easing-bounce: cubic-bezier(0.34, 1.56, 0.64, 1);
|
|
141
|
+
--easing-spring: cubic-bezier(0.68, -0.55, 0.265, 1.55);
|
|
142
|
+
--easing-elastic: cubic-bezier(0.175, 0.885, 0.32, 1.275);
|
|
143
|
+
|
|
144
|
+
/* Scroll-driven (use with animation-timeline: scroll()) */
|
|
145
|
+
--scroll-reveal-distance: 20px;
|
|
146
|
+
--scroll-reveal-duration: var(--duration-slow);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/* Accessibility — MANDATORY */
|
|
150
|
+
@media (prefers-reduced-motion: reduce) {
|
|
151
|
+
*, *::before, *::after {
|
|
152
|
+
animation-duration: 0.01ms !important;
|
|
153
|
+
transition-duration: 0.01ms !important;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### Framer Motion mapping (TypeScript)
|
|
159
|
+
|
|
160
|
+
```typescript
|
|
161
|
+
export const durations = {
|
|
162
|
+
instant: 0.05,
|
|
163
|
+
fast: 0.15,
|
|
164
|
+
base: 0.3,
|
|
165
|
+
slow: 0.5,
|
|
166
|
+
slower: 0.8,
|
|
167
|
+
} as const;
|
|
168
|
+
|
|
169
|
+
export const easings = {
|
|
170
|
+
standard: [0.4, 0, 0.2, 1] as const,
|
|
171
|
+
decelerate: [0, 0, 0.2, 1] as const,
|
|
172
|
+
accelerate: [0.4, 0, 1, 1] as const,
|
|
173
|
+
bounce: [0.34, 1.56, 0.64, 1] as const,
|
|
174
|
+
spring: [0.68, -0.55, 0.265, 1.55] as const,
|
|
175
|
+
elastic: [0.175, 0.885, 0.32, 1.275] as const,
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
export const springConfigs = {
|
|
179
|
+
gentle: { stiffness: 120, damping: 14 },
|
|
180
|
+
snappy: { stiffness: 300, damping: 20 },
|
|
181
|
+
bouncy: { stiffness: 400, damping: 10 },
|
|
182
|
+
} as const;
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
## Spacing Tokens
|
|
188
|
+
|
|
189
|
+
```css
|
|
190
|
+
:root {
|
|
191
|
+
/* 4px base grid */
|
|
192
|
+
--space-1: 0.25rem; /* 4px */
|
|
193
|
+
--space-2: 0.5rem; /* 8px */
|
|
194
|
+
--space-3: 0.75rem; /* 12px */
|
|
195
|
+
--space-4: 1rem; /* 16px */
|
|
196
|
+
--space-5: 1.25rem; /* 20px */
|
|
197
|
+
--space-6: 1.5rem; /* 24px */
|
|
198
|
+
--space-8: 2rem; /* 32px */
|
|
199
|
+
--space-10: 2.5rem; /* 40px */
|
|
200
|
+
--space-12: 3rem; /* 48px */
|
|
201
|
+
--space-16: 4rem; /* 64px */
|
|
202
|
+
--space-20: 5rem; /* 80px */
|
|
203
|
+
--space-24: 6rem; /* 96px */
|
|
204
|
+
|
|
205
|
+
/* Container */
|
|
206
|
+
--container-padding: var(--space-8);
|
|
207
|
+
--grid-gap: var(--space-6);
|
|
208
|
+
}
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## Border Radius Tokens
|
|
214
|
+
|
|
215
|
+
```css
|
|
216
|
+
:root {
|
|
217
|
+
--radius-none: 0;
|
|
218
|
+
--radius-sm: 0.25rem; /* 4px */
|
|
219
|
+
--radius-base: 0.375rem; /* 6px */
|
|
220
|
+
--radius-md: 0.5rem; /* 8px */
|
|
221
|
+
--radius-lg: 0.75rem; /* 12px */
|
|
222
|
+
--radius-xl: 1rem; /* 16px */
|
|
223
|
+
--radius-2xl: 1.5rem; /* 24px */
|
|
224
|
+
--radius-full: 9999px;
|
|
225
|
+
}
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
## Shadow Tokens
|
|
231
|
+
|
|
232
|
+
```css
|
|
233
|
+
:root {
|
|
234
|
+
/* Standard shadows */
|
|
235
|
+
--shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
|
|
236
|
+
--shadow-base: 0 1px 3px rgba(0, 0, 0, 0.1), 0 1px 2px rgba(0, 0, 0, 0.06);
|
|
237
|
+
--shadow-md: 0 4px 6px rgba(0, 0, 0, 0.07), 0 2px 4px rgba(0, 0, 0, 0.06);
|
|
238
|
+
--shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1), 0 4px 6px rgba(0, 0, 0, 0.05);
|
|
239
|
+
--shadow-xl: 0 20px 25px rgba(0, 0, 0, 0.1), 0 10px 10px rgba(0, 0, 0, 0.04);
|
|
240
|
+
|
|
241
|
+
/* Layered shadows (more realistic depth) */
|
|
242
|
+
--shadow-layered-sm: 0 1px 1px rgba(0,0,0,0.04), 0 2px 4px rgba(0,0,0,0.04);
|
|
243
|
+
--shadow-layered-md: 0 1px 2px rgba(0,0,0,0.03), 0 4px 8px rgba(0,0,0,0.04), 0 12px 24px rgba(0,0,0,0.05);
|
|
244
|
+
--shadow-layered-lg: 0 2px 4px rgba(0,0,0,0.02), 0 8px 16px rgba(0,0,0,0.04), 0 24px 48px rgba(0,0,0,0.06);
|
|
245
|
+
|
|
246
|
+
/* Colored shadows (use element's accent color) */
|
|
247
|
+
--shadow-colored-sm: 0 4px 14px rgba(var(--color-primary-rgb), 0.15);
|
|
248
|
+
--shadow-colored-md: 0 8px 24px rgba(var(--color-primary-rgb), 0.25);
|
|
249
|
+
--shadow-colored-lg: 0 12px 40px rgba(var(--color-primary-rgb), 0.35);
|
|
250
|
+
|
|
251
|
+
/* Interaction shadows */
|
|
252
|
+
--shadow-lift: 0 8px 30px rgba(0, 0, 0, 0.12); /* Card hover lift */
|
|
253
|
+
--shadow-focus: 0 0 0 3px rgba(var(--color-primary-rgb), 0.4); /* Focus ring */
|
|
254
|
+
}
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
---
|
|
258
|
+
|
|
259
|
+
## Design Trends (Active)
|
|
260
|
+
|
|
261
|
+
> Ref: `framework/standards/frontend/design-system/design-trends.md` for full catalog with implementation details.
|
|
262
|
+
|
|
263
|
+
Agents MUST consider these modern techniques when filling this template. Select 2-3 that fit the project's direction and domain:
|
|
264
|
+
|
|
265
|
+
| Technique | Best For | Direction Fit |
|
|
266
|
+
|-----------|----------|---------------|
|
|
267
|
+
| Bento Grid | Dashboards, landing pages | Industrial, Editorial |
|
|
268
|
+
| Glassmorphism | Navigation, overlays, cards | Soft Professional, Modern Luxury |
|
|
269
|
+
| Aurora Gradients | Hero backgrounds, empty states | Editorial, Modern Luxury |
|
|
270
|
+
| Variable Fonts | Interactive headings, responsive weight | All directions |
|
|
271
|
+
| Scroll-Driven Animations | Narratives, reveals, progress | Editorial, Modern Luxury |
|
|
272
|
+
| Perspective Cards (3D) | Product cards, pricing, features | Modern Luxury |
|
|
273
|
+
| Noise Texture | Backgrounds, surfaces | Minimal Refined |
|
|
274
|
+
| Colored Shadows | CTAs, hover states, cards | Soft Professional, Modern Luxury |
|
|
275
|
+
| Dark Mode First | Data-heavy apps, developer tools | Industrial, Minimal Refined |
|
|
276
|
+
| Fluid Typography | Responsive headings | All directions |
|
|
277
|
+
|
|
278
|
+
---
|
|
279
|
+
|
|
280
|
+
## Domain Patterns
|
|
281
|
+
|
|
282
|
+
Choose patterns based on the project domain:
|
|
283
|
+
|
|
284
|
+
| Domain | Layout | Key Components | Visual Approach |
|
|
285
|
+
|--------|--------|---------------|----------------|
|
|
286
|
+
| **SaaS Dashboard** | Bento grid + sidebar | KPI cards, data tables, charts | Controlled density, skeleton loaders, dark default |
|
|
287
|
+
| **E-commerce** | Product grid + asymmetric hero | Product cards, CTA buttons, filters | Image-first, hover lift, colored shadows on CTA |
|
|
288
|
+
| **Landing Page** | Full-width sections | Hero, features, testimonials, CTA | Aurora gradients, scroll reveals, fluid typography |
|
|
289
|
+
| **Internal Tool** | Dense sidebar + content | Forms, tables, status indicators | Minimal effects, compact spacing, monospace data |
|
|
290
|
+
| **Social/Community** | Card feed + drawer nav | Post cards, avatars, notifications | Glassmorphism overlays, spring animations |
|
|
291
|
+
|
|
292
|
+
---
|
|
293
|
+
|
|
294
|
+
## Advanced Effects
|
|
295
|
+
|
|
296
|
+
```css
|
|
297
|
+
:root {
|
|
298
|
+
/* Glassmorphism */
|
|
299
|
+
--glass-blur: 12px;
|
|
300
|
+
--glass-saturation: 180%;
|
|
301
|
+
--glass-bg-light: rgba(255, 255, 255, 0.15);
|
|
302
|
+
--glass-bg-dark: rgba(0, 0, 0, 0.25);
|
|
303
|
+
--glass-border: rgba(255, 255, 255, 0.18);
|
|
304
|
+
|
|
305
|
+
/* Aurora gradient (animate with @keyframes) */
|
|
306
|
+
--aurora-gradient: conic-gradient(from 0deg at 50% 50%,
|
|
307
|
+
var(--color-primary), var(--color-accent), #fbbf24, var(--color-primary));
|
|
308
|
+
--aurora-speed: 15s;
|
|
309
|
+
|
|
310
|
+
/* Noise texture (inline SVG) */
|
|
311
|
+
--noise-texture: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.04'/%3E%3C/svg%3E");
|
|
312
|
+
|
|
313
|
+
/* 3D / Perspective */
|
|
314
|
+
--perspective-card: perspective(1000px);
|
|
315
|
+
--perspective-hover-rotate: rotateX(-2deg) rotateY(3deg) translateZ(10px);
|
|
316
|
+
|
|
317
|
+
/* Container queries */
|
|
318
|
+
--container-sm: 400px;
|
|
319
|
+
--container-md: 600px;
|
|
320
|
+
--container-lg: 800px;
|
|
321
|
+
|
|
322
|
+
/* View Transitions (CSS) */
|
|
323
|
+
--view-transition-duration: 0.3s;
|
|
324
|
+
--view-transition-easing: var(--easing-decelerate);
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
/* View Transitions API support */
|
|
328
|
+
::view-transition-old(root),
|
|
329
|
+
::view-transition-new(root) {
|
|
330
|
+
animation-duration: var(--view-transition-duration);
|
|
331
|
+
animation-timing-function: var(--view-transition-easing);
|
|
332
|
+
}
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
---
|
|
336
|
+
|
|
337
|
+
## Changelog
|
|
338
|
+
|
|
339
|
+
> Living record — every agent that adds tokens or design decisions registers here.
|
|
340
|
+
> Format: `- YYYY-MM-DD [agent-id] Description of addition/change`
|
|
341
|
+
|
|
342
|
+
<!-- Entries below this line, newest first -->
|
|
343
|
+
|
|
344
|
+
---
|
|
345
|
+
|
|
346
|
+
*MORPH-SPEC by Polymorphism Tech*
|
|
@@ -114,7 +114,7 @@ Frontend deliverables typically include:
|
|
|
114
114
|
3. Wire up API calls/services last (after UI is structured)
|
|
115
115
|
4. Test each component with loading + error + empty states
|
|
116
116
|
5. After every 3 tasks, run: `morph-spec task done {{FEATURE_NAME}} <task-id>`
|
|
117
|
-
6. If design system validator blocks you, check `framework/standards/
|
|
117
|
+
6. If design system validator blocks you, check `framework/standards/frontend/design-system/aesthetic-direction.md` and `framework/standards/frontend/design-system/design-trends.md`
|
|
118
118
|
|
|
119
119
|
## Report Back When Done
|
|
120
120
|
Provide a summary of:
|
package/package.json
CHANGED
|
@@ -211,12 +211,17 @@ async function setupSpecificMcp(targetPath, name, stack, existingMcps) {
|
|
|
211
211
|
}]);
|
|
212
212
|
|
|
213
213
|
if (installNow) {
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
214
|
+
console.log(chalk.cyan(` Launching ${name} OAuth authentication...`));
|
|
215
|
+
try {
|
|
216
|
+
const { execSync } = await import('child_process');
|
|
217
|
+
execSync(`claude mcp add --transport http ${name} ${mcpEntry.install.config.url}`, {
|
|
218
|
+
stdio: 'inherit',
|
|
219
|
+
timeout: 120000
|
|
220
|
+
});
|
|
221
|
+
console.log(chalk.green(` ✓ ${name} MCP configured via OAuth`));
|
|
222
|
+
} catch {
|
|
223
|
+
const instructions = generateSetupInstructions(name, mcpEntry);
|
|
224
|
+
console.log(chalk.yellow(` Setup cancelled. Run later: ${instructions.cliCommand}`));
|
|
220
225
|
}
|
|
221
226
|
}
|
|
222
227
|
|
|
@@ -323,6 +328,23 @@ async function interactiveWizard(targetPath, stack, existingMcps) {
|
|
|
323
328
|
}]);
|
|
324
329
|
|
|
325
330
|
if (setupNow) {
|
|
331
|
+
// Remote MCPs — launch OAuth via claude mcp add
|
|
332
|
+
if (isRemoteMcp(entry.install.config)) {
|
|
333
|
+
console.log(chalk.cyan(` Launching ${capitalizedName} OAuth...`));
|
|
334
|
+
try {
|
|
335
|
+
const { execSync } = await import('child_process');
|
|
336
|
+
execSync(`claude mcp add --transport http ${name} ${entry.install.config.url}`, {
|
|
337
|
+
stdio: 'inherit',
|
|
338
|
+
timeout: 120000
|
|
339
|
+
});
|
|
340
|
+
console.log(chalk.green(` ✓ ${capitalizedName} configured via OAuth`));
|
|
341
|
+
} catch {
|
|
342
|
+
const instructions = generateSetupInstructions(name, entry);
|
|
343
|
+
console.log(chalk.yellow(` Setup cancelled. Run later: ${instructions.cliCommand}`));
|
|
344
|
+
}
|
|
345
|
+
continue;
|
|
346
|
+
}
|
|
347
|
+
|
|
326
348
|
const credentialValues = {};
|
|
327
349
|
for (const cred of entry.install.credentials) {
|
|
328
350
|
const { value } = await inquirer.prompt([{
|