ui-ux-master 1.1.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 +198 -0
- package/SKILL.md +717 -0
- package/agent-templates/antigravity/AGENTS.append.md +15 -0
- package/agent-templates/claude/commands/ui-ux-master.md +25 -0
- package/agent-templates/codex/AGENTS.append.md +15 -0
- package/agent-templates/cursor/rules/ui-ux-master.mdc +10 -0
- package/agent-templates/gemini/GEMINI.append.md +9 -0
- package/agent-templates/universal/ui-ux-master-trigger.md +18 -0
- package/agent-templates/windsurf/rules/ui-ux-master.md +17 -0
- package/bin/ui-ux-master.mjs +192 -0
- package/docs/slash-command-compatibility.md +58 -0
- package/package.json +55 -0
- package/references/accessibility-advanced-patterns.md +43 -0
- package/references/competitive-landscape.md +47 -0
- package/references/content-design-and-i18n.md +53 -0
- package/references/data-visualization-dashboard-ux.md +46 -0
- package/references/design-system-playbook.md +133 -0
- package/references/ethical-inclusive-design.md +52 -0
- package/references/platform-guidelines.md +59 -0
- package/references/service-design-journey-mapping.md +39 -0
- package/references/top-100-brand-website-analysis.md +302 -0
- package/references/ui-ux-complete-checklist.md +214 -0
- package/references/ui-ux-curriculum-and-standards.md +40 -0
- package/references/ui-ux-frontend-implementation-rules.md +378 -0
- package/references/ui-ux-memory-workflow.md +175 -0
- package/references/usability-heuristics.md +65 -0
- package/references/ux-measurement-quality-gates.md +58 -0
- package/references/ux-research-methods.md +99 -0
- package/references/wcag-aa-quick-reference.md +85 -0
- package/scripts/build_deployment_zip.py +42 -0
- package/scripts/validate_skill.py +303 -0
- package/templates/component-spec.md +127 -0
- package/templates/design-system-spec.md +121 -0
- package/templates/top-brand-frontend-spec.md +133 -0
- package/templates/ui-ux-audit-report.md +146 -0
- package/templates/ui-ux-brief.md +86 -0
- package/templates/ui-ux-memory.md +204 -0
- package/tests/install-smoke.test.mjs +71 -0
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Validate the UI/UX skill package.
|
|
3
|
+
|
|
4
|
+
Dependency-free by design so the package can be checked on a fresh machine.
|
|
5
|
+
Use --release for stricter deployment packaging checks.
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import argparse
|
|
10
|
+
import json
|
|
11
|
+
import re
|
|
12
|
+
import sys
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
|
|
15
|
+
ROOT = Path(__file__).resolve().parents[1]
|
|
16
|
+
SKILL = ROOT / "SKILL.md"
|
|
17
|
+
PACKAGE = ROOT / "package.json"
|
|
18
|
+
|
|
19
|
+
REQUIRED = [
|
|
20
|
+
"README.md",
|
|
21
|
+
"LICENSE",
|
|
22
|
+
"package.json",
|
|
23
|
+
"bin/ui-ux-master.mjs",
|
|
24
|
+
"docs/slash-command-compatibility.md",
|
|
25
|
+
"agent-templates/claude/commands/ui-ux-master.md",
|
|
26
|
+
"agent-templates/universal/ui-ux-master-trigger.md",
|
|
27
|
+
"agent-templates/codex/AGENTS.append.md",
|
|
28
|
+
"agent-templates/windsurf/rules/ui-ux-master.md",
|
|
29
|
+
"agent-templates/antigravity/AGENTS.append.md",
|
|
30
|
+
"agent-templates/gemini/GEMINI.append.md",
|
|
31
|
+
"agent-templates/cursor/rules/ui-ux-master.mdc",
|
|
32
|
+
"references/ui-ux-complete-checklist.md",
|
|
33
|
+
"references/ui-ux-frontend-implementation-rules.md",
|
|
34
|
+
"references/ui-ux-memory-workflow.md",
|
|
35
|
+
"references/wcag-aa-quick-reference.md",
|
|
36
|
+
"references/design-system-playbook.md",
|
|
37
|
+
"references/top-100-brand-website-analysis.md",
|
|
38
|
+
"references/ux-research-methods.md",
|
|
39
|
+
"references/usability-heuristics.md",
|
|
40
|
+
"references/platform-guidelines.md",
|
|
41
|
+
"references/content-design-and-i18n.md",
|
|
42
|
+
"references/ux-measurement-quality-gates.md",
|
|
43
|
+
"references/ethical-inclusive-design.md",
|
|
44
|
+
"references/service-design-journey-mapping.md",
|
|
45
|
+
"references/data-visualization-dashboard-ux.md",
|
|
46
|
+
"references/accessibility-advanced-patterns.md",
|
|
47
|
+
"references/ui-ux-curriculum-and-standards.md",
|
|
48
|
+
"references/competitive-landscape.md",
|
|
49
|
+
"templates/ui-ux-brief.md",
|
|
50
|
+
"templates/ui-ux-memory.md",
|
|
51
|
+
"templates/ui-ux-audit-report.md",
|
|
52
|
+
"templates/component-spec.md",
|
|
53
|
+
"templates/design-system-spec.md",
|
|
54
|
+
"templates/top-brand-frontend-spec.md",
|
|
55
|
+
"scripts/build_deployment_zip.py",
|
|
56
|
+
"tests/install-smoke.test.mjs",
|
|
57
|
+
]
|
|
58
|
+
|
|
59
|
+
REQUIRED_PHRASES = [
|
|
60
|
+
"Information Architecture",
|
|
61
|
+
"User Flows",
|
|
62
|
+
"Accessibility",
|
|
63
|
+
"Design Systems",
|
|
64
|
+
"Responsive",
|
|
65
|
+
"Handoff",
|
|
66
|
+
"WCAG",
|
|
67
|
+
"Screen State Checklist",
|
|
68
|
+
"Top-Brand Frontend Method",
|
|
69
|
+
"UI/UX memory",
|
|
70
|
+
"research",
|
|
71
|
+
"heuristic",
|
|
72
|
+
"platform",
|
|
73
|
+
"content design",
|
|
74
|
+
"Internationalization",
|
|
75
|
+
"Measurement and Quality Gates",
|
|
76
|
+
"Ethics",
|
|
77
|
+
"privacy",
|
|
78
|
+
"/ui-ux-master",
|
|
79
|
+
"Cross-Agent Activation",
|
|
80
|
+
]
|
|
81
|
+
|
|
82
|
+
REQUIRED_HEADINGS = {
|
|
83
|
+
"README.md": ["## Install with npm", "## Supported Agents", "## Competitive Positioning", "## Validation and Testing", "## Deployment Readiness Checklist"],
|
|
84
|
+
"docs/slash-command-compatibility.md": ["## What `/ui-ux-master` Does", "## Native Slash Commands vs Text Triggers", "## Supported Agents"],
|
|
85
|
+
"references/ux-research-methods.md": ["## Research Decision Tree", "## Research Plan Template", "## Evidence Confidence Levels"],
|
|
86
|
+
"references/usability-heuristics.md": ["## Nielsen's 10 Usability Heuristics", "## Severity Rating"],
|
|
87
|
+
"references/platform-guidelines.md": ["## Web App", "## iOS / Apple Platforms", "## Android / Material", "## Cross-Platform Rule"],
|
|
88
|
+
"references/content-design-and-i18n.md": ["## Content Design Principles", "## Internationalization Checklist"],
|
|
89
|
+
"references/ux-measurement-quality-gates.md": ["## Metric Selection", "## Quality Gate Template"],
|
|
90
|
+
"references/ethical-inclusive-design.md": ["## Dark Pattern Checks", "## Privacy UX", "## Inclusive Design"],
|
|
91
|
+
"references/service-design-journey-mapping.md": ["## Journey Map Elements", "## Service Blueprint Elements"],
|
|
92
|
+
"references/data-visualization-dashboard-ux.md": ["## Dashboard Principles", "## Chart Selection", "## Tables and Data Grids"],
|
|
93
|
+
"references/accessibility-advanced-patterns.md": ["## Complex Widget Checklist", "## Testing Matrix"],
|
|
94
|
+
"references/ui-ux-curriculum-and-standards.md": ["## Beginner Foundations", "## Intermediate Practice", "## Advanced Practice"],
|
|
95
|
+
"references/competitive-landscape.md": ["## What Existing Tools Do Well", "## Gaps UI/UX Master Must Beat", "## Strategy to Stay Ahead"],
|
|
96
|
+
"templates/ui-ux-brief.md": ["## Research and Evidence Plan", "## Constraints", "## Deliverables Needed"],
|
|
97
|
+
"templates/ui-ux-audit-report.md": ["## Heuristic Findings", "## Measured Evidence and Quality Gates"],
|
|
98
|
+
"templates/component-spec.md": ["## Acceptance Criteria and Test Matrix"],
|
|
99
|
+
"templates/design-system-spec.md": ["## Governance"],
|
|
100
|
+
"templates/top-brand-frontend-spec.md": ["## 11. Quality Gates", "## 12. Do Not Copy"],
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def fail(message: str) -> None:
|
|
105
|
+
print(f"FAIL: {message}")
|
|
106
|
+
sys.exit(1)
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def warn(message: str) -> None:
|
|
110
|
+
print(f"WARN: {message}")
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def parse_frontmatter(content: str) -> tuple[dict[str, str], str]:
|
|
114
|
+
if not content.startswith("---\n"):
|
|
115
|
+
fail("SKILL.md must start with YAML frontmatter at byte 0")
|
|
116
|
+
end_marker = content.find("\n---\n", 4)
|
|
117
|
+
if end_marker == -1:
|
|
118
|
+
fail("SKILL.md frontmatter is not closed")
|
|
119
|
+
frontmatter_text = content[4:end_marker]
|
|
120
|
+
body = content[end_marker + 5 :]
|
|
121
|
+
if not body.strip():
|
|
122
|
+
fail("SKILL.md body is empty")
|
|
123
|
+
frontmatter: dict[str, str] = {}
|
|
124
|
+
for raw_line in frontmatter_text.splitlines():
|
|
125
|
+
if not raw_line or raw_line.startswith(" ") or raw_line.lstrip().startswith("#"):
|
|
126
|
+
continue
|
|
127
|
+
if ":" in raw_line:
|
|
128
|
+
key, value = raw_line.split(":", 1)
|
|
129
|
+
frontmatter[key.strip()] = value.strip().strip('"').strip("'")
|
|
130
|
+
return frontmatter, body
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def skill_version() -> str:
|
|
134
|
+
fm, _ = parse_frontmatter(SKILL.read_text(encoding="utf-8"))
|
|
135
|
+
return fm.get("version", "")
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def check_required_files() -> None:
|
|
139
|
+
for rel in REQUIRED:
|
|
140
|
+
path = ROOT / rel
|
|
141
|
+
if not path.exists():
|
|
142
|
+
fail(f"missing supporting file: {rel}")
|
|
143
|
+
text = path.read_text(encoding="utf-8")
|
|
144
|
+
min_len = 150 if rel.endswith((".json", ".mjs")) else 200
|
|
145
|
+
if len(text.strip()) < min_len:
|
|
146
|
+
fail(f"supporting file too small or empty: {rel}")
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def check_required_headings() -> None:
|
|
150
|
+
for rel, headings in REQUIRED_HEADINGS.items():
|
|
151
|
+
text = (ROOT / rel).read_text(encoding="utf-8")
|
|
152
|
+
for heading in headings:
|
|
153
|
+
if heading not in text:
|
|
154
|
+
fail(f"{rel} missing heading: {heading}")
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def check_skill_frontmatter_and_body() -> None:
|
|
158
|
+
if not SKILL.exists():
|
|
159
|
+
fail("SKILL.md is missing")
|
|
160
|
+
content = SKILL.read_text(encoding="utf-8")
|
|
161
|
+
fm, body = parse_frontmatter(content)
|
|
162
|
+
for key in ["name", "description", "version", "author", "license", "metadata"]:
|
|
163
|
+
if key not in content.split("---", 2)[1]:
|
|
164
|
+
fail(f"frontmatter missing {key}")
|
|
165
|
+
name = fm.get("name", "")
|
|
166
|
+
if not re.fullmatch(r"[a-z0-9][a-z0-9-]{0,63}", name):
|
|
167
|
+
fail("name must be lowercase hyphenated and <=64 chars")
|
|
168
|
+
description = fm.get("description", "")
|
|
169
|
+
if len(description) > 1024:
|
|
170
|
+
fail("description must be <=1024 chars")
|
|
171
|
+
if not description.startswith("Use when"):
|
|
172
|
+
fail('description should start with "Use when"')
|
|
173
|
+
if len(content) > 100_000:
|
|
174
|
+
fail("SKILL.md exceeds 100,000 characters")
|
|
175
|
+
if len(content) > 45_000:
|
|
176
|
+
warn("SKILL.md is getting large; keep detailed material in references/")
|
|
177
|
+
lower_body = body.lower()
|
|
178
|
+
for phrase in REQUIRED_PHRASES:
|
|
179
|
+
if phrase.lower() not in lower_body:
|
|
180
|
+
fail(f"SKILL.md missing required phrase: {phrase}")
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
def check_package_json() -> None:
|
|
184
|
+
try:
|
|
185
|
+
data = json.loads(PACKAGE.read_text(encoding="utf-8"))
|
|
186
|
+
except Exception as exc:
|
|
187
|
+
fail(f"package.json is invalid JSON: {exc}")
|
|
188
|
+
for key in ["name", "version", "description", "type", "bin", "files", "scripts", "license", "engines"]:
|
|
189
|
+
if key not in data:
|
|
190
|
+
fail(f"package.json missing {key}")
|
|
191
|
+
if data["name"] != "ui-ux-master":
|
|
192
|
+
fail("package.json name must be ui-ux-master")
|
|
193
|
+
if data["version"] != skill_version():
|
|
194
|
+
fail("package.json version must match SKILL.md version")
|
|
195
|
+
if data.get("license") != "MIT":
|
|
196
|
+
fail("package.json license must be MIT")
|
|
197
|
+
if data.get("bin", {}).get("ui-ux-master") != "./bin/ui-ux-master.mjs":
|
|
198
|
+
fail("package.json bin.ui-ux-master must point to ./bin/ui-ux-master.mjs")
|
|
199
|
+
for script in ["validate", "test", "prepack"]:
|
|
200
|
+
if script not in data.get("scripts", {}):
|
|
201
|
+
fail(f"package.json scripts missing {script}")
|
|
202
|
+
required_files = ["SKILL.md", "references/", "templates/", "agent-templates/", "docs/", "bin/", "scripts/", "tests/"]
|
|
203
|
+
for item in required_files:
|
|
204
|
+
if item not in data.get("files", []):
|
|
205
|
+
fail(f"package.json files missing {item}")
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
def check_bin_installer() -> None:
|
|
209
|
+
text = (ROOT / "bin/ui-ux-master.mjs").read_text(encoding="utf-8")
|
|
210
|
+
if not text.startswith("#!/usr/bin/env node"):
|
|
211
|
+
fail("bin/ui-ux-master.mjs must have node shebang")
|
|
212
|
+
for phrase in ["install", "doctor", "uninstall", "--dry-run", "fileURLToPath", "/ui-ux-master", "copyProjectSkillAssets", ".ui-ux-master"]:
|
|
213
|
+
if phrase not in text:
|
|
214
|
+
fail(f"bin installer missing {phrase}")
|
|
215
|
+
forbidden = ["C:\\", "C:/xampp", "C:/Users", "/home/"]
|
|
216
|
+
for bad in forbidden:
|
|
217
|
+
if bad in text:
|
|
218
|
+
fail(f"bin installer contains local absolute path: {bad}")
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
def check_agent_templates() -> None:
|
|
222
|
+
template_files = [rel for rel in REQUIRED if rel.startswith("agent-templates/") or rel.startswith("docs/")]
|
|
223
|
+
for rel in template_files:
|
|
224
|
+
text = (ROOT / rel).read_text(encoding="utf-8")
|
|
225
|
+
for phrase in ["/ui-ux-master", "UI/UX", "memory", ".ui-ux-master"]:
|
|
226
|
+
if phrase not in text:
|
|
227
|
+
fail(f"{rel} missing required trigger phrase: {phrase}")
|
|
228
|
+
for bad in ["C:\\", "C:/xampp", "C:/Users", "/workspace"]:
|
|
229
|
+
if bad in text:
|
|
230
|
+
fail(f"{rel} contains local absolute path: {bad}")
|
|
231
|
+
docs = (ROOT / "docs/slash-command-compatibility.md").read_text(encoding="utf-8")
|
|
232
|
+
for agent in ["Claude", "Codex", "Windsurf", "Antigravity", "Gemini", "Cursor", "native slash"]:
|
|
233
|
+
if agent not in docs:
|
|
234
|
+
fail(f"slash compatibility docs missing {agent}")
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
def check_referenced_files_exist() -> None:
|
|
238
|
+
content = SKILL.read_text(encoding="utf-8")
|
|
239
|
+
refs = sorted(set(re.findall(r"`((?:references|templates|agent-templates|docs|bin|scripts)/[^`]+?\.(?:md|mjs|py)|README\.md)`", content)))
|
|
240
|
+
for rel in refs:
|
|
241
|
+
if rel in {"docs/ui-ux-memory.md", "docs/design/ui-ux-memory.md", "design/ui-ux-memory.md"}:
|
|
242
|
+
continue
|
|
243
|
+
if not (ROOT / rel).exists():
|
|
244
|
+
fail(f"SKILL.md references missing file: {rel}")
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
def check_markdown_links() -> None:
|
|
248
|
+
for path in [ROOT / rel for rel in REQUIRED if rel.endswith(".md")]:
|
|
249
|
+
text = path.read_text(encoding="utf-8")
|
|
250
|
+
for match in re.findall(r"\[[^\]]+\]\(([^)]+)\)", text):
|
|
251
|
+
if match.startswith(("http://", "https://", "mailto:", "#")):
|
|
252
|
+
continue
|
|
253
|
+
target = (path.parent / match.split("#", 1)[0]).resolve()
|
|
254
|
+
if not target.exists():
|
|
255
|
+
fail(f"broken local markdown link in {path.relative_to(ROOT)}: {match}")
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
def check_release_artifacts(strict: bool) -> None:
|
|
259
|
+
bad_patterns = [
|
|
260
|
+
"**/__pycache__",
|
|
261
|
+
"**/*.pyc",
|
|
262
|
+
"**/.DS_Store",
|
|
263
|
+
"**/Thumbs.db",
|
|
264
|
+
"graphify-out/cache",
|
|
265
|
+
"node_modules",
|
|
266
|
+
"coverage",
|
|
267
|
+
".nyc_output",
|
|
268
|
+
"*.tgz",
|
|
269
|
+
"npm-debug.log*",
|
|
270
|
+
]
|
|
271
|
+
found: list[str] = []
|
|
272
|
+
for pattern in bad_patterns:
|
|
273
|
+
for path in ROOT.glob(pattern):
|
|
274
|
+
found.append(str(path.relative_to(ROOT)))
|
|
275
|
+
if found:
|
|
276
|
+
message = "release artifacts found: " + ", ".join(sorted(found)[:20])
|
|
277
|
+
if strict:
|
|
278
|
+
fail(message)
|
|
279
|
+
warn(message)
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
def main() -> None:
|
|
283
|
+
parser = argparse.ArgumentParser()
|
|
284
|
+
parser.add_argument("--release", action="store_true", help="run stricter deployment packaging checks")
|
|
285
|
+
args = parser.parse_args()
|
|
286
|
+
check_skill_frontmatter_and_body()
|
|
287
|
+
check_required_files()
|
|
288
|
+
check_required_headings()
|
|
289
|
+
check_package_json()
|
|
290
|
+
check_bin_installer()
|
|
291
|
+
check_agent_templates()
|
|
292
|
+
check_referenced_files_exist()
|
|
293
|
+
check_markdown_links()
|
|
294
|
+
check_release_artifacts(strict=args.release)
|
|
295
|
+
print("PASS: UI/UX skill package is valid")
|
|
296
|
+
print(f"Root: {ROOT}")
|
|
297
|
+
print(f"Files checked: {1 + len(REQUIRED)}")
|
|
298
|
+
if args.release:
|
|
299
|
+
print("Release mode: PASS")
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
if __name__ == "__main__":
|
|
303
|
+
main()
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# Component Spec
|
|
2
|
+
|
|
3
|
+
## Component Name
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
What user problem does this component solve?
|
|
8
|
+
|
|
9
|
+
## Platform and Context
|
|
10
|
+
|
|
11
|
+
- Platform(s): web / iOS / Android / desktop / email / kiosk / other:
|
|
12
|
+
- Existing component to reuse:
|
|
13
|
+
- User task:
|
|
14
|
+
- Accessibility risk level:
|
|
15
|
+
|
|
16
|
+
## Anatomy
|
|
17
|
+
|
|
18
|
+
- Container:
|
|
19
|
+
- Header/title:
|
|
20
|
+
- Body/content:
|
|
21
|
+
- Leading icon/media:
|
|
22
|
+
- Trailing action:
|
|
23
|
+
- Supporting text:
|
|
24
|
+
- Error/help text:
|
|
25
|
+
|
|
26
|
+
## Variants
|
|
27
|
+
|
|
28
|
+
- Default:
|
|
29
|
+
- Primary:
|
|
30
|
+
- Secondary:
|
|
31
|
+
- Destructive:
|
|
32
|
+
- Ghost/tertiary:
|
|
33
|
+
- Custom variants:
|
|
34
|
+
|
|
35
|
+
## Sizes
|
|
36
|
+
|
|
37
|
+
- Small:
|
|
38
|
+
- Medium:
|
|
39
|
+
- Large:
|
|
40
|
+
- Touch target minimum:
|
|
41
|
+
|
|
42
|
+
## States
|
|
43
|
+
|
|
44
|
+
- Default:
|
|
45
|
+
- Hover:
|
|
46
|
+
- Focus-visible:
|
|
47
|
+
- Active/pressed:
|
|
48
|
+
- Disabled:
|
|
49
|
+
- Loading:
|
|
50
|
+
- Selected/current:
|
|
51
|
+
- Error:
|
|
52
|
+
- Success:
|
|
53
|
+
- Empty/no data:
|
|
54
|
+
- Permission/offline if applicable:
|
|
55
|
+
|
|
56
|
+
## Behavior
|
|
57
|
+
|
|
58
|
+
- Click/tap:
|
|
59
|
+
- Keyboard:
|
|
60
|
+
- Focus management:
|
|
61
|
+
- Open/close if applicable:
|
|
62
|
+
- Validation if applicable:
|
|
63
|
+
- Async behavior:
|
|
64
|
+
- Escape/back behavior:
|
|
65
|
+
|
|
66
|
+
## Accessibility
|
|
67
|
+
|
|
68
|
+
- Semantic element/role:
|
|
69
|
+
- Accessible name:
|
|
70
|
+
- ARIA attributes if needed:
|
|
71
|
+
- Keyboard support:
|
|
72
|
+
- Focus indicator:
|
|
73
|
+
- Contrast requirements:
|
|
74
|
+
- Screen reader notes:
|
|
75
|
+
- Reduced motion behavior:
|
|
76
|
+
- Complex-widget pattern reference:
|
|
77
|
+
|
|
78
|
+
## Content Guidelines
|
|
79
|
+
|
|
80
|
+
- Label style:
|
|
81
|
+
- Length limits:
|
|
82
|
+
- Tone:
|
|
83
|
+
- Examples:
|
|
84
|
+
- Avoid:
|
|
85
|
+
- Localization/text expansion notes:
|
|
86
|
+
|
|
87
|
+
## Responsive Behavior
|
|
88
|
+
|
|
89
|
+
- Mobile:
|
|
90
|
+
- Tablet:
|
|
91
|
+
- Desktop:
|
|
92
|
+
- Wide:
|
|
93
|
+
|
|
94
|
+
## Tokens Used
|
|
95
|
+
|
|
96
|
+
- Color:
|
|
97
|
+
- Typography:
|
|
98
|
+
- Spacing:
|
|
99
|
+
- Radius:
|
|
100
|
+
- Elevation:
|
|
101
|
+
- Motion:
|
|
102
|
+
|
|
103
|
+
## Implementation Notes
|
|
104
|
+
|
|
105
|
+
- Props/API:
|
|
106
|
+
- Data requirements:
|
|
107
|
+
- Events/analytics:
|
|
108
|
+
- Error handling:
|
|
109
|
+
- Tests:
|
|
110
|
+
|
|
111
|
+
## Acceptance Criteria and Test Matrix
|
|
112
|
+
|
|
113
|
+
| Requirement | Test | Pass Criteria |
|
|
114
|
+
|---|---|---|
|
|
115
|
+
| Default behavior | | |
|
|
116
|
+
| Keyboard behavior | | |
|
|
117
|
+
| Screen-reader behavior | | |
|
|
118
|
+
| Responsive behavior | | |
|
|
119
|
+
| Error/loading/empty states | | |
|
|
120
|
+
| Localization/text expansion | | |
|
|
121
|
+
| Visual regression | | |
|
|
122
|
+
|
|
123
|
+
## Usage Examples
|
|
124
|
+
|
|
125
|
+
### Good
|
|
126
|
+
|
|
127
|
+
### Bad
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# Design System Spec
|
|
2
|
+
|
|
3
|
+
## System Overview
|
|
4
|
+
|
|
5
|
+
- Product:
|
|
6
|
+
- Brand personality:
|
|
7
|
+
- Platforms:
|
|
8
|
+
- Accessibility target:
|
|
9
|
+
- Tech stack:
|
|
10
|
+
- Version:
|
|
11
|
+
- Owners:
|
|
12
|
+
|
|
13
|
+
## Foundations
|
|
14
|
+
|
|
15
|
+
### Color Tokens
|
|
16
|
+
|
|
17
|
+
| Token | Value | Usage |
|
|
18
|
+
|---|---|---|
|
|
19
|
+
| color.background | | Page background |
|
|
20
|
+
| color.surface | | Cards/panels |
|
|
21
|
+
| color.text.primary | | Main text |
|
|
22
|
+
| color.text.secondary | | Secondary text |
|
|
23
|
+
| color.border | | Default borders |
|
|
24
|
+
| color.primary | | Primary actions |
|
|
25
|
+
| color.danger | | Destructive/status |
|
|
26
|
+
| color.focus | | Focus indicator |
|
|
27
|
+
|
|
28
|
+
### Typography Tokens
|
|
29
|
+
|
|
30
|
+
| Token | Size | Line height | Weight | Usage |
|
|
31
|
+
|---|---:|---:|---:|---|
|
|
32
|
+
| text.h1 | | | | |
|
|
33
|
+
| text.h2 | | | | |
|
|
34
|
+
| text.body | | | | |
|
|
35
|
+
| text.label | | | | |
|
|
36
|
+
| text.caption | | | | |
|
|
37
|
+
|
|
38
|
+
### Spacing Tokens
|
|
39
|
+
|
|
40
|
+
| Token | Value | Usage |
|
|
41
|
+
|---|---:|---|
|
|
42
|
+
| space.1 | 4px | Tight gaps |
|
|
43
|
+
| space.2 | 8px | Small gaps |
|
|
44
|
+
| space.3 | 12px | Component internals |
|
|
45
|
+
| space.4 | 16px | Default gaps |
|
|
46
|
+
| space.6 | 24px | Section gaps |
|
|
47
|
+
| space.8 | 32px | Page/module gaps |
|
|
48
|
+
|
|
49
|
+
### Radius, Elevation, Motion
|
|
50
|
+
|
|
51
|
+
| Token | Value | Usage |
|
|
52
|
+
|---|---|---|
|
|
53
|
+
| radius.sm | | |
|
|
54
|
+
| radius.md | | |
|
|
55
|
+
| radius.lg | | |
|
|
56
|
+
| shadow.sm | | |
|
|
57
|
+
| shadow.md | | |
|
|
58
|
+
| motion.fast | 120ms | Simple feedback |
|
|
59
|
+
| motion.base | 180ms | Default transition |
|
|
60
|
+
|
|
61
|
+
### Content, Localization, and Data Visualization Tokens
|
|
62
|
+
|
|
63
|
+
- Voice/tone rules:
|
|
64
|
+
- Error/empty/success copy patterns:
|
|
65
|
+
- Locale and RTL rules:
|
|
66
|
+
- Number/date/currency formats:
|
|
67
|
+
- Chart color semantics:
|
|
68
|
+
- Data density options:
|
|
69
|
+
|
|
70
|
+
## Components
|
|
71
|
+
|
|
72
|
+
For each component, include purpose, anatomy, variants, sizes, states, accessibility, content rules, responsive behavior, platform variants, acceptance criteria, and examples.
|
|
73
|
+
|
|
74
|
+
### Button
|
|
75
|
+
|
|
76
|
+
### Input
|
|
77
|
+
|
|
78
|
+
### Select/Combobox
|
|
79
|
+
|
|
80
|
+
### Checkbox/Radio/Switch
|
|
81
|
+
|
|
82
|
+
### Modal/Dialog
|
|
83
|
+
|
|
84
|
+
### Toast/Alert
|
|
85
|
+
|
|
86
|
+
### Card
|
|
87
|
+
|
|
88
|
+
### Table/Data Grid
|
|
89
|
+
|
|
90
|
+
### Navigation
|
|
91
|
+
|
|
92
|
+
### Empty State
|
|
93
|
+
|
|
94
|
+
### Chart/Data Visualization
|
|
95
|
+
|
|
96
|
+
## Patterns
|
|
97
|
+
|
|
98
|
+
- Onboarding:
|
|
99
|
+
- Search/filter:
|
|
100
|
+
- Create/edit forms:
|
|
101
|
+
- Destructive actions:
|
|
102
|
+
- Permissions:
|
|
103
|
+
- Loading and error recovery:
|
|
104
|
+
- Notifications:
|
|
105
|
+
- Checkout/payment if relevant:
|
|
106
|
+
- Dashboard drill-down if relevant:
|
|
107
|
+
- AI disclosure if relevant:
|
|
108
|
+
|
|
109
|
+
## Governance
|
|
110
|
+
|
|
111
|
+
- Contribution process:
|
|
112
|
+
- Naming conventions:
|
|
113
|
+
- Versioning:
|
|
114
|
+
- Changelog:
|
|
115
|
+
- Deprecation process:
|
|
116
|
+
- Accessibility review process:
|
|
117
|
+
- Content/i18n review process:
|
|
118
|
+
- Platform variant review process:
|
|
119
|
+
- Token release process:
|
|
120
|
+
- Visual regression process:
|
|
121
|
+
- Owner/approver:
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# Top-Brand Frontend Spec Template
|
|
2
|
+
|
|
3
|
+
Use this when the user wants a frontend that feels as polished as leading global brands without copying any single brand exactly.
|
|
4
|
+
|
|
5
|
+
## 1. Product Context
|
|
6
|
+
|
|
7
|
+
- Product name:
|
|
8
|
+
- Category:
|
|
9
|
+
- Primary user:
|
|
10
|
+
- Primary task:
|
|
11
|
+
- Business goal:
|
|
12
|
+
- Platform:
|
|
13
|
+
- Evidence confidence:
|
|
14
|
+
|
|
15
|
+
## 2. Brand-Inspiration Blend
|
|
16
|
+
|
|
17
|
+
Choose 2-3 compatible methods from `references/top-100-brand-website-analysis.md`.
|
|
18
|
+
|
|
19
|
+
- Primary method:
|
|
20
|
+
- Secondary method:
|
|
21
|
+
- Optional accent method:
|
|
22
|
+
|
|
23
|
+
Example blends:
|
|
24
|
+
|
|
25
|
+
- Premium SaaS: Apple Product Cinema + Stripe/Adobe ecosystem clarity + IBM technical authority.
|
|
26
|
+
- Ecommerce marketplace: Amazon utility + Airbnb card discovery + Target friendly retail.
|
|
27
|
+
- Luxury product: Chanel restraint + Cartier detail + Apple product cinema.
|
|
28
|
+
- Developer tool: IBM/NVIDIA technical authority + Vercel minimal precision + Linear dashboard discipline.
|
|
29
|
+
- Food ordering: McDonald's/KFC direct ordering + Domino's tracking utility + Burger King playful brand.
|
|
30
|
+
|
|
31
|
+
## 3. UX Structure
|
|
32
|
+
|
|
33
|
+
- Primary entry point:
|
|
34
|
+
- Main CTA:
|
|
35
|
+
- Secondary CTA:
|
|
36
|
+
- Navigation model:
|
|
37
|
+
- Key sections:
|
|
38
|
+
1.
|
|
39
|
+
2.
|
|
40
|
+
3.
|
|
41
|
+
4.
|
|
42
|
+
5.
|
|
43
|
+
|
|
44
|
+
## 4. Layout Rules
|
|
45
|
+
|
|
46
|
+
- Hero layout:
|
|
47
|
+
- Grid system:
|
|
48
|
+
- Card style:
|
|
49
|
+
- Section rhythm:
|
|
50
|
+
- Sticky/persistent elements:
|
|
51
|
+
- Mobile behavior:
|
|
52
|
+
- Platform-specific behavior:
|
|
53
|
+
|
|
54
|
+
## 5. Visual Language
|
|
55
|
+
|
|
56
|
+
- Brand personality:
|
|
57
|
+
- Color strategy:
|
|
58
|
+
- Typography strategy:
|
|
59
|
+
- Spacing density:
|
|
60
|
+
- Radius/elevation:
|
|
61
|
+
- Icon/imagery style:
|
|
62
|
+
- Motion style:
|
|
63
|
+
|
|
64
|
+
## 6. Components
|
|
65
|
+
|
|
66
|
+
- Header/nav:
|
|
67
|
+
- Hero:
|
|
68
|
+
- CTA buttons:
|
|
69
|
+
- Cards:
|
|
70
|
+
- Forms/search:
|
|
71
|
+
- Tables/lists if needed:
|
|
72
|
+
- Testimonials/proof:
|
|
73
|
+
- Pricing/comparison if needed:
|
|
74
|
+
- Footer:
|
|
75
|
+
|
|
76
|
+
## 7. States
|
|
77
|
+
|
|
78
|
+
- Loading:
|
|
79
|
+
- Empty:
|
|
80
|
+
- Error:
|
|
81
|
+
- Success:
|
|
82
|
+
- Disabled:
|
|
83
|
+
- Hover/focus/active:
|
|
84
|
+
- Mobile menu:
|
|
85
|
+
- Offline/permission/partial data if relevant:
|
|
86
|
+
|
|
87
|
+
## 8. Accessibility
|
|
88
|
+
|
|
89
|
+
- Semantic structure:
|
|
90
|
+
- Keyboard behavior:
|
|
91
|
+
- Focus states:
|
|
92
|
+
- Contrast:
|
|
93
|
+
- Reduced motion:
|
|
94
|
+
- Labels and error messages:
|
|
95
|
+
- Complex widget behavior:
|
|
96
|
+
|
|
97
|
+
## 9. Copy System
|
|
98
|
+
|
|
99
|
+
- H1:
|
|
100
|
+
- Value proposition:
|
|
101
|
+
- Primary CTA label:
|
|
102
|
+
- Secondary CTA label:
|
|
103
|
+
- Proof line:
|
|
104
|
+
- Empty-state copy:
|
|
105
|
+
- Error copy:
|
|
106
|
+
- Localization/text expansion notes:
|
|
107
|
+
|
|
108
|
+
## 10. Implementation Notes
|
|
109
|
+
|
|
110
|
+
- Existing framework/components:
|
|
111
|
+
- CSS approach:
|
|
112
|
+
- Token names:
|
|
113
|
+
- Data requirements:
|
|
114
|
+
- Analytics events:
|
|
115
|
+
- QA checks:
|
|
116
|
+
|
|
117
|
+
## 11. Quality Gates
|
|
118
|
+
|
|
119
|
+
- Primary task success criteria:
|
|
120
|
+
- Accessibility gate:
|
|
121
|
+
- Responsive/platform gate:
|
|
122
|
+
- Performance perception gate:
|
|
123
|
+
- Content/i18n gate:
|
|
124
|
+
- Ethics/privacy gate:
|
|
125
|
+
|
|
126
|
+
## 12. Do Not Copy
|
|
127
|
+
|
|
128
|
+
- Do not copy brand logos.
|
|
129
|
+
- Do not copy exact trademarked color combinations unless the user owns the brand.
|
|
130
|
+
- Do not copy proprietary images or illustrations.
|
|
131
|
+
- Do not copy exact page layouts pixel-for-pixel.
|
|
132
|
+
- Extract reusable principles instead: hierarchy, spacing, structure, behavior, tone.
|
|
133
|
+
- Verify current brand/site claims before citing them as facts.
|