@rune-kit/rune 2.10.0 → 2.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +8 -6
- package/commands/rune.md +168 -168
- package/contexts/dev.md +34 -34
- package/contexts/research.md +43 -43
- package/contexts/review.md +55 -55
- package/extensions/ai-ml/PACK.md +88 -88
- package/extensions/ai-ml/skills/ai-agents.md +172 -172
- package/extensions/ai-ml/skills/code-sandbox.md +187 -187
- package/extensions/ai-ml/skills/deep-research.md +146 -146
- package/extensions/ai-ml/skills/embedding-search.md +66 -66
- package/extensions/ai-ml/skills/fine-tuning-guide.md +74 -74
- package/extensions/ai-ml/skills/llm-architect.md +125 -125
- package/extensions/ai-ml/skills/llm-integration.md +64 -64
- package/extensions/ai-ml/skills/prompt-patterns.md +72 -72
- package/extensions/ai-ml/skills/rag-patterns.md +66 -66
- package/extensions/ai-ml/skills/web-extraction.md +114 -114
- package/extensions/analytics/PACK.md +92 -92
- package/extensions/analytics/skills/ab-testing.md +72 -72
- package/extensions/analytics/skills/dashboard-patterns.md +83 -83
- package/extensions/analytics/skills/data-validation.md +68 -68
- package/extensions/analytics/skills/funnel-analysis.md +81 -81
- package/extensions/analytics/skills/sql-patterns.md +57 -57
- package/extensions/analytics/skills/statistical-analysis.md +79 -79
- package/extensions/analytics/skills/tracking-setup.md +71 -71
- package/extensions/backend/PACK.md +104 -104
- package/extensions/backend/skills/api-patterns.md +84 -84
- package/extensions/backend/skills/async-pipeline.md +193 -193
- package/extensions/backend/skills/auth-patterns.md +97 -97
- package/extensions/backend/skills/background-jobs.md +133 -133
- package/extensions/backend/skills/caching-patterns.md +108 -108
- package/extensions/backend/skills/cli-generation.md +133 -133
- package/extensions/backend/skills/database-patterns.md +87 -87
- package/extensions/backend/skills/middleware-patterns.md +104 -104
- package/extensions/chrome-ext/PACK.md +93 -93
- package/extensions/chrome-ext/skills/cws-preflight.md +143 -143
- package/extensions/chrome-ext/skills/cws-publish.md +104 -104
- package/extensions/chrome-ext/skills/ext-ai-integration.md +251 -251
- package/extensions/chrome-ext/skills/ext-messaging.md +139 -139
- package/extensions/chrome-ext/skills/ext-storage.md +133 -133
- package/extensions/chrome-ext/skills/mv3-scaffold.md +164 -164
- package/extensions/content/PACK.md +96 -96
- package/extensions/content/skills/blog-patterns.md +88 -88
- package/extensions/content/skills/cms-integration.md +131 -131
- package/extensions/content/skills/content-scoring.md +107 -107
- package/extensions/content/skills/i18n.md +83 -83
- package/extensions/content/skills/mdx-authoring.md +137 -137
- package/extensions/content/skills/reference.md +1014 -1014
- package/extensions/content/skills/seo-patterns.md +67 -67
- package/extensions/content/skills/video-repurpose.md +153 -153
- package/extensions/devops/PACK.md +101 -101
- package/extensions/devops/skills/chaos-testing.md +67 -67
- package/extensions/devops/skills/ci-cd.md +75 -75
- package/extensions/devops/skills/docker.md +58 -58
- package/extensions/devops/skills/edge-serverless.md +163 -163
- package/extensions/devops/skills/infra-as-code.md +158 -158
- package/extensions/devops/skills/kubernetes.md +110 -110
- package/extensions/devops/skills/monitoring.md +57 -57
- package/extensions/devops/skills/server-setup.md +64 -64
- package/extensions/devops/skills/ssl-domain.md +42 -42
- package/extensions/ecommerce/PACK.md +116 -116
- package/extensions/ecommerce/skills/cart-system.md +79 -79
- package/extensions/ecommerce/skills/inventory-mgmt.md +102 -102
- package/extensions/ecommerce/skills/order-management.md +126 -126
- package/extensions/ecommerce/skills/payment-integration.md +472 -472
- package/extensions/ecommerce/skills/shopify-dev.md +69 -69
- package/extensions/ecommerce/skills/subscription-billing.md +93 -93
- package/extensions/ecommerce/skills/tax-compliance.md +117 -117
- package/extensions/gamedev/PACK.md +142 -142
- package/extensions/gamedev/skills/asset-pipeline.md +74 -74
- package/extensions/gamedev/skills/audio-system.md +129 -129
- package/extensions/gamedev/skills/camera-system.md +87 -87
- package/extensions/gamedev/skills/ecs.md +98 -98
- package/extensions/gamedev/skills/game-loops.md +72 -72
- package/extensions/gamedev/skills/input-system.md +199 -199
- package/extensions/gamedev/skills/multiplayer.md +180 -180
- package/extensions/gamedev/skills/particles.md +105 -105
- package/extensions/gamedev/skills/physics-engine.md +89 -89
- package/extensions/gamedev/skills/scene-management.md +146 -146
- package/extensions/gamedev/skills/threejs-patterns.md +90 -90
- package/extensions/gamedev/skills/webgl.md +71 -71
- package/extensions/mobile/PACK.md +106 -106
- package/extensions/mobile/skills/app-store-connect.md +152 -152
- package/extensions/mobile/skills/app-store-prep.md +66 -66
- package/extensions/mobile/skills/deep-linking.md +109 -109
- package/extensions/mobile/skills/flutter.md +60 -60
- package/extensions/mobile/skills/ios-build-pipeline.md +142 -142
- package/extensions/mobile/skills/native-bridge.md +66 -66
- package/extensions/mobile/skills/ota-updates.md +97 -97
- package/extensions/mobile/skills/push-notifications.md +111 -111
- package/extensions/mobile/skills/react-native.md +82 -82
- package/extensions/saas/PACK.md +116 -116
- package/extensions/saas/skills/billing-integration.md +200 -200
- package/extensions/saas/skills/feature-flags.md +130 -130
- package/extensions/saas/skills/multi-tenant.md +103 -103
- package/extensions/saas/skills/onboarding-flow.md +139 -139
- package/extensions/saas/skills/subscription-flow.md +95 -95
- package/extensions/saas/skills/team-management.md +144 -144
- package/extensions/security/PACK.md +99 -99
- package/extensions/security/skills/api-security.md +140 -140
- package/extensions/security/skills/compliance.md +68 -68
- package/extensions/security/skills/owasp-audit.md +64 -64
- package/extensions/security/skills/pentest-patterns.md +77 -77
- package/extensions/security/skills/secret-mgmt.md +65 -65
- package/extensions/security/skills/supply-chain.md +65 -65
- package/extensions/trading/PACK.md +80 -80
- package/extensions/trading/skills/chart-components.md +55 -55
- package/extensions/trading/skills/experiment-loop.md +125 -125
- package/extensions/trading/skills/fintech-patterns.md +47 -47
- package/extensions/trading/skills/indicator-library.md +58 -58
- package/extensions/trading/skills/quant-analysis.md +111 -111
- package/extensions/trading/skills/realtime-data.md +58 -58
- package/extensions/trading/skills/trade-logic.md +104 -104
- package/extensions/ui/PACK.md +130 -130
- package/extensions/ui/skills/a11y-audit.md +91 -91
- package/extensions/ui/skills/animation-patterns.md +127 -127
- package/extensions/ui/skills/component-patterns.md +100 -100
- package/extensions/ui/skills/design-decision.md +108 -108
- package/extensions/ui/skills/design-system.md +68 -68
- package/extensions/ui/skills/landing-patterns.md +155 -155
- package/extensions/ui/skills/palette-picker.md +173 -173
- package/extensions/ui/skills/react-health.md +90 -90
- package/extensions/ui/skills/type-system.md +125 -125
- package/extensions/ui/skills/web-vitals.md +153 -153
- package/extensions/zalo/PACK.md +145 -145
- package/extensions/zalo/skills/zalo-oa-mcp.md +317 -317
- package/extensions/zalo/skills/zalo-oa-messaging.md +429 -429
- package/extensions/zalo/skills/zalo-oa-setup.md +236 -236
- package/extensions/zalo/skills/zalo-oa-webhook.md +189 -189
- package/extensions/zalo/skills/zalo-personal-messaging.md +194 -194
- package/extensions/zalo/skills/zalo-personal-setup.md +153 -153
- package/extensions/zalo/skills/zalo-rate-guard.md +219 -219
- package/hooks/auto-format/index.cjs +48 -48
- package/hooks/hooks.json +111 -111
- package/hooks/post-session-reflect/index.cjs +189 -189
- package/hooks/pre-compact/index.cjs +95 -95
- package/hooks/run-hook.cmd +1 -1
- package/hooks/secrets-scan/index.cjs +100 -100
- package/hooks/session-start/index.cjs +71 -71
- package/hooks/typecheck/index.cjs +65 -65
- package/package.json +63 -63
- package/references/ui-pro-max-data/LICENSE-UI-PRO-MAX +21 -21
- package/references/ui-pro-max-data/charts.csv +26 -26
- package/references/ui-pro-max-data/colors.csv +161 -161
- package/references/ui-pro-max-data/styles.csv +68 -68
- package/references/ui-pro-max-data/typography.csv +74 -74
- package/references/ui-pro-max-data/ui-reasoning.csv +162 -162
- package/references/ui-pro-max-data/ux-guidelines.csv +99 -99
- package/skills/adversary/SKILL.md +283 -283
- package/skills/asset-creator/SKILL.md +157 -157
- package/skills/audit/SKILL.md +147 -2
- package/skills/autopsy/SKILL.md +335 -335
- package/skills/brainstorm/SKILL.md +342 -342
- package/skills/browser-pilot/SKILL.md +168 -168
- package/skills/constraint-check/SKILL.md +165 -165
- package/skills/context-engine/SKILL.md +404 -404
- package/skills/cook/SKILL.md +917 -863
- package/skills/db/SKILL.md +273 -273
- package/skills/debug/SKILL.md +465 -465
- package/skills/dependency-doctor/SKILL.md +265 -235
- package/skills/deploy/SKILL.md +274 -231
- package/skills/design/DESIGN-REFERENCE.md +365 -365
- package/skills/design/SKILL.md +589 -589
- package/skills/doc-processor/SKILL.md +254 -254
- package/skills/docs/SKILL.md +374 -374
- package/skills/docs-seeker/SKILL.md +177 -177
- package/skills/fix/SKILL.md +330 -330
- package/skills/git/SKILL.md +339 -339
- package/skills/hallucination-guard/SKILL.md +219 -219
- package/skills/incident/SKILL.md +254 -253
- package/skills/integrity-check/SKILL.md +169 -169
- package/skills/journal/SKILL.md +240 -240
- package/skills/launch/SKILL.md +344 -344
- package/skills/logic-guardian/SKILL.md +251 -251
- package/skills/marketing/SKILL.md +290 -289
- package/skills/mcp-builder/SKILL.md +425 -425
- package/skills/neural-memory/SKILL.md +362 -362
- package/skills/onboard/SKILL.md +404 -403
- package/skills/perf/SKILL.md +346 -346
- package/skills/plan/SKILL.md +433 -428
- package/skills/preflight/SKILL.md +415 -415
- package/skills/problem-solver/SKILL.md +380 -284
- package/skills/rescue/SKILL.md +474 -474
- package/skills/retro/SKILL.md +3 -1
- package/skills/review/SKILL.md +612 -588
- package/skills/review-intake/SKILL.md +249 -249
- package/skills/safeguard/SKILL.md +200 -200
- package/skills/sast/SKILL.md +190 -190
- package/skills/scaffold/SKILL.md +328 -287
- package/skills/scope-guard/SKILL.md +180 -180
- package/skills/scout/SKILL.md +263 -263
- package/skills/sentinel/SKILL.md +382 -381
- package/skills/sentinel-env/SKILL.md +254 -254
- package/skills/sequential-thinking/SKILL.md +234 -234
- package/skills/session-bridge/SKILL.md +543 -543
- package/skills/skill-forge/SKILL.md +581 -581
- package/skills/skill-router/SKILL.md +3 -0
- package/skills/surgeon/SKILL.md +215 -215
- package/skills/team/SKILL.md +556 -537
- package/skills/test/SKILL.md +614 -614
- package/skills/trend-scout/SKILL.md +145 -145
- package/skills/verification/SKILL.md +326 -326
- package/skills/video-creator/SKILL.md +201 -201
- package/skills/watchdog/SKILL.md +168 -168
- package/skills/worktree/SKILL.md +140 -140
|
@@ -1,125 +1,125 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: "type-system"
|
|
3
|
-
pack: "@rune/ui"
|
|
4
|
-
description: "Typography pairing database — 22 font pairings organized by product vibe. Each pairing includes Google Fonts URL, Tailwind config, size scale from display to caption, weight mapping, and line height ratios."
|
|
5
|
-
model: sonnet
|
|
6
|
-
tools: [Read, Edit, Write, Grep, Glob, Bash]
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# type-system
|
|
10
|
-
|
|
11
|
-
Typography pairing database — 22 font pairings organized by product vibe. Each pairing includes Google Fonts URL, Tailwind config, size scale from display to caption, weight mapping, and line height ratios. Decision tree maps product type and tone to the right pairing.
|
|
12
|
-
|
|
13
|
-
#### Workflow
|
|
14
|
-
|
|
15
|
-
**Step 1 — Detect product tone**
|
|
16
|
-
Read `CLAUDE.md` or ask: "What is the product tone?" Classify: modern-tech | editorial | playful | corporate | developer | luxury | humanist | brutalist | minimal.
|
|
17
|
-
|
|
18
|
-
**Step 2 — Recommend pairing**
|
|
19
|
-
Apply the decision tree. Output the top 2 pairings with rationale (brand signal, readability score, Google Fonts load weight).
|
|
20
|
-
|
|
21
|
-
**Step 3 — Generate @font-face / config**
|
|
22
|
-
Emit the `<link>` preconnect + stylesheet tag for Google Fonts. Emit Tailwind `fontFamily` config. Emit a CSS type scale (`--text-display` through `--text-caption`).
|
|
23
|
-
|
|
24
|
-
**Step 4 — Verify readability**
|
|
25
|
-
Check: body size ≥ 14px, line-height ≥ 1.5 for body, ≤ 1.25 for headings. Flag any contrast failure using the project's background token.
|
|
26
|
-
|
|
27
|
-
#### Decision Tree
|
|
28
|
-
|
|
29
|
-
```
|
|
30
|
-
Product Tone → Pairing
|
|
31
|
-
──────────────────────────────────────────────────────────
|
|
32
|
-
modern tech / saas → Space Grotesk + Inter
|
|
33
|
-
editorial / blog → Playfair Display + Source Serif 4
|
|
34
|
-
playful / kids / app → Fredoka + Nunito
|
|
35
|
-
corporate / enterprise→ IBM Plex Sans + IBM Plex Serif
|
|
36
|
-
developer tools / CLI → JetBrains Mono + Inter
|
|
37
|
-
luxury / fashion → Cormorant Garamond + Montserrat
|
|
38
|
-
humanist / health → DM Sans + DM Serif Display
|
|
39
|
-
brutalist / bold → Bebas Neue + IBM Plex Mono
|
|
40
|
-
minimal / productivity→ Inter + Inter (weight-only hierarchy)
|
|
41
|
-
gaming / esports → Rajdhani + Exo 2
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
#### Pairing Reference
|
|
45
|
-
|
|
46
|
-
```html
|
|
47
|
-
<!-- Space Grotesk + Inter (modern-tech / saas) -->
|
|
48
|
-
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
49
|
-
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
50
|
-
<link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
|
|
51
|
-
|
|
52
|
-
<!-- Playfair Display + Source Serif 4 (editorial) -->
|
|
53
|
-
<link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,700;1,400&family=Source+Serif+4:wght@400;600&display=swap" rel="stylesheet">
|
|
54
|
-
|
|
55
|
-
<!-- Fredoka + Nunito (playful) -->
|
|
56
|
-
<link href="https://fonts.googleapis.com/css2?family=Fredoka:wght@400;600;700&family=Nunito:wght@400;600&display=swap" rel="stylesheet">
|
|
57
|
-
|
|
58
|
-
<!-- IBM Plex Sans + IBM Plex Serif (corporate) -->
|
|
59
|
-
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@400;500;600&family=IBM+Plex+Serif:wght@400;600&display=swap" rel="stylesheet">
|
|
60
|
-
|
|
61
|
-
<!-- JetBrains Mono + Inter (developer tools) -->
|
|
62
|
-
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;700&family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
|
|
63
|
-
|
|
64
|
-
<!-- Cormorant Garamond + Montserrat (luxury) -->
|
|
65
|
-
<link href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,600;1,400&family=Montserrat:wght@400;500;700&display=swap" rel="stylesheet">
|
|
66
|
-
|
|
67
|
-
<!-- DM Sans + DM Serif Display (humanist / health) -->
|
|
68
|
-
<link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600&family=DM+Serif+Display&display=swap" rel="stylesheet">
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
```css
|
|
72
|
-
/* Type scale — Space Grotesk + Inter pairing */
|
|
73
|
-
:root {
|
|
74
|
-
--font-display: 'Space Grotesk', system-ui, sans-serif;
|
|
75
|
-
--font-body: 'Inter', system-ui, sans-serif;
|
|
76
|
-
--font-mono: 'JetBrains Mono', monospace;
|
|
77
|
-
|
|
78
|
-
/* Scale */
|
|
79
|
-
--text-display: clamp(2.5rem, 5vw, 4.5rem); /* 40–72px */
|
|
80
|
-
--text-h1: clamp(2rem, 4vw, 2.5rem); /* 32–40px */
|
|
81
|
-
--text-h2: clamp(1.375rem, 2.5vw, 1.75rem); /* 22–28px */
|
|
82
|
-
--text-h3: 1.125rem; /* 18px */
|
|
83
|
-
--text-body: 1rem; /* 16px */
|
|
84
|
-
--text-small: 0.875rem; /* 14px */
|
|
85
|
-
--text-caption: 0.75rem; /* 12px */
|
|
86
|
-
|
|
87
|
-
/* Leading */
|
|
88
|
-
--leading-tight: 1.2;
|
|
89
|
-
--leading-snug: 1.35;
|
|
90
|
-
--leading-normal: 1.5;
|
|
91
|
-
--leading-relaxed:1.75;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
h1, h2, h3 { font-family: var(--font-display); line-height: var(--leading-tight); }
|
|
95
|
-
body { font-family: var(--font-body); line-height: var(--leading-normal); }
|
|
96
|
-
code, pre { font-family: var(--font-mono); }
|
|
97
|
-
|
|
98
|
-
/* Financial numbers — always mono + bold */
|
|
99
|
-
.number, .price, .stat {
|
|
100
|
-
font-family: var(--font-mono);
|
|
101
|
-
font-weight: 700;
|
|
102
|
-
font-variant-numeric: tabular-nums;
|
|
103
|
-
}
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
```js
|
|
107
|
-
// tailwind.config.js — font pairing extension
|
|
108
|
-
module.exports = {
|
|
109
|
-
theme: {
|
|
110
|
-
extend: {
|
|
111
|
-
fontFamily: {
|
|
112
|
-
display: ['Space Grotesk', 'system-ui', 'sans-serif'],
|
|
113
|
-
body: ['Inter', 'system-ui', 'sans-serif'],
|
|
114
|
-
mono: ['JetBrains Mono','monospace'],
|
|
115
|
-
},
|
|
116
|
-
fontSize: {
|
|
117
|
-
'display': ['clamp(2.5rem, 5vw, 4.5rem)', { lineHeight: '1.1' }],
|
|
118
|
-
'h1': ['clamp(2rem, 4vw, 2.5rem)', { lineHeight: '1.2' }],
|
|
119
|
-
'h2': ['1.75rem', { lineHeight: '1.3' }],
|
|
120
|
-
'h3': ['1.125rem', { lineHeight: '1.4' }],
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
```
|
|
1
|
+
---
|
|
2
|
+
name: "type-system"
|
|
3
|
+
pack: "@rune/ui"
|
|
4
|
+
description: "Typography pairing database — 22 font pairings organized by product vibe. Each pairing includes Google Fonts URL, Tailwind config, size scale from display to caption, weight mapping, and line height ratios."
|
|
5
|
+
model: sonnet
|
|
6
|
+
tools: [Read, Edit, Write, Grep, Glob, Bash]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# type-system
|
|
10
|
+
|
|
11
|
+
Typography pairing database — 22 font pairings organized by product vibe. Each pairing includes Google Fonts URL, Tailwind config, size scale from display to caption, weight mapping, and line height ratios. Decision tree maps product type and tone to the right pairing.
|
|
12
|
+
|
|
13
|
+
#### Workflow
|
|
14
|
+
|
|
15
|
+
**Step 1 — Detect product tone**
|
|
16
|
+
Read `CLAUDE.md` or ask: "What is the product tone?" Classify: modern-tech | editorial | playful | corporate | developer | luxury | humanist | brutalist | minimal.
|
|
17
|
+
|
|
18
|
+
**Step 2 — Recommend pairing**
|
|
19
|
+
Apply the decision tree. Output the top 2 pairings with rationale (brand signal, readability score, Google Fonts load weight).
|
|
20
|
+
|
|
21
|
+
**Step 3 — Generate @font-face / config**
|
|
22
|
+
Emit the `<link>` preconnect + stylesheet tag for Google Fonts. Emit Tailwind `fontFamily` config. Emit a CSS type scale (`--text-display` through `--text-caption`).
|
|
23
|
+
|
|
24
|
+
**Step 4 — Verify readability**
|
|
25
|
+
Check: body size ≥ 14px, line-height ≥ 1.5 for body, ≤ 1.25 for headings. Flag any contrast failure using the project's background token.
|
|
26
|
+
|
|
27
|
+
#### Decision Tree
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
Product Tone → Pairing
|
|
31
|
+
──────────────────────────────────────────────────────────
|
|
32
|
+
modern tech / saas → Space Grotesk + Inter
|
|
33
|
+
editorial / blog → Playfair Display + Source Serif 4
|
|
34
|
+
playful / kids / app → Fredoka + Nunito
|
|
35
|
+
corporate / enterprise→ IBM Plex Sans + IBM Plex Serif
|
|
36
|
+
developer tools / CLI → JetBrains Mono + Inter
|
|
37
|
+
luxury / fashion → Cormorant Garamond + Montserrat
|
|
38
|
+
humanist / health → DM Sans + DM Serif Display
|
|
39
|
+
brutalist / bold → Bebas Neue + IBM Plex Mono
|
|
40
|
+
minimal / productivity→ Inter + Inter (weight-only hierarchy)
|
|
41
|
+
gaming / esports → Rajdhani + Exo 2
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
#### Pairing Reference
|
|
45
|
+
|
|
46
|
+
```html
|
|
47
|
+
<!-- Space Grotesk + Inter (modern-tech / saas) -->
|
|
48
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
49
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
50
|
+
<link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
|
|
51
|
+
|
|
52
|
+
<!-- Playfair Display + Source Serif 4 (editorial) -->
|
|
53
|
+
<link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,700;1,400&family=Source+Serif+4:wght@400;600&display=swap" rel="stylesheet">
|
|
54
|
+
|
|
55
|
+
<!-- Fredoka + Nunito (playful) -->
|
|
56
|
+
<link href="https://fonts.googleapis.com/css2?family=Fredoka:wght@400;600;700&family=Nunito:wght@400;600&display=swap" rel="stylesheet">
|
|
57
|
+
|
|
58
|
+
<!-- IBM Plex Sans + IBM Plex Serif (corporate) -->
|
|
59
|
+
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@400;500;600&family=IBM+Plex+Serif:wght@400;600&display=swap" rel="stylesheet">
|
|
60
|
+
|
|
61
|
+
<!-- JetBrains Mono + Inter (developer tools) -->
|
|
62
|
+
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;700&family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
|
|
63
|
+
|
|
64
|
+
<!-- Cormorant Garamond + Montserrat (luxury) -->
|
|
65
|
+
<link href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,600;1,400&family=Montserrat:wght@400;500;700&display=swap" rel="stylesheet">
|
|
66
|
+
|
|
67
|
+
<!-- DM Sans + DM Serif Display (humanist / health) -->
|
|
68
|
+
<link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600&family=DM+Serif+Display&display=swap" rel="stylesheet">
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
```css
|
|
72
|
+
/* Type scale — Space Grotesk + Inter pairing */
|
|
73
|
+
:root {
|
|
74
|
+
--font-display: 'Space Grotesk', system-ui, sans-serif;
|
|
75
|
+
--font-body: 'Inter', system-ui, sans-serif;
|
|
76
|
+
--font-mono: 'JetBrains Mono', monospace;
|
|
77
|
+
|
|
78
|
+
/* Scale */
|
|
79
|
+
--text-display: clamp(2.5rem, 5vw, 4.5rem); /* 40–72px */
|
|
80
|
+
--text-h1: clamp(2rem, 4vw, 2.5rem); /* 32–40px */
|
|
81
|
+
--text-h2: clamp(1.375rem, 2.5vw, 1.75rem); /* 22–28px */
|
|
82
|
+
--text-h3: 1.125rem; /* 18px */
|
|
83
|
+
--text-body: 1rem; /* 16px */
|
|
84
|
+
--text-small: 0.875rem; /* 14px */
|
|
85
|
+
--text-caption: 0.75rem; /* 12px */
|
|
86
|
+
|
|
87
|
+
/* Leading */
|
|
88
|
+
--leading-tight: 1.2;
|
|
89
|
+
--leading-snug: 1.35;
|
|
90
|
+
--leading-normal: 1.5;
|
|
91
|
+
--leading-relaxed:1.75;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
h1, h2, h3 { font-family: var(--font-display); line-height: var(--leading-tight); }
|
|
95
|
+
body { font-family: var(--font-body); line-height: var(--leading-normal); }
|
|
96
|
+
code, pre { font-family: var(--font-mono); }
|
|
97
|
+
|
|
98
|
+
/* Financial numbers — always mono + bold */
|
|
99
|
+
.number, .price, .stat {
|
|
100
|
+
font-family: var(--font-mono);
|
|
101
|
+
font-weight: 700;
|
|
102
|
+
font-variant-numeric: tabular-nums;
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
```js
|
|
107
|
+
// tailwind.config.js — font pairing extension
|
|
108
|
+
module.exports = {
|
|
109
|
+
theme: {
|
|
110
|
+
extend: {
|
|
111
|
+
fontFamily: {
|
|
112
|
+
display: ['Space Grotesk', 'system-ui', 'sans-serif'],
|
|
113
|
+
body: ['Inter', 'system-ui', 'sans-serif'],
|
|
114
|
+
mono: ['JetBrains Mono','monospace'],
|
|
115
|
+
},
|
|
116
|
+
fontSize: {
|
|
117
|
+
'display': ['clamp(2.5rem, 5vw, 4.5rem)', { lineHeight: '1.1' }],
|
|
118
|
+
'h1': ['clamp(2rem, 4vw, 2.5rem)', { lineHeight: '1.2' }],
|
|
119
|
+
'h2': ['1.75rem', { lineHeight: '1.3' }],
|
|
120
|
+
'h3': ['1.125rem', { lineHeight: '1.4' }],
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
```
|
|
@@ -1,153 +1,153 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: "web-vitals"
|
|
3
|
-
pack: "@rune/ui"
|
|
4
|
-
description: "Core Web Vitals performance audit — measures LCP, CLS, FCP, TBT, INP, and Speed Index against Google thresholds. Identifies render-blocking resources, network dependency chains, layout shift culprits, missing preloads, caching gaps, and tree-shaking opportunities."
|
|
5
|
-
model: sonnet
|
|
6
|
-
tools: [Read, Edit, Write, Grep, Glob, Bash]
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# web-vitals
|
|
10
|
-
|
|
11
|
-
Core Web Vitals performance audit — measures LCP, CLS, FCP, TBT, INP, and Speed Index against Google thresholds. Identifies render-blocking resources, network dependency chains, layout shift culprits, missing preloads, caching gaps, and tree-shaking opportunities. Framework-aware analysis for Next.js, Vite, SvelteKit, and Astro.
|
|
12
|
-
|
|
13
|
-
#### Workflow
|
|
14
|
-
|
|
15
|
-
**Step 1 — Detect build tooling and framework**
|
|
16
|
-
Read `package.json`, config files (`next.config.*`, `vite.config.*`, `svelte.config.*`, `astro.config.*`), and build scripts. Identify:
|
|
17
|
-
- Bundler: Webpack, Vite, Rollup, esbuild, Turbopack
|
|
18
|
-
- Framework: Next.js (App Router vs Pages), SvelteKit, Astro, Remix
|
|
19
|
-
- CSS strategy: Tailwind (content config), CSS Modules, global CSS
|
|
20
|
-
- Compression: gzip/brotli configuration
|
|
21
|
-
- Source maps: enabled in production? (should be external or disabled)
|
|
22
|
-
|
|
23
|
-
**Step 2 — Audit render-blocking resources**
|
|
24
|
-
Use Grep to scan HTML entry points and framework layouts for:
|
|
25
|
-
- `<link rel="stylesheet">` in `<head>` without `media` attribute — blocks first paint
|
|
26
|
-
- `<script>` tags without `async` or `defer` — blocks HTML parsing
|
|
27
|
-
- CSS `@import` chains — each import is a sequential network request
|
|
28
|
-
- Large inline `<style>` blocks (>50KB) — delays first paint
|
|
29
|
-
|
|
30
|
-
For each blocking resource, estimate impact: 0ms impact = note but don't prioritize. Focus on resources that delay FCP by >100ms.
|
|
31
|
-
|
|
32
|
-
**Step 3 — Analyze layout shift sources (CLS)**
|
|
33
|
-
Use Grep to find common CLS culprits:
|
|
34
|
-
- `<img>` and `<video>` without explicit `width` and `height` attributes — causes layout shift when media loads
|
|
35
|
-
- Dynamic content injection above the fold (`insertBefore`, `prepend`, or React `useState` toggling visibility)
|
|
36
|
-
- Web fonts without `font-display: swap` or `font-display: optional` — FOIT causes text layout shift
|
|
37
|
-
- Ads or embeds without reserved space (`aspect-ratio` or `min-height` on container)
|
|
38
|
-
- CSS animations that trigger layout (`top`, `left`, `width`, `height`) instead of composited properties (`transform`, `opacity`)
|
|
39
|
-
|
|
40
|
-
#### CLS Fix Patterns
|
|
41
|
-
|
|
42
|
-
```html
|
|
43
|
-
<!-- BEFORE: no dimensions → layout shift when image loads -->
|
|
44
|
-
<img src="/hero.jpg" alt="Hero" />
|
|
45
|
-
|
|
46
|
-
<!-- AFTER: explicit dimensions prevent CLS -->
|
|
47
|
-
<img src="/hero.jpg" alt="Hero" width="1200" height="630"
|
|
48
|
-
class="w-full h-auto" loading="lazy" decoding="async" />
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
```css
|
|
52
|
-
/* Font display — prevent FOIT layout shift */
|
|
53
|
-
@font-face {
|
|
54
|
-
font-family: 'Space Grotesk';
|
|
55
|
-
src: url('/fonts/space-grotesk.woff2') format('woff2');
|
|
56
|
-
font-display: swap; /* show fallback immediately, swap when loaded */
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/* Reserve space for dynamic content */
|
|
60
|
-
.ad-container {
|
|
61
|
-
min-height: 250px; /* match ad unit height */
|
|
62
|
-
contain: layout; /* prevent layout influence on siblings */
|
|
63
|
-
}
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
**Step 4 — Network dependency chain analysis**
|
|
67
|
-
Identify critical rendering path bottlenecks:
|
|
68
|
-
- **Waterfall chains**: Resource A loads → discovers Resource B → discovers Resource C. Each link adds latency. Fix with `<link rel="preload">` for critical assets.
|
|
69
|
-
- **Missing preconnects**: Third-party origins (fonts.googleapis.com, CDN, analytics) without `<link rel="preconnect">`. But verify the origin is actually used — unused preconnects waste connection resources.
|
|
70
|
-
- **Large payloads without compression**: JS/CSS bundles >100KB served without gzip/brotli. Check server response headers for `Content-Encoding`.
|
|
71
|
-
- **Duplicate requests**: Same resource fetched multiple times (common with CSS @import or uncoordinated dynamic imports).
|
|
72
|
-
|
|
73
|
-
```html
|
|
74
|
-
<!-- Preload critical resources discovered late in the waterfall -->
|
|
75
|
-
<link rel="preload" href="/fonts/inter-var.woff2" as="font"
|
|
76
|
-
type="font/woff2" crossorigin />
|
|
77
|
-
<link rel="preload" href="/hero-image.webp" as="image"
|
|
78
|
-
fetchpriority="high" />
|
|
79
|
-
|
|
80
|
-
<!-- Preconnect to third-party origins ACTUALLY used -->
|
|
81
|
-
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
82
|
-
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
**Step 5 — Tree-shaking and code splitting audit**
|
|
86
|
-
Check bundler configuration and import patterns:
|
|
87
|
-
|
|
88
|
-
| Issue | Detection | Fix |
|
|
89
|
-
|---|---|---|
|
|
90
|
-
| Barrel file re-exports break tree-shaking | `index.ts` with `export * from` or `export { A, B, C, ... }` importing everything | Import directly from source: `import { Button } from './Button'` not `from '.'` |
|
|
91
|
-
| `sideEffects: false` missing in package.json | Check `package.json` `sideEffects` field | Add `"sideEffects": false` (or list files with side effects like CSS imports) |
|
|
92
|
-
| No code splitting at route level | Framework routes without `React.lazy()` or `dynamic()` | Next.js does this automatically; Vite needs manual `React.lazy()` |
|
|
93
|
-
| Vendor chunk too large (>250KB) | Check build output for single large chunk | Configure `splitChunks` (Webpack) or `manualChunks` (Vite/Rollup) |
|
|
94
|
-
| CSS not purged | Tailwind without `content` config, or unused CSS classes shipping | Verify `tailwind.config.js` `content` paths cover all template files |
|
|
95
|
-
|
|
96
|
-
**Step 6 — Image optimization audit**
|
|
97
|
-
Scan for image-related performance issues:
|
|
98
|
-
- Serving JPEG/PNG when WebP/AVIF would save 30-60% bandwidth — check `<img>` `src` extensions
|
|
99
|
-
- Missing `loading="lazy"` on below-the-fold images
|
|
100
|
-
- Missing `fetchpriority="high"` on LCP image (hero image, above-the-fold banner)
|
|
101
|
-
- Images served at full resolution without responsive `srcset` — wastes bandwidth on mobile
|
|
102
|
-
- No `<picture>` element for art direction (different crops for mobile/desktop)
|
|
103
|
-
|
|
104
|
-
```html
|
|
105
|
-
<!-- Optimized responsive image with modern formats -->
|
|
106
|
-
<picture>
|
|
107
|
-
<source srcset="/hero.avif" type="image/avif" />
|
|
108
|
-
<source srcset="/hero.webp" type="image/webp" />
|
|
109
|
-
<img
|
|
110
|
-
src="/hero.jpg"
|
|
111
|
-
alt="Product dashboard showing real-time analytics"
|
|
112
|
-
width="1200" height="630"
|
|
113
|
-
class="w-full h-auto"
|
|
114
|
-
fetchpriority="high"
|
|
115
|
-
decoding="async"
|
|
116
|
-
/>
|
|
117
|
-
</picture>
|
|
118
|
-
|
|
119
|
-
<!-- Below-the-fold: lazy load -->
|
|
120
|
-
<img src="/feature.webp" alt="..." loading="lazy" decoding="async"
|
|
121
|
-
width="600" height="400" class="w-full h-auto" />
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
**Step 7 — Generate performance report**
|
|
125
|
-
Produce a structured report with Core Web Vitals thresholds:
|
|
126
|
-
|
|
127
|
-
```
|
|
128
|
-
Web Vitals Audit — [Project Name]
|
|
129
|
-
═══════════════════════════════════════
|
|
130
|
-
Thresholds (Good / Needs Improvement / Poor):
|
|
131
|
-
LCP: < 2.5s / < 4.0s / > 4.0s
|
|
132
|
-
FCP: < 1.8s / < 3.0s / > 3.0s
|
|
133
|
-
CLS: < 0.1 / < 0.25 / > 0.25
|
|
134
|
-
INP: < 200ms / < 500ms / > 500ms
|
|
135
|
-
TBT: < 200ms / < 600ms / > 600ms
|
|
136
|
-
TTFB: < 800ms / < 1.8s / > 1.8s
|
|
137
|
-
|
|
138
|
-
Top Issues (by estimated impact):
|
|
139
|
-
1. [HIGH] Hero image served as 2.4MB PNG — convert to WebP, save ~1.5MB
|
|
140
|
-
2. [HIGH] 3 render-blocking stylesheets in <head> — defer non-critical CSS
|
|
141
|
-
3. [MEDIUM] 4 images missing width/height — causes CLS on load
|
|
142
|
-
4. [MEDIUM] lodash imported wholesale — tree-shake or replace with lodash-es
|
|
143
|
-
5. [LOW] Font preconnect to unused origin — remove to free connection slot
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
#### Sharp Edges
|
|
147
|
-
|
|
148
|
-
| Failure Mode | Mitigation |
|
|
149
|
-
|---|---|
|
|
150
|
-
| Recommending image lazy-load on LCP element | Never lazy-load the LCP image — it must load eagerly with `fetchpriority="high"` |
|
|
151
|
-
| Flagging render-blocking CSS that's actually critical | Distinguish critical (above-fold) CSS from non-critical before recommending defer |
|
|
152
|
-
| Tree-shaking audit false positives on CSS-in-JS | CSS `import './styles.css'` is a side effect — don't flag as unused |
|
|
153
|
-
| Preconnect removal breaks actual resource loading | Always verify zero requests went to the origin before recommending removal |
|
|
1
|
+
---
|
|
2
|
+
name: "web-vitals"
|
|
3
|
+
pack: "@rune/ui"
|
|
4
|
+
description: "Core Web Vitals performance audit — measures LCP, CLS, FCP, TBT, INP, and Speed Index against Google thresholds. Identifies render-blocking resources, network dependency chains, layout shift culprits, missing preloads, caching gaps, and tree-shaking opportunities."
|
|
5
|
+
model: sonnet
|
|
6
|
+
tools: [Read, Edit, Write, Grep, Glob, Bash]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# web-vitals
|
|
10
|
+
|
|
11
|
+
Core Web Vitals performance audit — measures LCP, CLS, FCP, TBT, INP, and Speed Index against Google thresholds. Identifies render-blocking resources, network dependency chains, layout shift culprits, missing preloads, caching gaps, and tree-shaking opportunities. Framework-aware analysis for Next.js, Vite, SvelteKit, and Astro.
|
|
12
|
+
|
|
13
|
+
#### Workflow
|
|
14
|
+
|
|
15
|
+
**Step 1 — Detect build tooling and framework**
|
|
16
|
+
Read `package.json`, config files (`next.config.*`, `vite.config.*`, `svelte.config.*`, `astro.config.*`), and build scripts. Identify:
|
|
17
|
+
- Bundler: Webpack, Vite, Rollup, esbuild, Turbopack
|
|
18
|
+
- Framework: Next.js (App Router vs Pages), SvelteKit, Astro, Remix
|
|
19
|
+
- CSS strategy: Tailwind (content config), CSS Modules, global CSS
|
|
20
|
+
- Compression: gzip/brotli configuration
|
|
21
|
+
- Source maps: enabled in production? (should be external or disabled)
|
|
22
|
+
|
|
23
|
+
**Step 2 — Audit render-blocking resources**
|
|
24
|
+
Use Grep to scan HTML entry points and framework layouts for:
|
|
25
|
+
- `<link rel="stylesheet">` in `<head>` without `media` attribute — blocks first paint
|
|
26
|
+
- `<script>` tags without `async` or `defer` — blocks HTML parsing
|
|
27
|
+
- CSS `@import` chains — each import is a sequential network request
|
|
28
|
+
- Large inline `<style>` blocks (>50KB) — delays first paint
|
|
29
|
+
|
|
30
|
+
For each blocking resource, estimate impact: 0ms impact = note but don't prioritize. Focus on resources that delay FCP by >100ms.
|
|
31
|
+
|
|
32
|
+
**Step 3 — Analyze layout shift sources (CLS)**
|
|
33
|
+
Use Grep to find common CLS culprits:
|
|
34
|
+
- `<img>` and `<video>` without explicit `width` and `height` attributes — causes layout shift when media loads
|
|
35
|
+
- Dynamic content injection above the fold (`insertBefore`, `prepend`, or React `useState` toggling visibility)
|
|
36
|
+
- Web fonts without `font-display: swap` or `font-display: optional` — FOIT causes text layout shift
|
|
37
|
+
- Ads or embeds without reserved space (`aspect-ratio` or `min-height` on container)
|
|
38
|
+
- CSS animations that trigger layout (`top`, `left`, `width`, `height`) instead of composited properties (`transform`, `opacity`)
|
|
39
|
+
|
|
40
|
+
#### CLS Fix Patterns
|
|
41
|
+
|
|
42
|
+
```html
|
|
43
|
+
<!-- BEFORE: no dimensions → layout shift when image loads -->
|
|
44
|
+
<img src="/hero.jpg" alt="Hero" />
|
|
45
|
+
|
|
46
|
+
<!-- AFTER: explicit dimensions prevent CLS -->
|
|
47
|
+
<img src="/hero.jpg" alt="Hero" width="1200" height="630"
|
|
48
|
+
class="w-full h-auto" loading="lazy" decoding="async" />
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
```css
|
|
52
|
+
/* Font display — prevent FOIT layout shift */
|
|
53
|
+
@font-face {
|
|
54
|
+
font-family: 'Space Grotesk';
|
|
55
|
+
src: url('/fonts/space-grotesk.woff2') format('woff2');
|
|
56
|
+
font-display: swap; /* show fallback immediately, swap when loaded */
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/* Reserve space for dynamic content */
|
|
60
|
+
.ad-container {
|
|
61
|
+
min-height: 250px; /* match ad unit height */
|
|
62
|
+
contain: layout; /* prevent layout influence on siblings */
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
**Step 4 — Network dependency chain analysis**
|
|
67
|
+
Identify critical rendering path bottlenecks:
|
|
68
|
+
- **Waterfall chains**: Resource A loads → discovers Resource B → discovers Resource C. Each link adds latency. Fix with `<link rel="preload">` for critical assets.
|
|
69
|
+
- **Missing preconnects**: Third-party origins (fonts.googleapis.com, CDN, analytics) without `<link rel="preconnect">`. But verify the origin is actually used — unused preconnects waste connection resources.
|
|
70
|
+
- **Large payloads without compression**: JS/CSS bundles >100KB served without gzip/brotli. Check server response headers for `Content-Encoding`.
|
|
71
|
+
- **Duplicate requests**: Same resource fetched multiple times (common with CSS @import or uncoordinated dynamic imports).
|
|
72
|
+
|
|
73
|
+
```html
|
|
74
|
+
<!-- Preload critical resources discovered late in the waterfall -->
|
|
75
|
+
<link rel="preload" href="/fonts/inter-var.woff2" as="font"
|
|
76
|
+
type="font/woff2" crossorigin />
|
|
77
|
+
<link rel="preload" href="/hero-image.webp" as="image"
|
|
78
|
+
fetchpriority="high" />
|
|
79
|
+
|
|
80
|
+
<!-- Preconnect to third-party origins ACTUALLY used -->
|
|
81
|
+
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
82
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
**Step 5 — Tree-shaking and code splitting audit**
|
|
86
|
+
Check bundler configuration and import patterns:
|
|
87
|
+
|
|
88
|
+
| Issue | Detection | Fix |
|
|
89
|
+
|---|---|---|
|
|
90
|
+
| Barrel file re-exports break tree-shaking | `index.ts` with `export * from` or `export { A, B, C, ... }` importing everything | Import directly from source: `import { Button } from './Button'` not `from '.'` |
|
|
91
|
+
| `sideEffects: false` missing in package.json | Check `package.json` `sideEffects` field | Add `"sideEffects": false` (or list files with side effects like CSS imports) |
|
|
92
|
+
| No code splitting at route level | Framework routes without `React.lazy()` or `dynamic()` | Next.js does this automatically; Vite needs manual `React.lazy()` |
|
|
93
|
+
| Vendor chunk too large (>250KB) | Check build output for single large chunk | Configure `splitChunks` (Webpack) or `manualChunks` (Vite/Rollup) |
|
|
94
|
+
| CSS not purged | Tailwind without `content` config, or unused CSS classes shipping | Verify `tailwind.config.js` `content` paths cover all template files |
|
|
95
|
+
|
|
96
|
+
**Step 6 — Image optimization audit**
|
|
97
|
+
Scan for image-related performance issues:
|
|
98
|
+
- Serving JPEG/PNG when WebP/AVIF would save 30-60% bandwidth — check `<img>` `src` extensions
|
|
99
|
+
- Missing `loading="lazy"` on below-the-fold images
|
|
100
|
+
- Missing `fetchpriority="high"` on LCP image (hero image, above-the-fold banner)
|
|
101
|
+
- Images served at full resolution without responsive `srcset` — wastes bandwidth on mobile
|
|
102
|
+
- No `<picture>` element for art direction (different crops for mobile/desktop)
|
|
103
|
+
|
|
104
|
+
```html
|
|
105
|
+
<!-- Optimized responsive image with modern formats -->
|
|
106
|
+
<picture>
|
|
107
|
+
<source srcset="/hero.avif" type="image/avif" />
|
|
108
|
+
<source srcset="/hero.webp" type="image/webp" />
|
|
109
|
+
<img
|
|
110
|
+
src="/hero.jpg"
|
|
111
|
+
alt="Product dashboard showing real-time analytics"
|
|
112
|
+
width="1200" height="630"
|
|
113
|
+
class="w-full h-auto"
|
|
114
|
+
fetchpriority="high"
|
|
115
|
+
decoding="async"
|
|
116
|
+
/>
|
|
117
|
+
</picture>
|
|
118
|
+
|
|
119
|
+
<!-- Below-the-fold: lazy load -->
|
|
120
|
+
<img src="/feature.webp" alt="..." loading="lazy" decoding="async"
|
|
121
|
+
width="600" height="400" class="w-full h-auto" />
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
**Step 7 — Generate performance report**
|
|
125
|
+
Produce a structured report with Core Web Vitals thresholds:
|
|
126
|
+
|
|
127
|
+
```
|
|
128
|
+
Web Vitals Audit — [Project Name]
|
|
129
|
+
═══════════════════════════════════════
|
|
130
|
+
Thresholds (Good / Needs Improvement / Poor):
|
|
131
|
+
LCP: < 2.5s / < 4.0s / > 4.0s
|
|
132
|
+
FCP: < 1.8s / < 3.0s / > 3.0s
|
|
133
|
+
CLS: < 0.1 / < 0.25 / > 0.25
|
|
134
|
+
INP: < 200ms / < 500ms / > 500ms
|
|
135
|
+
TBT: < 200ms / < 600ms / > 600ms
|
|
136
|
+
TTFB: < 800ms / < 1.8s / > 1.8s
|
|
137
|
+
|
|
138
|
+
Top Issues (by estimated impact):
|
|
139
|
+
1. [HIGH] Hero image served as 2.4MB PNG — convert to WebP, save ~1.5MB
|
|
140
|
+
2. [HIGH] 3 render-blocking stylesheets in <head> — defer non-critical CSS
|
|
141
|
+
3. [MEDIUM] 4 images missing width/height — causes CLS on load
|
|
142
|
+
4. [MEDIUM] lodash imported wholesale — tree-shake or replace with lodash-es
|
|
143
|
+
5. [LOW] Font preconnect to unused origin — remove to free connection slot
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
#### Sharp Edges
|
|
147
|
+
|
|
148
|
+
| Failure Mode | Mitigation |
|
|
149
|
+
|---|---|
|
|
150
|
+
| Recommending image lazy-load on LCP element | Never lazy-load the LCP image — it must load eagerly with `fetchpriority="high"` |
|
|
151
|
+
| Flagging render-blocking CSS that's actually critical | Distinguish critical (above-fold) CSS from non-critical before recommending defer |
|
|
152
|
+
| Tree-shaking audit false positives on CSS-in-JS | CSS `import './styles.css'` is a side effect — don't flag as unused |
|
|
153
|
+
| Preconnect removal breaks actual resource loading | Always verify zero requests went to the origin before recommending removal |
|