diff --git a/STATUS.md b/STATUS.md index 4d94192f..89008a82 100644 --- a/STATUS.md +++ b/STATUS.md @@ -1,6 +1,6 @@ # ScriptHammer Status -**Snapshot**: 2026-05-13 · **Version**: v0.0.1 · **Stability**: Beta — Phase 0 (template hygiene) closed; E2E flake round 10 closed via concurrency mutex (#89); GrimGlow ThreeJS fork (Phase 0.5) green-lit; Family B (payment routes) is the next-leverage front +**Snapshot**: 2026-05-17 · **Version**: v0.0.1 · **Stability**: Beta — Phase 0 (template hygiene) closed; E2E flake round 10 closed via concurrency mutex (#89); **Phase 0.5 (#48 Three.js Game) shipping in PR #95** (feature 047 at `/game/3d` — full SpecKit cascade complete, 21/21 E2E shards green); Family B (payment routes) is the next-leverage front This is the single screen-scan view of "what's planned, what's shipped, what's broken." For the deeper per-feature audit see [`docs/prp-docs/PRP-STATUS.md`](docs/prp-docs/PRP-STATUS.md). diff --git a/config/pa11yci.json b/config/pa11yci.json index 89cf8755..52dd8d80 100644 --- a/config/pa11yci.json +++ b/config/pa11yci.json @@ -3,6 +3,7 @@ "// Note2": "Next.js 15 streams metadata via JavaScript. The title element appears after hydration, not in initial HTML.", "// Note3": "color-contrast (and color-contrast-enhanced for AAA) is ignored here because Pa11y's axe runner hardcodes violations.concat(incomplete) — it treats 'needs review' as failure. DaisyUI .btn gradients prevent axe from resolving a flat bg color, so every button lands in incomplete (14–61 false positives per page, ratio=0). The real contrast gate is tests/e2e/color-contrast.spec.ts, which runs the same axe rule on the same pages but asserts violations only, covering both scripthammer-light and scripthammer-dark (headless Chromium's prefers-color-scheme defaults to light, so this config never tested dark).", "// Note4": "Standard bumped to WCAG2AAA per #21 (Phase 0 closure). Contrast checks remain delegated to the E2E spec; pa11y here covers the non-contrast AAA criteria (focus visibility, link purpose, etc.).", + "// Note5 (#48 — feature 047 Three.js Game)": "/game/3d is DELIBERATELY OMITTED from the urls allowlist below. Pa11y / axe-core cannot audit content (no DOM tree inside WebGL surfaces), so scanning the route would either produce false positives or simply fail to detect anything useful. The existing /game (dice game) IS auditable but is also not in the current allowlist — feature 037-game-a11y-tests covers its automated coverage via E2E tests in tests/e2e/. The fallback panel rendered when WebGL is unavailable IS pa11y-auditable via the same DOM rules; manual review covers it (see features/enhancements/047-threejs-game/tasks.md T027 + T049 for the canvas-not-auditable a11y review template).", "defaults": { "standard": "WCAG2AAA", "timeout": 30000, diff --git a/docs/prp-docs/PRP-STATUS.md b/docs/prp-docs/PRP-STATUS.md index c5082870..080b4cf1 100644 --- a/docs/prp-docs/PRP-STATUS.md +++ b/docs/prp-docs/PRP-STATUS.md @@ -1,7 +1,7 @@ # PRP Implementation Status Dashboard -**Last Updated**: 2026-05-14 (v0.4.x stabilization milestones) -**Previous Update**: 2026-04-25 (full 47-feature audit) +**Last Updated**: 2026-05-17 (Phase 0.5 / #48 Three.js Game shipped — PR #95 047) +**Previous Update**: 2026-05-14 (v0.4.x stabilization milestones) **Total PRPs**: 16 (legacy) + 49 (SpecKit features — 000-brand-identity and 000-landing-page split out from 000-rls) **Completed**: 15 legacy PRPs (v0.3.0) + 18 SpecKit features Shipped + 5 Mostly Shipped (019 GA moved Shipped → 23 total) **In Progress (Partial)**: 19 features (most of payments tier, blog/sidebar polish, OAuth UX fixes) diff --git a/features/IMPLEMENTATION_ORDER.md b/features/IMPLEMENTATION_ORDER.md index 151ebdd6..2b05f59f 100644 --- a/features/IMPLEMENTATION_ORDER.md +++ b/features/IMPLEMENTATION_ORDER.md @@ -92,15 +92,15 @@ Blog features in dependency order. PWA and accessibility enhancements. -| Order | Feature | Name | Depends On | -| ----- | ------- | -------------------- | ---------- | -| 30 | **017** | Colorblind Mode | 001 | -| 31 | **018** | Font Switcher | 001 | -| 32 | **020** | PWA Background Sync | - | -| 33 | **021** | Geolocation Map | - | -| 34 | **028** | Enhanced Geolocation | 021 | -| 35 | **030** | Calendar Integration | 003 | -| 36 | **047** | Three.js Game | 001, 006 | +| Order | Feature | Name | Depends On | +| ----- | ---------- | ---------------------------------- | ---------- | +| 30 | **017** | Colorblind Mode | 001 | +| 31 | **018** | Font Switcher | 001 | +| 32 | **020** | PWA Background Sync | - | +| 33 | **021** | Geolocation Map | - | +| 34 | **028** | Enhanced Geolocation | 021 | +| 35 | **030** | Calendar Integration | 003 | +| 36 | **047** ✅ | Three.js Game (`/game/3d`, PR #95) | 001, 006 | ### Tier 7: Polish diff --git a/features/enhancements/047-threejs-game/build-report.txt b/features/enhancements/047-threejs-game/build-report.txt new file mode 100644 index 00000000..fdde9855 --- /dev/null +++ b/features/enhancements/047-threejs-game/build-report.txt @@ -0,0 +1,58 @@ +├ ○ /_not-found 121 B 640 kB +├ ○ /accessibility 4.58 kB 644 kB +├ ○ /account 8.24 kB 648 kB +├ ○ /admin 4.25 kB 644 kB +├ ○ /admin/audit 3.26 kB 643 kB +├ ○ /admin/messaging 3.98 kB 643 kB +├ ○ /admin/payments 3.42 kB 643 kB +├ ○ /admin/users 2.56 kB 642 kB +├ ○ /api/blog/tags 121 B 640 kB 1d 1y +├ ○ /auth/callback 2.02 kB 641 kB +├ ○ /blog 121 B 640 kB +├ ● /blog/[slug] 10.9 kB 650 kB +├ ├ /blog/message-encryption-security-explained +├ ├ /blog/offline-payment-system-stripe-paypal +├ ├ /blog/authentication-supabase-oauth +├ └ [+4 more paths] +├ ○ /blog/seo 162 B 640 kB +├ ○ /blog/tags 165 B 640 kB +├ ● /blog/tags/[tag] 120 B 640 kB +├ ├ /blog/tags/security +├ ├ /blog/tags/encryption +├ ├ /blog/tags/privacy +├ └ [+30 more paths] +├ ○ /comment-policy 121 B 640 kB +├ ○ /contact 6 kB 645 kB +├ ○ /conversations 121 B 640 kB +├ ○ /cookies 469 B 640 kB +├ ○ /docs 121 B 640 kB +├ ○ /forgot-password 1.07 kB 641 kB +├ ○ /game 1 kB 640 kB +├ ○ /game/3d 744 B 640 kB +├ ○ /map 3.79 kB 643 kB +├ ○ /messages 23.9 kB 663 kB +├ ○ /messages/new-group 6.94 kB 646 kB +├ ○ /messages/setup 2.29 kB 642 kB +├ ○ /payment-demo 4.43 kB 644 kB +├ ○ /payment-result 2.67 kB 642 kB +├ ○ /privacy 452 B 640 kB +├ ○ /privacy-controls 3.33 kB 643 kB +├ ○ /profile 632 B 640 kB +├ ○ /reset-password 948 B 640 kB +├ ○ /schedule 1.48 kB 641 kB +├ ○ /sign-in 2.31 kB 642 kB +├ ○ /sign-up 2.57 kB 642 kB +├ ○ /status 3.18 kB 643 kB +├ ○ /themes 2.06 kB 642 kB +├ ○ /verify-email 176 B 640 kB +└ ○ /wireframes 573 B 640 kB ++ First Load JS shared by all 644 kB +--- +Generated: 2026-05-18T02:36:06Z +Commit: 8c872f01f0b39976e9c3e99ff8aa04734c0999ba + +NFR-001 verification: /game/3d First Load JS = 640 kB +Same baseline as /blog (640 kB), /themes (642 kB), /map (643 kB). +Per-route weight (744 B) is the page entry only; Three.js (~600 kB +R3F + drei + three) loads dynamically only on visit to /game/3d. +Route-split working correctly per research.md Decision 5. diff --git a/features/enhancements/047-threejs-game/checklists/manual-a11y-review.md b/features/enhancements/047-threejs-game/checklists/manual-a11y-review.md new file mode 100644 index 00000000..8c60fa3f --- /dev/null +++ b/features/enhancements/047-threejs-game/checklists/manual-a11y-review.md @@ -0,0 +1,67 @@ +# Manual A11y Review Checklist: `/game/3d` + +**Feature**: 047 — Three.js Game +**Created**: 2026-05-16 (T027) +**Reviewer**: _fill in name + date when running this review_ +**Last review pass**: _none yet — runs in T049 of tasks.md_ + +## Why this exists + +Pa11y / axe-core cannot audit `` content because the WebGL surface has no DOM tree inside it. The route `/game/3d` is therefore deliberately omitted from the Pa11y allowlist in `config/pa11yci.json` (see "Note5" in that file). + +The DOM chrome surrounding the canvas — page heading, breadcrumb, fallback panel, Retry button, status indicators — IS auditable and remains in scope. This manual review covers the canvas surface itself: keyboard interaction, screen-reader behavior, color contrast where applicable, and motion preferences. + +## Review checklist + +Run all four sections in the local browser before merging the implementation PR. + +### 1. Keyboard focus path + +- [ ] Tab into the page. Focus visits, in order: any header nav items, the breadcrumb link, then either the canvas (if WebGL is available) OR the Retry button (if the fallback panel is visible). +- [ ] When the fallback panel is visible: Enter on the focused Retry button triggers re-mount. +- [ ] Shift+Tab traverses the order in reverse without skipping the canvas / Retry button. +- [ ] No focus traps — Escape or repeated Tab eventually returns focus to the surrounding chrome. + +### 2. Screen reader behavior + +- [ ] The `` element has `aria-label="3D scene preview"` (or equivalent meaningful label). +- [ ] When the fallback panel is visible, a screen reader reads: heading "3D Content Unavailable" → body paragraph naming WebGL → button "Retry rendering 3D scene". +- [ ] The page `

` reads as "3D Game (Three.js)". +- [ ] The breadcrumb is announced as a navigation landmark. + +### 3. Color contrast (DOM chrome only — canvas content is exempt) + +- [ ] All DOM text on the page meets WCAG AAA contrast (7:1 normal, 4.5:1 large) against its background. The existing E2E spec at `tests/e2e/color-contrast.spec.ts` covers this if the route is added to its URL list — otherwise verify manually with a contrast tool (Chrome DevTools → Lighthouse, or axe DevTools). +- [ ] The Retry button (DaisyUI `.btn btn-primary`) meets contrast in both light and dark themes. +- [ ] Status indicators (e.g., "WebGL: unavailable" text in the fallback panel) meet contrast. + +### 4. Motion preferences + +- [ ] With `prefers-reduced-motion: reduce` set (OS preference or Chrome DevTools rendering emulation), the scene shows zero autonomous animation. The orbit camera does NOT rotate automatically. +- [ ] User-initiated camera motion (drag, scroll, touch) STILL works under reduced motion. +- [ ] Toggling the preference off at runtime resumes auto-orbit within 3 seconds of the toggle (no page reload needed). + +## Automated proxies (run as part of T049) + +Several items on this checklist have automated coverage that gives us high confidence without a human keystroke pass: + +| Section | Item | Automated coverage | Status | +| ----------------- | ------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------- | +| 1. Keyboard | Tab order includes Retry button when fallback active | `tests/e2e/game-3d.spec.ts` FR-008 scenario: `retry.focus(); await expect(retry).toBeFocused()` | PASS in CI | +| 2. Screen reader | `` | `src/components/game/Scene/Scene.tsx:184` — attribute literal, type-checked | PASS | +| 2. Screen reader | Heading "3D Content Unavailable" announces in fallback | FR-008 scenario asserts `getByRole('heading', { name: /3d content unavailable/i })` | PASS in CI | +| 2. Screen reader | Retry button accessible name | FR-008 scenario asserts `getByRole('button', { name: /retry rendering 3d scene/i })` | PASS in CI | +| 3. Color contrast | DOM chrome contrast across themes | `tests/e2e/color-contrast.spec.ts` runs axe color-contrast on the audited routes (does not currently include /game/3d; tracked in Pa11y Note5 follow-up if needed) | INHERITED from sibling routes | +| 4. Motion | `prefers-reduced-motion: reduce` disables auto-orbit | `tests/e2e/game-3d.spec.ts` US-3 scenario asserts `data-autorotate-active === 'false'` when reduce is set | PASS in CI | +| 4. Motion | Reduced-motion off allows auto-orbit | Same spec, second test, asserts `'true'` | PASS in CI | + +The remaining items (manual focus indicator visibility, screen-reader spoken text in a live screen reader, motion preference toggle without reload, etc.) require an actual human-eyes pass. They should be performed once before the next release the feature is included in. + +## Sign-off + +| Reviewer | Date | Pass/Fail | Notes | +| ----------------------------------- | ------------ | ---------------------------------------- | ------------------------------------------------------------------------------------------------------- | +| Automated proxies (Claude Opus 4.7) | 2026-05-17 | PASS for items listed in the table above | Manual focus/screen-reader passes still owed before release; tracked as open item in feature 047 status | +| _human reviewer_ | _yyyy-mm-dd_ | _PASS / FAIL_ | _any caveats_ | + +Once a human has run the manual passes: append name + date, mark T049 as `[X]` in `tasks.md`, and commit. The automated-proxy row records what CI verifies on every run. diff --git a/features/enhancements/047-threejs-game/checklists/requirements.md b/features/enhancements/047-threejs-game/checklists/requirements.md new file mode 100644 index 00000000..8198b9cb --- /dev/null +++ b/features/enhancements/047-threejs-game/checklists/requirements.md @@ -0,0 +1,39 @@ +# Specification Quality Checklist: Three.js Game + +**Purpose**: Validate specification completeness and quality before proceeding to planning +**Created**: 2026-05-14 +**Feature**: [spec.md](../spec.md) + +## Content Quality + +- [x] No implementation details (languages, frameworks, APIs) + - Note: Spec references Three.js, R3F, drei, and DaisyUI by name. This is unavoidable because the feature is _defined by_ the choice of WebGL via R3F — there is no technology-neutral way to specify "render a 3D scene that integrates with the existing 32-theme system." The PRP at `047_threejs-game_feature.md` made the same choice. Acceptable trade-off. +- [x] Focused on user value and business needs +- [x] Written for non-technical stakeholders (modulo the unavoidable WebGL/Three.js terms above) +- [x] All mandatory sections completed + +## Requirement Completeness + +- [x] No [NEEDS CLARIFICATION] markers remain +- [x] Requirements are testable and unambiguous +- [x] Success criteria are measurable (every SC-\* has a quantitative or observable target) +- [x] Success criteria are technology-agnostic (SC items describe outcomes — render time, theme update, animation absence, build success, bundle size — not implementations) +- [x] All acceptance scenarios are defined (US-1 through US-5 each have Given/When/Then scenarios) +- [x] Edge cases are identified (WebGL unavailable, GPU context loss, runtime preference toggles, theme switch during animation, Pa11y exclusion regression, dice game regression, static export at build) +- [x] Scope is clearly bounded (Out of Scope section enumerates 8 explicit exclusions) +- [x] Dependencies and assumptions identified (Assumptions section + Dependencies section both present) + +## Feature Readiness + +- [x] All functional requirements have clear acceptance criteria (FR-_ map cleanly to US-_ acceptance scenarios) +- [x] User scenarios cover primary flows (P1 = visit + theme; P2 = reduced motion + Pa11y; P3 = mobile) +- [x] Feature meets measurable outcomes defined in Success Criteria (each SC-\* is independently verifiable) +- [x] No implementation details leak into specification beyond the unavoidable WebGL/R3F naming + +## Notes + +- Items marked incomplete require spec updates before `/speckit.clarify` or `/speckit.plan`. +- All items pass on first iteration; no rework required. +- `/speckit.clarify` completed 2026-05-15 — 4 questions resolved (v1 scene content, fallback UX, camera control bounds, analytics scope). All 11 taxonomy categories now Clear. Spec amended with FR-008 (fallback panel), NFR-006 (observability scope), expanded FR-005 (camera constraints + auto-orbit), and SC-009/SC-010 (fallback + auto-orbit success criteria). +- Wireframe gate per Constitution v1.0.2 Principle III completed 2026-05-15. Two wireframes generated and approved: `01-game-3d-main.svg` and `02-game-3d-fallback.svg`. Both PASS the v5.0 validator (zero errors). Twelve patch-classified issues resolved across the two SVGs (signature alignment, callout positioning to avoid button overlap, callout count parity with annotation groups, US-badge minimum, XML hygiene). Audit trails preserved at `wireframes/01-game-3d-main.issues.md` and `wireframes/02-game-3d-fallback.issues.md`. Spec.md `## UI Mockup` block records the sign-off. +- `/speckit.plan` is unblocked. diff --git a/features/enhancements/047-threejs-game/lighthouse-report.json b/features/enhancements/047-threejs-game/lighthouse-report.json new file mode 100644 index 00000000..3869d059 --- /dev/null +++ b/features/enhancements/047-threejs-game/lighthouse-report.json @@ -0,0 +1,7938 @@ +{ + "lighthouseVersion": "12.8.2", + "requestedUrl": "http://localhost:3000/ScriptHammer/game/3d/", + "mainDocumentUrl": "http://localhost:3000/ScriptHammer/game/3d/", + "finalDisplayedUrl": "http://localhost:3000/ScriptHammer/game/3d/", + "finalUrl": "http://localhost:3000/ScriptHammer/game/3d/", + "fetchTime": "2026-05-18T02:46:03.100Z", + "gatherMode": "navigation", + "runWarnings": [], + "userAgent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/148.0.0.0 Safari/537.36", + "environment": { + "networkUserAgent": "Mozilla/5.0 (Linux; Android 11; moto g power (2022)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Mobile Safari/537.36", + "hostUserAgent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/148.0.0.0 Safari/537.36", + "benchmarkIndex": 3694, + "credits": {} + }, + "audits": { + "viewport": { + "id": "viewport", + "title": "Has a `` tag with `width` or `initial-scale`", + "description": "A `` not only optimizes your app for mobile screen sizes, but also prevents [a 300 millisecond delay to user input](https://developer.chrome.com/blog/300ms-tap-delay-gone-away/). [Learn more about using the viewport meta tag](https://developer.chrome.com/docs/lighthouse/pwa/viewport/).", + "score": 1, + "scoreDisplayMode": "metricSavings", + "warnings": [], + "metricSavings": { + "INP": 0 + }, + "details": { + "type": "debugdata", + "viewportContent": "width=device-width, initial-scale=1, maximum-scale=5" + }, + "guidanceLevel": 3 + }, + "first-contentful-paint": { + "id": "first-contentful-paint", + "title": "First Contentful Paint", + "description": "First Contentful Paint marks the time at which the first text or image is painted. [Learn more about the First Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/first-contentful-paint/).", + "score": 1, + "scoreDisplayMode": "numeric", + "numericValue": 1063.8235, + "numericUnit": "millisecond", + "displayValue": "1.1 s", + "scoringOptions": { + "p10": 1800, + "median": 3000 + } + }, + "largest-contentful-paint": { + "id": "largest-contentful-paint", + "title": "Largest Contentful Paint", + "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)", + "score": 0, + "scoreDisplayMode": "numeric", + "numericValue": 31563.279375, + "numericUnit": "millisecond", + "displayValue": "31.6 s", + "scoringOptions": { + "p10": 2500, + "median": 4000 + } + }, + "first-meaningful-paint": { + "id": "first-meaningful-paint", + "title": "First Meaningful Paint", + "description": "First Meaningful Paint measures when the primary content of a page is visible. [Learn more about the First Meaningful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/first-meaningful-paint/).", + "score": null, + "scoreDisplayMode": "notApplicable" + }, + "speed-index": { + "id": "speed-index", + "title": "Speed Index", + "description": "Speed Index shows how quickly the contents of a page are visibly populated. [Learn more about the Speed Index metric](https://developer.chrome.com/docs/lighthouse/performance/speed-index/).", + "score": 1, + "scoreDisplayMode": "numeric", + "numericValue": 1479.5342394022318, + "numericUnit": "millisecond", + "displayValue": "1.5 s", + "scoringOptions": { + "p10": 3387, + "median": 5800 + } + }, + "screenshot-thumbnails": { + "id": "screenshot-thumbnails", + "title": "Screenshot Thumbnails", + "description": "This is what the load of your site looked like.", + "score": 1, + "scoreDisplayMode": "informative", + "details": { + "type": "filmstrip", + "scale": 3460, + "items": [ + { + "timing": 433, + "timestamp": 301926349146, + "data": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAD4AHwDASIAAhEBAxEB/8QAGwABAAMBAQEBAAAAAAAAAAAAAAEDBAIFBgj/xAA9EAABAwIDAwkGBAYCAwAAAAABAAIDBBEFEiETMVEUMkFicpGhsdEGIlJhceEjQ4GTBxVCc5LwY8EzU4L/xAAXAQEBAQEAAAAAAAAAAAAAAAAAAQID/8QAGREBAQEBAQEAAAAAAAAAAAAAABEBIRJB/9oADAMBAAIRAxEAPwD9MIiLk08vG8cpMIEYqS90snMijbmc76Bd4NjFLi0T3UxeHsNnxyNLXt+oK+Z9ucMq31ra+milnjMOyc2EXew5rhwHSu/YXD62Oqlq6uOWKPZCFglFnvsb5iOhO1fj7REREEREBERAUE62G9SqpHBkgLtGkWvwVEh7XEhr2ucN4BXYNxdeNhuERYbWzVYlB2gIt73Sb9LiPBevFfJcixOtkHaIigx7eb/j7j6pt5v+PuK4UhStOttN1O4+qnbTcWdx9V837R+0UmC4phlO6jbLTVshiMu0c0xusSLjLlsbAauBN9AbLD7Ne2oxWgq6iqoDTvgoIsRyQy7bNFI1zmi9hZ/uH3bcNSrNlS4+y2s3Fnd91O1m4s7j6r4KP+ItJBh0lXilO2ItZFLsaabavEb2F4cczWA2a03yF248FtP8QMKGJGjMFcLT7AzbNuzvtRFe+a9s7mjd/V9bXzpcfYbSbizu+6naTcWd33XylL7a0Nb7MYnjVHT1Rho4TMGzMybVuTM0tOose8dICx4t7Y4lhldiEE+D08jKJtM9zoqslzxNKY22aYxroTa/DVPOlx9vnm4s7j6qc83FncfVfHH+IWFinfMKXEC1kcb5LRt9xz5XRNYfe5xexw006b2WrDPbfC8QxSGhhirWSPjD3PlhytiJaXZXm+hsDru+eqedLj6jNLxZ3fdQTIdCWH/5+6+Xj9s6Z2Kfy98EolfVSUscoIEWZtrAucRqb7m3K9r2dxJuMYHQ4i2MxcphbIYyb5CRqL9Nj0qTcLjW2LI67WxA8Q37q0GXiz/H7qQLrpBx+L8TP8fup/F+Jn+P3XSIMilQpWWnl18eDjEY6ivgpDWxsOzlkiBe1uu51rjp7/mowoYLQ3pcKioqUPdrFTxNjDjbgALrZVUFLVOzVEDJCOl30sojw+jY9r2wtzNNwbnRaZ68k4b7MtAgOFYcGzuZIGckbZ5ddodbLv1Iv816wwnDs+fkFJmzZr7Ft75g6+7fmAd9QCrjT07nte6GIubYhxYLi27uV+YcUpGGPB8Nio6mkhoKWKmqQRNHHEGNkBFjcDforjhtE4HPSwvLmsa4vYHFwYbsuTqbHUX3HVaQ5vFTmHEJVYv5RhropYjh9JsphlkZsW2eAS6xFtRdzj9ST0rg4DhGZrv5XQ3bEYWnk7NIyCCzdzbEi27Ur0Q5vEIHN6SEpHk0ns3hFM4yMoYXTbV8wlkbmka9594tcdW/pay9KipYaOkhpaWNsVPCwRxsbua0CwCszt4jvXQc0f1BKjoaIoDgdxBUogiE2XKKzqUQ7lFVNdnc7gDZdKikN9r2z5BXqKIiICIiAiIgIiICvgkzs13g2VCigP8A5O2fNXE1rTRDooVFIR3NKlHblBjo903bPkFoWej/ADv7h8gtCgIiIoiIgIiICIiAuKD83tnzXa4w/fL2z5q4jYl0KiyDgI7mlSjuagxUn5vbPkFeqKT87+4fIK9QEREUREQEREBERAVdBvl7Z81YqqDnS9s+auI2pdQSoQSAj+aVKhw90oMNJ+d/cPkFeqKXfN2z5BXqAiKmrkkihzxRmR2ZoLRvsXAE/oLn9EFyLw34rihj/Dwd7ZLt50gI3m/gPl5Xz4m6oxbDqikrMNmYRGJAxk72h5vzC5ltD9fqLb7CvpAQRcG4KLxaWpq6SigijwsNYw7JkcZytjYGi2mug1bpw0GqsGI1+1YDhTxG52Uu2o90X32tw4fdIV6yKGOzX0ItxClQFVQ75e2fNWqmh50vbPmrg2KLooQWAI7mlSocNCgwUu+btnyCvVNNvm7Z8grlARERRERAREQEREBUUPOm7Z81eqKHnS9s+auI1pdCoQXBHbipRw91UefT75u2fIK5U0++btnyCuU0ERFFEREBERAREQFnoudN2z5rQs9Fzpu2fNVGtQiINICO3KVDtxVZefT86btnyCtVFO4bWdn9Qfe3yIV6mtCIiiiIiAiIgIiICzUXOm7Z81pWTD3h4ke03a55IPHVEbVF0KhFbEduWbaP4ptH8Vqsx5mK0cxl21LIYphucOn5EdK8t1TjbTYPpz8zEfVfSOLndPgqywk9HcpVj501WOfHTftH1Ucrxz46b9o+q+i2abJB87yzHPipv2j6qOWY78VN+0fVfRbJNl8kpHzvLMc+Km/aPqnLcd+Kl/aPqvotj8k2I4JSPnOXY78VL+0fVRy7Hfipf2j6r6TYjgo2I4BB4DDitZ7lXO1sR5zYmZb/AK7179HEIYQ0CwC7bEArBoEBERRRERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERARZOWdTxTlnU8UGtFk5Z1PFOWdTxQa0WTlnU8U5Z1PFBrRZOWdTxTlnU8UGtFk5Z1PFOWdTxQa0WTlnU8U5Z1PFBrRZOWdTxTlnU8UGtFk5Z1PFOWdTxQZERFFZMSxCnw6FstU5zWOdlBDSdbE/9KiHG8PmmjjinzuecrSGmxN7WvZeiQHDUA/VcNghaQWxRgjdZo0/26vEY4MXo5otpHI46NOXIcwzEAafMlcDG6Al4bM4ubKISAxxOc3sN3yK2Gnp/eaYorPFi0tHvAEnd+p71y6lpHi7oIHDiWA/7uCcOs7caw9wu2qYdL7ju09QrIsUops2yqGPyguOW50FvULuKio45HOZTwB7yXE5Rc33/APSnklJc2p4LuBHMGoKcOuI8So5J9gydpl+GxuFVTYzRVEBlZK4NADnZmEWvYcN9zZa46aCNxMcMTSTe4aAktNBLDJE+Jhjfo5tt/wBU4dZ48WoZJGxx1LHOde1vkCT5FUQ+0GGzPyR1Fz7t/dOlxcX0007lrNDRuOtLTk/OMfVW8nguTsYrnU+4NU4dZ/5nR7VkZnAkccoaQQb/AO+R4LaqWUtOy2SCJtiDowBXKAiIiiIiAiIgy1tBT1ro3VDC50d8hDi219+76Kg4LQFgYYDlBLrZ3akgA3113BESpHZwqjIaDDo0FoAcdx3qkYDhwzfgG7rgnO69id29EVukdHBMP/8ARb5h7vVdOwehc4OdACQAOcbaAAdPABES6TFbcBw9ob+E8kW1Mju/evURFKCIiKIiIP/Z" + }, + { + "timing": 865, + "timestamp": 301926781646, + "data": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAD4AHwDASIAAhEBAxEB/8QAGwABAAMBAQEBAAAAAAAAAAAAAAEDBAIFBgj/xAA9EAABAwIDAwkGBAYCAwAAAAABAAIDBBEFEiETMVEUMkFicpGhsdEGIlJhceEVI0OTB0JzgZLwY8EzU4L/xAAXAQEBAQEAAAAAAAAAAAAAAAAAAQID/8QAGBEBAQEBAQAAAAAAAAAAAAAAABEBIRL/2gAMAwEAAhEDEQA/AP0wiIuTTy8axykwgRipL3SSGzI425nO+gXeDYxS4tE99KXhzDZ8cjcrm/UL5n25wyrdWivp4pp4zDsnNhF3sIdcEDpVnsNh9bHVTVdUyaOPZCFgl0c+xvchO1X2aIiIIiICIiAoJ1sN6lVSODJAXaNItfgqJD2uJDXtc4bwCuwbi68bDcIiw2tmqxKDtARb3uk36XEeC9eK+S5FidbIO0RFBj283/H3H1Tbzf8AH3FcKQpWnW2m6ncfVTtpuLO4+q+b9o/aKTBcUwyndRtlpq2QxGXaOaY3WJFxly2NgNXAm+gNlh9mvbUYrQVdRVUBp3wUEWI5IZdtmika5zRews/3D7tuGpVmypcfZbWbizu+6nazcWdx9V8FH/EWkgw6SrxSnbEWsil2NNNtXiN7C8OOZrAbNab5C7ceC2n+IGFDEjRmCuFp9gZtm3Z32oivfNe2dzRu/m+tr50uPsNpNxZ3fdTtJuLO77r5Sl9taGt9mMTxqjp6ow0cJmDZmZNq3JmaWnUWPeOkBY8W9scSwyuxCCfB6eRlE2me50VWS54mlMbbNMY10JtfhqnnS4+3zzcWdx9VOebizuPqvjj/ABCwsU75hS4gWsjjfJaNvuOfK6JrD73OL2OGmnTey1YZ7b4XiGKQ0MMVayR8Ye58sOVsRLS7K830Ngdd3z1TzpcfUZpeLO77qCZDoSw//P3Xy8ftnTOxT8PfBKJX1UlLHKCBFmbawLnEam+5tyva9ncSbjGB0OItjMXKYWyGMm+Qkai/TY9Kk3C41tiyOu1sQPEN+6tBl4s/x+6kC66Qcfm/Ez/H7qfzfiZ/j910iDIpUKVlp5dfHg4xGOor4KQ1sbDs5ZIgXtbruda46e/5qMKGC0N6XCoqKlD3axU8TYw424AC62VVBS1Ts1RAyQjpd9LKI8Po2Pa9sLczTcG50WmevJOG+zLQIDhWHBs7mSBnJG2eXXaHWy79SL/NesMJw7Pn5BSZs2a+xbe+YOvu35gHfUAq409O57XuhiLm2IcWC4tu7lfmHFKRhjwfDYqOppIaClipqkETRxxBjZARY3A36K44bROBz0sLy5rGuL2BxcGG7Lk6mx1F9x1WkObxU5hxCVWL8Iw10UsRw+k2UwyyM2LbPAJdYi2ou5x+pJ6VwcBwjM134XQ3bEYWnk7NIyCCzdzbEi27Ur0Q5vEIHN6SEpHk0ns3hFM4yMoYXTbV8wlkbmka9594tcdW/wBrWXpUVLDR0kNLSxtip4WCONjdzWgWAVmdvEd66Dmj+YJUdDRFAcDuIKlEEQmy5RWdSiHcoqprs7ncAbLpUUhvte2fIK9RRERAREQEREBERAV8Emdmu8GyoUUB/wDJ2z5q4mtaaIdFCopCO5pUo7coMdHum7Z8gtCz0f639Q+QWhQEREUREQEREBERAXFB+r2z5rtcYfvl7Z81cRsS6FRZBwEdzSpR3NQYqT9XtnyCvVFJ+t/UPkFeoCIiKIiICIiAiIgKug3y9s+asVVBzpe2fNXEbUuoJUIJAR/NKlQ4e6UGGk/W/qHyCvVFLvm7Z8gr1ARFTVySRQ54ozI7M0Fo32LgCf7C5/sguXi4fiVTWe0uK0n5TKSgbHHlsTI972h+a99GgGw01N9dFy/FcUMf5eDvbJdvOkBG838B8vK9AfM+smrvwgQ4mymyNfmLs4zXDCQAD8r7teOuolfRovJbX17YWukw9znOeW2a61hlBud/TcfO1wNUGI1+1YDhTxG52Uu2o90X32tw4fdSLXrIoY7NfQi3EKVAVVDvl7Z81aqaHnS9s+auDYouihBYAjuaVKhw0KDBS75u2fIK9U02+btnyCuUBERFEREBERAREQFRQ86btnzV6ooedL2z5q4jWl0KhBcEduKlHD3VR59Pvm7Z8grlTT75u2fIK5TQREUUREQEREBERAWei503bPmtCz0XOm7Z81Ua1CIg0gI7cpUO3FVl59Pzpu2fIK1UU7htZ2fzB97fIhXqa0IiKKIiICIiAiIgLNRc6btnzWlZMPeHiR7Tdrnkg8dURtUXQqEVsR25Zto/im0fxWqzHmYrRzGXbUshimG5w6fkR0ry3VONtNg+nPzMR9V9I4ud0+CrLCT0dylWPnTVY58dN+0fVRyvHPjpv2j6r6LZpskHzvLMc+Km/aPqo5ZjvxU37R9V9Fsk2XySkfO8sxz4qb9o+qctx34qX9o+q+i2PyTYjglI+c5djvxUv7R9VHLsd+Kl/aPqvpNiOCjYjgEHgMOK1nuVc7WxHnNiZlv/AH3r36OIQwhoFgF22IBWDQICIiiiIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiycs6ninLOp4oNaLJyzqeKcs6nig1osnLOp4pyzqeKDWiycs6ninLOp4oNaLJyzqeKcs6nig1osnLOp4pyzqeKDWiycs6ninLOp4oNaLJyzqeKcs6nigyIiKKyYliFPh0LZapzmsc7KCGk62J/6VEON4fNNHHFPnc85WkNNib2tey9EgOGoB+q4bBC0gtijBG6zRp/t1eIxwYvRzRbSORx0acuQ5hmIA0+ZK4GN0BLw2Zxc2UQkBjic5vYbvkVsNPT+80xRWeLFpaPeAJO7+571y6lpHi7oIHDiWA/7uCcOs7caw9wu2qYdL7ju09QrIsUops2yqGPyguOW50FvULuKio45HOZTwB7yXE5Rc33/APSnklJc2p4LuBHMGoKcOuI8So5J9gydpl+GxuFVTYzRVEBlZK4NADnZmEWvYcN9zZa46aCNxMcMTSTe4aAktNBLDJE+Jhjfo5tt/wBU4dZ48WoZJGxx1LHOde1vkCT5FUQ+0GGzPyR1Fz7t/dOlxcX0007lrNDRuOtLTk/OMfVW8nguTsYrnU+4NU4dZ/xOj2rIzOBI45Q0gg3/AN8jwW1UspadlskETbEHRgCuUBERFEREBERBlraCnrXRuqGFzo75CHFtr7930VBwWgLAwwHKCXWzu1JABvrruCIlSOzhVGQ0GHRoLQA47jvVIwHDhm/IN3XBOd17E7t6IrdI6OCYf/6LfMPd6rp2D0LnBzoASABzjbQADp4AIiXSYrbgOHtDfynki2pkd3716iIpQRERRERB/9k=" + }, + { + "timing": 1298, + "timestamp": 301927214146, + "data": "data:image/jpeg;base64,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" + }, + { + "timing": 1730, + "timestamp": 301927646646, + "data": "data:image/jpeg;base64,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" + }, + { + "timing": 2163, + "timestamp": 301928079146, + "data": "data:image/jpeg;base64,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" + }, + { + "timing": 2595, + "timestamp": 301928511646, + "data": "data:image/jpeg;base64,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" + }, + { + "timing": 3028, + "timestamp": 301928944146, + "data": "data:image/jpeg;base64,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" + }, + { + "timing": 3460, + "timestamp": 301929376646, + "data": "data:image/jpeg;base64,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" + } + ] + } + }, + "final-screenshot": { + "id": "final-screenshot", + "title": "Final Screenshot", + "description": "The last screenshot captured of the pageload.", + "score": 1, + "scoreDisplayMode": "informative", + "details": { + "type": "screenshot", + "timing": 3461, + "timestamp": 301929377410, + "data": "data:image/jpeg;base64,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" + } + }, + "total-blocking-time": { + "id": "total-blocking-time", + "title": "Total Blocking Time", + "description": "Sum of all time periods between FCP and Time to Interactive, when task length exceeded 50ms, expressed in milliseconds. [Learn more about the Total Blocking Time metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-total-blocking-time/).", + "score": 0.01, + "scoreDisplayMode": "numeric", + "numericValue": 3876.6323749999983, + "numericUnit": "millisecond", + "displayValue": "3,880 ms", + "scoringOptions": { + "p10": 200, + "median": 600 + } + }, + "max-potential-fid": { + "id": "max-potential-fid", + "title": "Max Potential First Input Delay", + "description": "The maximum potential First Input Delay that your users could experience is the duration of the longest task. [Learn more about the Maximum Potential First Input Delay metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-max-potential-fid/).", + "score": 0, + "scoreDisplayMode": "numeric", + "numericValue": 2213, + "numericUnit": "millisecond", + "displayValue": "2,210 ms" + }, + "cumulative-layout-shift": { + "id": "cumulative-layout-shift", + "title": "Cumulative Layout Shift", + "description": "Cumulative Layout Shift measures the movement of visible elements within the viewport. [Learn more about the Cumulative Layout Shift metric](https://web.dev/articles/cls).", + "score": 0.84, + "scoreDisplayMode": "numeric", + "numericValue": 0.120931, + "numericUnit": "unitless", + "displayValue": "0.121", + "scoringOptions": { + "p10": 0.1, + "median": 0.25 + }, + "details": { + "type": "debugdata", + "items": [ + { + "cumulativeLayoutShiftMainFrame": 0.120931, + "newEngineResult": { + "cumulativeLayoutShift": 0.120931, + "cumulativeLayoutShiftMainFrame": 0.120931 + }, + "newEngineResultDiffered": false + } + ] + } + }, + "server-response-time": { + "id": "server-response-time", + "title": "Initial server response time was short", + "description": "Keep the server response time for the main document short because all other requests depend on it. [Learn more about the Time to First Byte metric](https://developer.chrome.com/docs/lighthouse/performance/time-to-first-byte/).", + "score": 1, + "scoreDisplayMode": "metricSavings", + "numericValue": 72.107, + "numericUnit": "millisecond", + "displayValue": "Root document took 70 ms", + "metricSavings": { + "FCP": 0, + "LCP": 0 + }, + "details": { + "type": "opportunity", + "headings": [ + { + "key": "url", + "valueType": "url", + "label": "URL" + }, + { + "key": "responseTime", + "valueType": "timespanMs", + "label": "Time Spent" + } + ], + "items": [ + { + "url": "http://localhost:3000/ScriptHammer/game/3d/", + "responseTime": 72.107 + } + ], + "overallSavingsMs": 0 + }, + "guidanceLevel": 1 + }, + "interactive": { + "id": "interactive", + "title": "Time to Interactive", + "description": "Time to Interactive is the amount of time it takes for the page to become fully interactive. [Learn more about the Time to Interactive metric](https://developer.chrome.com/docs/lighthouse/performance/interactive/).", + "score": 0, + "scoreDisplayMode": "numeric", + "numericValue": 31721.124962500002, + "numericUnit": "millisecond", + "displayValue": "31.7 s" + }, + "user-timings": { + "id": "user-timings", + "title": "User Timing marks and measures", + "description": "Consider instrumenting your app with the User Timing API to measure your app's real-world performance during key user experiences. [Learn more about User Timing marks](https://developer.chrome.com/docs/lighthouse/performance/user-timings/).", + "score": 1, + "scoreDisplayMode": "informative", + "displayValue": "7 user timings", + "details": { + "type": "table", + "headings": [ + { + "key": "name", + "valueType": "text", + "label": "Name" + }, + { + "key": "timingType", + "valueType": "text", + "label": "Type" + }, + { + "key": "startTime", + "valueType": "ms", + "granularity": 0.01, + "label": "Start Time" + }, + { + "key": "duration", + "valueType": "ms", + "granularity": 0.01, + "label": "Duration" + } + ], + "items": [ + { + "name": "Update Blocked", + "startTime": 1862.3, + "duration": 6.5, + "timingType": "Measure" + }, + { + "name": "Mount", + "startTime": 1870.1, + "duration": 12.5, + "timingType": "Measure" + }, + { + "name": "Reconnect", + "startTime": 1873.1, + "duration": 9.5, + "timingType": "Measure" + }, + { + "name": "Mount", + "startTime": 1883.5, + "duration": 7.8, + "timingType": "Measure" + }, + { + "name": "Mount", + "startTime": 1892.1, + "duration": 0.5, + "timingType": "Measure" + }, + { + "name": "Mount", + "startTime": 1960.199, + "duration": 1.201, + "timingType": "Measure" + }, + { + "name": "Reconnect", + "startTime": 1960.199, + "duration": 1.201, + "timingType": "Measure" + } + ] + }, + "guidanceLevel": 2 + }, + "critical-request-chains": { + "id": "critical-request-chains", + "title": "Avoid chaining critical requests", + "description": "The Critical Request Chains below show you what resources are loaded with a high priority. Consider reducing the length of chains, reducing the download size of resources, or deferring the download of unnecessary resources to improve page load. [Learn how to avoid chaining critical requests](https://developer.chrome.com/docs/lighthouse/performance/critical-request-chains/).", + "score": 1, + "scoreDisplayMode": "informative", + "displayValue": "1 chain found", + "details": { + "type": "criticalrequestchain", + "chains": { + "07210F1B04EB2927D6778F9411707D6E": { + "request": { + "url": "http://localhost:3000/ScriptHammer/game/3d/", + "startTime": 301925.918448, + "endTime": 301926.028944, + "responseReceivedTime": 301925.99102599995, + "transferSize": 18846 + }, + "children": { + "949.7": { + "request": { + "url": "http://localhost:3000/ScriptHammer/_next/static/css/app/layout.css?v=1779072363202", + "startTime": 301926.002303, + "endTime": 301926.022122, + "responseReceivedTime": 301926.00887600007, + "transferSize": 43700 + } + } + } + } + }, + "longestChain": { + "duration": 110.49600005149841, + "length": 1, + "transferSize": 18846 + } + }, + "guidanceLevel": 1 + }, + "redirects": { + "id": "redirects", + "title": "Avoid multiple page redirects", + "description": "Redirects introduce additional delays before the page can be loaded. [Learn how to avoid page redirects](https://developer.chrome.com/docs/lighthouse/performance/redirects/).", + "score": 1, + "scoreDisplayMode": "metricSavings", + "numericValue": 0, + "numericUnit": "millisecond", + "displayValue": "", + "metricSavings": { + "LCP": 0, + "FCP": 0 + }, + "details": { + "type": "opportunity", + "headings": [], + "items": [], + "overallSavingsMs": 0 + }, + "guidanceLevel": 2 + }, + "mainthread-work-breakdown": { + "id": "mainthread-work-breakdown", + "title": "Minimize main-thread work", + "description": "Consider reducing the time spent parsing, compiling and executing JS. You may find delivering smaller JS payloads helps with this. [Learn how to minimize main-thread work](https://developer.chrome.com/docs/lighthouse/performance/mainthread-work-breakdown/)", + "score": 0, + "scoreDisplayMode": "metricSavings", + "numericValue": 8236.923999999866, + "numericUnit": "millisecond", + "displayValue": "8.2 s", + "metricSavings": { + "TBT": 3900 + }, + "details": { + "type": "table", + "headings": [ + { + "key": "groupLabel", + "valueType": "text", + "label": "Category" + }, + { + "key": "duration", + "valueType": "ms", + "granularity": 1, + "label": "Time Spent" + } + ], + "items": [ + { + "group": "scriptEvaluation", + "groupLabel": "Script Evaluation", + "duration": 4194.079999999866 + }, + { + "group": "other", + "groupLabel": "Other", + "duration": 2392.8999999999983 + }, + { + "group": "scriptParseCompile", + "groupLabel": "Script Parsing & Compilation", + "duration": 1057.2 + }, + { + "group": "styleLayout", + "groupLabel": "Style & Layout", + "duration": 350.5640000000001 + }, + { + "group": "paintCompositeRender", + "groupLabel": "Rendering", + "duration": 156.26399999999998 + }, + { + "group": "parseHTML", + "groupLabel": "Parse HTML & CSS", + "duration": 46.844 + }, + { + "group": "garbageCollection", + "groupLabel": "Garbage Collection", + "duration": 39.072000000000045 + } + ], + "sortedBy": ["duration"] + }, + "guidanceLevel": 1 + }, + "bootup-time": { + "id": "bootup-time", + "title": "Reduce JavaScript execution time", + "description": "Consider reducing the time spent parsing, compiling, and executing JS. You may find delivering smaller JS payloads helps with this. [Learn how to reduce Javascript execution time](https://developer.chrome.com/docs/lighthouse/performance/bootup-time/).", + "score": 0, + "scoreDisplayMode": "metricSavings", + "numericValue": 5144.17999999998, + "numericUnit": "millisecond", + "displayValue": "5.1 s", + "metricSavings": { + "TBT": 3750 + }, + "details": { + "type": "table", + "headings": [ + { + "key": "url", + "valueType": "url", + "label": "URL" + }, + { + "key": "total", + "granularity": 1, + "valueType": "ms", + "label": "Total CPU Time" + }, + { + "key": "scripting", + "granularity": 1, + "valueType": "ms", + "label": "Script Evaluation" + }, + { + "key": "scriptParseCompile", + "granularity": 1, + "valueType": "ms", + "label": "Script Parse" + } + ], + "items": [ + { + "url": "webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/@react-three+fiber@9.6.1_@types+react@19.1.13_react-dom@19.1.0_react@19.1.0__react@19.1.0_three@0.184.0/node_modules/@react-three/fiber/dist/events-b389eeca.esm.js", + "total": 2280.1600000000003, + "scripting": 456.1960000000011, + "scriptParseCompile": 0 + }, + { + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/vendor.js?v=1779072363202", + "total": 2216.0599999999795, + "scripting": 1233.1119999999796, + "scriptParseCompile": 968.1080000000001 + }, + { + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/_app-pages-browser_src_components_game_Scene_index_tsx.js", + "total": 1357.319999999997, + "scripting": 1241.091999999997, + "scriptParseCompile": 12.344 + }, + { + "url": "webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/next@15.5.9_@babel+core@7.28.4_@opentelemetry+api@1.9.0_@playwright+test@1.55.0_react-d_abafcb220e570ad869e3b50475f69ae5/node_modules/next/dist/compiled/scheduler/cjs/scheduler.development.js", + "total": 939.4920000000022, + "scripting": 909.0680000000021, + "scriptParseCompile": 0 + }, + { + "url": "http://localhost:3000/ScriptHammer/game/3d/", + "total": 559.8959999999996, + "scripting": 23.03999999999996, + "scriptParseCompile": 6.751999999999992 + }, + { + "url": "Unattributable", + "total": 384.13600000000133, + "scripting": 7.204, + "scriptParseCompile": 0 + }, + { + "url": "webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/next@15.5.9_@babel+core@7.28.4_@opentelemetry+api@1.9.0_@playwright+test@1.55.0_react-d_abafcb220e570ad869e3b50475f69ae5/node_modules/next/dist/compiled/next-devtools/index.js", + "total": 157.4520000000001, + "scripting": 108.75200000000011, + "scriptParseCompile": 0 + }, + { + "url": "webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/scheduler@0.27.0/node_modules/scheduler/cjs/scheduler.development.js", + "total": 125.20800000000062, + "scripting": 122.42800000000062, + "scriptParseCompile": 0 + }, + { + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/app/layout.js", + "total": 56.872, + "scripting": 1.6960000000000002, + "scriptParseCompile": 54.388 + } + ], + "summary": { + "wastedMs": 5144.17999999998 + }, + "sortedBy": ["total"] + }, + "guidanceLevel": 1 + }, + "uses-rel-preconnect": { + "id": "uses-rel-preconnect", + "title": "Preconnect to required origins", + "description": "Consider adding `preconnect` or `dns-prefetch` resource hints to establish early connections to important third-party origins. [Learn how to preconnect to required origins](https://developer.chrome.com/docs/lighthouse/performance/uses-rel-preconnect/).", + "score": 1, + "scoreDisplayMode": "metricSavings", + "numericValue": 0, + "numericUnit": "millisecond", + "displayValue": "", + "warnings": [], + "metricSavings": { + "LCP": 0, + "FCP": 0 + }, + "details": { + "type": "opportunity", + "headings": [], + "items": [], + "overallSavingsMs": 0, + "sortedBy": ["wastedMs"] + }, + "guidanceLevel": 3 + }, + "font-display": { + "id": "font-display", + "title": "All text remains visible during webfont loads", + "description": "Leverage the `font-display` CSS feature to ensure text is user-visible while webfonts are loading. [Learn more about `font-display`](https://developer.chrome.com/docs/lighthouse/performance/font-display/).", + "score": 1, + "scoreDisplayMode": "metricSavings", + "warnings": [], + "details": { + "type": "table", + "headings": [ + { + "key": "url", + "valueType": "url", + "label": "URL" + }, + { + "key": "wastedMs", + "valueType": "ms", + "label": "Est Savings" + } + ], + "items": [] + }, + "guidanceLevel": 3 + }, + "diagnostics": { + "id": "diagnostics", + "title": "Diagnostics", + "description": "Collection of useful page vitals.", + "score": 1, + "scoreDisplayMode": "informative", + "details": { + "type": "debugdata", + "items": [ + { + "numRequests": 26, + "numScripts": 13, + "numStylesheets": 1, + "numFonts": 2, + "numTasks": 2218, + "numTasksOver10ms": 15, + "numTasksOver25ms": 8, + "numTasksOver50ms": 3, + "numTasksOver100ms": 2, + "numTasksOver500ms": 1, + "rtt": 0.04575, + "throughput": 96605491.78106034, + "maxRtt": 0.04575, + "maxServerLatency": 6.9117500000000005, + "totalByteWeight": 5463096, + "totalTaskTime": 2059.23099999999, + "mainDocumentTransferSize": 18846 + } + ] + } + }, + "network-requests": { + "id": "network-requests", + "title": "Network Requests", + "description": "Lists the network requests that were made during page load.", + "score": 1, + "scoreDisplayMode": "informative", + "details": { + "type": "table", + "headings": [ + { + "key": "url", + "valueType": "url", + "label": "URL" + }, + { + "key": "protocol", + "valueType": "text", + "label": "Protocol" + }, + { + "key": "networkRequestTime", + "valueType": "ms", + "granularity": 1, + "label": "Network Request Time" + }, + { + "key": "networkEndTime", + "valueType": "ms", + "granularity": 1, + "label": "Network End Time" + }, + { + "key": "transferSize", + "valueType": "bytes", + "displayUnit": "kb", + "granularity": 1, + "label": "Transfer Size" + }, + { + "key": "resourceSize", + "valueType": "bytes", + "displayUnit": "kb", + "granularity": 1, + "label": "Resource Size" + }, + { + "key": "statusCode", + "valueType": "text", + "label": "Status Code" + }, + { + "key": "mimeType", + "valueType": "text", + "label": "MIME Type" + }, + { + "key": "resourceType", + "valueType": "text", + "label": "Resource Type" + } + ], + "items": [ + { + "url": "http://localhost:3000/ScriptHammer/game/3d/", + "sessionTargetType": "page", + "protocol": "http/1.1", + "rendererStartTime": 0, + "networkRequestTime": 0.7989999651908875, + "networkEndTime": 111.2950000166893, + "finished": true, + "transferSize": 18846, + "resourceSize": 85799, + "statusCode": 200, + "mimeType": "text/html", + "resourceType": "Document", + "priority": "VeryHigh", + "experimentalFromMainFrame": true, + "entity": "localhost" + }, + { + "url": "http://localhost:3000/ScriptHammer/_next/static/media/22a5144ee8d83bca-s.p.woff2", + "sessionTargetType": "page", + "protocol": "http/1.1", + "rendererStartTime": 78.38400000333786, + "networkRequestTime": 79.08700001239777, + "networkEndTime": 86.42900002002716, + "finished": true, + "transferSize": 29588, + "resourceSize": 29288, + "statusCode": 200, + "mimeType": "font/woff2", + "resourceType": "Font", + "priority": "High", + "isLinkPreload": true, + "experimentalFromMainFrame": true, + "entity": "localhost" + }, + { + "url": "http://localhost:3000/ScriptHammer/_next/static/media/f5271587012faf78-s.p.woff2", + "sessionTargetType": "page", + "protocol": "http/1.1", + "rendererStartTime": 78.75400000810623, + "networkRequestTime": 79.34700000286102, + "networkEndTime": 86.70700001716614, + "finished": true, + "transferSize": 30272, + "resourceSize": 29972, + "statusCode": 200, + "mimeType": "font/woff2", + "resourceType": "Font", + "priority": "High", + "isLinkPreload": true, + "experimentalFromMainFrame": true, + "entity": "localhost" + }, + { + "url": "http://localhost:3000/ScriptHammer/printing-mallet.svg", + "sessionTargetType": "page", + "protocol": "http/1.1", + "rendererStartTime": 78.89999997615814, + "networkRequestTime": 85.1700000166893, + "networkEndTime": 96.21499997377396, + "finished": true, + "transferSize": 2830, + "resourceSize": 8366, + "statusCode": 200, + "mimeType": "image/svg+xml", + "resourceType": "Image", + "priority": "Low", + "isLinkPreload": true, + "experimentalFromMainFrame": true, + "entity": "localhost" + }, + { + "url": "http://localhost:3000/ScriptHammer/scripthammer-logo.svg", + "sessionTargetType": "page", + "protocol": "http/1.1", + "rendererStartTime": 79.00500005483627, + "networkRequestTime": 85.62900000810623, + "networkEndTime": 98.0349999666214, + "finished": true, + "transferSize": 9344, + "resourceSize": 28767, + "statusCode": 200, + "mimeType": "image/svg+xml", + "resourceType": "Image", + "priority": "Low", + "isLinkPreload": true, + "experimentalFromMainFrame": true, + "entity": "localhost" + }, + { + "url": "http://localhost:3000/ScriptHammer/script-tags.svg", + "sessionTargetType": "page", + "protocol": "http/1.1", + "rendererStartTime": 79.07500004768372, + "networkRequestTime": 87.69800001382828, + "networkEndTime": 97.70800000429153, + "finished": true, + "transferSize": 1666, + "resourceSize": 5648, + "statusCode": 200, + "mimeType": "image/svg+xml", + "resourceType": "Image", + "priority": "Low", + "isLinkPreload": true, + "experimentalFromMainFrame": true, + "entity": "localhost" + }, + { + "url": "http://localhost:3000/ScriptHammer/_next/static/css/app/layout.css?v=1779072363202", + "sessionTargetType": "page", + "protocol": "http/1.1", + "rendererStartTime": 84.30699998140335, + "networkRequestTime": 84.65400004386902, + "networkEndTime": 104.47299998998642, + "finished": true, + "transferSize": 43700, + "resourceSize": 296015, + "statusCode": 200, + "mimeType": "text/css", + "resourceType": "Stylesheet", + "priority": "VeryHigh", + "experimentalFromMainFrame": true, + "entity": "localhost" + }, + { + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/webpack.js?v=1779072363202", + "sessionTargetType": "page", + "protocol": "http/1.1", + "rendererStartTime": 84.44800001382828, + "networkRequestTime": 91.93400001525879, + "networkEndTime": 106.6700000166893, + "finished": true, + "transferSize": 28538, + "resourceSize": 140845, + "statusCode": 200, + "mimeType": "application/javascript", + "resourceType": "Script", + "priority": "Low", + "isLinkPreload": true, + "experimentalFromMainFrame": true, + "entity": "localhost" + }, + { + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/vendor.js?v=1779072363202", + "sessionTargetType": "page", + "protocol": "http/1.1", + "rendererStartTime": 84.51300001144409, + "networkRequestTime": 92.16500002145767, + "networkEndTime": 518.680999994278, + "finished": true, + "transferSize": 4940370, + "resourceSize": 21457513, + "statusCode": 200, + "mimeType": "application/javascript", + "resourceType": "Script", + "priority": "Low", + "experimentalFromMainFrame": true, + "entity": "localhost" + }, + { + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/main-app.js?v=1779072363202", + "sessionTargetType": "page", + "protocol": "http/1.1", + "rendererStartTime": 84.57700002193451, + "networkRequestTime": 96.43099999427795, + "networkEndTime": 104.92400002479553, + "finished": true, + "transferSize": 1142, + "resourceSize": 1758, + "statusCode": 200, + "mimeType": "application/javascript", + "resourceType": "Script", + "priority": "Low", + "experimentalFromMainFrame": true, + "entity": "localhost" + }, + { + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/app-pages-internals.js", + "sessionTargetType": "page", + "protocol": "http/1.1", + "rendererStartTime": 84.61900001764297, + "networkRequestTime": 98.17400002479553, + "networkEndTime": 105.07200002670288, + "finished": true, + "transferSize": 3760, + "resourceSize": 31851, + "statusCode": 200, + "mimeType": "application/javascript", + "resourceType": "Script", + "priority": "Low", + "experimentalFromMainFrame": true, + "entity": "localhost" + }, + { + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/common.js", + "sessionTargetType": "page", + "protocol": "http/1.1", + "rendererStartTime": 84.65500003099442, + "networkRequestTime": 98.31300002336502, + "networkEndTime": 115.05799996852875, + "finished": true, + "transferSize": 12133, + "resourceSize": 50270, + "statusCode": 200, + "mimeType": "application/javascript", + "resourceType": "Script", + "priority": "Low", + "experimentalFromMainFrame": true, + "entity": "localhost" + }, + { + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/app/layout.js", + "sessionTargetType": "page", + "protocol": "http/1.1", + "rendererStartTime": 84.68900001049042, + "networkRequestTime": 105.51800000667572, + "networkEndTime": 130.44900000095367, + "finished": true, + "transferSize": 263482, + "resourceSize": 1109845, + "statusCode": 200, + "mimeType": "application/javascript", + "resourceType": "Script", + "priority": "Low", + "experimentalFromMainFrame": true, + "entity": "localhost" + }, + { + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/app/page.js", + "sessionTargetType": "page", + "protocol": "http/1.1", + "rendererStartTime": 84.72799998521805, + "networkRequestTime": 105.70099997520447, + "networkEndTime": 115.682000041008, + "finished": true, + "transferSize": 2956, + "resourceSize": 11257, + "statusCode": 200, + "mimeType": "application/javascript", + "resourceType": "Script", + "priority": "Low", + "experimentalFromMainFrame": true, + "entity": "localhost" + }, + { + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/app/game/3d/page.js", + "sessionTargetType": "page", + "protocol": "http/1.1", + "rendererStartTime": 84.76300001144409, + "networkRequestTime": 105.96899998188019, + "networkEndTime": 115.96899998188019, + "finished": true, + "transferSize": 7705, + "resourceSize": 31969, + "statusCode": 200, + "mimeType": "application/javascript", + "resourceType": "Script", + "priority": "Low", + "experimentalFromMainFrame": true, + "entity": "localhost" + }, + { + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/app/global-error.js", + "sessionTargetType": "page", + "protocol": "http/1.1", + "rendererStartTime": 84.79900002479553, + "networkRequestTime": 106.841000020504, + "networkEndTime": 117.75, + "finished": true, + "transferSize": 4284, + "resourceSize": 11449, + "statusCode": 200, + "mimeType": "application/javascript", + "resourceType": "Script", + "priority": "Low", + "experimentalFromMainFrame": true, + "entity": "localhost" + }, + { + "url": "data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://w…", + "sessionTargetType": "page", + "protocol": "data", + "rendererStartTime": 144.03400003910065, + "networkRequestTime": 144.03400003910065, + "networkEndTime": 144.10600000619888, + "finished": true, + "transferSize": 0, + "resourceSize": 602, + "statusCode": 200, + "mimeType": "image/svg+xml", + "resourceType": "Image", + "priority": "Low", + "experimentalFromMainFrame": true + }, + { + "url": "http://localhost:3000/icon.svg", + "sessionTargetType": "page", + "protocol": "http/1.1", + "rendererStartTime": 1204.3429999947548, + "networkRequestTime": 1204.7540000081062, + "networkEndTime": 1291.794000029564, + "finished": true, + "transferSize": 17640, + "resourceSize": 58879, + "statusCode": 404, + "mimeType": "text/html", + "resourceType": "Other", + "priority": "High", + "experimentalFromMainFrame": true, + "entity": "localhost" + }, + { + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/_app-pages-browser_src_components_game_Scene_index_tsx.js", + "sessionTargetType": "page", + "protocol": "http/1.1", + "rendererStartTime": 1287.6840000152588, + "networkRequestTime": 1291.4049999713898, + "networkEndTime": 1298.1669999957085, + "finished": true, + "transferSize": 42743, + "resourceSize": 183782, + "statusCode": 200, + "mimeType": "application/javascript", + "resourceType": "Script", + "priority": "Low", + "experimentalFromMainFrame": true, + "entity": "localhost" + }, + { + "url": "http://localhost:3000/favicon.ico", + "sessionTargetType": "page", + "protocol": "http/1.1", + "rendererStartTime": 1329.8289999961853, + "networkRequestTime": 1330.5230000019073, + "networkEndTime": 1335.0999999642372, + "finished": true, + "transferSize": 215, + "resourceSize": 0, + "statusCode": 404, + "mimeType": "text/plain", + "resourceType": "Other", + "priority": "High", + "experimentalFromMainFrame": true, + "entity": "localhost" + }, + { + "url": "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='a'%3E%3CfeTurbulence t…", + "sessionTargetType": "page", + "protocol": "data", + "rendererStartTime": 1704.908999979496, + "networkRequestTime": 1704.908999979496, + "networkEndTime": 1705.0049999952316, + "finished": true, + "transferSize": 0, + "resourceSize": 247, + "statusCode": 200, + "mimeType": "image/svg+xml", + "resourceType": "Image", + "priority": "Low", + "experimentalFromMainFrame": true + }, + { + "url": "http://localhost:3000/ScriptHammer/_next/static/webpack/0377da3bee10d267.webpack.hot-update.json", + "sessionTargetType": "page", + "protocol": "http/1.1", + "rendererStartTime": 2236.775000035763, + "networkRequestTime": 2237.2979999780655, + "networkEndTime": 2253.1829999685287, + "finished": true, + "transferSize": 360, + "resourceSize": 31, + "statusCode": 200, + "mimeType": "application/json", + "resourceType": "Fetch", + "priority": "High", + "experimentalFromMainFrame": true, + "entity": "localhost" + }, + { + "url": "http://localhost:3000/ScriptHammer/_next/static/webpack/webpack.0377da3bee10d267.hot-update.js", + "sessionTargetType": "page", + "protocol": "http/1.1", + "rendererStartTime": 2255.912000000477, + "networkRequestTime": 2256.5750000476837, + "networkEndTime": 2276.425000011921, + "finished": true, + "transferSize": 1153, + "resourceSize": 1157, + "statusCode": 200, + "mimeType": "application/javascript", + "resourceType": "Script", + "priority": "Low", + "experimentalFromMainFrame": true, + "entity": "localhost" + }, + { + "url": "http://localhost:3000/ScriptHammer/_next/static/webpack/bc6e946f8b3b478b.webpack.hot-update.json", + "sessionTargetType": "page", + "protocol": "http/1.1", + "rendererStartTime": 2979.1520000100136, + "networkRequestTime": 2979.6079999804497, + "networkEndTime": 2995.1310000419617, + "finished": true, + "transferSize": 369, + "resourceSize": 40, + "statusCode": 200, + "mimeType": "application/json", + "resourceType": "Fetch", + "priority": "High", + "experimentalFromMainFrame": true, + "entity": "localhost" + }, + { + "url": "http://localhost:3000/ScriptHammer/_next/static/webpack/webpack.bc6e946f8b3b478b.hot-update.js", + "sessionTargetType": "page", + "protocol": "", + "rendererStartTime": 2996.2599999904633, + "networkRequestTime": 2996.2599999904633, + "finished": false, + "transferSize": 0, + "resourceSize": 0, + "statusCode": -1, + "mimeType": "", + "resourceType": "Script", + "priority": "Low", + "experimentalFromMainFrame": true, + "entity": "localhost" + }, + { + "url": "http://localhost:3000/ScriptHammer/_next/static/webpack/common.bc6e946f8b3b478b.hot-update.js", + "sessionTargetType": "page", + "protocol": "", + "rendererStartTime": 2996.6050000190735, + "networkRequestTime": 2996.6050000190735, + "finished": false, + "transferSize": 0, + "resourceSize": 0, + "statusCode": -1, + "mimeType": "", + "resourceType": "Script", + "priority": "Low", + "experimentalFromMainFrame": true, + "entity": "localhost" + } + ], + "debugData": { + "type": "debugdata", + "networkStartTimeTs": 301925917649, + "initiators": [ + { + "type": "parser", + "url": "http://localhost:3000/ScriptHammer/game/3d/", + "lineNumber": 0, + "columnNumber": 288 + }, + { + "type": "parser", + "url": "http://localhost:3000/ScriptHammer/game/3d/", + "lineNumber": 0, + "columnNumber": 409 + }, + { + "type": "parser", + "url": "http://localhost:3000/ScriptHammer/game/3d/", + "lineNumber": 0, + "columnNumber": 492 + }, + { + "type": "parser", + "url": "http://localhost:3000/ScriptHammer/game/3d/", + "lineNumber": 0, + "columnNumber": 586 + }, + { + "type": "parser", + "url": "http://localhost:3000/ScriptHammer/game/3d/", + "lineNumber": 0, + "columnNumber": 675 + }, + { + "type": "parser", + "url": "http://localhost:3000/ScriptHammer/game/3d/", + "lineNumber": 0, + "columnNumber": 751 + }, + { + "type": "parser", + "url": "http://localhost:3000/ScriptHammer/game/3d/", + "lineNumber": 0, + "columnNumber": 831 + }, + { + "type": "parser", + "url": "http://localhost:3000/ScriptHammer/game/3d/", + "lineNumber": 0, + "columnNumber": 909 + }, + { + "type": "parser", + "url": "http://localhost:3000/ScriptHammer/game/3d/", + "lineNumber": 0, + "columnNumber": 995 + }, + { + "type": "parser", + "url": "http://localhost:3000/ScriptHammer/game/3d/", + "lineNumber": 0, + "columnNumber": 1081 + }, + { + "type": "parser", + "url": "http://localhost:3000/ScriptHammer/_next/static/css/app/layout.css?v=1779072363202" + }, + { + "type": "parser", + "url": "http://localhost:3000/ScriptHammer/_next/static/css/app/layout.css?v=1779072363202" + } + ] + } + } + }, + "network-rtt": { + "id": "network-rtt", + "title": "Network Round Trip Times", + "description": "Network round trip times (RTT) have a large impact on performance. If the RTT to an origin is high, it's an indication that servers closer to the user could improve performance. [Learn more about the Round Trip Time](https://hpbn.co/primer-on-latency-and-bandwidth/).", + "score": 1, + "scoreDisplayMode": "informative", + "numericValue": 0.04575, + "numericUnit": "millisecond", + "displayValue": "0 ms", + "details": { + "type": "table", + "headings": [ + { + "key": "origin", + "valueType": "text", + "label": "URL" + }, + { + "key": "rtt", + "valueType": "ms", + "granularity": 1, + "label": "Time Spent" + } + ], + "items": [ + { + "origin": "http://localhost:3000", + "rtt": 0.04575 + } + ], + "sortedBy": ["rtt"] + } + }, + "network-server-latency": { + "id": "network-server-latency", + "title": "Server Backend Latencies", + "description": "Server latencies can impact web performance. If the server latency of an origin is high, it's an indication the server is overloaded or has poor backend performance. [Learn more about server response time](https://hpbn.co/primer-on-web-performance/#analyzing-the-resource-waterfall).", + "score": 1, + "scoreDisplayMode": "informative", + "numericValue": 6.9117500000000005, + "numericUnit": "millisecond", + "displayValue": "10 ms", + "details": { + "type": "table", + "headings": [ + { + "key": "origin", + "valueType": "text", + "label": "URL" + }, + { + "key": "serverResponseTime", + "valueType": "ms", + "granularity": 1, + "label": "Time Spent" + } + ], + "items": [ + { + "origin": "http://localhost:3000", + "serverResponseTime": 6.9117500000000005 + } + ], + "sortedBy": ["serverResponseTime"] + } + }, + "main-thread-tasks": { + "id": "main-thread-tasks", + "title": "Tasks", + "description": "Lists the toplevel main thread tasks that executed during page load.", + "score": 1, + "scoreDisplayMode": "informative", + "details": { + "type": "table", + "headings": [ + { + "key": "startTime", + "valueType": "ms", + "granularity": 1, + "label": "Start Time" + }, + { + "key": "duration", + "valueType": "ms", + "granularity": 1, + "label": "End Time" + } + ], + "items": [ + { + "duration": 9.65, + "startTime": 76.89 + }, + { + "duration": 6.963, + "startTime": 97.568 + }, + { + "duration": 7.638, + "startTime": 111.887 + }, + { + "duration": 5.065, + "startTime": 119.601 + }, + { + "duration": 27.056, + "startTime": 132.078 + }, + { + "duration": 7.404, + "startTime": 167.007 + }, + { + "duration": 14.218, + "startTime": 175.086 + }, + { + "duration": 5.918, + "startTime": 596.476 + }, + { + "duration": 553.166, + "startTime": 602.451 + }, + { + "duration": 6.558, + "startTime": 1162.658 + }, + { + "duration": 10.883, + "startTime": 1172.911 + }, + { + "duration": 5.346, + "startTime": 1186.87 + }, + { + "duration": 11.669, + "startTime": 1193.539 + }, + { + "duration": 5.491, + "startTime": 1208.358 + }, + { + "duration": 5.089, + "startTime": 1214.863 + }, + { + "duration": 6.485, + "startTime": 1220.093 + }, + { + "duration": 5.322, + "startTime": 1228.3 + }, + { + "duration": 5.893, + "startTime": 1233.977 + }, + { + "duration": 9.715, + "startTime": 1240.678 + }, + { + "duration": 9.142, + "startTime": 1251.458 + }, + { + "duration": 6.471, + "startTime": 1260.713 + }, + { + "duration": 27.823, + "startTime": 1267.935 + }, + { + "duration": 29.078, + "startTime": 1299.664 + }, + { + "duration": 21.986, + "startTime": 1333.227 + }, + { + "duration": 6.935, + "startTime": 1355.466 + }, + { + "duration": 339.612, + "startTime": 1362.94 + }, + { + "duration": 19.331, + "startTime": 1702.588 + }, + { + "duration": 5.277, + "startTime": 1722.479 + }, + { + "duration": 23.327, + "startTime": 1734.333 + }, + { + "duration": 5.67, + "startTime": 1759.056 + }, + { + "duration": 6.014, + "startTime": 1789.017 + }, + { + "duration": 34.278, + "startTime": 1828.516 + }, + { + "duration": 26.128, + "startTime": 1867.503 + }, + { + "duration": 64.864, + "startTime": 1894.305 + }, + { + "duration": 5.121, + "startTime": 1959.235 + }, + { + "duration": 5.72, + "startTime": 1964.449 + }, + { + "duration": 5.968, + "startTime": 1972.985 + }, + { + "duration": 6.156, + "startTime": 1989.462 + }, + { + "duration": 6.974, + "startTime": 2006.236 + }, + { + "duration": 6.561, + "startTime": 2022.926 + }, + { + "duration": 10.608, + "startTime": 2039.606 + }, + { + "duration": 8.181, + "startTime": 2056.411 + }, + { + "duration": 7.684, + "startTime": 2073.183 + }, + { + "duration": 6.845, + "startTime": 2089.7 + }, + { + "duration": 6.134, + "startTime": 2106.179 + }, + { + "duration": 8.18, + "startTime": 2123.023 + }, + { + "duration": 6.167, + "startTime": 2139.682 + }, + { + "duration": 5.36, + "startTime": 2156.605 + }, + { + "duration": 5.431, + "startTime": 2172.783 + }, + { + "duration": 5.658, + "startTime": 2189.516 + }, + { + "duration": 6.986, + "startTime": 2206.207 + }, + { + "duration": 5.101, + "startTime": 2222.835 + }, + { + "duration": 5.517, + "startTime": 2239.391 + }, + { + "duration": 5.722, + "startTime": 2257.436 + }, + { + "duration": 6.489, + "startTime": 2272.824 + }, + { + "duration": 7.149, + "startTime": 2289.542 + }, + { + "duration": 6.709, + "startTime": 2306.184 + }, + { + "duration": 7.531, + "startTime": 2322.997 + }, + { + "duration": 8.165, + "startTime": 2339.529 + }, + { + "duration": 5.885, + "startTime": 2356.253 + }, + { + "duration": 6.751, + "startTime": 2372.826 + }, + { + "duration": 5.388, + "startTime": 2389.718 + }, + { + "duration": 5.367, + "startTime": 2406.181 + }, + { + "duration": 8.391, + "startTime": 2423.206 + }, + { + "duration": 5.757, + "startTime": 2439.523 + }, + { + "duration": 5.293, + "startTime": 2472.805 + }, + { + "duration": 5.015, + "startTime": 2489.458 + }, + { + "duration": 5.023, + "startTime": 2506.11 + }, + { + "duration": 6.875, + "startTime": 2522.94 + }, + { + "duration": 5.38, + "startTime": 2539.548 + }, + { + "duration": 6.374, + "startTime": 2556.217 + }, + { + "duration": 5.46, + "startTime": 2572.758 + }, + { + "duration": 6.533, + "startTime": 2589.576 + }, + { + "duration": 5.686, + "startTime": 2606.159 + }, + { + "duration": 5.431, + "startTime": 2622.869 + }, + { + "duration": 5.424, + "startTime": 2639.502 + }, + { + "duration": 5.595, + "startTime": 2656.098 + }, + { + "duration": 6.169, + "startTime": 2672.787 + }, + { + "duration": 5.677, + "startTime": 2689.542 + }, + { + "duration": 5.029, + "startTime": 2706.131 + }, + { + "duration": 7.977, + "startTime": 2739.518 + }, + { + "duration": 6.222, + "startTime": 2756.565 + }, + { + "duration": 5.656, + "startTime": 2772.918 + }, + { + "duration": 6.441, + "startTime": 2789.505 + }, + { + "duration": 6.161, + "startTime": 2806.126 + }, + { + "duration": 5.256, + "startTime": 2822.859 + }, + { + "duration": 7.785, + "startTime": 2856.094 + }, + { + "duration": 6.803, + "startTime": 2872.82 + }, + { + "duration": 5.086, + "startTime": 2889.455 + }, + { + "duration": 6.077, + "startTime": 2906.125 + }, + { + "duration": 5.602, + "startTime": 2939.488 + }, + { + "duration": 5.445, + "startTime": 2972.767 + }, + { + "duration": 5.826, + "startTime": 2989.374 + }, + { + "duration": 5.857, + "startTime": 3006.172 + }, + { + "duration": 5.168, + "startTime": 3022.778 + }, + { + "duration": 5.316, + "startTime": 3039.447 + }, + { + "duration": 5.339, + "startTime": 3056.091 + }, + { + "duration": 5.472, + "startTime": 3072.785 + }, + { + "duration": 5.697, + "startTime": 3139.523 + }, + { + "duration": 5.438, + "startTime": 3156.15 + }, + { + "duration": 5.284, + "startTime": 3172.8 + }, + { + "duration": 5.053, + "startTime": 3189.458 + }, + { + "duration": 5.027, + "startTime": 3206.068 + }, + { + "duration": 6.062, + "startTime": 3222.718 + }, + { + "duration": 5.268, + "startTime": 3239.47 + }, + { + "duration": 5.082, + "startTime": 3256.235 + }, + { + "duration": 5.991, + "startTime": 3272.777 + }, + { + "duration": 6.619, + "startTime": 3289.488 + }, + { + "duration": 5.553, + "startTime": 3306.142 + }, + { + "duration": 5.514, + "startTime": 3322.794 + }, + { + "duration": 5.596, + "startTime": 3339.52 + }, + { + "duration": 7.984, + "startTime": 3356.152 + }, + { + "duration": 6.032, + "startTime": 3372.832 + }, + { + "duration": 5.351, + "startTime": 3389.473 + }, + { + "duration": 5.734, + "startTime": 3406.138 + }, + { + "duration": 5.198, + "startTime": 3422.818 + }, + { + "duration": 6.523, + "startTime": 3439.512 + } + ] + } + }, + "metrics": { + "id": "metrics", + "title": "Metrics", + "description": "Collects all available metrics.", + "score": 1, + "scoreDisplayMode": "informative", + "numericValue": 31721, + "numericUnit": "millisecond", + "details": { + "type": "debugdata", + "items": [ + { + "firstContentfulPaint": 1064, + "largestContentfulPaint": 31563, + "interactive": 31721, + "speedIndex": 1480, + "totalBlockingTime": 3877, + "maxPotentialFID": 2213, + "cumulativeLayoutShift": 0.120931, + "cumulativeLayoutShiftMainFrame": 0.120931, + "timeToFirstByte": 457, + "observedTimeOrigin": 0, + "observedTimeOriginTs": 301925916646, + "observedNavigationStart": 0, + "observedNavigationStartTs": 301925916646, + "observedFirstPaint": 127, + "observedFirstPaintTs": 301926043845, + "observedFirstContentfulPaint": 180, + "observedFirstContentfulPaintTs": 301926097078, + "observedFirstContentfulPaintAllFrames": 180, + "observedFirstContentfulPaintAllFramesTs": 301926097078, + "observedLargestContentfulPaint": 1744, + "observedLargestContentfulPaintTs": 301927660630, + "observedLargestContentfulPaintAllFrames": 1744, + "observedLargestContentfulPaintAllFramesTs": 301927660630, + "observedTraceEnd": 3473, + "observedTraceEndTs": 301929389355, + "observedLoad": 1162, + "observedLoadTs": 301927078587, + "observedDomContentLoaded": 139, + "observedDomContentLoadedTs": 301926055917, + "observedCumulativeLayoutShift": 0.120931, + "observedCumulativeLayoutShiftMainFrame": 0.120931, + "observedFirstVisualChange": 141, + "observedFirstVisualChangeTs": 301926057646, + "observedLastVisualChange": 3460, + "observedLastVisualChangeTs": 301929376646, + "observedSpeedIndex": 744, + "observedSpeedIndexTs": 301926660274 + }, + { + "lcpInvalidated": false + } + ] + } + }, + "resource-summary": { + "id": "resource-summary", + "title": "Resources Summary", + "description": "Aggregates all network requests and groups them by type", + "score": 1, + "scoreDisplayMode": "informative", + "details": { + "type": "table", + "headings": [ + { + "key": "label", + "valueType": "text", + "label": "Resource Type" + }, + { + "key": "requestCount", + "valueType": "numeric", + "label": "Requests" + }, + { + "key": "transferSize", + "valueType": "bytes", + "label": "Transfer Size" + } + ], + "items": [ + { + "resourceType": "total", + "label": "Total", + "requestCount": 23, + "transferSize": 5462881 + }, + { + "resourceType": "script", + "label": "Script", + "requestCount": 13, + "transferSize": 5308266 + }, + { + "resourceType": "font", + "label": "Font", + "requestCount": 2, + "transferSize": 59860 + }, + { + "resourceType": "stylesheet", + "label": "Stylesheet", + "requestCount": 1, + "transferSize": 43700 + }, + { + "resourceType": "document", + "label": "Document", + "requestCount": 1, + "transferSize": 18846 + }, + { + "resourceType": "other", + "label": "Other", + "requestCount": 3, + "transferSize": 18369 + }, + { + "resourceType": "image", + "label": "Image", + "requestCount": 3, + "transferSize": 13840 + }, + { + "resourceType": "media", + "label": "Media", + "requestCount": 0, + "transferSize": 0 + }, + { + "resourceType": "third-party", + "label": "Third-party", + "requestCount": 0, + "transferSize": 0 + } + ] + } + }, + "third-party-summary": { + "id": "third-party-summary", + "title": "Minimize third-party usage", + "description": "Third-party code can significantly impact load performance. Limit the number of redundant third-party providers and try to load third-party code after your page has primarily finished loading. [Learn how to minimize third-party impact](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/loading-third-party-javascript/).", + "score": null, + "scoreDisplayMode": "notApplicable", + "metricSavings": { + "TBT": 0 + }, + "guidanceLevel": 1 + }, + "third-party-facades": { + "id": "third-party-facades", + "title": "Lazy load third-party resources with facades", + "description": "Some third-party embeds can be lazy loaded. Consider replacing them with a facade until they are required. [Learn how to defer third-parties with a facade](https://developer.chrome.com/docs/lighthouse/performance/third-party-facades/).", + "score": null, + "scoreDisplayMode": "notApplicable", + "metricSavings": { + "TBT": 0 + }, + "guidanceLevel": 3 + }, + "largest-contentful-paint-element": { + "id": "largest-contentful-paint-element", + "title": "Largest Contentful Paint element", + "description": "This is the largest contentful element painted within the viewport. [Learn more about the Largest Contentful Paint element](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)", + "score": null, + "scoreDisplayMode": "notApplicable", + "metricSavings": { + "LCP": 0 + }, + "guidanceLevel": 1 + }, + "lcp-lazy-loaded": { + "id": "lcp-lazy-loaded", + "title": "Largest Contentful Paint image was not lazily loaded", + "description": "Above-the-fold images that are lazily loaded render later in the page lifecycle, which can delay the largest contentful paint. [Learn more about optimal lazy loading](https://web.dev/articles/lcp-lazy-loading).", + "score": null, + "scoreDisplayMode": "notApplicable", + "metricSavings": { + "LCP": 0 + }, + "guidanceLevel": 3 + }, + "layout-shifts": { + "id": "layout-shifts", + "title": "Avoid large layout shifts", + "description": "These are the largest layout shifts observed on the page. Each table item represents a single layout shift, and shows the element that shifted the most. Below each item are possible root causes that led to the layout shift. Some of these layout shifts may not be included in the CLS metric value due to [windowing](https://web.dev/articles/cls#what_is_cls). [Learn how to improve CLS](https://web.dev/articles/optimize-cls)", + "score": 0, + "scoreDisplayMode": "metricSavings", + "displayValue": "2 layout shifts found", + "metricSavings": { + "CLS": 0.121 + }, + "details": { + "type": "table", + "headings": [ + { + "key": "node", + "valueType": "node", + "subItemsHeading": { + "key": "extra" + }, + "label": "Element" + }, + { + "key": "score", + "valueType": "numeric", + "subItemsHeading": { + "key": "cause", + "valueType": "text" + }, + "granularity": 0.001, + "label": "Layout shift score" + } + ], + "items": [ + { + "score": 0.10213 + }, + { + "score": 0.018801 + } + ] + }, + "guidanceLevel": 2 + }, + "long-tasks": { + "id": "long-tasks", + "title": "Avoid long main-thread tasks", + "description": "Lists the longest tasks on the main thread, useful for identifying worst contributors to input delay. [Learn how to avoid long main-thread tasks](https://web.dev/articles/optimize-long-tasks)", + "score": 1, + "scoreDisplayMode": "informative", + "displayValue": "11 long tasks found", + "metricSavings": { + "TBT": 3900 + }, + "details": { + "type": "table", + "headings": [ + { + "key": "url", + "valueType": "url", + "label": "URL" + }, + { + "key": "startTime", + "valueType": "ms", + "granularity": 1, + "label": "Start Time" + }, + { + "key": "duration", + "valueType": "ms", + "granularity": 1, + "label": "Duration" + } + ], + "items": [ + { + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/vendor.js?v=1779072363202", + "duration": 2213, + "startTime": 28220.73525 + }, + { + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/_app-pages-browser_src_components_game_Scene_index_tsx.js", + "duration": 1358, + "startTime": 30433.73525 + }, + { + "url": "webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/@react-three+fiber@9.6.1_@types+react@19.1.13_react-dom@19.1.0_react@19.1.0__react@19.1.0_three@0.184.0/node_modules/@react-three/fiber/dist/events-b389eeca.esm.js", + "duration": 259, + "startTime": 1509.91175 + }, + { + "url": "webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/next@15.5.9_@babel+core@7.28.4_@opentelemetry+api@1.9.0_@playwright+test@1.55.0_react-d_abafcb220e570ad869e3b50475f69ae5/node_modules/next/dist/compiled/scheduler/cjs/scheduler.development.js", + "duration": 137, + "startTime": 1267.91175 + }, + { + "url": "webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/next@15.5.9_@babel+core@7.28.4_@opentelemetry+api@1.9.0_@playwright+test@1.55.0_react-d_abafcb220e570ad869e3b50475f69ae5/node_modules/next/dist/compiled/scheduler/cjs/scheduler.development.js", + "duration": 116, + "startTime": 931.91175 + }, + { + "url": "webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/next@15.5.9_@babel+core@7.28.4_@opentelemetry+api@1.9.0_@playwright+test@1.55.0_react-d_abafcb220e570ad869e3b50475f69ae5/node_modules/next/dist/compiled/scheduler/cjs/scheduler.development.js", + "duration": 111, + "startTime": 2157.7352499999997 + }, + { + "url": "webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/scheduler@0.27.0/node_modules/scheduler/cjs/scheduler.development.js", + "duration": 105, + "startTime": 1404.91175 + }, + { + "url": "webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/next@15.5.9_@babel+core@7.28.4_@opentelemetry+api@1.9.0_@playwright+test@1.55.0_react-d_abafcb220e570ad869e3b50475f69ae5/node_modules/next/dist/compiled/scheduler/cjs/scheduler.development.js", + "duration": 93, + "startTime": 1174.91175 + }, + { + "url": "webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/next@15.5.9_@babel+core@7.28.4_@opentelemetry+api@1.9.0_@playwright+test@1.55.0_react-d_abafcb220e570ad869e3b50475f69ae5/node_modules/next/dist/compiled/scheduler/cjs/scheduler.development.js", + "duration": 88, + "startTime": 1047.91175 + }, + { + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/app/layout.js", + "duration": 57, + "startTime": 5420.735250000001 + }, + { + "url": "http://localhost:3000/ScriptHammer/game/3d/", + "duration": 54, + "startTime": 786.91175 + } + ], + "sortedBy": ["duration"], + "skipSumming": ["startTime"], + "debugData": { + "type": "debugdata", + "urls": [ + "http://localhost:3000/ScriptHammer/_next/static/chunks/vendor.js?v=1779072363202", + "http://localhost:3000/ScriptHammer/_next/static/chunks/_app-pages-browser_src_components_game_Scene_index_tsx.js", + "webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/@react-three+fiber@9.6.1_@types+react@19.1.13_react-dom@19.1.0_react@19.1.0__react@19.1.0_three@0.184.0/node_modules/@react-three/fiber/dist/events-b389eeca.esm.js", + "webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/next@15.5.9_@babel+core@7.28.4_@opentelemetry+api@1.9.0_@playwright+test@1.55.0_react-d_abafcb220e570ad869e3b50475f69ae5/node_modules/next/dist/compiled/scheduler/cjs/scheduler.development.js", + "webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/scheduler@0.27.0/node_modules/scheduler/cjs/scheduler.development.js", + "http://localhost:3000/ScriptHammer/_next/static/chunks/app/layout.js", + "http://localhost:3000/ScriptHammer/game/3d/" + ], + "tasks": [ + { + "urlIndex": 0, + "startTime": 28220.7, + "duration": 2213, + "other": 2213, + "scriptEvaluation": 0 + }, + { + "urlIndex": 1, + "startTime": 30433.7, + "duration": 1358, + "other": 1358, + "scriptEvaluation": 0 + }, + { + "urlIndex": 2, + "startTime": 1509.9, + "duration": 259, + "other": 259, + "paintCompositeRender": 0, + "scriptEvaluation": 0, + "styleLayout": 0 + }, + { + "urlIndex": 3, + "startTime": 1267.9, + "duration": 137, + "other": 137 + }, + { + "urlIndex": 3, + "startTime": 931.9, + "duration": 116, + "other": 116 + }, + { + "urlIndex": 3, + "startTime": 2157.7, + "duration": 111, + "other": 111 + }, + { + "urlIndex": 4, + "startTime": 1404.9, + "duration": 105, + "other": 105 + }, + { + "urlIndex": 3, + "startTime": 1174.9, + "duration": 93, + "other": 93 + }, + { + "urlIndex": 3, + "startTime": 1047.9, + "duration": 88, + "other": 88 + }, + { + "urlIndex": 5, + "startTime": 5420.7, + "duration": 57, + "other": 57, + "scriptEvaluation": 0 + }, + { + "urlIndex": 6, + "startTime": 786.9, + "duration": 54, + "other": 54, + "parseHTML": 0, + "scriptEvaluation": 0, + "styleLayout": 0 + } + ] + } + }, + "guidanceLevel": 1 + }, + "non-composited-animations": { + "id": "non-composited-animations", + "title": "Avoid non-composited animations", + "description": "Animations which are not composited can be janky and increase CLS. [Learn how to avoid non-composited animations](https://developer.chrome.com/docs/lighthouse/performance/non-composited-animations/)", + "score": null, + "scoreDisplayMode": "notApplicable", + "metricSavings": { + "CLS": 0 + }, + "details": { + "type": "table", + "headings": [ + { + "key": "node", + "valueType": "node", + "subItemsHeading": { + "key": "failureReason", + "valueType": "text" + }, + "label": "Element" + } + ], + "items": [] + }, + "guidanceLevel": 2 + }, + "unsized-images": { + "id": "unsized-images", + "title": "Image elements have explicit `width` and `height`", + "description": "Set an explicit width and height on image elements to reduce layout shifts and improve CLS. [Learn how to set image dimensions](https://web.dev/articles/optimize-cls#images_without_dimensions)", + "score": 1, + "scoreDisplayMode": "metricSavings", + "metricSavings": { + "CLS": 0 + }, + "details": { + "type": "table", + "headings": [ + { + "key": "node", + "valueType": "node", + "label": "" + }, + { + "key": "url", + "valueType": "url", + "label": "URL" + } + ], + "items": [] + }, + "guidanceLevel": 4 + }, + "prioritize-lcp-image": { + "id": "prioritize-lcp-image", + "title": "Preload Largest Contentful Paint image", + "description": "If the LCP element is dynamically added to the page, you should preload the image in order to improve LCP. [Learn more about preloading LCP elements](https://web.dev/articles/optimize-lcp#optimize_when_the_resource_is_discovered).", + "score": null, + "scoreDisplayMode": "notApplicable", + "metricSavings": { + "LCP": 0 + }, + "guidanceLevel": 4 + }, + "script-treemap-data": { + "id": "script-treemap-data", + "title": "Script Treemap Data", + "description": "Used for treemap app", + "score": 1, + "scoreDisplayMode": "informative", + "details": { + "type": "treemap-data", + "nodes": [ + { + "name": "http://localhost:3000/ScriptHammer/game/3d/", + "resourceBytes": 72315, + "encodedBytes": 15211, + "unusedBytes": 1384, + "children": [ + { + "name": "(inline)", + "resourceBytes": 2649, + "unusedBytes": 692 + }, + { + "name": "(inline)", + "resourceBytes": 57, + "unusedBytes": 0 + }, + { + "name": "(inline)", + "resourceBytes": 845, + "unusedBytes": 0 + }, + { + "name": "(inline)", + "resourceBytes": 130, + "unusedBytes": 0 + }, + { + "name": "(inline)", + "resourceBytes": 16, + "unusedBytes": 0 + }, + { + "name": "(inline)", + "resourceBytes": 43, + "unusedBytes": 0 + }, + { + "name": "(inline)", + "resourceBytes": 2204, + "unusedBytes": 0 + }, + { + "name": "(inline)", + "resourceBytes": 2171, + "unusedBytes": 0 + }, + { + "name": "(inline)", + "resourceBytes": 2206, + "unusedBytes": 0 + }, + { + "name": "(inline)", + "resourceBytes": 2002, + "unusedBytes": 0 + }, + { + "name": "(inline)", + "resourceBytes": 831, + "unusedBytes": 0 + }, + { + "name": "(inline)", + "resourceBytes": 2226, + "unusedBytes": 0 + }, + { + "name": "(inline)", + "resourceBytes": 2281, + "unusedBytes": 0 + }, + { + "name": "(inline)", + "resourceBytes": 1970, + "unusedBytes": 0 + }, + { + "name": "(inline)", + "resourceBytes": 2788, + "unusedBytes": 0 + }, + { + "name": "(inline)", + "resourceBytes": 136, + "unusedBytes": 0 + }, + { + "name": "(inline)", + "resourceBytes": 872, + "unusedBytes": 0 + }, + { + "name": "(inline)", + "resourceBytes": 736, + "unusedBytes": 0 + }, + { + "name": "(inline)", + "resourceBytes": 1272, + "unusedBytes": 0 + }, + { + "name": "(inline)", + "resourceBytes": 1812, + "unusedBytes": 0 + }, + { + "name": "(inline)", + "resourceBytes": 594, + "unusedBytes": 0 + }, + { + "name": "(inline)", + "resourceBytes": 2457, + "unusedBytes": 0 + }, + { + "name": "(inline)", + "resourceBytes": 511, + "unusedBytes": 0 + }, + { + "name": "(inline)", + "resourceBytes": 5301, + "unusedBytes": 0 + }, + { + "name": "(inline)", + "resourceBytes": 47, + "unusedBytes": 0 + }, + { + "name": "(inline) (function() {\n …", + "resourceBytes": 2649, + "unusedBytes": 692 + }, + { + "name": "(inline) requestAnimatio…", + "resourceBytes": 57, + "unusedBytes": 0 + }, + { + "name": "(inline) $RB=[];$RV=func…", + "resourceBytes": 845, + "unusedBytes": 0 + }, + { + "name": "(inline) document.queryS…", + "resourceBytes": 130, + "unusedBytes": 0 + }, + { + "name": "(inline) $RC(\"B:0\",\"S:0\"…", + "resourceBytes": 16, + "unusedBytes": 0 + }, + { + "name": "(inline) (self.__next_f=…", + "resourceBytes": 43, + "unusedBytes": 0 + }, + { + "name": "(inline) self.__next_f.p…", + "resourceBytes": 2204, + "unusedBytes": 0 + }, + { + "name": "(inline) self.__next_f.p…", + "resourceBytes": 2171, + "unusedBytes": 0 + }, + { + "name": "(inline) self.__next_f.p…", + "resourceBytes": 2206, + "unusedBytes": 0 + }, + { + "name": "(inline) self.__next_f.p…", + "resourceBytes": 2003, + "unusedBytes": 0 + }, + { + "name": "(inline) self.__next_f.p…", + "resourceBytes": 831, + "unusedBytes": 0 + }, + { + "name": "(inline) self.__next_f.p…", + "resourceBytes": 2226, + "unusedBytes": 0 + }, + { + "name": "(inline) self.__next_f.p…", + "resourceBytes": 2281, + "unusedBytes": 0 + }, + { + "name": "(inline) self.__next_f.p…", + "resourceBytes": 1970, + "unusedBytes": 0 + }, + { + "name": "(inline) self.__next_f.p…", + "resourceBytes": 2788, + "unusedBytes": 0 + }, + { + "name": "(inline) self.__next_f.p…", + "resourceBytes": 136, + "unusedBytes": 0 + }, + { + "name": "(inline) self.__next_f.p…", + "resourceBytes": 872, + "unusedBytes": 0 + }, + { + "name": "(inline) self.__next_f.p…", + "resourceBytes": 736, + "unusedBytes": 0 + }, + { + "name": "(inline) self.__next_f.p…", + "resourceBytes": 1272, + "unusedBytes": 0 + }, + { + "name": "(inline) self.__next_f.p…", + "resourceBytes": 1812, + "unusedBytes": 0 + }, + { + "name": "(inline) self.__next_f.p…", + "resourceBytes": 594, + "unusedBytes": 0 + }, + { + "name": "(inline) self.__next_f.p…", + "resourceBytes": 2457, + "unusedBytes": 0 + }, + { + "name": "(inline) self.__next_f.p…", + "resourceBytes": 511, + "unusedBytes": 0 + }, + { + "name": "(inline) self.__next_f.p…", + "resourceBytes": 5301, + "unusedBytes": 0 + }, + { + "name": "(inline) self.__next_f.p…", + "resourceBytes": 47, + "unusedBytes": 0 + } + ] + }, + { + "name": "http://localhost:3000/ScriptHammer/_next/static/chunks/main-app.js?v=1779072363202", + "resourceBytes": 1758, + "encodedBytes": 774, + "unusedBytes": 0 + }, + { + "name": "http://localhost:3000/ScriptHammer/_next/static/chunks/app-pages-internals.js", + "resourceBytes": 31851, + "encodedBytes": 3391, + "unusedBytes": 0 + }, + { + "name": "http://localhost:3000/ScriptHammer/_next/static/chunks/common.js", + "resourceBytes": 50270, + "encodedBytes": 11764, + "unusedBytes": 0 + }, + { + "name": "http://localhost:3000/ScriptHammer/_next/static/chunks/app/page.js", + "resourceBytes": 11257, + "encodedBytes": 2587, + "unusedBytes": 0 + }, + { + "name": "http://localhost:3000/ScriptHammer/_next/static/chunks/app/game/3d/page.js", + "resourceBytes": 31967, + "encodedBytes": 7336, + "unusedBytes": 0 + }, + { + "name": "http://localhost:3000/ScriptHammer/_next/static/chunks/app/global-error.js", + "resourceBytes": 11449, + "encodedBytes": 3915, + "unusedBytes": 0 + }, + { + "name": "http://localhost:3000/ScriptHammer/_next/static/chunks/webpack.js?v=1779072363202", + "resourceBytes": 140845, + "encodedBytes": 28168, + "children": [ + { + "name": "webpack-internal:/nextjs/webpack.js", + "resourceBytes": 1 + }, + { + "name": "(unmapped)", + "resourceBytes": 140844 + } + ] + }, + { + "name": "http://localhost:3000/ScriptHammer/_next/static/chunks/app/layout.js", + "resourceBytes": 1109786, + "encodedBytes": 263111, + "unusedBytes": 0 + }, + { + "name": "http://localhost:3000/ScriptHammer/_next/static/chunks/vendor.js?v=1779072363202", + "resourceBytes": 21457319, + "encodedBytes": 4939998, + "unusedBytes": 1942781 + }, + { + "name": "http://localhost:3000/ScriptHammer/_next/static/chunks/_app-pages-browser_src_components_game_Scene_index_tsx.js", + "resourceBytes": 183725, + "encodedBytes": 42373, + "unusedBytes": 0 + }, + { + "name": "http://localhost:3000/ScriptHammer/_next/static/webpack/webpack.0377da3bee10d267.hot-update.js", + "resourceBytes": 1157, + "encodedBytes": 785, + "children": [ + { + "name": "webpack-internal:/nextjs/webpack.js", + "resourceBytes": 1 + }, + { + "name": "(unmapped)", + "resourceBytes": 1156 + } + ] + }, + { + "name": "http://localhost:3000/ScriptHammer/_next/static/webpack/webpack.bc6e946f8b3b478b.hot-update.js", + "resourceBytes": 1157, + "encodedBytes": 0, + "children": [ + { + "name": "webpack-internal:/nextjs/webpack.js", + "resourceBytes": 1 + }, + { + "name": "(unmapped)", + "resourceBytes": 1156 + } + ] + }, + { + "name": "http://localhost:3000/ScriptHammer/_next/static/webpack/common.bc6e946f8b3b478b.hot-update.js", + "resourceBytes": 237714, + "encodedBytes": 0, + "unusedBytes": 234193 + }, + { + "name": "http://localhost:3000/ScriptHammer/_next/static/chunks/main-app.js?v=1779072366738", + "resourceBytes": 1758, + "encodedBytes": 1758, + "unusedBytes": 0 + }, + { + "name": "http://localhost:3000/ScriptHammer/_next/static/chunks/app-pages-internals.js", + "resourceBytes": 31851, + "encodedBytes": 3391, + "unusedBytes": 0 + }, + { + "name": "http://localhost:3000/ScriptHammer/_next/static/chunks/webpack.js?v=1779072366738", + "resourceBytes": 140845, + "encodedBytes": 140845, + "children": [ + { + "name": "webpack-internal:/nextjs/webpack.js", + "resourceBytes": 38 + }, + { + "name": "(unmapped)", + "resourceBytes": 140807 + } + ] + }, + { + "name": "http://localhost:3000/ScriptHammer/_next/static/chunks/app/page.js", + "resourceBytes": 11257, + "encodedBytes": 2587, + "unusedBytes": 0 + }, + { + "name": "http://localhost:3000/ScriptHammer/_next/static/chunks/app/game/3d/page.js", + "resourceBytes": 31967, + "encodedBytes": 7336, + "unusedBytes": 0 + }, + { + "name": "http://localhost:3000/ScriptHammer/_next/static/chunks/common.js", + "resourceBytes": 287385, + "encodedBytes": 11764, + "unusedBytes": 88 + }, + { + "name": "http://localhost:3000/ScriptHammer/_next/static/chunks/app/global-error.js", + "resourceBytes": 11449, + "encodedBytes": 3915, + "unusedBytes": 0 + }, + { + "name": "http://localhost:3000/ScriptHammer/_next/static/chunks/app/layout.js", + "resourceBytes": 873798, + "encodedBytes": 263111, + "unusedBytes": 0 + }, + { + "name": "http://localhost:3000/ScriptHammer/_next/static/chunks/vendor.js?v=1779072366738", + "resourceBytes": 21457319, + "encodedBytes": 21457319, + "unusedBytes": 1942781 + }, + { + "name": "http://localhost:3000/ScriptHammer/_next/static/chunks/_app-pages-browser_src_components_game_Scene_index_tsx.js", + "resourceBytes": 183725, + "encodedBytes": 42373, + "unusedBytes": 0 + } + ] + } + }, + "uses-long-cache-ttl": { + "id": "uses-long-cache-ttl", + "title": "Uses efficient cache policy on static assets", + "description": "A long cache lifetime can speed up repeat visits to your page. [Learn more about efficient cache policies](https://developer.chrome.com/docs/lighthouse/performance/uses-long-cache-ttl/).", + "score": 1, + "scoreDisplayMode": "metricSavings", + "numericValue": 0, + "numericUnit": "byte", + "displayValue": "0 resources found", + "details": { + "type": "table", + "headings": [ + { + "key": "url", + "valueType": "url", + "label": "URL" + }, + { + "key": "cacheLifetimeMs", + "valueType": "ms", + "label": "Cache TTL", + "displayUnit": "duration" + }, + { + "key": "totalBytes", + "valueType": "bytes", + "label": "Transfer Size", + "displayUnit": "kb", + "granularity": 1 + } + ], + "items": [] + }, + "guidanceLevel": 3 + }, + "total-byte-weight": { + "id": "total-byte-weight", + "title": "Avoid enormous network payloads", + "description": "Large network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).", + "score": 0.5, + "scoreDisplayMode": "metricSavings", + "numericValue": 5463096, + "numericUnit": "byte", + "displayValue": "Total size was 5,335 KiB", + "details": { + "type": "table", + "headings": [ + { + "key": "url", + "valueType": "url", + "label": "URL" + }, + { + "key": "totalBytes", + "valueType": "bytes", + "label": "Transfer Size" + } + ], + "items": [ + { + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/vendor.js?v=1779072363202", + "totalBytes": 4940370 + }, + { + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/app/layout.js", + "totalBytes": 263482 + }, + { + "url": "http://localhost:3000/ScriptHammer/_next/static/css/app/layout.css?v=1779072363202", + "totalBytes": 43700 + }, + { + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/_app-pages-browser_src_components_game_Scene_index_tsx.js", + "totalBytes": 42743 + }, + { + "url": "http://localhost:3000/ScriptHammer/_next/static/media/f5271587012faf78-s.p.woff2", + "totalBytes": 30272 + }, + { + "url": "http://localhost:3000/ScriptHammer/_next/static/media/22a5144ee8d83bca-s.p.woff2", + "totalBytes": 29588 + }, + { + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/webpack.js?v=1779072363202", + "totalBytes": 28538 + }, + { + "url": "http://localhost:3000/ScriptHammer/game/3d/", + "totalBytes": 18846 + }, + { + "url": "http://localhost:3000/icon.svg", + "totalBytes": 17640 + }, + { + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/common.js", + "totalBytes": 12133 + } + ], + "sortedBy": ["totalBytes"] + }, + "guidanceLevel": 1 + }, + "offscreen-images": { + "id": "offscreen-images", + "title": "Defer offscreen images", + "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).", + "score": 1, + "scoreDisplayMode": "metricSavings", + "numericValue": 0, + "numericUnit": "millisecond", + "displayValue": "", + "warnings": [], + "metricSavings": { + "FCP": 0, + "LCP": 0 + }, + "details": { + "type": "opportunity", + "headings": [], + "items": [], + "overallSavingsMs": 0, + "overallSavingsBytes": 0, + "sortedBy": ["wastedBytes"], + "debugData": { + "type": "debugdata", + "metricSavings": { + "FCP": 0, + "LCP": 0 + } + } + }, + "guidanceLevel": 2 + }, + "render-blocking-resources": { + "id": "render-blocking-resources", + "title": "Eliminate render-blocking resources", + "description": "Resources are blocking the first paint of your page. Consider delivering critical JS/CSS inline and deferring all non-critical JS/styles. [Learn how to eliminate render-blocking resources](https://developer.chrome.com/docs/lighthouse/performance/render-blocking-resources/).", + "score": 0, + "scoreDisplayMode": "metricSavings", + "numericValue": 127, + "numericUnit": "millisecond", + "displayValue": "Est savings of 130 ms", + "metricSavings": { + "FCP": 150, + "LCP": 150 + }, + "details": { + "type": "opportunity", + "headings": [ + { + "key": "url", + "valueType": "url", + "label": "URL" + }, + { + "key": "totalBytes", + "valueType": "bytes", + "label": "Transfer Size" + }, + { + "key": "wastedMs", + "valueType": "timespanMs", + "label": "Duration" + } + ], + "items": [ + { + "url": "http://localhost:3000/ScriptHammer/_next/static/css/app/layout.css?v=1779072363202", + "totalBytes": 43700, + "wastedMs": 307 + } + ], + "overallSavingsMs": 127 + }, + "guidanceLevel": 2 + }, + "unminified-css": { + "id": "unminified-css", + "title": "Minify CSS", + "description": "Minifying CSS files can reduce network payload sizes. [Learn how to minify CSS](https://developer.chrome.com/docs/lighthouse/performance/unminified-css/).", + "score": 0.5, + "scoreDisplayMode": "metricSavings", + "numericValue": 0, + "numericUnit": "millisecond", + "displayValue": "Est savings of 7 KiB", + "metricSavings": { + "FCP": 0, + "LCP": 0 + }, + "details": { + "type": "opportunity", + "headings": [ + { + "key": "url", + "valueType": "url", + "label": "URL" + }, + { + "key": "totalBytes", + "valueType": "bytes", + "label": "Transfer Size" + }, + { + "key": "wastedBytes", + "valueType": "bytes", + "label": "Est Savings" + } + ], + "items": [ + { + "url": ":host(.dark) {\n --color-font: white;\n --color-backdrop: rgba(0, 0, 0, 0.8);\n --color-border-shad…", + "totalBytes": 3747, + "wastedBytes": 2745, + "wastedPercent": 73.24935952177626 + }, + { + "url": ":host {\n /* \n * Although the style applied to the shadow host is isolated,\n * the element that a…", + "totalBytes": 3264, + "wastedBytes": 2359, + "wastedPercent": 72.27498315054224 + }, + { + "url": ":host {\n all: initial;\n\n /* the direction property is not reset by 'all' */\n direction: ltr;\n} …", + "totalBytes": 3099, + "wastedBytes": 2271, + "wastedPercent": 73.27052142488384 + } + ], + "overallSavingsMs": 0, + "overallSavingsBytes": 7375, + "sortedBy": ["wastedBytes"], + "debugData": { + "type": "debugdata", + "metricSavings": { + "FCP": 0, + "LCP": 0 + } + } + }, + "guidanceLevel": 3 + }, + "unminified-javascript": { + "id": "unminified-javascript", + "title": "Minify JavaScript", + "description": "Minifying JavaScript files can reduce payload sizes and script parse time. [Learn how to minify JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unminified-javascript/).", + "score": 0.5, + "scoreDisplayMode": "metricSavings", + "numericValue": 0, + "numericUnit": "millisecond", + "displayValue": "Est savings of 36 KiB", + "warnings": [], + "metricSavings": { + "FCP": 0, + "LCP": 0 + }, + "details": { + "type": "opportunity", + "headings": [ + { + "key": "url", + "valueType": "url", + "label": "URL" + }, + { + "key": "totalBytes", + "valueType": "bytes", + "label": "Transfer Size" + }, + { + "key": "wastedBytes", + "valueType": "bytes", + "label": "Est Savings" + } + ], + "items": [ + { + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/webpack.js?v=1779072366738", + "totalBytes": 46479, + "wastedBytes": 37054, + "wastedPercent": 79.72238986119493 + } + ], + "overallSavingsMs": 0, + "overallSavingsBytes": 37054, + "sortedBy": ["wastedBytes"], + "debugData": { + "type": "debugdata", + "metricSavings": { + "FCP": 0, + "LCP": 0 + } + } + }, + "guidanceLevel": 3 + }, + "unused-css-rules": { + "id": "unused-css-rules", + "title": "Reduce unused CSS", + "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).", + "score": 1, + "scoreDisplayMode": "metricSavings", + "numericValue": 0, + "numericUnit": "millisecond", + "displayValue": "", + "metricSavings": { + "FCP": 0, + "LCP": 0 + }, + "details": { + "type": "opportunity", + "headings": [], + "items": [], + "overallSavingsMs": 0, + "overallSavingsBytes": 0, + "sortedBy": ["wastedBytes"], + "debugData": { + "type": "debugdata", + "metricSavings": { + "FCP": 0, + "LCP": 0 + } + } + }, + "guidanceLevel": 1 + }, + "unused-javascript": { + "id": "unused-javascript", + "title": "Reduce unused JavaScript", + "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).", + "score": 0, + "scoreDisplayMode": "metricSavings", + "numericValue": 2250, + "numericUnit": "millisecond", + "displayValue": "Est savings of 1,063 KiB", + "metricSavings": { + "FCP": 0, + "LCP": 2250 + }, + "details": { + "type": "opportunity", + "headings": [ + { + "key": "url", + "valueType": "url", + "subItemsHeading": { + "key": "source", + "valueType": "code" + }, + "label": "URL" + }, + { + "key": "totalBytes", + "valueType": "bytes", + "subItemsHeading": { + "key": "sourceBytes" + }, + "label": "Transfer Size" + }, + { + "key": "wastedBytes", + "valueType": "bytes", + "subItemsHeading": { + "key": "sourceWastedBytes" + }, + "label": "Est Savings" + } + ], + "items": [ + { + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/vendor.js?v=1779072366738", + "totalBytes": 7080915, + "wastedBytes": 641118, + "wastedPercent": 9.054164688514907 + }, + { + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/vendor.js?v=1779072363202", + "totalBytes": 4939953, + "wastedBytes": 447272, + "wastedPercent": 9.054164688514907 + } + ], + "overallSavingsMs": 2250, + "overallSavingsBytes": 1088390, + "sortedBy": ["wastedBytes"], + "debugData": { + "type": "debugdata", + "metricSavings": { + "FCP": 0, + "LCP": 2250 + } + } + }, + "guidanceLevel": 1 + }, + "modern-image-formats": { + "id": "modern-image-formats", + "title": "Serve images in next-gen formats", + "description": "Image formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).", + "score": 1, + "scoreDisplayMode": "metricSavings", + "numericValue": 0, + "numericUnit": "millisecond", + "displayValue": "", + "warnings": [], + "metricSavings": { + "FCP": 0, + "LCP": 0 + }, + "details": { + "type": "opportunity", + "headings": [], + "items": [], + "overallSavingsMs": 0, + "overallSavingsBytes": 0, + "sortedBy": ["wastedBytes"], + "debugData": { + "type": "debugdata", + "metricSavings": { + "FCP": 0, + "LCP": 0 + } + } + }, + "guidanceLevel": 3 + }, + "uses-optimized-images": { + "id": "uses-optimized-images", + "title": "Efficiently encode images", + "description": "Optimized images load faster and consume less cellular data. [Learn how to efficiently encode images](https://developer.chrome.com/docs/lighthouse/performance/uses-optimized-images/).", + "score": 1, + "scoreDisplayMode": "metricSavings", + "numericValue": 0, + "numericUnit": "millisecond", + "displayValue": "", + "warnings": [], + "metricSavings": { + "FCP": 0, + "LCP": 0 + }, + "details": { + "type": "opportunity", + "headings": [], + "items": [], + "overallSavingsMs": 0, + "overallSavingsBytes": 0, + "sortedBy": ["wastedBytes"], + "debugData": { + "type": "debugdata", + "metricSavings": { + "FCP": 0, + "LCP": 0 + } + } + }, + "guidanceLevel": 2 + }, + "uses-text-compression": { + "id": "uses-text-compression", + "title": "Enable text compression", + "description": "Text-based resources should be served with compression (gzip, deflate or brotli) to minimize total network bytes. [Learn more about text compression](https://developer.chrome.com/docs/lighthouse/performance/uses-text-compression/).", + "score": 1, + "scoreDisplayMode": "metricSavings", + "numericValue": 0, + "numericUnit": "millisecond", + "displayValue": "", + "metricSavings": { + "FCP": 0, + "LCP": 0 + }, + "details": { + "type": "opportunity", + "headings": [], + "items": [], + "overallSavingsMs": 0, + "overallSavingsBytes": 0, + "sortedBy": ["wastedBytes"], + "debugData": { + "type": "debugdata", + "metricSavings": { + "FCP": 0, + "LCP": 0 + } + } + }, + "guidanceLevel": 3 + }, + "uses-responsive-images": { + "id": "uses-responsive-images", + "title": "Properly size images", + "description": "Serve images that are appropriately-sized to save cellular data and improve load time. [Learn how to size images](https://developer.chrome.com/docs/lighthouse/performance/uses-responsive-images/).", + "score": 1, + "scoreDisplayMode": "metricSavings", + "numericValue": 0, + "numericUnit": "millisecond", + "displayValue": "", + "metricSavings": { + "FCP": 0, + "LCP": 0 + }, + "details": { + "type": "opportunity", + "headings": [], + "items": [], + "overallSavingsMs": 0, + "overallSavingsBytes": 0, + "sortedBy": ["wastedBytes"], + "debugData": { + "type": "debugdata", + "metricSavings": { + "FCP": 0, + "LCP": 0 + } + } + }, + "guidanceLevel": 2 + }, + "efficient-animated-content": { + "id": "efficient-animated-content", + "title": "Use video formats for animated content", + "description": "Large GIFs are inefficient for delivering animated content. Consider using MPEG4/WebM videos for animations and PNG/WebP for static images instead of GIF to save network bytes. [Learn more about efficient video formats](https://developer.chrome.com/docs/lighthouse/performance/efficient-animated-content/)", + "score": 1, + "scoreDisplayMode": "metricSavings", + "numericValue": 0, + "numericUnit": "millisecond", + "displayValue": "", + "metricSavings": { + "FCP": 0, + "LCP": 0 + }, + "details": { + "type": "opportunity", + "headings": [], + "items": [], + "overallSavingsMs": 0, + "overallSavingsBytes": 0, + "sortedBy": ["wastedBytes"], + "debugData": { + "type": "debugdata", + "metricSavings": { + "FCP": 0, + "LCP": 0 + } + } + }, + "guidanceLevel": 3 + }, + "duplicated-javascript": { + "id": "duplicated-javascript", + "title": "Remove duplicate modules in JavaScript bundles", + "description": "Remove large, duplicate JavaScript modules from bundles to reduce unnecessary bytes consumed by network activity. ", + "score": 1, + "scoreDisplayMode": "metricSavings", + "numericValue": 0, + "numericUnit": "millisecond", + "displayValue": "", + "metricSavings": { + "FCP": 0, + "LCP": 0 + }, + "details": { + "type": "opportunity", + "headings": [], + "items": [], + "overallSavingsMs": 0, + "overallSavingsBytes": 0, + "sortedBy": ["wastedBytes"], + "debugData": { + "type": "debugdata", + "metricSavings": { + "FCP": 0, + "LCP": 0 + } + } + }, + "guidanceLevel": 2 + }, + "legacy-javascript": { + "id": "legacy-javascript", + "title": "Avoid serving legacy JavaScript to modern browsers", + "description": "Polyfills and transforms enable legacy browsers to use new JavaScript features. However, many aren't necessary for modern browsers. Consider modifying your JavaScript build process to not transpile [Baseline](https://web.dev/baseline) features, unless you know you must support legacy browsers. [Learn why most sites can deploy ES6+ code without transpiling](https://philipwalton.com/articles/the-state-of-es5-on-the-web/)", + "score": 0.5, + "scoreDisplayMode": "metricSavings", + "numericValue": 0, + "numericUnit": "millisecond", + "displayValue": "Est savings of 17 KiB", + "warnings": [], + "metricSavings": { + "FCP": 0, + "LCP": 0 + }, + "details": { + "type": "opportunity", + "headings": [ + { + "key": "url", + "valueType": "url", + "subItemsHeading": { + "key": "location", + "valueType": "source-location" + }, + "label": "URL" + }, + { + "key": null, + "valueType": "code", + "subItemsHeading": { + "key": "signal" + }, + "label": "" + }, + { + "key": "wastedBytes", + "valueType": "bytes", + "label": "Est Savings" + } + ], + "items": [ + { + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/vendor.js?v=1779072366738", + "wastedBytes": 17489, + "subItems": { + "type": "subitems", + "items": [ + { + "signal": "@babel/plugin-transform-classes", + "location": { + "type": "source-location", + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/vendor.js?v=1779072366738", + "urlProvider": "network", + "line": 2245, + "column": 116470 + } + }, + { + "signal": "@babel/plugin-transform-spread", + "location": { + "type": "source-location", + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/vendor.js?v=1779072366738", + "urlProvider": "network", + "line": 2245, + "column": 561198 + } + }, + { + "signal": "Array.prototype.at", + "location": { + "type": "source-location", + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/vendor.js?v=1779072366738", + "urlProvider": "network", + "line": 982, + "column": 1029 + } + }, + { + "signal": "Array.prototype.flat", + "location": { + "type": "source-location", + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/vendor.js?v=1779072366738", + "urlProvider": "network", + "line": 982, + "column": 415 + } + }, + { + "signal": "Array.prototype.flatMap", + "location": { + "type": "source-location", + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/vendor.js?v=1779072366738", + "urlProvider": "network", + "line": 982, + "column": 528 + } + }, + { + "signal": "Object.fromEntries", + "location": { + "type": "source-location", + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/vendor.js?v=1779072366738", + "urlProvider": "network", + "line": 982, + "column": 906 + } + }, + { + "signal": "Object.hasOwn", + "location": { + "type": "source-location", + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/vendor.js?v=1779072366738", + "urlProvider": "network", + "line": 982, + "column": 1164 + } + }, + { + "signal": "Promise.allSettled", + "location": { + "type": "source-location", + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/vendor.js?v=1779072366738", + "urlProvider": "network", + "line": 874, + "column": 41369 + } + }, + { + "signal": "Promise.any", + "location": { + "type": "source-location", + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/vendor.js?v=1779072366738", + "urlProvider": "network", + "line": 874, + "column": 41475 + } + }, + { + "signal": "String.prototype.trimEnd", + "location": { + "type": "source-location", + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/vendor.js?v=1779072366738", + "urlProvider": "network", + "line": 982, + "column": 151 + } + }, + { + "signal": "String.prototype.trimStart", + "location": { + "type": "source-location", + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/vendor.js?v=1779072366738", + "urlProvider": "network", + "line": 982, + "column": 64 + } + } + ] + }, + "totalBytes": 0 + } + ], + "overallSavingsMs": 0, + "overallSavingsBytes": 17489, + "sortedBy": ["wastedBytes"], + "debugData": { + "type": "debugdata", + "metricSavings": { + "FCP": 0, + "LCP": 0 + } + } + }, + "guidanceLevel": 2 + }, + "dom-size": { + "id": "dom-size", + "title": "Avoids an excessive DOM size", + "description": "A large DOM will increase memory usage, cause longer [style calculations](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), and produce costly [layout reflows](https://developers.google.com/speed/articles/reflow). [Learn how to avoid an excessive DOM size](https://developer.chrome.com/docs/lighthouse/performance/dom-size/).", + "score": 1, + "scoreDisplayMode": "metricSavings", + "numericValue": 369, + "numericUnit": "element", + "displayValue": "369 elements", + "metricSavings": { + "TBT": 0 + }, + "details": { + "type": "table", + "headings": [ + { + "key": "statistic", + "valueType": "text", + "label": "Statistic" + }, + { + "key": "node", + "valueType": "node", + "label": "Element" + }, + { + "key": "value", + "valueType": "numeric", + "label": "Value" + } + ], + "items": [ + { + "statistic": "Total DOM Elements", + "value": { + "type": "numeric", + "granularity": 1, + "value": 369 + } + }, + { + "node": { + "type": "node", + "lhId": "1-0-stop", + "path": "1,HTML,1,BODY,69,SCRIPT,0,NEXTJS-PORTAL,a,#document-fragment,14,DIV,0,DIV,0,DIV,1,DIV,0,DIV,0,BUTTON,0,svg,1,defs,0,linearGradient,0,stop", + "selector": "svg > defs > lineargradient#next_logo_paint0_linear_1357_10853 > stop", + "boundingRect": { + "top": 0, + "bottom": 0, + "left": 0, + "right": 0, + "width": 0, + "height": 0 + }, + "snippet": "", + "nodeLabel": "svg > defs > lineargradient#next_logo_paint0_linear_1357_10853 > stop" + }, + "statistic": "Maximum DOM Depth", + "value": { + "type": "numeric", + "granularity": 1, + "value": 13 + } + }, + { + "node": { + "type": "node", + "lhId": "1-1-BODY", + "path": "1,HTML,1,BODY", + "selector": "body.__variable_3d8a48", + "boundingRect": { + "top": 0, + "bottom": 823, + "left": 0, + "right": 412, + "width": 412, + "height": 823 + }, + "snippet": "", + "nodeLabel": "body.__variable_3d8a48" + }, + "statistic": "Maximum Child Elements", + "value": { + "type": "numeric", + "granularity": 1, + "value": 73 + } + } + ] + }, + "guidanceLevel": 1 + }, + "no-document-write": { + "id": "no-document-write", + "title": "Avoids `document.write()`", + "description": "For users on slow connections, external scripts dynamically injected via `document.write()` can delay page load by tens of seconds. [Learn how to avoid document.write()](https://developer.chrome.com/docs/lighthouse/best-practices/no-document-write/).", + "score": 1, + "scoreDisplayMode": "metricSavings", + "details": { + "type": "table", + "headings": [ + { + "key": "source", + "valueType": "source-location", + "label": "Source" + } + ], + "items": [] + }, + "guidanceLevel": 2 + }, + "uses-http2": { + "id": "uses-http2", + "title": "Use HTTP/2", + "description": "HTTP/2 offers many benefits over HTTP/1.1, including binary headers and multiplexing. [Learn more about HTTP/2](https://developer.chrome.com/docs/lighthouse/best-practices/uses-http2/).", + "score": 1, + "scoreDisplayMode": "metricSavings", + "numericValue": 0, + "numericUnit": "millisecond", + "metricSavings": { + "LCP": 0, + "FCP": 0 + }, + "details": { + "type": "opportunity", + "headings": [], + "items": [], + "overallSavingsMs": 0 + }, + "guidanceLevel": 3 + }, + "uses-passive-event-listeners": { + "id": "uses-passive-event-listeners", + "title": "Does not use passive listeners to improve scrolling performance", + "description": "Consider marking your touch and wheel event listeners as `passive` to improve your page's scroll performance. [Learn more about adopting passive event listeners](https://developer.chrome.com/docs/lighthouse/best-practices/uses-passive-event-listeners/).", + "score": 0.5, + "scoreDisplayMode": "metricSavings", + "details": { + "type": "table", + "headings": [ + { + "key": "source", + "valueType": "source-location", + "label": "Source" + } + ], + "items": [ + { + "source": { + "type": "source-location", + "url": "webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/three-stdlib@2.36.1_three@0.184.0/node_modules/three-stdlib/controls/OrbitControls.js", + "urlProvider": "network", + "line": 310, + "column": 23 + } + } + ] + }, + "guidanceLevel": 3 + }, + "bf-cache": { + "id": "bf-cache", + "title": "Page prevented back/forward cache restoration", + "description": "Many navigations are performed by going back to a previous page, or forwards again. The back/forward cache (bfcache) can speed up these return navigations. [Learn more about the bfcache](https://developer.chrome.com/docs/lighthouse/performance/bf-cache/)", + "score": 0, + "scoreDisplayMode": "binary", + "displayValue": "3 failure reasons", + "details": { + "type": "table", + "headings": [ + { + "key": "reason", + "valueType": "text", + "subItemsHeading": { + "key": "frameUrl", + "valueType": "url" + }, + "label": "Failure reason" + }, + { + "key": "failureType", + "valueType": "text", + "label": "Failure type" + } + ], + "items": [ + { + "reason": "Pages with WebSocket cannot enter back/forward cache.", + "failureType": "Pending browser support", + "subItems": { + "type": "subitems", + "items": [ + { + "frameUrl": "http://localhost:3000/ScriptHammer/game/3d/" + } + ] + }, + "protocolReason": "WebSocket" + }, + { + "reason": "Pages whose main resource has cache-control:no-store cannot enter back/forward cache.", + "failureType": "Not actionable", + "subItems": { + "type": "subitems", + "items": [ + { + "frameUrl": "http://localhost:3000/ScriptHammer/game/3d/" + } + ] + }, + "protocolReason": "MainResourceHasCacheControlNoStore" + }, + { + "reason": "WebSocketUsedWithCCNS", + "failureType": "Not actionable", + "subItems": { + "type": "subitems", + "items": [ + { + "frameUrl": "http://localhost:3000/ScriptHammer/game/3d/" + } + ] + }, + "protocolReason": "WebSocketUsedWithCCNS" + } + ] + }, + "guidanceLevel": 4 + }, + "cache-insight": { + "id": "cache-insight", + "title": "Use efficient cache lifetimes", + "description": "A long cache lifetime can speed up repeat visits to your page. [Learn more](https://web.dev/uses-long-cache-ttl/).", + "score": 1, + "scoreDisplayMode": "metricSavings", + "metricSavings": { + "FCP": 0, + "LCP": 0 + }, + "details": { + "type": "table", + "headings": [ + { + "key": "url", + "valueType": "url", + "label": "Request" + }, + { + "key": "cacheLifetimeMs", + "valueType": "ms", + "label": "Cache TTL", + "displayUnit": "duration" + }, + { + "key": "totalBytes", + "valueType": "bytes", + "label": "Transfer Size", + "displayUnit": "kb", + "granularity": 1 + } + ], + "items": [], + "debugData": { + "type": "debugdata", + "wastedBytes": 0 + } + }, + "guidanceLevel": 3, + "replacesAudits": ["uses-long-cache-ttl"] + }, + "cls-culprits-insight": { + "id": "cls-culprits-insight", + "title": "Layout shift culprits", + "description": "Layout shifts occur when elements move absent any user interaction. [Investigate the causes of layout shifts](https://web.dev/articles/optimize-cls), such as elements being added, removed, or their fonts changing as the page loads.", + "score": 0, + "scoreDisplayMode": "numeric", + "metricSavings": { + "CLS": 0 + }, + "details": { + "type": "list", + "items": [ + { + "type": "table", + "headings": [ + { + "key": "node", + "valueType": "node", + "subItemsHeading": { + "key": "extra" + }, + "label": "Element" + }, + { + "key": "score", + "valueType": "numeric", + "subItemsHeading": { + "key": "cause", + "valueType": "text" + }, + "granularity": 0.001, + "label": "Layout shift score" + } + ], + "items": [ + { + "node": { + "type": "text", + "value": "Total" + }, + "score": 0.120931 + }, + { + "score": 0.10213 + }, + { + "score": 0.018801 + } + ] + } + ] + }, + "guidanceLevel": 3, + "replacesAudits": [ + "layout-shifts", + "non-composited-animations", + "unsized-images" + ] + }, + "document-latency-insight": { + "id": "document-latency-insight", + "title": "Document request latency", + "description": "Your first network request is the most important. Reduce its latency by avoiding redirects, ensuring a fast server response, and enabling text compression.", + "score": 1, + "scoreDisplayMode": "metricSavings", + "metricSavings": { + "FCP": 0, + "LCP": 0 + }, + "details": { + "type": "checklist", + "items": { + "noRedirects": { + "label": "Avoids redirects", + "value": true + }, + "serverResponseIsFast": { + "label": "Server responds quickly (observed 72 ms)", + "value": true + }, + "usesCompression": { + "label": "Applies text compression", + "value": true + } + }, + "debugData": { + "type": "debugdata", + "redirectDuration": 0, + "serverResponseTime": 72, + "uncompressedResponseBytes": 0, + "wastedBytes": 0 + } + }, + "guidanceLevel": 3, + "replacesAudits": [ + "redirects", + "server-response-time", + "uses-text-compression" + ] + }, + "dom-size-insight": { + "id": "dom-size-insight", + "title": "Optimize DOM size", + "description": "A large DOM can increase the duration of style calculations and layout reflows, impacting page responsiveness. A large DOM will also increase memory usage. [Learn how to avoid an excessive DOM size](https://developer.chrome.com/docs/lighthouse/performance/dom-size/).", + "score": 1, + "scoreDisplayMode": "numeric", + "metricSavings": { + "INP": 0 + }, + "details": { + "type": "table", + "headings": [ + { + "key": "statistic", + "valueType": "text", + "label": "Statistic" + }, + { + "key": "node", + "valueType": "node", + "label": "Element" + }, + { + "key": "value", + "valueType": "numeric", + "label": "Value" + } + ], + "items": [ + { + "statistic": "Total elements", + "value": { + "type": "numeric", + "granularity": 1, + "value": 371 + } + }, + { + "statistic": "Most children", + "value": { + "type": "numeric", + "granularity": 1, + "value": 73 + } + }, + { + "statistic": "DOM depth", + "value": { + "type": "numeric", + "granularity": 1, + "value": 13 + } + } + ], + "debugData": { + "type": "debugdata", + "totalElements": 371, + "maxChildren": 73, + "maxDepth": 13 + } + }, + "guidanceLevel": 3, + "replacesAudits": ["dom-size"] + }, + "duplicated-javascript-insight": { + "id": "duplicated-javascript-insight", + "title": "Duplicated JavaScript", + "description": "Remove large, duplicate JavaScript modules from bundles to reduce unnecessary bytes consumed by network activity.", + "score": 1, + "scoreDisplayMode": "metricSavings", + "metricSavings": { + "FCP": 0, + "LCP": 0 + }, + "details": { + "type": "table", + "headings": [ + { + "key": "source", + "valueType": "code", + "subItemsHeading": { + "key": "url", + "valueType": "url" + }, + "label": "Source" + }, + { + "key": "wastedBytes", + "valueType": "bytes", + "subItemsHeading": { + "key": "sourceTransferBytes" + }, + "granularity": 10, + "label": "Duplicated bytes" + } + ], + "items": [], + "debugData": { + "type": "debugdata", + "wastedBytes": 0 + } + }, + "guidanceLevel": 2, + "replacesAudits": ["duplicated-javascript"] + }, + "font-display-insight": { + "id": "font-display-insight", + "title": "Font display", + "description": "Consider setting [font-display](https://developer.chrome.com/blog/font-display) to swap or optional to ensure text is consistently visible. swap can be further optimized to mitigate layout shifts with [font metric overrides](https://developer.chrome.com/blog/font-fallbacks).", + "score": 1, + "scoreDisplayMode": "metricSavings", + "metricSavings": { + "INP": 0 + }, + "details": { + "type": "table", + "headings": [ + { + "key": "url", + "valueType": "url", + "label": "URL" + }, + { + "key": "wastedMs", + "valueType": "ms", + "label": "Est Savings" + } + ], + "items": [] + }, + "guidanceLevel": 3, + "replacesAudits": ["font-display"] + }, + "forced-reflow-insight": { + "id": "forced-reflow-insight", + "title": "Forced reflow", + "description": "A forced reflow occurs when JavaScript queries geometric properties (such as offsetWidth) after styles have been invalidated by a change to the DOM state. This can result in poor performance. Learn more about [forced reflows](https://developers.google.com/web/fundamentals/performance/rendering/avoid-large-complex-layouts-and-layout-thrashing#avoid-forced-synchronous-layouts) and possible mitigations.", + "score": 0, + "scoreDisplayMode": "numeric", + "details": { + "type": "list", + "items": [ + { + "type": "table", + "headings": [ + { + "key": "source", + "valueType": "source-location", + "label": "Source" + }, + { + "key": "reflowTime", + "valueType": "ms", + "granularity": 1, + "label": "Total reflow time" + } + ], + "items": [ + { + "source": { + "type": "text", + "value": "[unattributed]" + }, + "reflowTime": 26.543 + } + ] + } + ] + }, + "guidanceLevel": 3 + }, + "image-delivery-insight": { + "id": "image-delivery-insight", + "title": "Improve image delivery", + "description": "Reducing the download time of images can improve the perceived load time of the page and LCP. [Learn more about optimizing image size](https://developer.chrome.com/docs/lighthouse/performance/uses-optimized-images/)", + "score": 1, + "scoreDisplayMode": "metricSavings", + "metricSavings": { + "FCP": 0, + "LCP": 0 + }, + "details": { + "type": "table", + "headings": [ + { + "key": "url", + "valueType": "url", + "label": "URL", + "subItemsHeading": { + "key": "reason", + "valueType": "text" + } + }, + { + "key": "totalBytes", + "valueType": "bytes", + "label": "Resource Size" + }, + { + "key": "wastedBytes", + "valueType": "bytes", + "label": "Est Savings", + "subItemsHeading": { + "key": "wastedBytes", + "valueType": "bytes" + } + } + ], + "items": [], + "debugData": { + "type": "debugdata", + "wastedBytes": 0 + } + }, + "guidanceLevel": 3, + "replacesAudits": [ + "modern-image-formats", + "uses-optimized-images", + "efficient-animated-content", + "uses-responsive-images" + ] + }, + "inp-breakdown-insight": { + "id": "inp-breakdown-insight", + "title": "INP breakdown", + "description": "Start investigating with the longest subpart. [Delays can be minimized](https://web.dev/articles/optimize-inp#optimize_interactions). To reduce processing duration, [optimize the main-thread costs](https://web.dev/articles/optimize-long-tasks), often JS.", + "score": null, + "scoreDisplayMode": "notApplicable", + "guidanceLevel": 3, + "replacesAudits": ["work-during-interaction"] + }, + "lcp-breakdown-insight": { + "id": "lcp-breakdown-insight", + "title": "LCP breakdown", + "description": "Each [subpart has specific improvement strategies](https://web.dev/articles/optimize-lcp#lcp-breakdown). Ideally, most of the LCP time should be spent on loading the resources, not within delays.", + "score": 1, + "scoreDisplayMode": "informative", + "metricSavings": { + "LCP": 0 + }, + "details": { + "type": "list", + "items": [ + { + "type": "table", + "headings": [ + { + "key": "label", + "valueType": "text", + "label": "Subpart" + }, + { + "key": "duration", + "valueType": "ms", + "label": "Duration" + } + ], + "items": [ + { + "subpart": "timeToFirstByte", + "label": "Time to first byte", + "duration": 74.29899993896484 + }, + { + "subpart": "elementRenderDelay", + "label": "Element render delay", + "duration": 1669.6850000610352 + } + ] + } + ] + }, + "guidanceLevel": 3, + "replacesAudits": ["largest-contentful-paint-element"] + }, + "lcp-discovery-insight": { + "id": "lcp-discovery-insight", + "title": "LCP request discovery", + "description": "Optimize LCP by making the LCP image [discoverable](https://web.dev/articles/optimize-lcp#1_eliminate_resource_load_delay) from the HTML immediately, and [avoiding lazy-loading](https://web.dev/articles/lcp-lazy-loading)", + "score": null, + "scoreDisplayMode": "notApplicable", + "guidanceLevel": 3, + "replacesAudits": ["prioritize-lcp-image", "lcp-lazy-loaded"] + }, + "legacy-javascript-insight": { + "id": "legacy-javascript-insight", + "title": "Legacy JavaScript", + "description": "Polyfills and transforms enable older browsers to use new JavaScript features. However, many aren't necessary for modern browsers. Consider modifying your JavaScript build process to not transpile [Baseline](https://web.dev/articles/baseline-and-polyfills) features, unless you know you must support older browsers. [Learn why most sites can deploy ES6+ code without transpiling](https://philipwalton.com/articles/the-state-of-es5-on-the-web/)", + "score": 0, + "scoreDisplayMode": "metricSavings", + "displayValue": "Est savings of 12 KiB", + "metricSavings": { + "FCP": 0, + "LCP": 150 + }, + "details": { + "type": "table", + "headings": [ + { + "key": "url", + "valueType": "url", + "subItemsHeading": { + "key": "location", + "valueType": "source-location" + }, + "label": "URL" + }, + { + "key": null, + "valueType": "code", + "subItemsHeading": { + "key": "signal" + }, + "label": "" + }, + { + "key": "wastedBytes", + "valueType": "bytes", + "label": "Wasted bytes" + } + ], + "items": [ + { + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/vendor.js?v=1779072363202", + "wastedBytes": 12202, + "subItems": { + "type": "subitems", + "items": [ + { + "signal": "@babel/plugin-transform-classes", + "location": { + "type": "source-location", + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/vendor.js?v=1779072363202", + "urlProvider": "network", + "line": 2245, + "column": 116470 + } + }, + { + "signal": "@babel/plugin-transform-spread", + "location": { + "type": "source-location", + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/vendor.js?v=1779072363202", + "urlProvider": "network", + "line": 2245, + "column": 561198 + } + }, + { + "signal": "Array.prototype.at", + "location": { + "type": "source-location", + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/vendor.js?v=1779072363202", + "urlProvider": "network", + "line": 982, + "column": 1029 + } + }, + { + "signal": "Array.prototype.flat", + "location": { + "type": "source-location", + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/vendor.js?v=1779072363202", + "urlProvider": "network", + "line": 982, + "column": 415 + } + }, + { + "signal": "Array.prototype.flatMap", + "location": { + "type": "source-location", + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/vendor.js?v=1779072363202", + "urlProvider": "network", + "line": 982, + "column": 528 + } + }, + { + "signal": "Object.fromEntries", + "location": { + "type": "source-location", + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/vendor.js?v=1779072363202", + "urlProvider": "network", + "line": 982, + "column": 906 + } + }, + { + "signal": "Object.hasOwn", + "location": { + "type": "source-location", + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/vendor.js?v=1779072363202", + "urlProvider": "network", + "line": 982, + "column": 1164 + } + }, + { + "signal": "Promise.allSettled", + "location": { + "type": "source-location", + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/vendor.js?v=1779072363202", + "urlProvider": "network", + "line": 874, + "column": 41369 + } + }, + { + "signal": "Promise.any", + "location": { + "type": "source-location", + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/vendor.js?v=1779072363202", + "urlProvider": "network", + "line": 874, + "column": 41475 + } + }, + { + "signal": "String.prototype.trimEnd", + "location": { + "type": "source-location", + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/vendor.js?v=1779072363202", + "urlProvider": "network", + "line": 982, + "column": 151 + } + }, + { + "signal": "String.prototype.trimStart", + "location": { + "type": "source-location", + "url": "http://localhost:3000/ScriptHammer/_next/static/chunks/vendor.js?v=1779072363202", + "urlProvider": "network", + "line": 982, + "column": 64 + } + } + ] + } + } + ], + "debugData": { + "type": "debugdata", + "wastedBytes": 12202 + } + }, + "guidanceLevel": 2 + }, + "modern-http-insight": { + "id": "modern-http-insight", + "title": "Modern HTTP", + "description": "HTTP/2 and HTTP/3 offer many benefits over HTTP/1.1, such as multiplexing. [Learn more about using modern HTTP](https://developer.chrome.com/docs/lighthouse/best-practices/uses-http2/).", + "score": 1, + "scoreDisplayMode": "metricSavings", + "metricSavings": { + "FCP": 0, + "LCP": 0 + }, + "details": { + "type": "table", + "headings": [ + { + "key": "url", + "valueType": "url", + "label": "URL" + }, + { + "key": "protocol", + "valueType": "text", + "label": "Protocol" + } + ], + "items": [] + }, + "guidanceLevel": 3 + }, + "network-dependency-tree-insight": { + "id": "network-dependency-tree-insight", + "title": "Network dependency tree", + "description": "[Avoid chaining critical requests](https://developer.chrome.com/docs/lighthouse/performance/critical-request-chains) by reducing the length of chains, reducing the download size of resources, or deferring the download of unnecessary resources to improve page load.", + "score": 0, + "scoreDisplayMode": "numeric", + "metricSavings": { + "LCP": 0 + }, + "details": { + "type": "list", + "items": [ + { + "type": "list-section", + "value": { + "type": "network-tree", + "chains": { + "07210F1B04EB2927D6778F9411707D6E": { + "url": "http://localhost:3000/ScriptHammer/game/3d/", + "navStartToEndTime": 131, + "transferSize": 18846, + "isLongest": true, + "children": { + "949.7": { + "url": "http://localhost:3000/ScriptHammer/_next/static/css/app/layout.css?v=1779072363202", + "navStartToEndTime": 118, + "transferSize": 43700, + "children": {} + } + } + } + }, + "longestChain": { + "duration": 131 + } + } + }, + { + "type": "list-section", + "title": "Preconnected origins", + "description": "[preconnect](https://developer.chrome.com/docs/lighthouse/performance/uses-rel-preconnect/) hints help the browser establish a connection earlier in the page load, saving time when the first request for that origin is made. The following are the origins that the page preconnected to.", + "value": { + "type": "text", + "value": "no origins were preconnected" + } + }, + { + "type": "list-section", + "title": "Preconnect candidates", + "description": "Add [preconnect](https://developer.chrome.com/docs/lighthouse/performance/uses-rel-preconnect/) hints to your most important origins, but try to use no more than 4.", + "value": { + "type": "text", + "value": "No additional origins are good candidates for preconnecting" + } + } + ] + }, + "guidanceLevel": 1, + "replacesAudits": ["critical-request-chains", "uses-rel-preconnect"] + }, + "render-blocking-insight": { + "id": "render-blocking-insight", + "title": "Render blocking requests", + "description": "Requests are blocking the page's initial render, which may delay LCP. [Deferring or inlining](https://web.dev/learn/performance/understanding-the-critical-path#render-blocking_resources) can move these network requests out of the critical path.", + "score": 0, + "scoreDisplayMode": "metricSavings", + "displayValue": "Est savings of 280 ms", + "metricSavings": { + "FCP": 300, + "LCP": 300 + }, + "details": { + "type": "table", + "headings": [ + { + "key": "url", + "valueType": "url", + "label": "URL" + }, + { + "key": "totalBytes", + "valueType": "bytes", + "label": "Transfer Size" + }, + { + "key": "wastedMs", + "valueType": "timespanMs", + "label": "Duration" + } + ], + "items": [ + { + "url": "http://localhost:3000/ScriptHammer/_next/static/css/app/layout.css?v=1779072363202", + "totalBytes": 43700, + "wastedMs": 307 + } + ] + }, + "guidanceLevel": 3, + "replacesAudits": ["render-blocking-resources"] + }, + "third-parties-insight": { + "id": "third-parties-insight", + "title": "3rd parties", + "description": "3rd party code can significantly impact load performance. [Reduce and defer loading of 3rd party code](https://web.dev/articles/optimizing-content-efficiency-loading-third-party-javascript/) to prioritize your page's content.", + "score": 1, + "scoreDisplayMode": "numeric", + "details": { + "type": "table", + "headings": [ + { + "key": "entity", + "valueType": "text", + "label": "3rd party", + "subItemsHeading": { + "key": "url", + "valueType": "url" + } + }, + { + "key": "transferSize", + "granularity": 1, + "valueType": "bytes", + "label": "Transfer size", + "subItemsHeading": { + "key": "transferSize" + } + }, + { + "key": "mainThreadTime", + "granularity": 1, + "valueType": "ms", + "label": "Main thread time", + "subItemsHeading": { + "key": "mainThreadTime" + } + } + ], + "items": [] + }, + "guidanceLevel": 3, + "replacesAudits": ["third-party-summary"] + }, + "viewport-insight": { + "id": "viewport-insight", + "title": "Optimize viewport for mobile", + "description": "Tap interactions may be [delayed by up to 300 ms](https://developer.chrome.com/blog/300ms-tap-delay-gone-away/) if the viewport is not optimized for mobile.", + "score": 1, + "scoreDisplayMode": "numeric", + "metricSavings": { + "INP": 0 + }, + "details": { + "type": "table", + "headings": [ + { + "key": "node", + "valueType": "node", + "label": "" + } + ], + "items": [{}] + }, + "guidanceLevel": 3, + "replacesAudits": ["viewport"] + } + }, + "configSettings": { + "output": ["json"], + "maxWaitForFcp": 30000, + "maxWaitForLoad": 45000, + "pauseAfterFcpMs": 1000, + "pauseAfterLoadMs": 1000, + "networkQuietThresholdMs": 1000, + "cpuQuietThresholdMs": 1000, + "formFactor": "mobile", + "throttling": { + "rttMs": 150, + "throughputKbps": 1638, + "requestLatencyMs": 562.5, + "downloadThroughputKbps": 1474.5600000000002, + "uploadThroughputKbps": 675, + "cpuSlowdownMultiplier": 4 + }, + "throttlingMethod": "simulate", + "screenEmulation": { + "mobile": true, + "width": 412, + "height": 823, + "deviceScaleFactor": 1.75, + "disabled": false + }, + "emulatedUserAgent": "Mozilla/5.0 (Linux; Android 11; moto g power (2022)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Mobile Safari/537.36", + "auditMode": false, + "gatherMode": false, + "clearStorageTypes": [ + "file_systems", + "shader_cache", + "service_workers", + "cache_storage" + ], + "disableStorageReset": false, + "debugNavigation": false, + "channel": "cli", + "usePassiveGathering": false, + "disableFullPageScreenshot": false, + "skipAboutBlank": false, + "blankPage": "about:blank", + "ignoreStatusCode": false, + "locale": "en-US", + "blockedUrlPatterns": null, + "additionalTraceCategories": null, + "extraHeaders": null, + "precomputedLanternData": null, + "onlyAudits": null, + "onlyCategories": ["performance"], + "skipAudits": null + }, + "categories": { + "performance": { + "title": "Performance", + "supportedModes": ["navigation", "timespan", "snapshot"], + "auditRefs": [ + { + "id": "first-contentful-paint", + "weight": 10, + "group": "metrics", + "acronym": "FCP" + }, + { + "id": "largest-contentful-paint", + "weight": 25, + "group": "metrics", + "acronym": "LCP" + }, + { + "id": "total-blocking-time", + "weight": 30, + "group": "metrics", + "acronym": "TBT" + }, + { + "id": "cumulative-layout-shift", + "weight": 25, + "group": "metrics", + "acronym": "CLS" + }, + { + "id": "speed-index", + "weight": 10, + "group": "metrics", + "acronym": "SI" + }, + { + "id": "cache-insight", + "weight": 0, + "group": "hidden" + }, + { + "id": "cls-culprits-insight", + "weight": 0, + "group": "hidden" + }, + { + "id": "document-latency-insight", + "weight": 0, + "group": "hidden" + }, + { + "id": "dom-size-insight", + "weight": 0, + "group": "hidden" + }, + { + "id": "duplicated-javascript-insight", + "weight": 0, + "group": "hidden" + }, + { + "id": "font-display-insight", + "weight": 0, + "group": "hidden" + }, + { + "id": "forced-reflow-insight", + "weight": 0, + "group": "hidden" + }, + { + "id": "image-delivery-insight", + "weight": 0, + "group": "hidden" + }, + { + "id": "inp-breakdown-insight", + "weight": 0, + "group": "hidden" + }, + { + "id": "lcp-breakdown-insight", + "weight": 0, + "group": "hidden" + }, + { + "id": "lcp-discovery-insight", + "weight": 0, + "group": "hidden" + }, + { + "id": "legacy-javascript-insight", + "weight": 0, + "group": "hidden" + }, + { + "id": "modern-http-insight", + "weight": 0, + "group": "hidden" + }, + { + "id": "network-dependency-tree-insight", + "weight": 0, + "group": "hidden" + }, + { + "id": "render-blocking-insight", + "weight": 0, + "group": "hidden" + }, + { + "id": "third-parties-insight", + "weight": 0, + "group": "hidden" + }, + { + "id": "viewport-insight", + "weight": 0, + "group": "hidden" + }, + { + "id": "interactive", + "weight": 0, + "group": "hidden", + "acronym": "TTI" + }, + { + "id": "max-potential-fid", + "weight": 0, + "group": "hidden" + }, + { + "id": "first-meaningful-paint", + "weight": 0, + "acronym": "FMP", + "group": "hidden" + }, + { + "id": "render-blocking-resources", + "weight": 0, + "group": "diagnostics" + }, + { + "id": "uses-responsive-images", + "weight": 0, + "group": "diagnostics" + }, + { + "id": "offscreen-images", + "weight": 0, + "group": "diagnostics" + }, + { + "id": "unminified-css", + "weight": 0, + "group": "diagnostics" + }, + { + "id": "unminified-javascript", + "weight": 0, + "group": "diagnostics" + }, + { + "id": "unused-css-rules", + "weight": 0, + "group": "diagnostics" + }, + { + "id": "unused-javascript", + "weight": 0, + "group": "diagnostics" + }, + { + "id": "uses-optimized-images", + "weight": 0, + "group": "diagnostics" + }, + { + "id": "modern-image-formats", + "weight": 0, + "group": "diagnostics" + }, + { + "id": "uses-text-compression", + "weight": 0, + "group": "diagnostics" + }, + { + "id": "uses-rel-preconnect", + "weight": 0, + "group": "diagnostics" + }, + { + "id": "server-response-time", + "weight": 0, + "group": "diagnostics" + }, + { + "id": "redirects", + "weight": 0, + "group": "diagnostics" + }, + { + "id": "uses-http2", + "weight": 0, + "group": "diagnostics" + }, + { + "id": "efficient-animated-content", + "weight": 0, + "group": "diagnostics" + }, + { + "id": "duplicated-javascript", + "weight": 0, + "group": "diagnostics" + }, + { + "id": "legacy-javascript", + "weight": 0, + "group": "diagnostics" + }, + { + "id": "prioritize-lcp-image", + "weight": 0, + "group": "diagnostics" + }, + { + "id": "total-byte-weight", + "weight": 0, + "group": "diagnostics" + }, + { + "id": "uses-long-cache-ttl", + "weight": 0, + "group": "diagnostics" + }, + { + "id": "dom-size", + "weight": 0, + "group": "diagnostics" + }, + { + "id": "critical-request-chains", + "weight": 0, + "group": "diagnostics" + }, + { + "id": "user-timings", + "weight": 0, + "group": "diagnostics" + }, + { + "id": "bootup-time", + "weight": 0, + "group": "diagnostics" + }, + { + "id": "mainthread-work-breakdown", + "weight": 0, + "group": "diagnostics" + }, + { + "id": "font-display", + "weight": 0, + "group": "diagnostics" + }, + { + "id": "third-party-summary", + "weight": 0, + "group": "diagnostics" + }, + { + "id": "third-party-facades", + "weight": 0, + "group": "diagnostics" + }, + { + "id": "largest-contentful-paint-element", + "weight": 0, + "group": "diagnostics" + }, + { + "id": "lcp-lazy-loaded", + "weight": 0, + "group": "diagnostics" + }, + { + "id": "layout-shifts", + "weight": 0, + "group": "diagnostics" + }, + { + "id": "uses-passive-event-listeners", + "weight": 0, + "group": "diagnostics" + }, + { + "id": "no-document-write", + "weight": 0, + "group": "diagnostics" + }, + { + "id": "long-tasks", + "weight": 0, + "group": "diagnostics" + }, + { + "id": "non-composited-animations", + "weight": 0, + "group": "diagnostics" + }, + { + "id": "unsized-images", + "weight": 0, + "group": "diagnostics" + }, + { + "id": "viewport", + "weight": 0, + "group": "diagnostics" + }, + { + "id": "bf-cache", + "weight": 0, + "group": "diagnostics" + }, + { + "id": "network-requests", + "weight": 0, + "group": "hidden" + }, + { + "id": "network-rtt", + "weight": 0, + "group": "hidden" + }, + { + "id": "network-server-latency", + "weight": 0, + "group": "hidden" + }, + { + "id": "main-thread-tasks", + "weight": 0, + "group": "hidden" + }, + { + "id": "diagnostics", + "weight": 0, + "group": "hidden" + }, + { + "id": "metrics", + "weight": 0, + "group": "hidden" + }, + { + "id": "screenshot-thumbnails", + "weight": 0, + "group": "hidden" + }, + { + "id": "final-screenshot", + "weight": 0, + "group": "hidden" + }, + { + "id": "script-treemap-data", + "weight": 0, + "group": "hidden" + }, + { + "id": "resource-summary", + "weight": 0, + "group": "hidden" + } + ], + "id": "performance", + "score": 0.41 + } + }, + "categoryGroups": { + "metrics": { + "title": "Metrics" + }, + "insights": { + "title": "Insights", + "description": "These insights are also available in the Chrome DevTools Performance Panel - [record a trace](https://developer.chrome.com/docs/devtools/performance/reference) to view more detailed information." + }, + "diagnostics": { + "title": "Diagnostics", + "description": "More information about the performance of your application. These numbers don't [directly affect](https://developer.chrome.com/docs/lighthouse/performance/performance-scoring/) the Performance score." + }, + "a11y-best-practices": { + "title": "Best practices", + "description": "These items highlight common accessibility best practices." + }, + "a11y-color-contrast": { + "title": "Contrast", + "description": "These are opportunities to improve the legibility of your content." + }, + "a11y-names-labels": { + "title": "Names and labels", + "description": "These are opportunities to improve the semantics of the controls in your application. This may enhance the experience for users of assistive technology, like a screen reader." + }, + "a11y-navigation": { + "title": "Navigation", + "description": "These are opportunities to improve keyboard navigation in your application." + }, + "a11y-aria": { + "title": "ARIA", + "description": "These are opportunities to improve the usage of ARIA in your application which may enhance the experience for users of assistive technology, like a screen reader." + }, + "a11y-language": { + "title": "Internationalization and localization", + "description": "These are opportunities to improve the interpretation of your content by users in different locales." + }, + "a11y-audio-video": { + "title": "Audio and video", + "description": "These are opportunities to provide alternative content for audio and video. This may improve the experience for users with hearing or vision impairments." + }, + "a11y-tables-lists": { + "title": "Tables and lists", + "description": "These are opportunities to improve the experience of reading tabular or list data using assistive technology, like a screen reader." + }, + "seo-mobile": { + "title": "Mobile Friendly", + "description": "Make sure your pages are mobile friendly so users don’t have to pinch or zoom in order to read the content pages. [Learn how to make pages mobile-friendly](https://developers.google.com/search/mobile-sites/)." + }, + "seo-content": { + "title": "Content Best Practices", + "description": "Format your HTML in a way that enables crawlers to better understand your app’s content." + }, + "seo-crawl": { + "title": "Crawling and Indexing", + "description": "To appear in search results, crawlers need access to your app." + }, + "best-practices-trust-safety": { + "title": "Trust and Safety" + }, + "best-practices-ux": { + "title": "User Experience" + }, + "best-practices-browser-compat": { + "title": "Browser Compatibility" + }, + "best-practices-general": { + "title": "General" + }, + "hidden": { + "title": "" + } + }, + "stackPacks": [], + "entities": [ + { + "name": "localhost", + "origins": ["http://localhost:3000"], + "isFirstParty": true, + "isUnrecognized": true + } + ], + "fullPageScreenshot": { + "screenshot": { + "data": "data:image/webp;base64,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", + "width": 412, + "height": 823 + }, + "nodes": { + "1-0-stop": { + "id": "", + "top": 0, + "bottom": 0, + "left": 0, + "right": 0, + "width": 0, + "height": 0 + }, + "1-1-BODY": { + "id": "", + "top": 0, + "bottom": 823, + "left": 0, + "right": 412, + "width": 412, + "height": 823 + }, + "1-2-IMG": { + "id": "", + "top": 24, + "bottom": 45, + "left": 65, + "right": 86, + "width": 21, + "height": 21 + }, + "1-3-IMG": { + "id": "", + "top": 10, + "bottom": 54, + "left": 56, + "right": 100, + "width": 43, + "height": 43 + }, + "1-4-IMG": { + "id": "", + "top": 21, + "bottom": 43, + "left": 67, + "right": 89, + "width": 22, + "height": 22 + }, + "1-5-LINK": { + "id": "", + "top": 0, + "bottom": 0, + "left": 0, + "right": 0, + "width": 0, + "height": 0 + }, + "1-6-LINK": { + "id": "", + "top": 0, + "bottom": 0, + "left": 0, + "right": 0, + "width": 0, + "height": 0 + }, + "1-7-LINK": { + "id": "", + "top": 0, + "bottom": 0, + "left": 0, + "right": 0, + "width": 0, + "height": 0 + }, + "1-8-LINK": { + "id": "", + "top": 0, + "bottom": 0, + "left": 0, + "right": 0, + "width": 0, + "height": 0 + }, + "1-9-LINK": { + "id": "", + "top": 0, + "bottom": 0, + "left": 0, + "right": 0, + "width": 0, + "height": 0 + }, + "1-10-LINK": { + "id": "", + "top": 0, + "bottom": 0, + "left": 0, + "right": 0, + "width": 0, + "height": 0 + }, + "1-11-LINK": { + "id": "", + "top": 0, + "bottom": 0, + "left": 0, + "right": 0, + "width": 0, + "height": 0 + }, + "1-12-LINK": { + "id": "", + "top": 0, + "bottom": 0, + "left": 0, + "right": 0, + "width": 0, + "height": 0 + }, + "1-13-LINK": { + "id": "", + "top": 0, + "bottom": 0, + "left": 0, + "right": 0, + "width": 0, + "height": 0 + }, + "1-14-LINK": { + "id": "", + "top": 0, + "bottom": 0, + "left": 0, + "right": 0, + "width": 0, + "height": 0 + }, + "1-15-LINK": { + "id": "", + "top": 0, + "bottom": 0, + "left": 0, + "right": 0, + "width": 0, + "height": 0 + }, + "1-16-LINK": { + "id": "", + "top": 0, + "bottom": 0, + "left": 0, + "right": 0, + "width": 0, + "height": 0 + }, + "1-17-META": { + "id": "", + "top": 0, + "bottom": 0, + "left": 0, + "right": 0, + "width": 0, + "height": 0 + }, + "1-18-META": { + "id": "", + "top": 0, + "bottom": 0, + "left": 0, + "right": 0, + "width": 0, + "height": 0 + }, + "1-19-META": { + "id": "", + "top": 0, + "bottom": 0, + "left": 0, + "right": 0, + "width": 0, + "height": 0 + }, + "1-20-META": { + "id": "", + "top": 0, + "bottom": 0, + "left": 0, + "right": 0, + "width": 0, + "height": 0 + }, + "1-21-META": { + "id": "", + "top": 0, + "bottom": 0, + "left": 0, + "right": 0, + "width": 0, + "height": 0 + } + } + }, + "timing": { + "entries": [ + { + "startTime": 931.89, + "name": "lh:config", + "duration": 412.04, + "entryType": "measure" + }, + { + "startTime": 932.96, + "name": "lh:config:resolveArtifactsToDefns", + "duration": 45.22, + "entryType": "measure" + }, + { + "startTime": 1344.05, + "name": "lh:runner:gather", + "duration": 10361.39, + "entryType": "measure" + }, + { + "startTime": 1385.4, + "name": "lh:driver:connect", + "duration": 8.11, + "entryType": "measure" + }, + { + "startTime": 1393.66, + "name": "lh:driver:navigate", + "duration": 4.86, + "entryType": "measure" + }, + { + "startTime": 1398.72, + "name": "lh:gather:getBenchmarkIndex", + "duration": 1006.83, + "entryType": "measure" + }, + { + "startTime": 2405.67, + "name": "lh:gather:getVersion", + "duration": 0.78, + "entryType": "measure" + }, + { + "startTime": 2406.52, + "name": "lh:gather:getDevicePixelRatio", + "duration": 1.03, + "entryType": "measure" + }, + { + "startTime": 2407.65, + "name": "lh:prepare:navigationMode", + "duration": 51.42, + "entryType": "measure" + }, + { + "startTime": 2423.44, + "name": "lh:storage:clearDataForOrigin", + "duration": 21.68, + "entryType": "measure" + }, + { + "startTime": 2445.25, + "name": "lh:storage:clearBrowserCaches", + "duration": 11.45, + "entryType": "measure" + }, + { + "startTime": 2457.72, + "name": "lh:gather:prepareThrottlingAndNetwork", + "duration": 1.32, + "entryType": "measure" + }, + { + "startTime": 2491.99, + "name": "lh:driver:navigate", + "duration": 3475.17, + "entryType": "measure" + }, + { + "startTime": 7815.67, + "name": "lh:computed:NetworkRecords", + "duration": 1.04, + "entryType": "measure" + }, + { + "startTime": 7817.01, + "name": "lh:gather:getArtifact:DevtoolsLog", + "duration": 0.11, + "entryType": "measure" + }, + { + "startTime": 7817.14, + "name": "lh:gather:getArtifact:Trace", + "duration": 0.04, + "entryType": "measure" + }, + { + "startTime": 7817.19, + "name": "lh:gather:getArtifact:ConsoleMessages", + "duration": 0.04, + "entryType": "measure" + }, + { + "startTime": 7817.23, + "name": "lh:gather:getArtifact:CSSUsage", + "duration": 544.07, + "entryType": "measure" + }, + { + "startTime": 8361.34, + "name": "lh:gather:getArtifact:DOMStats", + "duration": 14.17, + "entryType": "measure" + }, + { + "startTime": 8375.53, + "name": "lh:gather:getArtifact:ImageElements", + "duration": 614.52, + "entryType": "measure" + }, + { + "startTime": 8990.08, + "name": "lh:gather:getArtifact:JsUsage", + "duration": 0.25, + "entryType": "measure" + }, + { + "startTime": 8990.42, + "name": "lh:gather:getArtifact:LinkElements", + "duration": 8.79, + "entryType": "measure" + }, + { + "startTime": 8998.41, + "name": "lh:computed:MainResource", + "duration": 0.16, + "entryType": "measure" + }, + { + "startTime": 8999.23, + "name": "lh:gather:getArtifact:MetaElements", + "duration": 2.6, + "entryType": "measure" + }, + { + "startTime": 9001.86, + "name": "lh:gather:getArtifact:NetworkUserAgent", + "duration": 0.13, + "entryType": "measure" + }, + { + "startTime": 9002.01, + "name": "lh:gather:getArtifact:OptimizedImages", + "duration": 0.3, + "entryType": "measure" + }, + { + "startTime": 9002.33, + "name": "lh:gather:getArtifact:ResponseCompression", + "duration": 4.47, + "entryType": "measure" + }, + { + "startTime": 9006.83, + "name": "lh:gather:getArtifact:Scripts", + "duration": 0.16, + "entryType": "measure" + }, + { + "startTime": 9007.03, + "name": "lh:gather:getArtifact:SourceMaps", + "duration": 0.65, + "entryType": "measure" + }, + { + "startTime": 9007.7, + "name": "lh:gather:getArtifact:Stacks", + "duration": 27.18, + "entryType": "measure" + }, + { + "startTime": 9007.81, + "name": "lh:gather:collectStacks", + "duration": 27.05, + "entryType": "measure" + }, + { + "startTime": 9034.89, + "name": "lh:gather:getArtifact:Stylesheets", + "duration": 31.95, + "entryType": "measure" + }, + { + "startTime": 9066.94, + "name": "lh:gather:getArtifact:TraceElements", + "duration": 1193.32, + "entryType": "measure" + }, + { + "startTime": 9067.34, + "name": "lh:computed:TraceEngineResult", + "duration": 1157.33, + "entryType": "measure" + }, + { + "startTime": 9067.49, + "name": "lh:computed:ProcessedTrace", + "duration": 57.95, + "entryType": "measure" + }, + { + "startTime": 9128.12, + "name": "lh:computed:TraceEngineResult:total", + "duration": 1089.32, + "entryType": "measure" + }, + { + "startTime": 9128.23, + "name": "lh:computed:TraceEngineResult:parse", + "duration": 199.03, + "entryType": "measure" + }, + { + "startTime": 9128.85, + "name": "lh:computed:TraceEngineResult:parse:handleEvent", + "duration": 109.35, + "entryType": "measure" + }, + { + "startTime": 9238.26, + "name": "lh:computed:TraceEngineResult:parse:Meta:finalize", + "duration": 1.51, + "entryType": "measure" + }, + { + "startTime": 9240, + "name": "lh:computed:TraceEngineResult:parse:AnimationFrames:finalize", + "duration": 1.33, + "entryType": "measure" + }, + { + "startTime": 9241.36, + "name": "lh:computed:TraceEngineResult:parse:Animations:finalize", + "duration": 2.41, + "entryType": "measure" + }, + { + "startTime": 9243.8, + "name": "lh:computed:TraceEngineResult:parse:Samples:finalize", + "duration": 1.29, + "entryType": "measure" + }, + { + "startTime": 9245.12, + "name": "lh:computed:TraceEngineResult:parse:AuctionWorklets:finalize", + "duration": 1.22, + "entryType": "measure" + }, + { + "startTime": 9246.36, + "name": "lh:computed:TraceEngineResult:parse:NetworkRequests:finalize", + "duration": 3.2, + "entryType": "measure" + }, + { + "startTime": 9249.59, + "name": "lh:computed:TraceEngineResult:parse:Renderer:finalize", + "duration": 24.81, + "entryType": "measure" + }, + { + "startTime": 9274.47, + "name": "lh:computed:TraceEngineResult:parse:Flows:finalize", + "duration": 5.35, + "entryType": "measure" + }, + { + "startTime": 9279.86, + "name": "lh:computed:TraceEngineResult:parse:AsyncJSCalls:finalize", + "duration": 2.79, + "entryType": "measure" + }, + { + "startTime": 9282.77, + "name": "lh:computed:TraceEngineResult:parse:DOMStats:finalize", + "duration": 1.25, + "entryType": "measure" + }, + { + "startTime": 9284.07, + "name": "lh:computed:TraceEngineResult:parse:UserTimings:finalize", + "duration": 1.65, + "entryType": "measure" + }, + { + "startTime": 9285.74, + "name": "lh:computed:TraceEngineResult:parse:ExtensionTraceData:finalize", + "duration": 4.09, + "entryType": "measure" + }, + { + "startTime": 9289.86, + "name": "lh:computed:TraceEngineResult:parse:LayerTree:finalize", + "duration": 2.05, + "entryType": "measure" + }, + { + "startTime": 9291.94, + "name": "lh:computed:TraceEngineResult:parse:Frames:finalize", + "duration": 8.03, + "entryType": "measure" + }, + { + "startTime": 9300, + "name": "lh:computed:TraceEngineResult:parse:GPU:finalize", + "duration": 1.39, + "entryType": "measure" + }, + { + "startTime": 9301.42, + "name": "lh:computed:TraceEngineResult:parse:ImagePainting:finalize", + "duration": 1.29, + "entryType": "measure" + }, + { + "startTime": 9302.77, + "name": "lh:computed:TraceEngineResult:parse:Initiators:finalize", + "duration": 1.9, + "entryType": "measure" + }, + { + "startTime": 9304.71, + "name": "lh:computed:TraceEngineResult:parse:Invalidations:finalize", + "duration": 1.28, + "entryType": "measure" + }, + { + "startTime": 9306.02, + "name": "lh:computed:TraceEngineResult:parse:PageLoadMetrics:finalize", + "duration": 1.76, + "entryType": "measure" + }, + { + "startTime": 9307.8, + "name": "lh:computed:TraceEngineResult:parse:LargestImagePaint:finalize", + "duration": 1.37, + "entryType": "measure" + }, + { + "startTime": 9309.18, + "name": "lh:computed:TraceEngineResult:parse:LargestTextPaint:finalize", + "duration": 1.17, + "entryType": "measure" + }, + { + "startTime": 9310.38, + "name": "lh:computed:TraceEngineResult:parse:Screenshots:finalize", + "duration": 1.82, + "entryType": "measure" + }, + { + "startTime": 9312.21, + "name": "lh:computed:TraceEngineResult:parse:LayoutShifts:finalize", + "duration": 1.87, + "entryType": "measure" + }, + { + "startTime": 9314.1, + "name": "lh:computed:TraceEngineResult:parse:Memory:finalize", + "duration": 1.2, + "entryType": "measure" + }, + { + "startTime": 9315.32, + "name": "lh:computed:TraceEngineResult:parse:PageFrames:finalize", + "duration": 1.15, + "entryType": "measure" + }, + { + "startTime": 9316.48, + "name": "lh:computed:TraceEngineResult:parse:Scripts:finalize", + "duration": 1.94, + "entryType": "measure" + }, + { + "startTime": 9318.45, + "name": "lh:computed:TraceEngineResult:parse:SelectorStats:finalize", + "duration": 1.29, + "entryType": "measure" + }, + { + "startTime": 9319.77, + "name": "lh:computed:TraceEngineResult:parse:UserInteractions:finalize", + "duration": 1.54, + "entryType": "measure" + }, + { + "startTime": 9321.35, + "name": "lh:computed:TraceEngineResult:parse:Workers:finalize", + "duration": 1.36, + "entryType": "measure" + }, + { + "startTime": 9322.77, + "name": "lh:computed:TraceEngineResult:parse:Warnings:finalize", + "duration": 1.4, + "entryType": "measure" + }, + { + "startTime": 9324.2, + "name": "lh:computed:TraceEngineResult:parse:clone", + "duration": 3.01, + "entryType": "measure" + }, + { + "startTime": 9327.26, + "name": "lh:computed:TraceEngineResult:insights", + "duration": 890.16, + "entryType": "measure" + }, + { + "startTime": 9327.52, + "name": "lh:computed:TraceEngineResult:insights:CLSCulprits", + "duration": 0.42, + "entryType": "measure" + }, + { + "startTime": 9327.96, + "name": "lh:computed:TraceEngineResult:insights:Cache", + "duration": 0.18, + "entryType": "measure" + }, + { + "startTime": 9328.15, + "name": "lh:computed:TraceEngineResult:insights:DOMSize", + "duration": 0.36, + "entryType": "measure" + }, + { + "startTime": 9328.53, + "name": "lh:computed:TraceEngineResult:insights:DocumentLatency", + "duration": 0.14, + "entryType": "measure" + }, + { + "startTime": 9328.68, + "name": "lh:computed:TraceEngineResult:insights:DuplicatedJavaScript", + "duration": 0.99, + "entryType": "measure" + }, + { + "startTime": 9329.68, + "name": "lh:computed:TraceEngineResult:insights:FontDisplay", + "duration": 0.16, + "entryType": "measure" + }, + { + "startTime": 9329.86, + "name": "lh:computed:TraceEngineResult:insights:ForcedReflow", + "duration": 0.29, + "entryType": "measure" + }, + { + "startTime": 9330.16, + "name": "lh:computed:TraceEngineResult:insights:INPBreakdown", + "duration": 0.11, + "entryType": "measure" + }, + { + "startTime": 9330.29, + "name": "lh:computed:TraceEngineResult:insights:ImageDelivery", + "duration": 0.23, + "entryType": "measure" + }, + { + "startTime": 9330.53, + "name": "lh:computed:TraceEngineResult:insights:LCPBreakdown", + "duration": 0.11, + "entryType": "measure" + }, + { + "startTime": 9330.65, + "name": "lh:computed:TraceEngineResult:insights:LCPDiscovery", + "duration": 0.14, + "entryType": "measure" + }, + { + "startTime": 9330.8, + "name": "lh:computed:TraceEngineResult:insights:LegacyJavaScript", + "duration": 0.17, + "entryType": "measure" + }, + { + "startTime": 9330.98, + "name": "lh:computed:TraceEngineResult:insights:ModernHTTP", + "duration": 0.17, + "entryType": "measure" + }, + { + "startTime": 9331.17, + "name": "lh:computed:TraceEngineResult:insights:NetworkDependencyTree", + "duration": 0.09, + "entryType": "measure" + }, + { + "startTime": 9331.26, + "name": "lh:computed:TraceEngineResult:insights:RenderBlocking", + "duration": 0.11, + "entryType": "measure" + }, + { + "startTime": 9331.38, + "name": "lh:computed:TraceEngineResult:insights:SlowCSSSelector", + "duration": 0.14, + "entryType": "measure" + }, + { + "startTime": 9331.53, + "name": "lh:computed:TraceEngineResult:insights:ThirdParties", + "duration": 1.65, + "entryType": "measure" + }, + { + "startTime": 9333.19, + "name": "lh:computed:TraceEngineResult:insights:Viewport", + "duration": 0.22, + "entryType": "measure" + }, + { + "startTime": 9333.55, + "name": "lh:computed:TraceEngineResult:insights:createLanternContext", + "duration": 35.24, + "entryType": "measure" + }, + { + "startTime": 9368.85, + "name": "lh:computed:TraceEngineResult:insights:CLSCulprits", + "duration": 0.59, + "entryType": "measure" + }, + { + "startTime": 9369.46, + "name": "lh:computed:TraceEngineResult:insights:Cache", + "duration": 0.47, + "entryType": "measure" + }, + { + "startTime": 9369.94, + "name": "lh:computed:TraceEngineResult:insights:DOMSize", + "duration": 0.18, + "entryType": "measure" + }, + { + "startTime": 9370.14, + "name": "lh:computed:TraceEngineResult:insights:DocumentLatency", + "duration": 0.81, + "entryType": "measure" + }, + { + "startTime": 9370.97, + "name": "lh:computed:TraceEngineResult:insights:DuplicatedJavaScript", + "duration": 1.43, + "entryType": "measure" + }, + { + "startTime": 9372.41, + "name": "lh:computed:TraceEngineResult:insights:FontDisplay", + "duration": 0.08, + "entryType": "measure" + }, + { + "startTime": 9372.5, + "name": "lh:computed:TraceEngineResult:insights:ForcedReflow", + "duration": 0.65, + "entryType": "measure" + }, + { + "startTime": 9373.16, + "name": "lh:computed:TraceEngineResult:insights:INPBreakdown", + "duration": 0.06, + "entryType": "measure" + }, + { + "startTime": 9373.23, + "name": "lh:computed:TraceEngineResult:insights:ImageDelivery", + "duration": 0.12, + "entryType": "measure" + }, + { + "startTime": 9373.36, + "name": "lh:computed:TraceEngineResult:insights:LCPBreakdown", + "duration": 0.17, + "entryType": "measure" + }, + { + "startTime": 9373.54, + "name": "lh:computed:TraceEngineResult:insights:LCPDiscovery", + "duration": 0.05, + "entryType": "measure" + }, + { + "startTime": 9373.59, + "name": "lh:computed:TraceEngineResult:insights:LegacyJavaScript", + "duration": 825.95, + "entryType": "measure" + }, + { + "startTime": 10199.57, + "name": "lh:computed:TraceEngineResult:insights:ModernHTTP", + "duration": 1.66, + "entryType": "measure" + }, + { + "startTime": 10201.25, + "name": "lh:computed:TraceEngineResult:insights:NetworkDependencyTree", + "duration": 1.19, + "entryType": "measure" + }, + { + "startTime": 10202.47, + "name": "lh:computed:TraceEngineResult:insights:RenderBlocking", + "duration": 0.56, + "entryType": "measure" + }, + { + "startTime": 10203.05, + "name": "lh:computed:TraceEngineResult:insights:SlowCSSSelector", + "duration": 0.09, + "entryType": "measure" + }, + { + "startTime": 10203.15, + "name": "lh:computed:TraceEngineResult:insights:ThirdParties", + "duration": 13.42, + "entryType": "measure" + }, + { + "startTime": 10216.59, + "name": "lh:computed:TraceEngineResult:insights:Viewport", + "duration": 0.26, + "entryType": "measure" + }, + { + "startTime": 10227.48, + "name": "lh:computed:ProcessedNavigation", + "duration": 0.8, + "entryType": "measure" + }, + { + "startTime": 10228.35, + "name": "lh:computed:CumulativeLayoutShift", + "duration": 8.73, + "entryType": "measure" + }, + { + "startTime": 10239.96, + "name": "lh:computed:Responsiveness", + "duration": 0.19, + "entryType": "measure" + }, + { + "startTime": 10260.29, + "name": "lh:gather:getArtifact:ViewportDimensions", + "duration": 1.31, + "entryType": "measure" + }, + { + "startTime": 10261.63, + "name": "lh:gather:getArtifact:FullPageScreenshot", + "duration": 1132.07, + "entryType": "measure" + }, + { + "startTime": 11393.74, + "name": "lh:gather:getArtifact:BFCacheFailures", + "duration": 296.36, + "entryType": "measure" + }, + { + "startTime": 11705.67, + "name": "lh:runner:audit", + "duration": 1473.01, + "entryType": "measure" + }, + { + "startTime": 11705.74, + "name": "lh:runner:auditing", + "duration": 1472.65, + "entryType": "measure" + }, + { + "startTime": 11706.77, + "name": "lh:audit:viewport", + "duration": 1.29, + "entryType": "measure" + }, + { + "startTime": 11707.17, + "name": "lh:computed:ViewportMeta", + "duration": 0.39, + "entryType": "measure" + }, + { + "startTime": 11708.21, + "name": "lh:audit:first-contentful-paint", + "duration": 11.69, + "entryType": "measure" + }, + { + "startTime": 11708.51, + "name": "lh:computed:FirstContentfulPaint", + "duration": 9.39, + "entryType": "measure" + }, + { + "startTime": 11708.67, + "name": "lh:computed:LanternFirstContentfulPaint", + "duration": 9.22, + "entryType": "measure" + }, + { + "startTime": 11708.73, + "name": "lh:computed:PageDependencyGraph", + "duration": 7.27, + "entryType": "measure" + }, + { + "startTime": 11716.05, + "name": "lh:computed:LoadSimulator", + "duration": 0.58, + "entryType": "measure" + }, + { + "startTime": 11716.16, + "name": "lh:computed:NetworkAnalysis", + "duration": 0.4, + "entryType": "measure" + }, + { + "startTime": 11720.18, + "name": "lh:audit:largest-contentful-paint", + "duration": 3.09, + "entryType": "measure" + }, + { + "startTime": 11720.62, + "name": "lh:computed:LargestContentfulPaint", + "duration": 2.07, + "entryType": "measure" + }, + { + "startTime": 11720.68, + "name": "lh:computed:LanternLargestContentfulPaint", + "duration": 2, + "entryType": "measure" + }, + { + "startTime": 11723.51, + "name": "lh:audit:first-meaningful-paint", + "duration": 0.63, + "entryType": "measure" + }, + { + "startTime": 11724.35, + "name": "lh:audit:speed-index", + "duration": 90.07, + "entryType": "measure" + }, + { + "startTime": 11724.61, + "name": "lh:computed:SpeedIndex", + "duration": 89.18, + "entryType": "measure" + }, + { + "startTime": 11724.67, + "name": "lh:computed:LanternSpeedIndex", + "duration": 89.11, + "entryType": "measure" + }, + { + "startTime": 11724.69, + "name": "lh:computed:Speedline", + "duration": 86.03, + "entryType": "measure" + }, + { + "startTime": 11814.46, + "name": "lh:audit:screenshot-thumbnails", + "duration": 0.45, + "entryType": "measure" + }, + { + "startTime": 11814.92, + "name": "lh:audit:final-screenshot", + "duration": 1.42, + "entryType": "measure" + }, + { + "startTime": 11815.05, + "name": "lh:computed:Screenshots", + "duration": 1.27, + "entryType": "measure" + }, + { + "startTime": 11816.51, + "name": "lh:audit:total-blocking-time", + "duration": 4.45, + "entryType": "measure" + }, + { + "startTime": 11816.77, + "name": "lh:computed:TotalBlockingTime", + "duration": 3.69, + "entryType": "measure" + }, + { + "startTime": 11816.82, + "name": "lh:computed:LanternTotalBlockingTime", + "duration": 3.63, + "entryType": "measure" + }, + { + "startTime": 11816.87, + "name": "lh:computed:LanternInteractive", + "duration": 1.7, + "entryType": "measure" + }, + { + "startTime": 11821.07, + "name": "lh:audit:max-potential-fid", + "duration": 4.13, + "entryType": "measure" + }, + { + "startTime": 11821.34, + "name": "lh:computed:MaxPotentialFID", + "duration": 2.53, + "entryType": "measure" + }, + { + "startTime": 11821.39, + "name": "lh:computed:LanternMaxPotentialFID", + "duration": 2.47, + "entryType": "measure" + }, + { + "startTime": 11825.3, + "name": "lh:audit:cumulative-layout-shift", + "duration": 2.3, + "entryType": "measure" + }, + { + "startTime": 11827.95, + "name": "lh:audit:server-response-time", + "duration": 2.18, + "entryType": "measure" + }, + { + "startTime": 11830.25, + "name": "lh:audit:interactive", + "duration": 0.71, + "entryType": "measure" + }, + { + "startTime": 11830.47, + "name": "lh:computed:Interactive", + "duration": 0.07, + "entryType": "measure" + }, + { + "startTime": 11831.06, + "name": "lh:audit:user-timings", + "duration": 4.27, + "entryType": "measure" + }, + { + "startTime": 11831.28, + "name": "lh:computed:UserTimings", + "duration": 2.5, + "entryType": "measure" + }, + { + "startTime": 11835.68, + "name": "lh:audit:critical-request-chains", + "duration": 1.4, + "entryType": "measure" + }, + { + "startTime": 11836.1, + "name": "lh:computed:CriticalRequestChains", + "duration": 0.37, + "entryType": "measure" + }, + { + "startTime": 11837.18, + "name": "lh:audit:redirects", + "duration": 3.08, + "entryType": "measure" + }, + { + "startTime": 11840.39, + "name": "lh:audit:mainthread-work-breakdown", + "duration": 23.41, + "entryType": "measure" + }, + { + "startTime": 11840.72, + "name": "lh:computed:MainThreadTasks", + "duration": 20.73, + "entryType": "measure" + }, + { + "startTime": 11864.02, + "name": "lh:audit:bootup-time", + "duration": 14.93, + "entryType": "measure" + }, + { + "startTime": 11867.51, + "name": "lh:computed:TBTImpactTasks", + "duration": 9.1, + "entryType": "measure" + }, + { + "startTime": 11879.11, + "name": "lh:audit:uses-rel-preconnect", + "duration": 1.8, + "entryType": "measure" + }, + { + "startTime": 11881.05, + "name": "lh:audit:font-display", + "duration": 2.6, + "entryType": "measure" + }, + { + "startTime": 11883.71, + "name": "lh:audit:diagnostics", + "duration": 0.89, + "entryType": "measure" + }, + { + "startTime": 11884.62, + "name": "lh:audit:network-requests", + "duration": 3.51, + "entryType": "measure" + }, + { + "startTime": 11884.87, + "name": "lh:computed:EntityClassification", + "duration": 1.16, + "entryType": "measure" + }, + { + "startTime": 11889.31, + "name": "lh:audit:network-rtt", + "duration": 1.56, + "entryType": "measure" + }, + { + "startTime": 11891.01, + "name": "lh:audit:network-server-latency", + "duration": 0.74, + "entryType": "measure" + }, + { + "startTime": 11891.77, + "name": "lh:audit:main-thread-tasks", + "duration": 0.55, + "entryType": "measure" + }, + { + "startTime": 11892.34, + "name": "lh:audit:metrics", + "duration": 3.08, + "entryType": "measure" + }, + { + "startTime": 11892.52, + "name": "lh:computed:TimingSummary", + "duration": 2.77, + "entryType": "measure" + }, + { + "startTime": 11892.73, + "name": "lh:computed:FirstContentfulPaintAllFrames", + "duration": 0.19, + "entryType": "measure" + }, + { + "startTime": 11892.97, + "name": "lh:computed:LargestContentfulPaintAllFrames", + "duration": 0.1, + "entryType": "measure" + }, + { + "startTime": 11893.13, + "name": "lh:computed:LCPBreakdown", + "duration": 1.84, + "entryType": "measure" + }, + { + "startTime": 11893.19, + "name": "lh:computed:TimeToFirstByte", + "duration": 0.11, + "entryType": "measure" + }, + { + "startTime": 11893.3, + "name": "lh:computed:LCPImageRecord", + "duration": 1.63, + "entryType": "measure" + }, + { + "startTime": 11895.44, + "name": "lh:audit:resource-summary", + "duration": 0.86, + "entryType": "measure" + }, + { + "startTime": 11895.65, + "name": "lh:computed:ResourceSummary", + "duration": 0.27, + "entryType": "measure" + }, + { + "startTime": 11896.5, + "name": "lh:audit:third-party-summary", + "duration": 5.5, + "entryType": "measure" + }, + { + "startTime": 11902.19, + "name": "lh:audit:third-party-facades", + "duration": 2.71, + "entryType": "measure" + }, + { + "startTime": 11905.06, + "name": "lh:audit:largest-contentful-paint-element", + "duration": 0.57, + "entryType": "measure" + }, + { + "startTime": 11905.82, + "name": "lh:audit:lcp-lazy-loaded", + "duration": 0.51, + "entryType": "measure" + }, + { + "startTime": 11906.48, + "name": "lh:audit:layout-shifts", + "duration": 1.17, + "entryType": "measure" + }, + { + "startTime": 11907.87, + "name": "lh:audit:long-tasks", + "duration": 5.06, + "entryType": "measure" + }, + { + "startTime": 11913.04, + "name": "lh:audit:non-composited-animations", + "duration": 0.65, + "entryType": "measure" + }, + { + "startTime": 11913.82, + "name": "lh:audit:unsized-images", + "duration": 0.85, + "entryType": "measure" + }, + { + "startTime": 11914.8, + "name": "lh:audit:prioritize-lcp-image", + "duration": 0.48, + "entryType": "measure" + }, + { + "startTime": 11915.3, + "name": "lh:audit:script-treemap-data", + "duration": 176.55, + "entryType": "measure" + }, + { + "startTime": 11915.59, + "name": "lh:computed:JSBundles", + "duration": 0.53, + "entryType": "measure" + }, + { + "startTime": 11916.14, + "name": "lh:computed:ModuleDuplication", + "duration": 0.25, + "entryType": "measure" + }, + { + "startTime": 11916.42, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.21, + "entryType": "measure" + }, + { + "startTime": 11916.69, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.02, + "entryType": "measure" + }, + { + "startTime": 11916.73, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.03, + "entryType": "measure" + }, + { + "startTime": 11916.77, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.02, + "entryType": "measure" + }, + { + "startTime": 11916.81, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.02, + "entryType": "measure" + }, + { + "startTime": 11916.85, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.02, + "entryType": "measure" + }, + { + "startTime": 11916.89, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.06, + "entryType": "measure" + }, + { + "startTime": 11916.98, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.06, + "entryType": "measure" + }, + { + "startTime": 11917.06, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.06, + "entryType": "measure" + }, + { + "startTime": 11917.16, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.06, + "entryType": "measure" + }, + { + "startTime": 11917.25, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.05, + "entryType": "measure" + }, + { + "startTime": 11917.34, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.07, + "entryType": "measure" + }, + { + "startTime": 11917.45, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.07, + "entryType": "measure" + }, + { + "startTime": 11917.57, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.07, + "entryType": "measure" + }, + { + "startTime": 11917.72, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.1, + "entryType": "measure" + }, + { + "startTime": 11918.05, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.07, + "entryType": "measure" + }, + { + "startTime": 11918.19, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.07, + "entryType": "measure" + }, + { + "startTime": 11918.36, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.07, + "entryType": "measure" + }, + { + "startTime": 11918.5, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.08, + "entryType": "measure" + }, + { + "startTime": 11918.64, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.13, + "entryType": "measure" + }, + { + "startTime": 11918.83, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.07, + "entryType": "measure" + }, + { + "startTime": 11919.04, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.25, + "entryType": "measure" + }, + { + "startTime": 11919.42, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.1, + "entryType": "measure" + }, + { + "startTime": 11919.6, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.14, + "entryType": "measure" + }, + { + "startTime": 11919.81, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.07, + "entryType": "measure" + }, + { + "startTime": 11920.18, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.18, + "entryType": "measure" + }, + { + "startTime": 11920.82, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.94, + "entryType": "measure" + }, + { + "startTime": 11922.46, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 3.35, + "entryType": "measure" + }, + { + "startTime": 11925.97, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.17, + "entryType": "measure" + }, + { + "startTime": 11926.23, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.32, + "entryType": "measure" + }, + { + "startTime": 11926.63, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.32, + "entryType": "measure" + }, + { + "startTime": 11927.02, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 1.33, + "entryType": "measure" + }, + { + "startTime": 11928.88, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 9.47, + "entryType": "measure" + }, + { + "startTime": 11938.46, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 69.66, + "entryType": "measure" + }, + { + "startTime": 12008.29, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.63, + "entryType": "measure" + }, + { + "startTime": 12009.14, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.06, + "entryType": "measure" + }, + { + "startTime": 12009.41, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.05, + "entryType": "measure" + }, + { + "startTime": 12009.58, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.91, + "entryType": "measure" + }, + { + "startTime": 12010.54, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.05, + "entryType": "measure" + }, + { + "startTime": 12010.64, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.06, + "entryType": "measure" + }, + { + "startTime": 12010.87, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.19, + "entryType": "measure" + }, + { + "startTime": 12011.14, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.05, + "entryType": "measure" + }, + { + "startTime": 12011.24, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.05, + "entryType": "measure" + }, + { + "startTime": 12011.38, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.04, + "entryType": "measure" + }, + { + "startTime": 12011.46, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.04, + "entryType": "measure" + }, + { + "startTime": 12011.54, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.04, + "entryType": "measure" + }, + { + "startTime": 12011.62, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.05, + "entryType": "measure" + }, + { + "startTime": 12011.7, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.05, + "entryType": "measure" + }, + { + "startTime": 12011.79, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.05, + "entryType": "measure" + }, + { + "startTime": 12011.88, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.05, + "entryType": "measure" + }, + { + "startTime": 12011.97, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.04, + "entryType": "measure" + }, + { + "startTime": 12012.08, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.05, + "entryType": "measure" + }, + { + "startTime": 12012.18, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.05, + "entryType": "measure" + }, + { + "startTime": 12012.28, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.1, + "entryType": "measure" + }, + { + "startTime": 12012.47, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.09, + "entryType": "measure" + }, + { + "startTime": 12012.61, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.05, + "entryType": "measure" + }, + { + "startTime": 12012.72, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.06, + "entryType": "measure" + }, + { + "startTime": 12012.83, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.05, + "entryType": "measure" + }, + { + "startTime": 12012.92, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.05, + "entryType": "measure" + }, + { + "startTime": 12013.02, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.45, + "entryType": "measure" + }, + { + "startTime": 12013.55, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.13, + "entryType": "measure" + }, + { + "startTime": 12013.74, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.07, + "entryType": "measure" + }, + { + "startTime": 12013.92, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.09, + "entryType": "measure" + }, + { + "startTime": 12014.08, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.07, + "entryType": "measure" + }, + { + "startTime": 12014.2, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.05, + "entryType": "measure" + }, + { + "startTime": 12014.35, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.76, + "entryType": "measure" + }, + { + "startTime": 12015.23, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.1, + "entryType": "measure" + }, + { + "startTime": 12015.39, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.15, + "entryType": "measure" + }, + { + "startTime": 12015.66, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.99, + "entryType": "measure" + }, + { + "startTime": 12016.72, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 0.09, + "entryType": "measure" + }, + { + "startTime": 12016.87, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 2.76, + "entryType": "measure" + }, + { + "startTime": 12019.72, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 70.07, + "entryType": "measure" + }, + { + "startTime": 12089.91, + "name": "lh:computed:UnusedJavascriptSummary", + "duration": 1.74, + "entryType": "measure" + }, + { + "startTime": 12092.17, + "name": "lh:audit:uses-long-cache-ttl", + "duration": 1.58, + "entryType": "measure" + }, + { + "startTime": 12093.87, + "name": "lh:audit:total-byte-weight", + "duration": 0.96, + "entryType": "measure" + }, + { + "startTime": 12094.94, + "name": "lh:audit:offscreen-images", + "duration": 2.31, + "entryType": "measure" + }, + { + "startTime": 12097.35, + "name": "lh:audit:render-blocking-resources", + "duration": 5.67, + "entryType": "measure" + }, + { + "startTime": 12097.73, + "name": "lh:computed:UnusedCSS", + "duration": 2.99, + "entryType": "measure" + }, + { + "startTime": 12100.76, + "name": "lh:computed:NavigationInsights", + "duration": 0.1, + "entryType": "measure" + }, + { + "startTime": 12100.89, + "name": "lh:computed:FirstContentfulPaint", + "duration": 0.03, + "entryType": "measure" + }, + { + "startTime": 12103.4, + "name": "lh:audit:unminified-css", + "duration": 26.16, + "entryType": "measure" + }, + { + "startTime": 12129.7, + "name": "lh:audit:unminified-javascript", + "duration": 222.27, + "entryType": "measure" + }, + { + "startTime": 12352.11, + "name": "lh:audit:unused-css-rules", + "duration": 1.62, + "entryType": "measure" + }, + { + "startTime": 12353.83, + "name": "lh:audit:unused-javascript", + "duration": 5.1, + "entryType": "measure" + }, + { + "startTime": 12359.02, + "name": "lh:audit:modern-image-formats", + "duration": 1.5, + "entryType": "measure" + }, + { + "startTime": 12360.64, + "name": "lh:audit:uses-optimized-images", + "duration": 1.52, + "entryType": "measure" + }, + { + "startTime": 12362.26, + "name": "lh:audit:uses-text-compression", + "duration": 1.3, + "entryType": "measure" + }, + { + "startTime": 12363.65, + "name": "lh:audit:uses-responsive-images", + "duration": 1.6, + "entryType": "measure" + }, + { + "startTime": 12363.91, + "name": "lh:computed:ImageRecords", + "duration": 0.23, + "entryType": "measure" + }, + { + "startTime": 12365.35, + "name": "lh:audit:efficient-animated-content", + "duration": 1.14, + "entryType": "measure" + }, + { + "startTime": 12366.57, + "name": "lh:audit:duplicated-javascript", + "duration": 1.26, + "entryType": "measure" + }, + { + "startTime": 12367.94, + "name": "lh:audit:legacy-javascript", + "duration": 778.58, + "entryType": "measure" + }, + { + "startTime": 13146.69, + "name": "lh:audit:dom-size", + "duration": 2.14, + "entryType": "measure" + }, + { + "startTime": 13148.98, + "name": "lh:audit:no-document-write", + "duration": 0.6, + "entryType": "measure" + }, + { + "startTime": 13149.67, + "name": "lh:audit:uses-http2", + "duration": 1.83, + "entryType": "measure" + }, + { + "startTime": 13151.62, + "name": "lh:audit:uses-passive-event-listeners", + "duration": 0.67, + "entryType": "measure" + }, + { + "startTime": 13152.41, + "name": "lh:audit:bf-cache", + "duration": 0.81, + "entryType": "measure" + }, + { + "startTime": 13153.33, + "name": "lh:audit:cache-insight", + "duration": 0.73, + "entryType": "measure" + }, + { + "startTime": 13154.16, + "name": "lh:audit:cls-culprits-insight", + "duration": 0.94, + "entryType": "measure" + }, + { + "startTime": 13155.23, + "name": "lh:audit:document-latency-insight", + "duration": 0.63, + "entryType": "measure" + }, + { + "startTime": 13155.97, + "name": "lh:audit:dom-size-insight", + "duration": 0.61, + "entryType": "measure" + }, + { + "startTime": 13156.68, + "name": "lh:audit:duplicated-javascript-insight", + "duration": 0.5, + "entryType": "measure" + }, + { + "startTime": 13157.38, + "name": "lh:audit:font-display-insight", + "duration": 0.53, + "entryType": "measure" + }, + { + "startTime": 13158.06, + "name": "lh:audit:forced-reflow-insight", + "duration": 0.66, + "entryType": "measure" + }, + { + "startTime": 13158.84, + "name": "lh:audit:image-delivery-insight", + "duration": 0.55, + "entryType": "measure" + }, + { + "startTime": 13159.5, + "name": "lh:audit:inp-breakdown-insight", + "duration": 0.49, + "entryType": "measure" + }, + { + "startTime": 13160.1, + "name": "lh:audit:lcp-breakdown-insight", + "duration": 0.62, + "entryType": "measure" + }, + { + "startTime": 13160.83, + "name": "lh:audit:lcp-discovery-insight", + "duration": 0.41, + "entryType": "measure" + }, + { + "startTime": 13161.37, + "name": "lh:audit:legacy-javascript-insight", + "duration": 0.8, + "entryType": "measure" + }, + { + "startTime": 13162.28, + "name": "lh:audit:modern-http-insight", + "duration": 0.57, + "entryType": "measure" + }, + { + "startTime": 13162.96, + "name": "lh:audit:network-dependency-tree-insight", + "duration": 0.7, + "entryType": "measure" + }, + { + "startTime": 13163.77, + "name": "lh:audit:render-blocking-insight", + "duration": 0.85, + "entryType": "measure" + }, + { + "startTime": 13164.75, + "name": "lh:audit:third-parties-insight", + "duration": 12.93, + "entryType": "measure" + }, + { + "startTime": 13177.81, + "name": "lh:audit:viewport-insight", + "duration": 0.56, + "entryType": "measure" + }, + { + "startTime": 13178.39, + "name": "lh:runner:generate", + "duration": 0.28, + "entryType": "measure" + } + ], + "total": 11834.4 + }, + "i18n": { + "rendererFormattedStrings": { + "calculatorLink": "See calculator.", + "collapseView": "Collapse view", + "crcInitialNavigation": "Initial Navigation", + "crcLongestDurationLabel": "Maximum critical path latency:", + "dropdownCopyJSON": "Copy JSON", + "dropdownDarkTheme": "Toggle Dark Theme", + "dropdownPrintExpanded": "Print Expanded", + "dropdownPrintSummary": "Print Summary", + "dropdownSaveGist": "Save as Gist", + "dropdownSaveHTML": "Save as HTML", + "dropdownSaveJSON": "Save as JSON", + "dropdownViewUnthrottledTrace": "View Unthrottled Trace", + "dropdownViewer": "Open in Viewer", + "errorLabel": "Error!", + "errorMissingAuditInfo": "Report error: no audit information", + "expandView": "Expand view", + "firstPartyChipLabel": "1st party", + "footerIssue": "File an issue", + "goBackToAudits": "Go back to audits", + "hide": "Hide", + "insightsNotice": "Later this year, insights will replace performance audits. [Learn more and provide feedback here](https://github.com/GoogleChrome/lighthouse/discussions/16462).", + "labDataTitle": "Lab Data", + "lsPerformanceCategoryDescription": "[Lighthouse](https://developers.google.com/web/tools/lighthouse/) analysis of the current page on an emulated mobile network. Values are estimated and may vary.", + "manualAuditsGroupTitle": "Additional items to manually check", + "notApplicableAuditsGroupTitle": "Not applicable", + "openInANewTabTooltip": "Open in a new tab", + "opportunityResourceColumnLabel": "Opportunity", + "opportunitySavingsColumnLabel": "Estimated Savings", + "passedAuditsGroupTitle": "Passed audits", + "runtimeAnalysisWindow": "Initial page load", + "runtimeAnalysisWindowSnapshot": "Point-in-time snapshot", + "runtimeAnalysisWindowTimespan": "User interactions timespan", + "runtimeCustom": "Custom throttling", + "runtimeDesktopEmulation": "Emulated Desktop", + "runtimeMobileEmulation": "Emulated Moto G Power", + "runtimeNoEmulation": "No emulation", + "runtimeSettingsAxeVersion": "Axe version", + "runtimeSettingsBenchmark": "Unthrottled CPU/Memory Power", + "runtimeSettingsCPUThrottling": "CPU throttling", + "runtimeSettingsDevice": "Device", + "runtimeSettingsNetworkThrottling": "Network throttling", + "runtimeSettingsScreenEmulation": "Screen emulation", + "runtimeSettingsUANetwork": "User agent (network)", + "runtimeSingleLoad": "Single page session", + "runtimeSingleLoadTooltip": "This data is taken from a single page session, as opposed to field data summarizing many sessions.", + "runtimeSlow4g": "Slow 4G throttling", + "runtimeUnknown": "Unknown", + "show": "Show", + "showRelevantAudits": "Show audits relevant to:", + "snippetCollapseButtonLabel": "Collapse snippet", + "snippetExpandButtonLabel": "Expand snippet", + "thirdPartyResourcesLabel": "Show 3rd-party resources", + "throttlingProvided": "Provided by environment", + "toplevelWarningsMessage": "There were issues affecting this run of Lighthouse:", + "tryInsights": "Try insights", + "unattributable": "Unattributable", + "varianceDisclaimer": "Values are estimated and may vary. The [performance score is calculated](https://developer.chrome.com/docs/lighthouse/performance/performance-scoring/) directly from these metrics.", + "viewTraceLabel": "View Trace", + "viewTreemapLabel": "View Treemap", + "warningAuditsGroupTitle": "Passed audits but with warnings", + "warningHeader": "Warnings: " + }, + "icuMessagePaths": { + "core/audits/viewport.js | title": ["audits.viewport.title"], + "core/audits/viewport.js | description": ["audits.viewport.description"], + "core/lib/i18n/i18n.js | firstContentfulPaintMetric": [ + "audits[first-contentful-paint].title" + ], + "core/audits/metrics/first-contentful-paint.js | description": [ + "audits[first-contentful-paint].description" + ], + "core/lib/i18n/i18n.js | seconds": [ + { + "values": { + "timeInMs": 1063.8235 + }, + "path": "audits[first-contentful-paint].displayValue" + }, + { + "values": { + "timeInMs": 31563.279375 + }, + "path": "audits[largest-contentful-paint].displayValue" + }, + { + "values": { + "timeInMs": 1479.5342394022318 + }, + "path": "audits[speed-index].displayValue" + }, + { + "values": { + "timeInMs": 31721.124962500002 + }, + "path": "audits.interactive.displayValue" + }, + { + "values": { + "timeInMs": 8236.923999999866 + }, + "path": "audits[mainthread-work-breakdown].displayValue" + }, + { + "values": { + "timeInMs": 5144.17999999998 + }, + "path": "audits[bootup-time].displayValue" + } + ], + "core/lib/i18n/i18n.js | largestContentfulPaintMetric": [ + "audits[largest-contentful-paint].title" + ], + "core/audits/metrics/largest-contentful-paint.js | description": [ + "audits[largest-contentful-paint].description" + ], + "core/lib/i18n/i18n.js | firstMeaningfulPaintMetric": [ + "audits[first-meaningful-paint].title" + ], + "core/audits/metrics/first-meaningful-paint.js | description": [ + "audits[first-meaningful-paint].description" + ], + "core/lib/i18n/i18n.js | speedIndexMetric": ["audits[speed-index].title"], + "core/audits/metrics/speed-index.js | description": [ + "audits[speed-index].description" + ], + "core/lib/i18n/i18n.js | totalBlockingTimeMetric": [ + "audits[total-blocking-time].title" + ], + "core/audits/metrics/total-blocking-time.js | description": [ + "audits[total-blocking-time].description" + ], + "core/lib/i18n/i18n.js | ms": [ + { + "values": { + "timeInMs": 3876.6323749999983 + }, + "path": "audits[total-blocking-time].displayValue" + }, + { + "values": { + "timeInMs": 2213 + }, + "path": "audits[max-potential-fid].displayValue" + }, + { + "values": { + "timeInMs": 0.04575 + }, + "path": "audits[network-rtt].displayValue" + }, + { + "values": { + "timeInMs": 6.9117500000000005 + }, + "path": "audits[network-server-latency].displayValue" + } + ], + "core/lib/i18n/i18n.js | maxPotentialFIDMetric": [ + "audits[max-potential-fid].title" + ], + "core/audits/metrics/max-potential-fid.js | description": [ + "audits[max-potential-fid].description" + ], + "core/lib/i18n/i18n.js | cumulativeLayoutShiftMetric": [ + "audits[cumulative-layout-shift].title" + ], + "core/audits/metrics/cumulative-layout-shift.js | description": [ + "audits[cumulative-layout-shift].description" + ], + "core/audits/server-response-time.js | title": [ + "audits[server-response-time].title" + ], + "core/audits/server-response-time.js | description": [ + "audits[server-response-time].description" + ], + "core/audits/server-response-time.js | displayValue": [ + { + "values": { + "timeInMs": 72.107 + }, + "path": "audits[server-response-time].displayValue" + } + ], + "core/lib/i18n/i18n.js | columnURL": [ + "audits[server-response-time].details.headings[0].label", + "audits[bootup-time].details.headings[0].label", + "audits[font-display].details.headings[0].label", + "audits[network-rtt].details.headings[0].label", + "audits[network-server-latency].details.headings[0].label", + "audits[long-tasks].details.headings[0].label", + "audits[unsized-images].details.headings[1].label", + "audits[uses-long-cache-ttl].details.headings[0].label", + "audits[total-byte-weight].details.headings[0].label", + "audits[render-blocking-resources].details.headings[0].label", + "audits[unminified-css].details.headings[0].label", + "audits[unminified-javascript].details.headings[0].label", + "audits[unused-javascript].details.headings[0].label", + "audits[legacy-javascript].details.headings[0].label", + "audits[font-display-insight].details.headings[0].label", + "audits[image-delivery-insight].details.headings[0].label", + "audits[legacy-javascript-insight].details.headings[0].label", + "audits[modern-http-insight].details.headings[0].label", + "audits[render-blocking-insight].details.headings[0].label" + ], + "core/lib/i18n/i18n.js | columnTimeSpent": [ + "audits[server-response-time].details.headings[1].label", + "audits[mainthread-work-breakdown].details.headings[1].label", + "audits[network-rtt].details.headings[1].label", + "audits[network-server-latency].details.headings[1].label" + ], + "core/lib/i18n/i18n.js | interactiveMetric": ["audits.interactive.title"], + "core/audits/metrics/interactive.js | description": [ + "audits.interactive.description" + ], + "core/audits/user-timings.js | title": ["audits[user-timings].title"], + "core/audits/user-timings.js | description": [ + "audits[user-timings].description" + ], + "core/audits/user-timings.js | displayValue": [ + { + "values": { + "itemCount": 7 + }, + "path": "audits[user-timings].displayValue" + } + ], + "core/lib/i18n/i18n.js | columnName": [ + "audits[user-timings].details.headings[0].label" + ], + "core/audits/user-timings.js | columnType": [ + "audits[user-timings].details.headings[1].label" + ], + "core/lib/i18n/i18n.js | columnStartTime": [ + "audits[user-timings].details.headings[2].label", + "audits[long-tasks].details.headings[1].label" + ], + "core/lib/i18n/i18n.js | columnDuration": [ + "audits[user-timings].details.headings[3].label", + "audits[long-tasks].details.headings[2].label", + "audits[render-blocking-resources].details.headings[2].label", + "audits[lcp-breakdown-insight].details.items[0].headings[1].label", + "audits[render-blocking-insight].details.headings[2].label" + ], + "core/audits/critical-request-chains.js | title": [ + "audits[critical-request-chains].title" + ], + "core/audits/critical-request-chains.js | description": [ + "audits[critical-request-chains].description" + ], + "core/audits/critical-request-chains.js | displayValue": [ + { + "values": { + "itemCount": 1 + }, + "path": "audits[critical-request-chains].displayValue" + } + ], + "core/audits/redirects.js | title": ["audits.redirects.title"], + "core/audits/redirects.js | description": [ + "audits.redirects.description" + ], + "core/audits/mainthread-work-breakdown.js | failureTitle": [ + "audits[mainthread-work-breakdown].title" + ], + "core/audits/mainthread-work-breakdown.js | description": [ + "audits[mainthread-work-breakdown].description" + ], + "core/audits/mainthread-work-breakdown.js | columnCategory": [ + "audits[mainthread-work-breakdown].details.headings[0].label" + ], + "core/audits/bootup-time.js | failureTitle": [ + "audits[bootup-time].title" + ], + "core/audits/bootup-time.js | description": [ + "audits[bootup-time].description" + ], + "core/audits/bootup-time.js | columnTotal": [ + "audits[bootup-time].details.headings[1].label" + ], + "core/audits/bootup-time.js | columnScriptEval": [ + "audits[bootup-time].details.headings[2].label" + ], + "core/audits/bootup-time.js | columnScriptParse": [ + "audits[bootup-time].details.headings[3].label" + ], + "core/audits/uses-rel-preconnect.js | title": [ + "audits[uses-rel-preconnect].title" + ], + "core/audits/uses-rel-preconnect.js | description": [ + "audits[uses-rel-preconnect].description" + ], + "core/audits/font-display.js | title": ["audits[font-display].title"], + "core/audits/font-display.js | description": [ + "audits[font-display].description" + ], + "core/lib/i18n/i18n.js | columnWastedBytes": [ + "audits[font-display].details.headings[1].label", + "audits[unminified-css].details.headings[2].label", + "audits[unminified-javascript].details.headings[2].label", + "audits[unused-javascript].details.headings[2].label", + "audits[legacy-javascript].details.headings[2].label", + "audits[font-display-insight].details.headings[1].label", + "audits[image-delivery-insight].details.headings[2].label" + ], + "core/audits/network-rtt.js | title": ["audits[network-rtt].title"], + "core/audits/network-rtt.js | description": [ + "audits[network-rtt].description" + ], + "core/audits/network-server-latency.js | title": [ + "audits[network-server-latency].title" + ], + "core/audits/network-server-latency.js | description": [ + "audits[network-server-latency].description" + ], + "core/lib/i18n/i18n.js | columnResourceType": [ + "audits[resource-summary].details.headings[0].label" + ], + "core/lib/i18n/i18n.js | columnRequests": [ + "audits[resource-summary].details.headings[1].label" + ], + "core/lib/i18n/i18n.js | columnTransferSize": [ + "audits[resource-summary].details.headings[2].label", + "audits[uses-long-cache-ttl].details.headings[2].label", + "audits[total-byte-weight].details.headings[1].label", + "audits[render-blocking-resources].details.headings[1].label", + "audits[unminified-css].details.headings[1].label", + "audits[unminified-javascript].details.headings[1].label", + "audits[unused-javascript].details.headings[1].label", + "audits[cache-insight].details.headings[2].label", + "audits[render-blocking-insight].details.headings[1].label" + ], + "core/lib/i18n/i18n.js | total": [ + "audits[resource-summary].details.items[0].label", + "audits[cls-culprits-insight].details.items[0].items[0].node.value" + ], + "core/lib/i18n/i18n.js | scriptResourceType": [ + "audits[resource-summary].details.items[1].label" + ], + "core/lib/i18n/i18n.js | fontResourceType": [ + "audits[resource-summary].details.items[2].label" + ], + "core/lib/i18n/i18n.js | stylesheetResourceType": [ + "audits[resource-summary].details.items[3].label" + ], + "core/lib/i18n/i18n.js | documentResourceType": [ + "audits[resource-summary].details.items[4].label" + ], + "core/lib/i18n/i18n.js | otherResourceType": [ + "audits[resource-summary].details.items[5].label" + ], + "core/lib/i18n/i18n.js | imageResourceType": [ + "audits[resource-summary].details.items[6].label" + ], + "core/lib/i18n/i18n.js | mediaResourceType": [ + "audits[resource-summary].details.items[7].label" + ], + "core/lib/i18n/i18n.js | thirdPartyResourceType": [ + "audits[resource-summary].details.items[8].label" + ], + "core/audits/third-party-summary.js | title": [ + "audits[third-party-summary].title" + ], + "core/audits/third-party-summary.js | description": [ + "audits[third-party-summary].description" + ], + "core/audits/third-party-facades.js | title": [ + "audits[third-party-facades].title" + ], + "core/audits/third-party-facades.js | description": [ + "audits[third-party-facades].description" + ], + "core/audits/largest-contentful-paint-element.js | title": [ + "audits[largest-contentful-paint-element].title" + ], + "core/audits/largest-contentful-paint-element.js | description": [ + "audits[largest-contentful-paint-element].description" + ], + "core/audits/lcp-lazy-loaded.js | title": [ + "audits[lcp-lazy-loaded].title" + ], + "core/audits/lcp-lazy-loaded.js | description": [ + "audits[lcp-lazy-loaded].description" + ], + "core/audits/layout-shifts.js | title": ["audits[layout-shifts].title"], + "core/audits/layout-shifts.js | description": [ + "audits[layout-shifts].description" + ], + "core/audits/layout-shifts.js | displayValueShiftsFound": [ + { + "values": { + "shiftCount": 2 + }, + "path": "audits[layout-shifts].displayValue" + } + ], + "core/lib/i18n/i18n.js | columnElement": [ + "audits[layout-shifts].details.headings[0].label", + "audits[non-composited-animations].details.headings[0].label", + "audits[dom-size].details.headings[1].label", + "audits[cls-culprits-insight].details.items[0].headings[0].label", + "audits[dom-size-insight].details.headings[1].label" + ], + "core/audits/layout-shifts.js | columnScore": [ + "audits[layout-shifts].details.headings[1].label" + ], + "core/audits/long-tasks.js | title": ["audits[long-tasks].title"], + "core/audits/long-tasks.js | description": [ + "audits[long-tasks].description" + ], + "core/audits/long-tasks.js | displayValue": [ + { + "values": { + "itemCount": 11 + }, + "path": "audits[long-tasks].displayValue" + } + ], + "core/audits/non-composited-animations.js | title": [ + "audits[non-composited-animations].title" + ], + "core/audits/non-composited-animations.js | description": [ + "audits[non-composited-animations].description" + ], + "core/audits/unsized-images.js | title": ["audits[unsized-images].title"], + "core/audits/unsized-images.js | description": [ + "audits[unsized-images].description" + ], + "core/audits/prioritize-lcp-image.js | title": [ + "audits[prioritize-lcp-image].title" + ], + "core/audits/prioritize-lcp-image.js | description": [ + "audits[prioritize-lcp-image].description" + ], + "core/audits/byte-efficiency/uses-long-cache-ttl.js | title": [ + "audits[uses-long-cache-ttl].title" + ], + "core/audits/byte-efficiency/uses-long-cache-ttl.js | description": [ + "audits[uses-long-cache-ttl].description" + ], + "core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue": [ + { + "values": { + "itemCount": 0 + }, + "path": "audits[uses-long-cache-ttl].displayValue" + } + ], + "core/lib/i18n/i18n.js | columnCacheTTL": [ + "audits[uses-long-cache-ttl].details.headings[1].label", + "audits[cache-insight].details.headings[1].label" + ], + "core/audits/byte-efficiency/total-byte-weight.js | failureTitle": [ + "audits[total-byte-weight].title" + ], + "core/audits/byte-efficiency/total-byte-weight.js | description": [ + "audits[total-byte-weight].description" + ], + "core/audits/byte-efficiency/total-byte-weight.js | displayValue": [ + { + "values": { + "totalBytes": 5463096 + }, + "path": "audits[total-byte-weight].displayValue" + } + ], + "core/audits/byte-efficiency/offscreen-images.js | title": [ + "audits[offscreen-images].title" + ], + "core/audits/byte-efficiency/offscreen-images.js | description": [ + "audits[offscreen-images].description" + ], + "core/audits/byte-efficiency/render-blocking-resources.js | title": [ + "audits[render-blocking-resources].title" + ], + "core/audits/byte-efficiency/render-blocking-resources.js | description": [ + "audits[render-blocking-resources].description" + ], + "core/lib/i18n/i18n.js | displayValueMsSavings": [ + { + "values": { + "wastedMs": 127 + }, + "path": "audits[render-blocking-resources].displayValue" + }, + { + "values": { + "wastedMs": 277 + }, + "path": "audits[render-blocking-insight].displayValue" + } + ], + "core/audits/byte-efficiency/unminified-css.js | title": [ + "audits[unminified-css].title" + ], + "core/audits/byte-efficiency/unminified-css.js | description": [ + "audits[unminified-css].description" + ], + "core/lib/i18n/i18n.js | displayValueByteSavings": [ + { + "values": { + "wastedBytes": 7375 + }, + "path": "audits[unminified-css].displayValue" + }, + { + "values": { + "wastedBytes": 37054 + }, + "path": "audits[unminified-javascript].displayValue" + }, + { + "values": { + "wastedBytes": 1088390 + }, + "path": "audits[unused-javascript].displayValue" + }, + { + "values": { + "wastedBytes": 17489 + }, + "path": "audits[legacy-javascript].displayValue" + }, + { + "values": { + "wastedBytes": 12202 + }, + "path": "audits[legacy-javascript-insight].displayValue" + } + ], + "core/audits/byte-efficiency/unminified-javascript.js | title": [ + "audits[unminified-javascript].title" + ], + "core/audits/byte-efficiency/unminified-javascript.js | description": [ + "audits[unminified-javascript].description" + ], + "core/audits/byte-efficiency/unused-css-rules.js | title": [ + "audits[unused-css-rules].title" + ], + "core/audits/byte-efficiency/unused-css-rules.js | description": [ + "audits[unused-css-rules].description" + ], + "core/audits/byte-efficiency/unused-javascript.js | title": [ + "audits[unused-javascript].title" + ], + "core/audits/byte-efficiency/unused-javascript.js | description": [ + "audits[unused-javascript].description" + ], + "core/audits/byte-efficiency/modern-image-formats.js | title": [ + "audits[modern-image-formats].title" + ], + "core/audits/byte-efficiency/modern-image-formats.js | description": [ + "audits[modern-image-formats].description" + ], + "core/audits/byte-efficiency/uses-optimized-images.js | title": [ + "audits[uses-optimized-images].title" + ], + "core/audits/byte-efficiency/uses-optimized-images.js | description": [ + "audits[uses-optimized-images].description" + ], + "core/audits/byte-efficiency/uses-text-compression.js | title": [ + "audits[uses-text-compression].title" + ], + "core/audits/byte-efficiency/uses-text-compression.js | description": [ + "audits[uses-text-compression].description" + ], + "core/audits/byte-efficiency/uses-responsive-images.js | title": [ + "audits[uses-responsive-images].title" + ], + "core/audits/byte-efficiency/uses-responsive-images.js | description": [ + "audits[uses-responsive-images].description" + ], + "core/audits/byte-efficiency/efficient-animated-content.js | title": [ + "audits[efficient-animated-content].title" + ], + "core/audits/byte-efficiency/efficient-animated-content.js | description": [ + "audits[efficient-animated-content].description" + ], + "core/audits/byte-efficiency/duplicated-javascript.js | title": [ + "audits[duplicated-javascript].title" + ], + "core/audits/byte-efficiency/duplicated-javascript.js | description": [ + "audits[duplicated-javascript].description" + ], + "core/audits/byte-efficiency/legacy-javascript.js | title": [ + "audits[legacy-javascript].title" + ], + "core/audits/byte-efficiency/legacy-javascript.js | description": [ + "audits[legacy-javascript].description" + ], + "core/audits/dobetterweb/dom-size.js | title": ["audits[dom-size].title"], + "core/audits/dobetterweb/dom-size.js | description": [ + "audits[dom-size].description" + ], + "core/audits/dobetterweb/dom-size.js | displayValue": [ + { + "values": { + "itemCount": 369 + }, + "path": "audits[dom-size].displayValue" + } + ], + "core/audits/dobetterweb/dom-size.js | columnStatistic": [ + "audits[dom-size].details.headings[0].label" + ], + "core/audits/dobetterweb/dom-size.js | columnValue": [ + "audits[dom-size].details.headings[2].label" + ], + "core/audits/dobetterweb/dom-size.js | statisticDOMElements": [ + "audits[dom-size].details.items[0].statistic" + ], + "core/audits/dobetterweb/dom-size.js | statisticDOMDepth": [ + "audits[dom-size].details.items[1].statistic" + ], + "core/audits/dobetterweb/dom-size.js | statisticDOMWidth": [ + "audits[dom-size].details.items[2].statistic" + ], + "core/audits/dobetterweb/no-document-write.js | title": [ + "audits[no-document-write].title" + ], + "core/audits/dobetterweb/no-document-write.js | description": [ + "audits[no-document-write].description" + ], + "core/lib/i18n/i18n.js | columnSource": [ + "audits[no-document-write].details.headings[0].label", + "audits[uses-passive-event-listeners].details.headings[0].label", + "audits[forced-reflow-insight].details.items[0].headings[0].label" + ], + "core/audits/dobetterweb/uses-http2.js | title": [ + "audits[uses-http2].title" + ], + "core/audits/dobetterweb/uses-http2.js | description": [ + "audits[uses-http2].description" + ], + "core/audits/dobetterweb/uses-passive-event-listeners.js | failureTitle": [ + "audits[uses-passive-event-listeners].title" + ], + "core/audits/dobetterweb/uses-passive-event-listeners.js | description": [ + "audits[uses-passive-event-listeners].description" + ], + "core/audits/bf-cache.js | failureTitle": ["audits[bf-cache].title"], + "core/audits/bf-cache.js | description": ["audits[bf-cache].description"], + "core/audits/bf-cache.js | displayValue": [ + { + "values": { + "itemCount": 3 + }, + "path": "audits[bf-cache].displayValue" + } + ], + "core/audits/bf-cache.js | failureReasonColumn": [ + "audits[bf-cache].details.headings[0].label" + ], + "core/audits/bf-cache.js | failureTypeColumn": [ + "audits[bf-cache].details.headings[1].label" + ], + "node_modules/@paulirish/trace_engine/panels/application/components/BackForwardCacheStrings.js | webSocket": [ + "audits[bf-cache].details.items[0].reason" + ], + "core/audits/bf-cache.js | supportPendingFailureType": [ + "audits[bf-cache].details.items[0].failureType" + ], + "node_modules/@paulirish/trace_engine/panels/application/components/BackForwardCacheStrings.js | mainResourceHasCacheControlNoStore": [ + "audits[bf-cache].details.items[1].reason" + ], + "core/audits/bf-cache.js | notActionableFailureType": [ + "audits[bf-cache].details.items[1].failureType", + "audits[bf-cache].details.items[2].failureType" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/Cache.js | title": [ + "audits[cache-insight].title" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/Cache.js | description": [ + "audits[cache-insight].description" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/Cache.js | requestColumn": [ + "audits[cache-insight].details.headings[0].label" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/CLSCulprits.js | title": [ + "audits[cls-culprits-insight].title" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/CLSCulprits.js | description": [ + "audits[cls-culprits-insight].description" + ], + "core/audits/insights/cls-culprits-insight.js | columnScore": [ + "audits[cls-culprits-insight].details.items[0].headings[1].label" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/DocumentLatency.js | title": [ + "audits[document-latency-insight].title" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/DocumentLatency.js | description": [ + "audits[document-latency-insight].description" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/DocumentLatency.js | passingRedirects": [ + "audits[document-latency-insight].details.items.noRedirects.label" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/DocumentLatency.js | passingServerResponseTime": [ + { + "values": { + "PH1": "72 ms" + }, + "path": "audits[document-latency-insight].details.items.serverResponseIsFast.label" + } + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/DocumentLatency.js | passingTextCompression": [ + "audits[document-latency-insight].details.items.usesCompression.label" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/DOMSize.js | title": [ + "audits[dom-size-insight].title" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/DOMSize.js | description": [ + "audits[dom-size-insight].description" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/DOMSize.js | statistic": [ + "audits[dom-size-insight].details.headings[0].label" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/DOMSize.js | value": [ + "audits[dom-size-insight].details.headings[2].label" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/DOMSize.js | totalElements": [ + "audits[dom-size-insight].details.items[0].statistic" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/DOMSize.js | maxChildren": [ + "audits[dom-size-insight].details.items[1].statistic" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/DOMSize.js | maxDOMDepth": [ + "audits[dom-size-insight].details.items[2].statistic" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/DuplicatedJavaScript.js | title": [ + "audits[duplicated-javascript-insight].title" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/DuplicatedJavaScript.js | description": [ + "audits[duplicated-javascript-insight].description" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/DuplicatedJavaScript.js | columnSource": [ + "audits[duplicated-javascript-insight].details.headings[0].label" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/DuplicatedJavaScript.js | columnDuplicatedBytes": [ + "audits[duplicated-javascript-insight].details.headings[1].label" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/FontDisplay.js | title": [ + "audits[font-display-insight].title" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/FontDisplay.js | description": [ + "audits[font-display-insight].description" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/ForcedReflow.js | title": [ + "audits[forced-reflow-insight].title" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/ForcedReflow.js | description": [ + "audits[forced-reflow-insight].description" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/ForcedReflow.js | totalReflowTime": [ + "audits[forced-reflow-insight].details.items[0].headings[1].label" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/ForcedReflow.js | unattributed": [ + "audits[forced-reflow-insight].details.items[0].items[0].source.value" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/ImageDelivery.js | title": [ + "audits[image-delivery-insight].title" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/ImageDelivery.js | description": [ + "audits[image-delivery-insight].description" + ], + "core/lib/i18n/i18n.js | columnResourceSize": [ + "audits[image-delivery-insight].details.headings[1].label" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/INPBreakdown.js | title": [ + "audits[inp-breakdown-insight].title" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/INPBreakdown.js | description": [ + "audits[inp-breakdown-insight].description" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/LCPBreakdown.js | title": [ + "audits[lcp-breakdown-insight].title" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/LCPBreakdown.js | description": [ + "audits[lcp-breakdown-insight].description" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/LCPBreakdown.js | subpart": [ + "audits[lcp-breakdown-insight].details.items[0].headings[0].label" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/LCPBreakdown.js | timeToFirstByte": [ + "audits[lcp-breakdown-insight].details.items[0].items[0].label" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/LCPBreakdown.js | elementRenderDelay": [ + "audits[lcp-breakdown-insight].details.items[0].items[1].label" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/LCPDiscovery.js | title": [ + "audits[lcp-discovery-insight].title" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/LCPDiscovery.js | description": [ + "audits[lcp-discovery-insight].description" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/LegacyJavaScript.js | title": [ + "audits[legacy-javascript-insight].title" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/LegacyJavaScript.js | description": [ + "audits[legacy-javascript-insight].description" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/LegacyJavaScript.js | columnWastedBytes": [ + "audits[legacy-javascript-insight].details.headings[2].label" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/ModernHTTP.js | title": [ + "audits[modern-http-insight].title" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/ModernHTTP.js | description": [ + "audits[modern-http-insight].description" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/ModernHTTP.js | protocol": [ + "audits[modern-http-insight].details.headings[1].label" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/NetworkDependencyTree.js | title": [ + "audits[network-dependency-tree-insight].title" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/NetworkDependencyTree.js | description": [ + "audits[network-dependency-tree-insight].description" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/NetworkDependencyTree.js | preconnectOriginsTableTitle": [ + "audits[network-dependency-tree-insight].details.items[1].title" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/NetworkDependencyTree.js | preconnectOriginsTableDescription": [ + "audits[network-dependency-tree-insight].details.items[1].description" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/NetworkDependencyTree.js | noPreconnectOrigins": [ + "audits[network-dependency-tree-insight].details.items[1].value.value" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/NetworkDependencyTree.js | estSavingTableTitle": [ + "audits[network-dependency-tree-insight].details.items[2].title" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/NetworkDependencyTree.js | estSavingTableDescription": [ + "audits[network-dependency-tree-insight].details.items[2].description" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/NetworkDependencyTree.js | noPreconnectCandidates": [ + "audits[network-dependency-tree-insight].details.items[2].value.value" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/RenderBlocking.js | title": [ + "audits[render-blocking-insight].title" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/RenderBlocking.js | description": [ + "audits[render-blocking-insight].description" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/ThirdParties.js | title": [ + "audits[third-parties-insight].title" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/ThirdParties.js | description": [ + "audits[third-parties-insight].description" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/ThirdParties.js | columnThirdParty": [ + "audits[third-parties-insight].details.headings[0].label" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/ThirdParties.js | columnTransferSize": [ + "audits[third-parties-insight].details.headings[1].label" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/ThirdParties.js | columnMainThreadTime": [ + "audits[third-parties-insight].details.headings[2].label" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/Viewport.js | title": [ + "audits[viewport-insight].title" + ], + "node_modules/@paulirish/trace_engine/models/trace/insights/Viewport.js | description": [ + "audits[viewport-insight].description" + ], + "core/config/default-config.js | performanceCategoryTitle": [ + "categories.performance.title" + ], + "core/config/default-config.js | metricGroupTitle": [ + "categoryGroups.metrics.title" + ], + "core/config/default-config.js | insightsGroupTitle": [ + "categoryGroups.insights.title" + ], + "core/config/default-config.js | insightsGroupDescription": [ + "categoryGroups.insights.description" + ], + "core/config/default-config.js | diagnosticsGroupTitle": [ + "categoryGroups.diagnostics.title" + ], + "core/config/default-config.js | diagnosticsGroupDescription": [ + "categoryGroups.diagnostics.description" + ], + "core/config/default-config.js | a11yBestPracticesGroupTitle": [ + "categoryGroups[a11y-best-practices].title" + ], + "core/config/default-config.js | a11yBestPracticesGroupDescription": [ + "categoryGroups[a11y-best-practices].description" + ], + "core/config/default-config.js | a11yColorContrastGroupTitle": [ + "categoryGroups[a11y-color-contrast].title" + ], + "core/config/default-config.js | a11yColorContrastGroupDescription": [ + "categoryGroups[a11y-color-contrast].description" + ], + "core/config/default-config.js | a11yNamesLabelsGroupTitle": [ + "categoryGroups[a11y-names-labels].title" + ], + "core/config/default-config.js | a11yNamesLabelsGroupDescription": [ + "categoryGroups[a11y-names-labels].description" + ], + "core/config/default-config.js | a11yNavigationGroupTitle": [ + "categoryGroups[a11y-navigation].title" + ], + "core/config/default-config.js | a11yNavigationGroupDescription": [ + "categoryGroups[a11y-navigation].description" + ], + "core/config/default-config.js | a11yAriaGroupTitle": [ + "categoryGroups[a11y-aria].title" + ], + "core/config/default-config.js | a11yAriaGroupDescription": [ + "categoryGroups[a11y-aria].description" + ], + "core/config/default-config.js | a11yLanguageGroupTitle": [ + "categoryGroups[a11y-language].title" + ], + "core/config/default-config.js | a11yLanguageGroupDescription": [ + "categoryGroups[a11y-language].description" + ], + "core/config/default-config.js | a11yAudioVideoGroupTitle": [ + "categoryGroups[a11y-audio-video].title" + ], + "core/config/default-config.js | a11yAudioVideoGroupDescription": [ + "categoryGroups[a11y-audio-video].description" + ], + "core/config/default-config.js | a11yTablesListsVideoGroupTitle": [ + "categoryGroups[a11y-tables-lists].title" + ], + "core/config/default-config.js | a11yTablesListsVideoGroupDescription": [ + "categoryGroups[a11y-tables-lists].description" + ], + "core/config/default-config.js | seoMobileGroupTitle": [ + "categoryGroups[seo-mobile].title" + ], + "core/config/default-config.js | seoMobileGroupDescription": [ + "categoryGroups[seo-mobile].description" + ], + "core/config/default-config.js | seoContentGroupTitle": [ + "categoryGroups[seo-content].title" + ], + "core/config/default-config.js | seoContentGroupDescription": [ + "categoryGroups[seo-content].description" + ], + "core/config/default-config.js | seoCrawlingGroupTitle": [ + "categoryGroups[seo-crawl].title" + ], + "core/config/default-config.js | seoCrawlingGroupDescription": [ + "categoryGroups[seo-crawl].description" + ], + "core/config/default-config.js | bestPracticesTrustSafetyGroupTitle": [ + "categoryGroups[best-practices-trust-safety].title" + ], + "core/config/default-config.js | bestPracticesUXGroupTitle": [ + "categoryGroups[best-practices-ux].title" + ], + "core/config/default-config.js | bestPracticesBrowserCompatGroupTitle": [ + "categoryGroups[best-practices-browser-compat].title" + ], + "core/config/default-config.js | bestPracticesGeneralGroupTitle": [ + "categoryGroups[best-practices-general].title" + ] + } + } +} diff --git a/features/enhancements/047-threejs-game/plan.md b/features/enhancements/047-threejs-game/plan.md new file mode 100644 index 00000000..425b37e7 --- /dev/null +++ b/features/enhancements/047-threejs-game/plan.md @@ -0,0 +1,204 @@ +# Implementation Plan: Three.js Game + +**Branch**: `047-threejs-game` | **Date**: 2026-05-16 | **Spec**: [spec.md](./spec.md) +**Input**: Feature specification at `features/enhancements/047-threejs-game/spec.md` + +**Note**: Phase 0.5 of the ScriptHammer-family strategy plan (`~/.claude/plans/gleaming-kitten-execution.md`) — the R&D stepping stone before GrimGlow Phase 1a (browser fork). Wireframe gate PASSED 2026-05-15 (regenerated with canonical brand-SVG symbols 2026-05-16). This file is the cascade's `/speckit.plan` step. + +## Summary + +A new `/game/3d` route that mounts a Three.js scene composing the three canonical ScriptHammer brand assets (silver cog ring, golden `< >` code-tag brackets, printing-mallet) in 3D, all built from procedural primitives. The scene is theme-aware (re-extracts DaisyUI CSS custom properties on `data-theme` change, mirroring the existing `useMapTheme` precedent), respects `prefers-reduced-motion` (disables auto-orbit + idle animations), and degrades gracefully when WebGL is unavailable or the context is lost (themed CSS/SVG silhouette + user-actionable Retry button). + +The technical approach is pure-additive: a new client-only route under `src/app/game/3d/` using the existing `dynamic(() => import(...), { ssr: false })` pattern from `src/app/game/page.tsx`; four new components under `src/components/game/` following the mandatory 5-file pattern (Scene, Controls, Loader, FallbackPanel); a small theme-utils extension mirroring `useMapTheme`; a Pa11y exclusion scoped to `/game/3d` only. No backend changes, no schema changes, no shared-state changes elsewhere. + +## Technical Context + +**Language/Version**: TypeScript 5 (strict), React 19, Next.js 15.5 (App Router, static export) +**Primary Dependencies**: + +- `three` (~0.169.x) — WebGL rendering primitives +- `@react-three/fiber` (~8.17.x) — React renderer for Three.js +- `@react-three/drei` (~9.114.x) — R3F helpers (OrbitControls, useFrame, etc.) +- `@types/three` (devDependency) — TypeScript types + +(Versions pinned by `pnpm add` at install time; exact pinned versions land in `package.json` and become part of `tasks.md` step 1.) + +**Storage**: N/A. The v1 scene has no persistence. If a future iteration adds save state, it lives in localStorage with explicit user consent (per spec Out of Scope and Constitution Principle VI). + +**Testing**: + +- Vitest + jsdom for unit tests (theme-extraction logic, reduced-motion gating). jsdom does NOT provide a real WebGL context, so canvas-rendering tests are explicitly excluded from unit; that surface is covered by Playwright instead. +- Playwright (chromium + firefox + webkit) for E2E: route loads, canvas mounts, theme switch updates colors, fallback renders when `--disable-webgl` flag is set. +- Manual a11y review (documented in `tasks.md`) covers the canvas surface, since Pa11y/axe-core cannot audit canvas content. The fallback panel IS Pa11y-auditable and is part of the automated scan via standard DOM rules. + +**Target Platform**: GitHub Pages static export; modern browsers with WebGL 1.0+ (effectively all browsers since 2014). + +**Project Type**: web (existing single Next.js app). + +**Performance Goals** (from spec Success Criteria): + +- SC-001: Initial scene paint < 2s on simulated 4G (mid-tier mobile, Lighthouse mobile profile) +- SC-002: Theme switch propagates to scene materials within one frame (≤16ms) +- SC-007: Homepage + other-route bundle sizes unchanged before vs after this feature (Three.js bundle route-split to `/game/3d` only) + +**Constraints**: + +- Static export — no server API routes, no SSR for the `` (R3F is client-only). +- DPR capped `[1, 2]` per NFR-004 to bound GPU cost on high-DPR mobile devices. +- Canvas content not auditable by Pa11y — exclusion documented + manual review required. +- WCAG AAA contrast baseline from Phase 0 closure still applies to the fallback panel + any DOM chrome. +- 44px minimum touch targets on Retry button + any mobile HUD elements. + +**Scale/Scope**: + +- 1 new route (`src/app/game/3d/page.tsx`) +- 4 new components (Scene, Controls, Loader, FallbackPanel) × 5-file pattern = 20 new files +- 1 modified utility (extend `src/utils/theme-utils.ts` with a Three.js color-conversion helper) +- 1 modified config (`config/pa11yci.json` exclusion for `/game/3d`) +- 1 new E2E spec at `tests/e2e/game-3d.spec.ts` +- 0 new database tables, 0 new API contracts, 0 new auth surfaces + +## Constitution Check + +_GATE: Must pass before Phase 0 research. Re-check after Phase 1 design._ + +| Principle | Compliance | Notes | +| ------------------------------------------------ | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| I. Component Structure Compliance | ✅ | Four new components (Scene, Controls, Loader, FallbackPanel) each scaffolded via `pnpm run generate:component` to enforce the 5-file pattern. Validated by `pnpm run validate:structure` (SC-008). | +| II. Test-First Development | ✅ | RED tests authored first per `tasks.md` ordering: theme-extraction unit test asserts re-extraction on `data-theme` change before the hook ships; FallbackPanel a11y test asserts Retry-button focusability before the WebGL-detection path is wired; E2E spec for /game/3d asserts canvas mounts before the route page is written. | +| III. PRP Methodology w/ Mandatory Wireframe Gate | ✅ | Wireframes 01 + 02 PASSED 2026-05-15 (validator v5.0, 0 errors). `## UI Mockup` section in spec.md links both. This file is the cascade's `/speckit.plan` step. | +| IV. Docker-First Development | ✅ | All commands via `docker compose exec scripthammer ...`. `pnpm add three @react-three/fiber @react-three/drei` runs inside the container per CLAUDE.md. Tests, builds, validation all containerized. | +| V. Progressive Enhancement | ✅ | The route degrades gracefully: WebGL unavailable → themed fallback panel (FR-008). prefers-reduced-motion → auto-orbit disabled (FR-004). Touch input → drei OrbitControls handles natively. Mobile breakpoint validated against wireframe 01. | +| VI. Privacy & Compliance First | ✅ | NFR-006: GA4 default page view only — no custom scene-loaded, scene-interaction, or theme-switched-in-scene events. No localStorage writes for v1. No third-party calls (Three.js bundles locally; CDNs explicitly avoided). No PII surfaces. | + +**No violations to justify.** No `Complexity Tracking` section needed. + +## Project Structure + +### Documentation (this feature) + +``` +features/enhancements/047-threejs-game/ +├── 047_threejs-game_feature.md # Original PRP (preserved) +├── spec.md # Spec — clarifications encoded 2026-05-15, wireframe sign-off 2026-05-15 +├── plan.md # This file +├── research.md # Phase 0 — decisions on Three.js, R3F, WebGL detection, theme extraction +├── quickstart.md # Phase 1 — smoke-test recipes for human + LLM verification +├── tasks.md # /speckit.tasks output (NEXT) +├── checklists/ +│ └── requirements.md # Spec quality checklist (PASSED 2026-05-15) +└── wireframes/ + ├── 01-game-3d-main.svg # Main scene (PASSED 2026-05-15) + ├── 02-game-3d-fallback.svg # Fallback panel (PASSED 2026-05-15) + ├── 01-game-3d-main.issues.md # PASS history with regen log + ├── 02-game-3d-fallback.issues.md # PASS history with regen log + └── includes/ # Shared chrome (header/footer) +``` + +### Source code (repository root) + +``` +src/ +├── app/ +│ └── game/ +│ ├── page.tsx # NO CHANGE — existing dice game preserved +│ └── 3d/ +│ └── page.tsx # NEW — dynamic(() => import('@/components/game/Scene'), { ssr: false }) +├── components/ +│ └── game/ +│ ├── Scene/ # NEW — top-level wrapper, owns theme extraction +│ │ ├── index.tsx # Barrel +│ │ ├── Scene.tsx # Main component +│ │ ├── Scene.test.tsx # Unit tests (theme-extraction, reduced-motion gating) +│ │ ├── Scene.stories.tsx # Storybook +│ │ └── Scene.accessibility.test.tsx +│ ├── Controls/ # NEW — drei OrbitControls wrapper + auto-orbit timer +│ │ └── (5 files, same pattern) +│ ├── Loader/ # NEW — Suspense fallback while canvas mounts +│ │ └── (5 files, same pattern) +│ └── FallbackPanel/ # NEW — WebGL-unavailable/context-lost UI +│ └── (5 files, same pattern) +├── utils/ +│ └── theme-utils.ts # MODIFY — add `getDaisyUIColorAsThree(token)` helper that returns a THREE.Color from OKLCH custom prop +└── hooks/ + └── useReducedMotion.ts # NEW or MODIFY (verify if it already exists; if so, reuse; if not, add a small wrapper around `matchMedia('(prefers-reduced-motion: reduce)')` that responds to runtime changes) + +tests/ +└── e2e/ + └── game-3d.spec.ts # NEW — visit route, assert canvas mounts; theme-switch assertion; --disable-webgl fallback assertion + +config/ +└── pa11yci.json # MODIFY — add `/game/3d` to the exclusion list with a comment explaining canvas is not auditable +``` + +**Structure Decision**: Single Next.js app, existing layout. New components live under `src/components/game/` (matching the existing `src/app/game/` route prefix) so directory paths telegraph ownership. The `Scene` component is the root R3F ``; `Controls`, `Loader`, and `FallbackPanel` are children. Theme extraction lives in `src/utils/theme-utils.ts` next to the existing `useMapTheme` precedent, not inside `Scene` — keeps the conversion logic reusable if a future feature also needs DaisyUI→Three.js color translation. + +## Phase 0 — Research + +See [`research.md`](./research.md). Decisions recorded with rationale + alternatives considered for: + +1. Three.js + R3F + drei (vs raw Three.js, vs Babylon.js, vs PlayCanvas) +2. WebGL availability detection strategy +3. DaisyUI OKLCH → Three.js Color conversion approach +4. jsdom canvas mocking for unit tests +5. Bundle-split verification methodology +6. drei OrbitControls auto-orbit behavior (built-in `autoRotate` vs custom timer) + +## Phase 1 — Design + +### Data model + +**No schema changes. No persistent state in v1.** The runtime state is entirely component-local: + +- **Scene state** (in `Scene.tsx`): theme tokens (re-extracted on `data-theme` change), reduced-motion preference (re-evaluated on media-query change), camera position (drei OrbitControls manages this internally). +- **Auto-orbit state** (in `Controls.tsx`): last-input-timestamp (ref), auto-orbit-paused boolean (state). +- **Fallback state** (in `Scene.tsx`): WebGL availability (one-shot probe at mount), context-lost flag (listener-driven). + +No `data-model.md` artifact needed — this section captures everything. + +### Contracts + +**No new API contracts.** The feature is pure-frontend. No backend surfaces, no Edge Functions, no Supabase calls. Three.js renders client-side; the static export emits `out/game/3d/index.html` with the chunk-split bundle. + +No `contracts/` directory needed. + +### Quickstart + +See [`quickstart.md`](./quickstart.md). Smoke-test recipes for: + +1. Dependency install + bundle-split verification +2. Route + canvas-mount smoke +3. Theme-switch smoke +4. Reduced-motion smoke +5. WebGL-disabled (fallback panel) smoke +6. Pa11y CI run (exclusion verification + `/game` regression coverage) +7. Production static-export verification (`next build` → `out/game/3d/index.html`) + +### Update agent context + +```bash +.specify/scripts/bash/update-agent-context.sh claude +# Expected: stderr "[update-agent-context] No-op for ScriptHammer..." +# (CLAUDE.md is hand-curated; this is intentional) +``` + +## Phase 2 — `/speckit.tasks` (next) + +`tasks.md` will sequence work to satisfy user stories independently: + +1. **Foundation first**: dependency install (Three.js + R3F + drei + @types/three), Pa11y exclusion config, theme-utils helper extension, useReducedMotion hook. These are prerequisites for any scene work and have no inter-dependency. +2. **US-1 (P1)**: scaffold Scene + Controls + Loader components; create the `/game/3d` route page with `dynamic` no-SSR import; render an initial placeholder geometry to prove the canvas mounts. Largest single deliverable, earliest value. +3. **US-2 (P1)**: wire theme extraction (`getDaisyUIColorAsThree`) into Scene materials; add MutationObserver on `data-theme`. Independent of US-3+. +4. **US-3 (P2)**: gate auto-orbit + any idle animations on `useReducedMotion`. Tests assert no autonomous motion under reduce-motion. +5. **US-4 (P2)**: confirm Pa11y exclusion config; document the manual a11y review template in `tasks.md`. The `/game` regression check is part of the existing Pa11y CI scan and requires no new work — verify only. +6. **US-5 (P3)**: mobile breakpoint polish; DPR cap; touch input verified across the three Playwright browsers. +7. **FR-008 fallback path**: detect WebGL absence at mount + listen for `webglcontextlost`; render `FallbackPanel` with themed silhouette + 44×44 Retry button. Separable from US-1 because it's a distinct rendering path; can ship in parallel. +8. **Procedural sculpt (FR-007)**: replace the US-1 placeholder geometry with the v1 brand composition (cog ring via `RingGeometry` + 20 trapezoidal teeth via `ExtrudeGeometry`; `< >` brackets via `ExtrudeGeometry` from 2D paths; printing-mallet via `BoxGeometry` + `CylinderGeometry`). Last because the placeholder proves all the wiring works first; the sculpt is the visual payoff. + +Each user story (or independent technical concern) gets its own commit so the PR history reflects the cascade. + +## Constitution re-check (post-Phase 1) + +All six principles still ✅. The Phase 1 design didn't introduce anything new beyond the items already evaluated in the Phase 0 gate. + +Design is intentionally conservative: extend existing patterns (dynamic-import-no-SSR from the dice game, MutationObserver-on-data-theme from useMapTheme, 5-file component pattern from every other component), no new architectural patterns, no new dependencies beyond the three Three.js packages that are core to the feature. The DaisyUI→Three.js color helper is small and lives next to the existing useMapTheme pattern, ready for reuse if Phase 1a (GrimGlow browser fork) needs the same conversion. diff --git a/features/enhancements/047-threejs-game/quickstart.md b/features/enhancements/047-threejs-game/quickstart.md new file mode 100644 index 00000000..bd135ff6 --- /dev/null +++ b/features/enhancements/047-threejs-game/quickstart.md @@ -0,0 +1,216 @@ +# Phase 1 Quickstart: Three.js Game + +**Feature**: 047 — Three.js Game +**Spec**: [spec.md](./spec.md) +**Plan**: [plan.md](./plan.md) +**Date**: 2026-05-16 + +Smoke-test recipes for human + LLM verification at each implementation milestone. Each recipe is independently runnable and self-contained. + +All commands assume the dev container is running: + +```bash +docker compose up -d +docker compose exec scripthammer pnpm run dev # in another terminal if not already +``` + +--- + +## 1. Dependency install + bundle-split verification + +```bash +# Install +docker compose exec scripthammer pnpm add three @react-three/fiber @react-three/drei +docker compose exec scripthammer pnpm add -D @types/three + +# Verify route-split: production build emits chunks under /_next/static/chunks/ +# /game/3d's chunk includes Three.js; other-route chunks do not. +docker compose exec scripthammer pnpm run build +``` + +**Expected** (compare against `git show HEAD~1:.next/...` if you saved the pre-add baseline, or just compare other-route bundle sizes before vs after the feature lands): + +- `/game/3d` First Load JS grows by ~600 KB. +- Every other route's First Load JS is unchanged. +- Shared chunk size is unchanged. + +If the shared chunk grew, search for an accidental `import { Canvas } from '@react-three/fiber'` outside `src/components/game/` or `src/app/game/3d/`. Fix by moving the import behind `dynamic()`. + +--- + +## 2. Route + canvas-mount smoke + +```bash +# In a browser (dev server URL varies by Docker port mapping; check `docker compose ps`). +# Example: http://localhost:PORT/ScriptHammer/game/3d + +# Open browser devtools → Elements panel. +# Search for: +# Expected: one element inside the page's main content area. + +# Check console: no errors mentioning Three.js, R3F, or WebGL. +``` + +**Expected**: + +- A `` element renders within ~2 seconds of navigation. +- The Suspense loader (Loader component) flashes briefly during dynamic import on first visit; subsequent visits within the session are instant (chunk cached). +- No SSR errors in the server logs (R3F is client-only via `dynamic(..., { ssr: false })`). + +--- + +## 3. Theme-switch smoke + +```bash +# In the browser at /game/3d, open the ThemeSwitcher (existing component). +# Switch through several themes: light → dark → dracula → cupcake → night → winter. +``` + +**Expected**: + +- Scene background, lighting, and material colors update within one frame (~16ms) on each theme change. No page reload required. +- Switching to a dark theme produces visibly darker scene background + lighting. +- Switching to a light theme produces visibly lighter scene background + lighting. +- The DaisyUI tokens in CSS (`--p`, `--s`, `--b1`) are visibly reflected in the scene (e.g., the cog rim picks up `--p`, the brackets pick up `--a` accent). + +**If theme changes don't propagate**: check the `MutationObserver` wiring in `Scene.tsx`. It should observe `document.documentElement` with `attributes: true, attributeFilter: ['data-theme']`. + +--- + +## 4. Reduced-motion smoke + +```bash +# In Chrome DevTools: Cmd-Shift-P → "Show Rendering" → "Emulate CSS media feature prefers-reduced-motion" → "reduce" +# Or at OS level: macOS System Preferences → Accessibility → Display → Reduce motion. + +# Then reload /game/3d. +``` + +**Expected**: + +- Auto-orbit does NOT happen. The scene is static until the user explicitly drags the camera. +- No idle bobbing, no autonomous rotation of accent objects (if any), no transitions. +- User-initiated camera input (drag, scroll, touch) STILL works — only autonomous motion is disabled. + +```bash +# Toggle the emulation OFF (or set OS preference back to "no preference") and observe the scene WITHOUT reloading. +``` + +**Expected**: + +- Auto-orbit resumes within 3 seconds. +- This validates SC-010 and the runtime-toggle behavior described in spec edge cases. + +--- + +## 5. WebGL-disabled (fallback panel) smoke + +```bash +# Start chromium with WebGL disabled: +chromium --disable-webgl http://localhost:PORT/ScriptHammer/game/3d + +# Or via Chrome DevTools: about:gpu → disable WebGL via the GPU process flags. +# Or via Firefox: about:config → webgl.disabled = true. +``` + +**Expected**: + +- No canvas element renders. +- A fallback panel renders instead, containing: + - Themed CSS/SVG silhouette of the brand composition (cog + brackets + mallet, recolored via DaisyUI tokens) + - Headline "3D Content Unavailable" + - Body copy naming WebGL as the requirement + - A 44×44 keyboard-focusable "Retry" button +- Clicking "Retry" re-runs the WebGL probe. With WebGL still disabled, the fallback re-renders. With WebGL re-enabled (close + relaunch browser without `--disable-webgl`), Retry mounts the canvas successfully. +- Console: no errors. The probe is silent on failure. + +```bash +# Test the webglcontextlost path (runtime context loss simulation): +# In DevTools Console with /game/3d open: +const canvas = document.querySelector('canvas'); +const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl'); +gl.getExtension('WEBGL_lose_context').loseContext(); +``` + +**Expected**: + +- Within one frame, the canvas disappears and the fallback panel replaces it. +- No silent auto-retry. User clicks Retry to attempt recovery. + +--- + +## 6. Pa11y CI (exclusion verification + `/game` regression coverage) + +```bash +# Run the full Pa11y suite locally: +docker compose exec scripthammer pnpm test:a11y +``` + +**Expected**: + +- The output lists every audited route. `/game/3d` is SKIPPED with the configured exclusion reason. +- `/game` (the existing dice game) IS audited. It passes (no regression from feature 037-game-a11y-tests). +- No new failures on any other route. + +**Manual a11y review template** (for canvas content not auditable by Pa11y; documented in `tasks.md`): + +- Keyboard: Tab to Retry button → Enter triggers retry. Tab moves to next focusable element after. +- Screen reader: `aria-label="3D scene preview"` on the ``. Fallback panel reads: heading "3D Content Unavailable" → paragraph → button "Retry". +- Color contrast: WCAG AAA on all DOM chrome (page heading, fallback panel text). Canvas content not subject (no text content rendered inside the canvas in v1). +- Motion: prefers-reduced-motion respected (covered by recipe 4). +- Documented in `tasks.md` under US-4 with a checkbox for each item. + +--- + +## 7. Production static-export verification + +```bash +docker compose exec scripthammer pnpm run build +# Check that the static export includes the route: +docker compose exec scripthammer ls out/game/3d/ +``` + +**Expected**: + +- `out/game/3d/index.html` exists. +- The HTML contains a `