agemon 0.1.0 → 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +732 -28
- package/assets/skills/architecture/agemon-architecture/LICENSE +21 -0
- package/assets/skills/architecture/agemon-architecture/NOTICE.md +9 -0
- package/assets/skills/architecture/agemon-architecture/SKILL.md +275 -0
- package/assets/skills/code-quality/agemon-clean-code/LICENSE +21 -0
- package/assets/skills/code-quality/agemon-clean-code/NOTICE.md +9 -0
- package/assets/skills/code-quality/agemon-clean-code/SKILL.md +78 -0
- package/assets/skills/code-quality/agemon-house-rules/SKILL.md +103 -0
- package/assets/skills/commit/agemon-commit/SKILL.md +87 -0
- package/assets/skills/design/agemon-design/LICENSE +21 -0
- package/assets/skills/design/agemon-design/NOTICE.md +9 -0
- package/assets/skills/design/agemon-design/SKILL.md +391 -0
- package/assets/skills/design/agemon-design/references/accessibility.md +182 -0
- package/assets/skills/design/agemon-design/references/agents.md +63 -0
- package/assets/skills/design/agemon-design/references/ai-chat.md +158 -0
- package/assets/skills/design/agemon-design/references/brief.md +186 -0
- package/assets/skills/design/agemon-design/references/color.md +216 -0
- package/assets/skills/design/agemon-design/references/components.md +91 -0
- package/assets/skills/design/agemon-design/references/copy.md +300 -0
- package/assets/skills/design/agemon-design/references/craft-intent.md +160 -0
- package/assets/skills/design/agemon-design/references/dashboard.md +131 -0
- package/assets/skills/design/agemon-design/references/dataviz.md +197 -0
- package/assets/skills/design/agemon-design/references/finish-bar.md +243 -0
- package/assets/skills/design/agemon-design/references/forms.md +192 -0
- package/assets/skills/design/agemon-design/references/heuristics.md +403 -0
- package/assets/skills/design/agemon-design/references/inspiration.md +287 -0
- package/assets/skills/design/agemon-design/references/layout.md +236 -0
- package/assets/skills/design/agemon-design/references/loops.md +155 -0
- package/assets/skills/design/agemon-design/references/metadata.md +98 -0
- package/assets/skills/design/agemon-design/references/modern-css.md +448 -0
- package/assets/skills/design/agemon-design/references/motion.md +434 -0
- package/assets/skills/design/agemon-design/references/personas.md +206 -0
- package/assets/skills/design/agemon-design/references/principles-catalog.md +299 -0
- package/assets/skills/design/agemon-design/references/recipe-auth.md +88 -0
- package/assets/skills/design/agemon-design/references/recipe-dashboard.md +130 -0
- package/assets/skills/design/agemon-design/references/recipe-landing.md +122 -0
- package/assets/skills/design/agemon-design/references/responsive.md +168 -0
- package/assets/skills/design/agemon-design/references/review.md +340 -0
- package/assets/skills/design/agemon-design/references/sound.md +150 -0
- package/assets/skills/design/agemon-design/references/spec.md +123 -0
- package/assets/skills/design/agemon-design/references/stack.md +522 -0
- package/assets/skills/design/agemon-design/references/state-design.md +188 -0
- package/assets/skills/design/agemon-design/references/themes.md +229 -0
- package/assets/skills/design/agemon-design/references/tokens.md +350 -0
- package/assets/skills/design/agemon-design/references/typography.md +246 -0
- package/assets/skills/design/agemon-design-dashboard/LICENSE +21 -0
- package/assets/skills/design/agemon-design-dashboard/NOTICE.md +9 -0
- package/assets/skills/design/agemon-design-dashboard/SKILL.md +113 -0
- package/assets/skills/design/agemon-design-editorial/LICENSE +21 -0
- package/assets/skills/design/agemon-design-editorial/NOTICE.md +9 -0
- package/assets/skills/design/agemon-design-editorial/SKILL.md +98 -0
- package/assets/skills/design/agemon-design-minimal/LICENSE +21 -0
- package/assets/skills/design/agemon-design-minimal/NOTICE.md +9 -0
- package/assets/skills/design/agemon-design-minimal/SKILL.md +97 -0
- package/assets/skills/geo-seo/geo/LICENSE +21 -0
- package/assets/skills/geo-seo/geo/NOTICE.md +18 -0
- package/assets/skills/geo-seo/geo/SKILL.md +145 -0
- package/assets/skills/geo-seo/geo-audit/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-audit/NOTICE.md +17 -0
- package/assets/skills/geo-seo/geo-audit/SKILL.md +371 -0
- package/assets/skills/geo-seo/geo-audit/references/ai-visibility.md +233 -0
- package/assets/skills/geo-seo/geo-audit/references/content.md +329 -0
- package/assets/skills/geo-seo/geo-audit/references/platform-analysis.md +294 -0
- package/assets/skills/geo-seo/geo-audit/references/schema.md +383 -0
- package/assets/skills/geo-seo/geo-audit/references/technical.md +368 -0
- package/assets/skills/geo-seo/geo-brand-mentions/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-brand-mentions/NOTICE.md +15 -0
- package/assets/skills/geo-seo/geo-brand-mentions/SKILL.md +459 -0
- package/assets/skills/geo-seo/geo-citability/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-citability/NOTICE.md +14 -0
- package/assets/skills/geo-seo/geo-citability/SKILL.md +320 -0
- package/assets/skills/geo-seo/geo-content/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-content/NOTICE.md +14 -0
- package/assets/skills/geo-seo/geo-content/SKILL.md +352 -0
- package/assets/skills/geo-seo/geo-crawlers/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-crawlers/NOTICE.md +15 -0
- package/assets/skills/geo-seo/geo-crawlers/SKILL.md +388 -0
- package/assets/skills/geo-seo/geo-llmstxt/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-llmstxt/NOTICE.md +14 -0
- package/assets/skills/geo-seo/geo-llmstxt/SKILL.md +433 -0
- package/assets/skills/geo-seo/geo-platform-optimizer/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-platform-optimizer/NOTICE.md +14 -0
- package/assets/skills/geo-seo/geo-platform-optimizer/SKILL.md +282 -0
- package/assets/skills/geo-seo/geo-report/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-report/NOTICE.md +14 -0
- package/assets/skills/geo-seo/geo-report/SKILL.md +406 -0
- package/assets/skills/geo-seo/geo-report-pdf/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-report-pdf/NOTICE.md +20 -0
- package/assets/skills/geo-seo/geo-report-pdf/SKILL.md +153 -0
- package/assets/skills/geo-seo/geo-report-pdf/templates/geo-report-template.html +548 -0
- package/assets/skills/geo-seo/geo-schema/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-schema/NOTICE.md +16 -0
- package/assets/skills/geo-seo/geo-schema/SKILL.md +396 -0
- package/assets/skills/geo-seo/geo-technical/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-technical/NOTICE.md +15 -0
- package/assets/skills/geo-seo/geo-technical/SKILL.md +566 -0
- package/assets/skills/performance/agemon-performance/NOTICE.md +1 -0
- package/assets/skills/performance/agemon-performance/SKILL.md +76 -0
- package/assets/skills/security/agemon-security/LICENSE +21 -0
- package/assets/skills/security/agemon-security/NOTICE.md +8 -0
- package/assets/skills/security/agemon-security/SKILL.md +356 -0
- package/assets/skills/self-review/agemon-review-intake/LICENSE +21 -0
- package/assets/skills/self-review/agemon-review-intake/NOTICE.md +9 -0
- package/assets/skills/self-review/agemon-review-intake/SKILL.md +205 -0
- package/assets/skills/self-review/agemon-review-request/LICENSE +21 -0
- package/assets/skills/self-review/agemon-review-request/NOTICE.md +9 -0
- package/assets/skills/self-review/agemon-review-request/SKILL.md +104 -0
- package/assets/skills/self-review/agemon-review-request/code-reviewer.md +188 -0
- package/assets/skills/self-review/agemon-root-cause/LICENSE +21 -0
- package/assets/skills/self-review/agemon-root-cause/NOTICE.md +10 -0
- package/assets/skills/self-review/agemon-root-cause/SKILL.md +283 -0
- package/assets/skills/self-review/agemon-root-cause/condition-based-waiting-example.ts +158 -0
- package/assets/skills/self-review/agemon-root-cause/condition-based-waiting.md +115 -0
- package/assets/skills/self-review/agemon-root-cause/defense-in-depth.md +122 -0
- package/assets/skills/self-review/agemon-root-cause/find-polluter.sh +72 -0
- package/assets/skills/self-review/agemon-root-cause/root-cause-tracing.md +169 -0
- package/assets/skills/self-review/agemon-root-cause/test-academic.md +14 -0
- package/assets/skills/self-review/agemon-root-cause/test-pressure-1.md +58 -0
- package/assets/skills/self-review/agemon-root-cause/test-pressure-2.md +68 -0
- package/assets/skills/self-review/agemon-root-cause/test-pressure-3.md +69 -0
- package/assets/skills/self-review/agemon-verify-before-done/LICENSE +21 -0
- package/assets/skills/self-review/agemon-verify-before-done/NOTICE.md +9 -0
- package/assets/skills/self-review/agemon-verify-before-done/SKILL.md +120 -0
- package/assets/skills/team-lead/agemon-plan-rfc/SKILL.md +317 -0
- package/assets/skills/team-lead/prd-generator/SKILL.md +437 -0
- package/assets/skills/team-lead/skill-headofit-audit/SKILL.md +72 -0
- package/assets/skills/team-lead/skill-incident-rca/SKILL.md +66 -0
- package/assets/skills/team-lead/skill-meeting-lifecycle/SKILL.md +63 -0
- package/assets/skills/team-lead/skill-obsidian-vault-sync/SKILL.md +69 -0
- package/assets/skills/team-lead/skill-prd-decomposer/SKILL.md +71 -0
- package/assets/skills/team-lead/skill-sec-check/SKILL.md +70 -0
- package/assets/skills/team-lead/skill-task-extractor/SKILL.md +79 -0
- package/assets/skills/team-lead/skill-tech-spike/SKILL.md +57 -0
- package/assets/skills/team-lead/skill-techlead-reviewer/SKILL.md +81 -0
- package/assets/tools/code-review-graph-constraints.txt +1418 -0
- package/assets/tools/package-lock.json +111 -0
- package/assets/tools/package.json +6 -0
- package/dist/chunk-5LATHJYU.js +4026 -0
- package/dist/chunk-5LATHJYU.js.map +1 -0
- package/dist/fake-subprocess-2BETWZVZ.js +666 -0
- package/dist/fake-subprocess-2BETWZVZ.js.map +1 -0
- package/dist/index.js +21101 -1956
- package/dist/index.js.map +1 -1
- package/package.json +30 -17
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
# Principles Catalog
|
|
2
|
+
|
|
3
|
+
A worked-example bank of opinionated design principles, organized by product category. Use as seed material for the principles workshop in `/brief`. Do not adopt these literally — adapt to your specific product, user, and constraints. The point is to see what opinionated, actionable, distinctive principles look like in practice. Many entries are product-specific manifestations of the heuristics in `heuristics.md` — they complement the scored methodology, they don't replace it.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## How to Read This Catalog
|
|
8
|
+
|
|
9
|
+
Each principle has four parts: a title (4-7 words), a statement (one line), the design implication it produces (what changes in the product because of it), and an opposing principle it rules out (the contrast that proves it's opinionated).
|
|
10
|
+
|
|
11
|
+
Categories are starting points, not silos. A finance reconciliation tool may need a "creative tools" principle if its power users have strong workflow preferences. Mix and match across categories — the category label is scaffolding, not a fence.
|
|
12
|
+
|
|
13
|
+
Strong principles take a stand. If you can flip the principle and the opposite sounds reasonable, the principle is doing work. If the opposite sounds insane, the principle is a platitude — drop it.
|
|
14
|
+
|
|
15
|
+
Trim to 3-5. More than 5 means none of them are load-bearing. If you have eight, find the two that subsume the others and keep those.
|
|
16
|
+
|
|
17
|
+
Test against past decisions. Take three real design calls that were debated. Would the candidate principle have resolved them? If it would have flipped a decision you stand behind, it is the wrong principle.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Categories
|
|
22
|
+
|
|
23
|
+
### 1. Developer Tools (CLIs, dashboards, internal tools)
|
|
24
|
+
|
|
25
|
+
#### "Show the data, not the design"
|
|
26
|
+
**Statement:** chrome retreats; data and state are the entire surface.
|
|
27
|
+
**Implication:** color reserved for status (success / warn / error), accent used on the primary action only, typography defaults to monospace for data and humanist sans for chrome. Animations are sub-200ms or absent. Decorative illustrations, hero gradients, and marketing-page polish have no place here.
|
|
28
|
+
**Opposite ruled out:** "internal tools deserve the same visual richness as consumer products" — a developer dashboard with gradient headers, large illustrations, and motion choreography signals decoration over function and erodes trust with its audience.
|
|
29
|
+
|
|
30
|
+
#### "The keyboard is the primary input"
|
|
31
|
+
**Statement:** every action is reachable without a pointer.
|
|
32
|
+
**Implication:** every modal, panel, and dropdown has a keyboard shortcut. Tab order matches visual order. Command palette covers all global actions. Hover-only affordances do not exist. Mouse-first interactions (drag-to-reorder, right-click context menus without keyboard equivalents) are redesigned or dropped.
|
|
33
|
+
**Opposite ruled out:** "power users will learn the UI" — assuming that heavy users will mouse through menus every session trades their time for your engineering convenience.
|
|
34
|
+
|
|
35
|
+
#### "Error state is a first-class screen"
|
|
36
|
+
**Statement:** failure and partial states are designed before the happy path ships.
|
|
37
|
+
**Implication:** every async operation has an explicit error state with a recovery action (retry, copy error, open docs). No "Something went wrong" strings without a path forward. Skeleton loaders are paired with error recovery. Empty states are not blank pages.
|
|
38
|
+
**Opposite ruled out:** "ship the happy path first, handle errors later" — deferring error states means they ship broken or never; this category's users lose the most time when errors are opaque.
|
|
39
|
+
|
|
40
|
+
#### "Density by default, space by request"
|
|
41
|
+
**Statement:** the default layout is dense; whitespace is earned by user preference.
|
|
42
|
+
**Implication:** default row height is compact (32-36px), table padding is minimal, sidebars collapse by default on narrow viewports. A spacious view is available as a user preference, not the default. Every pixel of padding is justified by legibility, not aesthetics.
|
|
43
|
+
**Opposite ruled out:** "generous whitespace reads as quality" — in a tool used for hours daily, whitespace that forces scrolling is a cost, not a signal.
|
|
44
|
+
|
|
45
|
+
#### "State is always visible"
|
|
46
|
+
**Statement:** the current view, filter, and scope are always in the viewport.
|
|
47
|
+
**Implication:** active filters shown as removable chips above the data, not hidden in a sidebar. Breadcrumbs or scope indicators in the nav. Connection / sync status visible in a persistent corner. "Showing 1-50 of 2,340" is always present on data tables.
|
|
48
|
+
**Opposite ruled out:** "minimize chrome to maximize content area" — hiding active state to save pixels means the user constantly re-orients, which costs more than the pixels saved.
|
|
49
|
+
|
|
50
|
+
#### "Logs beat summaries"
|
|
51
|
+
**Statement:** give users the raw output alongside the derived insight.
|
|
52
|
+
**Implication:** aggregated metrics always have a "view raw" or drill-down path. Pipeline outputs show the full log, collapsible to summary. No computed status that hides the underlying signal. "3 errors" links to the 3 errors, not a modal that restates the count.
|
|
53
|
+
**Opposite ruled out:** "surface insights, not raw data" — for a developer audience, hiding the raw signal behind a summary reads as paternalism and blocks debugging.
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
### 2. Consumer Apps (lifestyle, social, content)
|
|
58
|
+
|
|
59
|
+
#### "The empty page is the customer"
|
|
60
|
+
**Statement:** the user's first action defines the product; the empty state is the most important screen.
|
|
61
|
+
**Implication:** loading and empty states receive the same design care as filled states. CTAs in empty states are specific to the likely first task, not generic ("Start your first list" not "Get started"). Templates are visible but never the default — the blank canvas wins by being immediate. Onboarding flows do not gate the empty state.
|
|
62
|
+
**Opposite ruled out:** "pre-populate with sample content to show value" — demo data tells the user the product was designed for someone else, not for them.
|
|
63
|
+
|
|
64
|
+
#### "Speed of the first action"
|
|
65
|
+
**Statement:** time from open to first meaningful interaction is the north-star metric.
|
|
66
|
+
**Implication:** zero required sign-in gates before the user touches the product. No mandatory tutorial. Profile setup is deferred until after first value. App open → core action is one tap or one keystroke. Onboarding is invisible or async.
|
|
67
|
+
**Opposite ruled out:** "complete profile upfront for personalization" — high-friction onboarding before proven value loses users at the first friction point, regardless of the personalization payoff.
|
|
68
|
+
|
|
69
|
+
#### "Social context compounds value"
|
|
70
|
+
**Statement:** every surface becomes more useful when others are present.
|
|
71
|
+
**Implication:** sharing affordances are built into the primary action flow, not a separate share sheet. Activity feeds are part of the core loop, not a tab buried in the nav. Reactions, replies, and attributions are near the content, not in a detail view. The single-user experience is the degraded form; the social form is the default.
|
|
72
|
+
**Opposite ruled out:** "sharing is a secondary feature" — treating social features as addons rather than core creates a product that is average alone and invisible together.
|
|
73
|
+
|
|
74
|
+
#### "Personalization shows immediately"
|
|
75
|
+
**Statement:** the product adapts visibly to the user from the first session.
|
|
76
|
+
**Implication:** recent content, saved preferences, and history are in the primary view on return. No "start fresh" blank slate on every open. The product remembers the last state (scroll position, last viewed item, active draft). First-time experience and return experience are explicitly different designs.
|
|
77
|
+
**Opposite ruled out:** "consistent state across sessions ensures predictability" — predictability for its own sake, without personalization, reads as indifferent.
|
|
78
|
+
|
|
79
|
+
#### "Friction sized to the commitment"
|
|
80
|
+
**Statement:** the UI's friction must match what the user is actually committing to.
|
|
81
|
+
**Implication:** liking, saving, sharing — zero confirmation. Following someone — one tap, no modal. Deleting an account — modal with explicit consequence. Friction scales with irreversibility and social consequence. No confirmation dialogs on low-stakes actions.
|
|
82
|
+
**Opposite ruled out:** "confirm everything to prevent accidental actions" — treating every action as high-stakes makes the product feel bureaucratic and trains users to dismiss confirmations without reading them.
|
|
83
|
+
|
|
84
|
+
#### "Delight once, then step aside"
|
|
85
|
+
**Statement:** expressive moments earn their place at first run; after that, they disappear.
|
|
86
|
+
**Implication:** confetti on first completion, celebration animation on first streak — then suppressed on repeat. Onboarding animations do not repeat after session one. Empty states have character for new users; returning-user empty states are functional. The product does not perform joy for users who have moved past the new-user phase.
|
|
87
|
+
**Opposite ruled out:** "consistent animation keeps the product feeling alive" — animations that were delightful at first run become noise by week two. Respecting the user's familiarity is its own form of polish.
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
### 3. Finance / Regulated (compliance-first, audit trails)
|
|
92
|
+
|
|
93
|
+
#### "Wrong is worse than late"
|
|
94
|
+
**Statement:** confirm everything; recovering from a mistake is more expensive than friction.
|
|
95
|
+
**Implication:** confirmation modals on every irreversible action, no fast-paths around them, detailed receipts after every transaction. Undo windows exist where the underlying API allows; where they do not, the action is labeled explicitly. Loading states linger over feedback states — the user needs to know the server confirmed before proceeding.
|
|
96
|
+
**Opposite ruled out:** "delight via speed" — instant-feeling interactions in finance contexts read as careless. Speed at the cost of confirmation is a liability, not a feature.
|
|
97
|
+
|
|
98
|
+
#### "Everything has an author and a timestamp"
|
|
99
|
+
**Statement:** every state change is attributed and dated.
|
|
100
|
+
**Implication:** audit logs are a first-class surface, not a compliance afterthought. Inline attribution ("Last edited by J. Reyes, Mar 4 14:22") is visible without drilling into a log. Deletions are soft-deletions with a visible record. No anonymous mutations in shared records.
|
|
101
|
+
**Opposite ruled out:** "users don't want to see attribution clutter" — regulated contexts require it, and even where they don't, attribution is the primary trust signal between collaborators handling money.
|
|
102
|
+
|
|
103
|
+
#### "The number is the hero"
|
|
104
|
+
**Statement:** the key figure dominates every surface that contains it.
|
|
105
|
+
**Implication:** primary amounts are the largest element on the card or row. Supporting context (date, category, status) is secondary — smaller, lower-weight, lower-saturation. No icon grids, feature lists, or decorative elements share visual weight with a financial figure. The hierarchy is always number first.
|
|
106
|
+
**Opposite ruled out:** "balanced information hierarchy for readability" — in finance, burying the primary number in a visually balanced layout slows the task and erodes trust.
|
|
107
|
+
|
|
108
|
+
#### "Export is a primary action"
|
|
109
|
+
**Statement:** data that cannot leave the product is a liability in regulated contexts.
|
|
110
|
+
**Implication:** CSV, PDF, and audit-format exports are accessible from every data surface without navigating away. Export is in the primary toolbar, not buried in a settings menu. Export respects the current filter and scope. Scheduled export is a feature, not a power-user workaround.
|
|
111
|
+
**Opposite ruled out:** "minimize exports to keep users in the product" — in compliance and finance contexts, data portability is a trust signal. Restricting it reads as controlling, not sticky.
|
|
112
|
+
|
|
113
|
+
#### "Status is never ambiguous"
|
|
114
|
+
**Statement:** every record has an explicit, visible state — pending, confirmed, failed, reconciled.
|
|
115
|
+
**Implication:** status badges are always present and high-contrast, never inferred from context. Pending and processing states are distinct (not both "loading"). Failed states have a reason, not just a label. Filtering by status is a first-class affordance, not a power-user feature.
|
|
116
|
+
**Opposite ruled out:** "reduce visual noise by hiding status for healthy records" — hiding status until something goes wrong means users only interact with the system in crisis mode, which erodes confidence.
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
### 4. Creative Tools (design, writing, video)
|
|
121
|
+
|
|
122
|
+
#### "The canvas is sacred"
|
|
123
|
+
**Statement:** chrome serves the canvas; the canvas never serves chrome.
|
|
124
|
+
**Implication:** every panel, toolbar, and overlay is dismissable, collapsible, or fades on inactivity. The active workspace gets the largest available area. Tool palettes can be repositioned. Keyboard shortcuts cover every chrome action. The canvas area does not shrink for notification banners, update prompts, or upsell overlays.
|
|
125
|
+
**Opposite ruled out:** "discoverable UI via persistent surfaces" — keeping toolbars permanently visible signals distrust of the user's ability to learn. It also treats every pixel of chrome as more valuable than the user's work.
|
|
126
|
+
|
|
127
|
+
#### "Undo is unlimited"
|
|
128
|
+
**Statement:** the user is never punished for experimenting.
|
|
129
|
+
**Implication:** undo history is per-session and deep (50+ steps). Destructive actions have a visible undo window, not just a warning. Version history is a first-class feature, not a recovery tool of last resort. The product does not ask "are you sure?" — it asks "do you want to undo?" after the fact.
|
|
130
|
+
**Opposite ruled out:** "confirmation before destructive actions prevents mistakes" — pre-action friction slows creative work. Post-action undo restores the same safety with none of the interruption.
|
|
131
|
+
|
|
132
|
+
#### "Presets are a starting point, not a destination"
|
|
133
|
+
**Statement:** every preset is editable; no workflow ends at a template.
|
|
134
|
+
**Implication:** templates and presets always resolve to the underlying editable state, not a locked copy. "Customize" is always available after applying a preset. The preset library is visible and searchable, but the blank-canvas affordance is equal or greater in visual weight. Users who start from a preset should not feel their work is "derivative."
|
|
135
|
+
**Opposite ruled out:** "guide users through templates for better outcomes" — prescriptive guidance in a creative tool signals that the product does not trust the user's judgment.
|
|
136
|
+
|
|
137
|
+
#### "History is visible, not just recoverable"
|
|
138
|
+
**Statement:** the user can see what changed, not just revert to before it changed.
|
|
139
|
+
**Implication:** version history shows a diff or thumbnail, not just a timestamp. Side-by-side comparison of two versions is possible. Change annotations ("changed from 24px to 18px") are in the undo stack, not just in abstract state. Power users can branch from any point in history.
|
|
140
|
+
**Opposite ruled out:** "save storage by keeping only the last N versions" — capped history limits creative risk-taking; users self-censor experiments when they know they cannot reach back far enough.
|
|
141
|
+
|
|
142
|
+
#### "Collaboration is opt-in, not default"
|
|
143
|
+
**Statement:** the single-user experience is complete; sharing is additive.
|
|
144
|
+
**Implication:** the product loads immediately without a sign-in gate. Collaboration features (comments, live cursors, sharing) are available when the user is ready for them, not surfaced on first open. A solo creator who never shares their work has the same tier of product quality as a team user.
|
|
145
|
+
**Opposite ruled out:** "build for collaboration first; solo use is a subset" — treating solo use as a downgrade punishes independent creators and makes the product feel socially coercive.
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
### 5. Data Analytics (BI, dashboards, monitoring)
|
|
150
|
+
|
|
151
|
+
#### "One number per screen"
|
|
152
|
+
**Statement:** every dashboard surface has a hero metric; everything else supports it.
|
|
153
|
+
**Implication:** the primary metric is largest, has the most contrast, sits in the optical center of the above-the-fold zone. Supporting metrics are explicitly subordinate (smaller, lower-weight, lower-saturation). No grid of equal-weight cards — hierarchy is visible at a glance from across the room.
|
|
154
|
+
**Opposite ruled out:** "let users decide what's important" — the absence of hierarchy is itself a design choice, and it always reads as the team did not decide. Equal-weight grids push every judgment onto the user and slow time-to-insight.
|
|
155
|
+
|
|
156
|
+
#### "Comparison is the unit of understanding"
|
|
157
|
+
**Statement:** a number without context is noise; every metric shows its comparison.
|
|
158
|
+
**Implication:** primary metrics always show period-over-period change (vs. prior week, vs. target). Sparklines on every metric card. Trend direction is signaled by color and icon, not just a number. Tables have inline comparison columns. No standalone counts without a denominator or a delta.
|
|
159
|
+
**Opposite ruled out:** "show current state; let users query for comparison" — requiring users to manually request comparison on every visit is an analysis tax. Comparison belongs in the default view.
|
|
160
|
+
|
|
161
|
+
#### "Drill-down is always one click"
|
|
162
|
+
**Statement:** every aggregated view resolves to its component data in one action.
|
|
163
|
+
**Implication:** clicking a chart segment opens the underlying records. Clicking a metric opens the contributing events. Breadcrumbs track the drill path. Back navigation returns to the aggregated view with state preserved. No aggregated view is a dead end.
|
|
164
|
+
**Opposite ruled out:** "keep the dashboard clean by removing drill-through affordances" — a dashboard that cannot answer "why" is an alert surface, not an analytics surface.
|
|
165
|
+
|
|
166
|
+
#### "Filters are first-class state"
|
|
167
|
+
**Statement:** the active filter configuration is a shareable, bookmarkable artifact.
|
|
168
|
+
**Implication:** filter state lives in the URL. Active filters are visible as removable chips above the data. "Share this view" produces a link that preserves filter state. Default filters are explicit, not implicit. Saving a filter configuration is a primary action, not a power-user feature.
|
|
169
|
+
**Opposite ruled out:** "filters are a temporary interaction, not state" — ephemeral filters mean users recreate the same analysis on every visit and cannot share findings with colleagues.
|
|
170
|
+
|
|
171
|
+
#### "Anomalies surface themselves"
|
|
172
|
+
**Statement:** the user should not have to look for outliers; the surface finds them.
|
|
173
|
+
**Implication:** statistical outliers are visually distinct (different color, flagged row, annotated data point) without requiring the user to configure a threshold. Alert states are visible in the default view. The absence of anomalies is also communicated explicitly ("all metrics within normal range"). Silence is a state, not the default.
|
|
174
|
+
**Opposite ruled out:** "show all data equally; users will spot patterns" — presenting uniform data without anomaly detection turns the analyst into a manual filter, adding no value over raw exports.
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
### 6. Collaborative Tools (real-time, multi-user)
|
|
179
|
+
|
|
180
|
+
#### "Presence is content"
|
|
181
|
+
**Statement:** who is on the surface matters as much as what is on the surface.
|
|
182
|
+
**Implication:** active users are always visible (avatars in nav, cursors in canvas, edits attributed inline). Conflict states are first-class designs, not hidden errors. Optimistic updates with reconciliation are the default; loading states are exceptional. The product communicates "you are not alone here" at every moment.
|
|
183
|
+
**Opposite ruled out:** "single-user UX with multiplayer features added later" — when single-user is the assumed base, collaboration feels grafted on. Presence needs to be architectural, not a feature flag.
|
|
184
|
+
|
|
185
|
+
#### "Conflict is expected, not exceptional"
|
|
186
|
+
**Statement:** simultaneous edits are the happy path; sequential editing is the edge case.
|
|
187
|
+
**Implication:** merge conflict UI is fully designed before launch, not handled by a generic error. Conflict resolution has a clear owner (last-write-wins, or explicit picker, or merge view) and it is documented in the product. The user is never dropped into an undefined state because two people edited the same field.
|
|
188
|
+
**Opposite ruled out:** "prevent conflicts via locking" — locking blocks work. Collaborative products that serialize writes to prevent conflicts have misunderstood their category.
|
|
189
|
+
|
|
190
|
+
#### "Attribution is visible, not interrogated"
|
|
191
|
+
**Statement:** the origin of every change is visible without opening a history panel.
|
|
192
|
+
**Implication:** inline attribution ("J. Reyes" next to an edited cell, an avatar on a comment) is standard in the default view. History is for audit, not for understanding current state. New content from other users is visually differentiated until dismissed. "Who did this?" has an answer in the main view.
|
|
193
|
+
**Opposite ruled out:** "attribution belongs in activity logs, not the main surface" — burying authorship in a panel means users lose context about what is new and what is theirs, slowing trust-building in shared workspaces.
|
|
194
|
+
|
|
195
|
+
#### "Async and sync are the same surface"
|
|
196
|
+
**Statement:** the product works for people in different timezones using the same interface.
|
|
197
|
+
**Implication:** unread changes are surfaced at the top of the affected view on return, not in a notification inbox. Comments thread in context, not in a sidebar. Status indicators (online now / last seen) are present but not the primary affordance. A user returning after 8 hours sees the same product as a user who was online during those 8 hours.
|
|
198
|
+
**Opposite ruled out:** "optimize for real-time; async users use notifications" — bifurcating async users into a notifications inbox creates a two-tier experience and signals the product was designed for a single timezone team.
|
|
199
|
+
|
|
200
|
+
#### "Undo survives other users"
|
|
201
|
+
**Statement:** a user can revert their own changes even after others have built on top of them.
|
|
202
|
+
**Implication:** per-user undo history is maintained separately from the shared document state. Reverting a change produces a new change, not a silent overwrite. The user is informed when their undo would affect content another user has seen or built on. Undo is never blocked because someone else has since edited the same record.
|
|
203
|
+
**Opposite ruled out:** "shared document state supersedes individual undo" — stripping undo after a collaborator touches a record makes users afraid to experiment in shared spaces.
|
|
204
|
+
|
|
205
|
+
---
|
|
206
|
+
|
|
207
|
+
### 7. AI / Streaming Surfaces
|
|
208
|
+
|
|
209
|
+
#### "Streaming is a state, not a transition"
|
|
210
|
+
**Statement:** mid-stream is a first-class UI state with its own affordances.
|
|
211
|
+
**Implication:** designed token-by-token streaming with a visible caret, partial citations rendered as they arrive, a mid-response abort affordance always present. Stream-complete is its own distinct state with a summary, feedback controls, and copy/share affordances. No skeleton loaders during streaming — they communicate "wait" when the system is communicating "I am thinking."
|
|
212
|
+
**Opposite ruled out:** "show a spinner until the full response arrives" — collapsing the streaming experience into a loading state discards the primary trust signal (visible progress) and makes the product feel slower than it is.
|
|
213
|
+
|
|
214
|
+
#### "Tool use is observable"
|
|
215
|
+
**Statement:** when the model calls a tool or searches a source, the user sees it.
|
|
216
|
+
**Implication:** tool calls are rendered as trace items inline with the response, not hidden behind the output. Web searches, code executions, and API calls show the query and result summary, not just the derived answer. Power users can expand traces to full detail. The product never presents a derived answer without attributing the source.
|
|
217
|
+
**Opposite ruled out:** "hide tool calls to keep the experience clean" — hiding the reasoning behind AI outputs reduces trust and prevents the user from catching errors in the sourcing step.
|
|
218
|
+
|
|
219
|
+
#### "Regeneration is always available"
|
|
220
|
+
**Statement:** every AI response has a retry path that the user can reach without retyping.
|
|
221
|
+
**Implication:** regenerate is a persistent affordance on every response, not just the most recent one. Editing a prompt to regenerate is one click, not a delete-and-retype flow. Variant generation (same prompt, different result) is available. The user is never trapped with a single output.
|
|
222
|
+
**Opposite ruled out:** "one response per prompt keeps the interaction clean" — without regeneration, the user loses trust in the system when the first output is wrong, because they perceive no recourse.
|
|
223
|
+
|
|
224
|
+
#### "Citations are load-bearing, not decorative"
|
|
225
|
+
**Statement:** every factual claim has a traceable source; citations are interactive, not footnotes.
|
|
226
|
+
**Implication:** cited sources are inline, hoverable or clickable, and open the source in context. Citations appear during streaming, not only after completion. The UI distinguishes between high-confidence and low-confidence citations (e.g., direct quote vs. paraphrase). A response with no citable sources is visually distinct from one with citations.
|
|
227
|
+
**Opposite ruled out:** "citations clutter the reading experience" — removing citations to improve readability trades user trust for surface aesthetics. In AI surfaces, the citation is the proof, not the decoration.
|
|
228
|
+
|
|
229
|
+
#### "Feedback closes the loop"
|
|
230
|
+
**Statement:** the user can signal quality, and the signal is visible as confirmed.
|
|
231
|
+
**Implication:** thumbs up/down or equivalent is always present on completed responses. Submitting feedback produces visible confirmation (not a silent network request). Negative feedback opens a specific follow-up (what was wrong?), not a generic rating. Feedback state persists on the response after page reload.
|
|
232
|
+
**Opposite ruled out:** "feedback is a product-side signal; users don't need to see it confirmed" — invisible feedback signals read as dismissed. Confirmation closes the trust loop and increases feedback volume.
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
### 8. Public-facing Forms (sign-up, checkout, applications)
|
|
237
|
+
|
|
238
|
+
#### "Friction sized to commitment"
|
|
239
|
+
**Statement:** the form's resistance must match what the user is actually agreeing to.
|
|
240
|
+
**Implication:** account creation requires email only (no profile, no avatar, no phone on the first step). Checkout uses smart defaults — saved address, autofill, no required account creation. Application forms show progress and allow resume-anywhere. Friction increases only where the commitment justifies it (2FA on first payment, ID verification on regulated actions).
|
|
241
|
+
**Opposite ruled out:** "collect all necessary information upfront to avoid re-engagement" — high-friction sign-ups for unproven value lose users at the first required field. Collecting data early optimizes for the product's convenience, not the user's.
|
|
242
|
+
|
|
243
|
+
#### "Validation never surprises"
|
|
244
|
+
**Statement:** errors appear where the user is, not where they are going.
|
|
245
|
+
**Implication:** inline validation fires on blur, not on submit. Error messages name the field and state the fix, not the rule violated ("Enter a valid email address" not "Invalid format"). Password rules are visible before the user types, not after they fail. Submit-time errors scroll to the first error; the user does not have to find it.
|
|
246
|
+
**Opposite ruled out:** "validate on submit to avoid interrupting the flow" — submit-time validation collapses all errors into one moment of failure, maximizing frustration and minimizing the information density needed to fix each error.
|
|
247
|
+
|
|
248
|
+
#### "Progress is always visible"
|
|
249
|
+
**Statement:** the user knows where they are, how far is left, and what they have completed.
|
|
250
|
+
**Implication:** multi-step forms show a step indicator that counts completed and remaining steps. Step labels are specific ("Payment details" not "Step 3"). Completed steps are accessible for review without losing current state. The last step is labeled "Submit" or equivalent — never "Next."
|
|
251
|
+
**Opposite ruled out:** "hide progress to avoid anchoring users to effort" — hiding progress trades completion anxiety (I don't know how long this will take) for commitment bias (I've come this far). Most users benefit from knowing the end is near.
|
|
252
|
+
|
|
253
|
+
#### "Defaults are decisions"
|
|
254
|
+
**Statement:** every pre-filled value or pre-selected option was chosen deliberately, not as a placeholder.
|
|
255
|
+
**Implication:** pre-selected checkboxes are opted-in by default only when the user would genuinely expect them (save address for future orders — reasonable; opt into marketing email — not reasonable). Auto-selected tiers or plans are the one that matches the most common user, not the most profitable. Pre-filled dates use the most likely answer. No field has a default that benefits the product at the user's expense.
|
|
256
|
+
**Opposite ruled out:** "use defaults that maximize conversion or revenue" — dark-pattern defaults are a one-time conversion gain traded for long-term trust erosion and churn.
|
|
257
|
+
|
|
258
|
+
#### "Submit is one button"
|
|
259
|
+
**Statement:** the primary action is always singular and unambiguous.
|
|
260
|
+
**Implication:** no forms have two competing primary actions at the bottom ("Save" + "Submit" at equal weight). Secondary actions (save draft, cancel) are visually subordinate. The primary button label says what happens after the click ("Create account", "Place order", "Send application"). No CTAs labeled "Continue," "Next," or "Finish" on the final step.
|
|
261
|
+
**Opposite ruled out:** "multiple actions give users flexibility" — equal-weight competing actions on a form are the fastest path to the wrong action. Flexibility in form submission is a failure of design confidence.
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
## Anti-principles (what NOT to write down as a principle)
|
|
266
|
+
|
|
267
|
+
These are platitudes that masquerade as principles. They look opinionated but rule nothing out. If your candidate principle appears on this list, rephrase it or discard it.
|
|
268
|
+
|
|
269
|
+
- **"Be user-friendly"** — opposite ("be user-hostile") is insane. Not opinionated. Every product claims this.
|
|
270
|
+
- **"Design with empathy"** — opposite ("design without empathy") is incoherent. Too vague to produce a design implication.
|
|
271
|
+
- **"Make it beautiful"** — beautiful is undefined and context-dependent. No design decision follows from it.
|
|
272
|
+
- **"Mobile-first"** — this is consensus in 2026, not a stance. It belongs in your stack defaults, not your principles.
|
|
273
|
+
- **"Accessibility matters"** — yes. This is the floor, not a principle. Every surface must be accessible; treating it as a principle lets non-accessible surfaces exist by default.
|
|
274
|
+
- **"Keep it simple"** — "simple" is undefined. This is a preference, not a constraint. "Show the data, not the design" is what "keep it simple" actually means for a developer tool.
|
|
275
|
+
- **"Modern design"** — modern compared to what, when? This is an aesthetic preference with no design resolution power.
|
|
276
|
+
- **"We care about our users"** — a mission statement, not a principle. Put it in the README, not the brief.
|
|
277
|
+
|
|
278
|
+
A principle that produces no design implication and rules out no alternative is a slogan. Slogans go in marketing copy, not in `.ui-craft/brief.md`.
|
|
279
|
+
|
|
280
|
+
---
|
|
281
|
+
|
|
282
|
+
## When to Skip Categories
|
|
283
|
+
|
|
284
|
+
The catalog covers archetypes. Many products span multiple categories and should borrow from each.
|
|
285
|
+
|
|
286
|
+
A developer tool with a consumer-facing onboarding flow needs Developer Tools principles for the product surfaces and Consumer Apps principles for the sign-up and first-run experience. Write the brief in two scoped sections rather than forcing all principles to cover both.
|
|
287
|
+
|
|
288
|
+
Internal tools where the design language is intentionally platform-native (system UI, operating-system controls) can adopt the platform's implicit principles rather than inventing product-specific ones. Codify only the places where the product diverges from platform defaults — those are the only decisions that need an explicit principle.
|
|
289
|
+
|
|
290
|
+
Pre-launch products may lack enough product reality to write distinctive principles. The "would anyone disagree?" test from `brief.md` is the gate: if every candidate principle passes it trivially (the opposite sounds insane), defer the principles workshop until you have user reality to anchor against. Provisional principles based on hypotheses are acceptable — mark them as provisional and revisit after first usability sessions.
|
|
291
|
+
|
|
292
|
+
Products built on a design system (shadcn, MUI, platform-native) inherit a set of implicit principles from that system. Those inherited principles do not need to be restated. Write only the principles where this product diverges from or extends the system's defaults.
|
|
293
|
+
|
|
294
|
+
---
|
|
295
|
+
|
|
296
|
+
## Cross-References
|
|
297
|
+
|
|
298
|
+
- `brief.md` — the parent reference; this catalog is invoked from the principles workshop section. The brief format that consumes these principles is defined there.
|
|
299
|
+
- The `inspiration.md` "what mature interfaces never do" section is the empirical complement to this catalog. Those are observed patterns from production products; these are intentional commitments. Both are needed: observation shows what the standard is; principles show where you differ from it.
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# Recipe: Auth (Sign in / Sign up)
|
|
2
|
+
|
|
3
|
+
Outcome recipe for authentication surfaces. Small surface, zero tolerance: auth is used by 100% of users at their least patient moment, and it's where AI-generated UIs are most recognizable (full-bleed saturated brand panel, italic quote, "OR" divider). Field rules live in [forms.md](forms.md), component contracts in [components.md](components.md).
|
|
4
|
+
|
|
5
|
+
**Load [craft-intent.md](craft-intent.md)** — apply product-surface patterns (§4), default **DESIGN_VARIANCE 4**, pick one **signature bet** from craft-intent §3 auth list in the Craft Read before Step 1.
|
|
6
|
+
|
|
7
|
+
## Step 0 — Four inputs (defaults if unanswered)
|
|
8
|
+
|
|
9
|
+
| Input | Options | Default |
|
|
10
|
+
|---|---|---|
|
|
11
|
+
| Brand surface | product has marketing presence worth showing / pure utility app | marketing presence |
|
|
12
|
+
| Auth methods | SSO-first (Google/GitHub/SAML) / email-first / both | both, SSO on top |
|
|
13
|
+
| Theme | preset from [themes.md](themes.md) or existing brand tokens | brand tokens if present, else **Graphite** |
|
|
14
|
+
| Variance | DESIGN_VARIANCE 1-10 | 4 |
|
|
15
|
+
| Signature bet | one from [craft-intent.md](craft-intent.md) §3 auth list | panel proof asset (metric + sparkline) or trust footer line |
|
|
16
|
+
|
|
17
|
+
## Step 1 — Pick the composition
|
|
18
|
+
|
|
19
|
+
### Split panel (default — brand presence)
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
┌──────────────────────────┬────────────────────┐
|
|
23
|
+
│ logo │ │
|
|
24
|
+
│ │ Welcome back │
|
|
25
|
+
│ ONE proof asset: │ sub, one line │
|
|
26
|
+
│ metric + sparkline │ [SSO] [SSO] │
|
|
27
|
+
│ OR attributed quote │ ── or with email ─│
|
|
28
|
+
│ (pick one, not a deck) │ Email │
|
|
29
|
+
│ │ Password Forgot? │
|
|
30
|
+
│ │ [Sign in] │
|
|
31
|
+
│ trust footer (compliance)│ New here? link │
|
|
32
|
+
└──────────────────────────┴────────────────────┘
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Panel is a **tinted neutral surface** (gray-1 of the theme), NEVER a full-saturation brand flood — a wall of pure accent is the single loudest AI tell on auth screens, and it blows the entire accent budget on decoration. Panel content: one believable proof asset with real numbers or a real attribution. Trust line at the panel's foot (compliance, data residency) — sign-in is where users think about trust.
|
|
36
|
+
|
|
37
|
+
### Centered card (utility / in-product re-auth)
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
┌───────────────────────────────────────────────┐
|
|
41
|
+
│ │
|
|
42
|
+
│ logo (small, centered) │
|
|
43
|
+
│ Welcome back │
|
|
44
|
+
│ [SSO buttons] │
|
|
45
|
+
│ ── or with email ── │
|
|
46
|
+
│ form card, 360-400px │
|
|
47
|
+
│ footer links │
|
|
48
|
+
│ │
|
|
49
|
+
└───────────────────────────────────────────────┘
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
No panel, no story — speed is the design. Card 360-400px, generous vertical rhythm, page background gray-1 with the card on white (or theme surfaces in dark).
|
|
53
|
+
|
|
54
|
+
## Step 2 — Form contract (non-negotiable)
|
|
55
|
+
|
|
56
|
+
- Form column **360-400px**. Wider reads as a document; narrower cramps the SSO row.
|
|
57
|
+
- **SSO buttons above email** when SSO is the dominant path — order by actual usage, not aesthetics. Equal visual weight between SSO providers (neutral outline buttons, real provider marks).
|
|
58
|
+
- Divider is lowercase, quiet: "or with email" — not "OR" shouting in caps.
|
|
59
|
+
- Labels above fields ([forms.md](forms.md)); "Forgot password?" inline with the password label, right-aligned — not buried under the button.
|
|
60
|
+
- **No required asterisks** — every field on an auth form is required; single-purpose familiar forms skip marking entirely ([forms.md](forms.md)).
|
|
61
|
+
- Password: show/hide toggle with `aria-label`. On sign-UP: live strength hint, validate-as-you-type with debounce; never a wall of "must contain" rules before the user types.
|
|
62
|
+
- Submit: full-width primary, verb label ("Sign in", "Create account") — the page's ONE accent-filled element. Stays enabled; validates on press ([forms.md](forms.md)).
|
|
63
|
+
- Error state: message below the offending field + border, focus moved to it. Auth errors stay honest but unspecific where security demands ("Email or password doesn't match") — and actionable where it doesn't (rate-limit: say when to retry).
|
|
64
|
+
- Cross-link the sibling flow ("New here? Start a free trial") — one line, after the submit.
|
|
65
|
+
|
|
66
|
+
## Step 3 — Sign-up deltas
|
|
67
|
+
|
|
68
|
+
- Ask the minimum: email + password (+ name only if the product needs it day one). Every extra field measurably increases drop-off — enrich the profile later, in-product.
|
|
69
|
+
- State what happens next under the CTA ("We'll send a verification link").
|
|
70
|
+
- Legal line (terms/privacy) in tertiary text under the CTA — present, quiet, real links.
|
|
71
|
+
- Multi-step signup (workspace, invites): apply the multi-step contract from [forms.md](forms.md) — cost upfront, easy→hard, progress.
|
|
72
|
+
|
|
73
|
+
## Acceptance bar
|
|
74
|
+
|
|
75
|
+
- [ ] Craft Read declared; variance 4 unless brief says otherwise; signature bet built in first pass
|
|
76
|
+
- [ ] Squint test: eye lands on the submit button; accent appears ONLY on submit + links
|
|
77
|
+
- [ ] No saturated full-bleed brand panel; panel (if any) is tinted neutral with one proof asset
|
|
78
|
+
- [ ] Form column 360-400px, labels above, no asterisks, divider lowercase
|
|
79
|
+
- [ ] "Forgot password?" findable without scanning; sibling flow cross-linked
|
|
80
|
+
- [ ] Submit enabled + validates on press; errors below fields, focus managed
|
|
81
|
+
- [ ] Keyboard: tab order top-to-bottom, Enter submits, focus visible on every control
|
|
82
|
+
- [ ] Trust signals present (compliance line or equivalent) and honest
|
|
83
|
+
- [ ] Works at 320px wide: panel drops, form survives alone
|
|
84
|
+
- [ ] Product patterns from craft-intent §4: tinted panel surface, one accent-filled element, honest error copy
|
|
85
|
+
|
|
86
|
+
## Cross-refs
|
|
87
|
+
|
|
88
|
+
[craft-intent.md](craft-intent.md) Craft Read, variance, auth signature bets · [forms.md](forms.md) field layout, validation, marking · [components.md](components.md) buttons, links · [themes.md](themes.md) surface tokens · [state-design.md](state-design.md) loading/error states for the submit roundtrip
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# Recipe: SaaS Dashboard
|
|
2
|
+
|
|
3
|
+
An outcome recipe is a build contract, not a rule list: follow it top to bottom and the result is shippable without a design retouch pass. Rules live in [dashboard.md](dashboard.md), [dataviz.md](dataviz.md), and [tokens.md](tokens.md) — this file decides **composition**: which layout, which defaults, in what order, and what "done" means.
|
|
4
|
+
|
|
5
|
+
**Who this serves:** the zero-questions path produces a strong default for users who don't design. Every default below is overridable — users who do design treat the compositions as skeletons and go from there.
|
|
6
|
+
|
|
7
|
+
**Load [craft-intent.md](craft-intent.md)** — apply product-surface patterns (§4), default **DESIGN_VARIANCE 4**, pick one **signature bet** from craft-intent §3 (product list) in the Craft Read before Step 1.
|
|
8
|
+
|
|
9
|
+
## Step 0 — Three inputs (defaults if unanswered)
|
|
10
|
+
|
|
11
|
+
Ask once, in one compact prompt. If the user declines or says "you decide", apply the defaults — never block.
|
|
12
|
+
|
|
13
|
+
| Input | Options | Default |
|
|
14
|
+
|---|---|---|
|
|
15
|
+
| Primary user + 60-second decision | exec ("are we winning?") / operator ("what needs action now?") / analyst ("why did X change?") | operator |
|
|
16
|
+
| Theme | one of the four presets in [themes.md](themes.md), or project's existing tokens | existing tokens if present, else **Graphite** |
|
|
17
|
+
| Density | VISUAL_DENSITY knob 1-10 | 7 |
|
|
18
|
+
| Variance | DESIGN_VARIANCE knob 1-10 | 4 |
|
|
19
|
+
| Signature bet | one from [craft-intent.md](craft-intent.md) §3 product list | nav active indicator or hero metric sparkline |
|
|
20
|
+
|
|
21
|
+
The first answer selects the composition. The persona is not cosmetic — it decides what the hero metric is and what gets buried ([dashboard.md](dashboard.md) "Ranking decisions").
|
|
22
|
+
|
|
23
|
+
## Step 1 — Pick the composition
|
|
24
|
+
|
|
25
|
+
Three named compositions. Don't invent a fourth unless the user's brief demands it — these cover the decision shapes that recur in production SaaS.
|
|
26
|
+
|
|
27
|
+
### Overview (exec)
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
┌──────┬──────────────────────────────────────┐
|
|
31
|
+
│ │ topbar: title · date range · avatar │
|
|
32
|
+
│ nav ├───────────────┬──────┬──────┬────────┤
|
|
33
|
+
│ │ HERO metric │ sup1 │ sup2 │ sup3 │
|
|
34
|
+
│ ├───────────────┴──────┴──────┴────────┤
|
|
35
|
+
│ │ trend area chart (2/3) │ breakdown │
|
|
36
|
+
│ │ │ h-bars 1/3 │
|
|
37
|
+
│ ├─────────────────────────┴────────────┤
|
|
38
|
+
│ │ table (top movers, 5-8 rows) ▼fold │
|
|
39
|
+
└──────┴──────────────────────────────────────┘
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
One hero answering "are we winning", 3 supports decomposing it, one trend, one breakdown. Table is below the fold on purpose — execs drill rarely. Charts large, tables small.
|
|
43
|
+
|
|
44
|
+
### Command (operator) — default
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
┌──────┬──────────────────────────────────────┐
|
|
48
|
+
│ │ topbar: title · global filter · ⌘K │
|
|
49
|
+
│ nav ├──────┬──────┬──────┬─────────────────┤
|
|
50
|
+
│ │ hero │ sup1 │ sup2 │ status strip │
|
|
51
|
+
│ ├──────┴──────┴──────┴─────────────────┤
|
|
52
|
+
│ │ filter row: ghost buttons · reset │
|
|
53
|
+
│ ├──────────────────────────────────────┤
|
|
54
|
+
│ │ WORK QUEUE table — dominant, 60%+ │
|
|
55
|
+
│ │ of viewport height ▼fold │
|
|
56
|
+
└──────┴──────────────────────────────────────┘
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
The table IS the product: the operator acts on rows. Metric strip is compact (single row, small cards). Row actions visible on hover, keyboard navigable (j/k or arrows), status as 6px dots. Charts only as sparklines inside cards — a big trend chart steals space from the queue.
|
|
60
|
+
|
|
61
|
+
### Analytics (analyst)
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
┌──────┬──────────────────────────────────────┐
|
|
65
|
+
│ │ topbar: title · saved views · export │
|
|
66
|
+
│ nav ├──────────────┬───────────────────────┤
|
|
67
|
+
│ │ filter rail │ primary chart canvas │
|
|
68
|
+
│ │ (dimensions, │ (area or h-bars, │
|
|
69
|
+
│ │ segments, │ direct-labeled) │
|
|
70
|
+
│ │ compare) ├───────────────────────┤
|
|
71
|
+
│ │ │ segmented table ▼fold│
|
|
72
|
+
└──────┴──────────────┴───────────────────────┘
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Filters are first-class (left rail, not a toolbar row) because the analyst's job is slicing. Chart canvas re-renders on every filter change — show a 150ms opacity transition, never a spinner for operations under 400ms. Direct-label series, drop the legend ([dataviz.md](dataviz.md)).
|
|
76
|
+
|
|
77
|
+
## Step 2 — Shell spec (exact values)
|
|
78
|
+
|
|
79
|
+
- **Sidebar:** 240px (range 220-260). Subtle bg tint per [dashboard.md](dashboard.md) — never full dark outside Dark Premium. Collapses to 56px icon rail below 1024px, off-canvas below 768px.
|
|
80
|
+
- **Topbar:** 56px (range 48-64), same surface as content (no border-bottom heavier than 1px hairline).
|
|
81
|
+
- **Content:** padding 24px (density ≤4: 32px; ≥8: 16px), max-width none — dashboards use the viewport. 12-col grid, gap 16px (24px at density ≤4).
|
|
82
|
+
- **Card padding:** 16-20px. **Table rows:** 40-48px. Both from [dashboard.md](dashboard.md) Content Density.
|
|
83
|
+
- **Above the fold at 1440×900:** hero + supports + one more content type minimum. Three content types visible — non-negotiable.
|
|
84
|
+
|
|
85
|
+
## Step 3 — Component inventory
|
|
86
|
+
|
|
87
|
+
Build exactly these, to spec — each links to its contract:
|
|
88
|
+
|
|
89
|
+
1. Nav item (active = accent bg at 10% + accent text; `aria-current="page"`) — [dashboard.md](dashboard.md)
|
|
90
|
+
2. Metric card, two variants: primary (accent-tinted, 36px number) / secondary (neutral, 28px). Sparkline 32px. Change text plain tertiary — [dashboard.md](dashboard.md)
|
|
91
|
+
3. Area chart with gradient fill 15%→0, horizontal-only gridlines — [dashboard.md](dashboard.md) Chart Styling
|
|
92
|
+
4. Data table: status dots, right-aligned `tabular-nums` numbers, sentence-case headers, row hover — [dashboard.md](dashboard.md) Data Tables
|
|
93
|
+
5. Filter bar: ghost buttons, conditional "Reset" text link — [dashboard.md](dashboard.md)
|
|
94
|
+
6. Empty / loading / error states for EVERY data region — [state-design.md](state-design.md). Skeletons mirror final layout geometry, never generic gray boxes of arbitrary size.
|
|
95
|
+
|
|
96
|
+
**Libraries** (tools, not design authority — match the project's stack first): charts via Recharts/visx (React) or ECharts/Chart.js (otherwise); sparklines as inline SVG polylines, no library. Tables: headless (TanStack Table) + own markup; never a themed datagrid that fights the token system. Icons per SKILL.md rule 4.
|
|
97
|
+
|
|
98
|
+
## Step 4 — Build order
|
|
99
|
+
|
|
100
|
+
Token spine first, states before polish. Skipping ahead is how slop happens.
|
|
101
|
+
|
|
102
|
+
1. Tokens: apply theme preset or map existing tokens ([themes.md](themes.md), [tokens.md](tokens.md))
|
|
103
|
+
2. Shell: sidebar + topbar + grid, responsive collapse wired
|
|
104
|
+
3. Hero tier + supports (the squint test must already pass here)
|
|
105
|
+
4. Primary chart or work-queue table (per composition)
|
|
106
|
+
5. Remaining tiers
|
|
107
|
+
6. States: loading / empty / error / partial for every data region
|
|
108
|
+
7. Keyboard pass: focus-visible everywhere, table navigable, ⌘K if Command composition
|
|
109
|
+
8. Finish: run [finish-bar.md](finish-bar.md) passes 1-4 + 7 minimum (full bar at CRAFT_LEVEL ≥ 8)
|
|
110
|
+
|
|
111
|
+
## Acceptance bar — "would a designer retouch this?"
|
|
112
|
+
|
|
113
|
+
Ship only when every box checks. One unchecked = not done, no exceptions:
|
|
114
|
+
|
|
115
|
+
- [ ] Squint test: eye lands on exactly ONE thing first (the hero)
|
|
116
|
+
- [ ] One accent color, ≤5 placements in the viewport; everything else neutral
|
|
117
|
+
- [ ] ≥3 content types above the fold; NO equal-weight card grid anywhere
|
|
118
|
+
- [ ] Every number `tabular-nums`; every comparison plain secondary text (no pills, no arrows)
|
|
119
|
+
- [ ] Empty, loading, and error states exist and match layout geometry
|
|
120
|
+
- [ ] Date range or equivalent time control present on time-series surfaces
|
|
121
|
+
- [ ] Keyboard: tab order logical, focus visible, table rows reachable
|
|
122
|
+
- [ ] Sidebar tinted (not black), headers sentence case, no uppercase anywhere except 11-13px tracked labels
|
|
123
|
+
- [ ] Charts: correct type per data story, single-hue opacity ramp, no legend for single series
|
|
124
|
+
- [ ] Signature bet from Craft Read is built and visible (not deferred to polish)
|
|
125
|
+
- [ ] Product patterns from craft-intent §4: tinted sidebar, metric hierarchy, row context or sparkline on hero metric
|
|
126
|
+
- [ ] `prefers-reduced-motion` honored; all transitions ≤400ms
|
|
127
|
+
|
|
128
|
+
## Cross-refs
|
|
129
|
+
|
|
130
|
+
[dashboard.md](dashboard.md) component contracts · [dataviz.md](dataviz.md) chart science · [themes.md](themes.md) token presets · [state-design.md](state-design.md) state lattice · [finish-bar.md](finish-bar.md) finishing passes · [personas.md](personas.md) grounding the persona choice
|