learnship 1.9.9 → 1.9.11
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/.claude-plugin/plugin.json +1 -1
- package/.cursor-plugin/plugin.json +1 -1
- package/README.md +4 -4
- package/bin/install.js +49 -15
- package/cursor-rules/learnship.mdc +4 -1
- package/gemini-extension.json +1 -1
- package/learnship/workflows/sync-upstream-skills.md +6 -6
- package/package.json +1 -1
- package/skills/impeccable/SKILL.md +16 -6
- package/skills/impeccable/arrange/SKILL.md +127 -0
- package/skills/impeccable/audit/SKILL.md +2 -2
- package/skills/impeccable/frontend-design/SKILL.md +21 -1
- package/skills/impeccable/frontend-design/reference/typography.md +4 -2
- package/skills/impeccable/overdrive/SKILL.md +144 -0
- package/skills/impeccable/typeset/SKILL.md +118 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "learnship",
|
|
3
3
|
"description": "Agentic engineering done right — 42 structured workflows, persistent memory across sessions, integrated learning partner, and impeccable UI design system. Works with Claude Code, Windsurf, Cursor, Gemini CLI, OpenCode, and Codex.",
|
|
4
|
-
"version": "1.9.
|
|
4
|
+
"version": "1.9.11",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Favio Vazquez",
|
|
7
7
|
"email": "favio.vazquezp@gmail.com"
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "learnship",
|
|
3
3
|
"displayName": "learnship",
|
|
4
4
|
"description": "Agentic engineering done right — 42 structured workflows, persistent memory across sessions, integrated learning partner, and impeccable UI design system.",
|
|
5
|
-
"version": "1.9.
|
|
5
|
+
"version": "1.9.11",
|
|
6
6
|
"logo": "assets/logo.png",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "Favio Vazquez",
|
package/README.md
CHANGED
|
@@ -136,7 +136,7 @@ What's covered:
|
|
|
136
136
|
- **[Getting Started](https://faviovazquez.github.io/learnship/getting-started/installation/)**: install commands, first project walkthrough, the 5 commands you need to know
|
|
137
137
|
- **[Platform Guide](https://faviovazquez.github.io/learnship/platform-guide/windsurf/)**: dedicated pages for Windsurf, Claude Code, Cursor, OpenCode, Gemini CLI, and Codex CLI
|
|
138
138
|
- **[Core Concepts](https://faviovazquez.github.io/learnship/core-concepts/phase-loop/)**: phase loop, context engineering, planning artifacts, agentic vs vibe coding
|
|
139
|
-
- **[Skills](https://faviovazquez.github.io/learnship/skills/agentic-learning/)**: all 11 `@agentic-learning` actions and all
|
|
139
|
+
- **[Skills](https://faviovazquez.github.io/learnship/skills/agentic-learning/)**: all 11 `@agentic-learning` actions and all 21 `impeccable` design commands
|
|
140
140
|
- **[Workflow Reference](https://faviovazquez.github.io/learnship/workflow-reference/core/)**: all 42 workflows documented with when and why to use each
|
|
141
141
|
- **[Configuration](https://faviovazquez.github.io/learnship/configuration/)**: full `.planning/config.json` schema, speed presets, parallelization
|
|
142
142
|
|
|
@@ -234,7 +234,7 @@ Three integrated layers that reinforce each other:
|
|
|
234
234
|
|-------|-------------|
|
|
235
235
|
| **Workflow Engine** | Spec-driven phases → context-engineered plans → wave-ordered execution → verified delivery |
|
|
236
236
|
| **Learning Partner** | Neuroscience-backed checkpoints at every phase transition: retrieval, reflection, spacing, struggle |
|
|
237
|
-
| **Design System** |
|
|
237
|
+
| **Design System** | 21 impeccable steering commands for production-grade UI: `/audit`, `/critique`, `/polish`, and more |
|
|
238
238
|
|
|
239
239
|
```mermaid
|
|
240
240
|
graph LR
|
|
@@ -502,7 +502,7 @@ learning_mode: "manual" → only when you explicitly invoke @agentic-learning
|
|
|
502
502
|
|
|
503
503
|
## 🎨 Design System
|
|
504
504
|
|
|
505
|
-
The **impeccable** skill suite is always active as project context for any UI work. It provides design direction, anti-patterns, and
|
|
505
|
+
The **impeccable** skill suite is always active as project context for any UI work. It provides design direction, anti-patterns, and 21 steering commands that prevent generic AI aesthetics. Based on [@pbakaus/impeccable](https://github.com/pbakaus/impeccable).
|
|
506
506
|
|
|
507
507
|
### Commands
|
|
508
508
|
|
|
@@ -746,7 +746,7 @@ learnship/
|
|
|
746
746
|
│ ├── workflows/ # 42 workflows as slash commands
|
|
747
747
|
│ └── skills/
|
|
748
748
|
│ ├── agentic-learning/ # Learning partner (SKILL.md + references), native on Windsurf + Claude Code
|
|
749
|
-
│ └── impeccable/ # Design suite:
|
|
749
|
+
│ └── impeccable/ # Design suite: 21 skills, native on Windsurf + Claude Code
|
|
750
750
|
│ ├── frontend-design/ # Base skill + 7 reference files (typography, color, motion…)
|
|
751
751
|
│ ├── audit/ # /audit
|
|
752
752
|
│ ├── critique/ # /critique
|
package/bin/install.js
CHANGED
|
@@ -608,23 +608,56 @@ function installClaudePlugins(skillsSrc, targetDir) {
|
|
|
608
608
|
const dest = path.join(pluginSkillsDir, skillName);
|
|
609
609
|
|
|
610
610
|
if (skillName === 'impeccable') {
|
|
611
|
-
// impeccable:
|
|
612
|
-
//
|
|
611
|
+
// impeccable: build a single inlined SKILL.md that contains all sub-skill
|
|
612
|
+
// content inline — same pattern as agentic-learning.
|
|
613
|
+
// Claude Code cannot follow markdown reference links to sibling files, so
|
|
614
|
+
// the hollow index approach produced an "@impeccable isn't installed" error.
|
|
613
615
|
fs.mkdirSync(dest, { recursive: true });
|
|
614
|
-
|
|
615
|
-
//
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
const
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
616
|
+
|
|
617
|
+
// Read root frontmatter + intro (everything up to the ## Actions section)
|
|
618
|
+
const rootContent = fs.readFileSync(path.join(srcPath, 'SKILL.md'), 'utf8');
|
|
619
|
+
// Strip frontmatter, keep the prose intro + "After running" footer
|
|
620
|
+
const rootBody = rootContent.replace(/^---[\s\S]*?---\n/, '');
|
|
621
|
+
|
|
622
|
+
// Ordered sub-actions (defines appearance order in the inlined file)
|
|
623
|
+
const SUB_ACTION_ORDER = [
|
|
624
|
+
'adapt', 'animate', 'arrange', 'audit', 'bolder', 'clarify', 'colorize',
|
|
625
|
+
'critique', 'delight', 'distill', 'extract', 'frontend-design',
|
|
626
|
+
'harden', 'normalize', 'onboard', 'optimize', 'overdrive', 'polish',
|
|
627
|
+
'quieter', 'teach-impeccable', 'typeset',
|
|
628
|
+
];
|
|
629
|
+
|
|
630
|
+
// Build inlined sections by reading each sub-skill's body
|
|
631
|
+
const inlinedSections = [];
|
|
632
|
+
for (const subName of SUB_ACTION_ORDER) {
|
|
633
|
+
const subSkillPath = path.join(srcPath, subName, 'SKILL.md');
|
|
634
|
+
if (!fs.existsSync(subSkillPath)) continue;
|
|
635
|
+
const subContent = fs.readFileSync(subSkillPath, 'utf8');
|
|
636
|
+
// Strip YAML frontmatter, keep body only
|
|
637
|
+
const subBody = subContent.replace(/^---[\s\S]*?---\n/, '').trim();
|
|
638
|
+
// Also copy sub-skill directory (for Windsurf native skill support)
|
|
639
|
+
const subDest = path.join(dest, subName);
|
|
640
|
+
copyDir(path.join(srcPath, subName), subDest, '', 'claude');
|
|
641
|
+
inlinedSections.push(`\n## Action: \`${subName}\`\n\n${subBody}`);
|
|
627
642
|
}
|
|
643
|
+
|
|
644
|
+
// Root frontmatter: keep original header but update description to remove
|
|
645
|
+
// the "Invoke with @impeccable" preamble that confused Claude Code's matcher
|
|
646
|
+
const inlinedSkillMd =
|
|
647
|
+
`---\nname: impeccable\ndescription: >\n` +
|
|
648
|
+
` A design quality system for frontend interfaces. 21 focused actions for\n` +
|
|
649
|
+
` auditing, refining, and elevating UI quality. Use when the user asks to\n` +
|
|
650
|
+
` audit, critique, polish, improve, review, or refine a frontend interface.\n` +
|
|
651
|
+
` Invoke with @impeccable followed by one of: adapt, animate, arrange, audit,\n` +
|
|
652
|
+
` bolder, clarify, colorize, critique, delight, distill, extract,\n` +
|
|
653
|
+
` frontend-design, harden, normalize, onboard, optimize, overdrive, polish,\n` +
|
|
654
|
+
` quieter, teach-impeccable, or typeset.\n` +
|
|
655
|
+
`---\n\n` +
|
|
656
|
+
rootBody.replace(/## Actions[\s\S]*?---\n\n## How to use/, '## How to use') +
|
|
657
|
+
`\n\n` +
|
|
658
|
+
inlinedSections.join('\n\n');
|
|
659
|
+
|
|
660
|
+
fs.writeFileSync(path.join(dest, 'SKILL.md'), inlinedSkillMd);
|
|
628
661
|
count++;
|
|
629
662
|
} else {
|
|
630
663
|
// agentic-learning and any future top-level skills — copy verbatim
|
|
@@ -1269,6 +1302,7 @@ if (process.env.LEARNSHIP_TEST_MODE) {
|
|
|
1269
1302
|
parseJsonc,
|
|
1270
1303
|
replacePaths,
|
|
1271
1304
|
rewriteNewProject,
|
|
1305
|
+
installClaudePlugins,
|
|
1272
1306
|
toHomePrefix,
|
|
1273
1307
|
LEARNSHIP_CODEX_MARKER,
|
|
1274
1308
|
CODEX_AGENT_SANDBOX,
|
|
@@ -55,6 +55,9 @@ Read `learning_mode` from `.planning/config.json` (default: "auto"):
|
|
|
55
55
|
|
|
56
56
|
The `impeccable` skill is available for UI work. Key commands:
|
|
57
57
|
- `@impeccable audit` — full quality audit
|
|
58
|
+
- `@impeccable critique` — UX effectiveness review
|
|
58
59
|
- `@impeccable polish` — final pass before shipping
|
|
59
60
|
- `@impeccable frontend-design` — apply design foundation principles
|
|
60
|
-
- `@impeccable
|
|
61
|
+
- `@impeccable arrange` — fix layout, spacing, visual rhythm
|
|
62
|
+
- `@impeccable typeset` — fix typography, fonts, hierarchy
|
|
63
|
+
- `@impeccable overdrive` — technically ambitious implementations
|
package/gemini-extension.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "learnship",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.11",
|
|
4
4
|
"description": "Agentic engineering done right — 42 structured workflows, persistent memory across sessions, integrated learning partner, and impeccable UI design system.",
|
|
5
5
|
"author": "Favio Vazquez",
|
|
6
6
|
"homepage": "https://faviovazquez.github.io/learnship/",
|
|
@@ -11,7 +11,7 @@ Pull the latest skill content from both upstream repositories into learnship's s
|
|
|
11
11
|
**What this touches:**
|
|
12
12
|
- `.windsurf/skills/agentic-learning/SKILL.md` — replaced from upstream
|
|
13
13
|
- `.windsurf/skills/agentic-learning/references/` — replaced from upstream
|
|
14
|
-
- `.windsurf/skills/impeccable/<sub-skill>/` — each of
|
|
14
|
+
- `.windsurf/skills/impeccable/<sub-skill>/` — each of 21 sub-skill dirs replaced from upstream
|
|
15
15
|
- `.windsurf/skills/impeccable/SKILL.md` — **NOT touched** (this is learnship's own dispatcher)
|
|
16
16
|
|
|
17
17
|
---
|
|
@@ -59,7 +59,7 @@ Will pull from:
|
|
|
59
59
|
Files updated:
|
|
60
60
|
.windsurf/skills/agentic-learning/SKILL.md
|
|
61
61
|
.windsurf/skills/agentic-learning/references/ (full replace)
|
|
62
|
-
.windsurf/skills/impeccable/<
|
|
62
|
+
.windsurf/skills/impeccable/<21 sub-skills>/ (full replace each)
|
|
63
63
|
|
|
64
64
|
Files preserved (learnship-owned):
|
|
65
65
|
.windsurf/skills/impeccable/SKILL.md (dispatcher — never touched)
|
|
@@ -89,7 +89,7 @@ ls "$AGENTIC_LEARN_TMP"
|
|
|
89
89
|
ls "$IMPECCABLE_TMP/source/skills/"
|
|
90
90
|
```
|
|
91
91
|
|
|
92
|
-
Confirm both clones succeeded — `SKILL.md` must exist in `$AGENTIC_LEARN_TMP` and
|
|
92
|
+
Confirm both clones succeeded — `SKILL.md` must exist in `$AGENTIC_LEARN_TMP` and at least 21 sub-skill dirs must exist under `$IMPECCABLE_TMP/source/skills/`. If either is missing, stop.
|
|
93
93
|
|
|
94
94
|
---
|
|
95
95
|
|
|
@@ -175,7 +175,7 @@ Check all 18 expected sub-skills are present and have a `SKILL.md`:
|
|
|
175
175
|
|
|
176
176
|
```bash
|
|
177
177
|
IMPECCABLE_DEST="$(pwd)/.windsurf/skills/impeccable"
|
|
178
|
-
expected="adapt animate audit bolder clarify colorize critique delight distill extract frontend-design harden normalize onboard optimize polish quieter teach-impeccable"
|
|
178
|
+
expected="adapt animate arrange audit bolder clarify colorize critique delight distill extract frontend-design harden normalize onboard optimize overdrive polish quieter teach-impeccable typeset"
|
|
179
179
|
missing=""
|
|
180
180
|
|
|
181
181
|
for skill in $expected; do
|
|
@@ -190,7 +190,7 @@ if [ -n "$missing" ]; then
|
|
|
190
190
|
cp -r "$BACKUP_DIR/impeccable/." "$IMPECCABLE_DEST/"
|
|
191
191
|
echo "Restored. Check upstream structure manually."
|
|
192
192
|
else
|
|
193
|
-
echo "All
|
|
193
|
+
echo "All 21 impeccable sub-skills present ✓"
|
|
194
194
|
fi
|
|
195
195
|
|
|
196
196
|
# Verify dispatcher is still intact
|
|
@@ -251,7 +251,7 @@ agentic-learning:
|
|
|
251
251
|
references/ ✓ synced ([N] files)
|
|
252
252
|
|
|
253
253
|
impeccable:
|
|
254
|
-
|
|
254
|
+
21 sub-skills ✓ synced from pbakaus/impeccable
|
|
255
255
|
SKILL.md ✓ preserved (learnship dispatcher)
|
|
256
256
|
|
|
257
257
|
All platforms updated (installer re-run):
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "learnship",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.11",
|
|
4
4
|
"description": "Learn as you build. Build with intent. — A multi-platform agentic engineering system for Windsurf, Claude Code, Cursor, OpenCode, Gemini CLI, and Codex: spec-driven workflows, integrated learning, and production-grade design.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"agentic",
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: impeccable
|
|
3
3
|
description: >
|
|
4
|
-
A design quality system for frontend interfaces.
|
|
4
|
+
A design quality system for frontend interfaces. 21 focused actions for
|
|
5
5
|
auditing, refining, and elevating UI quality. Invoke with @impeccable
|
|
6
|
-
followed by one of: adapt, animate, audit, bolder, clarify,
|
|
7
|
-
critique, delight, distill, extract, frontend-design, harden,
|
|
8
|
-
onboard, optimize, polish, quieter,
|
|
6
|
+
followed by one of: adapt, animate, arrange, audit, bolder, clarify,
|
|
7
|
+
colorize, critique, delight, distill, extract, frontend-design, harden,
|
|
8
|
+
normalize, onboard, optimize, overdrive, polish, quieter, teach-impeccable,
|
|
9
|
+
or typeset.
|
|
9
10
|
license: MIT
|
|
10
11
|
compatibility: Works with Windsurf Cascade, Claude Code, and any AgentSkills-compatible agent.
|
|
11
12
|
metadata:
|
|
@@ -15,7 +16,7 @@ metadata:
|
|
|
15
16
|
|
|
16
17
|
# Impeccable
|
|
17
18
|
|
|
18
|
-
A design quality system composed of
|
|
19
|
+
A design quality system composed of 21 focused actions for auditing, refining,
|
|
19
20
|
and elevating frontend interfaces. Each action is a specialist — invoke the one
|
|
20
21
|
that matches your current need.
|
|
21
22
|
|
|
@@ -34,6 +35,9 @@ principles and anti-patterns.
|
|
|
34
35
|
### `animate` — Purposeful motion & micro-interactions
|
|
35
36
|
[animate/SKILL.md](animate/SKILL.md)
|
|
36
37
|
|
|
38
|
+
### `arrange` — Layout, spacing & visual rhythm
|
|
39
|
+
[arrange/SKILL.md](arrange/SKILL.md)
|
|
40
|
+
|
|
37
41
|
### `audit` — Comprehensive quality audit
|
|
38
42
|
[audit/SKILL.md](audit/SKILL.md)
|
|
39
43
|
|
|
@@ -82,6 +86,12 @@ principles and anti-patterns.
|
|
|
82
86
|
### `teach-impeccable` — Project design context setup
|
|
83
87
|
[teach-impeccable/SKILL.md](teach-impeccable/SKILL.md)
|
|
84
88
|
|
|
89
|
+
### `typeset` — Typography: fonts, hierarchy & readability
|
|
90
|
+
[typeset/SKILL.md](typeset/SKILL.md)
|
|
91
|
+
|
|
92
|
+
### `overdrive` — Technically ambitious implementations
|
|
93
|
+
[overdrive/SKILL.md](overdrive/SKILL.md)
|
|
94
|
+
|
|
85
95
|
---
|
|
86
96
|
|
|
87
97
|
## How to use
|
|
@@ -120,6 +130,6 @@ Or apply them directly now and use `/decision-log` to record what was changed an
|
|
|
120
130
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
121
131
|
```
|
|
122
132
|
|
|
123
|
-
This applies after: `audit`, `critique`, `polish`, `normalize`, `harden`, `adapt`, `optimize`, `bolder`, `quieter`, `colorize`, `clarify`, `delight`, `onboard`, `animate`, `distill`, `extract`.
|
|
133
|
+
This applies after: `audit`, `critique`, `polish`, `normalize`, `harden`, `adapt`, `optimize`, `bolder`, `quieter`, `colorize`, `clarify`, `delight`, `onboard`, `animate`, `distill`, `extract`, `arrange`, `typeset`, `overdrive`.
|
|
124
134
|
|
|
125
135
|
For `teach-impeccable` and `frontend-design` (which set up context, not produce recommendations), skip this suggestion.
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: arrange
|
|
3
|
+
description: Improve layout, spacing, and visual rhythm. Fixes monotonous grids, inconsistent spacing, and weak visual hierarchy to create intentional compositions.
|
|
4
|
+
args:
|
|
5
|
+
- name: target
|
|
6
|
+
description: The feature or component to improve layout for (optional)
|
|
7
|
+
required: false
|
|
8
|
+
user-invokable: true
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
Assess and improve layout and spacing that feels monotonous, crowded, or structurally weak — turning generic arrangements into intentional, rhythmic compositions.
|
|
12
|
+
|
|
13
|
+
## MANDATORY PREPARATION
|
|
14
|
+
|
|
15
|
+
Use the frontend-design skill — it contains design principles, anti-patterns, and the **Context Gathering Protocol**. Follow the protocol before proceeding — if no design context exists yet, you MUST run teach-impeccable first.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Assess Current Layout
|
|
20
|
+
|
|
21
|
+
Analyze what's weak about the current spatial design:
|
|
22
|
+
|
|
23
|
+
1. **Spacing**:
|
|
24
|
+
- Is spacing consistent or arbitrary? (Random padding/margin values)
|
|
25
|
+
- Is all spacing the same? (Equal padding everywhere = no rhythm)
|
|
26
|
+
- Are related elements grouped tightly, with generous space between groups?
|
|
27
|
+
|
|
28
|
+
2. **Visual hierarchy**:
|
|
29
|
+
- Apply the squint test: blur your (metaphorical) eyes — can you still identify the most important element, second most important, and clear groupings?
|
|
30
|
+
- Is hierarchy achieved effectively? (Space and weight alone can be enough — but is the current approach working?)
|
|
31
|
+
- Does whitespace guide the eye to what matters?
|
|
32
|
+
|
|
33
|
+
3. **Grid & structure**:
|
|
34
|
+
- Is there a clear underlying structure, or does the layout feel random?
|
|
35
|
+
- Are identical card grids used everywhere? (Icon + heading + text, repeated endlessly)
|
|
36
|
+
- Is everything centered? (Left-aligned with asymmetric layouts feels more designed, but not a hard and fast rule)
|
|
37
|
+
|
|
38
|
+
4. **Rhythm & variety**:
|
|
39
|
+
- Does the layout have visual rhythm? (Alternating tight/generous spacing)
|
|
40
|
+
- Is every section structured the same way? (Monotonous repetition)
|
|
41
|
+
- Are there intentional moments of surprise or emphasis?
|
|
42
|
+
|
|
43
|
+
5. **Density**:
|
|
44
|
+
- Is the layout too cramped? (Not enough breathing room)
|
|
45
|
+
- Is the layout too sparse? (Excessive whitespace without purpose)
|
|
46
|
+
- Does density match the content type? (Data-dense UIs need tighter spacing; marketing pages need more air)
|
|
47
|
+
|
|
48
|
+
**CRITICAL**: Layout problems are often the root cause of interfaces feeling "off" even when colors and fonts are fine. Space is a design material — use it with intention.
|
|
49
|
+
|
|
50
|
+
## Plan Layout Improvements
|
|
51
|
+
|
|
52
|
+
Consult the [spatial design reference](../frontend-design/reference/spatial-design.md) from the frontend-design skill for detailed guidance on grids, rhythm, and container queries.
|
|
53
|
+
|
|
54
|
+
Create a systematic plan:
|
|
55
|
+
|
|
56
|
+
- **Spacing system**: Use a consistent scale — whether that's a framework's built-in scale (e.g., Tailwind), rem-based tokens, or a custom system. The specific values matter less than consistency.
|
|
57
|
+
- **Hierarchy strategy**: How will space communicate importance?
|
|
58
|
+
- **Layout approach**: What structure fits the content? Flex for 1D, Grid for 2D, named areas for complex page layouts.
|
|
59
|
+
- **Rhythm**: Where should spacing be tight vs generous?
|
|
60
|
+
|
|
61
|
+
## Improve Layout Systematically
|
|
62
|
+
|
|
63
|
+
### Establish a Spacing System
|
|
64
|
+
|
|
65
|
+
- Use a consistent spacing scale — framework scales (Tailwind, etc.), rem-based tokens, or a custom scale all work. What matters is that values come from a defined set, not arbitrary numbers.
|
|
66
|
+
- Name tokens semantically if using custom properties: `--space-xs` through `--space-xl`, not `--spacing-8`
|
|
67
|
+
- Use `gap` for sibling spacing instead of margins — eliminates margin collapse hacks
|
|
68
|
+
- Apply `clamp()` for fluid spacing that breathes on larger screens
|
|
69
|
+
|
|
70
|
+
### Create Visual Rhythm
|
|
71
|
+
|
|
72
|
+
- **Tight grouping** for related elements (8-12px between siblings)
|
|
73
|
+
- **Generous separation** between distinct sections (48-96px)
|
|
74
|
+
- **Varied spacing** within sections — not every row needs the same gap
|
|
75
|
+
- **Asymmetric compositions** — break the predictable centered-content pattern when it makes sense
|
|
76
|
+
|
|
77
|
+
### Choose the Right Layout Tool
|
|
78
|
+
|
|
79
|
+
- **Use Flexbox for 1D layouts**: Rows of items, nav bars, button groups, card contents, most component internals. Flex is simpler and more appropriate for the majority of layout tasks.
|
|
80
|
+
- **Use Grid for 2D layouts**: Page-level structure, dashboards, data-dense interfaces, anything where rows AND columns need coordinated control.
|
|
81
|
+
- **Don't default to Grid** when Flexbox with `flex-wrap` would be simpler and more flexible.
|
|
82
|
+
- Use `repeat(auto-fit, minmax(280px, 1fr))` for responsive grids without breakpoints.
|
|
83
|
+
- Use named grid areas (`grid-template-areas`) for complex page layouts — redefine at breakpoints.
|
|
84
|
+
|
|
85
|
+
### Break Card Grid Monotony
|
|
86
|
+
|
|
87
|
+
- Don't default to card grids for everything — spacing and alignment create visual grouping naturally
|
|
88
|
+
- Use cards only when content is truly distinct and actionable — never nest cards inside cards
|
|
89
|
+
- Vary card sizes, span columns, or mix cards with non-card content to break repetition
|
|
90
|
+
|
|
91
|
+
### Strengthen Visual Hierarchy
|
|
92
|
+
|
|
93
|
+
- Use the fewest dimensions needed for clear hierarchy. Space alone can be enough — generous whitespace around an element draws the eye. Some of the most sophisticated designs achieve rhythm with just space and weight. Add color or size contrast only when simpler means aren't sufficient.
|
|
94
|
+
- Be aware of reading flow — in LTR languages, the eye naturally scans top-left to bottom-right, but primary action placement depends on context (e.g., bottom-right in dialogs, top in navigation).
|
|
95
|
+
- Create clear content groupings through proximity and separation.
|
|
96
|
+
|
|
97
|
+
### Manage Depth & Elevation
|
|
98
|
+
|
|
99
|
+
- Create a semantic z-index scale (dropdown → sticky → modal-backdrop → modal → toast → tooltip)
|
|
100
|
+
- Build a consistent shadow scale (sm → md → lg → xl) — shadows should be subtle
|
|
101
|
+
- Use elevation to reinforce hierarchy, not as decoration
|
|
102
|
+
|
|
103
|
+
### Optical Adjustments
|
|
104
|
+
|
|
105
|
+
- If an icon looks visually off-center despite being geometrically centered, nudge it — but only if you're confident it actually looks wrong. Don't adjust speculatively.
|
|
106
|
+
|
|
107
|
+
**NEVER**:
|
|
108
|
+
- Use arbitrary spacing values outside your scale
|
|
109
|
+
- Make all spacing equal — variety creates hierarchy
|
|
110
|
+
- Wrap everything in cards — not everything needs a container
|
|
111
|
+
- Nest cards inside cards — use spacing and dividers for hierarchy within
|
|
112
|
+
- Use identical card grids everywhere (icon + heading + text, repeated)
|
|
113
|
+
- Center everything — left-aligned with asymmetry feels more designed
|
|
114
|
+
- Default to the hero metric layout (big number, small label, stats, gradient) as a template. If showing real user data, a prominent metric can work — but it should display actual data, not decorative numbers.
|
|
115
|
+
- Default to CSS Grid when Flexbox would be simpler — use the simplest tool for the job
|
|
116
|
+
- Use arbitrary z-index values (999, 9999) — build a semantic scale
|
|
117
|
+
|
|
118
|
+
## Verify Layout Improvements
|
|
119
|
+
|
|
120
|
+
- **Squint test**: Can you identify primary, secondary, and groupings with blurred vision?
|
|
121
|
+
- **Rhythm**: Does the page have a satisfying beat of tight and generous spacing?
|
|
122
|
+
- **Hierarchy**: Is the most important content obvious within 2 seconds?
|
|
123
|
+
- **Breathing room**: Does the layout feel comfortable, not cramped or wasteful?
|
|
124
|
+
- **Consistency**: Is the spacing system applied uniformly?
|
|
125
|
+
- **Responsiveness**: Does the layout adapt gracefully across screen sizes?
|
|
126
|
+
|
|
127
|
+
Remember: Space is the most underused design tool. A layout with the right rhythm and hierarchy can make even simple content feel polished and intentional.
|
|
@@ -71,7 +71,7 @@ For each issue, document:
|
|
|
71
71
|
- **Impact**: How it affects users
|
|
72
72
|
- **WCAG/Standard**: Which standard it violates (if applicable)
|
|
73
73
|
- **Recommendation**: How to fix it
|
|
74
|
-
- **Suggested command**: Which command to use (prefer: /polish, /audit, /critique, /normalize, /colorize, /animate, /bolder, /quieter, /distill, /clarify, /optimize, /harden, /delight, /extract, /adapt, /onboard, /teach-impeccable — or other installed skills you're sure exist)
|
|
74
|
+
- **Suggested command**: Which command to use (prefer: /polish, /audit, /critique, /normalize, /colorize, /animate, /bolder, /quieter, /distill, /clarify, /optimize, /harden, /delight, /extract, /adapt, /onboard, /arrange, /typeset, /overdrive, /teach-impeccable — or other installed skills you're sure exist)
|
|
75
75
|
|
|
76
76
|
#### Critical Issues
|
|
77
77
|
[Issues that block core functionality or violate WCAG A]
|
|
@@ -108,7 +108,7 @@ Create actionable plan:
|
|
|
108
108
|
|
|
109
109
|
### Suggested Commands for Fixes
|
|
110
110
|
|
|
111
|
-
Map issues to available commands. Prefer these: /polish, /audit, /critique, /normalize, /colorize, /animate, /bolder, /quieter, /distill, /clarify, /optimize, /harden, /delight, /extract, /adapt, /onboard, /teach-impeccable. You may also suggest other installed skills you're sure exist, but never invent commands.
|
|
111
|
+
Map issues to available commands. Prefer these: /polish, /audit, /critique, /normalize, /colorize, /animate, /bolder, /quieter, /distill, /clarify, /optimize, /harden, /delight, /extract, /adapt, /onboard, /arrange, /typeset, /overdrive, /teach-impeccable. You may also suggest other installed skills you're sure exist, but never invent commands.
|
|
112
112
|
|
|
113
113
|
Examples:
|
|
114
114
|
- "Use `/normalize` to align with design system (addresses N theming issues)"
|
|
@@ -6,6 +6,26 @@ license: Apache 2.0. Based on Anthropic's frontend-design skill. See NOTICE.md f
|
|
|
6
6
|
|
|
7
7
|
This skill guides creation of distinctive, production-grade frontend interfaces that avoid generic "AI slop" aesthetics. Implement real working code with exceptional attention to aesthetic details and creative choices.
|
|
8
8
|
|
|
9
|
+
## Context Gathering Protocol
|
|
10
|
+
|
|
11
|
+
Design skills produce generic output without project context. You MUST have confirmed design context before doing any design work.
|
|
12
|
+
|
|
13
|
+
**Required context** — every design skill needs at minimum:
|
|
14
|
+
- **Target audience**: Who uses this product and in what context?
|
|
15
|
+
- **Use cases**: What jobs are they trying to get done?
|
|
16
|
+
- **Brand personality/tone**: How should the interface feel?
|
|
17
|
+
|
|
18
|
+
Individual skills may require additional context — check the skill's preparation section for specifics.
|
|
19
|
+
|
|
20
|
+
**CRITICAL**: You cannot infer this context by reading the codebase. Code tells you what was built, not who it's for or what it should feel like. Only the creator can provide this context.
|
|
21
|
+
|
|
22
|
+
**Gathering order:**
|
|
23
|
+
1. **Check current instructions (instant)**: If your loaded instructions already contain a **Design Context** section, proceed immediately.
|
|
24
|
+
2. **Check .impeccable.md (fast)**: If not in instructions, read `.impeccable.md` from the project root. If it exists and contains the required context, proceed.
|
|
25
|
+
3. **Run teach-impeccable (REQUIRED)**: If neither source has context, you MUST run the teach-impeccable skill NOW before doing anything else. Do NOT skip this step. Do NOT attempt to infer context from the codebase instead.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
9
29
|
## Design Direction
|
|
10
30
|
|
|
11
31
|
Commit to a BOLD aesthetic direction:
|
|
@@ -124,4 +144,4 @@ Match implementation complexity to the aesthetic vision. Maximalist designs need
|
|
|
124
144
|
|
|
125
145
|
Interpret creatively and make unexpected choices that feel genuinely designed for the context. No design should be the same. Vary between light and dark themes, different fonts, different aesthetics. NEVER converge on common choices across generations.
|
|
126
146
|
|
|
127
|
-
Remember:
|
|
147
|
+
Remember: You are capable of extraordinary creative work. Don't hold back—show what can truly be created when thinking outside the box and committing fully to a distinctive vision.
|
|
@@ -86,9 +86,11 @@ Tools like [Fontaine](https://github.com/unjs/fontaine) calculate these override
|
|
|
86
86
|
|
|
87
87
|
### Fluid Type
|
|
88
88
|
|
|
89
|
-
|
|
89
|
+
Fluid typography via `clamp(min, preferred, max)` scales text smoothly with the viewport. The middle value (e.g., `5vw + 1rem`) controls scaling rate—higher vw = faster scaling. Add a rem offset so it doesn't collapse to 0 on small screens.
|
|
90
90
|
|
|
91
|
-
**
|
|
91
|
+
**Use fluid type for**: Headings and display text on marketing/content pages where text dominates the layout and needs to breathe across viewport sizes.
|
|
92
|
+
|
|
93
|
+
**Use fixed `rem` scales for**: App UIs, dashboards, and data-dense interfaces. No major app design system (Material, Polaris, Primer, Carbon) uses fluid type in product UI — fixed scales with optional breakpoint adjustments give the spatial predictability that container-based layouts need. Body text should also be fixed even on marketing pages, since the size difference across viewports is too small to warrant it.
|
|
92
94
|
|
|
93
95
|
### OpenType Features
|
|
94
96
|
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: overdrive
|
|
3
|
+
description: Push interfaces past conventional limits with technically ambitious implementations. Whether that's a shader, a 60fps virtual table, spring physics on a dialog, or scroll-driven reveals — make users ask "how did they do that?"
|
|
4
|
+
args:
|
|
5
|
+
- name: target
|
|
6
|
+
description: The feature or area to push into overdrive (optional)
|
|
7
|
+
required: false
|
|
8
|
+
user-invokable: true
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
Start your response with:
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
──────────── ⚡ OVERDRIVE ─────────────
|
|
15
|
+
》》》 Entering overdrive mode...
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Push an interface past conventional limits. This isn't just about visual effects — it's about using the full power of the browser to make any part of an interface feel extraordinary: a table that handles a million rows, a dialog that morphs from its trigger, a form that validates in real-time with streaming feedback, a page transition that feels cinematic.
|
|
19
|
+
|
|
20
|
+
## MANDATORY PREPARATION
|
|
21
|
+
|
|
22
|
+
Use the frontend-design skill — it contains design principles, anti-patterns, and the **Context Gathering Protocol**. Follow the protocol before proceeding — if no design context exists yet, you MUST run teach-impeccable first.
|
|
23
|
+
|
|
24
|
+
**EXTRA IMPORTANT FOR THIS SKILL**: Context determines what "extraordinary" means. A particle system on a creative portfolio is impressive. The same particle system on a settings page is embarrassing. But a settings page with instant optimistic saves and animated state transitions? That's extraordinary too. Understand the project's personality and goals before deciding what's appropriate.
|
|
25
|
+
|
|
26
|
+
### Propose Before Building
|
|
27
|
+
|
|
28
|
+
This skill has the highest potential to misfire. Do NOT jump straight into implementation. You MUST:
|
|
29
|
+
|
|
30
|
+
1. **Think through 2-3 different directions** — consider different techniques, levels of ambition, and aesthetic approaches. For each direction, briefly describe what the result would look and feel like.
|
|
31
|
+
2. **Ask the user:** to present these directions and get the user's pick before writing any code. Explain trade-offs (browser support, performance cost, complexity).
|
|
32
|
+
3. Only proceed with the direction the user confirms.
|
|
33
|
+
|
|
34
|
+
Skipping this step risks building something embarrassing that needs to be thrown away.
|
|
35
|
+
|
|
36
|
+
### Iterate with Browser Automation
|
|
37
|
+
|
|
38
|
+
Technically ambitious effects almost never work on the first try. You MUST actively use browser automation tools to preview your work, visually verify the result, and iterate. Do not assume the effect looks right — check it. Expect multiple rounds of refinement. The gap between "technically works" and "looks extraordinary" is closed through visual iteration, not code alone.
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Assess What "Extraordinary" Means Here
|
|
43
|
+
|
|
44
|
+
The right kind of technical ambition depends entirely on what you're working with. Before choosing a technique, ask: **what would make a user of THIS specific interface say "wow, that's nice"?**
|
|
45
|
+
|
|
46
|
+
### For visual/marketing surfaces
|
|
47
|
+
Pages, hero sections, landing pages, portfolios — the "wow" is often sensory: a scroll-driven reveal, a shader background, a cinematic page transition, generative art that responds to the cursor.
|
|
48
|
+
|
|
49
|
+
### For functional UI
|
|
50
|
+
Tables, forms, dialogs, navigation — the "wow" is in how it FEELS: a dialog that morphs from the button that triggered it via View Transitions, a data table that renders 100k rows at 60fps via virtual scrolling, a form with streaming validation that feels instant, drag-and-drop with spring physics.
|
|
51
|
+
|
|
52
|
+
### For performance-critical UI
|
|
53
|
+
The "wow" is invisible but felt: a search that filters 50k items without a flicker, a complex form that never blocks the main thread, an image editor that processes in near-real-time. The interface just never hesitates.
|
|
54
|
+
|
|
55
|
+
### For data-heavy interfaces
|
|
56
|
+
Charts and dashboards — the "wow" is in fluidity: GPU-accelerated rendering via Canvas/WebGL for massive datasets, animated transitions between data states, force-directed graph layouts that settle naturally.
|
|
57
|
+
|
|
58
|
+
**The common thread**: something about the implementation goes beyond what users expect from a web interface. The technique serves the experience, not the other way around.
|
|
59
|
+
|
|
60
|
+
## The Toolkit
|
|
61
|
+
|
|
62
|
+
Organized by what you're trying to achieve, not by technology name.
|
|
63
|
+
|
|
64
|
+
### Make transitions feel cinematic
|
|
65
|
+
- **View Transitions API** (same-document: all browsers; cross-document: no Firefox) — shared element morphing between states. A list item expanding into a detail page. A button morphing into a dialog. This is the closest thing to native FLIP animations.
|
|
66
|
+
- **`@starting-style`** (all browsers) — animate elements from `display: none` to visible with CSS only, including entry keyframes
|
|
67
|
+
- **Spring physics** — natural motion with mass, tension, and damping instead of cubic-bezier. Libraries: motion (formerly Framer Motion), GSAP, or roll your own spring solver.
|
|
68
|
+
|
|
69
|
+
### Tie animation to scroll position
|
|
70
|
+
- **Scroll-driven animations** (`animation-timeline: scroll()`) — CSS-only, no JS. Parallax, progress bars, reveal sequences all driven by scroll position. (Chrome/Edge/Safari; Firefox: flag only — always provide a static fallback)
|
|
71
|
+
|
|
72
|
+
### Render beyond CSS
|
|
73
|
+
- **WebGL** (all browsers) — shader effects, post-processing, particle systems. Libraries: Three.js, OGL (lightweight), regl. Use for effects CSS can't express.
|
|
74
|
+
- **WebGPU** (Chrome/Edge; Safari partial; Firefox: flag only) — next-gen GPU compute. More powerful than WebGL but limited browser support. Always fall back to WebGL2.
|
|
75
|
+
- **Canvas 2D / OffscreenCanvas** — custom rendering, pixel manipulation, or moving heavy rendering off the main thread entirely via Web Workers + OffscreenCanvas.
|
|
76
|
+
- **SVG filter chains** — displacement maps, turbulence, morphology for organic distortion effects. CSS-animatable.
|
|
77
|
+
|
|
78
|
+
### Make data feel alive
|
|
79
|
+
- **Virtual scrolling** — render only visible rows for tables/lists with tens of thousands of items. No library required for simple cases; TanStack Virtual for complex ones.
|
|
80
|
+
- **GPU-accelerated charts** — Canvas or WebGL-rendered data visualization for datasets too large for SVG/DOM. Libraries: deck.gl, regl-based custom renderers.
|
|
81
|
+
- **Animated data transitions** — morph between chart states rather than replacing. D3's `transition()` or View Transitions for DOM-based charts.
|
|
82
|
+
|
|
83
|
+
### Animate complex properties
|
|
84
|
+
- **`@property`** (all browsers) — register custom CSS properties with types, enabling animation of gradients, colors, and complex values that CSS can't normally interpolate.
|
|
85
|
+
- **Web Animations API** (all browsers) — JavaScript-driven animations with the performance of CSS. Composable, cancellable, reversible. The foundation for complex choreography.
|
|
86
|
+
|
|
87
|
+
### Push performance boundaries
|
|
88
|
+
- **Web Workers** — move computation off the main thread. Heavy data processing, image manipulation, search indexing — anything that would cause jank.
|
|
89
|
+
- **OffscreenCanvas** — render in a Worker thread. The main thread stays free while complex visuals render in the background.
|
|
90
|
+
- **WASM** — near-native performance for computation-heavy features. Image processing, physics simulations, codecs.
|
|
91
|
+
|
|
92
|
+
### Interact with the device
|
|
93
|
+
- **Web Audio API** — spatial audio, audio-reactive visualizations, sonic feedback. Requires user gesture to start.
|
|
94
|
+
- **Device APIs** — orientation, ambient light, geolocation. Use sparingly and always with user permission.
|
|
95
|
+
|
|
96
|
+
**NOTE**: This skill is about enhancing how an interface FEELS, not changing what a product DOES. Adding real-time collaboration, offline support, or new backend capabilities are product decisions, not UI enhancements. Focus on making existing features feel extraordinary.
|
|
97
|
+
|
|
98
|
+
## Implement with Discipline
|
|
99
|
+
|
|
100
|
+
### Progressive enhancement is non-negotiable
|
|
101
|
+
|
|
102
|
+
Every technique must degrade gracefully. The experience without the enhancement must still be good.
|
|
103
|
+
|
|
104
|
+
```css
|
|
105
|
+
@supports (animation-timeline: scroll()) {
|
|
106
|
+
.hero { animation-timeline: scroll(); }
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
```javascript
|
|
111
|
+
if ('gpu' in navigator) { /* WebGPU */ }
|
|
112
|
+
else if (canvas.getContext('webgl2')) { /* WebGL2 fallback */ }
|
|
113
|
+
/* CSS-only fallback must still look good */
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Performance rules
|
|
117
|
+
|
|
118
|
+
- Target 60fps. If dropping below 50, simplify.
|
|
119
|
+
- Respect `prefers-reduced-motion` — always. Provide a beautiful static alternative.
|
|
120
|
+
- Lazy-initialize heavy resources (WebGL contexts, WASM modules) only when near viewport.
|
|
121
|
+
- Pause off-screen rendering. Kill what you can't see.
|
|
122
|
+
- Test on real mid-range devices, not just your development machine.
|
|
123
|
+
|
|
124
|
+
### Polish is the difference
|
|
125
|
+
|
|
126
|
+
The gap between "cool" and "extraordinary" is in the last 20% of refinement: the easing curve on a spring animation, the timing offset in a staggered reveal, the subtle secondary motion that makes a transition feel physical. Don't ship the first version that works — ship the version that feels inevitable.
|
|
127
|
+
|
|
128
|
+
**NEVER**:
|
|
129
|
+
- Ignore `prefers-reduced-motion` — this is an accessibility requirement, not a suggestion
|
|
130
|
+
- Ship effects that cause jank on mid-range devices
|
|
131
|
+
- Use bleeding-edge APIs without a functional fallback
|
|
132
|
+
- Add sound without explicit user opt-in
|
|
133
|
+
- Use technical ambition to mask weak design fundamentals — fix those first with other skills
|
|
134
|
+
- Layer multiple competing extraordinary moments — focus creates impact, excess creates noise
|
|
135
|
+
|
|
136
|
+
## Verify the Result
|
|
137
|
+
|
|
138
|
+
- **The wow test**: Show it to someone who hasn't seen it. Do they react?
|
|
139
|
+
- **The removal test**: Take it away. Does the experience feel diminished, or does nobody notice?
|
|
140
|
+
- **The device test**: Run it on a phone, a tablet, a Chromebook. Still smooth?
|
|
141
|
+
- **The accessibility test**: Enable reduced motion. Still beautiful?
|
|
142
|
+
- **The context test**: Does this make sense for THIS brand and audience?
|
|
143
|
+
|
|
144
|
+
Remember: "Technically extraordinary" isn't about using the newest API. It's about making an interface do something users didn't think a website could do.
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: typeset
|
|
3
|
+
description: Improve typography by fixing font choices, hierarchy, sizing, weight consistency, and readability. Makes text feel intentional and polished.
|
|
4
|
+
args:
|
|
5
|
+
- name: target
|
|
6
|
+
description: The feature or component to improve typography for (optional)
|
|
7
|
+
required: false
|
|
8
|
+
user-invokable: true
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
Assess and improve typography that feels generic, inconsistent, or poorly structured — turning default-looking text into intentional, well-crafted type.
|
|
12
|
+
|
|
13
|
+
## MANDATORY PREPARATION
|
|
14
|
+
|
|
15
|
+
Use the frontend-design skill — it contains design principles, anti-patterns, and the **Context Gathering Protocol**. Follow the protocol before proceeding — if no design context exists yet, you MUST run teach-impeccable first.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Assess Current Typography
|
|
20
|
+
|
|
21
|
+
Analyze what's weak or generic about the current type:
|
|
22
|
+
|
|
23
|
+
1. **Font choices**:
|
|
24
|
+
- Are we using invisible defaults? (Inter, Roboto, Arial, Open Sans, system defaults)
|
|
25
|
+
- Does the font match the brand personality? (A playful brand shouldn't use a corporate typeface)
|
|
26
|
+
- Are there too many font families? (More than 2-3 is almost always a mess)
|
|
27
|
+
|
|
28
|
+
2. **Hierarchy**:
|
|
29
|
+
- Can you tell headings from body from captions at a glance?
|
|
30
|
+
- Are font sizes too close together? (14px, 15px, 16px = muddy hierarchy)
|
|
31
|
+
- Are weight contrasts strong enough? (Medium vs Regular is barely visible)
|
|
32
|
+
|
|
33
|
+
3. **Sizing & scale**:
|
|
34
|
+
- Is there a consistent type scale, or are sizes arbitrary?
|
|
35
|
+
- Does body text meet minimum readability? (16px+)
|
|
36
|
+
- Is the sizing strategy appropriate for the context? (Fixed `rem` scales for app UIs; fluid `clamp()` for marketing/content page headings)
|
|
37
|
+
|
|
38
|
+
4. **Readability**:
|
|
39
|
+
- Are line lengths comfortable? (45-75 characters ideal)
|
|
40
|
+
- Is line-height appropriate for the font and context?
|
|
41
|
+
- Is there enough contrast between text and background?
|
|
42
|
+
|
|
43
|
+
5. **Consistency**:
|
|
44
|
+
- Are the same elements styled the same way throughout?
|
|
45
|
+
- Are font weights used consistently? (Not bold in one section, semibold in another for the same role)
|
|
46
|
+
- Is letter-spacing intentional or default everywhere?
|
|
47
|
+
|
|
48
|
+
**CRITICAL**: The goal isn't to make text "fancier" — it's to make it clearer, more readable, and more intentional. Good typography is invisible; bad typography is distracting.
|
|
49
|
+
|
|
50
|
+
## Plan Typography Improvements
|
|
51
|
+
|
|
52
|
+
Consult the [typography reference](../frontend-design/reference/typography.md) from the frontend-design skill for detailed guidance on scales, pairing, and loading strategies.
|
|
53
|
+
|
|
54
|
+
Create a systematic plan:
|
|
55
|
+
|
|
56
|
+
- **Font selection**: Do fonts need replacing? What fits the brand/context?
|
|
57
|
+
- **Type scale**: Establish a modular scale (e.g., 1.25 ratio) with clear hierarchy
|
|
58
|
+
- **Weight strategy**: Which weights serve which roles? (Regular for body, Semibold for labels, Bold for headings — or whatever fits)
|
|
59
|
+
- **Spacing**: Line-heights, letter-spacing, and margins between typographic elements
|
|
60
|
+
|
|
61
|
+
## Improve Typography Systematically
|
|
62
|
+
|
|
63
|
+
### Font Selection
|
|
64
|
+
|
|
65
|
+
If fonts need replacing:
|
|
66
|
+
- Choose fonts that reflect the brand personality
|
|
67
|
+
- Pair with genuine contrast (serif + sans, geometric + humanist) — or use a single family in multiple weights
|
|
68
|
+
- Ensure web font loading doesn't cause layout shift (`font-display: swap`, metric-matched fallbacks)
|
|
69
|
+
|
|
70
|
+
### Establish Hierarchy
|
|
71
|
+
|
|
72
|
+
Build a clear type scale:
|
|
73
|
+
- **5 sizes cover most needs**: caption, secondary, body, subheading, heading
|
|
74
|
+
- **Use a consistent ratio** between levels (1.25, 1.333, or 1.5)
|
|
75
|
+
- **Combine dimensions**: Size + weight + color + space for strong hierarchy — don't rely on size alone
|
|
76
|
+
- **App UIs**: Use a fixed `rem`-based type scale, optionally adjusted at 1-2 breakpoints. Fluid sizing undermines the spatial predictability that dense, container-based layouts need
|
|
77
|
+
- **Marketing / content pages**: Use fluid sizing via `clamp(min, preferred, max)` for headings and display text. Keep body text fixed
|
|
78
|
+
|
|
79
|
+
### Fix Readability
|
|
80
|
+
|
|
81
|
+
- Set `max-width` on text containers using `ch` units (`max-width: 65ch`)
|
|
82
|
+
- Adjust line-height per context: tighter for headings (1.1-1.2), looser for body (1.5-1.7)
|
|
83
|
+
- Increase line-height slightly for light-on-dark text
|
|
84
|
+
- Ensure body text is at least 16px / 1rem
|
|
85
|
+
|
|
86
|
+
### Refine Details
|
|
87
|
+
|
|
88
|
+
- Use `tabular-nums` for data tables and numbers that should align
|
|
89
|
+
- Apply proper `letter-spacing`: slightly open for small caps and uppercase, default or tight for large display text
|
|
90
|
+
- Use semantic token names (`--text-body`, `--text-heading`), not value names (`--font-16`)
|
|
91
|
+
- Set `font-kerning: normal` and consider OpenType features where appropriate
|
|
92
|
+
|
|
93
|
+
### Weight Consistency
|
|
94
|
+
|
|
95
|
+
- Define clear roles for each weight and stick to them
|
|
96
|
+
- Don't use more than 3-4 weights (Regular, Medium, Semibold, Bold is plenty)
|
|
97
|
+
- Load only the weights you actually use (each weight adds to page load)
|
|
98
|
+
|
|
99
|
+
**NEVER**:
|
|
100
|
+
- Use more than 2-3 font families
|
|
101
|
+
- Pick sizes arbitrarily — commit to a scale
|
|
102
|
+
- Set body text below 16px
|
|
103
|
+
- Use decorative/display fonts for body text
|
|
104
|
+
- Disable browser zoom (`user-scalable=no`)
|
|
105
|
+
- Use `px` for font sizes — use `rem` to respect user settings
|
|
106
|
+
- Default to Inter/Roboto/Open Sans when personality matters
|
|
107
|
+
- Pair fonts that are similar but not identical (two geometric sans-serifs)
|
|
108
|
+
|
|
109
|
+
## Verify Typography Improvements
|
|
110
|
+
|
|
111
|
+
- **Hierarchy**: Can you identify heading vs body vs caption instantly?
|
|
112
|
+
- **Readability**: Is body text comfortable to read in long passages?
|
|
113
|
+
- **Consistency**: Are same-role elements styled identically throughout?
|
|
114
|
+
- **Personality**: Does the typography reflect the brand?
|
|
115
|
+
- **Performance**: Are web fonts loading efficiently without layout shift?
|
|
116
|
+
- **Accessibility**: Does text meet WCAG contrast ratios? Is it zoomable to 200%?
|
|
117
|
+
|
|
118
|
+
Remember: Typography is the foundation of interface design — it carries the majority of information. Getting it right is the highest-leverage improvement you can make.
|