wizz-method 1.3.2 → 1.4.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/package.json +1 -1
- package/skills-registry.yaml +12 -2
- package/src/skills-lib/ai-product-design/SKILL.md +85 -0
- package/src/skills-lib/ai-product-design/references/LICENSE +21 -0
- package/src/skills-lib/ai-product-design/references/ai-alignment-reasoning/bias-detection-design/SKILL.md +37 -0
- package/src/skills-lib/ai-product-design/references/ai-alignment-reasoning/consent-and-agency/SKILL.md +37 -0
- package/src/skills-lib/ai-product-design/references/ai-alignment-reasoning/escalation-design/SKILL.md +40 -0
- package/src/skills-lib/ai-product-design/references/ai-alignment-reasoning/guardrail-design/SKILL.md +36 -0
- package/src/skills-lib/ai-product-design/references/ai-alignment-reasoning/harm-anticipation/SKILL.md +108 -0
- package/src/skills-lib/ai-product-design/references/ai-alignment-reasoning/transparency-patterns/SKILL.md +36 -0
- package/src/skills-lib/ai-product-design/references/ai-alignment-reasoning/trust-calibration/SKILL.md +102 -0
- package/src/skills-lib/ai-product-design/references/ai-alignment-reasoning/value-specification/SKILL.md +39 -0
- package/src/skills-lib/ai-product-design/references/design-agent-orchestration/agent-role-design/SKILL.md +37 -0
- package/src/skills-lib/ai-product-design/references/design-agent-orchestration/failure-recovery/SKILL.md +37 -0
- package/src/skills-lib/ai-product-design/references/design-agent-orchestration/handoff-protocols/SKILL.md +45 -0
- package/src/skills-lib/ai-product-design/references/design-agent-orchestration/human-in-the-loop/SKILL.md +39 -0
- package/src/skills-lib/ai-product-design/references/design-agent-orchestration/observability-design/SKILL.md +48 -0
- package/src/skills-lib/ai-product-design/references/design-agent-orchestration/state-management/SKILL.md +95 -0
- package/src/skills-lib/ai-product-design/references/design-agent-orchestration/task-decomposition/SKILL.md +36 -0
- package/src/skills-lib/ai-product-design/references/evaluation/comparative-evaluation/SKILL.md +39 -0
- package/src/skills-lib/ai-product-design/references/evaluation/failure-taxonomy/SKILL.md +47 -0
- package/src/skills-lib/ai-product-design/references/evaluation/heuristic-evaluation-ai/SKILL.md +46 -0
- package/src/skills-lib/ai-product-design/references/evaluation/longitudinal-measurement/SKILL.md +38 -0
- package/src/skills-lib/ai-product-design/references/evaluation/output-quality-rubrics/SKILL.md +41 -0
- package/src/skills-lib/ai-product-design/references/evaluation/task-success-metrics/SKILL.md +35 -0
- package/src/skills-lib/ai-product-design/references/evaluation/user-satisfaction-signals/SKILL.md +50 -0
- package/src/skills-lib/ai-product-design/references/model-interaction-design/context-window-design/SKILL.md +28 -0
- package/src/skills-lib/ai-product-design/references/model-interaction-design/conversation-patterns/SKILL.md +37 -0
- package/src/skills-lib/ai-product-design/references/model-interaction-design/feedback-loops/SKILL.md +35 -0
- package/src/skills-lib/ai-product-design/references/model-interaction-design/frustration-detection/SKILL.md +91 -0
- package/src/skills-lib/ai-product-design/references/model-interaction-design/generative-ui/SKILL.md +34 -0
- package/src/skills-lib/ai-product-design/references/model-interaction-design/mixed-initiative-flow/SKILL.md +39 -0
- package/src/skills-lib/ai-product-design/references/model-interaction-design/multimodal-orchestration/SKILL.md +94 -0
- package/src/skills-lib/ai-product-design/references/model-interaction-design/progressive-disclosure/SKILL.md +33 -0
- package/src/skills-lib/ai-product-design/references/prompt-architecture/chain-of-thought-design/SKILL.md +45 -0
- package/src/skills-lib/ai-product-design/references/prompt-architecture/constraint-specification/SKILL.md +50 -0
- package/src/skills-lib/ai-product-design/references/prompt-architecture/context-engineering/SKILL.md +45 -0
- package/src/skills-lib/ai-product-design/references/prompt-architecture/few-shot-patterns/SKILL.md +47 -0
- package/src/skills-lib/ai-product-design/references/prompt-architecture/prompt-versioning/SKILL.md +42 -0
- package/src/skills-lib/ai-product-design/references/prompt-architecture/system-prompt-structure/SKILL.md +50 -0
- package/src/skills-lib/ai-product-design/references/prompt-architecture/template-design/SKILL.md +42 -0
- package/src/skills-lib/ai-product-design/references/system-behavior-shaping/behavioral-consistency/SKILL.md +36 -0
- package/src/skills-lib/ai-product-design/references/system-behavior-shaping/cultural-adaptation/SKILL.md +38 -0
- package/src/skills-lib/ai-product-design/references/system-behavior-shaping/domain-voice/SKILL.md +51 -0
- package/src/skills-lib/ai-product-design/references/system-behavior-shaping/emotional-design/SKILL.md +51 -0
- package/src/skills-lib/ai-product-design/references/system-behavior-shaping/error-personality/SKILL.md +45 -0
- package/src/skills-lib/ai-product-design/references/system-behavior-shaping/persona-architecture/SKILL.md +38 -0
- package/src/skills-lib/ai-product-design/references/system-behavior-shaping/tone-calibration/SKILL.md +39 -0
- package/src/skills-lib/algorithmic-art/LICENSE.txt +202 -0
- package/src/skills-lib/algorithmic-art/SKILL.md +405 -0
- package/src/skills-lib/algorithmic-art/templates/generator_template.js +223 -0
- package/src/skills-lib/algorithmic-art/templates/viewer.html +599 -0
- package/src/skills-lib/animate/README.md +41 -0
- package/src/skills-lib/animate/SKILL.md +179 -0
- package/src/skills-lib/animate/examples/animate-height.tsx +75 -0
- package/src/skills-lib/animate/examples/app-store-card.tsx +164 -0
- package/src/skills-lib/animate/examples/card-hover.tsx +79 -0
- package/src/skills-lib/animate/examples/feedback-popover.tsx +119 -0
- package/src/skills-lib/animate/examples/multi-step-flow.tsx +128 -0
- package/src/skills-lib/animate/examples/shared-layout.tsx +64 -0
- package/src/skills-lib/animate/examples/text-reveal.tsx +70 -0
- package/src/skills-lib/animate/examples/toast-stacking.tsx +95 -0
- package/src/skills-lib/animate/references/css-animations.md +232 -0
- package/src/skills-lib/animate/references/easing-and-timing.md +105 -0
- package/src/skills-lib/animate/references/framer-motion.md +356 -0
- package/src/skills-lib/animate/references/performance-accessibility.md +185 -0
- package/src/skills-lib/auth-and-secrets/SKILL.md +10 -0
- package/src/skills-lib/canvas-design/LICENSE.txt +202 -0
- package/src/skills-lib/canvas-design/SKILL.md +130 -0
- package/src/skills-lib/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/src/skills-lib/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/src/skills-lib/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/src/skills-lib/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/src/skills-lib/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/src/skills-lib/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
- package/src/skills-lib/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/src/skills-lib/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/src/skills-lib/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
- package/src/skills-lib/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/src/skills-lib/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/src/skills-lib/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
- package/src/skills-lib/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/src/skills-lib/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
- package/src/skills-lib/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/src/skills-lib/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
- package/src/skills-lib/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/src/skills-lib/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/src/skills-lib/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
- package/src/skills-lib/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/src/skills-lib/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/src/skills-lib/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/src/skills-lib/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/src/skills-lib/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/src/skills-lib/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
- package/src/skills-lib/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/src/skills-lib/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/src/skills-lib/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/src/skills-lib/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/src/skills-lib/design-motion-principles/SKILL.md +122 -0
- package/src/skills-lib/design-motion-principles/references/accessibility.md +52 -0
- package/src/skills-lib/design-motion-principles/references/anti-checklist.md +274 -0
- package/src/skills-lib/design-motion-principles/references/audit-checklist.md +137 -0
- package/src/skills-lib/design-motion-principles/references/creation-gotchas.md +36 -0
- package/src/skills-lib/design-motion-principles/references/demo-shell.html +275 -0
- package/src/skills-lib/design-motion-principles/references/emil-kowalski.md +121 -0
- package/src/skills-lib/design-motion-principles/references/jakub-krehel.md +80 -0
- package/src/skills-lib/design-motion-principles/references/jhey-tompkins.md +122 -0
- package/src/skills-lib/design-motion-principles/references/motion-cookbook.md +529 -0
- package/src/skills-lib/design-motion-principles/references/output-format.md +346 -0
- package/src/skills-lib/design-motion-principles/references/performance.md +82 -0
- package/src/skills-lib/design-motion-principles/references/report-template.html +1006 -0
- package/src/skills-lib/design-motion-principles/workflows/audit.md +203 -0
- package/src/skills-lib/design-motion-principles/workflows/create.md +87 -0
- package/src/skills-lib/web-security/SKILL.md +47 -4
- package/src/skills-lib/wizz-router/SKILL.md +4 -1
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
# Output Format
|
|
2
|
+
|
|
3
|
+
The audit produces one of two outputs:
|
|
4
|
+
|
|
5
|
+
- **HTML mode (default)** — a self-contained `.html` file written to the audited project's `motion-audits/` directory and opened in the user's default browser. Each Critical or Important finding gets a live, looping CSS demo card beside it.
|
|
6
|
+
- **Terminal mode (flag-triggered)** — a decorated-markdown report rendered inline in the conversation. Use when the user passes `--terminal`, `--inline`, `--no-html`, "show the full report inline," or any natural-language equivalent. No HTML file is written.
|
|
7
|
+
|
|
8
|
+
Both modes carry the same audit content; only the rendering differs. Do not summarize — users want full per-lens perspectives.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## HTML mode
|
|
13
|
+
|
|
14
|
+
### Canonical references
|
|
15
|
+
|
|
16
|
+
| File | Role |
|
|
17
|
+
|---|---|
|
|
18
|
+
| `references/report-template.html` | **Source of truth.** Full worked example (fictional "Tally" habit tracker, React + Framer Motion). Every section, every token, every pattern. When in doubt about layout, structure, or styling, READ this file. |
|
|
19
|
+
| `references/demo-shell.html` | Minimal isolated example of a single demo card with the per-finding slot pattern. Used as a per-finding template snippet. |
|
|
20
|
+
|
|
21
|
+
The agent builds the report by reading these two files and adapting them to the audited project — same architecture, audit-specific content.
|
|
22
|
+
|
|
23
|
+
### File structure
|
|
24
|
+
|
|
25
|
+
Single self-contained `.html`. All CSS inlined. No external JS. Fonts loaded via Google Fonts CDN (Familjen Grotesk / Public Sans / Geist Mono) with full system-stack fallbacks so the file degrades gracefully offline.
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
<!DOCTYPE html>
|
|
29
|
+
<html lang="en">
|
|
30
|
+
<head>
|
|
31
|
+
<meta charset="utf-8">
|
|
32
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
33
|
+
<title>{project-name} motion audit — {ISO date}</title>
|
|
34
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
35
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
36
|
+
<link href="https://fonts.googleapis.com/css2?family=Familjen+Grotesk:wght@400;500;600;700&family=Public+Sans:wght@400;500;600;700&family=Geist+Mono:wght@400;500;600&display=swap" rel="stylesheet">
|
|
37
|
+
<style>
|
|
38
|
+
/* 1. :root token block (neutrals, accent aliases, severity, timing ramp, spacing, fonts)
|
|
39
|
+
2. :root:has(#theme-light:checked) light-mode token override
|
|
40
|
+
3. Layout + component CSS (header, lens-table, timing-figure, lens-sec, finding-row, demo, rec, ref-summary)
|
|
41
|
+
4. Per-finding @keyframes m{n} + .demo-{n}__mt rules, one block per Critical or Important finding,
|
|
42
|
+
{n} = 1-indexed across the whole report (collision-free) */
|
|
43
|
+
</style>
|
|
44
|
+
</head>
|
|
45
|
+
<body>
|
|
46
|
+
<!-- Global theme switch (Dark/Light radios) -->
|
|
47
|
+
<!-- Header (eyebrow, title, lede, meta, stats) -->
|
|
48
|
+
<!-- Overall Assessment -->
|
|
49
|
+
<!-- 01 · Lens summary table -->
|
|
50
|
+
<!-- 02 · Where the timings land (duration-budget diagram) -->
|
|
51
|
+
<!-- 03–05 · Per-lens sections (Jakub, Emil, Jhey — ordered by weighting for the audited context) -->
|
|
52
|
+
<!-- 06 · Combined recommendations tables -->
|
|
53
|
+
<!-- 07 · Lens reference summary -->
|
|
54
|
+
<!-- footer -->
|
|
55
|
+
</body>
|
|
56
|
+
</html>
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Design system
|
|
60
|
+
|
|
61
|
+
Neutral-default, dual-mode, severity-driven.
|
|
62
|
+
|
|
63
|
+
- **Neutrals.** Cool slate-graphite at hue 255, very low chroma (0.003–0.010). `--ink` is the page background; `--paper` is the foreground text. In light mode the two swap values via the `:root:has(#theme-light:checked)` override — every other token derives from these two and flips automatically.
|
|
64
|
+
- **Severity (FIXED, never adaptive).** Red `oklch(0.655 0.185 25)` (critical) · Amber `oklch(0.805 0.125 78)` (important) · Green `oklch(0.745 0.135 152)` (opportunity). Light-mode counterparts deepen L for contrast on white; hues stay constant.
|
|
65
|
+
- **Timing-budget ramp (FIXED).** Same hues as severity; used in section 02 only. Instant + responsive = green, deliberate = amber, sluggish = red.
|
|
66
|
+
- **Accent (NEUTRAL by default).** `--accent`, `--accent-soft`, `--accent-tint` alias to `--paper`, `--paper-dim`, and a low-alpha paper tint. The report has no chromatic primary color — severity is the only color in the document. An individual audit MAY repoint these three to a sampled brand color, but ONLY if the brand has at least ~40° hue clearance from each of the severity hues and is verified not to fall in the AI-cliché zone (neon cyan, purple-to-blue gradients).
|
|
67
|
+
- **Fonts.** Display = Familjen Grotesk, body = Public Sans, mono = Geist Mono. The mono carries timing values (`240ms · ease-out`) and all small labels — never substitute a more generic mono for the timing values.
|
|
68
|
+
|
|
69
|
+
### Dual theme
|
|
70
|
+
|
|
71
|
+
Pure-CSS toggle. Two radios (`#theme-dark` default-checked, `#theme-light`) live inside `.theme-switch` at the top of `.wrap`. `:root:has(#theme-light:checked)` overrides every theme-dependent token. No JS. Selector compatibility: `:has()` is Baseline 2023, supported by all modern browsers.
|
|
72
|
+
|
|
73
|
+
The global toggle's visual control is a segmented `Dark / Light` pill, top-right of the page, styled to match the per-demo stage segmented control.
|
|
74
|
+
|
|
75
|
+
### The report's motion posture
|
|
76
|
+
|
|
77
|
+
**The report itself has no entrance, scroll, or mount animation.** No staggered reveals. No fade-in-on-scroll. No motion on mount outside the demo cards. The demo cards are the only animated elements in the document — anything else would reproduce the AI-slop patterns this skill audits against.
|
|
78
|
+
|
|
79
|
+
The one allowed transition: `border-color 0.2s ease` on lens-table rows and finding-rows for hover feedback. That's it.
|
|
80
|
+
|
|
81
|
+
### Sections (in render order)
|
|
82
|
+
|
|
83
|
+
#### Global theme switch
|
|
84
|
+
First element inside `.wrap`, right-aligned segmented `Dark / Light` pill.
|
|
85
|
+
|
|
86
|
+
#### Header
|
|
87
|
+
```
|
|
88
|
+
.eyebrow ("MOTION AUDIT · DESIGN-MOTION-PRINCIPLES")
|
|
89
|
+
h1.title ({project name} — {one-line audit framing})
|
|
90
|
+
p.lede ({1–2 sentence project description})
|
|
91
|
+
.meta-row (what it is · stack)
|
|
92
|
+
.stats (Findings · Critical · Important · Opportunities — each is an anchor link to its rec table)
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Each severity count pairs the number with a text label so the signal is readable under red-green color vision deficiency. Each count is an anchor link (`#rec-crit`, `#rec-imp`, `#rec-opp`) to the corresponding recommendation table.
|
|
96
|
+
|
|
97
|
+
#### Overall Assessment
|
|
98
|
+
One short paragraph in larger display type. Does this feel polished? Too much? Too little? What's working, what's not? Wraps in `<section class="assessment">` with a `mono-label` "OVERALL" eyebrow.
|
|
99
|
+
|
|
100
|
+
#### 01 · Lens summary
|
|
101
|
+
3-row table, one row per practitioner. Columns: Lens (with name and weight chip) · Verdict (`Strong` / `Concern` / `Problem` / `Mixed` with a colored dot) · One-line read. Weight chips indicate `Primary` / `Secondary` / `Selective` per audit context.
|
|
102
|
+
|
|
103
|
+
#### 02 · Where the timings land — duration-budget diagram
|
|
104
|
+
Motion-native analog of thumb-first's thumb-zone diagram. A horizontal SVG (`viewBox="0 0 660 300"`) plots Tally's animations as numbered dots on a 0–600ms scale with four zone bands:
|
|
105
|
+
|
|
106
|
+
| Zone | Range | Color |
|
|
107
|
+
|---|---|---|
|
|
108
|
+
| Instant | 0–100ms | green (`--t-good`) |
|
|
109
|
+
| Responsive | 100–300ms | green (`--t-good`) |
|
|
110
|
+
| Deliberate | 300–500ms | amber (`--t-mid`) |
|
|
111
|
+
| Sluggish | 500ms+ | red (`--t-slow`) |
|
|
112
|
+
|
|
113
|
+
Animations with NO transition are plotted as hollow dashed circles at `x=40` (= 0ms). The paired key list to the right carries the action names and durations. A "What's off" block below explains the misalignments.
|
|
114
|
+
|
|
115
|
+
The SVG uses CSS-class-driven fills (via an inline `<style>` block) so the diagram re-tones with the global theme. Dot label color flips per theme (dark text on lighter dots in dark mode, light text on deeper dots in light mode).
|
|
116
|
+
|
|
117
|
+
#### 03–05 · Per-lens sections
|
|
118
|
+
Three sections, ordered by weighting (primary first). Each section:
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
.lens-sec__head (h3 "Designer — Perspective" + .lens-sec__weight chip)
|
|
122
|
+
p.lens-sec__verdict (verdict dot)
|
|
123
|
+
|
|
124
|
+
.lens-block "What's working well" (ul.lens-list.good with ✓ markers + file refs)
|
|
125
|
+
.lens-block "Issues to address" (one .finding-row per Critical/Important finding)
|
|
126
|
+
.lens-block "Opportunities" (ul.lens-list.opp with 💡 markers + file refs)
|
|
127
|
+
|
|
128
|
+
.lens-take ("Through {Designer}'s lens: {1–2 sentence summary}")
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Section heading: `Designer Name — Perspective Handle` (em-dash). Lens take is the documented lens summary, NOT a quote from the person — render as `Through {Designer}'s lens` (apostrophe-s).
|
|
132
|
+
|
|
133
|
+
Three perspective handles:
|
|
134
|
+
|
|
135
|
+
| Designer | Handle |
|
|
136
|
+
|---|---|
|
|
137
|
+
| Emil Kowalski | Restraint & Speed |
|
|
138
|
+
| Jakub Krehel | Production Polish |
|
|
139
|
+
| Jhey Tompkins | Experimentation & Delight |
|
|
140
|
+
|
|
141
|
+
#### Finding rows (Critical + Important only)
|
|
142
|
+
Each Critical or Important finding renders as a `.finding-row` inside its lens's "Issues to address" block:
|
|
143
|
+
|
|
144
|
+
```
|
|
145
|
+
.finding-row[data-sev="crit|imp"]
|
|
146
|
+
.finding-row__prose
|
|
147
|
+
.find-tags (severity chip + 1–2 lens chips)
|
|
148
|
+
h4.find-title
|
|
149
|
+
.find-body
|
|
150
|
+
<p><span class="label">What</span>{prose}</p>
|
|
151
|
+
<p><span class="label">Why it matters</span>{prose}</p>
|
|
152
|
+
<div class="fix"><p><span class="label">Recommended motion</span>{prose}</p></div>
|
|
153
|
+
<p class="find-loc"><code>{file:line}</code></p>
|
|
154
|
+
.demo
|
|
155
|
+
{radios + bar + stage with motion-target}
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
Two-column at desktop (1fr 380px), stacks at narrow widths (≤860px).
|
|
159
|
+
|
|
160
|
+
Opportunities never render a `.finding-row` and never get a demo card. They appear in the per-lens `.lens-block "Opportunities"` as a `.lens-list.opp` bulleted list.
|
|
161
|
+
|
|
162
|
+
#### 06 · Combined recommendations
|
|
163
|
+
Three severity-grouped tables, in order: `Critical · must fix` (`#rec-crit`) → `Important · should fix` (`#rec-imp`) → `Opportunities · could enhance` (`#rec-opp`). Each has a `.tier-label` with severity-colored mono label, a horizontal rule, and a count. Columns: Issue · File · Fix (or Enhancement · Where · Impact for opportunities).
|
|
164
|
+
|
|
165
|
+
#### 07 · Lens Reference Summary
|
|
166
|
+
Closing `.ref-summary` block. Which lens was referenced most + why + how to lean differently (one line per lens). No new findings here.
|
|
167
|
+
|
|
168
|
+
#### Footer
|
|
169
|
+
Mono micro-row: project name + finding counts.
|
|
170
|
+
|
|
171
|
+
### Demo cards (the centerpiece)
|
|
172
|
+
|
|
173
|
+
Each Critical or Important finding gets one demo card. The card is the ONLY animated element in the report.
|
|
174
|
+
|
|
175
|
+
#### Markup pattern
|
|
176
|
+
|
|
177
|
+
```html
|
|
178
|
+
<div class="demo">
|
|
179
|
+
<input class="vh" type="radio" name="st{n}" id="st{n}-a" checked>
|
|
180
|
+
<input class="vh" type="radio" name="st{n}" id="st{n}-l">
|
|
181
|
+
<input class="vh" type="radio" name="st{n}" id="st{n}-d">
|
|
182
|
+
<div class="demo__bar">
|
|
183
|
+
<div class="demo__meta">
|
|
184
|
+
<span class="demo__title">{recommended motion title}</span>
|
|
185
|
+
<span class="demo__timing">{duration} · {easing}</span>
|
|
186
|
+
</div>
|
|
187
|
+
<div class="demo__controls">
|
|
188
|
+
<div class="seg">
|
|
189
|
+
<label for="st{n}-a">Auto</label>
|
|
190
|
+
<label for="st{n}-l">Light</label>
|
|
191
|
+
<label for="st{n}-d">Dark</label>
|
|
192
|
+
</div>
|
|
193
|
+
<span class="demo__loop">↻</span>
|
|
194
|
+
</div>
|
|
195
|
+
</div>
|
|
196
|
+
<div class="demo__stage">
|
|
197
|
+
<div class="demo-{n}__mt">{motion target markup}</div>
|
|
198
|
+
</div>
|
|
199
|
+
</div>
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
`{n}` is the finding's 1-indexed position across the whole report (not per-section). This guarantees `@keyframes m{n}` and `.demo-{n}__mt` selectors are unique across the concatenated `<style>` block.
|
|
203
|
+
|
|
204
|
+
#### Stage 3-state toggle
|
|
205
|
+
|
|
206
|
+
| State | Behavior |
|
|
207
|
+
|---|---|
|
|
208
|
+
| **Auto** (default) | Stage colors follow the global theme via `--surface-2` + `--paper` tokens. Matches the rest of the report. |
|
|
209
|
+
| **Light** | Hardcoded light stage (`--st-bg: oklch(0.985 0.003 255)`, `--st-fg: oklch(0.180 0.006 255)`). Overrides global. |
|
|
210
|
+
| **Dark** | Hardcoded dark stage (inverted). Overrides global. |
|
|
211
|
+
|
|
212
|
+
Pure CSS. Radio inputs precede `.demo__bar` and `.demo__stage` so sibling-combinator selectors (`#stN-l:checked ~ .demo__stage`) work.
|
|
213
|
+
|
|
214
|
+
#### Stage tokens (used by motion targets)
|
|
215
|
+
|
|
216
|
+
| Token | Role |
|
|
217
|
+
|---|---|
|
|
218
|
+
| `--st-bg` | Stage background color |
|
|
219
|
+
| `--st-fg` | Foreground / text / "ink" color on the stage |
|
|
220
|
+
| `--st-line` | Border / divider color on the stage |
|
|
221
|
+
| `--st-dim` | Dimmed text color on the stage |
|
|
222
|
+
|
|
223
|
+
Motion-target elements (`.ui-btn`, `.ui-card`, `.ui-row`, `.ui-check`, `.ui-num`, `.ui-label`, milestone badge, etc.) use `--st-fg` / `--st-bg` instead of `--accent` / page colors. This guarantees correct contrast even when a stage is locked to a different theme than the page.
|
|
224
|
+
|
|
225
|
+
#### Per-finding motion code
|
|
226
|
+
|
|
227
|
+
For each Critical or Important finding `{n}`:
|
|
228
|
+
|
|
229
|
+
1. **Generate motion code.** Read the audited code, the relevant lens reference (`emil-kowalski.md` / `jakub-krehel.md` / `jhey-tompkins.md`), and `references/motion-cookbook.md` for the concrete recipe. Author a `@keyframes m{n}` block and a `.demo-{n}__mt { animation: m{n} 3s {easing} infinite; }` rule.
|
|
230
|
+
2. **Loop pacing.** `animation-duration: 3s`. Keyframes at `0%` / `~60%` / `100%`. Motion completes by ~60% (~1.8s), then holds until `100%` (~1.2s) before looping. The `100%` state MUST match the motion-target's default (no-animation) static rendering — this is the `prefers-reduced-motion` fallback contract.
|
|
231
|
+
3. **Inject into `<style>`.** Append the `@keyframes m{n}` + `.demo-{n}__mt` block to the report's `<style>`, after the layout CSS, inside a `@media (prefers-reduced-motion: no-preference) { ... }` guard.
|
|
232
|
+
4. **Inject demo-card markup.** Append the `.demo` block to the finding's `.finding-row`. Set `.demo__title` to a short motion title (e.g., "Quick tab crossfade"). Set `.demo__timing` to duration + easing (e.g., "180ms · ease-out").
|
|
233
|
+
5. **Honor reduced-motion.** The shell's `@media (prefers-reduced-motion: reduce)` block disables all `[class*="__mt"]` animations and hides the `↻` loop indicator. The per-finding `100%` keyframe state must match the motion-target's default static rendering. Do NOT write per-finding overrides inside the reduce-motion block.
|
|
234
|
+
|
|
235
|
+
### Empty-state behavior
|
|
236
|
+
|
|
237
|
+
When the audit produces zero Critical + zero Important findings:
|
|
238
|
+
|
|
239
|
+
- Header still renders with the severity counts (showing `Critical: 0 · Important: 0 · Opportunities: N`).
|
|
240
|
+
- Each per-lens "Issues to address" `.lens-block` still renders its `.mono-label`, but the body shows a dimmed-italic line:
|
|
241
|
+
```html
|
|
242
|
+
<p class="lens-empty">No issues found at this severity level.</p>
|
|
243
|
+
```
|
|
244
|
+
- No `.finding-row` markup, no demo cards.
|
|
245
|
+
- Opportunities still render as `.lens-list.opp` lists.
|
|
246
|
+
- Combined recommendations tables render with empty `<tbody>` containing a single dimmed-italic row, OR are omitted entirely if their tier has zero findings.
|
|
247
|
+
|
|
248
|
+
### Responsive behavior
|
|
249
|
+
|
|
250
|
+
- `.finding-row` 2-col → 1-col at ≤860px (demo stacks below prose).
|
|
251
|
+
- `.timing-grid` 2-col → 1-col at ≤860px (key list stacks below SVG).
|
|
252
|
+
- `.lens-table` → stacked blocks at ≤600px (each row becomes a block, headers hidden).
|
|
253
|
+
- `.ref-lean` 2-col → 1-col at ≤600px.
|
|
254
|
+
|
|
255
|
+
### Absolute bans
|
|
256
|
+
|
|
257
|
+
- **NO `border-left` or `border-right` >1px as a colored accent stripe** on cards, list items, callouts, or alerts. Use full borders, leading numbers, tinted backgrounds, or no visual indicator instead. (The previous version of this spec had `border-left: 3px solid var(--accent)` on the lens-take block — removed.)
|
|
258
|
+
- **NO gradient text** (`background-clip: text` + gradient).
|
|
259
|
+
- **NO pulsing UI** in any demo (looping scale/opacity on status indicators, "live" pulse rings, breathing CTAs). Demo motion is structured one-shot enters that loop, not attention-getting pulses.
|
|
260
|
+
- **NO chromatic accent in the default system.** The neutral-default is the supported configuration. Repointing `--accent` to a sampled brand color is permitted only when severity-hue clearance is verified.
|
|
261
|
+
|
|
262
|
+
---
|
|
263
|
+
|
|
264
|
+
## Terminal mode (flag-triggered fallback)
|
|
265
|
+
|
|
266
|
+
When the user passes `--terminal` / `--inline` / a natural-language equivalent, do not write an HTML file. Render the decorated-markdown report inline in the conversation.
|
|
267
|
+
|
|
268
|
+
### Quick Summary (show first)
|
|
269
|
+
|
|
270
|
+
```
|
|
271
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
272
|
+
📊 AUDIT SUMMARY
|
|
273
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
274
|
+
🔴 [X] Critical | 🟡 [X] Important | 🟢 [X] Opportunities
|
|
275
|
+
Primary lens: [Designer] ([context reason])
|
|
276
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
### Overall Assessment
|
|
280
|
+
One paragraph: Does this feel polished? Too much? Too little? What's working, what's not?
|
|
281
|
+
|
|
282
|
+
### Per-Designer Sections
|
|
283
|
+
|
|
284
|
+
For each designer (Emil, Jakub, Jhey — ordered by weighting), use a horizontal-rule header and the body format:
|
|
285
|
+
|
|
286
|
+
```
|
|
287
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
288
|
+
⚡ EMIL KOWALSKI — Restraint & Speed (Secondary)
|
|
289
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
290
|
+
|
|
291
|
+
What's Working Well
|
|
292
|
+
- ✓ [Observation] — `file.tsx:line`
|
|
293
|
+
|
|
294
|
+
Issues to Address
|
|
295
|
+
- ✗ [Issue] — `file.tsx:line`
|
|
296
|
+
[Brief explanation]
|
|
297
|
+
Recommended: [Brief recommendation]
|
|
298
|
+
|
|
299
|
+
Through Emil's lens: [1–2 sentence summary]
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
### Combined Recommendations
|
|
303
|
+
|
|
304
|
+
Three severity tables:
|
|
305
|
+
|
|
306
|
+
```
|
|
307
|
+
Critical · Must Fix
|
|
308
|
+
| | Issue | File | Fix |
|
|
309
|
+
|-|-------|------|-----|
|
|
310
|
+
| 🔴 | [Issue] | `file:line` | [Fix] |
|
|
311
|
+
|
|
312
|
+
Important · Should Fix
|
|
313
|
+
| | Issue | File | Fix |
|
|
314
|
+
|-|-------|------|-----|
|
|
315
|
+
| 🟡 | [Issue] | `file:line` | [Fix] |
|
|
316
|
+
|
|
317
|
+
Opportunities · Could Enhance
|
|
318
|
+
| | Enhancement | Where | Impact |
|
|
319
|
+
|-|-------------|-------|--------|
|
|
320
|
+
| 🟢 | [Enhancement] | `file:line` | [Impact] |
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
### Lens Reference Summary
|
|
324
|
+
|
|
325
|
+
```
|
|
326
|
+
> Lens referenced most: [Designer Name] — [Perspective]
|
|
327
|
+
>
|
|
328
|
+
> Why: [Explanation based on the project context]
|
|
329
|
+
>
|
|
330
|
+
> If you want to lean differently:
|
|
331
|
+
> - To follow Emil more strictly: [specific actions]
|
|
332
|
+
> - To follow Jakub more strictly: [specific actions]
|
|
333
|
+
> - To follow Jhey more strictly: [specific actions]
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
---
|
|
337
|
+
|
|
338
|
+
## Mode selection
|
|
339
|
+
|
|
340
|
+
Default to HTML mode. Trigger terminal mode only when the user explicitly signals it via:
|
|
341
|
+
|
|
342
|
+
- `--terminal` / `--inline` / `--no-html` flag
|
|
343
|
+
- Natural-language equivalent: "show the full report inline," "skip the HTML," "no HTML," "terminal only"
|
|
344
|
+
- Any headless or CI environment where opening a browser doesn't apply
|
|
345
|
+
|
|
346
|
+
When defaulting to HTML, mention in the 3-line confirmation summary (see `workflows/audit.md`) that `--terminal` is the alternative — so the user knows it exists.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# Performance
|
|
2
|
+
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## will-change Explained (Jakub)
|
|
6
|
+
|
|
7
|
+
A hint to the browser: "I'm about to animate these properties, please prepare."
|
|
8
|
+
|
|
9
|
+
```css
|
|
10
|
+
/* Good - specific properties that will animate */
|
|
11
|
+
.animated-button {
|
|
12
|
+
will-change: transform, opacity;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/* Bad - too broad, wastes resources */
|
|
16
|
+
* { will-change: auto; }
|
|
17
|
+
.element { will-change: all; }
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
**Properties that benefit from will-change**:
|
|
21
|
+
- transform
|
|
22
|
+
- opacity
|
|
23
|
+
- filter (blur, brightness)
|
|
24
|
+
- clip-path
|
|
25
|
+
- mask
|
|
26
|
+
|
|
27
|
+
**Why it matters**: Without the hint, the browser promotes elements to GPU layers only when animation starts, causing first-frame stutter. With `will-change`, it pre-promotes during idle time.
|
|
28
|
+
|
|
29
|
+
**When NOT to use**:
|
|
30
|
+
- On elements that won't animate
|
|
31
|
+
- On too many elements (each GPU layer uses memory)
|
|
32
|
+
- As a "fix" for janky animations (find the real cause)
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Gradient Animation Performance (Jakub)
|
|
37
|
+
|
|
38
|
+
**Cheap to animate (GPU-accelerated)**:
|
|
39
|
+
- background-position
|
|
40
|
+
- background-size
|
|
41
|
+
- opacity
|
|
42
|
+
|
|
43
|
+
**Expensive to animate**:
|
|
44
|
+
- Color stops
|
|
45
|
+
- Adding/removing gradient layers
|
|
46
|
+
- Switching gradient types
|
|
47
|
+
|
|
48
|
+
**Tip**: Animate a pseudo-element overlay or use CSS variables that transition indirectly.
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Animation Performance Budget
|
|
53
|
+
|
|
54
|
+
As a rough guide:
|
|
55
|
+
- **0-3 elements** with `will-change`: Fine
|
|
56
|
+
- **4-10 elements**: Careful, test on low-end devices
|
|
57
|
+
- **10+ elements**: Reconsider approach, use virtualization or stagger
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Properties to Avoid Animating
|
|
62
|
+
|
|
63
|
+
These trigger layout recalculation (expensive):
|
|
64
|
+
- `width`, `height`
|
|
65
|
+
- `top`, `left`, `right`, `bottom`
|
|
66
|
+
- `margin`, `padding`
|
|
67
|
+
- `font-size`
|
|
68
|
+
|
|
69
|
+
**Always prefer**:
|
|
70
|
+
- `transform: translate()` instead of `top`/`left`
|
|
71
|
+
- `transform: scale()` instead of `width`/`height`
|
|
72
|
+
- `opacity` for visibility changes
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Performance Checklist
|
|
77
|
+
|
|
78
|
+
- [ ] `will-change` used sparingly and specifically
|
|
79
|
+
- [ ] Animations use transform/opacity (not layout properties)
|
|
80
|
+
- [ ] Tested on low-end devices
|
|
81
|
+
- [ ] No continuous animations without purpose
|
|
82
|
+
- [ ] GPU layer count is reasonable (< 10 animated elements)
|