waypoint-skills 1.3.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/LICENSE +21 -0
- package/README.md +348 -0
- package/README.npm.md +56 -0
- package/cli/bin/cli.js +127 -0
- package/cli/bin/lib/paths.mjs +31 -0
- package/cli/bin/postinstall.mjs +25 -0
- package/manifest.json +107 -0
- package/package.json +44 -0
- package/packages/agents/inspiration-scout.md +105 -0
- package/packages/agents/orchestrator.md +186 -0
- package/packages/agents/scrutiny-validator.md +136 -0
- package/packages/agents/user-testing-validator.md +171 -0
- package/packages/agents/validator.md +102 -0
- package/packages/agents/worker.md +116 -0
- package/packages/agents/wp-router.md +69 -0
- package/packages/hooks/hooks.json.example +12 -0
- package/packages/hooks/templates/mission-worktree-bootstrap.sh +88 -0
- package/packages/hooks/templates/run-assertions.sh +48 -0
- package/packages/rules/adversarial-context-isolation.mdc +57 -0
- package/packages/rules/serial-git-enforcement.mdc +77 -0
- package/packages/skills/caveman/SKILL.md +78 -0
- package/packages/skills/design-taste-frontend/SKILL.md +1206 -0
- package/packages/skills/gpt-taste/SKILL.md +74 -0
- package/packages/skills/impeccable/SKILL.md +164 -0
- package/packages/skills/impeccable/reference/adapt.md +311 -0
- package/packages/skills/impeccable/reference/animate.md +201 -0
- package/packages/skills/impeccable/reference/audit.md +133 -0
- package/packages/skills/impeccable/reference/bolder.md +120 -0
- package/packages/skills/impeccable/reference/brand.md +108 -0
- package/packages/skills/impeccable/reference/clarify.md +288 -0
- package/packages/skills/impeccable/reference/codex.md +105 -0
- package/packages/skills/impeccable/reference/colorize.md +257 -0
- package/packages/skills/impeccable/reference/craft.md +123 -0
- package/packages/skills/impeccable/reference/critique.md +780 -0
- package/packages/skills/impeccable/reference/delight.md +302 -0
- package/packages/skills/impeccable/reference/distill.md +111 -0
- package/packages/skills/impeccable/reference/document.md +429 -0
- package/packages/skills/impeccable/reference/extract.md +69 -0
- package/packages/skills/impeccable/reference/harden.md +347 -0
- package/packages/skills/impeccable/reference/hooks.md +90 -0
- package/packages/skills/impeccable/reference/init.md +172 -0
- package/packages/skills/impeccable/reference/interaction-design.md +189 -0
- package/packages/skills/impeccable/reference/layout.md +161 -0
- package/packages/skills/impeccable/reference/live.md +718 -0
- package/packages/skills/impeccable/reference/onboard.md +234 -0
- package/packages/skills/impeccable/reference/optimize.md +258 -0
- package/packages/skills/impeccable/reference/overdrive.md +130 -0
- package/packages/skills/impeccable/reference/polish.md +241 -0
- package/packages/skills/impeccable/reference/product.md +60 -0
- package/packages/skills/impeccable/reference/quieter.md +99 -0
- package/packages/skills/impeccable/reference/shape.md +165 -0
- package/packages/skills/impeccable/reference/typeset.md +279 -0
- package/packages/skills/impeccable/scripts/command-metadata.json +94 -0
- package/packages/skills/impeccable/scripts/context-signals.mjs +225 -0
- package/packages/skills/impeccable/scripts/context.mjs +961 -0
- package/packages/skills/impeccable/scripts/critique-storage.mjs +242 -0
- package/packages/skills/impeccable/scripts/detect-csp.mjs +198 -0
- package/packages/skills/impeccable/scripts/detect.mjs +21 -0
- package/packages/skills/impeccable/scripts/detector/browser/injected/index.mjs +1937 -0
- package/packages/skills/impeccable/scripts/detector/cli/main.mjs +290 -0
- package/packages/skills/impeccable/scripts/detector/design-system.mjs +750 -0
- package/packages/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +5185 -0
- package/packages/skills/impeccable/scripts/detector/detect-antipatterns.mjs +50 -0
- package/packages/skills/impeccable/scripts/detector/engines/browser/detect-url.mjs +277 -0
- package/packages/skills/impeccable/scripts/detector/engines/regex/detect-text.mjs +568 -0
- package/packages/skills/impeccable/scripts/detector/engines/static-html/css-cascade.mjs +1015 -0
- package/packages/skills/impeccable/scripts/detector/engines/static-html/detect-html.mjs +234 -0
- package/packages/skills/impeccable/scripts/detector/engines/visual/screenshot-contrast.mjs +189 -0
- package/packages/skills/impeccable/scripts/detector/findings.mjs +12 -0
- package/packages/skills/impeccable/scripts/detector/node/file-system.mjs +198 -0
- package/packages/skills/impeccable/scripts/detector/profile/profiler.mjs +166 -0
- package/packages/skills/impeccable/scripts/detector/registry/antipatterns.mjs +459 -0
- package/packages/skills/impeccable/scripts/detector/rules/checks.mjs +2707 -0
- package/packages/skills/impeccable/scripts/detector/shared/color.mjs +124 -0
- package/packages/skills/impeccable/scripts/detector/shared/constants.mjs +101 -0
- package/packages/skills/impeccable/scripts/detector/shared/inline-ignores.mjs +148 -0
- package/packages/skills/impeccable/scripts/detector/shared/page.mjs +7 -0
- package/packages/skills/impeccable/scripts/hook-admin.mjs +660 -0
- package/packages/skills/impeccable/scripts/hook-before-edit.mjs +476 -0
- package/packages/skills/impeccable/scripts/hook-lib.mjs +1632 -0
- package/packages/skills/impeccable/scripts/hook.mjs +61 -0
- package/packages/skills/impeccable/scripts/lib/design-parser.mjs +842 -0
- package/packages/skills/impeccable/scripts/lib/impeccable-config.mjs +638 -0
- package/packages/skills/impeccable/scripts/lib/impeccable-paths.mjs +128 -0
- package/packages/skills/impeccable/scripts/lib/is-generated.mjs +69 -0
- package/packages/skills/impeccable/scripts/lib/target-args.mjs +42 -0
- package/packages/skills/impeccable/scripts/live/browser-script-parts.mjs +49 -0
- package/packages/skills/impeccable/scripts/live/completion.mjs +19 -0
- package/packages/skills/impeccable/scripts/live/event-validation.mjs +137 -0
- package/packages/skills/impeccable/scripts/live/insert-ui.mjs +458 -0
- package/packages/skills/impeccable/scripts/live/manual-apply.mjs +939 -0
- package/packages/skills/impeccable/scripts/live/manual-edit-routes.mjs +357 -0
- package/packages/skills/impeccable/scripts/live/manual-edits-buffer.mjs +152 -0
- package/packages/skills/impeccable/scripts/live/session-store.mjs +289 -0
- package/packages/skills/impeccable/scripts/live/svelte-component.mjs +826 -0
- package/packages/skills/impeccable/scripts/live/sveltekit-adapter.mjs +274 -0
- package/packages/skills/impeccable/scripts/live/ui-core.mjs +180 -0
- package/packages/skills/impeccable/scripts/live/vocabulary.mjs +36 -0
- package/packages/skills/impeccable/scripts/live-accept.mjs +812 -0
- package/packages/skills/impeccable/scripts/live-browser-dom.js +146 -0
- package/packages/skills/impeccable/scripts/live-browser-session.js +123 -0
- package/packages/skills/impeccable/scripts/live-browser.js +11173 -0
- package/packages/skills/impeccable/scripts/live-commit-manual-edits.mjs +1241 -0
- package/packages/skills/impeccable/scripts/live-complete.mjs +75 -0
- package/packages/skills/impeccable/scripts/live-copy-edit-agent.mjs +683 -0
- package/packages/skills/impeccable/scripts/live-discard-manual-edits.mjs +51 -0
- package/packages/skills/impeccable/scripts/live-inject.mjs +583 -0
- package/packages/skills/impeccable/scripts/live-insert.mjs +272 -0
- package/packages/skills/impeccable/scripts/live-manual-edit-evidence.mjs +363 -0
- package/packages/skills/impeccable/scripts/live-poll.mjs +384 -0
- package/packages/skills/impeccable/scripts/live-resume.mjs +94 -0
- package/packages/skills/impeccable/scripts/live-server.mjs +1135 -0
- package/packages/skills/impeccable/scripts/live-status.mjs +61 -0
- package/packages/skills/impeccable/scripts/live-target.mjs +30 -0
- package/packages/skills/impeccable/scripts/live-wrap.mjs +894 -0
- package/packages/skills/impeccable/scripts/live.mjs +297 -0
- package/packages/skills/impeccable/scripts/modern-screenshot.umd.js +14 -0
- package/packages/skills/impeccable/scripts/palette.mjs +633 -0
- package/packages/skills/impeccable/scripts/pin.mjs +214 -0
- package/packages/skills/ponytail/SKILL.md +117 -0
- package/packages/skills/stitch-design-taste/DESIGN.md +121 -0
- package/packages/skills/stitch-design-taste/SKILL.md +184 -0
- package/packages/skills/waypoint/SKILL.md +67 -0
- package/packages/skills/wp/SKILL.md +330 -0
- package/packages/skills/wp/caveman-wire.md +148 -0
- package/packages/skills/wp/reference.md +411 -0
- package/scripts/detect-platform.sh +32 -0
- package/scripts/install.sh +123 -0
- package/scripts/lib/common.sh +215 -0
- package/scripts/sync-skills.sh +21 -0
- package/scripts/uninstall.sh +38 -0
- package/scripts/waypoint +281 -0
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Pin/unpin sub-commands as standalone skill shortcuts.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* node <scripts_path>/pin.mjs pin <command>
|
|
7
|
+
* node <scripts_path>/pin.mjs unpin <command>
|
|
8
|
+
*
|
|
9
|
+
* `pin audit` creates a lightweight /audit skill that redirects to /impeccable audit.
|
|
10
|
+
* `unpin audit` removes that shortcut.
|
|
11
|
+
*
|
|
12
|
+
* The script discovers harness directories (.claude/skills, .cursor/skills, etc.)
|
|
13
|
+
* in the project root and creates/removes the pin in all of them.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync, rmSync, readdirSync } from 'node:fs';
|
|
17
|
+
import { join, resolve, dirname } from 'node:path';
|
|
18
|
+
import { fileURLToPath } from 'node:url';
|
|
19
|
+
|
|
20
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
21
|
+
|
|
22
|
+
// All known harness directories
|
|
23
|
+
const HARNESS_DIRS = [
|
|
24
|
+
'.claude', '.cursor', '.gemini', '.codex', '.agents',
|
|
25
|
+
'.trae', '.trae-cn', '.pi', '.opencode', '.kiro', '.rovodev',
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
// Valid sub-command names
|
|
29
|
+
const VALID_COMMANDS = [
|
|
30
|
+
'craft', 'init', 'extract', 'document', 'shape',
|
|
31
|
+
'critique', 'audit',
|
|
32
|
+
'polish', 'bolder', 'quieter', 'distill', 'harden', 'onboard', 'live',
|
|
33
|
+
'animate', 'colorize', 'typeset', 'layout', 'delight', 'overdrive',
|
|
34
|
+
'clarify', 'adapt', 'optimize',
|
|
35
|
+
];
|
|
36
|
+
|
|
37
|
+
// Marker to identify pinned skills (so unpin doesn't delete user skills)
|
|
38
|
+
const PIN_MARKER = '<!-- impeccable-pinned-skill -->';
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Walk up from startDir to find a project root.
|
|
42
|
+
*/
|
|
43
|
+
function findProjectRoot(startDir = process.cwd()) {
|
|
44
|
+
let dir = resolve(startDir);
|
|
45
|
+
while (dir !== '/') {
|
|
46
|
+
if (
|
|
47
|
+
existsSync(join(dir, 'package.json')) ||
|
|
48
|
+
existsSync(join(dir, '.git')) ||
|
|
49
|
+
existsSync(join(dir, 'skills-lock.json'))
|
|
50
|
+
) {
|
|
51
|
+
return dir;
|
|
52
|
+
}
|
|
53
|
+
const parent = resolve(dir, '..');
|
|
54
|
+
if (parent === dir) break;
|
|
55
|
+
dir = parent;
|
|
56
|
+
}
|
|
57
|
+
return resolve(startDir);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Find harness skill directories that have an impeccable skill installed.
|
|
62
|
+
*/
|
|
63
|
+
function findHarnessDirs(projectRoot) {
|
|
64
|
+
const dirs = [];
|
|
65
|
+
for (const harness of HARNESS_DIRS) {
|
|
66
|
+
const skillsDir = join(projectRoot, harness, 'skills');
|
|
67
|
+
// Only pin in harness dirs that already have impeccable installed
|
|
68
|
+
const impeccableDir = join(skillsDir, 'impeccable');
|
|
69
|
+
if (existsSync(impeccableDir) || existsSync(join(skillsDir, 'i-impeccable'))) {
|
|
70
|
+
dirs.push(skillsDir);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return dirs;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Load command metadata (descriptions for pinned skills).
|
|
78
|
+
*/
|
|
79
|
+
function loadCommandMetadata() {
|
|
80
|
+
const metadataPath = join(__dirname, 'command-metadata.json');
|
|
81
|
+
if (existsSync(metadataPath)) {
|
|
82
|
+
return JSON.parse(readFileSync(metadataPath, 'utf-8'));
|
|
83
|
+
}
|
|
84
|
+
return {};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Generate a pinned skill's SKILL.md content.
|
|
89
|
+
*/
|
|
90
|
+
function generatePinnedSkill(command, metadata) {
|
|
91
|
+
const desc = metadata[command]?.description || `Shortcut for /impeccable ${command}.`;
|
|
92
|
+
const hint = metadata[command]?.argumentHint || '[target]';
|
|
93
|
+
|
|
94
|
+
return `---
|
|
95
|
+
name: ${command}
|
|
96
|
+
description: "${desc}"
|
|
97
|
+
argument-hint: "${hint}"
|
|
98
|
+
user-invocable: true
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
${PIN_MARKER}
|
|
102
|
+
|
|
103
|
+
This is a pinned shortcut for \`{{command_prefix}}impeccable ${command}\`.
|
|
104
|
+
|
|
105
|
+
Invoke {{command_prefix}}impeccable ${command}, passing along any arguments provided here, and follow its instructions.
|
|
106
|
+
`;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Pin a command: create shortcut skill in all harness dirs.
|
|
111
|
+
*/
|
|
112
|
+
function pin(command, projectRoot) {
|
|
113
|
+
const metadata = loadCommandMetadata();
|
|
114
|
+
const harnessDirs = findHarnessDirs(projectRoot);
|
|
115
|
+
|
|
116
|
+
if (harnessDirs.length === 0) {
|
|
117
|
+
console.log('No harness directories with impeccable installed found.');
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const content = generatePinnedSkill(command, metadata);
|
|
122
|
+
let created = 0;
|
|
123
|
+
|
|
124
|
+
for (const skillsDir of harnessDirs) {
|
|
125
|
+
// Check if skill already exists (and isn't a pin)
|
|
126
|
+
const skillDir = join(skillsDir, command);
|
|
127
|
+
if (existsSync(skillDir)) {
|
|
128
|
+
const existingMd = join(skillDir, 'SKILL.md');
|
|
129
|
+
if (existsSync(existingMd)) {
|
|
130
|
+
const existing = readFileSync(existingMd, 'utf-8');
|
|
131
|
+
if (!existing.includes(PIN_MARKER)) {
|
|
132
|
+
console.log(` SKIP: ${skillDir} (non-pinned skill already exists)`);
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
mkdirSync(skillDir, { recursive: true });
|
|
139
|
+
writeFileSync(join(skillDir, 'SKILL.md'), content, 'utf-8');
|
|
140
|
+
console.log(` + ${skillDir}`);
|
|
141
|
+
created++;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
if (created > 0) {
|
|
145
|
+
console.log(`\nPinned '${command}' as a standalone shortcut in ${created} location(s).`);
|
|
146
|
+
console.log(`You can now use /${command} directly.`);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
return created > 0;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Unpin a command: remove shortcut skill from all harness dirs.
|
|
154
|
+
*/
|
|
155
|
+
function unpin(command, projectRoot) {
|
|
156
|
+
const harnessDirs = findHarnessDirs(projectRoot);
|
|
157
|
+
let removed = 0;
|
|
158
|
+
|
|
159
|
+
for (const skillsDir of harnessDirs) {
|
|
160
|
+
const skillDir = join(skillsDir, command);
|
|
161
|
+
if (!existsSync(skillDir)) continue;
|
|
162
|
+
|
|
163
|
+
const skillMd = join(skillDir, 'SKILL.md');
|
|
164
|
+
if (!existsSync(skillMd)) continue;
|
|
165
|
+
|
|
166
|
+
// Safety: only remove if it's a pinned skill
|
|
167
|
+
const content = readFileSync(skillMd, 'utf-8');
|
|
168
|
+
if (!content.includes(PIN_MARKER)) {
|
|
169
|
+
console.log(` SKIP: ${skillDir} (not a pinned skill)`);
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
rmSync(skillDir, { recursive: true, force: true });
|
|
174
|
+
console.log(` - ${skillDir}`);
|
|
175
|
+
removed++;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
if (removed > 0) {
|
|
179
|
+
console.log(`\nUnpinned '${command}' from ${removed} location(s).`);
|
|
180
|
+
console.log(`Use /impeccable ${command} to access it.`);
|
|
181
|
+
} else {
|
|
182
|
+
console.log(`No pinned '${command}' shortcut found.`);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
return removed > 0;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// --- CLI ---
|
|
189
|
+
const [,, action, command] = process.argv;
|
|
190
|
+
|
|
191
|
+
if (!action || !command) {
|
|
192
|
+
console.log('Usage: node pin.mjs <pin|unpin> <command>');
|
|
193
|
+
console.log(`\nAvailable commands: ${VALID_COMMANDS.join(', ')}`);
|
|
194
|
+
process.exit(1);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
if (action !== 'pin' && action !== 'unpin') {
|
|
198
|
+
console.error(`Unknown action: ${action}. Use 'pin' or 'unpin'.`);
|
|
199
|
+
process.exit(1);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
if (!VALID_COMMANDS.includes(command)) {
|
|
203
|
+
console.error(`Unknown command: ${command}`);
|
|
204
|
+
console.error(`Available commands: ${VALID_COMMANDS.join(', ')}`);
|
|
205
|
+
process.exit(1);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
const root = findProjectRoot();
|
|
209
|
+
|
|
210
|
+
if (action === 'pin') {
|
|
211
|
+
pin(command, root);
|
|
212
|
+
} else {
|
|
213
|
+
unpin(command, root);
|
|
214
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ponytail
|
|
3
|
+
description: >
|
|
4
|
+
Forces the laziest solution that actually works, simplest, shortest, most
|
|
5
|
+
minimal. Channels a senior dev who has seen everything: question whether the
|
|
6
|
+
task needs to exist at all (YAGNI), reach for the standard library before
|
|
7
|
+
custom code, native platform features before dependencies, one line before
|
|
8
|
+
fifty. Supports intensity levels: lite, full (default), ultra. Use whenever
|
|
9
|
+
the user says "ponytail", "be lazy", "lazy mode", "simplest solution",
|
|
10
|
+
"minimal solution", "yagni", "do less", or "shortest path", and whenever
|
|
11
|
+
they complain about over-engineering, bloat, boilerplate, or unnecessary
|
|
12
|
+
dependencies.
|
|
13
|
+
argument-hint: "[lite|full|ultra]"
|
|
14
|
+
license: MIT
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
# Ponytail
|
|
18
|
+
|
|
19
|
+
You are a lazy senior developer. Lazy means efficient, not careless. You have
|
|
20
|
+
seen every over-engineered codebase and been paged at 3am for one. The best
|
|
21
|
+
code is the code never written.
|
|
22
|
+
|
|
23
|
+
## Persistence
|
|
24
|
+
|
|
25
|
+
ACTIVE EVERY RESPONSE. No drift back to over-building. Still active if
|
|
26
|
+
unsure. Off only: "stop ponytail" / "normal mode". Default: **full**.
|
|
27
|
+
Switch: `/ponytail lite|full|ultra`.
|
|
28
|
+
|
|
29
|
+
## The ladder
|
|
30
|
+
|
|
31
|
+
Stop at the first rung that holds:
|
|
32
|
+
|
|
33
|
+
1. **Does this need to exist at all?** Speculative need = skip it, say so in one line. (YAGNI)
|
|
34
|
+
2. **Already in this codebase?** A helper, util, type, or pattern that already lives here → reuse it. Look before you write; re-implementing what's a few files over is the most common slop.
|
|
35
|
+
3. **Stdlib does it?** Use it.
|
|
36
|
+
4. **Native platform feature covers it?** `<input type="date">` over a picker lib, CSS over JS, DB constraint over app code.
|
|
37
|
+
5. **Already-installed dependency solves it?** Use it. Never add a new one for what a few lines can do.
|
|
38
|
+
6. **Can it be one line?** One line.
|
|
39
|
+
7. **Only then:** the minimum code that works.
|
|
40
|
+
|
|
41
|
+
The ladder is a reflex, not a research project — but it runs *after* you
|
|
42
|
+
understand the problem, not instead of it. Read the task and the code it
|
|
43
|
+
touches first, trace the real flow end to end, then climb. Two rungs work →
|
|
44
|
+
take the higher one and move on. The first lazy solution that works is the
|
|
45
|
+
right one — once you actually know what the change has to touch.
|
|
46
|
+
|
|
47
|
+
**Bug fix = root cause, not symptom.** A report names a symptom. Before you
|
|
48
|
+
edit, grep every caller of the function you're about to touch. The lazy fix IS
|
|
49
|
+
the root-cause fix: one guard in the shared function is a smaller diff than a
|
|
50
|
+
guard in every caller — and patching only the path the ticket names leaves
|
|
51
|
+
every sibling caller still broken. Fix it once, where all callers route through.
|
|
52
|
+
|
|
53
|
+
## Rules
|
|
54
|
+
|
|
55
|
+
- No unrequested abstractions: no interface with one implementation, no factory for one product, no config for a value that never changes.
|
|
56
|
+
- No boilerplate, no scaffolding "for later", later can scaffold for itself.
|
|
57
|
+
- Deletion over addition. Boring over clever, clever is what someone decodes at 3am.
|
|
58
|
+
- Fewest files possible. Shortest working diff wins — but only once you understand the problem. The smallest change in the wrong place isn't lazy, it's a second bug.
|
|
59
|
+
- Complex request? Ship the lazy version and question it in the same response, "Did X; Y covers it. Need full X? Say so." Never stall on an answer you can default.
|
|
60
|
+
- Two stdlib options, same size? Take the one that's correct on edge cases. Lazy means writing less code, not picking the flimsier algorithm.
|
|
61
|
+
- Mark deliberate simplifications with a `ponytail:` comment (`// ponytail: this exists`), simple reads as intent, not ignorance. Shortcut with a known ceiling (global lock, O(n²) scan, naive heuristic)? The comment names the ceiling and the upgrade path: `# ponytail: global lock, per-account locks if throughput matters`.
|
|
62
|
+
|
|
63
|
+
## Output
|
|
64
|
+
|
|
65
|
+
Code first. Then at most three short lines: what was skipped, when to add it.
|
|
66
|
+
No essays, no feature tours, no design notes. If the explanation is longer
|
|
67
|
+
than the code, delete the explanation, every paragraph defending a
|
|
68
|
+
simplification is complexity smuggled back in as prose. Explanation the user
|
|
69
|
+
explicitly asked for (a report, a walkthrough, per-phase notes) is not debt,
|
|
70
|
+
give it in full, the rule is only against unrequested prose.
|
|
71
|
+
|
|
72
|
+
Pattern: `[code] → skipped: [X], add when [Y].`
|
|
73
|
+
|
|
74
|
+
## Intensity
|
|
75
|
+
|
|
76
|
+
| Level | What change |
|
|
77
|
+
|-------|------------|
|
|
78
|
+
| **lite** | Build what's asked, but name the lazier alternative in one line. User picks. |
|
|
79
|
+
| **full** | The ladder enforced. Stdlib and native first. Shortest diff, shortest explanation. Default. |
|
|
80
|
+
| **ultra** | YAGNI extremist. Deletion before addition. Ship the one-liner and challenge the rest of the requirement in the same breath. |
|
|
81
|
+
|
|
82
|
+
Example: "Add a cache for these API responses."
|
|
83
|
+
- lite: "Done, cache added. FYI: `functools.lru_cache` covers this in one line if you'd rather not own a cache class."
|
|
84
|
+
- full: "`@lru_cache(maxsize=1000)` on the fetch function. Skipped custom cache class, add when lru_cache measurably falls short."
|
|
85
|
+
- ultra: "No cache until a profiler says so. When it does: `@lru_cache`. A hand-rolled TTL cache class is a bug farm with a hit rate."
|
|
86
|
+
|
|
87
|
+
## When NOT to be lazy
|
|
88
|
+
|
|
89
|
+
Never simplify away: input validation at trust boundaries, error handling
|
|
90
|
+
that prevents data loss, security measures, accessibility basics, anything
|
|
91
|
+
explicitly requested. User insists on the full version → build it, no
|
|
92
|
+
re-arguing.
|
|
93
|
+
|
|
94
|
+
Never lazy about understanding the problem. The ladder shortens the
|
|
95
|
+
solution, never the reading. Trace the whole thing first — every file the
|
|
96
|
+
change touches, the actual flow — before picking a rung. Laziness that skips
|
|
97
|
+
comprehension to ship a small diff is the dangerous kind: it dresses up as
|
|
98
|
+
efficiency and ships a confident wrong fix. Read fully, then be lazy.
|
|
99
|
+
|
|
100
|
+
Hardware is never the ideal on paper: a real clock drifts, a real sensor
|
|
101
|
+
reads off, a PCA9685 runs a few percent fast. Leave the calibration knob, not
|
|
102
|
+
just less code, the physical world needs tuning a minimal model can't see.
|
|
103
|
+
|
|
104
|
+
Lazy code without its check is unfinished. Non-trivial logic (a branch, a
|
|
105
|
+
loop, a parser, a money/security path) leaves ONE runnable check behind, the
|
|
106
|
+
smallest thing that fails if the logic breaks: an `assert`-based
|
|
107
|
+
`demo()`/`__main__` self-check or one small `test_*.py`. No frameworks, no
|
|
108
|
+
fixtures, no per-function suites unless asked. Trivial one-liners need no
|
|
109
|
+
test, YAGNI applies to tests too.
|
|
110
|
+
|
|
111
|
+
## Boundaries
|
|
112
|
+
|
|
113
|
+
Ponytail governs what you build, not how you talk (pair with Caveman for
|
|
114
|
+
terse prose). "stop ponytail" / "normal mode": revert. Level persists until
|
|
115
|
+
changed or session end.
|
|
116
|
+
|
|
117
|
+
The shortest path to done is the right path.
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# Design System: Taste Standard
|
|
2
|
+
**Skill:** stitch-design-taste
|
|
3
|
+
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## Configuration — Set Your Style
|
|
7
|
+
Adjust these dials before using this design system. They control how creative, dense, and animated the output should be. Pick the level that fits your project.
|
|
8
|
+
|
|
9
|
+
| Dial | Level | Description |
|
|
10
|
+
|------|-------|-------------|
|
|
11
|
+
| **Creativity** | `8` | `1` = Ultra-minimal, Swiss, silent, monochrome. `5` = Balanced, clean but with personality. `10` = Expressive, editorial, bold typography experiments, inline images in headlines, strong asymmetry. Default: `8` |
|
|
12
|
+
| **Density** | `4` | `1` = Gallery-airy, massive whitespace. `5` = Balanced sections. `10` = Cockpit-dense, data-heavy. Default: `4` |
|
|
13
|
+
| **Variance** | `8` | `1` = Predictable, symmetric grids. `5` = Subtle offsets. `10` = Artsy chaotic, no two sections alike. Default: `8` |
|
|
14
|
+
| **Motion Intent** | `6` | `1` = Static, no animation noted. `5` = Subtle hover/entrance cues. `10` = Cinematic orchestration noted in every component. Default: `6` |
|
|
15
|
+
|
|
16
|
+
> **How to use:** Change the numbers above to match your project's vibe. At **Creativity 1–3**, the system produces clean, quiet, Notion-like interfaces. At **Creativity 7–10**, expect inline image typography, dramatic scale contrast, and strong editorial layouts. The rest of the rules below adapt to your chosen levels.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 1. Visual Theme & Atmosphere
|
|
21
|
+
A restrained, gallery-airy interface with confident asymmetric layouts and fluid spring-physics motion. The atmosphere is clinical yet warm — like a well-lit architecture studio where every element earns its place through function. Density is balanced (Level 4), variance runs high (Level 8) to prevent symmetrical boredom, and motion is fluid but never theatrical (Level 6). The overall impression: expensive, intentional, alive.
|
|
22
|
+
|
|
23
|
+
## 2. Color Palette & Roles
|
|
24
|
+
- **Canvas White** (#F9FAFB) — Primary background surface. Warm-neutral, never clinical blue-white
|
|
25
|
+
- **Pure Surface** (#FFFFFF) — Card and container fill. Used with whisper shadow for elevation
|
|
26
|
+
- **Charcoal Ink** (#18181B) — Primary text. Zinc-950 depth — never pure black
|
|
27
|
+
- **Steel Secondary** (#71717A) — Body text, descriptions, metadata. Zinc-500 warmth
|
|
28
|
+
- **Muted Slate** (#94A3B8) — Tertiary text, timestamps, disabled states
|
|
29
|
+
- **Whisper Border** (rgba(226,232,240,0.5)) — Card borders, structural 1px lines. Semi-transparent for depth
|
|
30
|
+
- **Diffused Shadow** (rgba(0,0,0,0.05)) — Card elevation. Wide-spreading, 40px blur, -15px offset. Never harsh
|
|
31
|
+
|
|
32
|
+
### Accent Selection (Pick ONE per project)
|
|
33
|
+
- **Emerald Signal** (#10B981) — For growth, success, positive data dashboards
|
|
34
|
+
- **Electric Blue** (#3B82F6) — For productivity, SaaS, developer tools
|
|
35
|
+
- **Deep Rose** (#E11D48) — For creative, editorial, fashion-adjacent projects
|
|
36
|
+
- **Amber Warmth** (#F59E0B) — For community, social, warm-toned products
|
|
37
|
+
|
|
38
|
+
### Banned Colors
|
|
39
|
+
- Purple/Violet neon gradients — the "AI Purple" aesthetic
|
|
40
|
+
- Pure Black (#000000) — always Off-Black or Zinc-950
|
|
41
|
+
- Oversaturated accents above 80% saturation
|
|
42
|
+
- Mixed warm/cool gray systems within one project
|
|
43
|
+
|
|
44
|
+
## 3. Typography Rules
|
|
45
|
+
- **Display:** `Geist`, `Satoshi`, `Cabinet Grotesk`, or `Outfit` — Track-tight (`-0.025em`), controlled fluid scale, weight-driven hierarchy (700–900). Not screaming. Leading compressed (`1.1`). Alternatives forced — `Inter` is BANNED for premium contexts
|
|
46
|
+
- **Body:** Same family at weight 400 — Relaxed leading (`1.65`), 65ch max-width, Steel Secondary color (#71717A)
|
|
47
|
+
- **Mono:** `Geist Mono` or `JetBrains Mono` — For code blocks, metadata, timestamps. When density exceeds Level 7, all numbers switch to monospace
|
|
48
|
+
- **Scale:** Display at `clamp(2.25rem, 5vw, 3.75rem)`. Body at `1rem/1.125rem`. Mono metadata at `0.8125rem`
|
|
49
|
+
|
|
50
|
+
### Banned Fonts
|
|
51
|
+
- `Inter` — banned everywhere in premium/creative contexts
|
|
52
|
+
- Generic serif fonts (`Times New Roman`, `Georgia`, `Garamond`, `Palatino`) — BANNED. If serif is needed for editorial/creative, use only distinctive modern serifs like `Fraunces`, `Gambarino`, `Editorial New`, or `Instrument Serif`. Never use default browser serif stacks. Serif is always BANNED in dashboards or software UIs regardless
|
|
53
|
+
|
|
54
|
+
## 4. Component Stylings
|
|
55
|
+
* **Buttons:** Flat surface, no outer glow. Primary: accent fill with white text. Secondary: ghost/outline. Active state: `-1px translateY` or `scale(0.98)` for tactile push. Hover: subtle background shift, never glow
|
|
56
|
+
* **Cards/Containers:** Generously rounded corners (`2.5rem`). Pure white fill. Whisper border (`1px`, semi-transparent). Diffused shadow (`0 20px 40px -15px rgba(0,0,0,0.05)`). Internal padding `2rem–2.5rem`. Used ONLY when elevation communicates hierarchy — high-density layouts replace cards with `border-top` dividers or negative space
|
|
57
|
+
* **Inputs/Forms:** Label positioned above input. Helper text optional. Error text below in Deep Rose. Focus ring in accent color, `2px` offset. No floating labels. Standard `0.5rem` gap between label-input-error stack
|
|
58
|
+
* **Navigation:** Sleek, sticky. Icons scale on hover (Dock Magnification optional). No hamburger on desktop. Clean horizontal with generous spacing
|
|
59
|
+
* **Loaders:** Skeletal shimmer matching exact layout dimensions and rounded corners. Shifting light reflection across placeholder shapes. Never circular spinners
|
|
60
|
+
* **Empty States:** Composed illustration or icon composition with guidance text. Never just "No data found"
|
|
61
|
+
* **Error States:** Inline, contextual. Red accent underline or border. Clear recovery action
|
|
62
|
+
|
|
63
|
+
## 5. Hero Section
|
|
64
|
+
The Hero is the first impression — it must be striking, creative, and never generic.
|
|
65
|
+
- **Inline Image Typography:** Embed small, contextual photos or visuals directly between words or letters in the headline. Example: "We build [photo of hands typing] digital [photo of screen] products" — images sit inline at type-height, rounded, acting as visual punctuation between words. This is the signature creative technique
|
|
66
|
+
- **No Overlapping Elements:** Text must never overlap images or other text. Every element has its own clear spatial zone. No z-index stacking of content layers, no absolute-positioned headlines over images. Clean separation always
|
|
67
|
+
- **No Filler Text:** "Scroll to explore", "Swipe down", scroll arrow icons, bouncing chevrons, and any instructional UI chrome are BANNED. The user knows how to scroll. Let the content pull them in naturally
|
|
68
|
+
- **Asymmetric Structure:** Centered Hero layouts are BANNED at this variance level. Use Split Screen (50/50), Left-Aligned text / Right visual, or Asymmetric Whitespace with large empty zones
|
|
69
|
+
- **CTA Restraint:** Maximum one primary CTA button. No secondary "Learn more" links. No redundant micro-copy below the headline
|
|
70
|
+
|
|
71
|
+
## 6. Layout Principles
|
|
72
|
+
- **Grid-First:** CSS Grid for all structural layouts. Never flexbox percentage math (`calc(33% - 1rem)` is BANNED)
|
|
73
|
+
- **No Overlapping:** Elements must never overlap each other. No absolute-positioned layers stacking content on content. Every element occupies its own grid cell or flow position. Clean, separated spatial zones
|
|
74
|
+
- **Feature Sections:** The "3 equal cards in a row" pattern is BANNED. Use 2-column Zig-Zag, asymmetric Bento grids (2fr 1fr 1fr), or horizontal scroll galleries
|
|
75
|
+
- **Containment:** All content within `max-width: 1400px`, centered. Generous horizontal padding (`1rem` mobile, `2rem` tablet, `4rem` desktop)
|
|
76
|
+
- **Full-Height:** Use `min-height: 100dvh` — never `height: 100vh` (iOS Safari address bar jump)
|
|
77
|
+
- **Bento Architecture:** For feature grids, use Row 1: 3 columns | Row 2: 2 columns (70/30 split). Each tile contains a perpetual micro-animation
|
|
78
|
+
|
|
79
|
+
## 7. Responsive Rules
|
|
80
|
+
Every screen must work flawlessly across all viewports. **Responsive is not optional — it is a hard requirement. Every single element must be tested at 375px, 768px, and 1440px.**
|
|
81
|
+
- **Mobile-First Collapse (< 768px):** All multi-column layouts collapse to a strict single column. `width: 100%`, `padding: 1rem`, `gap: 1.5rem`. No exceptions
|
|
82
|
+
- **No Horizontal Scroll:** Horizontal overflow on mobile is a critical failure. All elements must fit within viewport width. If any element causes horizontal scroll, the design is broken
|
|
83
|
+
- **Typography Scaling:** Headlines scale down gracefully via `clamp()`. Body text stays `1rem` minimum. Never shrink body below `14px`. Headlines must remain readable on 375px screens
|
|
84
|
+
- **Touch Targets:** All interactive elements minimum `44px` tap target. Generous spacing between clickable items. Buttons must be full-width on mobile
|
|
85
|
+
- **Image Behavior:** Hero and inline images scale proportionally. Inline typography images (photos between words) stack below the headline on mobile instead of inline
|
|
86
|
+
- **Navigation:** Desktop horizontal nav collapses to a clean mobile menu (slide-in or full-screen overlay). No tiny hamburger icons without labels
|
|
87
|
+
- **Cards & Grids:** Bento grids and asymmetric layouts revert to stacked single-column cards with full-width. Maintain internal padding (`1rem`)
|
|
88
|
+
- **Spacing Consistency:** Vertical section gaps reduce proportionally on mobile (`clamp(3rem, 8vw, 6rem)`). Never cramped, never excessively airy
|
|
89
|
+
- **Testing Viewports:** Designs must be verified at: `375px` (iPhone SE), `390px` (iPhone 14), `768px` (iPad), `1024px` (small laptop), `1440px` (desktop)
|
|
90
|
+
|
|
91
|
+
## 8. Motion & Interaction (Code-Phase Intent)
|
|
92
|
+
> **Note:** Stitch generates static screens — it does not animate. This section documents the **intended motion behavior** so that the coding agent (Antigravity, Cursor, etc.) knows exactly how to implement animations when building the exported design into a live product.
|
|
93
|
+
|
|
94
|
+
- **Physics Engine:** Spring-based exclusively. `stiffness: 100, damping: 20`. No linear easing anywhere. Premium, weighty feel on all interactive elements
|
|
95
|
+
- **Perpetual Micro-Loops:** Every active dashboard component has an infinite-loop state — Pulse on status dots, Typewriter on search bars, Float on feature icons, Shimmer on loading states
|
|
96
|
+
- **Staggered Orchestration:** Lists and grids mount with cascaded delays (`animation-delay: calc(var(--index) * 100ms)`). Waterfall reveals, never instant mount
|
|
97
|
+
- **Layout Transitions:** Smooth re-ordering via shared element IDs. Items swap positions with physics, simulating real-time intelligence
|
|
98
|
+
- **Hardware Rules:** Animate ONLY `transform` and `opacity`. Never `top`, `left`, `width`, `height`. Grain/noise filters on fixed, pointer-events-none pseudo-elements only
|
|
99
|
+
- **Performance:** CPU-heavy perpetual animations isolated in microscopic leaf components. Never trigger parent re-renders. Target 60fps minimum
|
|
100
|
+
|
|
101
|
+
## 9. Anti-Patterns (Banned)
|
|
102
|
+
- No emojis — anywhere in UI, code, or alt text
|
|
103
|
+
- No `Inter` font — use `Geist`, `Outfit`, `Cabinet Grotesk`, `Satoshi`
|
|
104
|
+
- No generic serif fonts (`Times New Roman`, `Georgia`, `Garamond`) — if serif is needed, use distinctive modern serifs only (`Fraunces`, `Instrument Serif`)
|
|
105
|
+
- No pure black (`#000000`) — Off-Black or Zinc-950 only
|
|
106
|
+
- No neon outer glows or default box-shadow glows
|
|
107
|
+
- No oversaturated accent colors above 80%
|
|
108
|
+
- No excessive gradient text on large headers
|
|
109
|
+
- No custom mouse cursors
|
|
110
|
+
- No overlapping elements — text never overlaps images or other content. Clean spatial separation always
|
|
111
|
+
- No 3-column equal card layouts for features
|
|
112
|
+
- No centered Hero sections (at this variance level)
|
|
113
|
+
- No filler UI text: "Scroll to explore", "Swipe down", "Discover more below", scroll arrows, bouncing chevrons — all BANNED
|
|
114
|
+
- No generic names: "John Doe", "Sarah Chan", "Acme", "Nexus", "SmartFlow"
|
|
115
|
+
- No fake round numbers: `99.99%`, `50%`, `1234567` — use organic data: `47.2%`, `+1 (312) 847-1928`
|
|
116
|
+
- No AI copywriting clichés: "Elevate", "Seamless", "Unleash", "Next-Gen", "Revolutionize"
|
|
117
|
+
- No broken Unsplash links — use `picsum.photos/seed/{id}/800/600` or SVG UI Avatars
|
|
118
|
+
- No generic `shadcn/ui` defaults — customize radii, colors, shadows to match this system
|
|
119
|
+
- No `z-index` spam — use only for Navbar, Modal, Overlay layer contexts
|
|
120
|
+
- No `h-screen` — always `min-h-[100dvh]`
|
|
121
|
+
- No circular loading spinners — skeletal shimmer only
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: stitch-design-taste
|
|
3
|
+
description: Semantic Design System Skill for Google Stitch. Generates agent-friendly DESIGN.md files that enforce premium, anti-generic UI standards — strict typography, calibrated color, asymmetric layouts, perpetual micro-motion, and hardware-accelerated performance.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Stitch Design Taste — Semantic Design System Skill
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
This skill generates `DESIGN.md` files optimized for Google Stitch screen generation. It translates the battle-tested anti-slop frontend engineering directives into Stitch's native semantic design language — descriptive, natural-language rules paired with precise values that Stitch's AI agent can interpret to produce premium, non-generic interfaces.
|
|
10
|
+
|
|
11
|
+
The generated `DESIGN.md` serves as the **single source of truth** for prompting Stitch to generate new screens that align with a curated, high-agency design language. Stitch interprets design through **"Visual Descriptions"** supported by specific color values, typography specs, and component behaviors.
|
|
12
|
+
|
|
13
|
+
## Prerequisites
|
|
14
|
+
- Access to Google Stitch via [labs.google/stitch](https://labs.google/stitch)
|
|
15
|
+
- Optionally: Stitch MCP Server for programmatic integration with Cursor, Antigravity, or Gemini CLI
|
|
16
|
+
|
|
17
|
+
## The Goal
|
|
18
|
+
Generate a `DESIGN.md` file that encodes:
|
|
19
|
+
1. **Visual atmosphere** — the mood, density, and design philosophy
|
|
20
|
+
2. **Color calibration** — neutrals, accents, and banned patterns with hex codes
|
|
21
|
+
3. **Typographic architecture** — font stacks, scale hierarchy, and anti-patterns
|
|
22
|
+
4. **Component behaviors** — buttons, cards, inputs with interaction states
|
|
23
|
+
5. **Layout principles** — grid systems, spacing philosophy, responsive strategy
|
|
24
|
+
6. **Motion philosophy** — animation engine specs, spring physics, perpetual micro-interactions
|
|
25
|
+
7. **Anti-patterns** — explicit list of banned AI design clichés
|
|
26
|
+
|
|
27
|
+
## Analysis & Synthesis Instructions
|
|
28
|
+
|
|
29
|
+
### 1. Define the Atmosphere
|
|
30
|
+
Evaluate the target project's intent. Use evocative adjectives from the taste spectrum:
|
|
31
|
+
- **Density:** "Art Gallery Airy" (1–3) → "Daily App Balanced" (4–7) → "Cockpit Dense" (8–10)
|
|
32
|
+
- **Variance:** "Predictable Symmetric" (1–3) → "Offset Asymmetric" (4–7) → "Artsy Chaotic" (8–10)
|
|
33
|
+
- **Motion:** "Static Restrained" (1–3) → "Fluid CSS" (4–7) → "Cinematic Choreography" (8–10)
|
|
34
|
+
|
|
35
|
+
Default baseline: Variance 8, Motion 6, Density 4. Adapt dynamically based on user's vibe description.
|
|
36
|
+
|
|
37
|
+
### 2. Map the Color Palette
|
|
38
|
+
For each color provide: **Descriptive Name** + **Hex Code** + **Functional Role**.
|
|
39
|
+
|
|
40
|
+
**Mandatory constraints:**
|
|
41
|
+
- Maximum 1 accent color. Saturation below 80%
|
|
42
|
+
- The "AI Purple/Blue Neon" aesthetic is strictly BANNED — no purple button glows, no neon gradients
|
|
43
|
+
- Use absolute neutral bases (Zinc/Slate) with high-contrast singular accents
|
|
44
|
+
- Stick to one palette for the entire output — no warm/cool gray fluctuation
|
|
45
|
+
- Never use pure black (`#000000`) — use Off-Black, Zinc-950, or Charcoal
|
|
46
|
+
|
|
47
|
+
### 3. Establish Typography Rules
|
|
48
|
+
- **Display/Headlines:** Track-tight, controlled scale. Not screaming. Hierarchy through weight and color, not just massive size
|
|
49
|
+
- **Body:** Relaxed leading, max 65 characters per line
|
|
50
|
+
- **Font Selection:** `Inter` is BANNED for premium/creative contexts. Force unique character: `Geist`, `Outfit`, `Cabinet Grotesk`, or `Satoshi`
|
|
51
|
+
- **Serif Ban:** Generic serif fonts (`Times New Roman`, `Georgia`, `Garamond`, `Palatino`) are BANNED. If serif is needed for editorial/creative contexts, use only distinctive modern serifs: `Fraunces`, `Gambarino`, `Editorial New`, or `Instrument Serif`. Serif is always BANNED in dashboards or software UIs
|
|
52
|
+
- **Dashboard Constraint:** Use Sans-Serif pairings exclusively (`Geist` + `Geist Mono` or `Satoshi` + `JetBrains Mono`)
|
|
53
|
+
- **High-Density Override:** When density exceeds 7, all numbers must use Monospace
|
|
54
|
+
|
|
55
|
+
### 4. Define the Hero Section
|
|
56
|
+
The Hero is the first impression and must be creative, striking, and never generic:
|
|
57
|
+
- **Inline Image Typography:** Embed small, contextual photos or visuals directly between words or letters in the headline. Images sit inline at type-height, rounded, acting as visual punctuation. This is the signature creative technique
|
|
58
|
+
- **No Overlapping:** Text must never overlap images or other text. Every element occupies its own clean spatial zone
|
|
59
|
+
- **No Filler Text:** "Scroll to explore", "Swipe down", scroll arrow icons, bouncing chevrons are BANNED. The content should pull users in naturally
|
|
60
|
+
- **Asymmetric Structure:** Centered Hero layouts BANNED when variance exceeds 4
|
|
61
|
+
- **CTA Restraint:** Maximum one primary CTA. No secondary "Learn more" links
|
|
62
|
+
|
|
63
|
+
### 5. Describe Component Stylings
|
|
64
|
+
For each component type, describe shape, color, shadow depth, and interaction behavior:
|
|
65
|
+
- **Buttons:** Tactile push feedback on active state. No neon outer glows. No custom mouse cursors
|
|
66
|
+
- **Cards:** Use ONLY when elevation communicates hierarchy. Tint shadows to background hue. For high-density layouts, replace cards with border-top dividers or negative space
|
|
67
|
+
- **Inputs/Forms:** Label above input, helper text optional, error text below. Standard gap spacing
|
|
68
|
+
- **Loading States:** Skeletal loaders matching layout dimensions — no generic circular spinners
|
|
69
|
+
- **Empty States:** Composed compositions indicating how to populate data
|
|
70
|
+
- **Error States:** Clear, inline error reporting
|
|
71
|
+
|
|
72
|
+
### 6. Define Layout Principles
|
|
73
|
+
- No overlapping elements — every element occupies its own clear spatial zone. No absolute-positioned content stacking
|
|
74
|
+
- Centered Hero sections are BANNED when variance exceeds 4 — force Split Screen, Left-Aligned, or Asymmetric Whitespace
|
|
75
|
+
- The generic "3 equal cards horizontally" feature row is BANNED — use 2-column Zig-Zag, asymmetric grid, or horizontal scroll
|
|
76
|
+
- CSS Grid over Flexbox math — never use `calc()` percentage hacks
|
|
77
|
+
- Contain layouts using max-width constraints (e.g., 1400px centered)
|
|
78
|
+
- Full-height sections must use `min-h-[100dvh]` — never `h-screen` (iOS Safari catastrophic jump)
|
|
79
|
+
|
|
80
|
+
### 7. Define Responsive Rules
|
|
81
|
+
Every design must work across all viewports:
|
|
82
|
+
- **Mobile-First Collapse (< 768px):** All multi-column layouts collapse to single column. No exceptions
|
|
83
|
+
- **No Horizontal Scroll:** Horizontal overflow on mobile is a critical failure
|
|
84
|
+
- **Typography Scaling:** Headlines scale via `clamp()`. Body text minimum `1rem`/`14px`
|
|
85
|
+
- **Touch Targets:** All interactive elements minimum `44px` tap target
|
|
86
|
+
- **Image Behavior:** Inline typography images (photos between words) stack below headline on mobile
|
|
87
|
+
- **Navigation:** Desktop horizontal nav collapses to clean mobile menu
|
|
88
|
+
- **Spacing:** Vertical section gaps reduce proportionally (`clamp(3rem, 8vw, 6rem)`)
|
|
89
|
+
|
|
90
|
+
### 8. Encode Motion Philosophy
|
|
91
|
+
- **Spring Physics default:** `stiffness: 100, damping: 20` — premium, weighty feel. No linear easing
|
|
92
|
+
- **Perpetual Micro-Interactions:** Every active component should have an infinite loop state (Pulse, Typewriter, Float, Shimmer)
|
|
93
|
+
- **Staggered Orchestration:** Never mount lists instantly — use cascade delays for waterfall reveals
|
|
94
|
+
- **Performance:** Animate exclusively via `transform` and `opacity`. Never animate `top`, `left`, `width`, `height`. Grain/noise filters on fixed pseudo-elements only
|
|
95
|
+
|
|
96
|
+
### 9. List Anti-Patterns (AI Tells)
|
|
97
|
+
Encode these as explicit "NEVER DO" rules in the DESIGN.md:
|
|
98
|
+
- No emojis anywhere
|
|
99
|
+
- No `Inter` font
|
|
100
|
+
- No generic serif fonts (`Times New Roman`, `Georgia`, `Garamond`) — distinctive modern serifs only if needed
|
|
101
|
+
- No pure black (`#000000`)
|
|
102
|
+
- No neon/outer glow shadows
|
|
103
|
+
- No oversaturated accents
|
|
104
|
+
- No excessive gradient text on large headers
|
|
105
|
+
- No custom mouse cursors
|
|
106
|
+
- No overlapping elements — clean spatial separation always
|
|
107
|
+
- No 3-column equal card layouts
|
|
108
|
+
- No generic names ("John Doe", "Acme", "Nexus")
|
|
109
|
+
- No fake round numbers (`99.99%`, `50%`)
|
|
110
|
+
- No AI copywriting clichés ("Elevate", "Seamless", "Unleash", "Next-Gen")
|
|
111
|
+
- No filler UI text: "Scroll to explore", "Swipe down", scroll arrows, bouncing chevrons
|
|
112
|
+
- No broken Unsplash links — use `picsum.photos` or SVG avatars
|
|
113
|
+
- No centered Hero sections (for high-variance projects)
|
|
114
|
+
|
|
115
|
+
## Output Format (DESIGN.md Structure)
|
|
116
|
+
|
|
117
|
+
```markdown
|
|
118
|
+
# Design System: [Project Title]
|
|
119
|
+
|
|
120
|
+
## 1. Visual Theme & Atmosphere
|
|
121
|
+
(Evocative description of the mood, density, variance, and motion intensity.
|
|
122
|
+
Example: "A restrained, gallery-airy interface with confident asymmetric layouts
|
|
123
|
+
and fluid spring-physics motion. The atmosphere is clinical yet warm — like a
|
|
124
|
+
well-lit architecture studio.")
|
|
125
|
+
|
|
126
|
+
## 2. Color Palette & Roles
|
|
127
|
+
- **Canvas White** (#F9FAFB) — Primary background surface
|
|
128
|
+
- **Pure Surface** (#FFFFFF) — Card and container fill
|
|
129
|
+
- **Charcoal Ink** (#18181B) — Primary text, Zinc-950 depth
|
|
130
|
+
- **Muted Steel** (#71717A) — Secondary text, descriptions, metadata
|
|
131
|
+
- **Whisper Border** (rgba(226,232,240,0.5)) — Card borders, 1px structural lines
|
|
132
|
+
- **[Accent Name]** (#XXXXXX) — Single accent for CTAs, active states, focus rings
|
|
133
|
+
(Max 1 accent. Saturation < 80%. No purple/neon.)
|
|
134
|
+
|
|
135
|
+
## 3. Typography Rules
|
|
136
|
+
- **Display:** [Font Name] — Track-tight, controlled scale, weight-driven hierarchy
|
|
137
|
+
- **Body:** [Font Name] — Relaxed leading, 65ch max-width, neutral secondary color
|
|
138
|
+
- **Mono:** [Font Name] — For code, metadata, timestamps, high-density numbers
|
|
139
|
+
- **Banned:** Inter, generic system fonts for premium contexts. Serif fonts banned in dashboards.
|
|
140
|
+
|
|
141
|
+
## 4. Component Stylings
|
|
142
|
+
* **Buttons:** Flat, no outer glow. Tactile -1px translate on active. Accent fill for primary, ghost/outline for secondary.
|
|
143
|
+
* **Cards:** Generously rounded corners (2.5rem). Diffused whisper shadow. Used only when elevation serves hierarchy. High-density: replace with border-top dividers.
|
|
144
|
+
* **Inputs:** Label above, error below. Focus ring in accent color. No floating labels.
|
|
145
|
+
* **Loaders:** Skeletal shimmer matching exact layout dimensions. No circular spinners.
|
|
146
|
+
* **Empty States:** Composed, illustrated compositions — not just "No data" text.
|
|
147
|
+
|
|
148
|
+
## 5. Layout Principles
|
|
149
|
+
(Grid-first responsive architecture. Asymmetric splits for Hero sections.
|
|
150
|
+
Strict single-column collapse below 768px. Max-width containment.
|
|
151
|
+
No flexbox percentage math. Generous internal padding.)
|
|
152
|
+
|
|
153
|
+
## 6. Motion & Interaction
|
|
154
|
+
(Spring physics for all interactive elements. Staggered cascade reveals.
|
|
155
|
+
Perpetual micro-loops on active dashboard components. Hardware-accelerated
|
|
156
|
+
transforms only. Isolated Client Components for CPU-heavy animations.)
|
|
157
|
+
|
|
158
|
+
## 7. Anti-Patterns (Banned)
|
|
159
|
+
(Explicit list of forbidden patterns: no emojis, no Inter, no pure black,
|
|
160
|
+
no neon glows, no 3-column equal grids, no AI copywriting clichés,
|
|
161
|
+
no generic placeholder names, no broken image links.)
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
## Best Practices
|
|
165
|
+
- **Be Descriptive:** "Deep Charcoal Ink (#18181B)" — not just "dark text"
|
|
166
|
+
- **Be Functional:** Explain what each element is used for
|
|
167
|
+
- **Be Consistent:** Same terminology throughout the document
|
|
168
|
+
- **Be Precise:** Include exact hex codes, rem values, pixel values in parentheses
|
|
169
|
+
- **Be Opinionated:** This is not a neutral template — it enforces a specific, premium aesthetic
|
|
170
|
+
|
|
171
|
+
## Tips for Success
|
|
172
|
+
1. Start with the atmosphere — understand the vibe before detailing tokens
|
|
173
|
+
2. Look for patterns — identify consistent spacing, sizing, and styling
|
|
174
|
+
3. Think semantically — name colors by purpose, not just appearance
|
|
175
|
+
4. Consider hierarchy — document how visual weight communicates importance
|
|
176
|
+
5. Encode the bans — anti-patterns are as important as the rules themselves
|
|
177
|
+
|
|
178
|
+
## Common Pitfalls to Avoid
|
|
179
|
+
- Using technical jargon without translation ("rounded-xl" instead of "generously rounded corners")
|
|
180
|
+
- Omitting hex codes or using only descriptive names
|
|
181
|
+
- Forgetting functional roles of design elements
|
|
182
|
+
- Being too vague in atmosphere descriptions
|
|
183
|
+
- Ignoring the anti-pattern list — these are what make the output premium
|
|
184
|
+
- Defaulting to generic "safe" designs instead of enforcing the curated aesthetic
|