@dv.nghiem/flowdeck 0.3.6 → 0.3.7
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/dist/agents/index.d.ts +2 -1
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/supervisor.d.ts +3 -0
- package/dist/agents/supervisor.d.ts.map +1 -0
- package/dist/config/schema.d.ts +36 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/dashboard/lib/state-reader.d.ts.map +1 -1
- package/dist/dashboard/server.mjs +0 -37
- package/dist/dashboard/types.d.ts +0 -2
- package/dist/dashboard/types.d.ts.map +1 -1
- package/dist/dashboard/views/index.ejs +0 -6
- package/dist/dashboard/views/partials/header.ejs +0 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +808 -1
- package/dist/services/agent-contract-registry.d.ts.map +1 -1
- package/dist/services/supervisor-binding.d.ts +114 -0
- package/dist/services/supervisor-binding.d.ts.map +1 -0
- package/dist/services/supervisor.test.d.ts +14 -0
- package/dist/services/supervisor.test.d.ts.map +1 -0
- package/dist/services/telemetry.d.ts +1 -1
- package/dist/services/telemetry.d.ts.map +1 -1
- package/dist/services/workflow-scorecard.d.ts +20 -0
- package/dist/services/workflow-scorecard.d.ts.map +1 -1
- package/docs/agents.md +1 -1
- package/docs/commands/fd-ask.md +1 -1
- package/docs/commands/fd-deploy-check.md +1 -1
- package/docs/commands/fd-discuss.md +1 -1
- package/docs/commands/fd-fix-bug.md +1 -1
- package/docs/commands/fd-new-feature.md +1 -1
- package/docs/commands/fd-verify.md +18 -0
- package/docs/commands/fd-write-docs.md +1 -1
- package/docs/feature-integration-architecture.md +1 -1
- package/docs/notifications.md +2 -2
- package/docs/quick-start.md +1 -1
- package/docs/skills.md +1 -1
- package/package.json +1 -1
- package/src/commands/fd-new-project.md +0 -1
- package/src/rules/common/agent-orchestration.md +1 -1
- package/src/skills/design-tokens/SKILL.md +250 -0
- package/src/skills/git-release/SKILL.md +1 -1
- package/src/skills/ui-design/SKILL.md +313 -0
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ui-design
|
|
3
|
+
description: UI/visual design patterns, component templates, and layout best practices for creating attractive websites
|
|
4
|
+
origin: Built for FlowDeck's design agent workflow
|
|
5
|
+
tags:
|
|
6
|
+
- design
|
|
7
|
+
- ui
|
|
8
|
+
- frontend
|
|
9
|
+
- templates
|
|
10
|
+
- components
|
|
11
|
+
- layout
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# UI Design Skill
|
|
15
|
+
|
|
16
|
+
This skill provides component templates, layout patterns, and design guidance for creating attractive, production-ready websites.
|
|
17
|
+
|
|
18
|
+
## Component Templates
|
|
19
|
+
|
|
20
|
+
### Buttons
|
|
21
|
+
|
|
22
|
+
```html
|
|
23
|
+
<!-- Primary Button -->
|
|
24
|
+
<button class="btn btn-primary">
|
|
25
|
+
<span>Get Started</span>
|
|
26
|
+
<svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
27
|
+
<path d="M5 12h14M12 5l7 7-7 7"/>
|
|
28
|
+
</svg>
|
|
29
|
+
</button>
|
|
30
|
+
|
|
31
|
+
<!-- CSS -->
|
|
32
|
+
.btn {
|
|
33
|
+
display: inline-flex;
|
|
34
|
+
align-items: center;
|
|
35
|
+
gap: 0.5rem;
|
|
36
|
+
padding: 0.75rem 1.5rem;
|
|
37
|
+
border-radius: var(--radius-md);
|
|
38
|
+
font-weight: 500;
|
|
39
|
+
transition: all var(--duration-fast) var(--ease-out-expo);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.btn-primary {
|
|
43
|
+
background: var(--color-interactive-primary);
|
|
44
|
+
color: white;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.btn-primary:hover {
|
|
48
|
+
transform: translateY(-1px);
|
|
49
|
+
box-shadow: var(--shadow-md);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.btn-primary:active {
|
|
53
|
+
transform: translateY(0);
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Cards
|
|
58
|
+
|
|
59
|
+
```html
|
|
60
|
+
<div class="card">
|
|
61
|
+
<div class="card-media">
|
|
62
|
+
<img src="..." alt="..." loading="lazy"/>
|
|
63
|
+
</div>
|
|
64
|
+
<div class="card-body">
|
|
65
|
+
<h3 class="card-title">Card Title</h3>
|
|
66
|
+
<p class="card-description">Supporting text that explains the card content.</p>
|
|
67
|
+
<div class="card-footer">
|
|
68
|
+
<button class="btn btn-outline">Learn More</button>
|
|
69
|
+
</div>
|
|
70
|
+
</div>
|
|
71
|
+
</div>
|
|
72
|
+
|
|
73
|
+
<!-- CSS -->
|
|
74
|
+
.card {
|
|
75
|
+
background: var(--color-surface);
|
|
76
|
+
border-radius: var(--radius-lg);
|
|
77
|
+
overflow: hidden;
|
|
78
|
+
transition: all var(--duration-normal) var(--ease-out-expo);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.card:hover {
|
|
82
|
+
transform: translateY(-2px);
|
|
83
|
+
box-shadow: var(--shadow-lg);
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Forms
|
|
88
|
+
|
|
89
|
+
```html
|
|
90
|
+
<form class="form">
|
|
91
|
+
<div class="form-group">
|
|
92
|
+
<label for="email" class="form-label">Email Address</label>
|
|
93
|
+
<input
|
|
94
|
+
type="email"
|
|
95
|
+
id="email"
|
|
96
|
+
class="form-input"
|
|
97
|
+
placeholder="you@example.com"
|
|
98
|
+
autocomplete="email"
|
|
99
|
+
/>
|
|
100
|
+
<span class="form-error">Please enter a valid email</span>
|
|
101
|
+
</div>
|
|
102
|
+
<button type="submit" class="btn btn-primary btn-full">Submit</button>
|
|
103
|
+
</form>
|
|
104
|
+
|
|
105
|
+
<!-- CSS -->
|
|
106
|
+
.form-group {
|
|
107
|
+
display: flex;
|
|
108
|
+
flex-direction: column;
|
|
109
|
+
gap: 0.5rem;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.form-input {
|
|
113
|
+
padding: 0.75rem 1rem;
|
|
114
|
+
border: 1px solid var(--color-border);
|
|
115
|
+
border-radius: var(--radius-md);
|
|
116
|
+
transition: border-color var(--duration-fast);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.form-input:focus {
|
|
120
|
+
outline: none;
|
|
121
|
+
border-color: var(--color-interactive-primary);
|
|
122
|
+
box-shadow: 0 0 0 3px var(--color-interactive-primary-alpha);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
.form-error {
|
|
126
|
+
color: var(--color-error);
|
|
127
|
+
font-size: var(--typography-caption);
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## Layout Patterns
|
|
132
|
+
|
|
133
|
+
### Hero Section
|
|
134
|
+
|
|
135
|
+
```html
|
|
136
|
+
<section class="hero">
|
|
137
|
+
<div class="hero-content">
|
|
138
|
+
<h1 class="hero-heading">Build Something Amazing</h1>
|
|
139
|
+
<p class="hero-subheading">The modern platform for creating and deploying web applications.</p>
|
|
140
|
+
<div class="hero-actions">
|
|
141
|
+
<button class="btn btn-primary btn-lg">Get Started</button>
|
|
142
|
+
<button class="btn btn-outline btn-lg">View Demo</button>
|
|
143
|
+
</div>
|
|
144
|
+
</div>
|
|
145
|
+
<div class="hero-visual">
|
|
146
|
+
<div class="hero-image"></div>
|
|
147
|
+
</div>
|
|
148
|
+
</section>
|
|
149
|
+
|
|
150
|
+
<!-- CSS -->
|
|
151
|
+
.hero {
|
|
152
|
+
display: grid;
|
|
153
|
+
grid-template-columns: 1fr 1fr;
|
|
154
|
+
gap: var(--space-section);
|
|
155
|
+
align-items: center;
|
|
156
|
+
padding: var(--space-section) 0;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
.hero-heading {
|
|
160
|
+
font-size: var(--text-hero);
|
|
161
|
+
font-weight: 700;
|
|
162
|
+
line-height: 1.1;
|
|
163
|
+
letter-spacing: -0.02em;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
.hero-subheading {
|
|
167
|
+
font-size: var(--text-lg);
|
|
168
|
+
color: var(--color-text-secondary);
|
|
169
|
+
margin-top: 1.5rem;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
.hero-actions {
|
|
173
|
+
display: flex;
|
|
174
|
+
gap: 1rem;
|
|
175
|
+
margin-top: 2rem;
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Bento Grid
|
|
180
|
+
|
|
181
|
+
```html
|
|
182
|
+
<div class="bento-grid">
|
|
183
|
+
<div class="bento-item bento-tall bento-featured">
|
|
184
|
+
<h3>Featured Content</h3>
|
|
185
|
+
<p>Larger cell spanning multiple rows</p>
|
|
186
|
+
</div>
|
|
187
|
+
<div class="bento-item">
|
|
188
|
+
<h3>Quick Stat</h3>
|
|
189
|
+
<span class="stat-value">2.4M</span>
|
|
190
|
+
</div>
|
|
191
|
+
<div class="bento-item">
|
|
192
|
+
<h3>Recent Activity</h3>
|
|
193
|
+
<p>Compact info card</p>
|
|
194
|
+
</div>
|
|
195
|
+
<div class="bento-item bento-wide">
|
|
196
|
+
<h3>Wide Card</h3>
|
|
197
|
+
<p>Spans multiple columns</p>
|
|
198
|
+
</div>
|
|
199
|
+
</div>
|
|
200
|
+
|
|
201
|
+
<!-- CSS -->
|
|
202
|
+
.bento-grid {
|
|
203
|
+
display: grid;
|
|
204
|
+
grid-template-columns: repeat(4, 1fr);
|
|
205
|
+
gap: var(--spacing-lg);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
.bento-tall { grid-row: span 2; }
|
|
209
|
+
.bento-wide { grid-column: span 2; }
|
|
210
|
+
.bento-featured { background: var(--color-accent-surface); }
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### Dashboard Layout
|
|
214
|
+
|
|
215
|
+
```html
|
|
216
|
+
<div class="dashboard">
|
|
217
|
+
<aside class="sidebar">
|
|
218
|
+
<nav class="nav">
|
|
219
|
+
<a href="#" class="nav-item active">
|
|
220
|
+
<svg class="icon"><!-- dashboard icon --></svg>
|
|
221
|
+
Dashboard
|
|
222
|
+
</a>
|
|
223
|
+
<a href="#" class="nav-item">
|
|
224
|
+
<svg class="icon"><!-- analytics icon --></svg>
|
|
225
|
+
Analytics
|
|
226
|
+
</a>
|
|
227
|
+
</nav>
|
|
228
|
+
</aside>
|
|
229
|
+
<main class="main">
|
|
230
|
+
<header class="page-header">
|
|
231
|
+
<h1>Dashboard</h1>
|
|
232
|
+
<button class="btn btn-primary">Create New</button>
|
|
233
|
+
</header>
|
|
234
|
+
<div class="stats-grid">
|
|
235
|
+
<div class="stat-card">
|
|
236
|
+
<span class="stat-label">Total Users</span>
|
|
237
|
+
<span class="stat-value">12,345</span>
|
|
238
|
+
<span class="stat-change positive">+8.2%</span>
|
|
239
|
+
</div>
|
|
240
|
+
</div>
|
|
241
|
+
</main>
|
|
242
|
+
</div>
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
## Design Token Usage
|
|
246
|
+
|
|
247
|
+
**CRITICAL**: Always use semantic tokens, never hardcoded values.
|
|
248
|
+
|
|
249
|
+
```css
|
|
250
|
+
/* WRONG - hardcoded values */
|
|
251
|
+
color: #2563eb;
|
|
252
|
+
padding: 16px;
|
|
253
|
+
font-size: 18px;
|
|
254
|
+
|
|
255
|
+
/* CORRECT - semantic tokens */
|
|
256
|
+
color: var(--color-interactive-primary);
|
|
257
|
+
padding: var(--spacing-lg);
|
|
258
|
+
font-size: var(--typography-body-lg);
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
## Animation Principles
|
|
262
|
+
|
|
263
|
+
Use compositor-friendly properties only:
|
|
264
|
+
- `transform` (translate, scale, rotate)
|
|
265
|
+
- `opacity`
|
|
266
|
+
- `clip-path`
|
|
267
|
+
|
|
268
|
+
Avoid animating:
|
|
269
|
+
- `width`, `height`
|
|
270
|
+
- `margin`, `padding`
|
|
271
|
+
- `border`
|
|
272
|
+
- `font-size`
|
|
273
|
+
|
|
274
|
+
```css
|
|
275
|
+
/* Micro-interactions */
|
|
276
|
+
.card:hover {
|
|
277
|
+
transform: translateY(-2px);
|
|
278
|
+
opacity: 1;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/* Reduced motion */
|
|
282
|
+
@media (prefers-reduced-motion: reduce) {
|
|
283
|
+
*, *::before, *::after {
|
|
284
|
+
animation-duration: 0.01ms !important;
|
|
285
|
+
transition-duration: 0.01ms !important;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
## Accessibility
|
|
291
|
+
|
|
292
|
+
- Color contrast: minimum 4.5:1 for normal text, 3:1 for large text
|
|
293
|
+
- Focus states: visible outline on keyboard navigation
|
|
294
|
+
- ARIA labels for icon-only buttons
|
|
295
|
+
- Semantic HTML: use `<button>` for actions, `<a>` for navigation
|
|
296
|
+
|
|
297
|
+
## Anti-Template Patterns
|
|
298
|
+
|
|
299
|
+
**STOP** — These look like generic templates, not intentional design:
|
|
300
|
+
|
|
301
|
+
- ❌ Uniform card grid with equal spacing everywhere
|
|
302
|
+
- ❌ Centered hero with gradient blob and "Get Started" CTA
|
|
303
|
+
- ❌ Sidebar with 5 identical nav items
|
|
304
|
+
- ❌ Flat gray background with white cards
|
|
305
|
+
- ❌ One font size used for everything
|
|
306
|
+
|
|
307
|
+
**DO** instead:
|
|
308
|
+
- ✓ Clear hierarchy through scale contrast
|
|
309
|
+
- ✓ Intentional rhythm in spacing (not uniform)
|
|
310
|
+
- ✓ Depth through shadows, overlap, or layering
|
|
311
|
+
- ✓ Typography with character and pairing strategy
|
|
312
|
+
- ✓ Hover/focus states that feel designed
|
|
313
|
+
- ✓ Grid-breaking editorial or bento composition
|