saglitzdesign-mcp 0.3.1
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 +29 -0
- package/README.md +191 -0
- package/dist/examples.js +67 -0
- package/dist/index.js +374 -0
- package/dist/knowledge.js +123 -0
- package/knowledge/books/design-of-everyday-things.md +155 -0
- package/knowledge/books/dont-make-me-think.md +154 -0
- package/knowledge/books/grid-typography-classics.md +152 -0
- package/knowledge/books/hooked-retention.md +196 -0
- package/knowledge/books/influence-persuasion.md +232 -0
- package/knowledge/books/positioning-messaging.md +178 -0
- package/knowledge/books/psychology-of-design.md +152 -0
- package/knowledge/books/refactoring-ui.md +157 -0
- package/knowledge/books/storybrand-copywriting.md +194 -0
- package/knowledge/components/buttons.md +90 -0
- package/knowledge/components/cards-lists-modals.md +63 -0
- package/knowledge/components/forms-inputs.md +61 -0
- package/knowledge/components/navigation.md +54 -0
- package/knowledge/craft/design-critique-scoring.md +237 -0
- package/knowledge/craft/typography-craft.md +177 -0
- package/knowledge/craft/ux-writing.md +185 -0
- package/knowledge/craft/visual-craft-standards.md +161 -0
- package/knowledge/design-languages/android-app-design.md +197 -0
- package/knowledge/design-languages/apple-hig-liquid-glass.md +94 -0
- package/knowledge/design-languages/design-tokens-theming.md +108 -0
- package/knowledge/design-languages/fluent-2.md +82 -0
- package/knowledge/design-languages/ios-app-design.md +205 -0
- package/knowledge/design-languages/macos-app-design.md +202 -0
- package/knowledge/design-languages/material-3.md +113 -0
- package/knowledge/design-languages/web-trends-2026.md +87 -0
- package/knowledge/examples/ios.json +299 -0
- package/knowledge/examples/web.json +321 -0
- package/knowledge/geo/geo-fundamentals.md +120 -0
- package/knowledge/geo/geo-tactics-checklist.md +148 -0
- package/knowledge/marketing/ad-creative.md +155 -0
- package/knowledge/marketing/branding-identity.md +153 -0
- package/knowledge/marketing/email-marketing.md +155 -0
- package/knowledge/patterns/mobile/android-patterns.md +181 -0
- package/knowledge/patterns/mobile/auth-patterns.md +69 -0
- package/knowledge/patterns/mobile/checkout-payments.md +77 -0
- package/knowledge/patterns/mobile/empty-states-buttons.md +80 -0
- package/knowledge/patterns/mobile/navigation-home.md +78 -0
- package/knowledge/patterns/mobile/onboarding-paywall.md +85 -0
- package/knowledge/patterns/mobile/settings-lists.md +71 -0
- package/knowledge/patterns/web/dashboards.md +141 -0
- package/knowledge/patterns/web/feature-sections.md +122 -0
- package/knowledge/patterns/web/hero-sections.md +121 -0
- package/knowledge/patterns/web/landing-signup.md +168 -0
- package/knowledge/patterns/web/pricing-sections.md +122 -0
- package/knowledge/patterns/web/social-proof-footer.md +156 -0
- package/knowledge/process/marketing-website-roadmap.md +72 -0
- package/knowledge/process/product-design-roadmap.md +117 -0
- package/knowledge/seo/on-page-seo.md +124 -0
- package/knowledge/seo/seo-for-designers.md +159 -0
- package/knowledge/seo/technical-seo.md +194 -0
- package/knowledge/ux/accessibility.md +68 -0
- package/knowledge/ux/color-systems.md +58 -0
- package/knowledge/ux/conversion-ux.md +78 -0
- package/knowledge/ux/mobile-ux.md +69 -0
- package/knowledge/ux/motion-microinteractions.md +67 -0
- package/knowledge/ux/principles-heuristics.md +57 -0
- package/knowledge/ux/spacing-layout.md +68 -0
- package/knowledge/ux/typography.md +63 -0
- package/package.json +63 -0
- package/scripts/regenerate-examples.md +61 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: cards-lists-modals
|
|
3
|
+
title: "Cards, Lists, Modals & Sheets — Design Guide"
|
|
4
|
+
category: component
|
|
5
|
+
platform: both
|
|
6
|
+
tags: [cards, lists, modals, bottom-sheets, tables, empty-states]
|
|
7
|
+
sources: ["https://m3.material.io/components/cards", "https://developer.apple.com/design/human-interface-guidelines/sheets", "https://www.nngroup.com/articles/cards-component/"]
|
|
8
|
+
updated: 2026-07-08
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Cards, Lists, Modals & Sheets
|
|
12
|
+
|
|
13
|
+
## Cards
|
|
14
|
+
|
|
15
|
+
- A card = one self-contained object with one primary destination. If the whole card is tappable, make the whole card the link (stretched link) and don't nest competing tap targets except explicit secondary actions (⋯ menu, like).
|
|
16
|
+
- Internal padding 16–24px; consistent radius (12–16px modern default); either a subtle border **or** a soft shadow — pick one system-wide (borders read better in dark mode; shadows on light).
|
|
17
|
+
- Card grids: equal heights per row; clamp titles/descriptions (2–3 lines) instead of letting content dictate ragged heights.
|
|
18
|
+
- Don't card everything: cards separate heterogeneous objects. Homogeneous, scannable data belongs in lists or tables — card-grids of identical rows waste 40%+ of space.
|
|
19
|
+
|
|
20
|
+
## Lists (mobile)
|
|
21
|
+
|
|
22
|
+
- Row anatomy: leading visual (icon/avatar) → title + optional 1-line subtitle → trailing meta/chevron/control.
|
|
23
|
+
- Row height: 44–56px single-line, 64–72px two-line; full-bleed divider or 16px-inset divider — consistent.
|
|
24
|
+
- Chevron (›) only when the row navigates; a control (switch) and navigation never share a row.
|
|
25
|
+
- Swipe actions: max 2 per side, destructive full-swipe requires confirm or undo; always provide a non-gesture alternative (edit mode, ⋯ menu).
|
|
26
|
+
- Infinite lists: skeleton rows on first load, spinner row on pagination, pull-to-refresh where content updates; preserve scroll position on back-navigation.
|
|
27
|
+
|
|
28
|
+
## Tables (web)
|
|
29
|
+
|
|
30
|
+
- Left-align text, right-align numbers, align headers with their column data.
|
|
31
|
+
- Row hover highlight + entire-row click when rows navigate; sticky header past one viewport; sortable columns show direction arrow.
|
|
32
|
+
- Responsive: priority columns + horizontal scroll inside the table container, or collapse to cards below ~640px. Never let the page itself scroll horizontally.
|
|
33
|
+
|
|
34
|
+
## Modals (dialogs)
|
|
35
|
+
|
|
36
|
+
- Use a modal only for: confirmations of destructive/irreversible actions, short focused tasks (≤1 screen of content), required decisions. Everything else: inline, page, or drawer.
|
|
37
|
+
- Anatomy: title (states the decision), body (consequence), actions right-aligned — primary right, cancel as text/ghost left of it.
|
|
38
|
+
- Width 400–560px for confirmations; never nest modals; dim backdrop (~40–60% black); clicking backdrop closes non-destructive modals, Escape always closes.
|
|
39
|
+
- Focus management: trap focus inside, focus first meaningful element on open, return focus to the trigger on close. `role="dialog"` + `aria-modal="true"` + labelled title.
|
|
40
|
+
- Destructive confirms: name the object and consequence ("Delete 'Q3 Report'? This can't be undone."), destructive button in red, never make destructive the default-focused action.
|
|
41
|
+
|
|
42
|
+
## Bottom sheets (mobile)
|
|
43
|
+
|
|
44
|
+
- Default mobile container for filters, pickers, share, secondary tasks — thumb-reachable, keeps context visible.
|
|
45
|
+
- Grabber handle at top; detents (medium/large) for progressive content; drag-down and scrim-tap to dismiss; content scrolls only when expanded to full detent.
|
|
46
|
+
- Non-modal sheets (e.g., music mini-player, maps) may persist; modal sheets must block and dim.
|
|
47
|
+
|
|
48
|
+
## Empty states
|
|
49
|
+
|
|
50
|
+
Every list/collection needs a designed empty state with three parts:
|
|
51
|
+
1. **What this is** (one line, human tone, optional lightweight illustration/icon)
|
|
52
|
+
2. **Why it's empty / what value it will hold**
|
|
53
|
+
3. **A CTA to fill it** ("Create your first project")
|
|
54
|
+
|
|
55
|
+
Distinguish: first-use empty (educate + CTA), cleared/zero state (positive confirmation — "All caught up"), no-search-results (show the query, offer to clear/adjust filters), error state (apologize, explain, retry).
|
|
56
|
+
|
|
57
|
+
## Anti-patterns
|
|
58
|
+
|
|
59
|
+
- Modal-on-load (newsletter popups before content is read), modals for content that should be pages (no URL).
|
|
60
|
+
- Cards inside cards; shadows on shadows.
|
|
61
|
+
- Lists where every row opens a modal instead of a detail view.
|
|
62
|
+
- Empty screens that are literally blank or show a spinner forever.
|
|
63
|
+
- Bottom sheets that open at full-screen height for two options.
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: forms-inputs
|
|
3
|
+
title: "Forms & Inputs — Design Guide"
|
|
4
|
+
category: component
|
|
5
|
+
platform: both
|
|
6
|
+
tags: [forms, inputs, validation, labels, mobile-keyboard]
|
|
7
|
+
sources: ["https://www.nngroup.com/articles/form-design-white-space/", "https://m3.material.io/components/text-fields", "https://developer.apple.com/design/human-interface-guidelines/text-fields"]
|
|
8
|
+
updated: 2026-07-08
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Forms & Inputs — Design Guide
|
|
12
|
+
|
|
13
|
+
Forms are where products lose users. Every field must earn its place.
|
|
14
|
+
|
|
15
|
+
## Structure
|
|
16
|
+
|
|
17
|
+
- **Single column always** (multi-column forms cause skipped fields and eye-path zigzag). Exception: tightly-related pairs (First/Last name, City/ZIP, MM/YY + CVC).
|
|
18
|
+
- Order fields easiest → hardest; ask for sensitive data (phone, payment) last.
|
|
19
|
+
- Group related fields with headings and 24–32px group spacing; 16–24px between fields.
|
|
20
|
+
- Cut every field you can derive, default, or postpone. Each removed field measurably raises completion.
|
|
21
|
+
- Long forms: split into steps (wizard) with a progress indicator; 3–6 fields per step beats one 20-field page.
|
|
22
|
+
|
|
23
|
+
## Labels & placeholders
|
|
24
|
+
|
|
25
|
+
- **Always visible labels above the field** (not placeholder-as-label — it vanishes on focus, kills recall, fails accessibility).
|
|
26
|
+
- Floating labels (Material filled/outlined fields) are acceptable; top-aligned static labels test fastest.
|
|
27
|
+
- Placeholders only for format examples ("name@company.com"), in muted color, never required info.
|
|
28
|
+
- Mark **optional** fields ("Optional" suffix) rather than starring required ones when most fields are required.
|
|
29
|
+
- Label ↔ input programmatic association is mandatory (`<label for>`, `aria-labelledby`).
|
|
30
|
+
|
|
31
|
+
## Input ergonomics
|
|
32
|
+
|
|
33
|
+
- Input height: 44–56px mobile, 40–48px desktop; text ≥16px on mobile (prevents iOS zoom-on-focus).
|
|
34
|
+
- Use correct types/attributes: `type="email|tel|url|number"`, `inputmode`, `autocomplete` (huge mobile win: `autocomplete="email"`, `"one-time-code"`, `"cc-number"`…).
|
|
35
|
+
- Show the right mobile keyboard per field; never force numeric entry on a text keyboard.
|
|
36
|
+
- Support paste everywhere, especially OTP and password fields.
|
|
37
|
+
- Password fields: show/hide toggle; show requirements up front as a live checklist, not after failure.
|
|
38
|
+
|
|
39
|
+
## Validation
|
|
40
|
+
|
|
41
|
+
- **Validate on blur (or on submit), never on every keystroke while the user is still typing** — except live-positive confirmation (username availability, password checklist).
|
|
42
|
+
- "Reward early, punish late": once a field was marked invalid, re-validate on each keystroke so the error clears immediately when fixed.
|
|
43
|
+
- Error messages: below the field, red text + icon (not color alone), specific and actionable — "Enter a valid email like name@domain.com", never "Invalid input".
|
|
44
|
+
- On submit with errors: scroll/focus to the first error; summarize count for screen readers (`aria-live`).
|
|
45
|
+
- Never clear the form on error. Never.
|
|
46
|
+
|
|
47
|
+
## Selection controls
|
|
48
|
+
|
|
49
|
+
- ≤5 mutually-exclusive options: radio group / segmented control. 6+: select/dropdown or searchable combobox.
|
|
50
|
+
- Multi-select ≤7: checkboxes; more: multi-select combobox with chips.
|
|
51
|
+
- Toggles/switches: only for instant-effect settings (no Save button); checkboxes for form consent/choices requiring submit.
|
|
52
|
+
- Date input: use platform date pickers on mobile; on web allow typed entry alongside the picker.
|
|
53
|
+
|
|
54
|
+
## Anti-patterns
|
|
55
|
+
|
|
56
|
+
- Placeholder-only labels; ALL-CAPS labels; centered-text inputs.
|
|
57
|
+
- Resetting scroll or clearing fields after a validation error.
|
|
58
|
+
- Disabling paste in password/OTP fields.
|
|
59
|
+
- Dropdowns for 2–4 options, or for well-known sets better typed (country of residence when most users are one country — default it).
|
|
60
|
+
- Inline "success" checkmarks on every trivially-valid field (noise).
|
|
61
|
+
- CAPTCHAs before any user investment; put friction after intent is shown.
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: navigation
|
|
3
|
+
title: "Navigation Patterns — Mobile & Web"
|
|
4
|
+
category: component
|
|
5
|
+
platform: both
|
|
6
|
+
tags: [navigation, tab-bar, sidebar, navbar, information-architecture]
|
|
7
|
+
sources: ["https://m3.material.io/components/navigation-bar", "https://developer.apple.com/design/human-interface-guidelines/tab-bars", "https://www.nngroup.com/articles/mobile-navigation-patterns/"]
|
|
8
|
+
updated: 2026-07-08
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Navigation Patterns — Mobile & Web
|
|
12
|
+
|
|
13
|
+
Navigation is the user's mental model of your product. If they can't predict where things live, nothing else matters.
|
|
14
|
+
|
|
15
|
+
## Mobile app navigation
|
|
16
|
+
|
|
17
|
+
- **Bottom tab bar = default for 3–5 top-level destinations.** More than 5 → rethink IA, don't add a "More" dump unless unavoidable.
|
|
18
|
+
- Tabs: icon + label always (icon-only tabs test poorly); active state with filled icon + accent color; never hide the tab bar on core screens (hiding on scroll is acceptable for immersive content).
|
|
19
|
+
- Center tab as primary-action FAB (create/post) works when creation is the core loop (Instagram, X).
|
|
20
|
+
- Hamburger menus on mobile apps: last resort — hides features, drops engagement. Acceptable for secondary/settings content behind a profile tab instead.
|
|
21
|
+
- Hierarchical push navigation (iOS): back button top-left + swipe-back gesture must always work; label the back button with the previous screen when space allows.
|
|
22
|
+
- Modality: sheets/modals for tasks that complete or cancel (compose, filters); push for drill-down browsing. Don't stack modals.
|
|
23
|
+
- Tab state: each tab keeps its own navigation stack; switching tabs preserves position; re-tapping active tab scrolls to top / pops to root.
|
|
24
|
+
|
|
25
|
+
## Web navigation (marketing sites)
|
|
26
|
+
|
|
27
|
+
- Top navbar: logo left (links home), 4–7 items, primary CTA button right, distinct from nav links.
|
|
28
|
+
- Dropdown/mega menus: open on click (hover-open menus are error-prone and unusable on touch); one level deep.
|
|
29
|
+
- Sticky header: shrink on scroll (≤64px); never consume >10% of viewport height.
|
|
30
|
+
- Mobile web: hamburger acceptable; full-screen overlay menu with large targets, CTA repeated inside.
|
|
31
|
+
- Footer = secondary sitemap: group links under clear headings; legal + social at bottom.
|
|
32
|
+
|
|
33
|
+
## Web app navigation (dashboards/SaaS)
|
|
34
|
+
|
|
35
|
+
- Left sidebar = default for 6+ destinations; collapsible to icon rail; group with section labels after ~7 items.
|
|
36
|
+
- Persistent global elements: search (⌘K command palette is now expected in pro tools), account menu, notifications.
|
|
37
|
+
- Breadcrumbs for hierarchies ≥3 levels deep; current page is plain text, not a link.
|
|
38
|
+
- Active state must be unmistakable: accent bar/fill + bolded label, not color alone.
|
|
39
|
+
|
|
40
|
+
## Cross-cutting rules
|
|
41
|
+
|
|
42
|
+
- Current location must always be visible (active tab, highlighted item, breadcrumb, page title).
|
|
43
|
+
- Navigation labels: nouns, 1–2 words, front-loaded keywords, no jargon or cleverness ("Pricing", not "Investment").
|
|
44
|
+
- URLs (web): navigation state should be linkable/back-button-safe — filters, tabs, and pagination belong in the URL.
|
|
45
|
+
- Keyboard: full tab-order coverage, skip-to-content link, arrow-key support within menus, Escape closes overlays.
|
|
46
|
+
- Touch: nav targets ≥44px; hit areas larger than the visible icon.
|
|
47
|
+
|
|
48
|
+
## Anti-patterns
|
|
49
|
+
|
|
50
|
+
- Icon-only navigation without labels (except universally-known: search, settings — and even then, tooltip/aria-label).
|
|
51
|
+
- Mixing patterns: tab bar + hamburger + FAB all competing.
|
|
52
|
+
- Scroll-jacking, auto-playing carousels as navigation, hover-only disclosure on touch devices.
|
|
53
|
+
- Hiding primary navigation behind gestures with no visible affordance.
|
|
54
|
+
- Deep nesting (>3 levels) in mobile IA — flatten with hubs or search.
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: design-critique-scoring
|
|
3
|
+
title: "Design Critique & Scoring — How Experts Judge Quality"
|
|
4
|
+
category: craft
|
|
5
|
+
platform: both
|
|
6
|
+
tags: [critique, heuristics, scoring, delight, brand, motion]
|
|
7
|
+
sources: ["impeccable design skill (local)"]
|
|
8
|
+
updated: 2026-07-08
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Design Critique & Scoring — How Experts Judge Quality
|
|
12
|
+
|
|
13
|
+
A rigorous critique is scored, prioritized, specific, and honest. Vague feedback wastes everyone's time; "consider exploring…" is banned language. This file gives the rubric, the report structure, and the judgment calls (delight vs restraint, brand expression) that separate a design director's review from a checklist run.
|
|
14
|
+
|
|
15
|
+
## The scoring rubric: Nielsen's 10, scored 0–4
|
|
16
|
+
|
|
17
|
+
Score each heuristic 0–4. **Be honest: a 4 means genuinely excellent, not "good enough." Most real interfaces score 20–32 total.**
|
|
18
|
+
|
|
19
|
+
### 1. Visibility of system status
|
|
20
|
+
|
|
21
|
+
Check for: loading indicators on async operations, confirmation of actions (save/submit/delete), progress on multi-step processes, current-location cues (breadcrumbs, active states), inline validation feedback.
|
|
22
|
+
|
|
23
|
+
| Score | Criteria |
|
|
24
|
+
|---|---|
|
|
25
|
+
| 0 | No feedback; user is guessing what happened |
|
|
26
|
+
| 1 | Rare feedback; most actions produce no visible response |
|
|
27
|
+
| 2 | Partial; some states communicated, major gaps remain |
|
|
28
|
+
| 3 | Good; most operations give clear feedback, minor gaps |
|
|
29
|
+
| 4 | Every action confirms; progress is always visible |
|
|
30
|
+
|
|
31
|
+
### 2. Match between system and real world
|
|
32
|
+
|
|
33
|
+
Check for: familiar terminology (no unexplained jargon), information in the order users expect, recognizable icons/metaphors, audience-appropriate domain language, natural reading flow.
|
|
34
|
+
|
|
35
|
+
| Score | Criteria |
|
|
36
|
+
|---|---|
|
|
37
|
+
| 0 | Pure tech jargon, alien to users |
|
|
38
|
+
| 1 | Mostly confusing; requires domain expertise to navigate |
|
|
39
|
+
| 2 | Mixed; some plain language, jargon leaks through |
|
|
40
|
+
| 3 | Mostly natural; occasional term needs context |
|
|
41
|
+
| 4 | Speaks the user's language fluently throughout |
|
|
42
|
+
|
|
43
|
+
### 3. User control and freedom
|
|
44
|
+
|
|
45
|
+
Check for: undo/redo, cancel on forms and modals, clear paths back to safety, easy clearing of filters/search/selections, escape from multi-step processes.
|
|
46
|
+
|
|
47
|
+
| Score | Criteria |
|
|
48
|
+
|---|---|
|
|
49
|
+
| 0 | Users get trapped; no way out without refreshing |
|
|
50
|
+
| 1 | Difficult exits; obscure paths to escape |
|
|
51
|
+
| 2 | Main flows have escape, edge cases don't |
|
|
52
|
+
| 3 | Users can exit and undo most actions |
|
|
53
|
+
| 4 | Undo, cancel, back, and escape everywhere |
|
|
54
|
+
|
|
55
|
+
### 4. Consistency and standards
|
|
56
|
+
|
|
57
|
+
Check for: one term per concept, same action = same result everywhere, platform conventions followed, visual consistency (color/type/spacing/components), same gesture = same behavior.
|
|
58
|
+
|
|
59
|
+
| Score | Criteria |
|
|
60
|
+
|---|---|
|
|
61
|
+
| 0 | Feels like different products stitched together |
|
|
62
|
+
| 1 | Many inconsistencies; similar things look/behave differently |
|
|
63
|
+
| 2 | Main flows match, details diverge |
|
|
64
|
+
| 3 | Mostly consistent; occasional harmless deviation |
|
|
65
|
+
| 4 | Cohesive system, fully predictable behavior |
|
|
66
|
+
|
|
67
|
+
### 5. Error prevention
|
|
68
|
+
|
|
69
|
+
Check for: confirmation before destructive actions, constraints preventing invalid input (pickers, dropdowns), smart defaults, labels that prevent misunderstanding, autosave and draft recovery.
|
|
70
|
+
|
|
71
|
+
| Score | Criteria |
|
|
72
|
+
|---|---|
|
|
73
|
+
| 0 | Errors easy to make; no guardrails anywhere |
|
|
74
|
+
| 1 | Few safeguards; some inputs validated, most aren't |
|
|
75
|
+
| 2 | Common errors caught, edge cases slip |
|
|
76
|
+
| 3 | Most error paths blocked proactively |
|
|
77
|
+
| 4 | Errors nearly impossible through smart constraints |
|
|
78
|
+
|
|
79
|
+
### 6. Recognition rather than recall
|
|
80
|
+
|
|
81
|
+
Check for: visible options (not buried menus), contextual help (tooltips, inline hints), recents and history, autocomplete/suggestions, labels on icons (no icon-only navigation).
|
|
82
|
+
|
|
83
|
+
| Score | Criteria |
|
|
84
|
+
|---|---|
|
|
85
|
+
| 0 | Heavy memorization; users must remember paths and commands |
|
|
86
|
+
| 1 | Mostly recall; many hidden features, few visible cues |
|
|
87
|
+
| 2 | Main actions visible, secondary features hidden |
|
|
88
|
+
| 3 | Most things discoverable, few memory demands |
|
|
89
|
+
| 4 | Everything discoverable; users never memorize |
|
|
90
|
+
|
|
91
|
+
### 7. Flexibility and efficiency of use
|
|
92
|
+
|
|
93
|
+
Check for: keyboard shortcuts for common actions, customization, recents and favorites, bulk/batch actions, power features that don't complicate the basics.
|
|
94
|
+
|
|
95
|
+
| Score | Criteria |
|
|
96
|
+
|---|---|
|
|
97
|
+
| 0 | One rigid path; no shortcuts or alternatives |
|
|
98
|
+
| 1 | Limited flexibility; few alternatives to the main path |
|
|
99
|
+
| 2 | Basic keyboard support, limited bulk actions |
|
|
100
|
+
| 3 | Keyboard nav, some customization |
|
|
101
|
+
| 4 | Multiple paths, power features, customizable |
|
|
102
|
+
|
|
103
|
+
### 8. Aesthetic and minimalist design
|
|
104
|
+
|
|
105
|
+
Check for: only necessary information per step, hierarchy that directs attention, purposeful color and emphasis, no decorative clutter competing for attention.
|
|
106
|
+
|
|
107
|
+
| Score | Criteria |
|
|
108
|
+
|---|---|
|
|
109
|
+
| 0 | Overwhelming; everything competes equally |
|
|
110
|
+
| 1 | Cluttered; hard to find what matters |
|
|
111
|
+
| 2 | Main content clear, periphery noisy |
|
|
112
|
+
| 3 | Focused design, minor visual noise |
|
|
113
|
+
| 4 | Every element earns its pixel |
|
|
114
|
+
|
|
115
|
+
### 9. Error recognition, diagnosis, and recovery
|
|
116
|
+
|
|
117
|
+
Check for: plain-language errors (no codes), specific problem named ("Email is missing @" not "Invalid input"), actionable recovery, errors near their source, form contents preserved.
|
|
118
|
+
|
|
119
|
+
| Score | Criteria |
|
|
120
|
+
|---|---|
|
|
121
|
+
| 0 | Cryptic errors: codes, jargon, or silence |
|
|
122
|
+
| 1 | Vague "Something went wrong" with no guidance |
|
|
123
|
+
| 2 | Names the problem but not the fix |
|
|
124
|
+
| 3 | Identifies problem and offers next steps |
|
|
125
|
+
| 4 | Pinpoints issue, suggests fix, preserves user work |
|
|
126
|
+
|
|
127
|
+
### 10. Help and documentation
|
|
128
|
+
|
|
129
|
+
Check for: searchable help, contextual help (tooltips, inline hints, tours), task-focused organization (not feature-organized), concise scannable content, access without leaving context.
|
|
130
|
+
|
|
131
|
+
| Score | Criteria |
|
|
132
|
+
|---|---|
|
|
133
|
+
| 0 | No help available anywhere |
|
|
134
|
+
| 1 | Help exists but hard to find or irrelevant |
|
|
135
|
+
| 2 | FAQ/docs exist, not contextual |
|
|
136
|
+
| 3 | Searchable, mostly task-focused |
|
|
137
|
+
| 4 | Right info at the right moment, in context |
|
|
138
|
+
|
|
139
|
+
### Total score bands (out of 40)
|
|
140
|
+
|
|
141
|
+
| Range | Rating | Meaning |
|
|
142
|
+
|---|---|---|
|
|
143
|
+
| 36–40 | Excellent | Minor polish only; ship it |
|
|
144
|
+
| 28–35 | Good | Solid foundation; address weak areas |
|
|
145
|
+
| 20–27 | Acceptable | Significant improvement needed before users are happy |
|
|
146
|
+
| 12–19 | Poor | Major UX overhaul; core experience broken |
|
|
147
|
+
| 0–11 | Critical | Redesign; unusable as-is |
|
|
148
|
+
|
|
149
|
+
## Issue severity: P0–P3
|
|
150
|
+
|
|
151
|
+
Tag every individual finding:
|
|
152
|
+
|
|
153
|
+
| Priority | Name | Definition | Action |
|
|
154
|
+
|---|---|---|---|
|
|
155
|
+
| P0 | Blocking | Prevents task completion entirely | Fix immediately |
|
|
156
|
+
| P1 | Major | Significant difficulty or confusion | Fix before release |
|
|
157
|
+
| P2 | Minor | Annoyance with a workaround | Fix next pass |
|
|
158
|
+
| P3 | Polish | Nice-to-fix, no real user impact | If time permits |
|
|
159
|
+
|
|
160
|
+
**Tie-breaker:** "Would a user contact support about this?" If yes, it's at least P1.
|
|
161
|
+
|
|
162
|
+
## Critique method
|
|
163
|
+
|
|
164
|
+
- **Run two independent assessments** and keep them isolated until synthesis: (A) a design review with fresh eyes, (B) mechanical/automated checks (linters, detectors, browser evidence). Automated output must not anchor the design judgment — finish A before reading B. Then weave, don't concatenate: note where they agree, what the machine caught that the eye missed, and which machine findings are false positives.
|
|
165
|
+
- **Evaluate on screen, not just in source.** Viewable targets require actual visual inspection at multiple viewports.
|
|
166
|
+
- Automated results are **defect evidence only** — a clean scan is never proof the design is good.
|
|
167
|
+
|
|
168
|
+
### Report structure (in this order)
|
|
169
|
+
|
|
170
|
+
1. **Design health score** — the 10-heuristic table with per-row key issue, total /40, and rating band.
|
|
171
|
+
2. **Anti-patterns verdict first** — the opening question: *would someone say "AI made this" without hesitation?* Cover layout sameness, generic composition, template tells, missed personality.
|
|
172
|
+
3. **Overall impression** — brief gut reaction and the single biggest opportunity.
|
|
173
|
+
4. **What's working** — 2–3 genuine strengths and *why* they work (credibility requires acknowledging strengths specifically).
|
|
174
|
+
5. **Priority issues** — 3–5 max, ordered by impact, each with: **[P?] What** (named clearly) · **Why it matters** (harm to users/goals) · **Fix** (concrete, actionable).
|
|
175
|
+
6. **Persona red flags** — walk 2–3 relevant user archetypes (e.g. power user, first-timer) through the primary action and name exactly what breaks for each: "No keyboard shortcuts; primary action takes 8 clicks" — never generic persona prose.
|
|
176
|
+
7. **Minor observations** — quick smaller notes.
|
|
177
|
+
8. **Questions to consider** — provocations that unlock better solutions: "What if the primary action were more prominent?" "Does this need to feel this complex?" "What would a confident version look like?"
|
|
178
|
+
|
|
179
|
+
### Critique voice rules
|
|
180
|
+
|
|
181
|
+
- Be direct; don't soften criticism — honest feedback ships great design.
|
|
182
|
+
- Be specific: "the submit button," never "some elements."
|
|
183
|
+
- Always pair what's wrong with why it matters to users.
|
|
184
|
+
- Give concrete fixes; cut hedging language entirely.
|
|
185
|
+
- Prioritize ruthlessly — if everything is important, nothing is.
|
|
186
|
+
- Track score across re-critiques to show trend; don't invent defects to demonstrate iteration. "First pass clean" is a valid verdict.
|
|
187
|
+
|
|
188
|
+
## Cognitive load scoring (fold into the review)
|
|
189
|
+
|
|
190
|
+
Use the 8-item checklist (single focus; ≤4-item chunks; visual grouping; clear hierarchy; one decision at a time; ≤4 visible options per decision; no cross-screen memory demands; progressive disclosure). **0–1 failures = low load · 2–3 = moderate · 4+ = critical.** Flag every decision point with >4 simultaneous options. Also assess the emotional journey: peak-end rule, emotional valleys, reassurance at high-stakes moments.
|
|
191
|
+
|
|
192
|
+
## Judging interaction quality
|
|
193
|
+
|
|
194
|
+
- **Eight-state completeness** for every interactive element: default, hover, focus, active, disabled, loading, error, success. The common miss: hover designed without focus (keyboard users never see hover).
|
|
195
|
+
- Focus: `:focus-visible` ring 2–3px, offset, ≥3:1 contrast — `outline: none` without replacement is an automatic finding.
|
|
196
|
+
- Forms: visible labels (placeholders are not labels), validate on blur, errors below fields with `aria-describedby`.
|
|
197
|
+
- Destructive actions: **undo beats confirmation** — users click through confirms mindlessly. Confirmation only for irreversible/high-cost/batch operations.
|
|
198
|
+
- Overlays: `position: absolute` inside `overflow: hidden` clipping is the most common generated-code dropdown bug; arbitrary z-index (9999) instead of a semantic scale is a finding.
|
|
199
|
+
- Touch targets ≥44×44px; no hover-only functionality; gestures always have visible fallbacks.
|
|
200
|
+
|
|
201
|
+
## Judging motion
|
|
202
|
+
|
|
203
|
+
- **Durations — the 100/300/500 rule:** 100–150ms instant feedback (press, toggle) · 200–300ms state changes (menu, tooltip) · 300–500ms layout changes (modal, accordion) · 500–800ms entrances only. Anything >500ms for UI feedback is a defect. **Exits run ~75% of enter duration.**
|
|
204
|
+
- **Easing:** never plain `ease`; ease-out for entrances, ease-in for exits, ease-in-out for toggles. Expressive default: ease-out-quart `cubic-bezier(0.25, 1, 0.5, 1)`. **Bounce/elastic = automatic finding** — dated and amateurish; real objects decelerate, they don't boing.
|
|
205
|
+
- Stagger: ~50ms per item via `calc(var(--i) * 50ms)`, total capped (~500ms) — reduce per-item delay for long lists.
|
|
206
|
+
- Materials: transform/opacity are the reliable defaults; blur/filter/mask/clip-path are legitimate premium materials **if bounded to small areas and verified smooth in-browser**. Casually animating layout properties (width/height/top/left/margins) is a finding.
|
|
207
|
+
- `prefers-reduced-motion` support is **not optional** (vestibular disorders affect ~35% of adults over 40): crossfade instead of movement; keep functional indicators (progress, focus).
|
|
208
|
+
- Perceived performance: <80ms feels instant; skeletons beat spinners; optimistic UI for low-stakes actions only (never payments/destructive). Motion used to hide slow loading is a finding.
|
|
209
|
+
|
|
210
|
+
## Delight vs restraint — the judgment call
|
|
211
|
+
|
|
212
|
+
Delight is register-dependent:
|
|
213
|
+
- **Product register:** delight at specific *moments* (completion, first-time actions, error recovery, milestones), never spread across pages. Reliability carries the rest. Delight everywhere reads as noise.
|
|
214
|
+
- **Brand register:** delight may be distributed — copy voice, section transitions, discovery rewards, seasonal touches.
|
|
215
|
+
|
|
216
|
+
Rules for judging whether a delight moment is earned:
|
|
217
|
+
- **Amplifies, never blocks:** <1 second, skippable, never delays core functionality.
|
|
218
|
+
- **Context-appropriate:** celebrate success; empathize with errors (never playful during critical errors); banking ≠ gaming.
|
|
219
|
+
- **Survives repetition:** still pleasant on the 100th use; varied responses beat one looping animation.
|
|
220
|
+
- **Discovery beats announcement:** hidden details reward curiosity; don't fanfare every touch.
|
|
221
|
+
- **Ban AI-slop delight:** cliché loading jokes ("Herding pixels…"), stock confetti on trivial actions, whimsy hiding poor UX.
|
|
222
|
+
- Verdict test: if users notice the delight more than they notice completing their goal, it's overdone.
|
|
223
|
+
|
|
224
|
+
## Brand expression — evaluation tests
|
|
225
|
+
|
|
226
|
+
- **The slop test:** would anyone say "AI made that" without hesitation? The bar is a visitor asking "how was this made?" Average is no longer findable; restraint without intent reads as mediocre, not refined.
|
|
227
|
+
- **The aesthetic-lane test:** can the designer name the lane in one reference? ("Stripe-minimal," "acid-maximalism," "Klim specimen page.") Unnamed ambition becomes beige. Also check lane *fit*: editorial-magazine styling on a non-editorial brief is the wrong register within the register.
|
|
228
|
+
- **The competitor-sentence test:** describe the design in one sentence as a competitor would describe theirs. If that sentence fits the category's modal landing page, it fails.
|
|
229
|
+
- **Palette commitment:** palette IS voice — a named color strategy (drench, committed accent, full palette, monochrome restraint) executed without hedging. Beige-and-muted-slate on a brand brief ignores the register.
|
|
230
|
+
- **Imagery obligation:** briefs that imply imagery (restaurant, hotel, food, travel, fashion, photography, product) must ship imagery. Zero images is a bug, not restraint; colored blocks where a hero photo belongs are a P1.
|
|
231
|
+
- **Brand ban list (findings when present):** monospace as "technical" costume; big rounded icons above every heading; all-caps body copy; timid palette + average layout; repeated tiny uppercase tracked labels as section grammar; editorial-serif-by-default.
|
|
232
|
+
- **Brand permissions (don't penalize):** ambitious first-load choreography, one dominant idea per fold, enormous display type, unexpected color strategies, per-section art direction — when the voice demands them.
|
|
233
|
+
- Product-register inverse: bold theatrics in a tool ARE the finding; amplification belongs in hierarchy clarity, weight contrast, one sharper accent.
|
|
234
|
+
|
|
235
|
+
## After the critique
|
|
236
|
+
|
|
237
|
+
End with prioritized, actionable direction — not a raw list. Ask 2–4 targeted questions tied to actual findings (priority direction, intent vs accident on tonal issues, scope appetite), each with concrete options. Never generic "who is your audience?" questions. Map every priority issue to a concrete next action, and re-score after fixes to make progress visible.
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: typography-craft
|
|
3
|
+
title: "Typography Craft — Typesetting Beyond the Basics"
|
|
4
|
+
category: craft
|
|
5
|
+
platform: both
|
|
6
|
+
tags: [typography, typesetting, fonts, hierarchy, opentype]
|
|
7
|
+
sources: ["impeccable design skill (local)"]
|
|
8
|
+
updated: 2026-07-08
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Typography Craft — Typesetting Beyond the Basics
|
|
12
|
+
|
|
13
|
+
Typography carries most of the information on any screen. Good typography is invisible; bad typography is distracting. The goal is never "fancier" — it is clearer, more readable, more intentional.
|
|
14
|
+
|
|
15
|
+
## Scale and hierarchy
|
|
16
|
+
|
|
17
|
+
- **The classic mistake: too many sizes, too close together.** 14/15/16/18px is muddy hierarchy. Use fewer sizes with more contrast.
|
|
18
|
+
- **Five sizes cover most products:**
|
|
19
|
+
|
|
20
|
+
| Role | Typical size | Use |
|
|
21
|
+
|---|---|---|
|
|
22
|
+
| xs | 0.75rem | Captions, legal |
|
|
23
|
+
| sm | 0.875rem | Secondary UI, metadata |
|
|
24
|
+
| base | 1rem | Body |
|
|
25
|
+
| lg | 1.25–1.5rem | Subheadings, lead text |
|
|
26
|
+
| xl+ | 2–4rem | Headlines, hero |
|
|
27
|
+
|
|
28
|
+
- **Commit to one ratio:** 1.25 (major third), 1.333 (perfect fourth), or 1.5 (perfect fifth).
|
|
29
|
+
- **Register split:** app/product UI uses a **fixed rem scale with a tighter 1.125–1.2 ratio** (dense layouts need close steps and spatial predictability — no major app design system uses fluid type in product UI). Brand/marketing surfaces use **fluid `clamp()` headings with ≥1.25 ratio between steps**; a flat 1.1× scale reads as uncommitted.
|
|
30
|
+
- **Weight roles are fixed and few:** 3–4 weights max (e.g. Regular body, Medium labels, Semibold/Bold headings). Same role = same weight everywhere. Load only the weights you use.
|
|
31
|
+
- Hierarchy should combine size + weight + color + space — never size alone.
|
|
32
|
+
|
|
33
|
+
## Vertical rhythm
|
|
34
|
+
|
|
35
|
+
Line-height is the base unit for ALL vertical spacing. 16px body at 1.5 = 24px; vertical margins and gaps should be multiples of 24px. Text and space sharing one mathematical foundation creates subconscious harmony.
|
|
36
|
+
|
|
37
|
+
## Measure and leading
|
|
38
|
+
|
|
39
|
+
- **45–75 characters per line** for body; set `max-width: 65ch` on text containers (use `ch` units, not px).
|
|
40
|
+
- **Leading scales inversely with measure:** narrow columns take tighter line-height, wide columns need more. Headings 1.1–1.2; body 1.5–1.7.
|
|
41
|
+
- **Light-on-dark needs compensation on three axes, not one.** Light text on dark reads thinner and tighter. Fix all three: line-height +0.05–0.1, letter-spacing +0.01–0.02em, and optionally step body weight up one notch (400 → 450/500, or in reverse, use 350 instead of 400 for large light-on-dark body text since it reads heavier).
|
|
42
|
+
- **Paragraph rhythm: space between paragraphs OR first-line indent. Never both.** Digital defaults to space; long-form editorial can justify indent-only.
|
|
43
|
+
|
|
44
|
+
## Fluid type done right
|
|
45
|
+
|
|
46
|
+
- `clamp(min, preferred, max)` with a viewport-relative middle term plus a rem offset (e.g. `clamp(2rem, 5vw + 1rem, 4rem)`) so it never collapses at small widths.
|
|
47
|
+
- **Bound the ratio: max ≤ ~2.5 × min.** Wider ranges break browser zoom/reflow and make large viewports feel like shouting.
|
|
48
|
+
- **Body text stays fixed even on marketing pages** — the cross-viewport size delta is too small to justify fluidity.
|
|
49
|
+
- **Scale container width and font-size together** so effective measure stays in the 45–75ch band at every viewport.
|
|
50
|
+
|
|
51
|
+
## Font selection — the anti-reflex procedure
|
|
52
|
+
|
|
53
|
+
Run this for every brand-register project; never skip:
|
|
54
|
+
|
|
55
|
+
1. Write **three concrete brand-voice words** — physical-object words ("warm, mechanical, opinionated"), not "modern" or "elegant."
|
|
56
|
+
2. List the three fonts you'd reach for by reflex. If any are training-data defaults, reject them.
|
|
57
|
+
3. Browse a real catalog (Google Fonts, Pangram Pangram, Future Fonts, Klim, ABC Dinamo, Velvetyne) hunting the brand as a *physical object*: a museum caption, a 1970s terminal manual, a fabric label, a concert poster. Reject the first thing that merely "looks designy."
|
|
58
|
+
4. Cross-check: "elegant" is not necessarily serif; "technical" is not necessarily sans; "warm" is not automatically Fraunces. If the final pick matches the original reflex, start over.
|
|
59
|
+
|
|
60
|
+
**Reflex-reject list (saturated defaults — look further for greenfield work):** Fraunces, Newsreader, Lora, Crimson (all cuts), Playfair Display, Cormorant (all cuts), Syne, IBM Plex (Mono/Sans/Serif), Space Mono, Space Grotesk, Inter, DM Sans, DM Serif (Display/Text), Outfit, Plus Jakarta Sans, Instrument Sans, Instrument Serif.
|
|
61
|
+
|
|
62
|
+
**Reflex-reject aesthetic lane:** the editorial-typographic cliché — italic display serif + small tracked mono labels + ruled columns + monochrome restraint — is the second-order trap. Unless the brief is literally a magazine, skip it.
|
|
63
|
+
|
|
64
|
+
These lists govern **new choices**. An existing brand identity that already ships one of these fonts wins — don't second-guess shipped identity.
|
|
65
|
+
|
|
66
|
+
**Anti-reflexes worth defending against:**
|
|
67
|
+
- A technical brief does NOT need a serif "for warmth" — tech tools should look like tech tools.
|
|
68
|
+
- A premium brief does NOT need the trendy expressive serif; premium can be Swiss-modern, neo-grotesque, quiet humanist, even monospace.
|
|
69
|
+
- A children's product does NOT need a rounded display font — kids' books use real type.
|
|
70
|
+
- The most "modern" move is not using the font everyone else uses.
|
|
71
|
+
- **System fonts are underrated:** `-apple-system, BlinkMacSystemFont, "Segoe UI", system-ui` loads instantly and reads natively. Legitimate wherever performance > personality.
|
|
72
|
+
|
|
73
|
+
## Pairing
|
|
74
|
+
|
|
75
|
+
- **You usually don't need a second font.** One family in committed weights beats a timid display+body pair. Add a second only for genuine contrast.
|
|
76
|
+
- When pairing, contrast on multiple axes: serif+sans (structure), geometric+humanist (personality), condensed display + wide body (proportion).
|
|
77
|
+
- **Never pair similar-but-not-identical fonts** (two geometric sans) — tension without hierarchy.
|
|
78
|
+
- Lane conventions: editorial/luxury → display serif + sans body; tech/fintech → one committed sans with tight tracking and strong internal weight contrast; consumer/food/travel → humanist sans + script or display serif; studios/agencies → rule-breaking (mono-only, display-only) is welcome.
|
|
79
|
+
- Hard ceiling: 2–3 families per project.
|
|
80
|
+
|
|
81
|
+
## Web font loading
|
|
82
|
+
|
|
83
|
+
- `font-display: swap` for visibility; **`optional`** when zero layout shift matters more than showing the branded font on slow networks (falls back if the font misses a ~100ms budget).
|
|
84
|
+
- **Metric-matched fallback** kills the reflow jump — define a fallback `@font-face` over a local font with metric overrides (tools like Fontaine compute these automatically):
|
|
85
|
+
|
|
86
|
+
```css
|
|
87
|
+
@font-face {
|
|
88
|
+
font-family: 'CustomFont';
|
|
89
|
+
src: url('font.woff2') format('woff2');
|
|
90
|
+
font-display: swap;
|
|
91
|
+
}
|
|
92
|
+
@font-face {
|
|
93
|
+
font-family: 'CustomFont-Fallback';
|
|
94
|
+
src: local('Arial');
|
|
95
|
+
size-adjust: 105%; /* scale to match x-height */
|
|
96
|
+
ascent-override: 90%;
|
|
97
|
+
descent-override: 20%;
|
|
98
|
+
line-gap-override: 10%;
|
|
99
|
+
}
|
|
100
|
+
body { font-family: 'CustomFont', 'CustomFont-Fallback', sans-serif; }
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
- **Preload only the critical weight** — usually the regular body weight above the fold. Preloading everything costs more than it saves.
|
|
104
|
+
- **Variable font when you need 3+ weights/styles**: one file is smaller than three statics, gives fractional weights, and pairs with `font-optical-sizing: auto`. For 1–2 weights, static files are fine.
|
|
105
|
+
|
|
106
|
+
## OpenType features and rendering polish
|
|
107
|
+
|
|
108
|
+
Most developers don't know these exist — using them is a visible craft signal:
|
|
109
|
+
|
|
110
|
+
```css
|
|
111
|
+
.data-table { font-variant-numeric: tabular-nums; } /* numbers align in columns */
|
|
112
|
+
.fraction { font-variant-numeric: diagonal-fractions; }
|
|
113
|
+
abbr { font-variant-caps: all-small-caps; } /* real small caps for abbreviations */
|
|
114
|
+
code { font-variant-ligatures: none; } /* ligatures off in code */
|
|
115
|
+
body { font-kerning: normal; font-optical-sizing: auto; }
|
|
116
|
+
h1, h2, h3 { text-wrap: balance; } /* even heading line lengths */
|
|
117
|
+
article p { text-wrap: pretty; } /* fewer orphans in prose */
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
- **ALL-CAPS tracking is mandatory:** capitals sit too tight at default spacing. Add 5–12% letter-spacing (`0.05em`–`0.12em`) to all-caps labels, eyebrows, small headings. Real small caps take the same treatment, slightly gentler.
|
|
121
|
+
- Letter-spacing direction: open for small/uppercase text, default-or-tight for large display sizes.
|
|
122
|
+
- Check a font's feature support at Wakamai Fondue before relying on it.
|
|
123
|
+
|
|
124
|
+
## Widows, orphans, breaks
|
|
125
|
+
|
|
126
|
+
- No single word stranded on the last line of a heading (`text-wrap: balance` handles most cases).
|
|
127
|
+
- Stable line breaks at every viewport — a heading that rewraps into nonsense at one width is a defect.
|
|
128
|
+
- Hyphenation only where language and column width justify it.
|
|
129
|
+
|
|
130
|
+
## Token architecture
|
|
131
|
+
|
|
132
|
+
Name tokens semantically — `--text-body`, `--text-heading` — never by value (`--font-size-16`). A complete type token set includes: font stacks, size scale, weights, line-heights, and letter-spacing.
|
|
133
|
+
|
|
134
|
+
## Accessibility floors
|
|
135
|
+
|
|
136
|
+
- **Body ≥16px / 1rem.** Smaller strains eyes and fails WCAG on mobile.
|
|
137
|
+
- **Use rem/em, never px, for font sizes** — px ignores user browser settings.
|
|
138
|
+
- **Never disable zoom** (`user-scalable=no`). If layout breaks at 200% zoom, fix the layout.
|
|
139
|
+
- Text links need padding/line-height producing 44px+ tap targets.
|
|
140
|
+
- Never decorative/display fonts for body text; never all-caps body copy (caps are for short labels and headings).
|
|
141
|
+
|
|
142
|
+
## Expressive vs quiet type
|
|
143
|
+
|
|
144
|
+
- **Quiet (product UI):** one well-tuned family, system stacks legitimate, fixed rem scale, hierarchy via weight and space. The type should disappear into the task.
|
|
145
|
+
- **Expressive (brand):** typographic risk is a permission — enormous display sizes, unexpected italic cuts, mixed cases, a single oversize word as a hero, hand-drawn headlines. Fluid scale, ≥1.25 ratio, committed contrast.
|
|
146
|
+
- **Bolder without slop:** dramatic size jumps (3–5×), extreme weight pairs (900 with 200), condensed/extended widths, monospace as a deliberate accent — never as lazy "developer" costume on a non-technical brand.
|
|
147
|
+
- **Quieter without mush:** step weights down (900→600, 700→500), reduce scale jumps, add typographic air — but keep anchors. Some elements must still be unmistakably dominant.
|
|
148
|
+
|
|
149
|
+
## Assessing existing typography — where to look first
|
|
150
|
+
|
|
151
|
+
1. **Font choices:** invisible defaults in use (Inter, Roboto, Arial, Open Sans, bare system stack on a brand surface)? Does the face match the brand voice? More than 2–3 families?
|
|
152
|
+
2. **Hierarchy:** heading vs body vs caption distinguishable at a glance? Sizes too close together? Weight contrast strong enough (Medium vs Regular is barely visible)?
|
|
153
|
+
3. **Scale:** one committed ratio or arbitrary sizes? Right sizing strategy for the register (fixed rem for app UI, fluid clamp for marketing headings)?
|
|
154
|
+
4. **Readability:** measure 45–75ch? Leading tuned to measure and context? Contrast sufficient?
|
|
155
|
+
5. **Consistency:** same role, same treatment, everywhere? Weights used by defined role? Letter-spacing intentional rather than default-everywhere?
|
|
156
|
+
|
|
157
|
+
## Hard bans
|
|
158
|
+
|
|
159
|
+
- More than 2–3 font families per project
|
|
160
|
+
- Arbitrary sizes off the scale; body text below 16px
|
|
161
|
+
- Decorative/display fonts as body text; all-caps body copy
|
|
162
|
+
- `px` font sizes; `user-scalable=no`
|
|
163
|
+
- Inter/Roboto/Open Sans by default where personality matters
|
|
164
|
+
- Pairing similar-but-not-identical faces (two geometric sans)
|
|
165
|
+
- Skipping fallback stacks; ignoring FOUT/FOIT
|
|
166
|
+
- Monospace as lazy "developer" shorthand on a non-technical brand
|
|
167
|
+
|
|
168
|
+
## Typography defect checklist
|
|
169
|
+
|
|
170
|
+
- [ ] Sizes come from one committed scale; no near-duplicate sizes
|
|
171
|
+
- [ ] Register-appropriate sizing (fixed rem in app UI; bounded clamp on brand headings)
|
|
172
|
+
- [ ] Measure 45–75ch; leading tuned per context; light-on-dark compensated on all three axes
|
|
173
|
+
- [ ] Same role styled identically everywhere; ≤3–4 weights loaded
|
|
174
|
+
- [ ] No FOUT jump (metric-matched fallback) and no invisible-text FOIT
|
|
175
|
+
- [ ] tabular-nums on data; tracking on all-caps; balance/pretty wrapping applied
|
|
176
|
+
- [ ] Body ≥16px in rem; zoom works to 200%; contrast passes WCAG
|
|
177
|
+
- [ ] Font choice justifiable in one sentence of brand voice — not a reflex default
|