← back to Student Debt Crisis Redesign
initial scaffold (gitify-all 2026-05-06)
1d8df7344eb22f580f9c3e1cf4bdb44a2f7c2c62 · 2026-05-06 10:25:50 -0700 · Steve Abrams
Files touched
A .gitignoreA README.mdA audit/front-page-deep-analysis.mdA audit/report.htmlA audit/report.jsonA figma/all-46-grid.pngA research/audience-demographics.mdA research/grantee-seo-comparison.mdA research/keyword-landers.mdA screenshots/01-home-desktop.pngA screenshots/01b-home-mobile.pngA screenshots/02-action-desktop.pngA screenshots/03-stories-desktop.pngA screenshots/04-resources-desktop.pngA screenshots/05-news-desktop.pngA screenshots/06-free-the-degree.pngA screenshots/07-about.pngA screenshots/08-contact.pngA showcase/index.htmlA showcase/screens/01-default-load.pngA showcase/screens/02-mayday-bookacall.pngA showcase/screens/03-tate-calculators.pngA showcase/screens/04-revenue-modal.pngA showcase/screens/05-all-46-full.pngA showcase/screens/05-all-46.pngA specs/new-pages-and-cypres.mdA specs/photo-suggestions-MATCHED.mdA specs/photo-suggestions.md
Diff
commit 1d8df7344eb22f580f9c3e1cf4bdb44a2f7c2c62
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Wed May 6 10:25:50 2026 -0700
initial scaffold (gitify-all 2026-05-06)
---
.gitignore | 12 +
README.md | 98 +
audit/front-page-deep-analysis.md | 80 +
audit/report.html | 2893 ++++++++++++++
audit/report.json | 6075 ++++++++++++++++++++++++++++++
figma/all-46-grid.png | Bin 0 -> 228924 bytes
research/audience-demographics.md | 308 ++
research/grantee-seo-comparison.md | 112 +
research/keyword-landers.md | 500 +++
screenshots/01-home-desktop.png | Bin 0 -> 5720091 bytes
screenshots/01b-home-mobile.png | Bin 0 -> 1440659 bytes
screenshots/02-action-desktop.png | Bin 0 -> 6130001 bytes
screenshots/03-stories-desktop.png | Bin 0 -> 4488429 bytes
screenshots/04-resources-desktop.png | Bin 0 -> 9107519 bytes
screenshots/05-news-desktop.png | Bin 0 -> 4911828 bytes
screenshots/06-free-the-degree.png | Bin 0 -> 2982273 bytes
screenshots/07-about.png | Bin 0 -> 6244082 bytes
screenshots/08-contact.png | Bin 0 -> 4323709 bytes
showcase/index.html | 715 ++++
showcase/screens/01-default-load.png | Bin 0 -> 1037674 bytes
showcase/screens/02-mayday-bookacall.png | Bin 0 -> 640068 bytes
showcase/screens/03-tate-calculators.png | Bin 0 -> 631623 bytes
showcase/screens/04-revenue-modal.png | Bin 0 -> 1203198 bytes
showcase/screens/05-all-46-full.png | Bin 0 -> 711243 bytes
showcase/screens/05-all-46.png | Bin 0 -> 716510 bytes
specs/new-pages-and-cypres.md | 136 +
specs/photo-suggestions-MATCHED.md | 98 +
specs/photo-suggestions.md | 129 +
28 files changed, 11156 insertions(+)
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..7e6a9c3
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,12 @@
+node_modules/
+.env
+.env.local
+.env.*.local
+.env.*
+tmp/
+*.log
+.DS_Store
+dist/
+build/
+.next/
+*.bak
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..3b40dfc
--- /dev/null
+++ b/README.md
@@ -0,0 +1,98 @@
+# SDCC Redesign Sprint — final deliverable bundle
+
+**Date:** April 25, 2026 · **Working dir:** `~/Projects/student-debt-crisis-redesign/`
+
+This bundle covers a complete pre-redesign discovery for studentdebtcrisis.org: site audit, peer SEO benchmark, demographic research, keyword research, a deep front-page critique, page specs (Cy Pres, Calculators, Book a Call, 20 long-tail landers), photo briefs, and a single working interactive showcase that lets anyone preview 46 redesign themes against three audiences across eight pages with a live critique panel and a revenue-streams modal.
+
+---
+
+## 🎯 The headline finding
+
+**SDCC operates at ~$321K annual revenue while peer student-debt orgs run $4M–$33M.** The single asset SDCC owns that no peer matches: **82,475 first-person borrower stories.** Every recommendation in this bundle either removes a credibility blocker that costs SDCC mid-five-figure foundation gifts, unlocks a structural revenue line a peer already has but SDCC does not (Cy Pres, Calculators, Book-a-Call), or stops sending users to studentaid.gov before SDCC has captured them.
+
+---
+
+## 🚀 Open the showcase
+
+```bash
+open ~/Projects/student-debt-crisis-redesign/showcase/index.html
+```
+
+Two viewing modes:
+- **All 46 at once** — click `📑 View all 46` in the header (URL `#all`). Every theme renders as a real mini-card with its actual palette, hero copy, CTAs, stats and contrast score. Click any card to open it full-size.
+- **Single theme split view** (default, URL `#t-N` per theme) — full preview on left 2/3, audience-aware critique panel on right 1/3.
+
+**Companion Figma file** (46 frames in a 5×10 grid, one per theme):
+https://www.figma.com/design/tymSsryrhOg3dhjFOuzvap
+
+What you can do in the showcase:
+- **Theme** dropdown (46): #1–20 unique full rebrands · #21–30 light tweaks of the current SDC palette · #31–45 May 1 Day complete overhauls · #46 Tate Esq attorney-polished
+- **Target audience** dropdown: Foundation grantmakers · Borrowers age 45+ · Both
+- **Page** dropdown: Home · Stories · Resources (refreshed for April 2026) · News · Calculators (with a live PSLF math demo) · PSLF JSON Inspector · Cy Pres Award · Book a Call (with embedded-video placeholder)
+- **💰 Revenue Streams** modal (top right): 12 ranked revenue lines tagged Quiet Money / Hustle Money / Steady, with effort + impact tags
+- **Critique panel** (right 1/3): updates per (theme × audience × page) with WCAG contrast scores, pros/cons, peer-benchmark, photo brief, and a "why this gets/doesn't get money" box
+
+The layout is a strict 2-column CSS Grid (2fr / 1fr) with each pane scrolling independently — no overlapping elements at any viewport ≥ 980px; collapses to single-column below that.
+
+---
+
+## 📁 What's in this folder
+
+```
+audit/
+ front-page-deep-analysis.md ← the deep critique of the live homepage
+ report.html, report.json ← raw Lighthouse report (A11y 93 · BP 73 · SEO 92 · 6 audits failing)
+
+research/
+ grantee-seo-comparison.md ← top-20 nonprofit SEO + revenue benchmark
+ audience-demographics.md ← granters + 45+ borrower research
+ keyword-landers.md ← 20 long-tail landers in 4 priority tiers
+
+specs/
+ new-pages-and-cypres.md ← Cy Pres, Calculators, Book-a-Call, 20 lander specs
+ photo-suggestions.md ← page-by-page photo briefs for steve-personal Drive
+
+showcase/
+ index.html ← the interactive 46-theme × 3-audience × 8-page demo
+ screens/ ← preview screenshots of the showcase
+
+screenshots/ ← walkthrough screenshots of the live SDCC site
+```
+
+---
+
+## 🧭 If you only do five things
+
+In rank order:
+1. **Update the © 2023 footer to 2026 today** — fastest credibility fix on the site.
+2. **Pick one hero CTA** (currently three two-button blocks compete) and demote the others.
+3. **Stand up the Cy Pres page** (full spec in `specs/new-pages-and-cypres.md`). One page, $25K–$250K/year unlocked at minimum.
+4. **Add the Candid Platinum seal + 990 link** to the footer (SDCC qualifies; seal-holders raise 62% more on average).
+5. **Stamp every Resource "Reviewed [date]"** so foundations see freshness, not abandonment.
+
+The full 30-day, 90-day, and beyond punch lists are in `audit/front-page-deep-analysis.md`.
+
+---
+
+## 🚩 What still needs the user
+
+1. **Google Drive MCP authentication** — run `/mcp` → select "claude.ai Google Drive" → complete OAuth. Once done, photo briefs in `specs/photo-suggestions.md` can be matched to actual file IDs in steve-personal (steveabramsdesigns@gmail.com).
+2. **Verify SDCC's most recent 990** on ProPublica Nonprofit Explorer — the cohort comparison cites $321K but the agent didn't pin the exact filing year.
+3. **Decide rollout window for the May Day themes (#31–45).** Recommend April 25 – May 5 only; pair with plain-language explainer ("We mark International Workers' Day because student debt is a labor issue.").
+4. **Pick the one or two themes** from the 46 to take into high-fidelity design. The showcase is a discovery tool; the next sprint is "make this real in production."
+
+---
+
+## 📊 Per-task status
+
+| # | Task | Status |
+|---|---|---|
+| 1 | Click-through audit of studentdebtcrisis.org | ✅ done — 8 page screenshots in `screenshots/`, snapshots captured for each page's a11y tree |
+| 2 | Top-20 grantee SEO comparison | ✅ done — `research/grantee-seo-comparison.md` |
+| 3 | Donor + user demographic research | ✅ done — `research/audience-demographics.md` |
+| 4 | Keyword research for 20 drill-down pages | ✅ done — `research/keyword-landers.md` (4 priority tiers) |
+| 5 | Build showcase HTML (46 themes × 3 audiences × 8 pages + critique + revenue modal) | ✅ done — `showcase/index.html` |
+| 6 | Spec new pages: Cy Pres + Calculators + Book a Call + 20 landers | ✅ done — `specs/new-pages-and-cypres.md` |
+| 7 | Final deliverable bundle | ✅ done — this file |
+| 8 | Deep front-page analysis (Lighthouse + heuristic + audience-aware critique) | ✅ done — `audit/front-page-deep-analysis.md` |
+| 9 | Photo suggestions per page (from steve-personal Drive) | ✅ briefs written — `specs/photo-suggestions.md` (matching to actual Drive files pending OAuth) |
diff --git a/audit/front-page-deep-analysis.md b/audit/front-page-deep-analysis.md
new file mode 100644
index 0000000..9ac6aba
--- /dev/null
+++ b/audit/front-page-deep-analysis.md
@@ -0,0 +1,80 @@
+# studentdebtcrisis.org — front-page deep analysis
+
+**Date reviewed:** April 25, 2026 · **Reviewer:** SDCC redesign sprint
+**Live URL:** https://www.studentdebtcrisis.org
+**Lighthouse (desktop):** Accessibility 93 · Best Practices 73 · SEO 92 · 6 audits failing
+**Site stack:** Wix CMS · third-party widgets (VocalReferences, Events Calendar, Wix Chat) · ActBlue donate
+**SDCC most recent reported revenue (ProPublica):** ~$321K — the smallest in the 20-org cohort we benchmarked
+
+---
+
+## What works
+
+1. **The H1 — "Centering Borrower Voices"** is the right thematic anchor. It does the hard job (positioning the org as a borrower-led movement, not a DC think tank) in three words.
+2. **Mission paragraph** ("a people-powered movement representing over 2 million supporters") is clear, specific, and quantified — exactly what a foundation program officer scans for in the first 30 seconds.
+3. **The borrower stat band** ($1.7T, 45M Americans) is referenced in copy. This is grant-language gold.
+4. **A11y score 93** means the bones are sound. The Wix theme respects landmarks and headings.
+5. **Stories anchor** — the slideshow with Robyn from Florida is the single best signal that this org represents real people, not abstractions. It's the one part of the page that no $33M peer can replicate.
+
+## What hurts you (above the fold)
+
+1. **Two competing dual-CTA pairs in the hero.** "Join the Movement / Sign up for important updates" and "Read and Share Stories / Tell us how you've been impacted" and "Learn About IDR Plans / Find out how to lower…" — three two-button blocks stacked, no primary action declared. Conversion research is unanimous: pick **one** above-the-fold action.
+2. **The IDR CTA leaks the user off-site to studentaid.gov before they have signed up, donated, or shared a story.** This is the highest-traffic CTA on the page, and it sends the borrower to the federal government instead of capturing their email.
+3. **No phone number above the fold.** The Lighthouse a11y check flagged target-size failures, but the bigger issue for the 50–61 borrower cohort (the people with $46K average balances) is that they want to **call**. Phone is buried on /contact.
+4. **No funder list, no Candid/GuideStar seal, no 990 link, no theory of change link** anywhere on the homepage. From the demographic research: program officers pull your Candid profile **before** visiting your site. Seal-holders raise 62% more on average. SDCC qualifies for the seal but is not displaying it.
+5. **The Events Calendar widget is the second-largest visual element on the page** — it shows "Cinco de Mayo" and "Mother's Day" as scheduled events. Two of the three events shown are calendar holidays, not SDCC programming. This actively hurts the "we are an active organization" signal.
+6. **Footer reads "© 2023 by Student Debt Crisis Center."** It is April 2026. A stale copyright is the cheapest, worst signal on the entire site — it tells both POs and borrowers that no one is home.
+
+## Lighthouse failures (6) — what each one actually is
+
+| Audit | Score | What's failing | Fix |
+|---|---|---|---|
+| `errors-in-console` | 0 | JavaScript errors are logged at page load (Wix widgets) | Audit the Wix app marketplace plugins; remove any deprecated ones |
+| `third-party-cookies` | 0 | Wix Chat, VocalReferences, ActBlue, EventsCalendar all set 3P cookies | Add cookie banner; consider self-hosting story rendering |
+| `link-name` | 0 | Some `<a>` elements have no accessible name (icon-only links) | Add `aria-label` to icon links (slideshow controls, social icons) |
+| `target-size` | 0 | Touch targets smaller than 24×24 CSS px | Slideshow nav arrows, footer social icons — bump to 44×44 |
+| `inspector-issues` | 0 | Mixed-content warnings, deprecated APIs from Wix | Same fix as `errors-in-console`; tied to Wix internals |
+| `link-text` | 0 | "Read More", "click here", generic anchor text | Rewrite to descriptive text ("Read the SAVE Plan guide" etc.) |
+
+## What a foundation program officer sees in the first 30 seconds
+
+> "Cool name. Big number ('2 million supporters'). Where's the funder list? Where's the 990? Why does this look like a Wix template from 2019? When did they last publish anything? Their copyright says 2023. Their next 'event' is Cinco de Mayo. I'll come back when I have time… (closes tab)"
+
+## What a 67-year-old Parent PLUS borrower sees in the first 30 seconds
+
+> "OK, big text says they're fighting for me. Three buttons all want me to do something. I just want to know if they can stop the wage garnishment notice I got. Is there a phone number? I'll keep scrolling… IDR plans, that's me, I'll click — wait, this is taking me to a different government website. Did I leave their site?"
+
+## The 30-day, $0-cost punch list
+
+In rank order — every item is editable in the existing Wix admin without a redesign:
+
+1. **Update the copyright to 2026.** (90 seconds.)
+2. **Replace the Events Calendar holidays.** Show only SDCC-hosted events; if there's only one, show only one.
+3. **Pick one hero CTA.** The other two get demoted to text links or a secondary band below the fold.
+4. **Add the Candid Platinum seal and a "View our 990" footer link.** SDCC qualifies — claim it.
+5. **Surface the phone number above the fold** on every page. Not just /contact.
+6. **Rewrite the IDR card** to lead to an SDCC-hosted explainer first; the studentaid.gov link goes at the end of that explainer (so SDCC keeps the user, the email opt-in, and the Google ranking).
+7. **Add `aria-label` to icon-only links** to clear two of the six Lighthouse failures.
+8. **Stamp every Resources PDF "Reviewed [date]".** Stale resources cost grants.
+9. **Add a one-line Theory of Change link in the footer** even if it's just a single PDF.
+10. **Replace "Read More" generic links** with descriptive anchor text. Two-line fix per occurrence; clears the `link-text` failure and helps SEO.
+
+## The 90-day "now we're serious" punch list
+
+11. **Stand up the Cy Pres page** (separate spec written). One page, ten thousand dollars of unlocked revenue at minimum.
+12. **Migrate off Wix to a static-site build (Astro, Next.js, or Eleventy).** Fixes performance, accessibility, third-party-cookie audits, and SEO in one stroke. Estimated 4–8 weeks. Recurring Wix subscription savings will partially offset the build.
+13. **Move borrower stories from VocalReferences into a native HTML index.** Search-engine indexable, JSON-LD-tagged, mobile-friendly, donor-readable. SDCC's 82,475 stories are its single most valuable asset and they are currently trapped in a third-party widget.
+14. **Publish the funder list** with named foundations. Education Trust does this; the data shows it correlates with the 19%-of-grantees-getting-32%-of-grant-dollars pattern.
+15. **Add 8 free calculators** (PSLF, Parent PLUS, SAVE, ICR, IBR, PAYE, Partial Financial Hardship, TXT loan-listing tool) — modeled in the showcase. Free calculators are how Tate Esq drives 69 Google reviews and inbound consults.
+16. **Add a "Book a Call" page** with embedded video and Calendly. Mirrors tateesq.com/contact pattern; converts >5x better than a contact form for the 45+ cohort.
+17. **Add a Spanish-language toggle.** Lumina specifically funds bilingual borrower outreach.
+18. **Add the 20 long-tail keyword landing pages** (T1–T4 priority list in `research/keyword-landers.md`). These plug directly into 2025–26 search demand (SAVE blocked, Treasury servicing, default restart, garnishment, parents over 60).
+
+## How this connects to the $321K → $5M revenue gap
+
+Every item above either:
+- Removes a credibility blocker that costs SDCC mid-five-figure foundation gifts (#1, #2, #4, #8, #9, #14, #18), or
+- Unlocks a structural revenue line a peer already has but SDCC does not (#11 Cy Pres, #15 calculators driving consults, #16 Book a Call driving major-donor cultivation), or
+- Captures and retains the user instead of donating them to studentaid.gov (#5, #6, #13).
+
+These changes do not require SDCC to look like Education Trust. They require SDCC to look like a **2026** version of itself.
diff --git a/audit/report.html b/audit/report.html
new file mode 100644
index 0000000..0f61ba7
--- /dev/null
+++ b/audit/report.html
@@ -0,0 +1,2893 @@
+<!--
+@license
+Copyright 2018 Google LLC
+SPDX-License-Identifier: Apache-2.0
+-->
+<!doctype html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1">
+ <link rel="icon" href='data:image/svg+xml;utf8,<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48"><path d="m14 7 10-7 10 7v10h5v7h-5l5 24H9l5-24H9v-7h5V7Z" fill="%23F63"/><path d="M31.561 24H14l-1.689 8.105L31.561 24ZM18.983 48H9l1.022-4.907L35.723 32.27l1.663 7.98L18.983 48Z" fill="%23FFA385"/><path fill="%23FF3" d="M20.5 10h7v7h-7z"/></svg>'>
+ <title>Lighthouse Report</title>
+ <style>body {margin: 0}</style>
+</head>
+<body>
+ <noscript>Lighthouse report requires JavaScript. Please enable.</noscript>
+
+ <div id="lh-log"></div>
+
+ <script>window.__LIGHTHOUSE_JSON__ = {"lighthouseVersion":"13.1.0","requestedUrl":"https://www.studentdebtcrisis.org/","mainDocumentUrl":"https://www.studentdebtcrisis.org/","finalDisplayedUrl":"https://www.studentdebtcrisis.org/","finalUrl":"https://www.studentdebtcrisis.org/","fetchTime":"2026-04-25T14:16:29.174Z","gatherMode":"navigation","runWarnings":[],"userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36","environment":{"hostUserAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36","benchmarkIndex":3157.5,"credits":{"axe-core":"4.11.2"}},"audits":{"is-on-https":{"id":"is-on-https","title":"Uses HTTPS","description":"All sites should be protected with HTTPS, even ones that don't handle sensitive data. This includes avoiding [mixed content](https://developers.google.com/web/fundamentals/security/prevent-mixed-content/what-is-mixed-content), where some resources are loaded over HTTP despite the initial request being served over HTTPS. HTTPS prevents intruders from tampering with or passively listening in on the communications between your app and your users, and is a prerequisite for HTTP/2 and many new web platform APIs. [Learn more about HTTPS](https://developer.chrome.com/docs/lighthouse/pwa/is-on-https/).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"url","valueType":"url","label":"Insecure URL"},{"key":"resolution","valueType":"text","label":"Request Resolution"}],"items":[]}},"redirects-http":{"id":"redirects-http","title":"Redirects HTTP traffic to HTTPS","description":"Make sure that you redirect all HTTP traffic to HTTPS in order to enable secure web features for all your users. [Learn more](https://developer.chrome.com/docs/lighthouse/pwa/redirects-http/).","score":null,"scoreDisplayMode":"notApplicable"},"errors-in-console":{"id":"errors-in-console","title":"Browser errors were logged to the console","description":"Errors logged to the console indicate unresolved problems. They can come from network request failures and other browser concerns. [Learn more about this errors in console diagnostic audit](https://developer.chrome.com/docs/lighthouse/best-practices/errors-in-console/)","score":0,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"sourceLocation","valueType":"source-location","label":"Source"},{"key":"description","valueType":"code","label":"Description"}],"items":[{"source":"network","description":"Failed to load resource: the server responded with a status of 403 ()","sourceLocation":{"type":"source-location","url":"https://www.studentdebtcrisis.org/v1/bulk/report-exposures","urlProvider":"network","line":0,"column":0}},{"source":"network","description":"Failed to load resource: the server responded with a status of 502 ()","sourceLocation":{"type":"source-location","url":"https://www.studentdebtcrisis.org/_serverless/cookie-consent-settings-serverless/v1/cookie-banner-settings?languageCode=en","urlProvider":"network","line":0,"column":0}}]}},"image-aspect-ratio":{"id":"image-aspect-ratio","title":"Displays images with correct aspect ratio","description":"Image display dimensions should match natural aspect ratio. [Learn more about image aspect ratio](https://developer.chrome.com/docs/lighthouse/best-practices/image-aspect-ratio/).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","label":""},{"key":"url","valueType":"url","label":"URL"},{"key":"displayedAspectRatio","valueType":"text","label":"Aspect Ratio (Displayed)"},{"key":"actualAspectRatio","valueType":"text","label":"Aspect Ratio (Actual)"}],"items":[]}},"image-size-responsive":{"id":"image-size-responsive","title":"Serves images with appropriate resolution","description":"Image natural dimensions should be proportional to the display size and the pixel ratio to maximize image clarity. [Learn how to provide responsive images](https://web.dev/articles/serve-responsive-images).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","label":""},{"key":"url","valueType":"url","label":"URL"},{"key":"displayedSize","valueType":"text","label":"Displayed size"},{"key":"actualSize","valueType":"text","label":"Actual size"},{"key":"expectedSize","valueType":"text","label":"Expected size"}],"items":[]}},"deprecations":{"id":"deprecations","title":"Avoids deprecated APIs","description":"Deprecated APIs will eventually be removed from the browser. [Learn more about deprecated APIs](https://developer.chrome.com/docs/lighthouse/best-practices/deprecations/).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"value","valueType":"text","label":"Deprecation / Warning"},{"key":"source","valueType":"source-location","label":"Source"}],"items":[]}},"third-party-cookies":{"id":"third-party-cookies","title":"Uses third-party cookies","description":"Third-party cookies may be blocked in some contexts. [Learn more about preparing for third-party cookie restrictions](https://privacysandbox.google.com/cookies/prepare/overview).","score":0,"scoreDisplayMode":"binary","displayValue":"5 cookies found","details":{"type":"table","headings":[{"key":"name","valueType":"text","label":"Name"},{"key":"url","valueType":"url","label":"URL"}],"items":[{"name":"bSession","url":"https://panorama.wixapps.net/api/v1/bulklog"},{"name":"XSRF-TOKEN","url":"https://panorama.wixapps.net/api/v1/bulklog"},{"name":"bSession","url":"https://panorama.wixapps.net/api/v1/bulklog"},{"name":"AWSALBCORS","url":"https://panorama.wixapps.net/api/v1/bulklog"},{"name":"_can2_session","url":"https://actionnetwork.org/css/style-embed-v3.css"}]}},"valid-source-maps":{"id":"valid-source-maps","title":"Page has valid source maps","description":"Source maps translate minified code to the original source code. This helps developers debug in production. In addition, Lighthouse is able to provide further insights. Consider deploying source maps to take advantage of these benefits. [Learn more about source maps](https://developer.chrome.com/docs/devtools/javascript/source-maps/).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"scriptUrl","valueType":"url","subItemsHeading":{"key":"error"},"label":"URL"},{"key":"sourceMapUrl","valueType":"url","label":"Map URL"}],"items":[{"scriptUrl":"https://www.studentdebtcrisis.org/","sourceMapUrl":"https://www.studentdebtcrisis.org/handleAccessTokens.inline.dc220a1a.bundle.min.js.map","subItems":{"type":"subitems","items":[{"error":"Error: Failed fetching source map (400)"}]}},{"scriptUrl":"https://www.studentdebtcrisis.org/","sourceMapUrl":"https://www.studentdebtcrisis.org/overrideGlobals.inline.306e90d8.bundle.min.js.map","subItems":{"type":"subitems","items":[{"error":"Error: Failed fetching source map (400)"}]}},{"scriptUrl":"https://www.studentdebtcrisis.org/","sourceMapUrl":"https://www.studentdebtcrisis.org/sendFedopsLoadStarted.inline.1189ae2c.bundle.min.js.map","subItems":{"type":"subitems","items":[{"error":"Error: Failed fetching source map (400)"}]}},{"scriptUrl":"https://www.studentdebtcrisis.org/","sourceMapUrl":"https://www.studentdebtcrisis.org/webpack-runtime.5b4e16b4.bundle.min.js.map","subItems":{"type":"subitems","items":[{"error":"Error: Failed fetching source map (400)"}]}},{"scriptUrl":"https://www.studentdebtcrisis.org/","sourceMapUrl":"https://www.studentdebtcrisis.org/fastdom.inline.58a6f94c.bundle.min.js.map","subItems":{"type":"subitems","items":[{"error":"Error: Failed fetching source map (400)"}]}},{"scriptUrl":"https://www.studentdebtcrisis.org/","sourceMapUrl":"https://www.studentdebtcrisis.org/custom-element-utils.inline.dfd062cc.bundle.min.js.map","subItems":{"type":"subitems","items":[{"error":"Error: Failed fetching source map (400)"}]}},{"scriptUrl":"https://www.studentdebtcrisis.org/","sourceMapUrl":"https://www.studentdebtcrisis.org/initCustomElements.inline.25987d64.bundle.min.js.map","subItems":{"type":"subitems","items":[{"error":"Error: Failed fetching source map (400)"}]}},{"scriptUrl":"https://www.studentdebtcrisis.org/","sourceMapUrl":"https://www.studentdebtcrisis.org/externals-registry.inline.2c3a9b6e.bundle.min.js.map","subItems":{"type":"subitems","items":[{"error":"Error: Failed fetching source map (400)"}]}},{"scriptUrl":"https://www.studentdebtcrisis.org/","sourceMapUrl":"https://www.studentdebtcrisis.org/lazyCustomElementWrapper.inline.0a0bab45.bundle.min.js.map","subItems":{"type":"subitems","items":[{"error":"Error: Failed fetching source map (400)"}]}},{"scriptUrl":"https://www.studentdebtcrisis.org/","sourceMapUrl":"https://www.studentdebtcrisis.org/bi-common.inline.4cb8b6a1.bundle.min.js.map","subItems":{"type":"subitems","items":[{"error":"Error: Failed fetching source map (400)"}]}},{"scriptUrl":"https://www.studentdebtcrisis.org/","sourceMapUrl":"https://www.studentdebtcrisis.org/createPlatformWorker.inline.5582455f.bundle.min.js.map","subItems":{"type":"subitems","items":[{"error":"Error: Failed fetching source map (400)"}]}},{"scriptUrl":"https://www.studentdebtcrisis.org/","sourceMapUrl":"https://www.studentdebtcrisis.org/windowMessageRegister.inline.d8470fd7.bundle.min.js.map","subItems":{"type":"subitems","items":[{"error":"Error: Failed fetching source map (400)"}]}},{"scriptUrl":"https://www.studentdebtcrisis.org/","sourceMapUrl":"https://www.studentdebtcrisis.org/bi.inline.f636c49b.bundle.min.js.map","subItems":{"type":"subitems","items":[{"error":"Error: Failed fetching source map (400)"}]}},{"scriptUrl":"https://www.studentdebtcrisis.org/","sourceMapUrl":"https://www.studentdebtcrisis.org/sendBeat12.inline.b6bc7452.bundle.min.js.map","subItems":{"type":"subitems","items":[{"error":"Error: Failed fetching source map (400)"}]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/windowScroll.b6975c2a.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/windowScroll.b6975c2a.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/usedPlatformApis.b09c4d5c.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/usedPlatformApis.b09c4d5c.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/tslib.inline.ca2949bb.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/tslib.inline.ca2949bb.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/triggersAndReactions.23ab777e.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/triggersAndReactions.23ab777e.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/TPABaseComponent.a461f98b.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/TPABaseComponent.a461f98b.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/tpa.f72183ab.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/tpa.f72183ab.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/thunderbolt-components-registry.2b110099.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/thunderbolt-components-registry.2b110099.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/thunderbolt-commons.b6ac6398.bundle.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/thunderbolt-commons.b6ac6398.bundle.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/svgLoader.dda061e2.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/svgLoader.dda061e2.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/stores.0468e03d.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/stores.0468e03d.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/ssrCache.a72bfdc3.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/ssrCache.a72bfdc3.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/speculationRules.0f29966f.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/speculationRules.0f29966f.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/siteScrollBlocker.d38ddc5a.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/siteScrollBlocker.d38ddc5a.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/siteMembersWixCodeSdk.c31eca95.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/siteMembersWixCodeSdk.c31eca95.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/siteMembers.4f6f476c.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/siteMembers.4f6f476c.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/scrollToAnchor.c63ab772.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/scrollToAnchor.c63ab772.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/routerFetch.4fed4805.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/routerFetch.4fed4805.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/router.a868afca.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/router.a868afca.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/reporter-api.b7edb858.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/reporter-api.b7edb858.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/renderer.90f3ef29.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/renderer.90f3ef29.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/quickActionBar.35dbd2c2.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/quickActionBar.35dbd2c2.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/protectedPages.9e2f0c3d.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/protectedPages.9e2f0c3d.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/popups.4f64a536.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/popups.4f64a536.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/platformPubsub.bde4edad.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/platformPubsub.bde4edad.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/platform.884c7fe8.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/platform.884c7fe8.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/panorama.1bdf1744.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/panorama.1bdf1744.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/pageAnchors.b16478c5.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/pageAnchors.b16478c5.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/ooi.5da71659.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/ooi.5da71659.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/navigation.857097f4.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/navigation.857097f4.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/mpaNavigation.a6072a7b.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/mpaNavigation.a6072a7b.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/motion.4dedec96.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/motion.4dedec96.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/mobileFullScreen.3c69b7f5.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/mobileFullScreen.3c69b7f5.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/main.a5b51f31.bundle.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/main.a5b51f31.bundle.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/imagePlaceholder.a5c38083.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/imagePlaceholder.a5c38083.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/group_9.c8b7529f.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/group_9.c8b7529f.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/group_8.8d04ec73.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/group_8.8d04ec73.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/group_7.c0d47db2.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/group_7.c0d47db2.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/group_6.8fc8a69c.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/group_6.8fc8a69c.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/group_50.c5131fce.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/group_50.c5131fce.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/group_5.19f45dc1.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/group_5.19f45dc1.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/group_41.b4a59480.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/group_41.b4a59480.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/group_4.825d1a51.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/group_4.825d1a51.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/group_38.90c9557b.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/group_38.90c9557b.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/group_30.2abbdf6f.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/group_30.2abbdf6f.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/group_3.443a1623.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/group_3.443a1623.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/group_28.98f4bda8.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/group_28.98f4bda8.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/group_27.24507aab.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/group_27.24507aab.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/group_24.ae2b90b3.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/group_24.ae2b90b3.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/group_23.572bd6dc.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/group_23.572bd6dc.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/group_22.476583c6.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/group_22.476583c6.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/group_20.1128a55d.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/group_20.1128a55d.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/group_2.2c8bde99.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/group_2.2c8bde99.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/group_14.71cad7d9.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/group_14.71cad7d9.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/group_11.e2f9d796.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/group_11.e2f9d796.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/group_0.5120b1c2.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/group_0.5120b1c2.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/externalServices.bf1ce5f4.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/externalServices.bf1ce5f4.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/environmentWixCodeSdk.dbb376f6.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/environmentWixCodeSdk.dbb376f6.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/environmentService.ce65c260.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/environmentService.ce65c260.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/environment.aa72590f.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/environment.aa72590f.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/dynamicPages.1b10d791.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/dynamicPages.1b10d791.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/domStore.4d54a74d.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/domStore.4d54a74d.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/domSelectors.0df2cf2d.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/domSelectors.0df2cf2d.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/cyclicTabbing.7085d18c.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/cyclicTabbing.7085d18c.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/consentPolicy.c7f0149b.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/consentPolicy.c7f0149b.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/componentsLoader.07f88113.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/componentsLoader.07f88113.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/businessLogger.382014f6.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/businessLogger.382014f6.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/assetsLoader.1a4bd352.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/assetsLoader.1a4bd352.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/appMonitoring.d502493c.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/appMonitoring.d502493c.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/animationsWixCodeSdk.726e9885.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/animationsWixCodeSdk.726e9885.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/animations.49c55ede.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/animations.49c55ede.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/accessibilityBrowserZoom.6895cb62.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/accessibilityBrowserZoom.6895cb62.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/accessibility.5a528201.chunk.min.js","sourceMapUrl":"https://static.parastorage.com/services/wix-thunderbolt/dist/accessibility.5a528201.chunk.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/tag-manager-client/1.1028.0/siteTags.bundle.min.js","sourceMapUrl":"https://static.parastorage.com/services/tag-manager-client/1.1028.0/siteTags.bundle.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/profile-card-tpa-ooi/1.2916.0/ProfileCardViewerWidgetNoCss.bundle.min.js","sourceMapUrl":"https://static.parastorage.com/services/profile-card-tpa-ooi/1.2916.0/ProfileCardViewerWidgetNoCss.bundle.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[WPhoto_LiftedShadowPhoto].15573384.bundle.min.js","sourceMapUrl":"https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[WPhoto_LiftedShadowPhoto].15573384.bundle.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[StripColumnsContainer_Default].76b92073.bundle.min.js","sourceMapUrl":"https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[StripColumnsContainer_Default].76b92073.bundle.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[SlideShowSlide].0b8489af.bundle.min.js","sourceMapUrl":"https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[SlideShowSlide].0b8489af.bundle.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[SlideShowContainer].aec8153a.bundle.min.js","sourceMapUrl":"https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[SlideShowContainer].aec8153a.bundle.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[SkipToContentButton].8b0178bf.bundle.min.js","sourceMapUrl":"https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[SkipToContentButton].8b0178bf.bundle.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[QuickActionBar_floatingSkin].76343ac3.bundle.min.js","sourceMapUrl":"https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[QuickActionBar_floatingSkin].76343ac3.bundle.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[MeshGroup].ed33e0e4.bundle.min.js","sourceMapUrl":"https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[MeshGroup].ed33e0e4.bundle.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[MenuContainer_Classic].3866d25e.bundle.min.js","sourceMapUrl":"https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[MenuContainer_Classic].3866d25e.bundle.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[HtmlComponent].18b6b9b2.bundle.min.js","sourceMapUrl":"https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[HtmlComponent].18b6b9b2.bundle.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[FiveGridLine_SolidLine].72adc7c0.bundle.min.js","sourceMapUrl":"https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[FiveGridLine_SolidLine].72adc7c0.bundle.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[DropDownMenu_ComboBoxInputNavigation].47359326.bundle.min.js","sourceMapUrl":"https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[DropDownMenu_ComboBoxInputNavigation].47359326.bundle.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[Container_DefaultAreaSkin].2353971d.bundle.min.js","sourceMapUrl":"https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[Container_DefaultAreaSkin].2353971d.bundle.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[ClassicSection].7122231e.bundle.min.js","sourceMapUrl":"https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[ClassicSection].7122231e.bundle.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt_mobile.37766d1a.bundle.min.js","sourceMapUrl":"https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt_mobile.37766d1a.bundle.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt_bootstrap.f95e24fd.bundle.min.js","sourceMapUrl":"https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt_bootstrap.f95e24fd.bundle.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt_bootstrap-classic.28aa948b.bundle.min.js","sourceMapUrl":"https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt_bootstrap-classic.28aa948b.bundle.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/cookie-consent-banner-for-uou/1.819.0//app.bundle.min.js","sourceMapUrl":"https://static.parastorage.com/services/cookie-consent-banner-for-uou/1.819.0//app.bundle.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://static.parastorage.com/services/communities-blog-ooi/1.3167.0/PostListViewerWidgetNoCss.bundle.min.js","sourceMapUrl":"https://static.parastorage.com/services/communities-blog-ooi/1.3167.0/PostListViewerWidgetNoCss.bundle.min.js.map","subItems":{"type":"subitems","items":[]}},{"scriptUrl":"https://browser.sentry-cdn.com/7.120.3/modulemetadata.es5.min.js","sourceMapUrl":"https://browser.sentry-cdn.com/7.120.3/modulemetadata.es5.min.js.map","subItems":{"type":"subitems","items":[]}}]}},"csp-xss":{"id":"csp-xss","title":"Ensure CSP is effective against XSS attacks","description":"A strong Content Security Policy (CSP) significantly reduces the risk of cross-site scripting (XSS) attacks. [Learn how to use a CSP to prevent XSS](https://developer.chrome.com/docs/lighthouse/best-practices/csp-xss/)","score":1,"scoreDisplayMode":"informative","details":{"type":"table","headings":[{"key":"description","valueType":"text","subItemsHeading":{"key":"description"},"label":"Description"},{"key":"directive","valueType":"code","subItemsHeading":{"key":"directive"},"label":"Directive"},{"key":"severity","valueType":"text","subItemsHeading":{"key":"severity"},"label":"Severity"}],"items":[{"severity":"High","description":"No CSP found in enforcement mode"}]}},"has-hsts":{"id":"has-hsts","title":"Use a strong HSTS policy","description":"Deployment of the HSTS header significantly reduces the risk of downgrading HTTP connections and eavesdropping attacks. A rollout in stages, starting with a low max-age is recommended. [Learn more about using a strong HSTS policy.](https://developer.chrome.com/docs/lighthouse/best-practices/has-hsts)","score":1,"scoreDisplayMode":"informative","details":{"type":"table","headings":[{"key":"description","valueType":"text","subItemsHeading":{"key":"description"},"label":"Description"},{"key":"directive","valueType":"code","subItemsHeading":{"key":"directive"},"label":"Directive"},{"key":"severity","valueType":"text","subItemsHeading":{"key":"severity"},"label":"Severity"}],"items":[{"directive":"includeSubDomains","description":"No `includeSubDomains` directive found","severity":"Medium"},{"directive":"preload","description":"No `preload` directive found","severity":"Medium"}]}},"origin-isolation":{"id":"origin-isolation","title":"Ensure proper origin isolation with COOP","description":"The Cross-Origin-Opener-Policy (COOP) can be used to isolate the top-level window from other documents such as pop-ups. [Learn more about deploying the COOP header.](https://web.dev/articles/why-coop-coep#coop)","score":1,"scoreDisplayMode":"informative","details":{"type":"table","headings":[{"key":"description","valueType":"text","subItemsHeading":{"key":"description"},"label":"Description"},{"key":"directive","valueType":"code","subItemsHeading":{"key":"directive"},"label":"Directive"},{"key":"severity","valueType":"text","subItemsHeading":{"key":"severity"},"label":"Severity"}],"items":[{"description":"No COOP header found","severity":"High"}]}},"clickjacking-mitigation":{"id":"clickjacking-mitigation","title":"Mitigate clickjacking with XFO or CSP","description":"The `X-Frame-Options` (XFO) header or the `frame-ancestors` directive in the `Content-Security-Policy` (CSP) header control where a page can be embedded. These can mitigate clickjacking attacks by blocking some or all sites from embedding the page. [Learn more about mitigating clickjacking](https://developer.chrome.com/docs/lighthouse/best-practices/clickjacking-mitigation).","score":1,"scoreDisplayMode":"informative","details":{"type":"table","headings":[{"key":"description","valueType":"text","subItemsHeading":{"key":"description"},"label":"Description"},{"key":"severity","valueType":"text","subItemsHeading":{"key":"severity"},"label":"Severity"}],"items":[{"severity":"High","description":"No frame control policy found"}]}},"trusted-types-xss":{"id":"trusted-types-xss","title":"Mitigate DOM-based XSS with Trusted Types","description":"The `require-trusted-types-for` directive in the `Content-Security-Policy` (CSP) header instructs user agents to control the data passed to DOM XSS sink functions. [Learn more about mitigating DOM-based XSS with Trusted Types](https://developer.chrome.com/docs/lighthouse/best-practices/trusted-types-xss).","score":1,"scoreDisplayMode":"informative","details":{"type":"table","headings":[{"key":"description","valueType":"text","subItemsHeading":{"key":"description"},"label":"Description"},{"key":"severity","valueType":"text","subItemsHeading":{"key":"severity"},"label":"Severity"}],"items":[{"severity":"High","description":"No `Content-Security-Policy` header with Trusted Types directive found"}]}},"accesskeys":{"id":"accesskeys","title":"`[accesskey]` values are unique","description":"Access keys let users quickly focus a part of the page. For proper navigation, each access key must be unique. [Learn more about access keys](https://dequeuniversity.com/rules/axe/4.11/accesskeys).","score":null,"scoreDisplayMode":"notApplicable"},"aria-allowed-attr":{"id":"aria-allowed-attr","title":"`[aria-*]` attributes match their roles","description":"Each ARIA `role` supports a specific subset of `aria-*` attributes. Mismatching these invalidates the `aria-*` attributes. [Learn how to match ARIA attributes to their roles](https://dequeuniversity.com/rules/axe/4.11/aria-allowed-attr).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"relatedNode","valueType":"node"},"label":"Failing Elements"}],"items":[]}},"aria-allowed-role":{"id":"aria-allowed-role","title":"Uses ARIA roles only on compatible elements","description":"Many HTML elements can only be assigned certain ARIA roles. Using ARIA roles where they are not allowed can interfere with the accessibility of the web page. [Learn more about ARIA roles](https://dequeuniversity.com/rules/axe/4.11/aria-allowed-role).","score":null,"scoreDisplayMode":"notApplicable"},"aria-command-name":{"id":"aria-command-name","title":"`button`, `link`, and `menuitem` elements have accessible names","description":"When an element doesn't have an accessible name, screen readers announce it with a generic name, making it unusable for users who rely on screen readers. [Learn how to make command elements more accessible](https://dequeuniversity.com/rules/axe/4.11/aria-command-name).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"relatedNode","valueType":"node"},"label":"Failing Elements"}],"items":[]}},"aria-conditional-attr":{"id":"aria-conditional-attr","title":"ARIA attributes are used as specified for the element's role","description":"Some ARIA attributes are only allowed on an element under certain conditions. [Learn more about conditional ARIA attributes](https://dequeuniversity.com/rules/axe/4.11/aria-conditional-attr).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"relatedNode","valueType":"node"},"label":"Failing Elements"}],"items":[]}},"aria-deprecated-role":{"id":"aria-deprecated-role","title":"Deprecated ARIA roles were not used","description":"Deprecated ARIA roles may not be processed correctly by assistive technology. [Learn more about deprecated ARIA roles](https://dequeuniversity.com/rules/axe/4.11/aria-deprecated-role).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"relatedNode","valueType":"node"},"label":"Failing Elements"}],"items":[]}},"aria-dialog-name":{"id":"aria-dialog-name","title":"Elements with `role=\"dialog\"` or `role=\"alertdialog\"` have accessible names.","description":"ARIA dialog elements without accessible names may prevent screen readers users from discerning the purpose of these elements. [Learn how to make ARIA dialog elements more accessible](https://dequeuniversity.com/rules/axe/4.11/aria-dialog-name).","score":null,"scoreDisplayMode":"notApplicable"},"aria-hidden-body":{"id":"aria-hidden-body","title":"`[aria-hidden=\"true\"]` is not present on the document `\u003cbody>`","description":"Assistive technologies, like screen readers, work inconsistently when `aria-hidden=\"true\"` is set on the document `\u003cbody>`. [Learn how `aria-hidden` affects the document body](https://dequeuniversity.com/rules/axe/4.11/aria-hidden-body).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"relatedNode","valueType":"node"},"label":"Failing Elements"}],"items":[]}},"aria-hidden-focus":{"id":"aria-hidden-focus","title":"`[aria-hidden=\"true\"]` elements do not contain focusable descendents","description":"Focusable descendents within an `[aria-hidden=\"true\"]` element prevent those interactive elements from being available to users of assistive technologies like screen readers. [Learn how `aria-hidden` affects focusable elements](https://dequeuniversity.com/rules/axe/4.11/aria-hidden-focus).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"relatedNode","valueType":"node"},"label":"Failing Elements"}],"items":[]}},"aria-input-field-name":{"id":"aria-input-field-name","title":"ARIA input fields have accessible names","description":"When an input field doesn't have an accessible name, screen readers announce it with a generic name, making it unusable for users who rely on screen readers. [Learn more about input field labels](https://dequeuniversity.com/rules/axe/4.11/aria-input-field-name).","score":null,"scoreDisplayMode":"notApplicable"},"aria-meter-name":{"id":"aria-meter-name","title":"ARIA `meter` elements have accessible names","description":"When a meter element doesn't have an accessible name, screen readers announce it with a generic name, making it unusable for users who rely on screen readers. [Learn how to name `meter` elements](https://dequeuniversity.com/rules/axe/4.11/aria-meter-name).","score":null,"scoreDisplayMode":"notApplicable"},"aria-progressbar-name":{"id":"aria-progressbar-name","title":"ARIA `progressbar` elements have accessible names","description":"When a `progressbar` element doesn't have an accessible name, screen readers announce it with a generic name, making it unusable for users who rely on screen readers. [Learn how to label `progressbar` elements](https://dequeuniversity.com/rules/axe/4.11/aria-progressbar-name).","score":null,"scoreDisplayMode":"notApplicable"},"aria-prohibited-attr":{"id":"aria-prohibited-attr","title":"Elements use only permitted ARIA attributes","description":"Using ARIA attributes in roles where they are prohibited can mean that important information is not communicated to users of assistive technologies. [Learn more about prohibited ARIA roles](https://dequeuniversity.com/rules/axe/4.11/aria-prohibited-attr).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"relatedNode","valueType":"node"},"label":"Failing Elements"}],"items":[]}},"aria-required-attr":{"id":"aria-required-attr","title":"`[role]`s have all required `[aria-*]` attributes","description":"Some ARIA roles have required attributes that describe the state of the element to screen readers. [Learn more about roles and required attributes](https://dequeuniversity.com/rules/axe/4.11/aria-required-attr).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"relatedNode","valueType":"node"},"label":"Failing Elements"}],"items":[]}},"aria-required-children":{"id":"aria-required-children","title":"Elements with an ARIA `[role]` that require children to contain a specific `[role]` have all required children.","description":"Some ARIA parent roles must contain specific child roles to perform their intended accessibility functions. [Learn more about roles and required children elements](https://dequeuniversity.com/rules/axe/4.11/aria-required-children).","score":null,"scoreDisplayMode":"notApplicable"},"aria-required-parent":{"id":"aria-required-parent","title":"`[role]`s are contained by their required parent element","description":"Some ARIA child roles must be contained by specific parent roles to properly perform their intended accessibility functions. [Learn more about ARIA roles and required parent element](https://dequeuniversity.com/rules/axe/4.11/aria-required-parent).","score":null,"scoreDisplayMode":"notApplicable"},"aria-roles":{"id":"aria-roles","title":"`[role]` values are valid","description":"ARIA roles must have valid values in order to perform their intended accessibility functions. [Learn more about valid ARIA roles](https://dequeuniversity.com/rules/axe/4.11/aria-roles).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"relatedNode","valueType":"node"},"label":"Failing Elements"}],"items":[]}},"aria-text":{"id":"aria-text","title":"Elements with the `role=text` attribute do not have focusable descendents.","description":"Adding `role=text` around a text node split by markup enables VoiceOver to treat it as one phrase, but the element's focusable descendents will not be announced. [Learn more about the `role=text` attribute](https://dequeuniversity.com/rules/axe/4.11/aria-text).","score":null,"scoreDisplayMode":"notApplicable"},"aria-toggle-field-name":{"id":"aria-toggle-field-name","title":"ARIA toggle fields have accessible names","description":"When a toggle field doesn't have an accessible name, screen readers announce it with a generic name, making it unusable for users who rely on screen readers. [Learn more about toggle fields](https://dequeuniversity.com/rules/axe/4.11/aria-toggle-field-name).","score":null,"scoreDisplayMode":"notApplicable"},"aria-tooltip-name":{"id":"aria-tooltip-name","title":"ARIA `tooltip` elements have accessible names","description":"When a tooltip element doesn't have an accessible name, screen readers announce it with a generic name, making it unusable for users who rely on screen readers. [Learn how to name `tooltip` elements](https://dequeuniversity.com/rules/axe/4.11/aria-tooltip-name).","score":null,"scoreDisplayMode":"notApplicable"},"aria-treeitem-name":{"id":"aria-treeitem-name","title":"ARIA `treeitem` elements have accessible names","description":"When a `treeitem` element doesn't have an accessible name, screen readers announce it with a generic name, making it unusable for users who rely on screen readers. [Learn more about labeling `treeitem` elements](https://dequeuniversity.com/rules/axe/4.11/aria-treeitem-name).","score":null,"scoreDisplayMode":"notApplicable"},"aria-valid-attr-value":{"id":"aria-valid-attr-value","title":"`[aria-*]` attributes have valid values","description":"Assistive technologies, like screen readers, can't interpret ARIA attributes with invalid values. [Learn more about valid values for ARIA attributes](https://dequeuniversity.com/rules/axe/4.11/aria-valid-attr-value).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"relatedNode","valueType":"node"},"label":"Failing Elements"}],"items":[]}},"aria-valid-attr":{"id":"aria-valid-attr","title":"`[aria-*]` attributes are valid and not misspelled","description":"Assistive technologies, like screen readers, can't interpret ARIA attributes with invalid names. [Learn more about valid ARIA attributes](https://dequeuniversity.com/rules/axe/4.11/aria-valid-attr).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"relatedNode","valueType":"node"},"label":"Failing Elements"}],"items":[]}},"button-name":{"id":"button-name","title":"Buttons have an accessible name","description":"When a button doesn't have an accessible name, screen readers announce it as \"button\", making it unusable for users who rely on screen readers. [Learn how to make buttons more accessible](https://dequeuniversity.com/rules/axe/4.11/button-name).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"relatedNode","valueType":"node"},"label":"Failing Elements"}],"items":[]}},"bypass":{"id":"bypass","title":"The page contains a heading, skip link, or landmark region","description":"Adding ways to bypass repetitive content lets keyboard users navigate the page more efficiently. [Learn more about bypass blocks](https://dequeuniversity.com/rules/axe/4.11/bypass).","score":null,"scoreDisplayMode":"notApplicable"},"color-contrast":{"id":"color-contrast","title":"Background and foreground colors have a sufficient contrast ratio","description":"Low-contrast text is difficult or impossible for many users to read. [Learn how to provide sufficient color contrast](https://dequeuniversity.com/rules/axe/4.11/color-contrast).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"relatedNode","valueType":"node"},"label":"Failing Elements"}],"items":[]}},"definition-list":{"id":"definition-list","title":"`\u003cdl>`'s contain only properly-ordered `\u003cdt>` and `\u003cdd>` groups, `\u003cscript>`, `\u003ctemplate>` or `\u003cdiv>` elements.","description":"When definition lists are not properly marked up, screen readers may produce confusing or inaccurate output. [Learn how to structure definition lists correctly](https://dequeuniversity.com/rules/axe/4.11/definition-list).","score":null,"scoreDisplayMode":"notApplicable"},"dlitem":{"id":"dlitem","title":"Definition list items are wrapped in `\u003cdl>` elements","description":"Definition list items (`\u003cdt>` and `\u003cdd>`) must be wrapped in a parent `\u003cdl>` element to ensure that screen readers can properly announce them. [Learn how to structure definition lists correctly](https://dequeuniversity.com/rules/axe/4.11/dlitem).","score":null,"scoreDisplayMode":"notApplicable"},"document-title":{"id":"document-title","title":"Document has a `\u003ctitle>` element","description":"The title gives screen reader users an overview of the page, and search engine users rely on it heavily to determine if a page is relevant to their search. [Learn more about document titles](https://dequeuniversity.com/rules/axe/4.11/document-title).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"relatedNode","valueType":"node"},"label":"Failing Elements"}],"items":[]}},"duplicate-id-aria":{"id":"duplicate-id-aria","title":"ARIA IDs are unique","description":"The value of an ARIA ID must be unique to prevent other instances from being overlooked by assistive technologies. [Learn how to fix duplicate ARIA IDs](https://dequeuniversity.com/rules/axe/4.11/duplicate-id-aria).","score":null,"scoreDisplayMode":"notApplicable"},"empty-heading":{"id":"empty-heading","title":"All heading elements contain content.","description":"A heading with no content or inaccessible text prevent screen reader users from accessing information on the page's structure. [Learn more about headings](https://dequeuniversity.com/rules/axe/4.11/empty-heading).","score":null,"scoreDisplayMode":"notApplicable"},"form-field-multiple-labels":{"id":"form-field-multiple-labels","title":"No form fields have multiple labels","description":"Form fields with multiple labels can be confusingly announced by assistive technologies like screen readers which use either the first, the last, or all of the labels. [Learn how to use form labels](https://dequeuniversity.com/rules/axe/4.11/form-field-multiple-labels).","score":null,"scoreDisplayMode":"notApplicable"},"frame-title":{"id":"frame-title","title":"`\u003cframe>` or `\u003ciframe>` elements have a title","description":"Screen reader users rely on frame titles to describe the contents of frames. [Learn more about frame titles](https://dequeuniversity.com/rules/axe/4.11/frame-title).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"relatedNode","valueType":"node"},"label":"Failing Elements"}],"items":[]}},"heading-order":{"id":"heading-order","title":"Heading elements appear in a sequentially-descending order","description":"Properly ordered headings that do not skip levels convey the semantic structure of the page, making it easier to navigate and understand when using assistive technologies. [Learn more about heading order](https://dequeuniversity.com/rules/axe/4.11/heading-order).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"relatedNode","valueType":"node"},"label":"Failing Elements"}],"items":[]}},"html-has-lang":{"id":"html-has-lang","title":"`\u003chtml>` element has a `[lang]` attribute","description":"If a page doesn't specify a `lang` attribute, a screen reader assumes that the page is in the default language that the user chose when setting up the screen reader. If the page isn't actually in the default language, then the screen reader might not announce the page's text correctly. [Learn more about the `lang` attribute](https://dequeuniversity.com/rules/axe/4.11/html-has-lang).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"relatedNode","valueType":"node"},"label":"Failing Elements"}],"items":[]}},"html-lang-valid":{"id":"html-lang-valid","title":"`\u003chtml>` element has a valid value for its `[lang]` attribute","description":"Specifying a valid [BCP 47 language](https://www.w3.org/International/questions/qa-choosing-language-tags#question) helps screen readers announce text properly. [Learn how to use the `lang` attribute](https://dequeuniversity.com/rules/axe/4.11/html-lang-valid).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"relatedNode","valueType":"node"},"label":"Failing Elements"}],"items":[]}},"html-xml-lang-mismatch":{"id":"html-xml-lang-mismatch","title":"`\u003chtml>` element has an `[xml:lang]` attribute with the same base language as the `[lang]` attribute.","description":"If the webpage does not specify a consistent language, then the screen reader might not announce the page's text correctly. [Learn more about the `lang` attribute](https://dequeuniversity.com/rules/axe/4.11/html-xml-lang-mismatch).","score":null,"scoreDisplayMode":"notApplicable"},"identical-links-same-purpose":{"id":"identical-links-same-purpose","title":"Identical links have the same purpose.","description":"Links with the same destination should have the same description, to help users understand the link's purpose and decide whether to follow it. [Learn more about identical links](https://dequeuniversity.com/rules/axe/4.11/identical-links-same-purpose).","score":null,"scoreDisplayMode":"notApplicable"},"image-alt":{"id":"image-alt","title":"Image elements have `[alt]` attributes","description":"Informative elements should aim for short, descriptive alternate text. Decorative elements can be ignored with an empty alt attribute. [Learn more about the `alt` attribute](https://dequeuniversity.com/rules/axe/4.11/image-alt).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"relatedNode","valueType":"node"},"label":"Failing Elements"}],"items":[]}},"image-redundant-alt":{"id":"image-redundant-alt","title":"Image elements do not have `[alt]` attributes that are redundant text.","description":"Informative elements should aim for short, descriptive alternative text. Alternative text that is exactly the same as the text adjacent to the link or image is potentially confusing for screen reader users, because the text will be read twice. [Learn more about the `alt` attribute](https://dequeuniversity.com/rules/axe/4.11/image-redundant-alt).","score":null,"scoreDisplayMode":"notApplicable"},"input-button-name":{"id":"input-button-name","title":"Input buttons have discernible text.","description":"Adding discernable and accessible text to input buttons may help screen reader users understand the purpose of the input button. [Learn more about input buttons](https://dequeuniversity.com/rules/axe/4.11/input-button-name).","score":null,"scoreDisplayMode":"notApplicable"},"input-image-alt":{"id":"input-image-alt","title":"`\u003cinput type=\"image\">` elements have `[alt]` text","description":"When an image is being used as an `\u003cinput>` button, providing alternative text can help screen reader users understand the purpose of the button. [Learn about input image alt text](https://dequeuniversity.com/rules/axe/4.11/input-image-alt).","score":null,"scoreDisplayMode":"notApplicable"},"label-content-name-mismatch":{"id":"label-content-name-mismatch","title":"Elements with visible text labels have matching accessible names.","description":"Visible text labels that do not match the accessible name can result in a confusing experience for screen reader users. [Learn more about accessible names](https://dequeuniversity.com/rules/axe/4.11/label-content-name-mismatch).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"relatedNode","valueType":"node"},"label":"Failing Elements"}],"items":[]}},"label":{"id":"label","title":"Form elements have associated labels","description":"Labels ensure that form controls are announced properly by assistive technologies, like screen readers. [Learn more about form element labels](https://dequeuniversity.com/rules/axe/4.11/label).","score":null,"scoreDisplayMode":"notApplicable"},"landmark-one-main":{"id":"landmark-one-main","title":"Document has a main landmark.","description":"One main landmark helps screen reader users navigate a web page. [Learn more about landmarks](https://dequeuniversity.com/rules/axe/4.11/landmark-one-main).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"relatedNode","valueType":"node"},"label":"Failing Elements"}],"items":[]}},"link-name":{"id":"link-name","title":"Links do not have a discernible name","description":"Link text (and alternate text for images, when used as links) that is discernible, unique, and focusable improves the navigation experience for screen reader users. [Learn how to make links accessible](https://dequeuniversity.com/rules/axe/4.11/link-name).","score":0,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"relatedNode","valueType":"node"},"label":"Failing Elements"}],"items":[{"node":{"type":"node","lhId":"1-0-A","path":"1,HTML,1,BODY,9,DIV,0,DIV,3,DIV,0,DIV,0,HEADER,1,DIV,1,DIV,0,DIV,0,DIV,0,SECTION,1,DIV,0,DIV,1,DIV,0,DIV,0,DIV,0,A","selector":"div > div > div#comp-jg3bd4sj > a.aeyn4z","boundingRect":{"top":25,"bottom":50,"left":528,"right":548,"width":20,"height":25},"snippet":"\u003ca data-testid=\"linkElement\" href=\"https://www.studentdebtcrisis.org\" target=\"_self\" class=\"aeyn4z\">","nodeLabel":"div > div > div#comp-jg3bd4sj > a.aeyn4z","explanation":"Fix all of the following:\n Element is in tab order and does not have accessible text\n\nFix any of the following:\n Element does not have text that is visible to screen readers\n aria-label attribute does not exist or is empty\n aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty\n Element has no title attribute"}}],"debugData":{"type":"debugdata","impact":"serious","tags":["cat.name-role-value","wcag2a","wcag244","wcag412","section508","section508.22.a","TTv5","TT6.a","EN-301-549","EN-9.2.4.4","EN-9.4.1.2","ACT","RGAAv4","RGAA-6.2.1"]}}},"link-in-text-block":{"id":"link-in-text-block","title":"Links are distinguishable without relying on color.","description":"Low-contrast text is difficult or impossible for many users to read. Link text that is discernible improves the experience for users with low vision. [Learn how to make links distinguishable](https://dequeuniversity.com/rules/axe/4.11/link-in-text-block).","score":null,"scoreDisplayMode":"notApplicable"},"list":{"id":"list","title":"Lists contain only `\u003cli>` elements and script supporting elements (`\u003cscript>` and `\u003ctemplate>`).","description":"Screen readers have a specific way of announcing lists. Ensuring proper list structure aids screen reader output. [Learn more about proper list structure](https://dequeuniversity.com/rules/axe/4.11/list).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"relatedNode","valueType":"node"},"label":"Failing Elements"}],"items":[]}},"listitem":{"id":"listitem","title":"List items (`\u003cli>`) are contained within `\u003cul>`, `\u003col>` or `\u003cmenu>` parent elements","description":"Screen readers require list items (`\u003cli>`) to be contained within a parent `\u003cul>`, `\u003col>` or `\u003cmenu>` to be announced properly. [Learn more about proper list structure](https://dequeuniversity.com/rules/axe/4.11/listitem).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"relatedNode","valueType":"node"},"label":"Failing Elements"}],"items":[]}},"meta-refresh":{"id":"meta-refresh","title":"The document does not use `\u003cmeta http-equiv=\"refresh\">`","description":"Users do not expect a page to refresh automatically, and doing so will move focus back to the top of the page. This may create a frustrating or confusing experience. [Learn more about the refresh meta tag](https://dequeuniversity.com/rules/axe/4.11/meta-refresh).","score":null,"scoreDisplayMode":"notApplicable"},"meta-viewport":{"id":"meta-viewport","title":"`[user-scalable=\"no\"]` is not used in the `\u003cmeta name=\"viewport\">` element and the `[maximum-scale]` attribute is not less than 5.","description":"Disabling zooming is problematic for users with low vision who rely on screen magnification to properly see the contents of a web page. [Learn more about the viewport meta tag](https://dequeuniversity.com/rules/axe/4.11/meta-viewport).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"relatedNode","valueType":"node"},"label":"Failing Elements"}],"items":[]}},"object-alt":{"id":"object-alt","title":"`\u003cobject>` elements have alternate text","description":"Screen readers cannot translate non-text content. Adding alternate text to `\u003cobject>` elements helps screen readers convey meaning to users. [Learn more about alt text for `object` elements](https://dequeuniversity.com/rules/axe/4.11/object-alt).","score":null,"scoreDisplayMode":"notApplicable"},"select-name":{"id":"select-name","title":"Select elements have associated label elements.","description":"Form elements without effective labels can create frustrating experiences for screen reader users. [Learn more about the `select` element](https://dequeuniversity.com/rules/axe/4.11/select-name).","score":null,"scoreDisplayMode":"notApplicable"},"skip-link":{"id":"skip-link","title":"Skip links are focusable.","description":"Including a skip link can help users skip to the main content to save time. [Learn more about skip links](https://dequeuniversity.com/rules/axe/4.11/skip-link).","score":null,"scoreDisplayMode":"notApplicable"},"tabindex":{"id":"tabindex","title":"No element has a `[tabindex]` value greater than 0","description":"A value greater than 0 implies an explicit navigation ordering. Although technically valid, this often creates frustrating experiences for users who rely on assistive technologies. [Learn more about the `tabindex` attribute](https://dequeuniversity.com/rules/axe/4.11/tabindex).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"relatedNode","valueType":"node"},"label":"Failing Elements"}],"items":[]}},"table-duplicate-name":{"id":"table-duplicate-name","title":"Tables have different content in the summary attribute and `\u003ccaption>`.","description":"The summary attribute should describe the table structure, while `\u003ccaption>` should have the onscreen title. Accurate table mark-up helps users of screen readers. [Learn more about summary and caption](https://dequeuniversity.com/rules/axe/4.11/table-duplicate-name).","score":null,"scoreDisplayMode":"notApplicable"},"table-fake-caption":{"id":"table-fake-caption","title":"Tables use `\u003ccaption>` instead of cells with the `[colspan]` attribute to indicate a caption.","description":"Screen readers have features to make navigating tables easier. Ensuring that tables use the actual caption element instead of cells with the `[colspan]` attribute may improve the experience for screen reader users. [Learn more about captions](https://dequeuniversity.com/rules/axe/4.11/table-fake-caption).","score":null,"scoreDisplayMode":"notApplicable"},"target-size":{"id":"target-size","title":"Touch targets do not have sufficient size or spacing.","description":"Touch targets with sufficient size and spacing help users who may have difficulty targeting small controls to activate the targets. [Learn more about touch targets](https://dequeuniversity.com/rules/axe/4.11/target-size).","score":0,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"relatedNode","valueType":"node"},"label":"Failing Elements"}],"items":[{"node":{"type":"node","lhId":"1-1-A","path":"1,HTML,1,BODY,9,DIV,0,DIV,3,DIV,0,DIV,1,MAIN,0,DIV,0,DIV,1,DIV,0,DIV,0,DIV,0,DIV,3,SECTION,1,DIV,0,DIV,2,SECTION,1,DIV,0,DIV,1,DIV,0,DIV,0,DIV,4,NAV,0,OL,0,LI,0,A","selector":"nav.lZ5yqT > ol.dZxZOk > li > a.ZVUGJp","boundingRect":{"top":2511,"bottom":2519,"left":641,"right":649,"width":8,"height":8},"snippet":"\u003ca href=\"./#comp-llvrt3hh\" aria-label=\"Section3SlideShowItem1MediaImage1\" class=\"ZVUGJp Ale4Rm\">","nodeLabel":"Section3SlideShowItem1MediaImage1","explanation":"Fix any of the following:\n Target has insufficient size (8px by 8px, should be at least 24px by 24px)\n Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of 22px instead of at least 24px."},"subItems":{"type":"subitems","items":[{"relatedNode":{"type":"node","lhId":"1-2-A","path":"1,HTML,1,BODY,9,DIV,0,DIV,3,DIV,0,DIV,1,MAIN,0,DIV,0,DIV,1,DIV,0,DIV,0,DIV,0,DIV,3,SECTION,1,DIV,0,DIV,2,SECTION,1,DIV,0,DIV,1,DIV,0,DIV,0,DIV,4,NAV,0,OL,1,LI,0,A","selector":"nav.lZ5yqT > ol.dZxZOk > li > a.ZVUGJp","boundingRect":{"top":2511,"bottom":2519,"left":664,"right":672,"width":8,"height":8},"snippet":"\u003ca href=\"./#comp-llvrt3hm5\" aria-label=\"Section3SlideShowItem2MediaImage1\" class=\"ZVUGJp\">","nodeLabel":"Section3SlideShowItem2MediaImage1"}}]}},{"node":{"type":"node","lhId":"1-2-A","path":"1,HTML,1,BODY,9,DIV,0,DIV,3,DIV,0,DIV,1,MAIN,0,DIV,0,DIV,1,DIV,0,DIV,0,DIV,0,DIV,3,SECTION,1,DIV,0,DIV,2,SECTION,1,DIV,0,DIV,1,DIV,0,DIV,0,DIV,4,NAV,0,OL,1,LI,0,A","selector":"nav.lZ5yqT > ol.dZxZOk > li > a.ZVUGJp","boundingRect":{"top":2511,"bottom":2519,"left":664,"right":672,"width":8,"height":8},"snippet":"\u003ca href=\"./#comp-llvrt3hm5\" aria-label=\"Section3SlideShowItem2MediaImage1\" class=\"ZVUGJp\">","nodeLabel":"Section3SlideShowItem2MediaImage1","explanation":"Fix any of the following:\n Target has insufficient size (8px by 8px, should be at least 24px by 24px)\n Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of 22px instead of at least 24px."},"subItems":{"type":"subitems","items":[{"relatedNode":{"type":"node","lhId":"1-1-A","path":"1,HTML,1,BODY,9,DIV,0,DIV,3,DIV,0,DIV,1,MAIN,0,DIV,0,DIV,1,DIV,0,DIV,0,DIV,0,DIV,3,SECTION,1,DIV,0,DIV,2,SECTION,1,DIV,0,DIV,1,DIV,0,DIV,0,DIV,4,NAV,0,OL,0,LI,0,A","selector":"nav.lZ5yqT > ol.dZxZOk > li > a.ZVUGJp","boundingRect":{"top":2511,"bottom":2519,"left":641,"right":649,"width":8,"height":8},"snippet":"\u003ca href=\"./#comp-llvrt3hh\" aria-label=\"Section3SlideShowItem1MediaImage1\" class=\"ZVUGJp Ale4Rm\">","nodeLabel":"Section3SlideShowItem1MediaImage1"}},{"relatedNode":{"type":"node","lhId":"1-3-A","path":"1,HTML,1,BODY,9,DIV,0,DIV,3,DIV,0,DIV,1,MAIN,0,DIV,0,DIV,1,DIV,0,DIV,0,DIV,0,DIV,3,SECTION,1,DIV,0,DIV,2,SECTION,1,DIV,0,DIV,1,DIV,0,DIV,0,DIV,4,NAV,0,OL,2,LI,0,A","selector":"nav.lZ5yqT > ol.dZxZOk > li > a.ZVUGJp","boundingRect":{"top":2511,"bottom":2519,"left":687,"right":695,"width":8,"height":8},"snippet":"\u003ca href=\"./#comp-llvrt3hr\" aria-label=\"Section3SlideShowItem3MediaImage1\" class=\"ZVUGJp\">","nodeLabel":"Section3SlideShowItem3MediaImage1"}}]}},{"node":{"type":"node","lhId":"1-3-A","path":"1,HTML,1,BODY,9,DIV,0,DIV,3,DIV,0,DIV,1,MAIN,0,DIV,0,DIV,1,DIV,0,DIV,0,DIV,0,DIV,3,SECTION,1,DIV,0,DIV,2,SECTION,1,DIV,0,DIV,1,DIV,0,DIV,0,DIV,4,NAV,0,OL,2,LI,0,A","selector":"nav.lZ5yqT > ol.dZxZOk > li > a.ZVUGJp","boundingRect":{"top":2511,"bottom":2519,"left":687,"right":695,"width":8,"height":8},"snippet":"\u003ca href=\"./#comp-llvrt3hr\" aria-label=\"Section3SlideShowItem3MediaImage1\" class=\"ZVUGJp\">","nodeLabel":"Section3SlideShowItem3MediaImage1","explanation":"Fix any of the following:\n Target has insufficient size (8px by 8px, should be at least 24px by 24px)\n Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of 22px instead of at least 24px."},"subItems":{"type":"subitems","items":[{"relatedNode":{"type":"node","lhId":"1-2-A","path":"1,HTML,1,BODY,9,DIV,0,DIV,3,DIV,0,DIV,1,MAIN,0,DIV,0,DIV,1,DIV,0,DIV,0,DIV,0,DIV,3,SECTION,1,DIV,0,DIV,2,SECTION,1,DIV,0,DIV,1,DIV,0,DIV,0,DIV,4,NAV,0,OL,1,LI,0,A","selector":"nav.lZ5yqT > ol.dZxZOk > li > a.ZVUGJp","boundingRect":{"top":2511,"bottom":2519,"left":664,"right":672,"width":8,"height":8},"snippet":"\u003ca href=\"./#comp-llvrt3hm5\" aria-label=\"Section3SlideShowItem2MediaImage1\" class=\"ZVUGJp\">","nodeLabel":"Section3SlideShowItem2MediaImage1"}}]}}],"debugData":{"type":"debugdata","impact":"serious","tags":["cat.sensory-and-visual-cues","wcag22aa","wcag258"]}}},"td-has-header":{"id":"td-has-header","title":"`\u003ctd>` elements in a large `\u003ctable>` have one or more table headers.","description":"Screen readers have features to make navigating tables easier. Ensuring that `\u003ctd>` elements in a large table (3 or more cells in width and height) have an associated table header may improve the experience for screen reader users. [Learn more about table headers](https://dequeuniversity.com/rules/axe/4.11/td-has-header).","score":null,"scoreDisplayMode":"notApplicable"},"td-headers-attr":{"id":"td-headers-attr","title":"Cells in a `\u003ctable>` element that use the `[headers]` attribute refer to table cells within the same table.","description":"Screen readers have features to make navigating tables easier. Ensuring `\u003ctd>` cells using the `[headers]` attribute only refer to other cells in the same table may improve the experience for screen reader users. [Learn more about the `headers` attribute](https://dequeuniversity.com/rules/axe/4.11/td-headers-attr).","score":null,"scoreDisplayMode":"notApplicable"},"th-has-data-cells":{"id":"th-has-data-cells","title":"`\u003cth>` elements and elements with `[role=\"columnheader\"/\"rowheader\"]` have data cells they describe.","description":"Screen readers have features to make navigating tables easier. Ensuring table headers always refer to some set of cells may improve the experience for screen reader users. [Learn more about table headers](https://dequeuniversity.com/rules/axe/4.11/th-has-data-cells).","score":null,"scoreDisplayMode":"notApplicable"},"valid-lang":{"id":"valid-lang","title":"`[lang]` attributes have a valid value","description":"Specifying a valid [BCP 47 language](https://www.w3.org/International/questions/qa-choosing-language-tags#question) on elements helps ensure that text is pronounced correctly by a screen reader. [Learn how to use the `lang` attribute](https://dequeuniversity.com/rules/axe/4.11/valid-lang).","score":null,"scoreDisplayMode":"notApplicable"},"video-caption":{"id":"video-caption","title":"`\u003cvideo>` elements contain a `\u003ctrack>` element with `[kind=\"captions\"]`","description":"When a video provides a caption it is easier for deaf and hearing impaired users to access its information. [Learn more about video captions](https://dequeuniversity.com/rules/axe/4.11/video-caption).","score":null,"scoreDisplayMode":"notApplicable"},"custom-controls-labels":{"id":"custom-controls-labels","title":"Custom controls have associated labels","description":"Custom interactive controls have associated labels, provided by aria-label or aria-labelledby. [Learn more about custom controls and labels](https://developer.chrome.com/docs/lighthouse/accessibility/custom-controls-labels/).","score":null,"scoreDisplayMode":"manual"},"custom-controls-roles":{"id":"custom-controls-roles","title":"Custom controls have ARIA roles","description":"Custom interactive controls have appropriate ARIA roles. [Learn how to add roles to custom controls](https://developer.chrome.com/docs/lighthouse/accessibility/custom-control-roles/).","score":null,"scoreDisplayMode":"manual"},"focus-traps":{"id":"focus-traps","title":"User focus is not accidentally trapped in a region","description":"A user can tab into and out of any control or region without accidentally trapping their focus. [Learn how to avoid focus traps](https://developer.chrome.com/docs/lighthouse/accessibility/focus-traps/).","score":null,"scoreDisplayMode":"manual"},"focusable-controls":{"id":"focusable-controls","title":"Interactive controls are keyboard focusable","description":"Custom interactive controls are keyboard focusable and display a focus indicator. [Learn how to make custom controls focusable](https://developer.chrome.com/docs/lighthouse/accessibility/focusable-controls/).","score":null,"scoreDisplayMode":"manual"},"interactive-element-affordance":{"id":"interactive-element-affordance","title":"Interactive elements indicate their purpose and state","description":"Interactive elements, such as links and buttons, should indicate their state and be distinguishable from non-interactive elements. [Learn how to decorate interactive elements with affordance hints](https://developer.chrome.com/docs/lighthouse/accessibility/interactive-element-affordance/).","score":null,"scoreDisplayMode":"manual"},"logical-tab-order":{"id":"logical-tab-order","title":"The page has a logical tab order","description":"Tabbing through the page follows the visual layout. Users cannot focus elements that are offscreen. [Learn more about logical tab ordering](https://developer.chrome.com/docs/lighthouse/accessibility/logical-tab-order/).","score":null,"scoreDisplayMode":"manual"},"managed-focus":{"id":"managed-focus","title":"The user's focus is directed to new content added to the page","description":"If new content, such as a dialog, is added to the page, the user's focus is directed to it. [Learn how to direct focus to new content](https://developer.chrome.com/docs/lighthouse/accessibility/managed-focus/).","score":null,"scoreDisplayMode":"manual"},"offscreen-content-hidden":{"id":"offscreen-content-hidden","title":"Offscreen content is hidden from assistive technology","description":"Offscreen content is hidden with display: none or aria-hidden=true. [Learn how to properly hide offscreen content](https://developer.chrome.com/docs/lighthouse/accessibility/offscreen-content-hidden/).","score":null,"scoreDisplayMode":"manual"},"use-landmarks":{"id":"use-landmarks","title":"HTML5 landmark elements are used to improve navigation","description":"Landmark elements (`\u003cmain>`, `\u003cnav>`, etc.) are used to improve the keyboard navigation of the page for assistive technology. [Learn more about landmark elements](https://developer.chrome.com/docs/lighthouse/accessibility/use-landmarks/).","score":null,"scoreDisplayMode":"manual"},"visual-order-follows-dom":{"id":"visual-order-follows-dom","title":"Visual order on the page follows DOM order","description":"DOM order matches the visual order, improving navigation for assistive technology. [Learn more about DOM and visual ordering](https://developer.chrome.com/docs/lighthouse/accessibility/visual-order-follows-dom/).","score":null,"scoreDisplayMode":"manual"},"autocomplete-valid":{"id":"autocomplete-valid","title":"`autocomplete` attributes are used correctly","description":"The `autocomplete` attribute values must be valid and correctly applied for screen readers to function correctly. [Learn more about valid autocomplete values](https://dequeuniversity.com/rules/axe/4.11/autocomplete-valid).","score":null,"scoreDisplayMode":"notApplicable"},"presentation-role-conflict":{"id":"presentation-role-conflict","title":"Elements with `role=\"none\"` or `role=\"presentation\"` do not have conflicts","description":"There are certain cases where the semantic role of an element with `role=\"none\"` or `role=\"presentation\"` does not resolve to none or presentation. To ensure the element remains removed from the accessibility tree, you should not add any global ARIA attributes to the element or make it focusable. [Learn more about presentation role conflict](https://dequeuniversity.com/rules/axe/4.11/presentation-role-conflict).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"relatedNode","valueType":"node"},"label":"Failing Elements"}],"items":[]}},"svg-img-alt":{"id":"svg-img-alt","title":"SVG elements with an `img` role have an accessible text alternative","description":"Ensures SVG elements with an `img`, `graphics-document` or `graphics-symbol` role have an accessible text alternative. [Learn more about SVG alt text](https://dequeuniversity.com/rules/axe/4.11/svg-img-alt).","score":null,"scoreDisplayMode":"notApplicable"},"doctype":{"id":"doctype","title":"Page has the HTML doctype","description":"Specifying a doctype prevents the browser from switching to quirks-mode. [Learn more about the doctype declaration](https://developer.chrome.com/docs/lighthouse/best-practices/doctype/).","score":1,"scoreDisplayMode":"binary"},"charset":{"id":"charset","title":"Properly defines charset","description":"A character encoding declaration is required. It can be done with a `\u003cmeta>` tag in the first 1024 bytes of the HTML or in the Content-Type HTTP response header. [Learn more about declaring the character encoding](https://developer.chrome.com/docs/lighthouse/best-practices/charset/).","score":1,"scoreDisplayMode":"binary"},"geolocation-on-start":{"id":"geolocation-on-start","title":"Avoids requesting the geolocation permission on page load","description":"Users are mistrustful of or confused by sites that request their location without context. Consider tying the request to a user action instead. [Learn more about the geolocation permission](https://developer.chrome.com/docs/lighthouse/best-practices/geolocation-on-start/).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"source","valueType":"source-location","label":"Source"}],"items":[]}},"inspector-issues":{"id":"inspector-issues","title":"Issues were logged in the `Issues` panel in Chrome Devtools","description":"Issues logged to the `Issues` panel in Chrome Devtools indicate unresolved problems. They can come from network request failures, insufficient security controls, and other browser concerns. Open up the Issues panel in Chrome DevTools for more details on each issue.","score":0,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"issueType","valueType":"text","subItemsHeading":{"key":"url","valueType":"url"},"label":"Issue type"}],"items":[{"issueType":"Cookie","subItems":{"type":"subitems","items":[{"url":"https://panorama.wixapps.net/api/v1/bulklog"},{"url":"https://actionnetwork.org/css/style-embed-v3.css"},{"url":"https://actionnetwork.org/widgets/v5/form/student-debt-crisis-center?format=js&source=widget"},{"url":"https://engage.wixapps.net/chat-widget-server/renderChatWidget/index?pageId=masterPage&compId=comp-jqkn0z81&viewerCompId=comp-jqkn0z81&siteRevision=805&viewMode=site&deviceType=mobile&locale=en&tz=America%2FLos_Angeles®ionalLanguage=en&width=0&height=0&instance=VnVrawbSUwKRhLrpef5o2PRX0zSONofg0e8LX7QjhrM.eyJpbnN0YW5jZUlkIjoiOWYwOWRiMGUtNzQ0YS00ZGUyLWIwZDQtYjYwMzYyYTM1NWFkIiwiYXBwRGVmSWQiOiIxNDUxN2UxYS0zZmYwLWFmOTgtNDA4ZS0yYmQ2OTUzYzM2YTIiLCJtZXRhU2l0ZUlkIjoiYWRkYjM5MTItZDg2MC00ZTNkLWIyYWYtYTEwZTNhYTExNGQ3Iiwic2lnbkRhdGUiOiIyMDI2LTA0LTI1VDE0OjE2OjI5LjgzN1oiLCJkZW1vTW9kZSI6ZmFsc2UsIm9yaWdpbkluc3RhbmNlSWQiOiJkMzQwNzI0Ni1mMjM0LTRlZDQtOGY5Yy1iYzYxODZlZjE5ZTEiLCJhaWQiOiJhNzlkZDgyNi1mYTRjLTRiMjUtYjk1NS0yYmQ3OTRiOTczZjUiLCJiaVRva2VuIjoiMzJkMmUyMWMtYWMyYS0wM2RmLTAyN2ItMTcwZDU4MDI0MTdhIiwic2l0ZU93bmVySWQiOiIwNzA1YjgzYi02MjRhLTQ3ODYtOTA4OC0wYmRlZDMyY2VmMzYiLCJicyI6Im9seFVkZ1lOU0dhUjBmN0hsbTQ5WnBqREo5REhHeHZoTk9BN2cxMXRiYWMiLCJzY2QiOiIyMDIzLTA0LTI0VDE5OjIzOjQxLjc5OVoifQ¤cy=USD¤tCurrency=USD&commonConfig=%7B%22brand%22%3A%22wix%22%2C%22host%22%3A%22VIEWER%22%2C%22bsi%22%3A%22e02d625a-bc3d-4800-bdef-e2de573d71c5%7C1%22%2C%22siteRevision%22%3A%22805%22%2C%22renderingFlow%22%3A%22NONE%22%2C%22language%22%3A%22en%22%2C%22locale%22%3A%22en-us%22%2C%22BSI%22%3A%22e02d625a-bc3d-4800-bdef-e2de573d71c5%7C1%22%7D¤tRoute=.%2F&vsi=7aa05a45-4271-4b3e-ace5-4c2bf0f02d12"},{"url":"https://actionnetwork.org/widgets/v5/form/student-debt-crisis-center?format=js&source=widget&js_inner=true"},{"url":"https://actionnetwork.org/includes/js/jquery-min.js"},{"url":"https://actionnetwork.org/includes/js/can-embed.js?v=69"},{"url":"https://engage.wixapps.net/_api/chat-web/v1/real-time-tokens"},{"url":"https://actionnetwork.org/includes/js/challenge.min.js?v=69"},{"url":"https://actionnetwork.org/images/spinner8.png"},{"url":"https://engage.wixapps.net/serverless/chat-event-reporter/report-event"},{"url":"https://engage.wixapps.net/_api/presence-service/v1/set-data"}]}}]}},"js-libraries":{"id":"js-libraries","title":"Detected JavaScript libraries","description":"All front-end JavaScript libraries detected on the page. [Learn more about this JavaScript library detection diagnostic audit](https://developer.chrome.com/docs/lighthouse/best-practices/js-libraries/).","score":1,"scoreDisplayMode":"informative","details":{"type":"table","headings":[{"key":"name","valueType":"text","label":"Name"},{"key":"version","valueType":"text","label":"Version"}],"items":[{"name":"React","version":"18.3.1","npm":"react"},{"name":"Lo-Dash","version":"4.17.21","npm":"lodash"},{"name":"RequireJS","version":"2.3.6","npm":"requirejs"}],"debugData":{"type":"debugdata","stacks":[{"id":"react","version":"18.3.1"},{"id":"react-fast","version":"18.3.1"},{"id":"lodash","version":"4.17.21"},{"id":"requirejs","version":"2.3.6"}]}}},"notification-on-start":{"id":"notification-on-start","title":"Avoids requesting the notification permission on page load","description":"Users are mistrustful of or confused by sites that request to send notifications without context. Consider tying the request to user gestures instead. [Learn more about responsibly getting permission for notifications](https://developer.chrome.com/docs/lighthouse/best-practices/notification-on-start/).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"source","valueType":"source-location","label":"Source"}],"items":[]}},"paste-preventing-inputs":{"id":"paste-preventing-inputs","title":"Allows users to paste into input fields","description":"Preventing input pasting is a bad practice for the UX, and weakens security by blocking password managers.[Learn more about user-friendly input fields](https://developer.chrome.com/docs/lighthouse/best-practices/paste-preventing-inputs/).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","label":"Failing Elements"}],"items":[]}},"baseline":{"id":"baseline","title":"Baseline Features","description":"Lists web features used on the page and their Baseline status as of 2026-03-18. [Learn more about Baseline](https://webstatus.dev/).","score":1,"scoreDisplayMode":"informative","details":{"type":"table","headings":[{"key":"featureId","valueType":"link","label":"Web-features"},{"key":"displayStatus","valueType":"baseline-status","label":"Baseline Status"},{"key":"source","valueType":"source-location","label":"Source"}],"items":[{"featureId":{"type":"link","text":"long-animation-frames","url":"https://webstatus.dev/features/long-animation-frames"},"displayStatus":{"type":"baseline-status","status":"limited","displayString":"Limited Availability"},"source":{"type":"source-location","url":"https://static.parastorage.com/services/wix-thunderbolt/dist/main.a5b51f31.bundle.min.js","urlProvider":"network","line":2,"column":10227}},{"featureId":{"type":"link","text":"scheduler","url":"https://webstatus.dev/features/scheduler"},"displayStatus":{"type":"baseline-status","status":"limited","displayString":"Limited Availability"},"source":{"type":"source-location","url":"https://static.parastorage.com/services/wix-thunderbolt/dist/thunderbolt-commons.b6ac6398.bundle.min.js","urlProvider":"network","line":6,"column":432}},{"featureId":{"type":"link","text":"layout-instability","url":"https://webstatus.dev/features/layout-instability"},"displayStatus":{"type":"baseline-status","status":"limited","displayString":"Limited Availability"},"source":{"type":"source-location","url":"https://static.parastorage.com/services/wix-thunderbolt/dist/main.a5b51f31.bundle.min.js","urlProvider":"network","line":2,"column":10227}},{"featureId":{"type":"link","text":"requestidlecallback","url":"https://webstatus.dev/features/requestidlecallback"},"displayStatus":{"type":"baseline-status","status":"limited","displayString":"Limited Availability"},"source":{"type":"source-location","url":"_lighthouse-eval.js","urlProvider":"network","line":23,"column":15}},{"featureId":{"type":"link","text":"background-clip-text","url":"https://webstatus.dev/features/background-clip-text"},"displayStatus":{"type":"baseline-status","status":"limited","displayString":"Limited Availability"},"source":{"type":"source-location","url":"https://actionnetwork.org/includes/js/jquery-min.js","urlProvider":"network","line":0,"column":18001}},{"featureId":{"type":"link","text":"ua-client-hints","url":"https://webstatus.dev/features/ua-client-hints"},"displayStatus":{"type":"baseline-status","status":"limited","displayString":"Limited Availability"},"source":{"type":"source-location","url":"https://dist.eventscalendar.co/embed.js","urlProvider":"network","line":2,"column":998840}},{"featureId":{"type":"link","text":"speculation-rules","url":"https://webstatus.dev/features/speculation-rules"},"displayStatus":{"type":"baseline-status","status":"limited","displayString":"Limited Availability"}},{"featureId":{"type":"link","text":"with","url":"https://webstatus.dev/features/with"},"displayStatus":{"type":"baseline-status","status":"limited","displayString":"Limited Availability"}},{"featureId":{"type":"link","text":"fetch-priority","url":"https://webstatus.dev/features/fetch-priority"},"displayStatus":{"type":"baseline-status","status":"low","displayString":"Newly Available (2024-10-29)"},"source":{"type":"source-location","url":"https://www.studentdebtcrisis.org/","urlProvider":"network","line":1513,"column":6304}},{"featureId":{"type":"link","text":"scrollbar-color","url":"https://webstatus.dev/features/scrollbar-color"},"displayStatus":{"type":"baseline-status","status":"low","displayString":"Newly Available (2025-12-12)"},"source":{"type":"source-location","url":"https://dist.eventscalendar.co/embed.js","urlProvider":"network","line":2,"column":1004036}},{"featureId":{"type":"link","text":"active-view-transition","url":"https://webstatus.dev/features/active-view-transition"},"displayStatus":{"type":"baseline-status","status":"low","displayString":"Newly Available (2026-01-13)"}},{"featureId":{"type":"link","text":"has","url":"https://webstatus.dev/features/has"},"displayStatus":{"type":"baseline-status","status":"low","displayString":"Newly Available (2023-12-19)"}},{"featureId":{"type":"link","text":"scrollbar-width","url":"https://webstatus.dev/features/scrollbar-width"},"displayStatus":{"type":"baseline-status","status":"low","displayString":"Newly Available (2024-12-11)"}},{"featureId":{"type":"link","text":"masks","url":"https://webstatus.dev/features/masks"},"displayStatus":{"type":"baseline-status","status":"low","displayString":"Newly Available (2023-12-07)"}},{"featureId":{"type":"link","text":"backdrop-filter","url":"https://webstatus.dev/features/backdrop-filter"},"displayStatus":{"type":"baseline-status","status":"low","displayString":"Newly Available (2024-09-16)"}},{"featureId":{"type":"link","text":"avif","url":"https://webstatus.dev/features/avif"},"displayStatus":{"type":"baseline-status","status":"low","displayString":"Newly Available (2024-01-25)"}},{"featureId":{"type":"link","text":"http3","url":"https://webstatus.dev/features/http3"},"displayStatus":{"type":"baseline-status","status":"low","displayString":"Newly Available (2024-09-16)"}},{"featureId":{"type":"link","text":"nullish-coalescing","url":"https://webstatus.dev/features/nullish-coalescing"},"displayStatus":{"type":"baseline-status","status":"high","displayString":"Widely Available (2020-09-16)"},"source":{"type":"source-location","url":"https://www.studentdebtcrisis.org/","urlProvider":"network","line":0,"column":0}},{"featureId":{"type":"link","text":"request-animation-frame","url":"https://webstatus.dev/features/request-animation-frame"},"displayStatus":{"type":"baseline-status","status":"high","displayString":"Widely Available (2015-07-29)"},"source":{"type":"source-location","url":"https://www.studentdebtcrisis.org/","urlProvider":"network","line":1464,"column":8}},{"featureId":{"type":"link","text":"intersection-observer","url":"https://webstatus.dev/features/intersection-observer"},"displayStatus":{"type":"baseline-status","status":"high","displayString":"Widely Available (2019-03-25)"},"source":{"type":"source-location","url":"https://www.studentdebtcrisis.org/","urlProvider":"network","line":1513,"column":7421}},{"featureId":{"type":"link","text":"string-replaceall","url":"https://webstatus.dev/features/string-replaceall"},"displayStatus":{"type":"baseline-status","status":"high","displayString":"Widely Available (2020-08-27)"},"source":{"type":"source-location","url":"https://www.studentdebtcrisis.org/","urlProvider":"network","line":1588,"column":3849}},{"featureId":{"type":"link","text":"focus-visible","url":"https://webstatus.dev/features/focus-visible"},"displayStatus":{"type":"baseline-status","status":"high","displayString":"Widely Available (2022-03-14)"},"source":{"type":"source-location","url":"https://static.parastorage.com/services/cookie-consent-banner-for-uou/1.819.0//app.bundle.min.js","urlProvider":"network","line":0,"column":51177}},{"featureId":{"type":"link","text":"text-underline-offset","url":"https://webstatus.dev/features/text-underline-offset"},"displayStatus":{"type":"baseline-status","status":"high","displayString":"Widely Available (2020-11-19)"},"source":{"type":"source-location","url":"https://static.parastorage.com/services/cookie-consent-banner-for-uou/1.819.0//app.bundle.min.js","urlProvider":"network","line":0,"column":51154}},{"featureId":{"type":"link","text":"web-animations","url":"https://webstatus.dev/features/web-animations"},"displayStatus":{"type":"baseline-status","status":"high","displayString":"Widely Available (2020-09-16)"},"source":{"type":"source-location","url":"https://static.parastorage.com/services/wix-thunderbolt/dist/motion.4dedec96.chunk.min.js","urlProvider":"network","line":0,"column":117434}},{"featureId":{"type":"link","text":"text-indent","url":"https://webstatus.dev/features/text-indent"},"displayStatus":{"type":"baseline-status","status":"high","displayString":"Widely Available (2015-07-29)"},"source":{"type":"source-location","url":"https://dist.eventscalendar.co/embed.js","urlProvider":"network","line":2,"column":1004036}},{"featureId":{"type":"link","text":"slot","url":"https://webstatus.dev/features/slot"},"displayStatus":{"type":"baseline-status","status":"high","displayString":"Widely Available (2020-01-15)"},"source":{"type":"source-location","url":"https://actionnetwork.org/includes/js/jquery-min.js","urlProvider":"network","line":0,"column":16231}},{"featureId":{"type":"link","text":"structured-clone","url":"https://webstatus.dev/features/structured-clone"},"displayStatus":{"type":"baseline-status","status":"high","displayString":"Widely Available (2022-03-14)"},"source":{"type":"source-location","url":"https://dist.eventscalendar.co/embed.js","urlProvider":"network","line":2,"column":969521}},{"featureId":{"type":"link","text":"outline","url":"https://webstatus.dev/features/outline"},"displayStatus":{"type":"baseline-status","status":"high","displayString":"Widely Available (2023-03-27)"}},{"featureId":{"type":"link","text":"not","url":"https://webstatus.dev/features/not"},"displayStatus":{"type":"baseline-status","status":"high","displayString":"Widely Available (2021-01-21)"}},{"featureId":{"type":"link","text":"quotes","url":"https://webstatus.dev/features/quotes"},"displayStatus":{"type":"baseline-status","status":"high","displayString":"Widely Available (2021-04-26)"}},{"featureId":{"type":"link","text":"overflow-clip","url":"https://webstatus.dev/features/overflow-clip"},"displayStatus":{"type":"baseline-status","status":"high","displayString":"Widely Available (2022-09-12)"}},{"featureId":{"type":"link","text":"logical-properties","url":"https://webstatus.dev/features/logical-properties"},"displayStatus":{"type":"baseline-status","status":"high","displayString":"Widely Available (2021-09-20)"}},{"featureId":{"type":"link","text":"clip-path","url":"https://webstatus.dev/features/clip-path"},"displayStatus":{"type":"baseline-status","status":"high","displayString":"Widely Available (2021-01-21)"}},{"featureId":{"type":"link","text":"is","url":"https://webstatus.dev/features/is"},"displayStatus":{"type":"baseline-status","status":"high","displayString":"Widely Available (2021-01-21)"}},{"featureId":{"type":"link","text":"will-change","url":"https://webstatus.dev/features/will-change"},"displayStatus":{"type":"baseline-status","status":"high","displayString":"Widely Available (2020-01-15)"}},{"featureId":{"type":"link","text":"scroll-snap","url":"https://webstatus.dev/features/scroll-snap"},"displayStatus":{"type":"baseline-status","status":"high","displayString":"Widely Available (2020-01-15)"}},{"featureId":{"type":"link","text":"where","url":"https://webstatus.dev/features/where"},"displayStatus":{"type":"baseline-status","status":"high","displayString":"Widely Available (2021-01-21)"}},{"featureId":{"type":"link","text":"animation-composition","url":"https://webstatus.dev/features/animation-composition"},"displayStatus":{"type":"baseline-status","status":"high","displayString":"Widely Available (2023-07-04)"}},{"featureId":{"type":"link","text":"revert-value","url":"https://webstatus.dev/features/revert-value"},"displayStatus":{"type":"baseline-status","status":"high","displayString":"Widely Available (2020-07-27)"}},{"featureId":{"type":"link","text":"grid","url":"https://webstatus.dev/features/grid"},"displayStatus":{"type":"baseline-status","status":"high","displayString":"Widely Available (2017-10-17)"}},{"featureId":{"type":"link","text":"flexbox","url":"https://webstatus.dev/features/flexbox"},"displayStatus":{"type":"baseline-status","status":"high","displayString":"Widely Available (2015-09-30)"}},{"featureId":{"type":"link","text":"logical-assignments","url":"https://webstatus.dev/features/logical-assignments"},"displayStatus":{"type":"baseline-status","status":"high","displayString":"Widely Available (2020-09-16)"}},{"featureId":{"type":"link","text":"referrer-policy","url":"https://webstatus.dev/features/referrer-policy"},"displayStatus":{"type":"baseline-status","status":"high","displayString":"Widely Available (2021-09-20)"}},{"featureId":{"type":"link","text":"media-query-range-syntax","url":"https://webstatus.dev/features/media-query-range-syntax"},"displayStatus":{"type":"baseline-status","status":"high","displayString":"Widely Available (2023-03-27)"}},{"featureId":{"type":"link","text":"overflow-shorthand","url":"https://webstatus.dev/features/overflow-shorthand"},"displayStatus":{"type":"baseline-status","status":"high","displayString":"Widely Available (2020-03-24)"}},{"featureId":{"type":"link","text":"appearance","url":"https://webstatus.dev/features/appearance"},"displayStatus":{"type":"baseline-status","status":"high","displayString":"Widely Available (2022-03-14)"}},{"featureId":{"type":"link","text":"individual-transforms","url":"https://webstatus.dev/features/individual-transforms"},"displayStatus":{"type":"baseline-status","status":"high","displayString":"Widely Available (2022-08-05)"}}]}},"meta-description":{"id":"meta-description","title":"Document has a meta description","description":"Meta descriptions may be included in search results to concisely summarize page content. [Learn more about the meta description](https://developer.chrome.com/docs/lighthouse/seo/meta-description/).","score":1,"scoreDisplayMode":"binary"},"http-status-code":{"id":"http-status-code","title":"Page has successful HTTP status code","description":"Pages with unsuccessful HTTP status codes may not be indexed properly. [Learn more about HTTP status codes](https://developer.chrome.com/docs/lighthouse/seo/http-status-code/).","score":1,"scoreDisplayMode":"binary"},"link-text":{"id":"link-text","title":"Links do not have descriptive text","description":"Descriptive link text helps search engines understand your content. [Learn how to make links more accessible](https://developer.chrome.com/docs/lighthouse/seo/link-text/).","score":0,"scoreDisplayMode":"binary","displayValue":"1 link found","details":{"type":"table","headings":[{"key":"href","valueType":"url","label":"Link destination"},{"key":"text","valueType":"text","label":"Link Text"}],"items":[{"href":"https://www.studentdebtcrisis.org/news","text":"Read More","textLang":"en"}]}},"crawlable-anchors":{"id":"crawlable-anchors","title":"Links are crawlable","description":"Search engines may use `href` attributes on links to crawl websites. Ensure that the `href` attribute of anchor elements links to an appropriate destination, so more pages of the site can be discovered. [Learn how to make links crawlable](https://support.google.com/webmasters/answer/9112205)","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","label":"Uncrawlable Link"}],"items":[]}},"is-crawlable":{"id":"is-crawlable","title":"Page isn’t blocked from indexing","description":"Search engines are unable to include your pages in search results if they don't have permission to crawl them. [Learn more about crawler directives](https://developer.chrome.com/docs/lighthouse/seo/is-crawlable/).","score":1,"scoreDisplayMode":"binary","warnings":[],"details":{"type":"table","headings":[{"key":"source","valueType":"code","label":"Blocking Directive Source"}],"items":[]}},"robots-txt":{"id":"robots-txt","title":"robots.txt is valid","description":"If your robots.txt file is malformed, crawlers may not be able to understand how you want your website to be crawled or indexed. [Learn more about robots.txt](https://developer.chrome.com/docs/lighthouse/seo/invalid-robots-txt/).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"index","valueType":"text","label":"Line #"},{"key":"line","valueType":"code","label":"Content"},{"key":"message","valueType":"code","label":"Error"}],"items":[]}},"hreflang":{"id":"hreflang","title":"Document has a valid `hreflang`","description":"hreflang links tell search engines what version of a page they should list in search results for a given language or region. [Learn more about `hreflang`](https://developer.chrome.com/docs/lighthouse/seo/hreflang/).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"source","valueType":"code","subItemsHeading":{"key":"reason","valueType":"text"},"label":""}],"items":[]}},"canonical":{"id":"canonical","title":"Document has a valid `rel=canonical`","description":"Canonical links suggest which URL to show in search results. [Learn more about canonical links](https://developer.chrome.com/docs/lighthouse/seo/canonical/).","score":1,"scoreDisplayMode":"binary"},"structured-data":{"id":"structured-data","title":"Structured data is valid","description":"Run the [Structured Data Testing Tool](https://developers.google.com/search/docs/appearance/structured-data/) to validate structured data. [Learn more about Structured Data](https://developer.chrome.com/docs/lighthouse/seo/structured-data/).","score":null,"scoreDisplayMode":"manual"}},"configSettings":{"output":["json","html"],"maxWaitForFcp":30000,"maxWaitForLoad":30000,"pauseAfterFcpMs":1000,"pauseAfterLoadMs":1000,"networkQuietThresholdMs":1000,"cpuQuietThresholdMs":1000,"formFactor":"desktop","throttling":{"rttMs":150,"throughputKbps":1638.4,"requestLatencyMs":562.5,"downloadThroughputKbps":1474.5600000000002,"uploadThroughputKbps":675,"cpuSlowdownMultiplier":4},"throttlingMethod":"simulate","screenEmulation":{"mobile":false,"width":1350,"height":940,"deviceScaleFactor":1,"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":"node","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":["accessibility","seo","best-practices"],"skipAudits":null},"categories":{"accessibility":{"title":"Accessibility","description":"These checks highlight opportunities to [improve the accessibility of your web app](https://developer.chrome.com/docs/lighthouse/accessibility/). Automatic detection can only detect a subset of issues and does not guarantee the accessibility of your web app, so [manual testing](https://web.dev/articles/how-to-review) is also encouraged.","manualDescription":"These items address areas which an automated testing tool cannot cover. Learn more in our guide on [conducting an accessibility review](https://web.dev/articles/how-to-review).","supportedModes":["navigation","snapshot"],"auditRefs":[{"id":"accesskeys","weight":0,"group":"a11y-navigation"},{"id":"aria-allowed-attr","weight":10,"group":"a11y-aria"},{"id":"aria-command-name","weight":7,"group":"a11y-aria"},{"id":"aria-conditional-attr","weight":7,"group":"a11y-aria"},{"id":"aria-deprecated-role","weight":1,"group":"a11y-aria"},{"id":"aria-dialog-name","weight":0,"group":"a11y-aria"},{"id":"aria-hidden-body","weight":10,"group":"a11y-aria"},{"id":"aria-hidden-focus","weight":7,"group":"a11y-aria"},{"id":"aria-input-field-name","weight":0,"group":"a11y-aria"},{"id":"aria-meter-name","weight":0,"group":"a11y-aria"},{"id":"aria-progressbar-name","weight":0,"group":"a11y-aria"},{"id":"aria-prohibited-attr","weight":7,"group":"a11y-aria"},{"id":"aria-required-attr","weight":10,"group":"a11y-aria"},{"id":"aria-required-children","weight":0,"group":"a11y-aria"},{"id":"aria-required-parent","weight":0,"group":"a11y-aria"},{"id":"aria-roles","weight":10,"group":"a11y-aria"},{"id":"aria-text","weight":0,"group":"a11y-aria"},{"id":"aria-toggle-field-name","weight":0,"group":"a11y-aria"},{"id":"aria-tooltip-name","weight":0,"group":"a11y-aria"},{"id":"aria-treeitem-name","weight":0,"group":"a11y-aria"},{"id":"aria-valid-attr-value","weight":10,"group":"a11y-aria"},{"id":"aria-valid-attr","weight":10,"group":"a11y-aria"},{"id":"button-name","weight":10,"group":"a11y-names-labels"},{"id":"bypass","weight":0,"group":"a11y-navigation"},{"id":"color-contrast","weight":7,"group":"a11y-color-contrast"},{"id":"definition-list","weight":0,"group":"a11y-tables-lists"},{"id":"dlitem","weight":0,"group":"a11y-tables-lists"},{"id":"document-title","weight":7,"group":"a11y-names-labels"},{"id":"duplicate-id-aria","weight":0,"group":"a11y-aria"},{"id":"form-field-multiple-labels","weight":0,"group":"a11y-names-labels"},{"id":"frame-title","weight":7,"group":"a11y-names-labels"},{"id":"heading-order","weight":3,"group":"a11y-navigation"},{"id":"html-has-lang","weight":7,"group":"a11y-language"},{"id":"html-lang-valid","weight":7,"group":"a11y-language"},{"id":"html-xml-lang-mismatch","weight":0,"group":"a11y-language"},{"id":"image-alt","weight":10,"group":"a11y-names-labels"},{"id":"input-button-name","weight":0,"group":"a11y-names-labels"},{"id":"input-image-alt","weight":0,"group":"a11y-names-labels"},{"id":"label","weight":0,"group":"a11y-names-labels"},{"id":"link-in-text-block","weight":0,"group":"a11y-color-contrast"},{"id":"link-name","weight":7,"group":"a11y-names-labels"},{"id":"list","weight":7,"group":"a11y-tables-lists"},{"id":"listitem","weight":7,"group":"a11y-tables-lists"},{"id":"meta-refresh","weight":0,"group":"a11y-best-practices"},{"id":"meta-viewport","weight":10,"group":"a11y-best-practices"},{"id":"object-alt","weight":0,"group":"a11y-names-labels"},{"id":"select-name","weight":0,"group":"a11y-names-labels"},{"id":"skip-link","weight":0,"group":"a11y-names-labels"},{"id":"tabindex","weight":7,"group":"a11y-navigation"},{"id":"target-size","weight":7,"group":"a11y-best-practices"},{"id":"td-headers-attr","weight":0,"group":"a11y-tables-lists"},{"id":"th-has-data-cells","weight":0,"group":"a11y-tables-lists"},{"id":"valid-lang","weight":0,"group":"a11y-language"},{"id":"video-caption","weight":0,"group":"a11y-audio-video"},{"id":"landmark-one-main","weight":3,"group":"a11y-best-practices"},{"id":"autocomplete-valid","weight":0,"group":"a11y-best-practices"},{"id":"presentation-role-conflict","weight":1,"group":"a11y-best-practices"},{"id":"svg-img-alt","weight":0,"group":"a11y-best-practices"},{"id":"focusable-controls","weight":0},{"id":"interactive-element-affordance","weight":0},{"id":"logical-tab-order","weight":0},{"id":"visual-order-follows-dom","weight":0},{"id":"focus-traps","weight":0},{"id":"managed-focus","weight":0},{"id":"use-landmarks","weight":0},{"id":"offscreen-content-hidden","weight":0},{"id":"custom-controls-labels","weight":0},{"id":"custom-controls-roles","weight":0},{"id":"table-duplicate-name","weight":0,"group":"a11y-best-practices"},{"id":"empty-heading","weight":0,"group":"a11y-best-practices"},{"id":"aria-allowed-role","weight":0,"group":"a11y-best-practices"},{"id":"image-redundant-alt","weight":0,"group":"a11y-names-labels"},{"id":"identical-links-same-purpose","weight":0,"group":"a11y-best-practices"},{"id":"label-content-name-mismatch","weight":0,"group":"hidden"},{"id":"table-fake-caption","weight":0,"group":"hidden"},{"id":"td-has-header","weight":0,"group":"hidden"}],"id":"accessibility","score":0.93},"best-practices":{"title":"Best Practices","supportedModes":["navigation","timespan","snapshot"],"auditRefs":[{"id":"is-on-https","weight":5,"group":"best-practices-trust-safety"},{"id":"redirects-http","weight":0,"group":"best-practices-trust-safety"},{"id":"geolocation-on-start","weight":1,"group":"best-practices-trust-safety"},{"id":"notification-on-start","weight":1,"group":"best-practices-trust-safety"},{"id":"csp-xss","weight":0,"group":"best-practices-trust-safety"},{"id":"has-hsts","weight":0,"group":"best-practices-trust-safety"},{"id":"origin-isolation","weight":0,"group":"best-practices-trust-safety"},{"id":"clickjacking-mitigation","weight":0,"group":"best-practices-trust-safety"},{"id":"trusted-types-xss","weight":0,"group":"best-practices-trust-safety"},{"id":"paste-preventing-inputs","weight":3,"group":"best-practices-ux"},{"id":"image-aspect-ratio","weight":1,"group":"best-practices-ux"},{"id":"image-size-responsive","weight":1,"group":"best-practices-ux"},{"id":"doctype","weight":1,"group":"best-practices-browser-compat"},{"id":"charset","weight":1,"group":"best-practices-browser-compat"},{"id":"baseline","weight":0,"group":"best-practices-browser-compat"},{"id":"js-libraries","weight":0,"group":"best-practices-general"},{"id":"deprecations","weight":5,"group":"best-practices-general"},{"id":"third-party-cookies","weight":5,"group":"best-practices-general"},{"id":"errors-in-console","weight":1,"group":"best-practices-general"},{"id":"valid-source-maps","weight":0,"group":"best-practices-general"},{"id":"inspector-issues","weight":1,"group":"best-practices-general"}],"id":"best-practices","score":0.73},"seo":{"title":"SEO","description":"These checks ensure that your page is following basic search engine optimization advice. There are many additional factors Lighthouse does not score here that may affect your search ranking, including performance on [Core Web Vitals](https://web.dev/explore/vitals). [Learn more about Google Search Essentials](https://support.google.com/webmasters/answer/35769).","manualDescription":"Run these additional validators on your site to check additional SEO best practices.","supportedModes":["navigation","snapshot"],"auditRefs":[{"id":"is-crawlable","weight":4.043478260869565,"group":"seo-crawl"},{"id":"document-title","weight":1,"group":"seo-content"},{"id":"meta-description","weight":1,"group":"seo-content"},{"id":"http-status-code","weight":1,"group":"seo-crawl"},{"id":"link-text","weight":1,"group":"seo-content"},{"id":"crawlable-anchors","weight":1,"group":"seo-crawl"},{"id":"robots-txt","weight":1,"group":"seo-crawl"},{"id":"image-alt","weight":1,"group":"seo-content"},{"id":"hreflang","weight":1,"group":"seo-content"},{"id":"canonical","weight":1,"group":"seo-content"},{"id":"structured-data","weight":0}],"id":"seo","score":0.92}},"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":[{"id":"react","title":"React","iconDataURL":"data:image/svg+xml,\u003csvg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 841.9 595.3\">\u003cg fill=\"%2361DAFB\">\u003cpath d=\"M666.3 296.5c0-32.5-40.7-63.3-103.1-82.4 14.4-63.6 8-114.2-20.2-130.4-6.5-3.8-14.1-5.6-22.4-5.6v22.3c4.6 0 8.3.9 11.4 2.6 13.6 7.8 19.5 37.5 14.9 75.7-1.1 9.4-2.9 19.3-5.1 29.4-19.6-4.8-41-8.5-63.5-10.9-13.5-18.5-27.5-35.3-41.6-50 32.6-30.3 63.2-46.9 84-46.9V78c-27.5 0-63.5 19.6-99.9 53.6-36.4-33.8-72.4-53.2-99.9-53.2v22.3c20.7 0 51.4 16.5 84 46.6-14 14.7-28 31.4-41.3 49.9-22.6 2.4-44 6.1-63.6 11-2.3-10-4-19.7-5.2-29-4.7-38.2 1.1-67.9 14.6-75.8 3-1.8 6.9-2.6 11.5-2.6V78.5c-8.4 0-16 1.8-22.6 5.6-28.1 16.2-34.4 66.7-19.9 130.1-62.2 19.2-102.7 49.9-102.7 82.3 0 32.5 40.7 63.3 103.1 82.4-14.4 63.6-8 114.2 20.2 130.4 6.5 3.8 14.1 5.6 22.5 5.6 27.5 0 63.5-19.6 99.9-53.6 36.4 33.8 72.4 53.2 99.9 53.2 8.4 0 16-1.8 22.6-5.6 28.1-16.2 34.4-66.7 19.9-130.1 62-19.1 102.5-49.9 102.5-82.3zm-130.2-66.7c-3.7 12.9-8.3 26.2-13.5 39.5-4.1-8-8.4-16-13.1-24-4.6-8-9.5-15.8-14.4-23.4 14.2 2.1 27.9 4.7 41 7.9zm-45.8 106.5c-7.8 13.5-15.8 26.3-24.1 38.2-14.9 1.3-30 2-45.2 2-15.1 0-30.2-.7-45-1.9-8.3-11.9-16.4-24.6-24.2-38-7.6-13.1-14.5-26.4-20.8-39.8 6.2-13.4 13.2-26.8 20.7-39.9 7.8-13.5 15.8-26.3 24.1-38.2 14.9-1.3 30-2 45.2-2 15.1 0 30.2.7 45 1.9 8.3 11.9 16.4 24.6 24.2 38 7.6 13.1 14.5 26.4 20.8 39.8-6.3 13.4-13.2 26.8-20.7 39.9zm32.3-13c5.4 13.4 10 26.8 13.8 39.8-13.1 3.2-26.9 5.9-41.2 8 4.9-7.7 9.8-15.6 14.4-23.7 4.6-8 8.9-16.1 13-24.1zM421.2 430c-9.3-9.6-18.6-20.3-27.8-32 9 .4 18.2.7 27.5.7 9.4 0 18.7-.2 27.8-.7-9 11.7-18.3 22.4-27.5 32zm-74.4-58.9c-14.2-2.1-27.9-4.7-41-7.9 3.7-12.9 8.3-26.2 13.5-39.5 4.1 8 8.4 16 13.1 24 4.7 8 9.5 15.8 14.4 23.4zM420.7 163c9.3 9.6 18.6 20.3 27.8 32-9-.4-18.2-.7-27.5-.7-9.4 0-18.7.2-27.8.7 9-11.7 18.3-22.4 27.5-32zm-74 58.9c-4.9 7.7-9.8 15.6-14.4 23.7-4.6 8-8.9 16-13 24-5.4-13.4-10-26.8-13.8-39.8 13.1-3.1 26.9-5.8 41.2-7.9zm-90.5 125.2c-35.4-15.1-58.3-34.9-58.3-50.6 0-15.7 22.9-35.6 58.3-50.6 8.6-3.7 18-7 27.7-10.1 5.7 19.6 13.2 40 22.5 60.9-9.2 20.8-16.6 41.1-22.2 60.6-9.9-3.1-19.3-6.5-28-10.2zM310 490c-13.6-7.8-19.5-37.5-14.9-75.7 1.1-9.4 2.9-19.3 5.1-29.4 19.6 4.8 41 8.5 63.5 10.9 13.5 18.5 27.5 35.3 41.6 50-32.6 30.3-63.2 46.9-84 46.9-4.5-.1-8.3-1-11.3-2.7zm237.2-76.2c4.7 38.2-1.1 67.9-14.6 75.8-3 1.8-6.9 2.6-11.5 2.6-20.7 0-51.4-16.5-84-46.6 14-14.7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-27.7 10.1-5.7-19.6-13.2-40-22.5-60.9 9.2-20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-58.4 50.6zM320.8 78.4z\"/>\u003ccircle cx=\"420.9\" cy=\"296.5\" r=\"45.7\"/>\u003cpath d=\"M520.5 78.1z\"/>\u003c/g>\u003c/svg>","descriptions":{"unminified-css":"If your build system minifies CSS files automatically, ensure that you are deploying the production build of your application. You can check this with the React Developer Tools extension. [Learn more](https://reactjs.org/docs/optimizing-performance.html#use-the-production-build).","unminified-javascript":"If your build system minifies JS files automatically, ensure that you are deploying the production build of your application. You can check this with the React Developer Tools extension. [Learn more](https://reactjs.org/docs/optimizing-performance.html#use-the-production-build).","unused-javascript":"If you are not server-side rendering, [split your JavaScript bundles](https://web.dev/code-splitting-suspense/) with `React.lazy()`. Otherwise, code-split using a third-party library such as [loadable-components](https://loadable-components.com/).","server-response-time":"If you are server-side rendering any React components, consider using `renderToPipeableStream()` or `renderToStaticNodeStream()` to allow the client to receive and hydrate different parts of the markup instead of all at once. [Learn more](https://reactjs.org/docs/react-dom-server.html#renderToPipeableStream).","redirects":"If you are using React Router, minimize usage of the `\u003cRedirect>` component for [route navigations](https://reacttraining.com/react-router/web/api/Redirect).","user-timings":"Use the React DevTools Profiler, which makes use of the Profiler API, to measure the rendering performance of your components. [Learn more.](https://reactjs.org/blog/2018/09/10/introducing-the-react-profiler.html)","dom-size":"Consider using a \"windowing\" library like `react-window` to minimize the number of DOM nodes created if you are rendering many repeated elements on the page. [Learn more](https://web.dev/virtualize-long-lists-react-window/). Also, minimize unnecessary re-renders using [`shouldComponentUpdate`](https://reactjs.org/docs/optimizing-performance.html#shouldcomponentupdate-in-action), [`PureComponent`](https://reactjs.org/docs/react-api.html#reactpurecomponent), or [`React.memo`](https://reactjs.org/docs/react-api.html#reactmemo) and [skip effects](https://reactjs.org/docs/hooks-effect.html#tip-optimizing-performance-by-skipping-effects) only until certain dependencies have changed if you are using the `Effect` hook to improve runtime performance."}}],"entities":[],"timing":{"entries":[{"startTime":1530919.18,"name":"lh:config","duration":150.99,"entryType":"measure"},{"startTime":1530921.45,"name":"lh:config:resolveArtifactsToDefns","duration":1.44,"entryType":"measure"},{"startTime":1531070.33,"name":"lh:runner:gather","duration":8518.49,"entryType":"measure"},{"startTime":1531070.52,"name":"lh:driver:connect","duration":4.4,"entryType":"measure"},{"startTime":1531075.15,"name":"lh:driver:navigate","duration":99.68,"entryType":"measure"},{"startTime":1531175.14,"name":"lh:gather:getBenchmarkIndex","duration":1002.87,"entryType":"measure"},{"startTime":1532178.13,"name":"lh:gather:getVersion","duration":0.39,"entryType":"measure"},{"startTime":1532178.56,"name":"lh:gather:getDevicePixelRatio","duration":0.71,"entryType":"measure"},{"startTime":1532179.45,"name":"lh:prepare:navigationMode","duration":128.55,"entryType":"measure"},{"startTime":1532179.91,"name":"lh:gather:getVersion","duration":0.22,"entryType":"measure"},{"startTime":1532190.04,"name":"lh:storage:clearDataForOrigin","duration":8.21,"entryType":"measure"},{"startTime":1532198.49,"name":"lh:storage:clearBrowserCaches","duration":108.6,"entryType":"measure"},{"startTime":1532307.65,"name":"lh:gather:prepareThrottlingAndNetwork","duration":0.33,"entryType":"measure"},{"startTime":1532348.08,"name":"lh:driver:navigate","duration":4554.14,"entryType":"measure"},{"startTime":1538512.18,"name":"lh:computed:NetworkRecords","duration":4.85,"entryType":"measure"},{"startTime":1538517.38,"name":"lh:gather:getArtifact:DevtoolsLog","duration":0.01,"entryType":"measure"},{"startTime":1538517.41,"name":"lh:gather:getArtifact:Trace","duration":0.01,"entryType":"measure"},{"startTime":1538517.42,"name":"lh:gather:getArtifact:Accessibility","duration":565.34,"entryType":"measure"},{"startTime":1539082.82,"name":"lh:gather:getArtifact:AnchorElements","duration":26.97,"entryType":"measure"},{"startTime":1539109.83,"name":"lh:gather:getArtifact:ConsoleMessages","duration":0.04,"entryType":"measure"},{"startTime":1539109.89,"name":"lh:gather:getArtifact:Doctype","duration":0.91,"entryType":"measure"},{"startTime":1539110.82,"name":"lh:gather:getArtifact:Inputs","duration":2.14,"entryType":"measure"},{"startTime":1539113.01,"name":"lh:gather:getArtifact:ImageElements","duration":118.84,"entryType":"measure"},{"startTime":1539232.01,"name":"lh:gather:getArtifact:InspectorIssues","duration":0.43,"entryType":"measure"},{"startTime":1539232.45,"name":"lh:gather:getArtifact:LinkElements","duration":3.45,"entryType":"measure"},{"startTime":1539235.22,"name":"lh:computed:MainResource","duration":0.11,"entryType":"measure"},{"startTime":1539235.93,"name":"lh:gather:getArtifact:MainDocumentContent","duration":23.2,"entryType":"measure"},{"startTime":1539259.17,"name":"lh:gather:getArtifact:MetaElements","duration":3.01,"entryType":"measure"},{"startTime":1539262.21,"name":"lh:gather:getArtifact:NetworkUserAgent","duration":0.02,"entryType":"measure"},{"startTime":1539262.24,"name":"lh:gather:getArtifact:RobotsTxt","duration":143.75,"entryType":"measure"},{"startTime":1539406.05,"name":"lh:gather:getArtifact:Scripts","duration":0.27,"entryType":"measure"},{"startTime":1539406.36,"name":"lh:gather:getArtifact:SourceMaps","duration":173.66,"entryType":"measure"},{"startTime":1539580.06,"name":"lh:gather:getArtifact:Stacks","duration":6.69,"entryType":"measure"},{"startTime":1539580.16,"name":"lh:gather:collectStacks","duration":6.57,"entryType":"measure"},{"startTime":1539586.76,"name":"lh:gather:getArtifact:ViewportDimensions","duration":0.56,"entryType":"measure"},{"startTime":1539587.34,"name":"lh:gather:getArtifact:FullPageScreenshot","duration":0.02,"entryType":"measure"},{"startTime":1539589,"name":"lh:runner:audit","duration":312.59,"entryType":"measure"},{"startTime":1539589.06,"name":"lh:runner:auditing","duration":312.32,"entryType":"measure"},{"startTime":1539589.46,"name":"lh:audit:is-on-https","duration":0.67,"entryType":"measure"},{"startTime":1539590.24,"name":"lh:audit:redirects-http","duration":0.42,"entryType":"measure"},{"startTime":1539590.78,"name":"lh:audit:errors-in-console","duration":153.28,"entryType":"measure"},{"startTime":1539590.99,"name":"lh:computed:JSBundles","duration":151.38,"entryType":"measure"},{"startTime":1539744.2,"name":"lh:audit:image-aspect-ratio","duration":0.54,"entryType":"measure"},{"startTime":1539744.88,"name":"lh:audit:image-size-responsive","duration":0.93,"entryType":"measure"},{"startTime":1539745.16,"name":"lh:computed:ImageRecords","duration":0.25,"entryType":"measure"},{"startTime":1539745.91,"name":"lh:audit:deprecations","duration":0.54,"entryType":"measure"},{"startTime":1539746.56,"name":"lh:audit:third-party-cookies","duration":6.73,"entryType":"measure"},{"startTime":1539753.6,"name":"lh:audit:valid-source-maps","duration":2.19,"entryType":"measure"},{"startTime":1539753.98,"name":"lh:computed:EntityClassification","duration":0.03,"entryType":"measure"},{"startTime":1539755.92,"name":"lh:audit:csp-xss","duration":3.5,"entryType":"measure"},{"startTime":1539759.52,"name":"lh:audit:has-hsts","duration":0.64,"entryType":"measure"},{"startTime":1539760.25,"name":"lh:audit:origin-isolation","duration":0.41,"entryType":"measure"},{"startTime":1539760.75,"name":"lh:audit:clickjacking-mitigation","duration":0.41,"entryType":"measure"},{"startTime":1539761.24,"name":"lh:audit:trusted-types-xss","duration":0.41,"entryType":"measure"},{"startTime":1539761.76,"name":"lh:audit:accesskeys","duration":0.5,"entryType":"measure"},{"startTime":1539762.37,"name":"lh:audit:aria-allowed-attr","duration":1.84,"entryType":"measure"},{"startTime":1539764.34,"name":"lh:audit:aria-allowed-role","duration":1.73,"entryType":"measure"},{"startTime":1539766.23,"name":"lh:audit:aria-command-name","duration":1.65,"entryType":"measure"},{"startTime":1539768,"name":"lh:audit:aria-conditional-attr","duration":1.78,"entryType":"measure"},{"startTime":1539770.04,"name":"lh:audit:aria-deprecated-role","duration":1.69,"entryType":"measure"},{"startTime":1539771.86,"name":"lh:audit:aria-dialog-name","duration":0.4,"entryType":"measure"},{"startTime":1539772.37,"name":"lh:audit:aria-hidden-body","duration":3.59,"entryType":"measure"},{"startTime":1539776.12,"name":"lh:audit:aria-hidden-focus","duration":1.75,"entryType":"measure"},{"startTime":1539778.03,"name":"lh:audit:aria-input-field-name","duration":0.51,"entryType":"measure"},{"startTime":1539778.66,"name":"lh:audit:aria-meter-name","duration":0.49,"entryType":"measure"},{"startTime":1539779.26,"name":"lh:audit:aria-progressbar-name","duration":0.53,"entryType":"measure"},{"startTime":1539779.89,"name":"lh:audit:aria-prohibited-attr","duration":1.56,"entryType":"measure"},{"startTime":1539781.55,"name":"lh:audit:aria-required-attr","duration":1.6,"entryType":"measure"},{"startTime":1539783.27,"name":"lh:audit:aria-required-children","duration":3.48,"entryType":"measure"},{"startTime":1539786.93,"name":"lh:audit:aria-required-parent","duration":0.6,"entryType":"measure"},{"startTime":1539787.64,"name":"lh:audit:aria-roles","duration":1.64,"entryType":"measure"},{"startTime":1539789.41,"name":"lh:audit:aria-text","duration":0.64,"entryType":"measure"},{"startTime":1539790.15,"name":"lh:audit:aria-toggle-field-name","duration":0.66,"entryType":"measure"},{"startTime":1539790.93,"name":"lh:audit:aria-tooltip-name","duration":0.72,"entryType":"measure"},{"startTime":1539791.79,"name":"lh:audit:aria-treeitem-name","duration":0.75,"entryType":"measure"},{"startTime":1539792.65,"name":"lh:audit:aria-valid-attr-value","duration":1.76,"entryType":"measure"},{"startTime":1539794.51,"name":"lh:audit:aria-valid-attr","duration":1.62,"entryType":"measure"},{"startTime":1539796.24,"name":"lh:audit:button-name","duration":4.26,"entryType":"measure"},{"startTime":1539800.63,"name":"lh:audit:bypass","duration":1.54,"entryType":"measure"},{"startTime":1539802.3,"name":"lh:audit:color-contrast","duration":1.44,"entryType":"measure"},{"startTime":1539803.86,"name":"lh:audit:definition-list","duration":0.74,"entryType":"measure"},{"startTime":1539804.7,"name":"lh:audit:dlitem","duration":0.73,"entryType":"measure"},{"startTime":1539805.53,"name":"lh:audit:document-title","duration":1.41,"entryType":"measure"},{"startTime":1539807.04,"name":"lh:audit:duplicate-id-aria","duration":0.72,"entryType":"measure"},{"startTime":1539811.07,"name":"lh:audit:empty-heading","duration":1.49,"entryType":"measure"},{"startTime":1539812.68,"name":"lh:audit:form-field-multiple-labels","duration":0.77,"entryType":"measure"},{"startTime":1539813.55,"name":"lh:audit:frame-title","duration":1.4,"entryType":"measure"},{"startTime":1539815.05,"name":"lh:audit:heading-order","duration":1.44,"entryType":"measure"},{"startTime":1539816.6,"name":"lh:audit:html-has-lang","duration":1.59,"entryType":"measure"},{"startTime":1539818.29,"name":"lh:audit:html-lang-valid","duration":3.65,"entryType":"measure"},{"startTime":1539822.06,"name":"lh:audit:html-xml-lang-mismatch","duration":0.88,"entryType":"measure"},{"startTime":1539823.05,"name":"lh:audit:identical-links-same-purpose","duration":1.54,"entryType":"measure"},{"startTime":1539824.71,"name":"lh:audit:image-alt","duration":1.44,"entryType":"measure"},{"startTime":1539826.26,"name":"lh:audit:image-redundant-alt","duration":1.61,"entryType":"measure"},{"startTime":1539827.97,"name":"lh:audit:input-button-name","duration":0.86,"entryType":"measure"},{"startTime":1539828.93,"name":"lh:audit:input-image-alt","duration":0.9,"entryType":"measure"},{"startTime":1539829.94,"name":"lh:audit:label-content-name-mismatch","duration":6.48,"entryType":"measure"},{"startTime":1539836.55,"name":"lh:audit:label","duration":0.93,"entryType":"measure"},{"startTime":1539837.58,"name":"lh:audit:landmark-one-main","duration":1.59,"entryType":"measure"},{"startTime":1539839.29,"name":"lh:audit:link-name","duration":1.57,"entryType":"measure"},{"startTime":1539840.96,"name":"lh:audit:link-in-text-block","duration":0.92,"entryType":"measure"},{"startTime":1539841.98,"name":"lh:audit:list","duration":1.52,"entryType":"measure"},{"startTime":1539843.62,"name":"lh:audit:listitem","duration":3.96,"entryType":"measure"},{"startTime":1539847.69,"name":"lh:audit:meta-refresh","duration":0.94,"entryType":"measure"},{"startTime":1539848.73,"name":"lh:audit:meta-viewport","duration":1.44,"entryType":"measure"},{"startTime":1539850.26,"name":"lh:audit:object-alt","duration":0.96,"entryType":"measure"},{"startTime":1539851.32,"name":"lh:audit:select-name","duration":0.97,"entryType":"measure"},{"startTime":1539852.39,"name":"lh:audit:skip-link","duration":0.99,"entryType":"measure"},{"startTime":1539853.48,"name":"lh:audit:tabindex","duration":4.05,"entryType":"measure"},{"startTime":1539857.66,"name":"lh:audit:table-duplicate-name","duration":1.25,"entryType":"measure"},{"startTime":1539859.04,"name":"lh:audit:table-fake-caption","duration":1.36,"entryType":"measure"},{"startTime":1539860.5,"name":"lh:audit:target-size","duration":1.75,"entryType":"measure"},{"startTime":1539862.4,"name":"lh:audit:td-has-header","duration":1.2,"entryType":"measure"},{"startTime":1539863.7,"name":"lh:audit:td-headers-attr","duration":1.25,"entryType":"measure"},{"startTime":1539865.06,"name":"lh:audit:th-has-data-cells","duration":3.82,"entryType":"measure"},{"startTime":1539868.99,"name":"lh:audit:valid-lang","duration":1.25,"entryType":"measure"},{"startTime":1539870.35,"name":"lh:audit:video-caption","duration":1.28,"entryType":"measure"},{"startTime":1539871.65,"name":"lh:audit:custom-controls-labels","duration":0.07,"entryType":"measure"},{"startTime":1539871.72,"name":"lh:audit:custom-controls-roles","duration":0.01,"entryType":"measure"},{"startTime":1539871.73,"name":"lh:audit:focus-traps","duration":0,"entryType":"measure"},{"startTime":1539871.76,"name":"lh:audit:focusable-controls","duration":0.01,"entryType":"measure"},{"startTime":1539871.78,"name":"lh:audit:interactive-element-affordance","duration":0,"entryType":"measure"},{"startTime":1539871.79,"name":"lh:audit:logical-tab-order","duration":0,"entryType":"measure"},{"startTime":1539871.8,"name":"lh:audit:managed-focus","duration":0,"entryType":"measure"},{"startTime":1539871.81,"name":"lh:audit:offscreen-content-hidden","duration":0,"entryType":"measure"},{"startTime":1539871.83,"name":"lh:audit:use-landmarks","duration":0,"entryType":"measure"},{"startTime":1539871.84,"name":"lh:audit:visual-order-follows-dom","duration":0,"entryType":"measure"},{"startTime":1539871.94,"name":"lh:audit:autocomplete-valid","duration":0.71,"entryType":"measure"},{"startTime":1539872.78,"name":"lh:audit:presentation-role-conflict","duration":1.66,"entryType":"measure"},{"startTime":1539874.55,"name":"lh:audit:svg-img-alt","duration":1.26,"entryType":"measure"},{"startTime":1539875.94,"name":"lh:audit:doctype","duration":6.2,"entryType":"measure"},{"startTime":1539882.27,"name":"lh:audit:charset","duration":2.56,"entryType":"measure"},{"startTime":1539884.93,"name":"lh:audit:geolocation-on-start","duration":0.42,"entryType":"measure"},{"startTime":1539885.46,"name":"lh:audit:inspector-issues","duration":0.57,"entryType":"measure"},{"startTime":1539886.11,"name":"lh:audit:js-libraries","duration":0.44,"entryType":"measure"},{"startTime":1539886.69,"name":"lh:audit:notification-on-start","duration":0.4,"entryType":"measure"},{"startTime":1539887.19,"name":"lh:audit:paste-preventing-inputs","duration":0.34,"entryType":"measure"},{"startTime":1539887.61,"name":"lh:audit:baseline","duration":7.69,"entryType":"measure"},{"startTime":1539895.42,"name":"lh:audit:meta-description","duration":0.34,"entryType":"measure"},{"startTime":1539895.85,"name":"lh:audit:http-status-code","duration":0.35,"entryType":"measure"},{"startTime":1539896.29,"name":"lh:audit:link-text","duration":0.93,"entryType":"measure"},{"startTime":1539897.36,"name":"lh:audit:crawlable-anchors","duration":0.58,"entryType":"measure"},{"startTime":1539898.06,"name":"lh:audit:is-crawlable","duration":1.3,"entryType":"measure"},{"startTime":1539899.47,"name":"lh:audit:robots-txt","duration":0.55,"entryType":"measure"},{"startTime":1539900.13,"name":"lh:audit:hreflang","duration":0.39,"entryType":"measure"},{"startTime":1539900.63,"name":"lh:audit:canonical","duration":0.43,"entryType":"measure"},{"startTime":1539901.15,"name":"lh:audit:structured-data","duration":0.22,"entryType":"measure"},{"startTime":1539901.39,"name":"lh:runner:generate","duration":0.19,"entryType":"measure"}],"total":8831.08},"i18n":{"rendererFormattedStrings":{},"icuMessagePaths":{"core/audits/is-on-https.js | title":["audits[is-on-https].title"],"core/audits/is-on-https.js | description":["audits[is-on-https].description"],"core/audits/is-on-https.js | columnInsecureURL":["audits[is-on-https].details.headings[0].label"],"core/audits/is-on-https.js | columnResolution":["audits[is-on-https].details.headings[1].label"],"core/audits/redirects-http.js | title":["audits[redirects-http].title"],"core/audits/redirects-http.js | description":["audits[redirects-http].description"],"core/audits/errors-in-console.js | failureTitle":["audits[errors-in-console].title"],"core/audits/errors-in-console.js | description":["audits[errors-in-console].description"],"core/lib/i18n/i18n.js | columnSource":["audits[errors-in-console].details.headings[0].label","audits.deprecations.details.headings[1].label","audits[geolocation-on-start].details.headings[0].label","audits[notification-on-start].details.headings[0].label","audits.baseline.details.headings[2].label"],"core/lib/i18n/i18n.js | columnDescription":["audits[errors-in-console].details.headings[1].label","audits[csp-xss].details.headings[0].label","audits[has-hsts].details.headings[0].label","audits[origin-isolation].details.headings[0].label","audits[clickjacking-mitigation].details.headings[0].label","audits[trusted-types-xss].details.headings[0].label"],"core/audits/image-aspect-ratio.js | title":["audits[image-aspect-ratio].title"],"core/audits/image-aspect-ratio.js | description":["audits[image-aspect-ratio].description"],"core/lib/i18n/i18n.js | columnURL":["audits[image-aspect-ratio].details.headings[1].label","audits[image-size-responsive].details.headings[1].label","audits[third-party-cookies].details.headings[1].label","audits[valid-source-maps].details.headings[0].label"],"core/audits/image-aspect-ratio.js | columnDisplayed":["audits[image-aspect-ratio].details.headings[2].label"],"core/audits/image-aspect-ratio.js | columnActual":["audits[image-aspect-ratio].details.headings[3].label"],"core/audits/image-size-responsive.js | title":["audits[image-size-responsive].title"],"core/audits/image-size-responsive.js | description":["audits[image-size-responsive].description"],"core/audits/image-size-responsive.js | columnDisplayed":["audits[image-size-responsive].details.headings[2].label"],"core/audits/image-size-responsive.js | columnActual":["audits[image-size-responsive].details.headings[3].label"],"core/audits/image-size-responsive.js | columnExpected":["audits[image-size-responsive].details.headings[4].label"],"core/audits/deprecations.js | title":["audits.deprecations.title"],"core/audits/deprecations.js | description":["audits.deprecations.description"],"core/audits/deprecations.js | columnDeprecate":["audits.deprecations.details.headings[0].label"],"core/audits/third-party-cookies.js | failureTitle":["audits[third-party-cookies].title"],"core/audits/third-party-cookies.js | description":["audits[third-party-cookies].description"],"core/audits/third-party-cookies.js | displayValue":[{"values":{"itemCount":5},"path":"audits[third-party-cookies].displayValue"}],"core/lib/i18n/i18n.js | columnName":["audits[third-party-cookies].details.headings[0].label","audits[js-libraries].details.headings[0].label"],"core/audits/valid-source-maps.js | title":["audits[valid-source-maps].title"],"core/audits/valid-source-maps.js | description":["audits[valid-source-maps].description"],"core/audits/valid-source-maps.js | columnMapURL":["audits[valid-source-maps].details.headings[1].label"],"core/audits/csp-xss.js | title":["audits[csp-xss].title"],"core/audits/csp-xss.js | description":["audits[csp-xss].description"],"core/audits/csp-xss.js | columnDirective":["audits[csp-xss].details.headings[1].label"],"core/audits/csp-xss.js | columnSeverity":["audits[csp-xss].details.headings[2].label"],"core/lib/i18n/i18n.js | itemSeverityHigh":["audits[csp-xss].details.items[0].severity","audits[origin-isolation].details.items[0].severity","audits[clickjacking-mitigation].details.items[0].severity","audits[trusted-types-xss].details.items[0].severity"],"core/audits/csp-xss.js | noCsp":["audits[csp-xss].details.items[0].description"],"core/audits/has-hsts.js | title":["audits[has-hsts].title"],"core/audits/has-hsts.js | description":["audits[has-hsts].description"],"core/audits/has-hsts.js | columnDirective":["audits[has-hsts].details.headings[1].label"],"core/audits/has-hsts.js | columnSeverity":["audits[has-hsts].details.headings[2].label"],"core/audits/has-hsts.js | noSubdomain":["audits[has-hsts].details.items[0].description"],"core/lib/i18n/i18n.js | itemSeverityMedium":["audits[has-hsts].details.items[0].severity","audits[has-hsts].details.items[1].severity"],"core/audits/has-hsts.js | noPreload":["audits[has-hsts].details.items[1].description"],"core/audits/origin-isolation.js | title":["audits[origin-isolation].title"],"core/audits/origin-isolation.js | description":["audits[origin-isolation].description"],"core/audits/origin-isolation.js | columnDirective":["audits[origin-isolation].details.headings[1].label"],"core/audits/origin-isolation.js | columnSeverity":["audits[origin-isolation].details.headings[2].label"],"core/audits/origin-isolation.js | noCoop":["audits[origin-isolation].details.items[0].description"],"core/audits/clickjacking-mitigation.js | title":["audits[clickjacking-mitigation].title"],"core/audits/clickjacking-mitigation.js | description":["audits[clickjacking-mitigation].description"],"core/audits/clickjacking-mitigation.js | columnSeverity":["audits[clickjacking-mitigation].details.headings[1].label"],"core/audits/clickjacking-mitigation.js | noClickjackingMitigation":["audits[clickjacking-mitigation].details.items[0].description"],"core/audits/trusted-types-xss.js | title":["audits[trusted-types-xss].title"],"core/audits/trusted-types-xss.js | description":["audits[trusted-types-xss].description"],"core/audits/trusted-types-xss.js | columnSeverity":["audits[trusted-types-xss].details.headings[1].label"],"core/audits/trusted-types-xss.js | noTrustedTypesToMitigateXss":["audits[trusted-types-xss].details.items[0].description"],"core/audits/accessibility/accesskeys.js | title":["audits.accesskeys.title"],"core/audits/accessibility/accesskeys.js | description":["audits.accesskeys.description"],"core/audits/accessibility/aria-allowed-attr.js | title":["audits[aria-allowed-attr].title"],"core/audits/accessibility/aria-allowed-attr.js | description":["audits[aria-allowed-attr].description"],"core/lib/i18n/i18n.js | columnFailingElem":["audits[aria-allowed-attr].details.headings[0].label","audits[aria-command-name].details.headings[0].label","audits[aria-conditional-attr].details.headings[0].label","audits[aria-deprecated-role].details.headings[0].label","audits[aria-hidden-body].details.headings[0].label","audits[aria-hidden-focus].details.headings[0].label","audits[aria-prohibited-attr].details.headings[0].label","audits[aria-required-attr].details.headings[0].label","audits[aria-roles].details.headings[0].label","audits[aria-valid-attr-value].details.headings[0].label","audits[aria-valid-attr].details.headings[0].label","audits[button-name].details.headings[0].label","audits[color-contrast].details.headings[0].label","audits[document-title].details.headings[0].label","audits[frame-title].details.headings[0].label","audits[heading-order].details.headings[0].label","audits[html-has-lang].details.headings[0].label","audits[html-lang-valid].details.headings[0].label","audits[image-alt].details.headings[0].label","audits[label-content-name-mismatch].details.headings[0].label","audits[landmark-one-main].details.headings[0].label","audits[link-name].details.headings[0].label","audits.list.details.headings[0].label","audits.listitem.details.headings[0].label","audits[meta-viewport].details.headings[0].label","audits.tabindex.details.headings[0].label","audits[target-size].details.headings[0].label","audits[presentation-role-conflict].details.headings[0].label","audits[paste-preventing-inputs].details.headings[0].label"],"core/audits/accessibility/aria-allowed-role.js | title":["audits[aria-allowed-role].title"],"core/audits/accessibility/aria-allowed-role.js | description":["audits[aria-allowed-role].description"],"core/audits/accessibility/aria-command-name.js | title":["audits[aria-command-name].title"],"core/audits/accessibility/aria-command-name.js | description":["audits[aria-command-name].description"],"core/audits/accessibility/aria-conditional-attr.js | title":["audits[aria-conditional-attr].title"],"core/audits/accessibility/aria-conditional-attr.js | description":["audits[aria-conditional-attr].description"],"core/audits/accessibility/aria-deprecated-role.js | title":["audits[aria-deprecated-role].title"],"core/audits/accessibility/aria-deprecated-role.js | description":["audits[aria-deprecated-role].description"],"core/audits/accessibility/aria-dialog-name.js | title":["audits[aria-dialog-name].title"],"core/audits/accessibility/aria-dialog-name.js | description":["audits[aria-dialog-name].description"],"core/audits/accessibility/aria-hidden-body.js | title":["audits[aria-hidden-body].title"],"core/audits/accessibility/aria-hidden-body.js | description":["audits[aria-hidden-body].description"],"core/audits/accessibility/aria-hidden-focus.js | title":["audits[aria-hidden-focus].title"],"core/audits/accessibility/aria-hidden-focus.js | description":["audits[aria-hidden-focus].description"],"core/audits/accessibility/aria-input-field-name.js | title":["audits[aria-input-field-name].title"],"core/audits/accessibility/aria-input-field-name.js | description":["audits[aria-input-field-name].description"],"core/audits/accessibility/aria-meter-name.js | title":["audits[aria-meter-name].title"],"core/audits/accessibility/aria-meter-name.js | description":["audits[aria-meter-name].description"],"core/audits/accessibility/aria-progressbar-name.js | title":["audits[aria-progressbar-name].title"],"core/audits/accessibility/aria-progressbar-name.js | description":["audits[aria-progressbar-name].description"],"core/audits/accessibility/aria-prohibited-attr.js | title":["audits[aria-prohibited-attr].title"],"core/audits/accessibility/aria-prohibited-attr.js | description":["audits[aria-prohibited-attr].description"],"core/audits/accessibility/aria-required-attr.js | title":["audits[aria-required-attr].title"],"core/audits/accessibility/aria-required-attr.js | description":["audits[aria-required-attr].description"],"core/audits/accessibility/aria-required-children.js | title":["audits[aria-required-children].title"],"core/audits/accessibility/aria-required-children.js | description":["audits[aria-required-children].description"],"core/audits/accessibility/aria-required-parent.js | title":["audits[aria-required-parent].title"],"core/audits/accessibility/aria-required-parent.js | description":["audits[aria-required-parent].description"],"core/audits/accessibility/aria-roles.js | title":["audits[aria-roles].title"],"core/audits/accessibility/aria-roles.js | description":["audits[aria-roles].description"],"core/audits/accessibility/aria-text.js | title":["audits[aria-text].title"],"core/audits/accessibility/aria-text.js | description":["audits[aria-text].description"],"core/audits/accessibility/aria-toggle-field-name.js | title":["audits[aria-toggle-field-name].title"],"core/audits/accessibility/aria-toggle-field-name.js | description":["audits[aria-toggle-field-name].description"],"core/audits/accessibility/aria-tooltip-name.js | title":["audits[aria-tooltip-name].title"],"core/audits/accessibility/aria-tooltip-name.js | description":["audits[aria-tooltip-name].description"],"core/audits/accessibility/aria-treeitem-name.js | title":["audits[aria-treeitem-name].title"],"core/audits/accessibility/aria-treeitem-name.js | description":["audits[aria-treeitem-name].description"],"core/audits/accessibility/aria-valid-attr-value.js | title":["audits[aria-valid-attr-value].title"],"core/audits/accessibility/aria-valid-attr-value.js | description":["audits[aria-valid-attr-value].description"],"core/audits/accessibility/aria-valid-attr.js | title":["audits[aria-valid-attr].title"],"core/audits/accessibility/aria-valid-attr.js | description":["audits[aria-valid-attr].description"],"core/audits/accessibility/button-name.js | title":["audits[button-name].title"],"core/audits/accessibility/button-name.js | description":["audits[button-name].description"],"core/audits/accessibility/bypass.js | title":["audits.bypass.title"],"core/audits/accessibility/bypass.js | description":["audits.bypass.description"],"core/audits/accessibility/color-contrast.js | title":["audits[color-contrast].title"],"core/audits/accessibility/color-contrast.js | description":["audits[color-contrast].description"],"core/audits/accessibility/definition-list.js | title":["audits[definition-list].title"],"core/audits/accessibility/definition-list.js | description":["audits[definition-list].description"],"core/audits/accessibility/dlitem.js | title":["audits.dlitem.title"],"core/audits/accessibility/dlitem.js | description":["audits.dlitem.description"],"core/audits/accessibility/document-title.js | title":["audits[document-title].title"],"core/audits/accessibility/document-title.js | description":["audits[document-title].description"],"core/audits/accessibility/duplicate-id-aria.js | title":["audits[duplicate-id-aria].title"],"core/audits/accessibility/duplicate-id-aria.js | description":["audits[duplicate-id-aria].description"],"core/audits/accessibility/empty-heading.js | title":["audits[empty-heading].title"],"core/audits/accessibility/empty-heading.js | description":["audits[empty-heading].description"],"core/audits/accessibility/form-field-multiple-labels.js | title":["audits[form-field-multiple-labels].title"],"core/audits/accessibility/form-field-multiple-labels.js | description":["audits[form-field-multiple-labels].description"],"core/audits/accessibility/frame-title.js | title":["audits[frame-title].title"],"core/audits/accessibility/frame-title.js | description":["audits[frame-title].description"],"core/audits/accessibility/heading-order.js | title":["audits[heading-order].title"],"core/audits/accessibility/heading-order.js | description":["audits[heading-order].description"],"core/audits/accessibility/html-has-lang.js | title":["audits[html-has-lang].title"],"core/audits/accessibility/html-has-lang.js | description":["audits[html-has-lang].description"],"core/audits/accessibility/html-lang-valid.js | title":["audits[html-lang-valid].title"],"core/audits/accessibility/html-lang-valid.js | description":["audits[html-lang-valid].description"],"core/audits/accessibility/html-xml-lang-mismatch.js | title":["audits[html-xml-lang-mismatch].title"],"core/audits/accessibility/html-xml-lang-mismatch.js | description":["audits[html-xml-lang-mismatch].description"],"core/audits/accessibility/identical-links-same-purpose.js | title":["audits[identical-links-same-purpose].title"],"core/audits/accessibility/identical-links-same-purpose.js | description":["audits[identical-links-same-purpose].description"],"core/audits/accessibility/image-alt.js | title":["audits[image-alt].title"],"core/audits/accessibility/image-alt.js | description":["audits[image-alt].description"],"core/audits/accessibility/image-redundant-alt.js | title":["audits[image-redundant-alt].title"],"core/audits/accessibility/image-redundant-alt.js | description":["audits[image-redundant-alt].description"],"core/audits/accessibility/input-button-name.js | title":["audits[input-button-name].title"],"core/audits/accessibility/input-button-name.js | description":["audits[input-button-name].description"],"core/audits/accessibility/input-image-alt.js | title":["audits[input-image-alt].title"],"core/audits/accessibility/input-image-alt.js | description":["audits[input-image-alt].description"],"core/audits/accessibility/label-content-name-mismatch.js | title":["audits[label-content-name-mismatch].title"],"core/audits/accessibility/label-content-name-mismatch.js | description":["audits[label-content-name-mismatch].description"],"core/audits/accessibility/label.js | title":["audits.label.title"],"core/audits/accessibility/label.js | description":["audits.label.description"],"core/audits/accessibility/landmark-one-main.js | title":["audits[landmark-one-main].title"],"core/audits/accessibility/landmark-one-main.js | description":["audits[landmark-one-main].description"],"core/audits/accessibility/link-name.js | failureTitle":["audits[link-name].title"],"core/audits/accessibility/link-name.js | description":["audits[link-name].description"],"core/audits/accessibility/link-in-text-block.js | title":["audits[link-in-text-block].title"],"core/audits/accessibility/link-in-text-block.js | description":["audits[link-in-text-block].description"],"core/audits/accessibility/list.js | title":["audits.list.title"],"core/audits/accessibility/list.js | description":["audits.list.description"],"core/audits/accessibility/listitem.js | title":["audits.listitem.title"],"core/audits/accessibility/listitem.js | description":["audits.listitem.description"],"core/audits/accessibility/meta-refresh.js | title":["audits[meta-refresh].title"],"core/audits/accessibility/meta-refresh.js | description":["audits[meta-refresh].description"],"core/audits/accessibility/meta-viewport.js | title":["audits[meta-viewport].title"],"core/audits/accessibility/meta-viewport.js | description":["audits[meta-viewport].description"],"core/audits/accessibility/object-alt.js | title":["audits[object-alt].title"],"core/audits/accessibility/object-alt.js | description":["audits[object-alt].description"],"core/audits/accessibility/select-name.js | title":["audits[select-name].title"],"core/audits/accessibility/select-name.js | description":["audits[select-name].description"],"core/audits/accessibility/skip-link.js | title":["audits[skip-link].title"],"core/audits/accessibility/skip-link.js | description":["audits[skip-link].description"],"core/audits/accessibility/tabindex.js | title":["audits.tabindex.title"],"core/audits/accessibility/tabindex.js | description":["audits.tabindex.description"],"core/audits/accessibility/table-duplicate-name.js | title":["audits[table-duplicate-name].title"],"core/audits/accessibility/table-duplicate-name.js | description":["audits[table-duplicate-name].description"],"core/audits/accessibility/table-fake-caption.js | title":["audits[table-fake-caption].title"],"core/audits/accessibility/table-fake-caption.js | description":["audits[table-fake-caption].description"],"core/audits/accessibility/target-size.js | failureTitle":["audits[target-size].title"],"core/audits/accessibility/target-size.js | description":["audits[target-size].description"],"core/audits/accessibility/td-has-header.js | title":["audits[td-has-header].title"],"core/audits/accessibility/td-has-header.js | description":["audits[td-has-header].description"],"core/audits/accessibility/td-headers-attr.js | title":["audits[td-headers-attr].title"],"core/audits/accessibility/td-headers-attr.js | description":["audits[td-headers-attr].description"],"core/audits/accessibility/th-has-data-cells.js | title":["audits[th-has-data-cells].title"],"core/audits/accessibility/th-has-data-cells.js | description":["audits[th-has-data-cells].description"],"core/audits/accessibility/valid-lang.js | title":["audits[valid-lang].title"],"core/audits/accessibility/valid-lang.js | description":["audits[valid-lang].description"],"core/audits/accessibility/video-caption.js | title":["audits[video-caption].title"],"core/audits/accessibility/video-caption.js | description":["audits[video-caption].description"],"core/audits/accessibility/autocomplete-valid.js | title":["audits[autocomplete-valid].title"],"core/audits/accessibility/autocomplete-valid.js | description":["audits[autocomplete-valid].description"],"core/audits/accessibility/presentation-role-conflict.js | title":["audits[presentation-role-conflict].title"],"core/audits/accessibility/presentation-role-conflict.js | description":["audits[presentation-role-conflict].description"],"core/audits/accessibility/svg-img-alt.js | title":["audits[svg-img-alt].title"],"core/audits/accessibility/svg-img-alt.js | description":["audits[svg-img-alt].description"],"core/audits/dobetterweb/doctype.js | title":["audits.doctype.title"],"core/audits/dobetterweb/doctype.js | description":["audits.doctype.description"],"core/audits/dobetterweb/charset.js | title":["audits.charset.title"],"core/audits/dobetterweb/charset.js | description":["audits.charset.description"],"core/audits/dobetterweb/geolocation-on-start.js | title":["audits[geolocation-on-start].title"],"core/audits/dobetterweb/geolocation-on-start.js | description":["audits[geolocation-on-start].description"],"core/audits/dobetterweb/inspector-issues.js | failureTitle":["audits[inspector-issues].title"],"core/audits/dobetterweb/inspector-issues.js | description":["audits[inspector-issues].description"],"core/audits/dobetterweb/inspector-issues.js | columnIssueType":["audits[inspector-issues].details.headings[0].label"],"core/audits/dobetterweb/js-libraries.js | title":["audits[js-libraries].title"],"core/audits/dobetterweb/js-libraries.js | description":["audits[js-libraries].description"],"core/audits/dobetterweb/js-libraries.js | columnVersion":["audits[js-libraries].details.headings[1].label"],"core/audits/dobetterweb/notification-on-start.js | title":["audits[notification-on-start].title"],"core/audits/dobetterweb/notification-on-start.js | description":["audits[notification-on-start].description"],"core/audits/dobetterweb/paste-preventing-inputs.js | title":["audits[paste-preventing-inputs].title"],"core/audits/dobetterweb/paste-preventing-inputs.js | description":["audits[paste-preventing-inputs].description"],"core/audits/baseline.js | title":["audits.baseline.title"],"core/audits/baseline.js | description":[{"values":{"date":"2026-03-18"},"path":"audits.baseline.description"}],"core/audits/baseline.js | columnFeature":["audits.baseline.details.headings[0].label"],"core/audits/baseline.js | columnStatus":["audits.baseline.details.headings[1].label"],"core/audits/seo/meta-description.js | title":["audits[meta-description].title"],"core/audits/seo/meta-description.js | description":["audits[meta-description].description"],"core/audits/seo/http-status-code.js | title":["audits[http-status-code].title"],"core/audits/seo/http-status-code.js | description":["audits[http-status-code].description"],"core/audits/seo/link-text.js | failureTitle":["audits[link-text].title"],"core/audits/seo/link-text.js | description":["audits[link-text].description"],"core/audits/seo/link-text.js | displayValue":[{"values":{"itemCount":1},"path":"audits[link-text].displayValue"}],"core/audits/seo/crawlable-anchors.js | title":["audits[crawlable-anchors].title"],"core/audits/seo/crawlable-anchors.js | description":["audits[crawlable-anchors].description"],"core/audits/seo/crawlable-anchors.js | columnFailingLink":["audits[crawlable-anchors].details.headings[0].label"],"core/audits/seo/is-crawlable.js | title":["audits[is-crawlable].title"],"core/audits/seo/is-crawlable.js | description":["audits[is-crawlable].description"],"core/audits/seo/robots-txt.js | title":["audits[robots-txt].title"],"core/audits/seo/robots-txt.js | description":["audits[robots-txt].description"],"core/audits/seo/hreflang.js | title":["audits.hreflang.title"],"core/audits/seo/hreflang.js | description":["audits.hreflang.description"],"core/audits/seo/canonical.js | title":["audits.canonical.title"],"core/audits/seo/canonical.js | description":["audits.canonical.description"],"core/audits/seo/manual/structured-data.js | title":["audits[structured-data].title"],"core/audits/seo/manual/structured-data.js | description":["audits[structured-data].description"],"core/config/default-config.js | a11yCategoryTitle":["categories.accessibility.title"],"core/config/default-config.js | a11yCategoryDescription":["categories.accessibility.description"],"core/config/default-config.js | a11yCategoryManualDescription":["categories.accessibility.manualDescription"],"core/config/default-config.js | bestPracticesCategoryTitle":["categories[best-practices].title"],"core/config/default-config.js | seoCategoryTitle":["categories.seo.title"],"core/config/default-config.js | seoCategoryDescription":["categories.seo.description"],"core/config/default-config.js | seoCategoryManualDescription":["categories.seo.manualDescription"],"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"],"node_modules/lighthouse-stack-packs/packs/react.js | unminified-css":["stackPacks[0].descriptions[unminified-css]"],"node_modules/lighthouse-stack-packs/packs/react.js | unminified-javascript":["stackPacks[0].descriptions[unminified-javascript]"],"node_modules/lighthouse-stack-packs/packs/react.js | unused-javascript":["stackPacks[0].descriptions[unused-javascript]"],"node_modules/lighthouse-stack-packs/packs/react.js | server-response-time":["stackPacks[0].descriptions[server-response-time]"],"node_modules/lighthouse-stack-packs/packs/react.js | redirects":["stackPacks[0].descriptions.redirects"],"node_modules/lighthouse-stack-packs/packs/react.js | user-timings":["stackPacks[0].descriptions[user-timings]"],"node_modules/lighthouse-stack-packs/packs/react.js | dom-size":["stackPacks[0].descriptions[dom-size]"]}}};</script>
+ <script>"use strict";(()=>{var Re=.8999999999999999,Ne=.5,Ie=.49999999999999994;function He(o){let e=Math.sign(o);o=Math.abs(o);let t=.254829592,n=-.284496736,r=1.421413741,i=-1.453152027,a=1.061405429,s=1/(1+.3275911*o),c=s*(t+s*(n+s*(r+s*(i+s*a))));return e*(1-c*Math.exp(-o*o))}function fe({median:o,p10:e},t){if(o<=0)throw new Error("median must be greater than zero");if(e<=0)throw new Error("p10 must be greater than zero");if(e>=o)throw new Error("p10 must be less than the median");if(t<=0)return 1;let n=.9061938024368232,r=Math.max(Number.MIN_VALUE,t/o),i=Math.log(r),a=Math.max(Number.MIN_VALUE,e/o),l=-Math.log(a),s=i*n/l,c=(1-He(s))/2,d;return t<=e?d=Math.max(.9,Math.min(1,c)):t<=o?d=Math.max(Ne,Math.min(Re,c)):d=Math.max(0,Math.min(Ie,c)),d}var U="\u2026",Oe="\xA0",ve=.9,$e={PASS:{label:"pass",minScore:ve},AVERAGE:{label:"average",minScore:.5},FAIL:{label:"fail"},ERROR:{label:"error"}},Ve=["com","co","gov","edu","ac","org","go","gob","or","net","in","ne","nic","gouv","web","spb","blog","jus","kiev","mil","wi","qc","ca","bel","on"],E=class o{static get RATINGS(){return $e}static get PASS_THRESHOLD(){return ve}static get MS_DISPLAY_VALUE(){return`%10d${Oe}ms`}static getFinalDisplayedUrl(e){if(e.finalDisplayedUrl)return e.finalDisplayedUrl;if(e.finalUrl)return e.finalUrl;throw new Error("Could not determine final displayed URL")}static getMainDocumentUrl(e){return e.mainDocumentUrl||e.finalUrl}static getFullPageScreenshot(e){return e.fullPageScreenshot?e.fullPageScreenshot:e.audits["full-page-screenshot"]?.details}static getEntityFromUrl(e,t){return t&&t.find(r=>r.origins.find(i=>e.startsWith(i)))||o.getPseudoRootDomain(e)}static splitMarkdownCodeSpans(e){let t=[],n=e.split(/`(.*?)`/g);for(let r=0;r<n.length;r++){let i=n[r];if(!i)continue;let a=r%2!==0;t.push({isCode:a,text:i})}return t}static splitMarkdownLink(e){let t=[],n=e.split(/\[([^\]]+?)\]\((https?:\/\/.*?)\)/g);for(;n.length;){let[r,i,a]=n.splice(0,3);r&&t.push({isLink:!1,text:r}),i&&a&&t.push({isLink:!0,text:i,linkHref:a})}return t}static truncate(e,t,n="\u2026"){if(e.length<=t)return e;let i=new Intl.Segmenter(void 0,{granularity:"grapheme"}).segment(e)[Symbol.iterator](),a=0;for(let l=0;l<=t-n.length;l++){let s=i.next();if(s.done)return e;a=s.value.index}for(let l=0;l<n.length;l++)if(i.next().done)return e;return e.slice(0,a)+n}static getURLDisplayName(e,t){t=t||{numPathParts:void 0,preserveQuery:void 0,preserveHost:void 0};let n=t.numPathParts!==void 0?t.numPathParts:2,r=t.preserveQuery!==void 0?t.preserveQuery:!0,i=t.preserveHost||!1,a;if(e.protocol==="about:"||e.protocol==="data:")a=e.href;else{a=e.pathname;let s=a.split("/").filter(c=>c.length);n&&s.length>n&&(a=U+s.slice(-1*n).join("/")),i&&(a=`${e.host}/${a.replace(/^\//,"")}`),r&&(a=`${a}${e.search}`)}let l=64;if(e.protocol!=="data:"&&(a=a.slice(0,200),a=a.replace(/([a-f0-9]{7})[a-f0-9]{13}[a-f0-9]*/g,`$1${U}`),a=a.replace(/([a-zA-Z0-9-_]{9})(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])[a-zA-Z0-9-_]{10,}/g,`$1${U}`),a=a.replace(/(\d{3})\d{6,}/g,`$1${U}`),a=a.replace(/\u2026+/g,U),a.length>l&&a.includes("?")&&(a=a.replace(/\?([^=]*)(=)?.*/,`?$1$2${U}`),a.length>l&&(a=a.replace(/\?.*/,`?${U}`)))),a.length>l){let s=a.lastIndexOf(".");s>=0?a=a.slice(0,l-1-(a.length-s))+`${U}${a.slice(s)}`:a=a.slice(0,l-1)+U}return a}static getChromeExtensionOrigin(e){let t=new URL(e);return t.protocol+"//"+t.host}static parseURL(e){let t=new URL(e);return{file:o.getURLDisplayName(t),hostname:t.hostname,origin:t.protocol==="chrome-extension:"?o.getChromeExtensionOrigin(e):t.origin}}static createOrReturnURL(e){return e instanceof URL?e:new URL(e)}static getPseudoTld(e){let t=e.split(".").slice(-2);return Ve.includes(t[0])?`.${t.join(".")}`:`.${t[t.length-1]}`}static getPseudoRootDomain(e){let t=o.createOrReturnURL(e).hostname,r=o.getPseudoTld(t).split(".");return t.split(".").slice(-r.length).join(".")}static filterRelevantLines(e,t,n){if(t.length===0)return e.slice(0,n*2+1);let r=3,i=new Set;return t=t.sort((a,l)=>(a.lineNumber||0)-(l.lineNumber||0)),t.forEach(({lineNumber:a})=>{let l=a-n,s=a+n;for(;l<1;)l++,s++;i.has(l-r-1)&&(l-=r);for(let c=l;c<=s;c++){let d=c;i.add(d)}}),e.filter(a=>i.has(a.lineNumber))}static computeLogNormalScore(e,t){let n=fe(e,t);return n>.9&&(n+=.05*(n-.9)),Math.floor(n*100)/100}};function Ge(o){let e=o.createFragment(),t=o.createElement("style");t.append(`
+ .lh-3p-filter {
+ color: var(--color-gray-600);
+ float: right;
+ padding: 6px var(--stackpack-padding-horizontal);
+ }
+ .lh-3p-filter-label, .lh-3p-filter-input {
+ vertical-align: middle;
+ user-select: none;
+ }
+ .lh-3p-filter-input:disabled + .lh-3p-ui-string {
+ text-decoration: line-through;
+ }
+ `),e.append(t);let n=o.createElement("div","lh-3p-filter"),r=o.createElement("label","lh-3p-filter-label"),i=o.createElement("input","lh-3p-filter-input");i.setAttribute("type","checkbox"),i.setAttribute("checked","");let a=o.createElement("span","lh-3p-ui-string");a.append("Show 3rd party resources");let l=o.createElement("span","lh-3p-filter-count");return r.append(" ",i," ",a," (",l,") "),n.append(" ",r," "),e.append(n),e}function Be(o){let e=o.createFragment(),t=o.createElement("div","lh-audit"),n=o.createElement("details","lh-expandable-details"),r=o.createElement("summary"),i=o.createElement("div","lh-audit__header lh-expandable-details__summary"),a=o.createElement("span","lh-audit__score-icon"),l=o.createElement("span","lh-audit__title-and-text"),s=o.createElement("span","lh-audit__title"),c=o.createElement("span","lh-audit__display-text");l.append(" ",s," ",c," ");let d=o.createElement("div","lh-chevron-container");i.append(" ",a," ",l," ",d," "),r.append(" ",i," ");let h=o.createElement("div","lh-audit__description"),p=o.createElement("div","lh-audit__stackpacks");return n.append(" ",r," ",h," ",p," "),t.append(" ",n," "),e.append(t),e}function qe(o){let e=o.createFragment(),t=o.createElement("div","lh-category-header"),n=o.createElement("div","lh-score__gauge");n.setAttribute("role","heading"),n.setAttribute("aria-level","2");let r=o.createElement("div","lh-category-header__description");return t.append(" ",n," ",r," "),e.append(t),e}function je(o){let e=o.createFragment(),t=o.createElementNS("http://www.w3.org/2000/svg","svg","lh-chevron");t.setAttribute("viewBox","0 0 100 100");let n=o.createElementNS("http://www.w3.org/2000/svg","g","lh-chevron__lines"),r=o.createElementNS("http://www.w3.org/2000/svg","path","lh-chevron__line lh-chevron__line-left");r.setAttribute("d","M10 50h40");let i=o.createElementNS("http://www.w3.org/2000/svg","path","lh-chevron__line lh-chevron__line-right");return i.setAttribute("d","M90 50H50"),n.append(" ",r," ",i," "),t.append(" ",n," "),e.append(t),e}function We(o){let e=o.createFragment(),t=o.createElement("div","lh-audit-group"),n=o.createElement("details","lh-clump"),r=o.createElement("summary"),i=o.createElement("div","lh-audit-group__summary"),a=o.createElement("div","lh-audit-group__header"),l=o.createElement("span","lh-audit-group__title"),s=o.createElement("span","lh-audit-group__itemcount");a.append(" ",l," ",s," "," "," ");let c=o.createElement("div","lh-clump-toggle"),d=o.createElement("span","lh-clump-toggletext--show"),h=o.createElement("span","lh-clump-toggletext--hide");return c.append(" ",d," ",h," "),i.append(" ",a," ",c," "),r.append(" ",i," "),n.append(" ",r," "),t.append(" "," ",n," "),e.append(t),e}function Ke(o){let e=o.createFragment(),t=o.createElement("div","lh-crc-container"),n=o.createElement("style");n.append(`
+ .lh-crc .lh-tree-marker {
+ width: 12px;
+ height: 26px;
+ display: block;
+ float: left;
+ background-position: top left;
+ }
+ .lh-crc .lh-horiz-down {
+ background: url('data:image/svg+xml;utf8,<svg width="16" height="26" viewBox="0 0 16 26" xmlns="http://www.w3.org/2000/svg"><g fill="%23D8D8D8" fill-rule="evenodd"><path d="M16 12v2H-2v-2z"/><path d="M9 12v14H7V12z"/>\u003c/g>\u003c/svg>');
+ }
+ .lh-crc .lh-right {
+ background: url('data:image/svg+xml;utf8,<svg width="16" height="26" viewBox="0 0 16 26" xmlns="http://www.w3.org/2000/svg"><path d="M16 12v2H0v-2z" fill="%23D8D8D8" fill-rule="evenodd"/>\u003c/svg>');
+ }
+ .lh-crc .lh-up-right {
+ background: url('data:image/svg+xml;utf8,<svg width="16" height="26" viewBox="0 0 16 26" xmlns="http://www.w3.org/2000/svg"><path d="M7 0h2v14H7zm2 12h7v2H9z" fill="%23D8D8D8" fill-rule="evenodd"/>\u003c/svg>');
+ }
+ .lh-crc .lh-vert-right {
+ background: url('data:image/svg+xml;utf8,<svg width="16" height="26" viewBox="0 0 16 26" xmlns="http://www.w3.org/2000/svg"><path d="M7 0h2v27H7zm2 12h7v2H9z" fill="%23D8D8D8" fill-rule="evenodd"/>\u003c/svg>');
+ }
+ .lh-crc .lh-vert {
+ background: url('data:image/svg+xml;utf8,<svg width="16" height="26" viewBox="0 0 16 26" xmlns="http://www.w3.org/2000/svg"><path d="M7 0h2v26H7z" fill="%23D8D8D8" fill-rule="evenodd"/>\u003c/svg>');
+ }
+ .lh-crc .lh-crc-tree {
+ font-size: 14px;
+ width: 100%;
+ overflow-x: auto;
+ }
+ .lh-crc .lh-crc-node {
+ height: 26px;
+ line-height: 26px;
+ white-space: nowrap;
+ }
+ .lh-crc .lh-crc-node__longest {
+ color: var(--color-average-secondary);
+ }
+ .lh-crc .lh-crc-node__tree-value {
+ margin-left: 10px;
+ }
+ .lh-crc .lh-crc-node__tree-value div {
+ display: inline;
+ }
+ .lh-crc .lh-crc-node__chain-duration {
+ font-weight: 700;
+ }
+ .lh-crc .lh-crc-initial-nav {
+ color: #595959;
+ font-style: italic;
+ }
+ .lh-crc__summary-value {
+ margin-bottom: 10px;
+ }
+ `);let r=o.createElement("div"),i=o.createElement("div","lh-crc__summary-value"),a=o.createElement("span","lh-crc__longest_duration_label"),l=o.createElement("b","lh-crc__longest_duration");i.append(" ",a," ",l," "),r.append(" ",i," ");let s=o.createElement("div","lh-crc"),c=o.createElement("div","lh-crc-initial-nav");return s.append(" ",c," "," "),t.append(" ",n," ",r," ",s," "),e.append(t),e}function Ze(o){let e=o.createFragment(),t=o.createElement("div","lh-crc-node"),n=o.createElement("span","lh-crc-node__tree-marker"),r=o.createElement("span","lh-crc-node__tree-value");return t.append(" ",n," ",r," "),e.append(t),e}function Je(o){let e=o.createFragment(),t=o.createElement("div","lh-element-screenshot"),n=o.createElement("div","lh-element-screenshot__content"),r=o.createElement("div","lh-element-screenshot__image"),i=o.createElement("div","lh-element-screenshot__mask"),a=o.createElementNS("http://www.w3.org/2000/svg","svg");a.setAttribute("height","0"),a.setAttribute("width","0");let l=o.createElementNS("http://www.w3.org/2000/svg","defs"),s=o.createElementNS("http://www.w3.org/2000/svg","clipPath");s.setAttribute("clipPathUnits","objectBoundingBox"),l.append(" ",s," "," "),a.append(" ",l," "),i.append(" ",a," ");let c=o.createElement("div","lh-element-screenshot__element-marker");return r.append(" ",i," ",c," "),n.append(" ",r," "),t.append(" ",n," "),e.append(t),e}function Qe(o){let e=o.createFragment(),t=o.createElement("div","lh-exp-gauge-component"),n=o.createElement("div","lh-exp-gauge__wrapper");n.setAttribute("target","_blank");let r=o.createElement("div","lh-exp-gauge__svg-wrapper"),i=o.createElementNS("http://www.w3.org/2000/svg","svg","lh-exp-gauge"),a=o.createElementNS("http://www.w3.org/2000/svg","g","lh-exp-gauge__inner"),l=o.createElementNS("http://www.w3.org/2000/svg","circle","lh-exp-gauge__bg"),s=o.createElementNS("http://www.w3.org/2000/svg","circle","lh-exp-gauge__base lh-exp-gauge--faded"),c=o.createElementNS("http://www.w3.org/2000/svg","circle","lh-exp-gauge__arc"),d=o.createElementNS("http://www.w3.org/2000/svg","text","lh-exp-gauge__percentage");a.append(" ",l," ",s," ",c," ",d," ");let h=o.createElementNS("http://www.w3.org/2000/svg","g","lh-exp-gauge__outer"),p=o.createElementNS("http://www.w3.org/2000/svg","circle","lh-cover");h.append(" ",p," ");let g=o.createElementNS("http://www.w3.org/2000/svg","text","lh-exp-gauge__label");return g.setAttribute("text-anchor","middle"),g.setAttribute("x","0"),g.setAttribute("y","60"),i.append(" ",a," ",h," ",g," "),r.append(" ",i," "),n.append(" ",r," "),t.append(" ",n," "),e.append(t),e}function Ye(o){let e=o.createFragment(),t=o.createElement("style");t.append(`
+ .lh-footer {
+ padding: var(--footer-padding-vertical) calc(var(--default-padding) * 2);
+ max-width: var(--report-content-max-width);
+ margin: 0 auto;
+ }
+ .lh-footer .lh-generated {
+ text-align: center;
+ }
+ `),e.append(t);let n=o.createElement("footer","lh-footer"),r=o.createElement("ul","lh-meta__items");r.append(" ");let i=o.createElement("div","lh-generated"),a=o.createElement("b");a.append("Lighthouse");let l=o.createElement("span","lh-footer__version"),s=o.createElement("a","lh-footer__version_issue");return s.setAttribute("href","https://github.com/GoogleChrome/Lighthouse/issues"),s.setAttribute("target","_blank"),s.setAttribute("rel","noopener"),s.append("File an issue"),i.append(" "," Generated by ",a," ",l," | ",s," "),n.append(" ",r," ",i," "),e.append(n),e}function Xe(o){let e=o.createFragment(),t=o.createElement("a","lh-fraction__wrapper"),n=o.createElement("div","lh-fraction__content-wrapper"),r=o.createElement("div","lh-fraction__content"),i=o.createElement("div","lh-fraction__background");r.append(" ",i," "),n.append(" ",r," ");let a=o.createElement("div","lh-fraction__label");return t.append(" ",n," ",a," "),e.append(t),e}function et(o){let e=o.createFragment(),t=o.createElement("a","lh-gauge__wrapper"),n=o.createElement("div","lh-gauge__svg-wrapper"),r=o.createElementNS("http://www.w3.org/2000/svg","svg","lh-gauge");r.setAttribute("viewBox","0 0 120 120");let i=o.createElementNS("http://www.w3.org/2000/svg","circle","lh-gauge-base");i.setAttribute("r","56"),i.setAttribute("cx","60"),i.setAttribute("cy","60"),i.setAttribute("stroke-width","8");let a=o.createElementNS("http://www.w3.org/2000/svg","circle","lh-gauge-arc");a.setAttribute("r","56"),a.setAttribute("cx","60"),a.setAttribute("cy","60"),a.setAttribute("stroke-width","8"),r.append(" ",i," ",a," "),n.append(" ",r," ");let l=o.createElement("div","lh-gauge__percentage"),s=o.createElement("div","lh-gauge__label");return t.append(" "," ",n," ",l," "," ",s," "),e.append(t),e}function tt(o){let e=o.createFragment(),t=o.createElement("style");t.append(`
+ /* CSS Fireworks. Originally by Eddie Lin
+ https://codepen.io/paulirish/pen/yEVMbP
+ */
+ .lh-pyro {
+ display: none;
+ z-index: 1;
+ pointer-events: none;
+ }
+ .lh-score100 .lh-pyro {
+ display: block;
+ }
+ .lh-score100 .lh-lighthouse stop:first-child {
+ stop-color: hsla(200, 12%, 95%, 0);
+ }
+ .lh-score100 .lh-lighthouse stop:last-child {
+ stop-color: hsla(65, 81%, 76%, 1);
+ }
+
+ .lh-pyro > .lh-pyro-before, .lh-pyro > .lh-pyro-after {
+ position: absolute;
+ width: 5px;
+ height: 5px;
+ border-radius: 2.5px;
+ box-shadow: 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff;
+ animation: 1s bang ease-out infinite backwards, 1s gravity ease-in infinite backwards, 5s position linear infinite backwards;
+ animation-delay: 1s, 1s, 1s;
+ }
+
+ .lh-pyro > .lh-pyro-after {
+ animation-delay: 2.25s, 2.25s, 2.25s;
+ animation-duration: 1.25s, 1.25s, 6.25s;
+ }
+
+ @keyframes bang {
+ to {
+ opacity: 1;
+ box-shadow: -70px -115.67px #47ebbc, -28px -99.67px #eb47a4, 58px -31.67px #7eeb47, 13px -141.67px #eb47c5, -19px 6.33px #7347eb, -2px -74.67px #ebd247, 24px -151.67px #eb47e0, 57px -138.67px #b4eb47, -51px -104.67px #479eeb, 62px 8.33px #ebcf47, -93px 0.33px #d547eb, -16px -118.67px #47bfeb, 53px -84.67px #47eb83, 66px -57.67px #eb47bf, -93px -65.67px #91eb47, 30px -13.67px #86eb47, -2px -59.67px #83eb47, -44px 1.33px #eb47eb, 61px -58.67px #47eb73, 5px -22.67px #47e8eb, -66px -28.67px #ebe247, 42px -123.67px #eb5547, -75px 26.33px #7beb47, 15px -52.67px #a147eb, 36px -51.67px #eb8347, -38px -12.67px #eb5547, -46px -59.67px #47eb81, 78px -114.67px #eb47ba, 15px -156.67px #eb47bf, -36px 1.33px #eb4783, -72px -86.67px #eba147, 31px -46.67px #ebe247, -68px 29.33px #47e2eb, -55px 19.33px #ebe047, -56px 27.33px #4776eb, -13px -91.67px #eb5547, -47px -138.67px #47ebc7, -18px -96.67px #eb47ac, 11px -88.67px #4783eb, -67px -28.67px #47baeb, 53px 10.33px #ba47eb, 11px 19.33px #5247eb, -5px -11.67px #eb4791, -68px -4.67px #47eba7, 95px -37.67px #eb478b, -67px -162.67px #eb5d47, -54px -120.67px #eb6847, 49px -12.67px #ebe047, 88px 8.33px #47ebda, 97px 33.33px #eb8147, 6px -71.67px #ebbc47;
+ }
+ }
+ @keyframes gravity {
+ from {
+ opacity: 1;
+ }
+ to {
+ transform: translateY(80px);
+ opacity: 0;
+ }
+ }
+ @keyframes position {
+ 0%, 19.9% {
+ margin-top: 4%;
+ margin-left: 47%;
+ }
+ 20%, 39.9% {
+ margin-top: 7%;
+ margin-left: 30%;
+ }
+ 40%, 59.9% {
+ margin-top: 6%;
+ margin-left: 70%;
+ }
+ 60%, 79.9% {
+ margin-top: 3%;
+ margin-left: 20%;
+ }
+ 80%, 99.9% {
+ margin-top: 3%;
+ margin-left: 80%;
+ }
+ }
+ `),e.append(t);let n=o.createElement("div","lh-header-container"),r=o.createElement("div","lh-scores-wrapper-placeholder");return n.append(" ",r," "),e.append(n),e}function nt(o){let e=o.createFragment(),t=o.createElement("div","lh-metric"),n=o.createElement("div","lh-metric__innerwrap"),r=o.createElement("div","lh-metric__icon"),i=o.createElement("span","lh-metric__title"),a=o.createElement("div","lh-metric__value"),l=o.createElement("div","lh-metric__description");return n.append(" ",r," ",i," ",a," ",l," "),t.append(" ",n," "),e.append(t),e}function rt(o){let e=o.createFragment(),t=o.createElement("div","lh-scorescale"),n=o.createElement("span","lh-scorescale-range lh-scorescale-range--fail");n.append("0\u201349");let r=o.createElement("span","lh-scorescale-range lh-scorescale-range--average");r.append("50\u201389");let i=o.createElement("span","lh-scorescale-range lh-scorescale-range--pass");return i.append("90\u2013100"),t.append(" ",n," ",r," ",i," "),e.append(t),e}function ot(o){let e=o.createFragment(),t=o.createElement("style");t.append(`
+ .lh-scores-container {
+ display: flex;
+ flex-direction: column;
+ padding: var(--default-padding) 0;
+ position: relative;
+ width: 100%;
+ }
+
+ .lh-sticky-header {
+ --gauge-circle-size: var(--gauge-circle-size-sm);
+ --plugin-badge-size: 16px;
+ --plugin-icon-size: 75%;
+ --gauge-wrapper-width: 60px;
+ --gauge-percentage-font-size: 13px;
+ position: fixed;
+ left: 0;
+ right: 0;
+ top: var(--topbar-height);
+ font-weight: 500;
+ display: none;
+ justify-content: center;
+ background-color: var(--sticky-header-background-color);
+ border-bottom: 1px solid var(--color-gray-200);
+ padding-top: var(--score-container-padding);
+ padding-bottom: 4px;
+ z-index: 2;
+ pointer-events: none;
+ }
+
+ .lh-devtools .lh-sticky-header {
+ /* The report within DevTools is placed in a container with overflow, which changes the placement of this header unless we change \`position\` to \`sticky.\` */
+ position: sticky;
+ }
+
+ .lh-sticky-header--visible {
+ display: grid;
+ grid-auto-flow: column;
+ pointer-events: auto;
+ }
+
+ /* Disable the gauge arc animation for the sticky header, so toggling display: none
+ does not play the animation. */
+ .lh-sticky-header .lh-gauge-arc {
+ animation: none;
+ }
+
+ .lh-sticky-header .lh-gauge__label,
+ .lh-sticky-header .lh-fraction__label {
+ display: none;
+ }
+
+ .lh-highlighter {
+ width: var(--gauge-wrapper-width);
+ height: 1px;
+ background-color: var(--highlighter-background-color);
+ /* Position at bottom of first gauge in sticky header. */
+ position: absolute;
+ grid-column: 1;
+ bottom: -1px;
+ left: 0px;
+ right: 0px;
+ }
+ `),e.append(t);let n=o.createElement("div","lh-scores-wrapper"),r=o.createElement("div","lh-scores-container"),i=o.createElement("div","lh-pyro"),a=o.createElement("div","lh-pyro-before"),l=o.createElement("div","lh-pyro-after");return i.append(" ",a," ",l," "),r.append(" ",i," "),n.append(" ",r," "),e.append(n),e}function it(o){let e=o.createFragment(),t=o.createElement("div","lh-snippet"),n=o.createElement("style");return n.append(`
+ :root {
+ --snippet-highlight-light: #fbf1f2;
+ --snippet-highlight-dark: #ffd6d8;
+ }
+
+ .lh-snippet__header {
+ position: relative;
+ overflow: hidden;
+ padding: 10px;
+ border-bottom: none;
+ color: var(--snippet-color);
+ background-color: var(--snippet-background-color);
+ border: 1px solid var(--report-border-color-secondary);
+ }
+ .lh-snippet__title {
+ font-weight: bold;
+ float: left;
+ }
+ .lh-snippet__node {
+ float: left;
+ margin-left: 4px;
+ }
+ .lh-snippet__toggle-expand {
+ padding: 1px 7px;
+ margin-top: -1px;
+ margin-right: -7px;
+ float: right;
+ background: transparent;
+ border: none;
+ cursor: pointer;
+ font-size: 14px;
+ color: #0c50c7;
+ }
+
+ .lh-snippet__snippet {
+ overflow: auto;
+ border: 1px solid var(--report-border-color-secondary);
+ }
+ /* Container needed so that all children grow to the width of the scroll container */
+ .lh-snippet__snippet-inner {
+ display: inline-block;
+ min-width: 100%;
+ }
+
+ .lh-snippet:not(.lh-snippet--expanded) .lh-snippet__show-if-expanded {
+ display: none;
+ }
+ .lh-snippet.lh-snippet--expanded .lh-snippet__show-if-collapsed {
+ display: none;
+ }
+
+ .lh-snippet__line {
+ background: white;
+ white-space: pre;
+ display: flex;
+ }
+ .lh-snippet__line:not(.lh-snippet__line--message):first-child {
+ padding-top: 4px;
+ }
+ .lh-snippet__line:not(.lh-snippet__line--message):last-child {
+ padding-bottom: 4px;
+ }
+ .lh-snippet__line--content-highlighted {
+ background: var(--snippet-highlight-dark);
+ }
+ .lh-snippet__line--message {
+ background: var(--snippet-highlight-light);
+ }
+ .lh-snippet__line--message .lh-snippet__line-number {
+ padding-top: 10px;
+ padding-bottom: 10px;
+ }
+ .lh-snippet__line--message code {
+ padding: 10px;
+ padding-left: 5px;
+ color: var(--color-fail);
+ font-family: var(--report-font-family);
+ }
+ .lh-snippet__line--message code {
+ white-space: normal;
+ }
+ .lh-snippet__line-icon {
+ padding-top: 10px;
+ display: none;
+ }
+ .lh-snippet__line--message .lh-snippet__line-icon {
+ display: block;
+ }
+ .lh-snippet__line-icon:before {
+ content: "";
+ display: inline-block;
+ vertical-align: middle;
+ margin-right: 4px;
+ width: var(--score-icon-size);
+ height: var(--score-icon-size);
+ background-image: var(--fail-icon-url);
+ }
+ .lh-snippet__line-number {
+ flex-shrink: 0;
+ width: 40px;
+ text-align: right;
+ font-family: monospace;
+ padding-right: 5px;
+ margin-right: 5px;
+ color: var(--color-gray-600);
+ user-select: none;
+ }
+ `),t.append(" ",n," "),e.append(t),e}function at(o){let e=o.createFragment(),t=o.createElement("div","lh-snippet__snippet"),n=o.createElement("div","lh-snippet__snippet-inner");return t.append(" ",n," "),e.append(t),e}function lt(o){let e=o.createFragment(),t=o.createElement("div","lh-snippet__header"),n=o.createElement("div","lh-snippet__title"),r=o.createElement("div","lh-snippet__node"),i=o.createElement("button","lh-snippet__toggle-expand"),a=o.createElement("span","lh-snippet__btn-label-collapse lh-snippet__show-if-expanded"),l=o.createElement("span","lh-snippet__btn-label-expand lh-snippet__show-if-collapsed");return i.append(" ",a," ",l," "),t.append(" ",n," ",r," ",i," "),e.append(t),e}function st(o){let e=o.createFragment(),t=o.createElement("div","lh-snippet__line"),n=o.createElement("div","lh-snippet__line-number"),r=o.createElement("div","lh-snippet__line-icon"),i=o.createElement("code");return t.append(" ",n," ",r," ",i," "),e.append(t),e}function ct(o){let e=o.createFragment(),t=o.createElement("style");return t.append(`/**
+ * @license
+ * Copyright 2017 Google LLC
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+/*
+ Naming convention:
+
+ If a variable is used for a specific component: --{component}-{property name}-{modifier}
+
+ Both {component} and {property name} should be kebab-case. If the target is the entire page,
+ use 'report' for the component. The property name should not be abbreviated. Use the
+ property name the variable is intended for - if it's used for multiple, a common descriptor
+ is fine (ex: 'size' for a variable applied to 'width' and 'height'). If a variable is shared
+ across multiple components, either create more variables or just drop the "{component}-"
+ part of the name. Append any modifiers at the end (ex: 'big', 'dark').
+
+ For colors: --color-{hue}-{intensity}
+
+ {intensity} is the Material Design tag - 700, A700, etc.
+*/
+.lh-vars {
+ /* Palette using Material Design Colors
+ * https://www.materialui.co/colors */
+ --color-amber-50: #FFF8E1;
+ --color-blue-200: #90CAF9;
+ --color-blue-900: #0D47A1;
+ --color-blue-A700: #2962FF;
+ --color-blue-primary: #06f;
+ --color-cyan-500: #00BCD4;
+ --color-gray-100: #F5F5F5;
+ --color-gray-300: #CFCFCF;
+ --color-gray-200: #E0E0E0;
+ --color-gray-400: #BDBDBD;
+ --color-gray-50: #FAFAFA;
+ --color-gray-500: #9E9E9E;
+ --color-gray-600: #757575;
+ --color-gray-700: #616161;
+ --color-gray-800: #424242;
+ --color-gray-900: #212121;
+ --color-gray: #000000;
+ --color-green-700: #080;
+ --color-green: #0c6;
+ --color-lime-400: #D3E156;
+ --color-orange-50: #FFF3E0;
+ --color-orange-700: #C33300;
+ --color-orange: #fa3;
+ --color-red-700: #c00;
+ --color-red: #f33;
+ --color-teal-600: #00897B;
+ --color-white: #FFFFFF;
+
+ /* Context-specific colors */
+ --color-average-secondary: var(--color-orange-700);
+ --color-average: var(--color-orange);
+ --color-fail-secondary: var(--color-red-700);
+ --color-fail: var(--color-red);
+ --color-hover: var(--color-gray-50);
+ --color-informative: var(--color-blue-900);
+ --color-pass-secondary: var(--color-green-700);
+ --color-pass: var(--color-green);
+ --color-not-applicable: var(--color-gray-600);
+
+ /* Component variables */
+ --audit-description-padding-left: calc(var(--score-icon-size) + var(--score-icon-margin-left) + var(--score-icon-margin-right));
+ --audit-explanation-line-height: 16px;
+ --audit-group-margin-bottom: calc(var(--default-padding) * 6);
+ --audit-group-padding-vertical: 8px;
+ --audit-margin-horizontal: 5px;
+ --audit-padding-vertical: 8px;
+ --category-padding: calc(var(--default-padding) * 6) var(--edge-gap-padding) calc(var(--default-padding) * 4);
+ --chevron-line-stroke: var(--color-gray-600);
+ --chevron-size: 12px;
+ --default-padding: 8px;
+ --edge-gap-padding: calc(var(--default-padding) * 4);
+ --env-item-background-color: var(--color-gray-100);
+ --env-item-font-size: 28px;
+ --env-item-line-height: 36px;
+ --env-item-padding: 10px 0px;
+ --env-name-min-width: 220px;
+ --footer-padding-vertical: 16px;
+ --gauge-circle-size-big: 96px;
+ --gauge-circle-size: 48px;
+ --gauge-circle-size-sm: 32px;
+ --gauge-label-font-size-big: 18px;
+ --gauge-label-font-size: var(--report-font-size-secondary);
+ --gauge-label-line-height-big: 24px;
+ --gauge-label-line-height: var(--report-line-height-secondary);
+ --gauge-percentage-font-size-big: 38px;
+ --gauge-percentage-font-size: var(--report-font-size-secondary);
+ --gauge-wrapper-width: 120px;
+ --header-line-height: 24px;
+ --highlighter-background-color: var(--report-text-color);
+ --icon-square-size: calc(var(--score-icon-size) * 0.88);
+ --image-preview-size: 48px;
+ --link-color: var(--color-blue-primary);
+ --locale-selector-background-color: var(--color-white);
+ --metric-toggle-lines-fill: #7F7F7F;
+ --metric-value-font-size: calc(var(--report-font-size) * 1.8);
+ --metrics-toggle-background-color: var(--color-gray-200);
+ --plugin-badge-background-color: var(--color-white);
+ --plugin-badge-size-big: calc(var(--gauge-circle-size-big) / 2.7);
+ --plugin-badge-size: calc(var(--gauge-circle-size) / 2.7);
+ --plugin-icon-size: 65%;
+ --report-background-color: #fff;
+ --report-border-color-secondary: #ebebeb;
+ --report-font-family-monospace: monospace, 'Roboto Mono', 'Menlo', 'dejavu sans mono', 'Consolas', 'Lucida Console';
+ --report-font-family: system-ui, Roboto, Helvetica, Arial, sans-serif;
+ --report-font-size: 14px;
+ --report-font-size-secondary: 12px;
+ --report-icon-size: var(--score-icon-background-size);
+ --report-line-height: 24px;
+ --report-line-height-secondary: 20px;
+ --report-monospace-font-size: calc(var(--report-font-size) * 0.85);
+ --report-text-color-secondary: var(--color-gray-800);
+ --report-text-color: var(--color-gray-900);
+ --report-content-max-width: calc(60 * var(--report-font-size)); /* defaults to 840px */
+ --report-content-min-width: 360px;
+ --report-content-max-width-minus-edge-gap: calc(var(--report-content-max-width) - var(--edge-gap-padding) * 2);
+ --score-container-padding: 8px;
+ --score-icon-background-size: 24px;
+ --score-icon-margin-left: 6px;
+ --score-icon-margin-right: 14px;
+ --score-icon-margin: 0 var(--score-icon-margin-right) 0 var(--score-icon-margin-left);
+ --score-icon-size: 12px;
+ --score-icon-size-big: 16px;
+ --screenshot-overlay-background: rgba(0, 0, 0, 0.3);
+ --section-padding-vertical: calc(var(--default-padding) * 6);
+ --snippet-background-color: var(--color-gray-50);
+ --snippet-color: #0938C2;
+ --stackpack-padding-horizontal: 10px;
+ --sticky-header-background-color: var(--report-background-color);
+ --sticky-header-buffer: var(--topbar-height);
+ --sticky-header-height: calc(var(--gauge-circle-size-sm) + var(--score-container-padding) * 2 + 1em);
+ --table-group-header-background-color: #EEF1F4;
+ --table-group-header-text-color: var(--color-gray-700);
+ --table-higlight-background-color: #F5F7FA;
+ --tools-icon-color: var(--color-gray-600);
+ --topbar-background-color: var(--color-white);
+ --topbar-height: 32px;
+ --topbar-logo-size: 24px;
+ --topbar-padding: 0 8px;
+ --toplevel-warning-background-color: hsla(30, 100%, 75%, 10%);
+ --toplevel-warning-message-text-color: var(--color-average-secondary);
+ --toplevel-warning-padding: 18px;
+ --toplevel-warning-text-color: var(--report-text-color);
+
+ /* SVGs */
+ --plugin-icon-url-dark: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="%23FFFFFF"><path d="M0 0h24v24H0z" fill="none"/><path d="M20.5 11H19V7c0-1.1-.9-2-2-2h-4V3.5C13 2.12 11.88 1 10.5 1S8 2.12 8 3.5V5H4c-1.1 0-1.99.9-1.99 2v3.8H3.5c1.49 0 2.7 1.21 2.7 2.7s-1.21 2.7-2.7 2.7H2V20c0 1.1.9 2 2 2h3.8v-1.5c0-1.49 1.21-2.7 2.7-2.7 1.49 0 2.7 1.21 2.7 2.7V22H17c1.1 0 2-.9 2-2v-4h1.5c1.38 0 2.5-1.12 2.5-2.5S21.88 11 20.5 11z"/>\u003c/svg>');
+ --plugin-icon-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="%23757575"><path d="M0 0h24v24H0z" fill="none"/><path d="M20.5 11H19V7c0-1.1-.9-2-2-2h-4V3.5C13 2.12 11.88 1 10.5 1S8 2.12 8 3.5V5H4c-1.1 0-1.99.9-1.99 2v3.8H3.5c1.49 0 2.7 1.21 2.7 2.7s-1.21 2.7-2.7 2.7H2V20c0 1.1.9 2 2 2h3.8v-1.5c0-1.49 1.21-2.7 2.7-2.7 1.49 0 2.7 1.21 2.7 2.7V22H17c1.1 0 2-.9 2-2v-4h1.5c1.38 0 2.5-1.12 2.5-2.5S21.88 11 20.5 11z"/>\u003c/svg>');
+
+ --pass-icon-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48"><title>check\u003c/title><path fill="%23178239" d="M24 4C12.95 4 4 12.95 4 24c0 11.04 8.95 20 20 20 11.04 0 20-8.96 20-20 0-11.05-8.96-20-20-20zm-4 30L10 24l2.83-2.83L20 28.34l15.17-15.17L38 16 20 34z"/>\u003c/svg>');
+ --average-icon-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48"><title>info\u003c/title><path fill="%23E67700" d="M24 4C12.95 4 4 12.95 4 24s8.95 20 20 20 20-8.95 20-20S35.05 4 24 4zm2 30h-4V22h4v12zm0-16h-4v-4h4v4z"/>\u003c/svg>');
+ --fail-icon-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48"><title>warn\u003c/title><path fill="%23C7221F" d="M2 42h44L24 4 2 42zm24-6h-4v-4h4v4zm0-8h-4v-8h4v8z"/>\u003c/svg>');
+ --error-icon-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 3 15"><title>error\u003c/title><path d="M0 15H 3V 12H 0V" fill="%23FF4E42"/><path d="M0 9H 3V 0H 0V" fill="%23FF4E42"/>\u003c/svg>');
+
+ --swap-locale-icon-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="%23000000"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"/>\u003c/svg>');
+
+ --baseline-high-icon-url: url("data:image/svg+xml;utf8,<svg width='18' height='10' viewBox='0 0 540 300' fill='none' xmlns='http://www.w3.org/2000/svg'> <path d='M420 30L390 60L480 150L390 240L330 180L300 210L390 300L540 150L420 30Z' fill='%23C4EED0'/> <path d='M150 0L30 120L60 150L150 60L210 120L240 90L150 0Z' fill='%23C4EED0'/> <path d='M390 0L420 30L150 300L0 150L30 120L150 240L390 0Z' fill='%231EA446'/> \u003c/svg>");
+ --baseline-low-icon-url: url("data:image/svg+xml;utf8,<svg width='18' height='10' viewBox='0 0 540 300' fill='none' xmlns='http://www.w3.org/2000/svg'> <path d='M150 0L180 30L150 60L120 30L150 0Z' fill='%23A8C7FA'/> <path d='M210 60L240 90L210 120L180 90L210 60Z' fill='%23A8C7FA'/> <path d='M450 60L480 90L450 120L420 90L450 60Z' fill='%23A8C7FA'/> <path d='M510 120L540 150L510 180L480 150L510 120Z' fill='%23A8C7FA'/> <path d='M450 180L480 210L450 240L420 210L450 180Z' fill='%23A8C7FA'/> <path d='M390 240L420 270L390 300L360 270L390 240Z' fill='%23A8C7FA'/> <path d='M330 180L360 210L330 240L300 210L330 180Z' fill='%23A8C7FA'/> <path d='M90 60L120 90L90 120L60 90L90 60Z' fill='%23A8C7FA'/> <path d='M390 0L420 30L150 300L0 150L30 120L150 240L390 0Z' fill='%231B6EF3'/> \u003c/svg>");
+ --baseline-limited-icon-url: url("data:image/svg+xml;utf8,<svg width='18' height='10' viewBox='0 0 540 300' fill='none' xmlns='http://www.w3.org/2000/svg'> <path d='M150 0L240 90L210 120L120 30L150 0Z' fill='%23F09409'/> <path d='M420 30L540 150L420 270L390 240L480 150L390 60L420 30Z' fill='%23C6C6C6'/> <path d='M330 180L300 210L390 300L420 270L330 180Z' fill='%23F09409'/> <path d='M120 30L150 60L60 150L150 240L120 270L0 150L120 30Z' fill='%23C6C6C6'/> <path d='M390 0L420 30L150 300L120 270L390 0Z' fill='%23F09409'/> \u003c/svg>");
+}
+
+@media not print {
+ .lh-dark {
+ /* Pallete */
+ --color-gray-200: var(--color-gray-800);
+ --color-gray-300: #616161;
+ --color-gray-400: var(--color-gray-600);
+ --color-gray-700: var(--color-gray-400);
+ --color-gray-50: #757575;
+ --color-gray-600: var(--color-gray-500);
+ --color-green-700: var(--color-green);
+ --color-orange-700: var(--color-orange);
+ --color-red-700: var(--color-red);
+ --color-teal-600: var(--color-cyan-500);
+
+ /* Context-specific colors */
+ --color-hover: rgba(0, 0, 0, 0.2);
+ --color-informative: var(--color-blue-200);
+
+ /* Component variables */
+ --env-item-background-color: #393535;
+ --link-color: var(--color-blue-200);
+ --locale-selector-background-color: var(--color-gray-200);
+ --plugin-badge-background-color: var(--color-gray-800);
+ --report-background-color: var(--color-gray-900);
+ --report-border-color-secondary: var(--color-gray-200);
+ --report-text-color-secondary: var(--color-gray-400);
+ --report-text-color: var(--color-gray-100);
+ --snippet-color: var(--color-cyan-500);
+ --topbar-background-color: var(--color-gray);
+ --toplevel-warning-background-color: hsl(33deg 14% 18%);
+ --toplevel-warning-message-text-color: var(--color-orange-700);
+ --toplevel-warning-text-color: var(--color-gray-100);
+ --table-group-header-background-color: rgba(186, 196, 206, 0.15);
+ --table-group-header-text-color: var(--color-gray-100);
+ --table-higlight-background-color: rgba(186, 196, 206, 0.09);
+
+ /* SVGs */
+ --plugin-icon-url: var(--plugin-icon-url-dark);
+ }
+}
+
+/**
+* This media query is a temporary fallback for browsers that do not support \`@container query\`.
+* TODO: remove this media query when \`@container query\` is fully supported by browsers
+* See https://github.com/GoogleChrome/lighthouse/pull/16332
+*/
+@media only screen and (max-width: 480px) {
+ .lh-vars {
+ --audit-group-margin-bottom: 20px;
+ --edge-gap-padding: var(--default-padding);
+ --env-name-min-width: 120px;
+ --gauge-circle-size-big: 96px;
+ --gauge-circle-size: 72px;
+ --gauge-label-font-size-big: 22px;
+ --gauge-label-font-size: 14px;
+ --gauge-label-line-height-big: 26px;
+ --gauge-label-line-height: 20px;
+ --gauge-percentage-font-size-big: 34px;
+ --gauge-percentage-font-size: 26px;
+ --gauge-wrapper-width: 112px;
+ --header-padding: 16px 0 16px 0;
+ --image-preview-size: 24px;
+ --plugin-icon-size: 75%;
+ --report-font-size: 14px;
+ --report-line-height: 20px;
+ --score-icon-margin-left: 2px;
+ --score-icon-size: 10px;
+ --topbar-height: 28px;
+ --topbar-logo-size: 20px;
+ }
+}
+
+@container lh-container (max-width: 480px) {
+ .lh-vars {
+ --audit-group-margin-bottom: 20px;
+ --edge-gap-padding: var(--default-padding);
+ --env-name-min-width: 120px;
+ --gauge-circle-size-big: 96px;
+ --gauge-circle-size: 72px;
+ --gauge-label-font-size-big: 22px;
+ --gauge-label-font-size: 14px;
+ --gauge-label-line-height-big: 26px;
+ --gauge-label-line-height: 20px;
+ --gauge-percentage-font-size-big: 34px;
+ --gauge-percentage-font-size: 26px;
+ --gauge-wrapper-width: 112px;
+ --header-padding: 16px 0 16px 0;
+ --image-preview-size: 24px;
+ --plugin-icon-size: 75%;
+ --report-font-size: 14px;
+ --report-line-height: 20px;
+ --score-icon-margin-left: 2px;
+ --score-icon-size: 10px;
+ --topbar-height: 28px;
+ --topbar-logo-size: 20px;
+ }
+}
+
+.lh-vars.lh-devtools {
+ --audit-explanation-line-height: 14px;
+ --audit-group-margin-bottom: 20px;
+ --audit-group-padding-vertical: 12px;
+ --audit-padding-vertical: 4px;
+ --category-padding: 12px;
+ --default-padding: 12px;
+ --env-name-min-width: 120px;
+ --footer-padding-vertical: 8px;
+ --gauge-circle-size-big: 72px;
+ --gauge-circle-size: 64px;
+ --gauge-label-font-size-big: 22px;
+ --gauge-label-font-size: 14px;
+ --gauge-label-line-height-big: 26px;
+ --gauge-label-line-height: 20px;
+ --gauge-percentage-font-size-big: 34px;
+ --gauge-percentage-font-size: 26px;
+ --gauge-wrapper-width: 97px;
+ --header-line-height: 20px;
+ --header-padding: 16px 0 16px 0;
+ --screenshot-overlay-background: transparent;
+ --plugin-icon-size: 75%;
+ --report-font-size: 12px;
+ --report-line-height: 20px;
+ --score-icon-margin-left: 2px;
+ --score-icon-size: 10px;
+ --section-padding-vertical: 8px;
+}
+
+.lh-devtools :focus-visible {
+ outline: -webkit-focus-ring-color auto 1px;
+}
+
+.lh-container:has(.lh-sticky-header) {
+ --sticky-header-buffer: calc(var(--topbar-height) + var(--sticky-header-height));
+}
+
+.lh-container:not(.lh-topbar + .lh-container) {
+ --topbar-height: 0;
+ --sticky-header-height: 0;
+ --sticky-header-buffer: 0;
+}
+
+.lh-max-viewport {
+ display: flex;
+ flex-direction: column;
+ min-height: 100vh;
+ width: 100%;
+}
+
+.lh-devtools.lh-root {
+ height: 100%;
+}
+.lh-devtools.lh-root img {
+ /* Override devtools default 'min-width: 0' so svg without size in a flexbox isn't collapsed. */
+ min-width: auto;
+}
+.lh-devtools .lh-container {
+ overflow-y: scroll;
+ height: calc(100% - var(--topbar-height));
+ /** The .lh-container is the scroll parent in DevTools so we exclude the topbar from the sticky header buffer. */
+ --sticky-header-buffer: 0;
+}
+.lh-devtools .lh-container:has(.lh-sticky-header) {
+ /** The .lh-container is the scroll parent in DevTools so we exclude the topbar from the sticky header buffer. */
+ --sticky-header-buffer: var(--sticky-header-height);
+}
+@media print {
+ .lh-devtools .lh-container {
+ overflow: unset;
+ }
+}
+.lh-devtools .lh-sticky-header {
+ /* This is normally the height of the topbar, but we want it to stick to the top of our scroll container .lh-container\` */
+ top: 0;
+}
+.lh-devtools .lh-element-screenshot__overlay {
+ position: absolute;
+}
+
+@keyframes fadeIn {
+ 0% { opacity: 0;}
+ 100% { opacity: 0.6;}
+}
+
+.lh-root *, .lh-root *::before, .lh-root *::after {
+ box-sizing: border-box;
+}
+
+.lh-root {
+ font-family: var(--report-font-family);
+ font-size: var(--report-font-size);
+ margin: 0;
+ line-height: var(--report-line-height);
+ background: var(--report-background-color);
+ color: var(--report-text-color);
+}
+
+.lh-root [hidden] {
+ display: none !important;
+}
+
+.lh-root pre {
+ margin: 0;
+}
+
+.lh-root pre,
+.lh-root code {
+ font-family: var(--report-font-family-monospace);
+}
+
+.lh-root details > summary {
+ cursor: pointer;
+}
+
+.lh-hidden {
+ display: none !important;
+}
+
+.lh-container {
+ /*
+ Text wrapping in the report is so much FUN!
+ We have a \`word-break: break-word;\` globally here to prevent a few common scenarios, namely
+ long non-breakable text (usually URLs) found in:
+ 1. The footer
+ 2. .lh-node (outerHTML)
+ 3. .lh-code
+
+ With that sorted, the next challenge is appropriate column sizing and text wrapping inside our
+ .lh-details tables. Even more fun.
+ * We don't want table headers ("Est Savings (ms)") to wrap or their column values, but
+ we'd be happy for the URL column to wrap if the URLs are particularly long.
+ * We want the narrow columns to remain narrow, providing the most column width for URL
+ * We don't want the table to extend past 100% width.
+ * Long URLs in the URL column can wrap. Util.getURLDisplayName maxes them out at 64 characters,
+ but they do not get any overflow:ellipsis treatment.
+ */
+ word-break: break-word;
+
+ container-name: lh-container;
+ container-type: inline-size;
+}
+
+.lh-audit-group a,
+.lh-category-header__description a,
+.lh-audit__description a,
+.lh-warnings a,
+.lh-footer a,
+.lh-table-column--link a {
+ color: var(--link-color);
+}
+
+.lh-audit__description, .lh-audit__stackpack, .lh-list-section__description {
+ --inner-audit-padding-right: var(--stackpack-padding-horizontal);
+ padding-left: var(--audit-description-padding-left);
+ padding-right: var(--inner-audit-padding-right);
+ padding-top: 8px;
+ padding-bottom: 8px;
+}
+
+.lh-details {
+ margin-top: var(--default-padding);
+ margin-bottom: var(--default-padding);
+ margin-left: var(--audit-description-padding-left);
+}
+
+.lh-audit__stackpack {
+ display: flex;
+ align-items: center;
+}
+
+.lh-audit__stackpack__img {
+ max-width: 30px;
+ margin-right: var(--default-padding)
+}
+
+/* Report header */
+
+.lh-report-icon {
+ display: flex;
+ align-items: center;
+ padding: 10px 12px;
+ cursor: pointer;
+}
+.lh-report-icon[disabled] {
+ opacity: 0.3;
+ pointer-events: none;
+}
+
+.lh-report-icon::before {
+ content: "";
+ margin: 4px;
+ background-repeat: no-repeat;
+ width: var(--report-icon-size);
+ height: var(--report-icon-size);
+ opacity: 0.7;
+ display: inline-block;
+ vertical-align: middle;
+}
+.lh-report-icon:hover::before {
+ opacity: 1;
+}
+.lh-dark .lh-report-icon::before {
+ filter: invert(1);
+}
+.lh-report-icon--print::before {
+ background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M19 8H5c-1.66 0-3 1.34-3 3v6h4v4h12v-4h4v-6c0-1.66-1.34-3-3-3zm-3 11H8v-5h8v5zm3-7c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm-1-9H6v4h12V3z"/><path fill="none" d="M0 0h24v24H0z"/>\u003c/svg>');
+}
+.lh-report-icon--copy::before {
+ background-image: url('data:image/svg+xml;utf8,<svg height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M0 0h24v24H0z" fill="none"/><path d="M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z"/>\u003c/svg>');
+}
+.lh-report-icon--open::before {
+ background-image: url('data:image/svg+xml;utf8,<svg height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M0 0h24v24H0z" fill="none"/><path d="M19 4H5c-1.11 0-2 .9-2 2v12c0 1.1.89 2 2 2h4v-2H5V8h14v10h-4v2h4c1.1 0 2-.9 2-2V6c0-1.1-.89-2-2-2zm-7 6l-4 4h3v6h2v-6h3l-4-4z"/>\u003c/svg>');
+}
+.lh-report-icon--download::before {
+ background-image: url('data:image/svg+xml;utf8,<svg height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"/><path d="M0 0h24v24H0z" fill="none"/>\u003c/svg>');
+}
+.lh-report-icon--dark::before {
+ background-image:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 100 125"><path d="M50 23.587c-16.27 0-22.799 12.574-22.799 21.417 0 12.917 10.117 22.451 12.436 32.471h20.726c2.32-10.02 12.436-19.554 12.436-32.471 0-8.843-6.528-21.417-22.799-21.417zM39.637 87.161c0 3.001 1.18 4.181 4.181 4.181h.426l.41 1.231C45.278 94.449 46.042 95 48.019 95h3.963c1.978 0 2.74-.551 3.365-2.427l.409-1.231h.427c3.002 0 4.18-1.18 4.18-4.181V80.91H39.637v6.251zM50 18.265c1.26 0 2.072-.814 2.072-2.073v-9.12C52.072 5.813 51.26 5 50 5c-1.259 0-2.072.813-2.072 2.073v9.12c0 1.259.813 2.072 2.072 2.072zM68.313 23.727c.994.774 2.135.634 2.91-.357l5.614-7.187c.776-.992.636-2.135-.356-2.909-.992-.776-2.135-.636-2.91.357l-5.613 7.186c-.778.993-.636 2.135.355 2.91zM91.157 36.373c-.306-1.222-1.291-1.815-2.513-1.51l-8.85 2.207c-1.222.305-1.814 1.29-1.51 2.512.305 1.223 1.291 1.814 2.513 1.51l8.849-2.206c1.223-.305 1.816-1.291 1.511-2.513zM86.757 60.48l-8.331-3.709c-1.15-.512-2.225-.099-2.736 1.052-.512 1.151-.1 2.224 1.051 2.737l8.33 3.707c1.15.514 2.225.101 2.736-1.05.513-1.149.1-2.223-1.05-2.737zM28.779 23.37c.775.992 1.917 1.131 2.909.357.992-.776 1.132-1.917.357-2.91l-5.615-7.186c-.775-.992-1.917-1.132-2.909-.357s-1.131 1.917-.356 2.909l5.614 7.187zM21.715 39.583c.305-1.223-.288-2.208-1.51-2.513l-8.849-2.207c-1.222-.303-2.208.289-2.513 1.511-.303 1.222.288 2.207 1.511 2.512l8.848 2.206c1.222.304 2.208-.287 2.513-1.509zM21.575 56.771l-8.331 3.711c-1.151.511-1.563 1.586-1.05 2.735.511 1.151 1.586 1.563 2.736 1.052l8.331-3.711c1.151-.511 1.563-1.586 1.05-2.735-.512-1.15-1.585-1.562-2.736-1.052z"/>\u003c/svg>');
+}
+.lh-report-icon--treemap::before {
+ background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="black"><path d="M3 5v14h19V5H3zm2 2h15v4H5V7zm0 10v-4h4v4H5zm6 0v-4h9v4h-9z"/>\u003c/svg>');
+}
+
+.lh-report-icon--date::before {
+ background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M7 11h2v2H7v-2zm14-5v14a2 2 0 01-2 2H5a2 2 0 01-2-2V6c0-1.1.9-2 2-2h1V2h2v2h8V2h2v2h1a2 2 0 012 2zM5 8h14V6H5v2zm14 12V10H5v10h14zm-4-7h2v-2h-2v2zm-4 0h2v-2h-2v2z"/>\u003c/svg>');
+}
+.lh-report-icon--devices::before {
+ background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 6h18V4H4a2 2 0 00-2 2v11H0v3h14v-3H4V6zm19 2h-6a1 1 0 00-1 1v10c0 .6.5 1 1 1h6c.6 0 1-.5 1-1V9c0-.6-.5-1-1-1zm-1 9h-4v-7h4v7z"/>\u003c/svg>');
+}
+.lh-report-icon--world::before {
+ background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20zm7 6h-3c-.3-1.3-.8-2.5-1.4-3.6A8 8 0 0 1 18.9 8zm-7-4a14 14 0 0 1 2 4h-4a14 14 0 0 1 2-4zM4.3 14a8.2 8.2 0 0 1 0-4h3.3a16.5 16.5 0 0 0 0 4H4.3zm.8 2h3a14 14 0 0 0 1.3 3.6A8 8 0 0 1 5.1 16zm3-8H5a8 8 0 0 1 4.3-3.6L8 8zM12 20a14 14 0 0 1-2-4h4a14 14 0 0 1-2 4zm2.3-6H9.7a14.7 14.7 0 0 1 0-4h4.6a14.6 14.6 0 0 1 0 4zm.3 5.6c.6-1.2 1-2.4 1.4-3.6h3a8 8 0 0 1-4.4 3.6zm1.8-5.6a16.5 16.5 0 0 0 0-4h3.3a8.2 8.2 0 0 1 0 4h-3.3z"/>\u003c/svg>');
+}
+.lh-report-icon--stopwatch::before {
+ background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M15 1H9v2h6V1zm-4 13h2V8h-2v6zm8.1-6.6L20.5 6l-1.4-1.4L17.7 6A9 9 0 0 0 3 13a9 9 0 1 0 16-5.6zm-7 12.6a7 7 0 1 1 0-14 7 7 0 0 1 0 14z"/>\u003c/svg>');
+}
+.lh-report-icon--networkspeed::before {
+ background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M15.9 5c-.2 0-.3 0-.4.2v.2L10.1 17a2 2 0 0 0-.2 1 2 2 0 0 0 4 .4l2.4-12.9c0-.3-.2-.5-.5-.5zM1 9l2 2c2.9-2.9 6.8-4 10.5-3.6l1.2-2.7C10 3.8 4.7 5.3 1 9zm20 2 2-2a15.4 15.4 0 0 0-5.6-3.6L17 8.2c1.5.7 2.9 1.6 4.1 2.8zm-4 4 2-2a9.9 9.9 0 0 0-2.7-1.9l-.5 3 1.2.9zM5 13l2 2a7.1 7.1 0 0 1 4-2l1.3-2.9C9.7 10.1 7 11 5 13z"/>\u003c/svg>');
+}
+.lh-report-icon--samples-one::before {
+ background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><circle cx="7" cy="14" r="3"/><path d="M7 18a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm4-2a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm5.6 17.6a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"/>\u003c/svg>');
+}
+.lh-report-icon--samples-many::before {
+ background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M7 18a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm4-2a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm5.6 17.6a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"/><circle cx="7" cy="14" r="3"/><circle cx="11" cy="6" r="3"/>\u003c/svg>');
+}
+.lh-report-icon--chrome::before {
+ background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="-50 -50 562 562"><path d="M256 25.6v25.6a204 204 0 0 1 144.8 60 204 204 0 0 1 60 144.8 204 204 0 0 1-60 144.8 204 204 0 0 1-144.8 60 204 204 0 0 1-144.8-60 204 204 0 0 1-60-144.8 204 204 0 0 1 60-144.8 204 204 0 0 1 144.8-60V0a256 256 0 1 0 0 512 256 256 0 0 0 0-512v25.6z"/><path d="M256 179.2v25.6a51.3 51.3 0 0 1 0 102.4 51.3 51.3 0 0 1 0-102.4v-51.2a102.3 102.3 0 1 0-.1 204.7 102.3 102.3 0 0 0 .1-204.7v25.6z"/><path d="M256 204.8h217.6a25.6 25.6 0 0 0 0-51.2H256a25.6 25.6 0 0 0 0 51.2m44.3 76.8L191.5 470.1a25.6 25.6 0 1 0 44.4 25.6l108.8-188.5a25.6 25.6 0 1 0-44.4-25.6m-88.6 0L102.9 93.2a25.7 25.7 0 0 0-35-9.4 25.7 25.7 0 0 0-9.4 35l108.8 188.5a25.7 25.7 0 0 0 35 9.4 25.9 25.9 0 0 0 9.4-35.1"/>\u003c/svg>');
+}
+.lh-report-icon--external::before {
+ background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg"><path d="M3.15 11.9a1.01 1.01 0 0 1-.743-.307 1.01 1.01 0 0 1-.306-.743v-7.7c0-.292.102-.54.306-.744a1.01 1.01 0 0 1 .744-.306H7v1.05H3.15v7.7h7.7V7h1.05v3.85c0 .291-.103.54-.307.743a1.01 1.01 0 0 1-.743.307h-7.7Zm2.494-2.8-.743-.744 5.206-5.206H8.401V2.1h3.5v3.5h-1.05V3.893L5.644 9.1Z"/>\u003c/svg>');
+}
+.lh-report-icon--experiment::before {
+ background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none"><path d="M4.50002 17C3.86136 17 3.40302 16.7187 3.12502 16.156C2.84702 15.5933 2.90936 15.069 3.31202 14.583L7.50002 9.5V4.5H6.75002C6.54202 4.5 6.36502 4.427 6.21902 4.281C6.07302 4.135 6.00002 3.958 6.00002 3.75C6.00002 3.542 6.07302 3.365 6.21902 3.219C6.36502 3.073 6.54202 3 6.75002 3H13.25C13.458 3 13.635 3.073 13.781 3.219C13.927 3.365 14 3.542 14 3.75C14 3.958 13.927 4.135 13.781 4.281C13.635 4.427 13.458 4.5 13.25 4.5H12.5V9.5L16.688 14.583C17.0767 15.069 17.132 15.5933 16.854 16.156C16.5767 16.7187 16.1254 17 15.5 17H4.50002ZM4.50002 15.5H15.5L11 10V4.5H9.00002V10L4.50002 15.5Z" fill="black"/>\u003c/svg>');
+}
+
+/** These are still icons, but w/o the auto-color invert / opacity / etc. that come with .lh-report-icon */
+
+.lh-report-plain-icon {
+ display: flex;
+ align-items: center;
+}
+.lh-report-plain-icon::before {
+ content: "";
+ background-repeat: no-repeat;
+ width: var(--report-icon-size);
+ height: var(--report-icon-size);
+ display: inline-block;
+ margin-right: 5px;
+}
+
+.lh-report-plain-icon--checklist-pass::before {
+ --icon-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M8.938 13L13.896 8.062L12.833 7L8.938 10.875L7.167 9.125L6.104 10.188L8.938 13ZM10 18C8.90267 18 7.868 17.7917 6.896 17.375C5.924 16.9583 5.07333 16.3853 4.344 15.656C3.61467 14.9267 3.04167 14.076 2.625 13.104C2.20833 12.132 2 11.0973 2 10C2 8.88867 2.20833 7.85033 2.625 6.885C3.04167 5.92033 3.61467 5.07333 4.344 4.344C5.07333 3.61467 5.924 3.04167 6.896 2.625C7.868 2.20833 8.90267 2 10 2C11.1113 2 12.1497 2.20833 13.115 2.625C14.0797 3.04167 14.9267 3.61467 15.656 4.344C16.3853 5.07333 16.9583 5.92033 17.375 6.885C17.7917 7.85033 18 8.88867 18 10C18 11.0973 17.7917 12.132 17.375 13.104C16.9583 14.076 16.3853 14.9267 15.656 15.656C14.9267 16.3853 14.0797 16.9583 13.115 17.375C12.1497 17.7917 11.1113 18 10 18ZM10 16.5C11.8053 16.5 13.34 15.868 14.604 14.604C15.868 13.34 16.5 11.8053 16.5 10C16.5 8.19467 15.868 6.66 14.604 5.396C13.34 4.132 11.8053 3.5 10 3.5C8.19467 3.5 6.66 4.132 5.396 5.396C4.132 6.66 3.5 8.19467 3.5 10C3.5 11.8053 4.132 13.34 5.396 14.604C6.66 15.868 8.19467 16.5 10 16.5Z" fill="black"/>\u003c/svg>');
+ background-color: var(--color-pass);
+ mask: var(--icon-url) center / contain no-repeat;
+}
+.lh-report-plain-icon--checklist-fail::before {
+ --icon-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path fill-rule="evenodd" clip-rule="evenodd" d="M17.5 10C17.5 14.1421 14.1421 17.5 10 17.5C5.85786 17.5 2.5 14.1421 2.5 10C2.5 5.85786 5.85786 2.5 10 2.5C14.1421 2.5 17.5 5.85786 17.5 10ZM16 10C16 13.3137 13.3137 16 10 16C8.6135 16 7.33683 15.5297 6.32083 14.7399L14.7399 6.32083C15.5297 7.33683 16 8.6135 16 10ZM5.26016 13.6793L13.6793 5.26016C12.6633 4.47033 11.3866 4 10 4C6.68629 4 4 6.68629 4 10C4 11.3866 4.47033 12.6633 5.26016 13.6793Z" fill="black"/>\u003c/svg>');
+ background-color: var(--color-fail);
+ mask: var(--icon-url) center / contain no-repeat;
+}
+
+.lh-buttons {
+ display: flex;
+ flex-wrap: wrap;
+ margin: var(--default-padding) 0;
+}
+.lh-button {
+ height: 32px;
+ border: 1px solid var(--report-border-color-secondary);
+ border-radius: 3px;
+ color: var(--link-color);
+ background-color: var(--report-background-color);
+ margin: 5px;
+}
+
+.lh-button:first-of-type {
+ margin-left: 0;
+}
+
+/* Node */
+.lh-node {
+ display: flow-root;
+}
+
+.lh-node__snippet {
+ font-family: var(--report-font-family-monospace);
+ color: var(--snippet-color);
+ font-size: var(--report-monospace-font-size);
+ line-height: 20px;
+}
+
+.lh-checklist {
+ list-style: none;
+ padding: 0;
+}
+
+.lh-checklist-item {
+ margin: 10px 0 10px 0;
+}
+
+/* Baseline Status */
+.lh-baseline-status {
+ display: flex;
+ align-items: center;
+}
+.lh-baseline-status::before {
+ content: "";
+ display: inline-block;
+ width: 18px;
+ height: 10px;
+ margin-right: 6px;
+ background-repeat: no-repeat;
+ background-size: contain;
+}
+.lh-baseline-status--high::before {
+ background-image: var(--baseline-high-icon-url);
+}
+.lh-baseline-status--low::before {
+ background-image: var(--baseline-low-icon-url);
+}
+.lh-baseline-status--limited::before {
+ background-image: var(--baseline-limited-icon-url);
+}
+
+/* Score */
+
+.lh-audit__score-icon {
+ width: var(--score-icon-size);
+ height: var(--score-icon-size);
+ margin: var(--score-icon-margin);
+}
+
+.lh-audit--pass .lh-audit__display-text {
+ color: var(--color-pass-secondary);
+}
+.lh-audit--pass .lh-audit__score-icon,
+.lh-scorescale-range--pass::before {
+ border-radius: 100%;
+ background: var(--color-pass);
+}
+
+.lh-audit--average .lh-audit__display-text {
+ color: var(--color-average-secondary);
+}
+.lh-audit--average .lh-audit__score-icon,
+.lh-scorescale-range--average::before {
+ background: var(--color-average);
+ width: var(--icon-square-size);
+ height: var(--icon-square-size);
+}
+
+.lh-audit--fail .lh-audit__display-text {
+ color: var(--color-fail-secondary);
+}
+.lh-audit--fail .lh-audit__score-icon,
+.lh-audit--error .lh-audit__score-icon,
+.lh-scorescale-range--fail::before {
+ border-left: calc(var(--score-icon-size) / 2) solid transparent;
+ border-right: calc(var(--score-icon-size) / 2) solid transparent;
+ border-bottom: var(--score-icon-size) solid var(--color-fail);
+}
+
+.lh-audit--error .lh-audit__score-icon,
+.lh-metric--error .lh-metric__icon {
+ background-image: var(--error-icon-url);
+ background-repeat: no-repeat;
+ background-position: center;
+ border: none;
+}
+
+.lh-gauge__wrapper--fail .lh-gauge--error {
+ background-image: var(--error-icon-url);
+ background-repeat: no-repeat;
+ background-position: center;
+ transform: scale(0.5);
+ top: var(--score-container-padding);
+}
+
+.lh-audit--manual .lh-audit__display-text,
+.lh-audit--notapplicable .lh-audit__display-text {
+ color: var(--color-gray-600);
+}
+.lh-audit--manual .lh-audit__score-icon,
+.lh-audit--notapplicable .lh-audit__score-icon {
+ border: calc(0.2 * var(--score-icon-size)) solid var(--color-gray-400);
+ border-radius: 100%;
+ background: none;
+}
+
+.lh-audit--informative .lh-audit__display-text {
+ color: var(--color-gray-600);
+}
+
+.lh-audit--informative .lh-audit__score-icon {
+ border: calc(0.2 * var(--score-icon-size)) solid var(--color-gray-400);
+ border-radius: 100%;
+}
+
+.lh-audit__description,
+.lh-audit__stackpack {
+ color: var(--report-text-color-secondary);
+}
+.lh-audit__adorn {
+ border: 1px solid var(--color-gray-500);
+ border-radius: 3px;
+ margin: 0 3px;
+ padding: 0 2px;
+ line-height: 1.1;
+ display: inline-block;
+ font-size: 90%;
+ color: var(--report-text-color-secondary);
+}
+
+.lh-category-header__description {
+ text-align: center;
+ color: var(--color-gray-700);
+ margin: 0px auto;
+ max-width: 400px;
+}
+
+
+.lh-audit__display-text,
+.lh-chevron-container {
+ margin: 0 var(--audit-margin-horizontal);
+}
+.lh-chevron-container {
+ margin-right: 0;
+}
+
+.lh-audit__title-and-text {
+ flex: 1;
+}
+
+.lh-audit__title-and-text code {
+ color: var(--snippet-color);
+ font-size: var(--report-monospace-font-size);
+}
+
+/* Prepend display text with em dash separator. */
+.lh-audit__display-text:not(:empty):before {
+ content: '\u2014';
+ margin-right: var(--audit-margin-horizontal);
+}
+
+/* Expandable Details (Audit Groups, Audits) */
+.lh-audit__header {
+ display: flex;
+ align-items: center;
+ padding: var(--default-padding);
+}
+
+
+.lh-metricfilter {
+ display: grid;
+ justify-content: end;
+ align-items: center;
+ grid-auto-flow: column;
+ gap: 4px;
+ color: var(--color-gray-700);
+}
+
+.lh-metricfilter__radio {
+ /*
+ * Instead of hiding, position offscreen so it's still accessible to screen readers
+ * https://bugs.chromium.org/p/chromium/issues/detail?id=1439785
+ */
+ position: fixed;
+ left: -9999px;
+}
+.lh-metricfilter input[type='radio']:focus-visible + label {
+ outline: -webkit-focus-ring-color auto 1px;
+}
+
+.lh-metricfilter__label {
+ display: inline-flex;
+ padding: 0 4px;
+ height: 16px;
+ text-decoration: underline;
+ align-items: center;
+ cursor: pointer;
+ font-size: 90%;
+}
+
+.lh-metricfilter__label--active {
+ background: var(--color-blue-primary);
+ color: var(--color-white);
+ border-radius: 3px;
+ text-decoration: none;
+}
+/* Give the 'All' choice a more muted display */
+.lh-metricfilter__label--active[for="metric-All"] {
+ background-color: var(--color-blue-200) !important;
+ color: black !important;
+}
+
+.lh-metricfilter__text {
+ margin-right: 8px;
+}
+
+/* If audits are filtered, hide the itemcount for Passed Audits\u2026 */
+.lh-category--filtered .lh-audit-group .lh-audit-group__itemcount {
+ display: none;
+}
+
+
+.lh-audit__header:hover {
+ background-color: var(--color-hover);
+}
+
+/* We want to hide the browser's default arrow marker on summary elements. Admittedly, it's complicated. */
+.lh-root details > summary {
+ /* Blink 89+ and Firefox will hide the arrow when display is changed from (new) default of \`list-item\` to block. https://chromestatus.com/feature/6730096436051968*/
+ display: block;
+}
+/* Safari and Blink <=88 require using the -webkit-details-marker selector */
+.lh-root details > summary::-webkit-details-marker {
+ display: none;
+}
+
+/* Perf Metric */
+
+.lh-metrics-container {
+ display: grid;
+ grid-auto-rows: 1fr;
+ grid-template-columns: 1fr 1fr;
+ grid-column-gap: var(--report-line-height);
+ margin-bottom: var(--default-padding);
+}
+
+.lh-metric {
+ border-top: 1px solid var(--report-border-color-secondary);
+}
+
+.lh-category:not(.lh--hoisted-meta) .lh-metric:nth-last-child(-n+2) {
+ border-bottom: 1px solid var(--report-border-color-secondary);
+}
+
+.lh-metric__innerwrap {
+ display: grid;
+ /**
+ * Icon -- Metric Name
+ * -- Metric Value
+ */
+ grid-template-columns: calc(var(--score-icon-size) + var(--score-icon-margin-left) + var(--score-icon-margin-right)) 1fr;
+ align-items: center;
+ padding: var(--default-padding);
+}
+
+.lh-metric__details {
+ order: -1;
+}
+
+.lh-metric__title {
+ flex: 1;
+}
+
+.lh-calclink {
+ padding-left: calc(1ex / 3);
+}
+
+.lh-metric__description {
+ display: none;
+ grid-column-start: 2;
+ grid-column-end: 4;
+ color: var(--report-text-color-secondary);
+}
+
+.lh-metric__value {
+ font-size: var(--metric-value-font-size);
+ margin: calc(var(--default-padding) / 2) 0;
+ white-space: nowrap; /* No wrapping between metric value and the icon */
+ grid-column-start: 2;
+}
+
+/**
+* This media query is a temporary fallback for browsers that do not support \`@container query\`.
+* TODO: remove this media query when \`@container query\` is fully supported by browsers
+* See https://github.com/GoogleChrome/lighthouse/pull/16332
+*/
+@media screen and (max-width: 535px) {
+ .lh-metrics-container {
+ display: block;
+ }
+
+ .lh-metric {
+ border-bottom: none !important;
+ }
+ .lh-category:not(.lh--hoisted-meta) .lh-metric:nth-last-child(1) {
+ border-bottom: 1px solid var(--report-border-color-secondary) !important;
+ }
+
+ /* Change the grid to 3 columns for narrow viewport. */
+ .lh-metric__innerwrap {
+ /**
+ * Icon -- Metric Name -- Metric Value
+ */
+ grid-template-columns: calc(var(--score-icon-size) + var(--score-icon-margin-left) + var(--score-icon-margin-right)) 2fr 1fr;
+ }
+ .lh-metric__value {
+ justify-self: end;
+ grid-column-start: unset;
+ }
+}
+
+@container lh-container (max-width: 535px) {
+ .lh-metrics-container {
+ display: block;
+ }
+
+ .lh-metric {
+ border-bottom: none !important;
+ }
+ .lh-category:not(.lh--hoisted-meta) .lh-metric:nth-last-child(1) {
+ border-bottom: 1px solid var(--report-border-color-secondary) !important;
+ }
+
+ /* Change the grid to 3 columns for narrow viewport. */
+ .lh-metric__innerwrap {
+ /**
+ * Icon -- Metric Name -- Metric Value
+ */
+ grid-template-columns: calc(var(--score-icon-size) + var(--score-icon-margin-left) + var(--score-icon-margin-right)) 2fr 1fr;
+ }
+ .lh-metric__value {
+ justify-self: end;
+ grid-column-start: unset;
+ }
+}
+
+/* No-JS toggle switch */
+/* Keep this selector sync'd w/ \`magicSelector\` in report-ui-features-test.js */
+ .lh-metrics-toggle__input:checked ~ .lh-metrics-container .lh-metric__description {
+ display: block;
+}
+
+/* TODO get rid of the SVGS and clean up these some more */
+.lh-metrics-toggle__input {
+ opacity: 0;
+ position: absolute;
+ right: 0;
+ top: 0px;
+}
+
+.lh-metrics-toggle__input + div > label > .lh-metrics-toggle__labeltext--hide,
+.lh-metrics-toggle__input:checked + div > label > .lh-metrics-toggle__labeltext--show {
+ display: none;
+}
+.lh-metrics-toggle__input:checked + div > label > .lh-metrics-toggle__labeltext--hide {
+ display: inline;
+}
+.lh-metrics-toggle__input:focus + div > label {
+ outline: -webkit-focus-ring-color auto 3px;
+}
+
+.lh-metrics-toggle__label {
+ cursor: pointer;
+ font-size: var(--report-font-size-secondary);
+ line-height: var(--report-line-height-secondary);
+ color: var(--color-gray-700);
+}
+
+/* Pushes the metric description toggle button to the right. */
+.lh-audit-group--metrics .lh-audit-group__header {
+ display: flex;
+ justify-content: space-between;
+}
+
+.lh-metric__icon,
+.lh-scorescale-range::before {
+ content: '';
+ width: var(--score-icon-size);
+ height: var(--score-icon-size);
+ display: inline-block;
+ margin: var(--score-icon-margin);
+}
+
+.lh-metric--pass .lh-metric__value {
+ color: var(--color-pass-secondary);
+}
+.lh-metric--pass .lh-metric__icon {
+ border-radius: 100%;
+ background: var(--color-pass);
+}
+
+.lh-metric--average .lh-metric__value {
+ color: var(--color-average-secondary);
+}
+.lh-metric--average .lh-metric__icon {
+ background: var(--color-average);
+ width: var(--icon-square-size);
+ height: var(--icon-square-size);
+}
+
+.lh-metric--fail .lh-metric__value {
+ color: var(--color-fail-secondary);
+}
+.lh-metric--fail .lh-metric__icon {
+ border-left: calc(var(--score-icon-size) / 2) solid transparent;
+ border-right: calc(var(--score-icon-size) / 2) solid transparent;
+ border-bottom: var(--score-icon-size) solid var(--color-fail);
+}
+
+.lh-metric--error .lh-metric__value,
+.lh-metric--error .lh-metric__description {
+ color: var(--color-fail-secondary);
+}
+
+/* Filmstrip */
+
+.lh-filmstrip-container {
+ /* smaller gap between metrics and filmstrip */
+ margin: -8px auto 0 auto;
+}
+
+.lh-filmstrip {
+ display: flex;
+ justify-content: space-between;
+ justify-items: center;
+ margin-bottom: var(--default-padding);
+ width: 100%;
+}
+
+.lh-filmstrip__frame {
+ overflow: hidden;
+ line-height: 0;
+}
+
+.lh-filmstrip__thumbnail {
+ border: 1px solid var(--report-border-color-secondary);
+ max-height: 150px;
+ max-width: 120px;
+}
+
+.lh-dark .lh-perf-toggle-text {
+ color: rgba(30, 164, 70, 1);
+}
+
+.lh-perf-toggle-text a {
+ color: var(--link-color);
+}
+
+/* Audit */
+
+.lh-audit {
+ border-bottom: 1px solid var(--report-border-color-secondary);
+}
+
+/* Apply border-top to just the first audit. */
+.lh-audit {
+ border-top: 1px solid var(--report-border-color-secondary);
+}
+.lh-audit ~ .lh-audit {
+ border-top: none;
+}
+
+
+.lh-audit--error .lh-audit__display-text {
+ color: var(--color-fail-secondary);
+}
+
+/* Audit Group */
+
+.lh-audit-group {
+ margin-bottom: var(--audit-group-margin-bottom);
+ position: relative;
+}
+.lh-audit-group--metrics {
+ margin-bottom: calc(var(--audit-group-margin-bottom) / 2);
+}
+
+.lh-audit-group--metrics .lh-audit-group__summary {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+.lh-audit-group__summary {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+
+.lh-audit-group__header .lh-chevron {
+ margin-top: calc((var(--report-line-height) - 5px) / 2);
+}
+
+.lh-audit-group__header {
+ letter-spacing: 0.8px;
+ padding: var(--default-padding);
+ padding-left: 0;
+}
+
+.lh-audit-group__header, .lh-audit-group__summary {
+ font-size: var(--report-font-size-secondary);
+ line-height: var(--report-line-height-secondary);
+ color: var(--color-gray-700);
+}
+
+.lh-audit-group__title {
+ text-transform: uppercase;
+ font-weight: 500;
+}
+
+.lh-audit-group__itemcount {
+ color: var(--color-gray-600);
+}
+
+.lh-audit-group__footer {
+ color: var(--color-gray-600);
+ display: block;
+ margin-top: var(--default-padding);
+}
+
+.lh-details,
+.lh-category-header__description,
+.lh-audit-group__footer {
+ font-size: var(--report-font-size-secondary);
+ line-height: var(--report-line-height-secondary);
+}
+
+.lh-audit-explanation {
+ margin: var(--audit-padding-vertical) 0 calc(var(--audit-padding-vertical) / 2) var(--audit-margin-horizontal);
+ line-height: var(--audit-explanation-line-height);
+ display: inline-block;
+}
+
+.lh-audit--fail .lh-audit-explanation {
+ color: var(--color-fail-secondary);
+}
+
+/* Report */
+.lh-list {
+ margin-right: calc(var(--default-padding) * 2);
+}
+.lh-list > :not(:last-child) {
+ margin-bottom: calc(var(--default-padding) * 2);
+ border-bottom: 1px solid #A8C7FA;
+}
+.lh-list-section {
+ padding: calc(var(--default-padding) * 2) 0;
+}
+.lh-list-section__title {
+ text-decoration: underline;
+}
+
+.lh-header-container {
+ display: block;
+ margin: 0 auto;
+ position: relative;
+ word-wrap: break-word;
+}
+
+.lh-header-container .lh-scores-wrapper {
+ border-bottom: 1px solid var(--color-gray-200);
+}
+
+
+.lh-report {
+ min-width: var(--report-content-min-width);
+}
+
+.lh-exception {
+ font-size: large;
+}
+
+.lh-code {
+ white-space: normal;
+ margin-top: 0;
+ font-size: var(--report-monospace-font-size);
+}
+
+.lh-warnings {
+ --item-margin: calc(var(--report-line-height) / 6);
+ color: var(--color-average-secondary);
+ margin: var(--audit-padding-vertical) 0;
+ padding: var(--default-padding)
+ var(--default-padding)
+ var(--default-padding)
+ calc(var(--audit-description-padding-left));
+ background-color: var(--toplevel-warning-background-color);
+}
+.lh-warnings span {
+ font-weight: bold;
+}
+
+.lh-warnings--toplevel {
+ --item-margin: calc(var(--header-line-height) / 4);
+ color: var(--toplevel-warning-text-color);
+ margin-left: auto;
+ margin-right: auto;
+ max-width: var(--report-content-max-width-minus-edge-gap);
+ padding: var(--toplevel-warning-padding);
+ border-radius: 8px;
+}
+
+.lh-warnings__msg {
+ color: var(--toplevel-warning-message-text-color);
+ margin: 0;
+}
+
+.lh-warnings ul {
+ margin: 0;
+}
+.lh-warnings li {
+ margin: var(--item-margin) 0;
+}
+.lh-warnings li:last-of-type {
+ margin-bottom: 0;
+}
+
+.lh-scores-header {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+}
+.lh-scores-header__solo {
+ padding: 0;
+ border: 0;
+}
+
+/* Gauge */
+
+.lh-gauge__wrapper--pass {
+ color: var(--color-pass-secondary);
+ fill: var(--color-pass);
+ stroke: var(--color-pass);
+}
+
+.lh-gauge__wrapper--average {
+ color: var(--color-average-secondary);
+ fill: var(--color-average);
+ stroke: var(--color-average);
+}
+
+.lh-gauge__wrapper--fail {
+ color: var(--color-fail-secondary);
+ fill: var(--color-fail);
+ stroke: var(--color-fail);
+}
+
+.lh-gauge__wrapper--not-applicable {
+ color: var(--color-not-applicable);
+ fill: var(--color-not-applicable);
+ stroke: var(--color-not-applicable);
+}
+
+.lh-fraction__wrapper .lh-fraction__content::before {
+ content: '';
+ height: var(--score-icon-size);
+ width: var(--score-icon-size);
+ margin: var(--score-icon-margin);
+ display: inline-block;
+}
+.lh-fraction__wrapper--pass .lh-fraction__content {
+ color: var(--color-pass-secondary);
+}
+.lh-fraction__wrapper--pass .lh-fraction__background {
+ background-color: var(--color-pass);
+}
+.lh-fraction__wrapper--pass .lh-fraction__content::before {
+ background-color: var(--color-pass);
+ border-radius: 50%;
+}
+.lh-fraction__wrapper--average .lh-fraction__content {
+ color: var(--color-average-secondary);
+}
+.lh-fraction__wrapper--average .lh-fraction__background,
+.lh-fraction__wrapper--average .lh-fraction__content::before {
+ background-color: var(--color-average);
+}
+.lh-fraction__wrapper--fail .lh-fraction__content {
+ color: var(--color-fail);
+}
+.lh-fraction__wrapper--fail .lh-fraction__background {
+ background-color: var(--color-fail);
+}
+.lh-fraction__wrapper--fail .lh-fraction__content::before {
+ border-left: calc(var(--score-icon-size) / 2) solid transparent;
+ border-right: calc(var(--score-icon-size) / 2) solid transparent;
+ border-bottom: var(--score-icon-size) solid var(--color-fail);
+}
+.lh-fraction__wrapper--null .lh-fraction__content {
+ color: var(--color-gray-700);
+}
+.lh-fraction__wrapper--null .lh-fraction__background {
+ background-color: var(--color-gray-700);
+}
+.lh-fraction__wrapper--null .lh-fraction__content::before {
+ border-radius: 50%;
+ border: calc(0.2 * var(--score-icon-size)) solid var(--color-gray-700);
+}
+
+.lh-fraction__background {
+ position: absolute;
+ height: 100%;
+ width: 100%;
+ border-radius: calc(var(--gauge-circle-size) / 2);
+ opacity: 0.1;
+ z-index: -1;
+}
+
+.lh-fraction__content-wrapper {
+ height: var(--gauge-circle-size);
+ display: flex;
+ align-items: center;
+}
+
+.lh-fraction__content {
+ display: flex;
+ position: relative;
+ align-items: center;
+ justify-content: center;
+ font-size: calc(0.3 * var(--gauge-circle-size));
+ line-height: calc(0.4 * var(--gauge-circle-size));
+ width: max-content;
+ min-width: calc(1.5 * var(--gauge-circle-size));
+ padding: calc(0.1 * var(--gauge-circle-size)) calc(0.2 * var(--gauge-circle-size));
+ --score-icon-size: calc(0.21 * var(--gauge-circle-size));
+ --score-icon-margin: 0 calc(0.15 * var(--gauge-circle-size)) 0 0;
+}
+
+.lh-gauge {
+ stroke-linecap: round;
+ width: var(--gauge-circle-size);
+ height: var(--gauge-circle-size);
+}
+
+.lh-category .lh-gauge {
+ --gauge-circle-size: var(--gauge-circle-size-big);
+}
+
+.lh-gauge-base {
+ opacity: 0.1;
+}
+
+.lh-gauge-arc {
+ fill: none;
+ transform-origin: 50% 50%;
+ animation: load-gauge var(--transition-length) ease both;
+ animation-delay: 250ms;
+}
+
+.lh-gauge__svg-wrapper {
+ position: relative;
+ height: var(--gauge-circle-size);
+}
+.lh-category .lh-gauge__svg-wrapper,
+.lh-category .lh-fraction__wrapper {
+ --gauge-circle-size: var(--gauge-circle-size-big);
+}
+
+/* The plugin badge overlay */
+.lh-gauge__wrapper--plugin .lh-gauge__svg-wrapper::before {
+ width: var(--plugin-badge-size);
+ height: var(--plugin-badge-size);
+ background-color: var(--plugin-badge-background-color);
+ background-image: var(--plugin-icon-url);
+ background-repeat: no-repeat;
+ background-size: var(--plugin-icon-size);
+ background-position: 58% 50%;
+ content: "";
+ position: absolute;
+ right: -6px;
+ bottom: 0px;
+ display: block;
+ z-index: 100;
+ box-shadow: 0 0 4px rgba(0,0,0,.2);
+ border-radius: 25%;
+}
+.lh-category .lh-gauge__wrapper--plugin .lh-gauge__svg-wrapper::before {
+ width: var(--plugin-badge-size-big);
+ height: var(--plugin-badge-size-big);
+}
+
+@keyframes load-gauge {
+ from { stroke-dasharray: 0 352; }
+}
+
+.lh-gauge__percentage {
+ width: 100%;
+ height: var(--gauge-circle-size);
+ line-height: var(--gauge-circle-size);
+ position: absolute;
+ font-family: var(--report-font-family-monospace);
+ font-size: calc(var(--gauge-circle-size) * 0.34 + 1.3px);
+ text-align: center;
+ top: var(--score-container-padding);
+}
+
+.lh-category .lh-gauge__percentage {
+ --gauge-circle-size: var(--gauge-circle-size-big);
+ --gauge-percentage-font-size: var(--gauge-percentage-font-size-big);
+}
+
+.lh-gauge__wrapper,
+.lh-fraction__wrapper {
+ position: relative;
+ display: flex;
+ align-items: center;
+ flex-direction: column;
+ text-decoration: none;
+ padding: var(--score-container-padding);
+
+ --transition-length: 1s;
+
+ /* Contain the layout style paint & layers during animation*/
+ contain: content;
+ will-change: opacity; /* Only using for layer promotion */
+}
+
+.lh-gauge__label,
+.lh-fraction__label {
+ font-size: var(--gauge-label-font-size);
+ font-weight: 500;
+ line-height: var(--gauge-label-line-height);
+ margin-top: 10px;
+ text-align: center;
+ color: var(--report-text-color);
+ word-break: keep-all;
+}
+
+/* TODO(#8185) use more BEM (.lh-gauge__label--big) instead of relying on descendant selector */
+.lh-category .lh-gauge__label,
+.lh-category .lh-fraction__label {
+ --gauge-label-font-size: var(--gauge-label-font-size-big);
+ --gauge-label-line-height: var(--gauge-label-line-height-big);
+ margin-top: 14px;
+}
+
+.lh-scores-header .lh-gauge__wrapper,
+.lh-scores-header .lh-fraction__wrapper,
+.lh-sticky-header .lh-gauge__wrapper,
+.lh-sticky-header .lh-fraction__wrapper {
+ width: var(--gauge-wrapper-width);
+}
+
+.lh-scorescale {
+ display: inline-flex;
+
+ gap: calc(var(--default-padding) * 4);
+ margin: 16px auto 0 auto;
+ font-size: var(--report-font-size-secondary);
+ color: var(--color-gray-700);
+
+}
+
+.lh-scorescale-range {
+ display: flex;
+ align-items: center;
+ font-family: var(--report-font-family-monospace);
+ white-space: nowrap;
+}
+
+.lh-category-header__finalscreenshot .lh-scorescale {
+ border: 0;
+ display: flex;
+ justify-content: center;
+}
+
+.lh-category-header__finalscreenshot .lh-scorescale-range {
+ font-family: unset;
+ font-size: 12px;
+}
+
+.lh-scorescale-wrap {
+ display: contents;
+}
+
+/* Hide category score gauages if it's a single category report */
+.lh-header--solo-category .lh-scores-wrapper {
+ display: none;
+}
+
+
+.lh-categories {
+ width: 100%;
+}
+
+.lh-category {
+ padding: var(--category-padding);
+ max-width: var(--report-content-max-width);
+ margin: 0 auto;
+
+ scroll-margin-top: calc(var(--sticky-header-buffer) - 1em);
+}
+
+.lh-category-wrapper {
+ border-bottom: 1px solid var(--color-gray-200);
+}
+.lh-category-wrapper:last-of-type {
+ border-bottom: 0;
+}
+
+.lh-category-header {
+ margin-bottom: var(--section-padding-vertical);
+}
+
+.lh-category-header .lh-score__gauge {
+ max-width: 400px;
+ width: auto;
+ margin: 0px auto;
+}
+
+.lh-category-header__finalscreenshot {
+ display: grid;
+ grid-template: none / 1fr 1px 1fr;
+ justify-items: center;
+ align-items: center;
+ gap: var(--report-line-height);
+ min-height: 288px;
+ margin-bottom: var(--default-padding);
+}
+
+.lh-final-ss-image {
+ /* constrain the size of the image to not be too large */
+ max-height: calc(var(--gauge-circle-size-big) * 2.8);
+ max-width: calc(var(--gauge-circle-size-big) * 3.5);
+ border: 1px solid var(--color-gray-200);
+ padding: 4px;
+ border-radius: 3px;
+ display: block;
+}
+
+.lh-category-headercol--separator {
+ background: var(--color-gray-200);
+ width: 1px;
+ height: var(--gauge-circle-size-big);
+}
+
+/**
+* This media query is a temporary fallback for browsers that do not support \`@container query\`.
+* TODO: remove this media query when \`@container query\` is fully supported by browsers
+* See https://github.com/GoogleChrome/lighthouse/pull/16332
+*/
+@media screen and (max-width: 780px) {
+ .lh-category-header__finalscreenshot {
+ grid-template: 1fr 1fr / none
+ }
+ .lh-category-headercol--separator {
+ display: none;
+ }
+}
+
+@container lh-container (max-width: 780px) {
+ .lh-category-header__finalscreenshot {
+ grid-template: 1fr 1fr / none
+ }
+ .lh-category-headercol--separator {
+ display: none;
+ }
+}
+
+/**
+* This media query is a temporary fallback for browsers that do not support \`@container query\`.
+* TODO: remove this media query when \`@container query\` is fully supported by browsers
+* See https://github.com/GoogleChrome/lighthouse/pull/16332
+*/
+@media screen and (max-width: 964px) {
+ .lh-report {
+ margin-left: 0;
+ width: 100%;
+ }
+}
+
+/* 964 fits the min-width of the filmstrip */
+@container lh-container (max-width: 964px) {
+ .lh-report {
+ margin-left: 0;
+ width: 100%;
+ }
+}
+
+@media print {
+ body {
+ -webkit-print-color-adjust: exact; /* print background colors */
+ }
+ .lh-container {
+ display: block;
+ }
+ .lh-report {
+ margin-left: 0;
+ padding-top: 0;
+ }
+ .lh-categories {
+ margin-top: 0;
+ }
+ .lh-buttons, .lh-highlighter {
+ /* hide stickyheader marker when printing. crbug.com/41486992 */
+ display: none;
+ }
+}
+
+.lh-table {
+ position: relative;
+ border-collapse: separate;
+ border-spacing: 0;
+ /* Can't assign padding to table, so shorten the width instead. */
+ width: calc(100% - var(--audit-description-padding-left) - var(--stackpack-padding-horizontal));
+ border: 1px solid var(--report-border-color-secondary);
+}
+
+.lh-table thead th {
+ position: sticky;
+ top: var(--sticky-header-buffer);
+ z-index: 1;
+ background-color: var(--report-background-color);
+ border-bottom: 1px solid var(--report-border-color-secondary);
+ font-weight: normal;
+ color: var(--color-gray-600);
+ /* See text-wrapping comment on .lh-container. */
+ word-break: normal;
+}
+
+.lh-row--group {
+ background-color: var(--table-group-header-background-color);
+}
+
+.lh-row--group td {
+ font-weight: bold;
+ font-size: 1.05em;
+ color: var(--table-group-header-text-color);
+}
+
+.lh-row--group td:first-child {
+ display: block;
+ min-width: max-content;
+ font-weight: normal;
+}
+
+.lh-row--group .lh-text {
+ color: inherit;
+ text-decoration: none;
+ display: inline-block;
+}
+
+.lh-row--group a.lh-link:hover {
+ text-decoration: underline;
+}
+
+.lh-row--group .lh-audit__adorn {
+ text-transform: capitalize;
+ font-weight: normal;
+ padding: 2px 3px 1px 3px;
+}
+
+.lh-row--group .lh-audit__adorn1p {
+ color: var(--link-color);
+ border-color: var(--link-color);
+}
+
+.lh-row--group .lh-report-icon--external::before {
+ content: "";
+ background-repeat: no-repeat;
+ width: 14px;
+ height: 16px;
+ opacity: 0.7;
+ display: inline-block;
+ vertical-align: middle;
+}
+
+.lh-row--group .lh-report-icon--external {
+ visibility: hidden;
+}
+
+.lh-row--group:hover .lh-report-icon--external {
+ visibility: visible;
+}
+
+.lh-dark .lh-report-icon--external::before {
+ filter: invert(1);
+}
+
+/** Manages indentation of two-level and three-level nested adjacent rows */
+
+.lh-row--group ~ [data-entity]:not(.lh-row--group) td:first-child {
+ padding-left: 20px;
+}
+
+.lh-row--group ~ [data-entity]:not(.lh-row--group) ~ .lh-sub-item-row td:first-child {
+ margin-left: 20px;
+ padding-left: 10px;
+ border-left: 1px solid #A8C7FA;
+ display: block;
+}
+
+.lh-row--even {
+ background-color: var(--table-group-header-background-color);
+}
+.lh-row--hidden {
+ display: none;
+}
+
+.lh-table th,
+.lh-table td {
+ padding: var(--default-padding);
+}
+
+.lh-table tr {
+ vertical-align: middle;
+}
+
+.lh-table tr:hover {
+ background-color: var(--table-higlight-background-color);
+}
+
+/* Looks unnecessary, but mostly for keeping the <th>s left-aligned */
+.lh-table-column--text,
+.lh-table-column--source-location,
+.lh-table-column--url,
+/* .lh-table-column--thumbnail, */
+/* .lh-table-column--empty,*/
+.lh-table-column--code,
+.lh-table-column--node {
+ text-align: left;
+}
+
+.lh-table-column--code {
+ min-width: 100px;
+}
+
+.lh-table-column--bytes,
+.lh-table-column--timespanMs,
+.lh-table-column--ms,
+.lh-table-column--numeric {
+ text-align: right;
+ word-break: normal;
+}
+
+
+
+.lh-table .lh-table-column--thumbnail {
+ width: var(--image-preview-size);
+}
+
+.lh-table-column--url {
+ min-width: 250px;
+}
+
+.lh-table-column--text {
+ min-width: 80px;
+}
+
+/* Keep columns narrow if they follow the URL column */
+/* 12% was determined to be a decent narrow width, but wide enough for column headings */
+.lh-table-column--url + th.lh-table-column--bytes,
+.lh-table-column--url + .lh-table-column--bytes + th.lh-table-column--bytes,
+.lh-table-column--url + .lh-table-column--ms,
+.lh-table-column--url + .lh-table-column--ms + th.lh-table-column--bytes,
+.lh-table-column--url + .lh-table-column--bytes + th.lh-table-column--timespanMs {
+ width: 12%;
+}
+
+/** Tweak styling for tables in insight audits. */
+.lh-audit[id$="-insight"] .lh-table {
+ border: none;
+}
+
+.lh-audit[id$="-insight"] .lh-table thead th {
+ font-weight: bold;
+ color: unset;
+}
+
+.lh-audit[id$="-insight"] .lh-table th,
+.lh-audit[id$="-insight"] .lh-table td {
+ padding: calc(var(--default-padding) / 2);
+}
+
+.lh-audit[id$="-insight"] .lh-table .lh-row--even,
+.lh-audit[id$="-insight"] .lh-table tr:not(.lh-row--group):hover {
+ background-color: unset;
+}
+
+.lh-text__url-host {
+ display: inline;
+}
+
+.lh-text__url-host {
+ margin-left: calc(var(--report-font-size) / 2);
+ opacity: 0.6;
+ font-size: 90%
+}
+
+.lh-thumbnail {
+ object-fit: cover;
+ width: var(--image-preview-size);
+ height: var(--image-preview-size);
+ display: block;
+}
+
+.lh-unknown pre {
+ overflow: scroll;
+ border: solid 1px var(--color-gray-200);
+}
+
+.lh-text__url > a {
+ color: inherit;
+ text-decoration: none;
+}
+
+.lh-text__url > a:hover {
+ text-decoration: underline dotted #999;
+}
+
+.lh-sub-item-row {
+ margin-left: 20px;
+ margin-bottom: 0;
+ color: var(--color-gray-700);
+}
+
+.lh-sub-item-row td {
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 20px;
+}
+
+.lh-sub-item-row .lh-element-screenshot {
+ zoom: 0.6;
+}
+
+/* Chevron
+ https://codepen.io/paulirish/pen/LmzEmK
+ */
+.lh-chevron {
+ --chevron-angle: 42deg;
+ /* Edge doesn't support transform: rotate(calc(...)), so we define it here */
+ --chevron-angle-right: -42deg;
+ width: var(--chevron-size);
+ height: var(--chevron-size);
+ margin-top: calc((var(--report-line-height) - 12px) / 2);
+}
+
+.lh-chevron__lines {
+ transition: transform 0.4s;
+ transform: translateY(var(--report-line-height));
+}
+.lh-chevron__line {
+ stroke: var(--chevron-line-stroke);
+ stroke-width: var(--chevron-size);
+ stroke-linecap: square;
+ transform-origin: 50%;
+ transform: rotate(var(--chevron-angle));
+ transition: transform 300ms, stroke 300ms;
+}
+
+.lh-expandable-details .lh-chevron__line-right,
+.lh-expandable-details[open] .lh-chevron__line-left {
+ transform: rotate(var(--chevron-angle-right));
+}
+
+.lh-expandable-details[open] .lh-chevron__line-right {
+ transform: rotate(var(--chevron-angle));
+}
+
+
+.lh-expandable-details[open] .lh-chevron__lines {
+ transform: translateY(calc(var(--chevron-size) * -1));
+}
+
+.lh-expandable-details[open] {
+ animation: 300ms openDetails forwards;
+ padding-bottom: var(--default-padding);
+}
+
+@keyframes openDetails {
+ from {
+ outline: 1px solid var(--report-background-color);
+ }
+ to {
+ outline: 1px solid;
+ box-shadow: 0 2px 4px rgba(0, 0, 0, .24);
+ }
+}
+
+/**
+* This media query is a temporary fallback for browsers that do not support \`@container query\`.
+* TODO: remove this media query when \`@container query\` is fully supported by browsers
+* See https://github.com/GoogleChrome/lighthouse/pull/16332
+*/
+@media screen and (max-width: 780px) {
+ /* no black outline if we're not confident the entire table can be displayed within bounds */
+ .lh-expandable-details[open] {
+ animation: none;
+ }
+}
+
+@container lh-container (max-width: 780px) {
+ /* no black outline if we're not confident the entire table can be displayed within bounds */
+ .lh-expandable-details[open] {
+ animation: none;
+ }
+}
+
+.lh-expandable-details[open] summary, details.lh-clump > summary {
+ border-bottom: 1px solid var(--report-border-color-secondary);
+}
+details.lh-clump[open] > summary {
+ border-bottom-width: 0;
+}
+
+
+
+details .lh-clump-toggletext--hide,
+details[open] .lh-clump-toggletext--show { display: none; }
+details[open] .lh-clump-toggletext--hide { display: block;}
+
+
+/* Tooltip */
+.lh-tooltip-boundary {
+ position: relative;
+}
+
+.lh-tooltip {
+ position: absolute;
+ display: none; /* Don't retain these layers when not needed */
+ opacity: 0;
+ background: #ffffff;
+ white-space: pre-line; /* Render newlines in the text */
+ min-width: 246px;
+ max-width: 275px;
+ padding: 15px;
+ border-radius: 5px;
+ text-align: initial;
+ line-height: 1.4;
+}
+
+/**
+* This media query is a temporary fallback for browsers that do not support \`@container query\`.
+* TODO: remove this media query when \`@container query\` is fully supported by browsers
+* See https://github.com/GoogleChrome/lighthouse/pull/16332
+*/
+@media screen and (max-width: 535px) {
+ .lh-tooltip {
+ min-width: 45cqi;
+ padding: 3cqi;
+ }
+}
+
+/* shrink tooltips to not be cutoff on left edge of narrow container
+ 45vw is chosen to be ~= width of the left column of metrics
+*/
+@container lh-container (max-width: 535px) {
+ .lh-tooltip {
+ min-width: 45cqi;
+ padding: 3cqi;
+ }
+}
+
+.lh-tooltip-boundary:hover .lh-tooltip {
+ display: block;
+ animation: fadeInTooltip 250ms;
+ animation-fill-mode: forwards;
+ animation-delay: 850ms;
+ bottom: 100%;
+ z-index: 1;
+ will-change: opacity;
+ right: 0;
+ pointer-events: none;
+}
+
+.lh-tooltip::before {
+ content: "";
+ border: solid transparent;
+ border-bottom-color: #fff;
+ border-width: 10px;
+ position: absolute;
+ bottom: -20px;
+ right: 6px;
+ transform: rotate(180deg);
+ pointer-events: none;
+}
+
+@keyframes fadeInTooltip {
+ 0% { opacity: 0; }
+ 75% { opacity: 1; }
+ 100% { opacity: 1; filter: drop-shadow(1px 0px 1px #aaa) drop-shadow(0px 2px 4px hsla(206, 6%, 25%, 0.15)); pointer-events: auto; }
+}
+
+/* Element screenshot */
+.lh-element-screenshot {
+ float: left;
+ margin-right: 20px;
+}
+.lh-element-screenshot__content {
+ overflow: hidden;
+ min-width: 110px;
+ display: flex;
+ justify-content: center;
+ background-color: var(--report-background-color);
+}
+.lh-element-screenshot__image {
+ position: relative;
+ /* Set by ElementScreenshotRenderer.installFullPageScreenshotCssVariable */
+ background-image: var(--element-screenshot-url);
+ outline: 2px solid #777;
+ background-color: white;
+ background-repeat: no-repeat;
+}
+.lh-element-screenshot__mask {
+ position: absolute;
+ background: #555;
+ opacity: 0.8;
+}
+.lh-element-screenshot__element-marker {
+ position: absolute;
+ outline: 2px solid var(--color-lime-400);
+}
+.lh-element-screenshot__overlay {
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ z-index: 2000; /* .lh-topbar is 1000 */
+ background: var(--screenshot-overlay-background);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ cursor: zoom-out;
+}
+
+.lh-element-screenshot__overlay .lh-element-screenshot {
+ margin-right: 0; /* clearing margin used in thumbnail case */
+ outline: 1px solid var(--color-gray-700);
+}
+
+.lh-screenshot-overlay--enabled .lh-element-screenshot {
+ cursor: zoom-out;
+}
+.lh-screenshot-overlay--enabled .lh-node .lh-element-screenshot {
+ cursor: zoom-in;
+}
+
+
+.lh-meta__items {
+ --meta-icon-size: calc(var(--report-icon-size) * 0.667);
+ padding: var(--default-padding);
+ display: grid;
+ grid-template-columns: 1fr 1fr 1fr;
+ background-color: var(--env-item-background-color);
+ border-radius: 3px;
+ margin: 0 0 var(--default-padding) 0;
+ font-size: 12px;
+ column-gap: var(--default-padding);
+ color: var(--color-gray-700);
+}
+
+.lh-meta__item {
+ display: block;
+ list-style-type: none;
+ position: relative;
+ padding: 0 0 0 calc(var(--meta-icon-size) + var(--default-padding) * 2);
+ cursor: unset; /* disable pointer cursor from report-icon */
+}
+
+.lh-meta__item.lh-tooltip-boundary {
+ text-decoration: dotted underline var(--color-gray-500);
+ cursor: help;
+}
+
+.lh-meta__item.lh-report-icon::before {
+ position: absolute;
+ left: var(--default-padding);
+ width: var(--meta-icon-size);
+ height: var(--meta-icon-size);
+}
+
+.lh-meta__item.lh-report-icon:hover::before {
+ opacity: 0.7;
+}
+
+.lh-meta__item .lh-tooltip {
+ color: var(--color-gray-800);
+}
+
+.lh-meta__item .lh-tooltip::before {
+ right: auto; /* Set the tooltip arrow to the leftside */
+ left: 6px;
+}
+
+.lh-meta__item:hover .lh-tooltip {
+ right: auto;
+ left: 6px;
+}
+/**
+* This media query is a temporary fallback for browsers that do not support \`@container query\`.
+* TODO: remove this media query when \`@container query\` is fully supported by browsers
+* See https://github.com/GoogleChrome/lighthouse/pull/16332
+*/
+@media screen and (max-width: 640px) {
+ .lh-meta__items {
+ grid-template-columns: 1fr 1fr;
+ }
+}
+
+/* Change the grid for narrow container */
+@container lh-container (max-width: 640px) {
+ .lh-meta__items {
+ grid-template-columns: 1fr 1fr;
+ }
+}
+
+/**
+* This media query is a temporary fallback for browsers that do not support \`@container query\`.
+* TODO: remove this media query when \`@container query\` is fully supported by browsers
+* See https://github.com/GoogleChrome/lighthouse/pull/16332
+*/
+@media screen and (max-width: 535px) {
+ .lh-meta__items {
+ display: block;
+ }
+}
+
+@container lh-container (max-width: 535px) {
+ .lh-meta__items {
+ display: block;
+ }
+}
+
+/* Explodey gauge */
+
+.lh-exp-gauge-component {
+ margin-bottom: 10px;
+}
+
+.lh-exp-gauge-component circle {
+ stroke: currentcolor;
+ r: var(--radius);
+}
+
+.lh-exp-gauge-component text {
+ font-size: calc(var(--radius) * 0.2);
+}
+
+.lh-exp-gauge-component .lh-exp-gauge {
+ margin: 0 auto;
+ width: 225px;
+ stroke-width: var(--stroke-width);
+ stroke-linecap: round;
+
+ /* for better rendering perf */
+ contain: strict;
+ height: 225px;
+ will-change: transform;
+}
+.lh-exp-gauge-component .lh-exp-gauge--faded {
+ opacity: 0.1;
+}
+.lh-exp-gauge-component .lh-exp-gauge__wrapper {
+ font-family: var(--report-font-family-monospace);
+ text-align: center;
+ text-decoration: none;
+ transition: .3s;
+}
+.lh-exp-gauge-component .lh-exp-gauge__wrapper--pass {
+ color: var(--color-pass);
+}
+.lh-exp-gauge-component .lh-exp-gauge__wrapper--average {
+ color: var(--color-average);
+}
+.lh-exp-gauge-component .lh-exp-gauge__wrapper--fail {
+ color: var(--color-fail);
+}
+.lh-exp-gauge-component .state--expanded {
+ transition: color .3s;
+}
+.lh-exp-gauge-component .state--highlight {
+ color: var(--color-highlight);
+}
+.lh-exp-gauge-component .lh-exp-gauge__svg-wrapper {
+ display: flex;
+ flex-direction: column-reverse;
+}
+
+.lh-exp-gauge-component .lh-exp-gauge__label {
+ fill: var(--report-text-color);
+ font-family: var(--report-font-family);
+ font-size: 12px;
+}
+
+.lh-exp-gauge-component .lh-exp-gauge__cutout {
+ opacity: .999;
+ transition: opacity .3s;
+}
+.lh-exp-gauge-component .state--highlight .lh-exp-gauge__cutout {
+ opacity: 0;
+}
+
+.lh-exp-gauge-component .lh-exp-gauge__inner {
+ color: inherit;
+}
+.lh-exp-gauge-component .lh-exp-gauge__base {
+ fill: currentcolor;
+}
+
+
+.lh-exp-gauge-component .lh-exp-gauge__arc {
+ fill: none;
+ transition: opacity .3s;
+}
+.lh-exp-gauge-component .lh-exp-gauge__arc--metric {
+ color: var(--metric-color);
+ stroke-dashoffset: var(--metric-offset);
+ opacity: 0.3;
+}
+.lh-exp-gauge-component .lh-exp-gauge-hovertarget {
+ color: currentcolor;
+ opacity: 0.001;
+ stroke-linecap: butt;
+ stroke-width: 24;
+ /* hack. move the hover target out of the center. ideally i tweak the r instead but that rquires considerably more math. */
+ transform: scale(1.15);
+}
+.lh-exp-gauge-component .lh-exp-gauge__arc--metric.lh-exp-gauge--miniarc {
+ opacity: 0;
+ stroke-dasharray: 0 calc(var(--circle-meas) * var(--radius));
+ transition: 0s .005s;
+}
+.lh-exp-gauge-component .state--expanded .lh-exp-gauge__arc--metric.lh-exp-gauge--miniarc {
+ opacity: .999;
+ stroke-dasharray: var(--metric-array);
+ transition: 0.3s; /* calc(.005s + var(--i)*.05s); entrace animation */
+}
+.lh-exp-gauge-component .state--expanded .lh-exp-gauge__inner .lh-exp-gauge__arc {
+ opacity: 0;
+}
+
+
+.lh-exp-gauge-component .lh-exp-gauge__percentage {
+ text-anchor: middle;
+ dominant-baseline: middle;
+ opacity: .999;
+ font-size: calc(var(--radius) * 0.625);
+ transition: opacity .3s ease-in;
+}
+.lh-exp-gauge-component .state--highlight .lh-exp-gauge__percentage {
+ opacity: 0;
+}
+
+.lh-exp-gauge-component .lh-exp-gauge__wrapper--fail .lh-exp-gauge__percentage {
+ fill: var(--color-fail);
+}
+.lh-exp-gauge-component .lh-exp-gauge__wrapper--average .lh-exp-gauge__percentage {
+ fill: var(--color-average);
+}
+.lh-exp-gauge-component .lh-exp-gauge__wrapper--pass .lh-exp-gauge__percentage {
+ fill: var(--color-pass);
+}
+
+.lh-exp-gauge-component .lh-cover {
+ fill: none;
+ opacity: .001;
+ pointer-events: none;
+}
+.lh-exp-gauge-component .state--expanded .lh-cover {
+ pointer-events: auto;
+}
+
+.lh-exp-gauge-component .metric {
+ transform: scale(var(--scale-initial));
+ opacity: 0;
+ transition: transform .1s .2s ease-out, opacity .3s ease-out;
+ pointer-events: none;
+}
+.lh-exp-gauge-component .metric text {
+ pointer-events: none;
+}
+.lh-exp-gauge-component .metric__value {
+ fill: currentcolor;
+ opacity: 0;
+ transition: opacity 0.2s;
+}
+.lh-exp-gauge-component .state--expanded .metric {
+ transform: scale(1);
+ opacity: .999;
+ transition: transform .3s ease-out, opacity .3s ease-in, stroke-width .1s ease-out;
+ transition-delay: calc(var(--i)*.05s);
+ pointer-events: auto;
+}
+.lh-exp-gauge-component .state--highlight .metric {
+ opacity: .3;
+}
+.lh-exp-gauge-component .state--highlight .metric--highlight {
+ opacity: .999;
+ stroke-width: calc(1.5*var(--stroke-width));
+}
+.lh-exp-gauge-component .state--highlight .metric--highlight .metric__value {
+ opacity: 0.999;
+}
+
+
+/*
+ the initial first load peek
+*/
+.lh-exp-gauge-component .lh-exp-gauge__bg { /* needed for the use zindex stacking w/ transparency */
+ fill: var(--report-background-color);
+ stroke: var(--report-background-color);
+}
+.lh-exp-gauge-component .state--peek .metric {
+ transition-delay: 0ms;
+ animation: peek var(--peek-dur) cubic-bezier(0.46, 0.03, 0.52, 0.96);
+ animation-fill-mode: forwards;
+}
+.lh-exp-gauge-component .state--peek .lh-exp-gauge__inner .lh-exp-gauge__arc {
+ opacity: 1;
+}
+.lh-exp-gauge-component .state--peek .lh-exp-gauge__arc.lh-exp-gauge--faded {
+ opacity: 0.3; /* just a tad stronger cuz its fighting with a big solid arg */
+}
+/* do i need to set expanded and override this? */
+.lh-exp-gauge-component .state--peek .lh-exp-gauge__arc--metric.lh-exp-gauge--miniarc {
+ transition: opacity 0.3s;
+}
+.lh-exp-gauge-component .state--peek {
+ color: unset;
+}
+.lh-exp-gauge-component .state--peek .metric__label {
+ display: none;
+}
+
+.lh-exp-gauge-component .metric__label {
+ fill: var(--report-text-color);
+}
+
+@keyframes peek {
+ /* biggest it should go is 0.92. smallest is 0.8 */
+ 0% {
+ transform: scale(0.8);
+ opacity: 0.8;
+ }
+
+ 50% {
+ transform: scale(0.92);
+ opacity: 1;
+ }
+
+ 100% {
+ transform: scale(0.8);
+ opacity: 0.8;
+ }
+}
+
+.lh-exp-gauge-component .wrapper {
+ width: 620px;
+}
+
+/*# sourceURL=report-styles.css */
+`),e.append(t),e}function dt(o){let e=o.createFragment(),t=o.createElement("style");t.append(`
+ .lh-topbar {
+ position: sticky;
+ top: 0;
+ left: 0;
+ right: 0;
+ z-index: 1000;
+ display: flex;
+ align-items: center;
+ height: var(--topbar-height);
+ padding: var(--topbar-padding);
+ font-size: var(--report-font-size-secondary);
+ background-color: var(--topbar-background-color);
+ border-bottom: 1px solid var(--color-gray-200);
+ }
+
+ .lh-topbar__logo {
+ width: var(--topbar-logo-size);
+ height: var(--topbar-logo-size);
+ user-select: none;
+ flex: none;
+ }
+
+ .lh-topbar__url {
+ margin: var(--topbar-padding);
+ text-decoration: none;
+ color: var(--report-text-color);
+ text-overflow: ellipsis;
+ overflow: hidden;
+ white-space: nowrap;
+ }
+
+ .lh-tools {
+ display: flex;
+ align-items: center;
+ margin-left: auto;
+ will-change: transform;
+ min-width: var(--report-icon-size);
+ }
+ .lh-tools__button {
+ width: var(--report-icon-size);
+ min-width: 24px;
+ height: var(--report-icon-size);
+ cursor: pointer;
+ margin-right: 5px;
+ /* This is actually a button element, but we want to style it like a transparent div. */
+ display: flex;
+ background: none;
+ color: inherit;
+ border: none;
+ padding: 0;
+ font: inherit;
+ }
+ .lh-tools__button svg {
+ fill: var(--tools-icon-color);
+ }
+ .lh-dark .lh-tools__button svg {
+ filter: invert(1);
+ }
+ .lh-tools__button.lh-active + .lh-tools__dropdown {
+ opacity: 1;
+ clip: rect(-1px, 194px, 270px, -3px);
+ visibility: visible;
+ }
+ .lh-tools__dropdown {
+ position: absolute;
+ background-color: var(--report-background-color);
+ border: 1px solid var(--report-border-color);
+ border-radius: 3px;
+ padding: calc(var(--default-padding) / 2) 0;
+ cursor: pointer;
+ top: 36px;
+ right: 0;
+ box-shadow: 1px 1px 3px #ccc;
+ min-width: 125px;
+ clip: rect(0, 164px, 0, 0);
+ visibility: hidden;
+ opacity: 0;
+ transition: all 200ms cubic-bezier(0,0,0.2,1);
+ }
+ .lh-tools__dropdown a {
+ color: currentColor;
+ text-decoration: none;
+ white-space: nowrap;
+ padding: 0 6px;
+ line-height: 2;
+ }
+ .lh-tools__dropdown a:hover,
+ .lh-tools__dropdown a:focus {
+ background-color: var(--color-gray-200);
+ outline: none;
+ }
+ /* save-gist option hidden in report. */
+ .lh-tools__dropdown a[data-action='save-gist'] {
+ display: none;
+ }
+
+ .lh-locale-selector {
+ width: 100%;
+ color: var(--report-text-color);
+ background-color: var(--locale-selector-background-color);
+ padding: 2px;
+ }
+ .lh-tools-locale {
+ display: flex;
+ align-items: center;
+ flex-direction: row-reverse;
+ }
+ .lh-tools-locale__selector-wrapper {
+ transition: opacity 0.15s;
+ opacity: 0;
+ max-width: 200px;
+ }
+ .lh-button.lh-tool-locale__button {
+ height: var(--topbar-height);
+ color: var(--tools-icon-color);
+ padding: calc(var(--default-padding) / 2);
+ }
+ .lh-tool-locale__button.lh-active + .lh-tools-locale__selector-wrapper {
+ opacity: 1;
+ clip: rect(-1px, 255px, 242px, -3px);
+ visibility: visible;
+ margin: 0 4px;
+ }
+
+ /**
+ * This media query is a temporary fallback for browsers that do not support \`@container query\`.
+ * TODO: remove this media query when \`@container query\` is fully supported by browsers
+ * See https://github.com/GoogleChrome/lighthouse/pull/16332
+ */
+ @media screen and (max-width: 964px) {
+ .lh-tools__dropdown {
+ right: 0;
+ left: initial;
+ }
+ }
+
+ @container lh-container (max-width: 964px) {
+ .lh-tools__dropdown {
+ right: 0;
+ left: initial;
+ }
+ }
+
+ @media print {
+ .lh-topbar {
+ position: static;
+ margin-left: 0;
+ }
+
+ .lh-tools__dropdown {
+ display: none;
+ }
+ }
+ `),e.append(t);let n=o.createElement("div","lh-topbar"),r=o.createElementNS("http://www.w3.org/2000/svg","svg","lh-topbar__logo");r.setAttribute("role","img"),r.setAttribute("title","Lighthouse logo"),r.setAttribute("fill","none"),r.setAttribute("xmlns","http://www.w3.org/2000/svg"),r.setAttribute("viewBox","0 0 48 48");let i=o.createElementNS("http://www.w3.org/2000/svg","path");i.setAttribute("d","m14 7 10-7 10 7v10h5v7h-5l5 24H9l5-24H9v-7h5V7Z"),i.setAttribute("fill","#F63");let a=o.createElementNS("http://www.w3.org/2000/svg","path");a.setAttribute("d","M31.561 24H14l-1.689 8.105L31.561 24ZM18.983 48H9l1.022-4.907L35.723 32.27l1.663 7.98L18.983 48Z"),a.setAttribute("fill","#FFA385");let l=o.createElementNS("http://www.w3.org/2000/svg","path");l.setAttribute("fill","#FF3"),l.setAttribute("d","M20.5 10h7v7h-7z"),r.append(" ",i," ",a," ",l," ");let s=o.createElement("a","lh-topbar__url");s.setAttribute("href",""),s.setAttribute("target","_blank"),s.setAttribute("rel","noopener");let c=o.createElement("div","lh-tools"),d=o.createElement("div","lh-tools-locale lh-hidden"),h=o.createElement("button","lh-button lh-tool-locale__button");h.setAttribute("id","lh-button__swap-locales"),h.setAttribute("title","Show Language Picker"),h.setAttribute("aria-label","Toggle language picker"),h.setAttribute("aria-haspopup","menu"),h.setAttribute("aria-expanded","false"),h.setAttribute("aria-controls","lh-tools-locale__selector-wrapper");let p=o.createElementNS("http://www.w3.org/2000/svg","svg");p.setAttribute("width","20px"),p.setAttribute("height","20px"),p.setAttribute("viewBox","0 0 24 24"),p.setAttribute("fill","currentColor");let g=o.createElementNS("http://www.w3.org/2000/svg","path");g.setAttribute("d","M0 0h24v24H0V0z"),g.setAttribute("fill","none");let b=o.createElementNS("http://www.w3.org/2000/svg","path");b.setAttribute("d","M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"),p.append(g,b),h.append(" ",p," ");let w=o.createElement("div","lh-tools-locale__selector-wrapper");w.setAttribute("id","lh-tools-locale__selector-wrapper"),w.setAttribute("role","menu"),w.setAttribute("aria-labelledby","lh-button__swap-locales"),w.setAttribute("aria-hidden","true"),w.append(" "," "),d.append(" ",h," ",w," ");let f=o.createElement("button","lh-tools__button");f.setAttribute("id","lh-tools-button"),f.setAttribute("title","Tools menu"),f.setAttribute("aria-label","Toggle report tools menu"),f.setAttribute("aria-haspopup","menu"),f.setAttribute("aria-expanded","false"),f.setAttribute("aria-controls","lh-tools-dropdown");let u=o.createElementNS("http://www.w3.org/2000/svg","svg");u.setAttribute("width","100%"),u.setAttribute("height","100%"),u.setAttribute("viewBox","0 0 24 24");let v=o.createElementNS("http://www.w3.org/2000/svg","path");v.setAttribute("d","M0 0h24v24H0z"),v.setAttribute("fill","none");let _=o.createElementNS("http://www.w3.org/2000/svg","path");_.setAttribute("d","M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"),u.append(" ",v," ",_," "),f.append(" ",u," ");let x=o.createElement("div","lh-tools__dropdown");x.setAttribute("id","lh-tools-dropdown"),x.setAttribute("role","menu"),x.setAttribute("aria-labelledby","lh-tools-button");let L=o.createElement("a","lh-report-icon lh-report-icon--print");L.setAttribute("role","menuitem"),L.setAttribute("tabindex","-1"),L.setAttribute("href","#"),L.setAttribute("data-i18n","dropdownPrintSummary"),L.setAttribute("data-action","print-summary");let C=o.createElement("a","lh-report-icon lh-report-icon--print");C.setAttribute("role","menuitem"),C.setAttribute("tabindex","-1"),C.setAttribute("href","#"),C.setAttribute("data-i18n","dropdownPrintExpanded"),C.setAttribute("data-action","print-expanded");let z=o.createElement("a","lh-report-icon lh-report-icon--copy");z.setAttribute("role","menuitem"),z.setAttribute("tabindex","-1"),z.setAttribute("href","#"),z.setAttribute("data-i18n","dropdownCopyJSON"),z.setAttribute("data-action","copy");let M=o.createElement("a","lh-report-icon lh-report-icon--download lh-hidden");M.setAttribute("role","menuitem"),M.setAttribute("tabindex","-1"),M.setAttribute("href","#"),M.setAttribute("data-i18n","dropdownSaveHTML"),M.setAttribute("data-action","save-html");let $=o.createElement("a","lh-report-icon lh-report-icon--download");$.setAttribute("role","menuitem"),$.setAttribute("tabindex","-1"),$.setAttribute("href","#"),$.setAttribute("data-i18n","dropdownSaveJSON"),$.setAttribute("data-action","save-json");let R=o.createElement("a","lh-report-icon lh-report-icon--open");R.setAttribute("role","menuitem"),R.setAttribute("tabindex","-1"),R.setAttribute("href","#"),R.setAttribute("data-i18n","dropdownViewer"),R.setAttribute("data-action","open-viewer");let N=o.createElement("a","lh-report-icon lh-report-icon--open");N.setAttribute("role","menuitem"),N.setAttribute("tabindex","-1"),N.setAttribute("href","#"),N.setAttribute("data-i18n","dropdownSaveGist"),N.setAttribute("data-action","save-gist");let D=o.createElement("a","lh-report-icon lh-report-icon--open lh-hidden");D.setAttribute("role","menuitem"),D.setAttribute("tabindex","-1"),D.setAttribute("href","#"),D.setAttribute("data-i18n","dropdownViewUnthrottledTrace"),D.setAttribute("data-action","view-unthrottled-trace");let I=o.createElement("a","lh-report-icon lh-report-icon--dark");return I.setAttribute("role","menuitem"),I.setAttribute("tabindex","-1"),I.setAttribute("href","#"),I.setAttribute("data-i18n","dropdownDarkTheme"),I.setAttribute("data-action","toggle-dark"),x.append(" ",L," ",C," ",z," "," ",M," ",$," ",R," ",N," "," ",D," ",I," "),c.append(" ",d," ",f," ",x," "),n.append(" "," ",r," ",s," ",c," "),e.append(n),e}function ht(o){let e=o.createFragment(),t=o.createElement("div","lh-warnings lh-warnings--toplevel"),n=o.createElement("p","lh-warnings__msg"),r=o.createElement("ul");return t.append(" ",n," ",r," "),e.append(t),e}function be(o,e){switch(e){case"3pFilter":return Ge(o);case"audit":return Be(o);case"categoryHeader":return qe(o);case"chevron":return je(o);case"clump":return We(o);case"crc":return Ke(o);case"crcChain":return Ze(o);case"elementScreenshot":return Je(o);case"explodeyGauge":return Qe(o);case"footer":return Ye(o);case"fraction":return Xe(o);case"gauge":return et(o);case"heading":return tt(o);case"metric":return nt(o);case"scorescale":return rt(o);case"scoresWrapper":return ot(o);case"snippet":return it(o);case"snippetContent":return at(o);case"snippetHeader":return lt(o);case"snippetLine":return st(o);case"styles":return ct(o);case"topbar":return dt(o);case"warningsToplevel":return ht(o)}throw new Error("unexpected component: "+e)}var ee=class{constructor(e,t){this._document=e,this._lighthouseChannel="unknown",this._componentCache=new Map,this.rootEl=t}createElement(e,t){let n=this._document.createElement(e);if(t)for(let r of t.split(/\s+/))r&&n.classList.add(r);return n}createElementNS(e,t,n){let r=this._document.createElementNS(e,t);if(n)for(let i of n.split(/\s+/))i&&r.classList.add(i);return r}createSVGElement(e,t){return this._document.createElementNS("http://www.w3.org/2000/svg",e,t)}createFragment(){return this._document.createDocumentFragment()}createTextNode(e){return this._document.createTextNode(e)}createChildOf(e,t,n){let r=this.createElement(t,n);return e.append(r),r}createComponent(e){let t=this._componentCache.get(e);if(t){let r=t.cloneNode(!0);return this.findAll("style",r).forEach(i=>i.remove()),r}return t=be(this,e),this._componentCache.set(e,t),t.cloneNode(!0)}clearComponentCache(){this._componentCache.clear()}convertMarkdownLinkSnippets(e,t={}){let n=this.createElement("span");for(let r of E.splitMarkdownLink(e)){let i=r.text.includes("`")?this.convertMarkdownCodeSnippets(r.text):r.text;if(!r.isLink){n.append(i);continue}let a=new URL(r.linkHref);(["https://developers.google.com","https://web.dev","https://developer.chrome.com"].includes(a.origin)||t.alwaysAppendUtmSource)&&(a.searchParams.set("utm_source","lighthouse"),a.searchParams.set("utm_medium",this._lighthouseChannel));let s=this.createElement("a");s.rel="noopener",s.target="_blank",s.append(i),this.safelySetHref(s,a.href),n.append(s)}return n}safelySetHref(e,t){if(t=t||"",t.startsWith("#")){e.href=t;return}let n=["https:","http:"],r;try{r=new URL(t)}catch{}r&&n.includes(r.protocol)&&(e.href=r.href)}safelySetBlobHref(e,t){if(t.type!=="text/html"&&t.type!=="application/json")throw new Error("Unsupported blob type");let n=URL.createObjectURL(t);e.href=n}convertMarkdownCodeSnippets(e){let t=this.createElement("span");for(let n of E.splitMarkdownCodeSpans(e))if(n.isCode){let r=this.createElement("code");r.textContent=n.text,t.append(r)}else t.append(this._document.createTextNode(n.text));return t}setLighthouseChannel(e){this._lighthouseChannel=e}document(){return this._document}isDevTools(){return!!this._document.querySelector(".lh-devtools")}find(e,t=this.rootEl??this._document){let n=this.maybeFind(e,t);if(n===null)throw new Error(`query ${e} not found`);return n}maybeFind(e,t=this.rootEl??this._document){return t.querySelector(e)}findAll(e,t){return Array.from(t.querySelectorAll(e))}fireEventOn(e,t=this._document,n){let r=new CustomEvent(e,n?{detail:n}:void 0);t.dispatchEvent(r)}saveFile(e,t){let n=this.createElement("a");n.download=t,this.safelySetBlobHref(n,e),this._document.body.append(n),n.click(),this._document.body.removeChild(n),setTimeout(()=>URL.revokeObjectURL(n.href),500)}};var _e=0,m=class o{static i18n=null;static strings={};static reportJson=null;static apply(e){o.strings={...we,...e.providedStrings},o.i18n=e.i18n,o.reportJson=e.reportJson}static getUniqueSuffix(){return _e++}static resetUniqueSuffix(){_e=0}};var ye="data:image/jpeg;base64,";function xe(o){o.configSettings.locale||(o.configSettings.locale="en"),o.configSettings.formFactor||(o.configSettings.formFactor=o.configSettings.emulatedFormFactor),o.finalDisplayedUrl=E.getFinalDisplayedUrl(o),o.mainDocumentUrl=E.getMainDocumentUrl(o);for(let n of Object.values(o.audits))if((n.scoreDisplayMode==="not_applicable"||n.scoreDisplayMode==="not-applicable")&&(n.scoreDisplayMode="notApplicable"),n.scoreDisplayMode==="informative"&&(n.score=1),n.details){if((n.details.type===void 0||n.details.type==="diagnostic")&&(n.details.type="debugdata"),n.details.type==="filmstrip")for(let r of n.details.items)r.data.startsWith(ye)||(r.data=ye+r.data);if(n.details.type==="table")for(let r of n.details.headings){let{itemType:i,text:a}=r;i!==void 0&&(r.valueType=i,delete r.itemType),a!==void 0&&(r.label=a,delete r.text);let l=r.subItemsHeading?.itemType;r.subItemsHeading&&l!==void 0&&(r.subItemsHeading.valueType=l,delete r.subItemsHeading.itemType)}if(n.id==="third-party-summary"&&(n.details.type==="opportunity"||n.details.type==="table")){let{headings:r,items:i}=n.details;if(r[0].valueType==="link"){r[0].valueType="text";for(let a of i)typeof a.entity=="object"&&a.entity.type==="link"&&(a.entity=a.entity.text);n.details.isEntityGrouped=!0}}}let[e]=o.lighthouseVersion.split(".").map(Number),t=o.categories.performance;if(t){if(e<9){o.categoryGroups||(o.categoryGroups={}),o.categoryGroups.hidden={title:""};for(let n of t.auditRefs)n.group?n.group==="load-opportunities"&&(n.group="diagnostics"):n.group="hidden"}else if(e<12)for(let n of t.auditRefs)n.group||(n.group="diagnostics")}if(e<12&&t){let n=new Map;for(let r of t.auditRefs){let i=r.relevantAudits;if(!(!i||!r.acronym))for(let a of i){let l=n.get(a)||[];l.push(r.acronym),n.set(a,l)}}for(let[r,i]of n){if(!i.length)continue;let a=o.audits[r];if(a&&!a.metricSavings){a.metricSavings={};for(let l of i)a.metricSavings[l]=0}}}if(o.environment||(o.environment={benchmarkIndex:0,networkUserAgent:o.userAgent,hostUserAgent:o.userAgent}),o.configSettings.screenEmulation||(o.configSettings.screenEmulation={width:-1,height:-1,deviceScaleFactor:-1,mobile:/mobile/i.test(o.environment.hostUserAgent),disabled:!1}),o.i18n||(o.i18n={}),o.audits["full-page-screenshot"]){let n=o.audits["full-page-screenshot"].details;n?o.fullPageScreenshot={screenshot:n.screenshot,nodes:n.nodes}:o.fullPageScreenshot=null,delete o.audits["full-page-screenshot"]}}var O=E.RATINGS,k=class o{static prepareReportResult(e){let t=JSON.parse(JSON.stringify(e));xe(t);for(let r of Object.values(t.audits))r.details&&(r.details.type==="opportunity"||r.details.type==="table")&&!r.details.isEntityGrouped&&t.entities&&o.classifyEntities(t.entities,r.details);if(typeof t.categories!="object")throw new Error("No categories provided.");let n=new Map;for(let r of Object.values(t.categories))r.auditRefs.forEach(i=>{i.acronym&&n.set(i.acronym,i)}),r.auditRefs.forEach(i=>{let a=t.audits[i.id];i.result=a;let l=Object.keys(i.result.metricSavings||{});if(l.length){i.relevantMetrics=[];for(let s of l){let c=n.get(s);c&&i.relevantMetrics.push(c)}}if(t.stackPacks){let s=[i.id,...i.result.replacesAudits??[]];t.stackPacks.forEach(c=>{let d=s.find(h=>c.descriptions[h]);d&&c.descriptions[d]&&(i.stackPacks=i.stackPacks||[],i.stackPacks.push({title:c.title,iconDataURL:c.iconDataURL,description:c.descriptions[d]}))})}});return t}static getUrlLocatorFn(e){let t=e.find(r=>r.valueType==="url")?.key;if(t&&typeof t=="string")return r=>{let i=r[t];if(typeof i=="string")return i};let n=e.find(r=>r.valueType==="source-location")?.key;if(n)return r=>{let i=r[n];if(typeof i=="object"&&i.type==="source-location")return i.url}}static classifyEntities(e,t){let{items:n,headings:r}=t;if(!n.length||n.some(a=>a.entity))return;let i=o.getUrlLocatorFn(r);if(i)for(let a of n){let l=i(a);if(!l)continue;let s="";try{s=E.parseURL(l).origin}catch{}if(!s)continue;let c=e.find(d=>d.origins.includes(s));c&&(a.entity=c.name)}}static getTableItemSortComparator(e){return(t,n)=>{for(let r of e){let i=t[r],a=n[r];if((typeof i!=typeof a||!["number","string"].includes(typeof i))&&console.warn(`Warning: Attempting to sort unsupported value type: ${r}.`),typeof i=="number"&&typeof a=="number"&&i!==a)return a-i;if(typeof i=="string"&&typeof a=="string"&&i!==a)return i.localeCompare(a)}return 0}}static getEmulationDescriptions(e){let t,n,r,i=e.throttling,a=m.i18n,l=m.strings;switch(e.throttlingMethod){case"provided":r=n=t=l.throttlingProvided;break;case"devtools":{let{cpuSlowdownMultiplier:p,requestLatencyMs:g}=i;t=`${a.formatNumber(p)}x slowdown (DevTools)`,n=`${a.formatMilliseconds(g)} HTTP RTT, ${a.formatKbps(i.downloadThroughputKbps)} down, ${a.formatKbps(i.uploadThroughputKbps)} up (DevTools)`,r=g===150*3.75&&i.downloadThroughputKbps===1.6*1024*.9&&i.uploadThroughputKbps===750*.9?l.runtimeSlow4g:l.runtimeCustom;break}case"simulate":{let{cpuSlowdownMultiplier:p,rttMs:g,throughputKbps:b}=i;t=`${a.formatNumber(p)}x slowdown (Simulated)`,n=`${a.formatMilliseconds(g)} TCP RTT, ${a.formatKbps(b)} throughput (Simulated)`,r=g===150&&b===1.6*1024?l.runtimeSlow4g:l.runtimeCustom;break}default:r=t=n=l.runtimeUnknown}let s=e.channel==="devtools"?!1:e.screenEmulation.disabled,c=e.channel==="devtools"?e.formFactor==="mobile":e.screenEmulation.mobile,d=l.runtimeMobileEmulation;s?d=l.runtimeNoEmulation:c||(d=l.runtimeDesktopEmulation);let h=s?void 0:`${e.screenEmulation.width}x${e.screenEmulation.height}, DPR ${e.screenEmulation.deviceScaleFactor}`;return{deviceEmulation:d,screenEmulation:h,cpuThrottling:t,networkThrottling:n,summary:r}}static showAsPassed(e){switch(e.scoreDisplayMode){case"manual":case"notApplicable":return!0;case"error":case"informative":return!1;case"numeric":case"binary":default:return Number(e.score)>=O.PASS.minScore}}static calculateRating(e,t){if(t==="manual"||t==="notApplicable")return O.PASS.label;if(t==="error")return O.ERROR.label;if(e===null)return O.FAIL.label;let n=O.FAIL.label;return e>=O.PASS.minScore?n=O.PASS.label:e>=O.AVERAGE.minScore&&(n=O.AVERAGE.label),n}static calculateCategoryFraction(e){let t=0,n=0,r=0,i=0;for(let a of e.auditRefs){let l=o.showAsPassed(a.result);if(!(a.group==="hidden"||a.result.scoreDisplayMode==="manual"||a.result.scoreDisplayMode==="notApplicable")){if(a.result.scoreDisplayMode==="informative"){l||++r;continue}++t,i+=a.weight,l&&n++}}return{numPassed:n,numPassableAudits:t,numInformative:r,totalWeight:i}}static isPluginCategory(e){return e.startsWith("lighthouse-plugin-")}static shouldDisplayAsFraction(e,t){return e==="timespan"||e==="snapshot"||t?.categoryScoreDisplayMode==="fraction"}},we={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.",calculatorLink:"See calculator.",showRelevantAudits:"Show audits relevant to:",opportunityResourceColumnLabel:"Opportunity",opportunitySavingsColumnLabel:"Estimated Savings",errorMissingAuditInfo:"Report error: no audit information",errorLabel:"Error!",warningHeader:"Warnings: ",warningAuditsGroupTitle:"Passed audits but with warnings",passedAuditsGroupTitle:"Passed audits",notApplicableAuditsGroupTitle:"Not applicable",manualAuditsGroupTitle:"Additional items to manually check",toplevelWarningsMessage:"There were issues affecting this run of Lighthouse:",crcInitialNavigation:"Initial Navigation",crcLongestDurationLabel:"Maximum critical path latency:",snippetExpandButtonLabel:"Expand snippet",snippetCollapseButtonLabel:"Collapse snippet",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.",labDataTitle:"Lab Data",thirdPartyResourcesLabel:"Show 3rd-party resources",viewTreemapLabel:"View Treemap",viewTraceLabel:"View Trace",dropdownPrintSummary:"Print Summary",dropdownPrintExpanded:"Print Expanded",dropdownCopyJSON:"Copy JSON",dropdownSaveHTML:"Save as HTML",dropdownSaveJSON:"Save as JSON",dropdownViewer:"Open in Viewer",dropdownSaveGist:"Save as Gist",dropdownDarkTheme:"Toggle Dark Theme",dropdownViewUnthrottledTrace:"View Unthrottled Trace",runtimeSettingsDevice:"Device",runtimeSettingsNetworkThrottling:"Network throttling",runtimeSettingsCPUThrottling:"CPU throttling",runtimeSettingsUANetwork:"User agent (network)",runtimeSettingsBenchmark:"Unthrottled CPU/Memory Power",runtimeSettingsAxeVersion:"Axe version",runtimeSettingsScreenEmulation:"Screen emulation",footerIssue:"File an issue",runtimeNoEmulation:"No emulation",runtimeMobileEmulation:"Emulated Moto G Power",runtimeDesktopEmulation:"Emulated Desktop",runtimeUnknown:"Unknown",runtimeSingleLoad:"Single page session",runtimeAnalysisWindow:"Initial page load",runtimeAnalysisWindowTimespan:"User interactions timespan",runtimeAnalysisWindowSnapshot:"Point-in-time snapshot",runtimeSingleLoadTooltip:"This data is taken from a single page session, as opposed to field data summarizing many sessions.",throttlingProvided:"Provided by environment",show:"Show",hide:"Hide",expandView:"Expand view",collapseView:"Collapse view",runtimeSlow4g:"Slow 4G throttling",runtimeCustom:"Custom throttling",firstPartyChipLabel:"1st party",openInANewTabTooltip:"Open in a new tab",unattributable:"Unattributable",unscoredLabel:"Unscored",unscoredTitle:"This audit does not contribute to the overall category score."};var G=class{constructor(e,t){this.dom=e,this.detailsRenderer=t}get _clumpTitles(){return{warning:m.strings.warningAuditsGroupTitle,manual:m.strings.manualAuditsGroupTitle,passed:m.strings.passedAuditsGroupTitle,notApplicable:m.strings.notApplicableAuditsGroupTitle}}renderAudit(e){let t=m.strings,n=this.dom.createComponent("audit"),r=this.dom.find("div.lh-audit",n);r.id=e.result.id;let i=e.result.scoreDisplayMode;e.result.displayValue&&(this.dom.find(".lh-audit__display-text",r).textContent=e.result.displayValue);let a=this.dom.find(".lh-audit__title",r);a.append(this.dom.convertMarkdownCodeSnippets(e.result.title));let l=this.dom.find(".lh-audit__description",r);l.append(this.dom.convertMarkdownLinkSnippets(e.result.description));for(let p of e.relevantMetrics||[]){let g=this.dom.createChildOf(l,"span","lh-audit__adorn");g.title=`Relevant to ${p.result.title}`,g.textContent=p.acronym||p.id}if(e.weight===0){let p=this.dom.createChildOf(l,"span","lh-audit__adorn");p.title=m.strings.unscoredTitle,p.textContent=m.strings.unscoredLabel}e.stackPacks&&e.stackPacks.forEach(p=>{let g=this.dom.createElement("img","lh-audit__stackpack__img");g.src=p.iconDataURL,g.alt=p.title;let b=this.dom.convertMarkdownLinkSnippets(p.description,{alwaysAppendUtmSource:!0}),w=this.dom.createElement("div","lh-audit__stackpack");w.append(g,b),this.dom.find(".lh-audit__stackpacks",r).append(w)});let s=this.dom.find("details",r);if(e.result.details){let p=this.detailsRenderer.render(e.result.details);p&&(p.classList.add("lh-details"),s.append(p))}if(this.dom.find(".lh-chevron-container",r).append(this._createChevron()),this._setRatingClass(r,e.result.score,i),e.result.scoreDisplayMode==="error"){r.classList.add("lh-audit--error");let p=this.dom.find(".lh-audit__display-text",r);p.textContent=t.errorLabel,p.classList.add("lh-tooltip-boundary");let g=this.dom.createChildOf(p,"div","lh-tooltip lh-tooltip--error");g.textContent=e.result.errorMessage||t.errorMissingAuditInfo}else if(e.result.explanation){let p=this.dom.createChildOf(a,"div","lh-audit-explanation");p.textContent=e.result.explanation}let c=e.result.warnings;if(!c||c.length===0)return r;let d=this.dom.find("summary",s),h=this.dom.createChildOf(d,"div","lh-warnings");if(this.dom.createChildOf(h,"span").textContent=t.warningHeader,c.length===1)h.append(this.dom.createTextNode(c.join("")));else{let p=this.dom.createChildOf(h,"ul");for(let g of c){let b=this.dom.createChildOf(p,"li");b.textContent=g}}return r}injectFinalScreenshot(e,t,n){let r=t["final-screenshot"];if(!r||r.scoreDisplayMode==="error"||!r.details||r.details.type!=="screenshot")return null;let i=this.dom.createElement("img","lh-final-ss-image"),a=r.details.data;i.src=a,i.alt=r.title;let l=this.dom.find(".lh-category .lh-category-header",e),s=this.dom.createElement("div","lh-category-headercol"),c=this.dom.createElement("div","lh-category-headercol lh-category-headercol--separator"),d=this.dom.createElement("div","lh-category-headercol");s.append(...l.childNodes),s.append(n),d.append(i),l.append(s,c,d),l.classList.add("lh-category-header__finalscreenshot")}_createChevron(){let e=this.dom.createComponent("chevron");return this.dom.find("svg.lh-chevron",e)}_setRatingClass(e,t,n){let r=k.calculateRating(t,n);return e.classList.add(`lh-audit--${n.toLowerCase()}`),n!=="informative"&&e.classList.add(`lh-audit--${r}`),e}renderCategoryHeader(e,t,n){let r=this.dom.createComponent("categoryHeader"),i=this.dom.find(".lh-score__gauge",r),a=this.renderCategoryScore(e,t,n);if(i.append(a),e.description){let l=this.dom.convertMarkdownLinkSnippets(e.description);this.dom.find(".lh-category-header__description",r).append(l)}return r}renderAuditGroup(e){let t=this.dom.createElement("div","lh-audit-group"),n=this.dom.createElement("div","lh-audit-group__header");this.dom.createChildOf(n,"span","lh-audit-group__title").textContent=e.title,t.append(n);let r=null;return e.description&&(r=this.dom.convertMarkdownLinkSnippets(e.description),r.classList.add("lh-audit-group__description","lh-audit-group__footer"),t.append(r)),[t,r]}_renderGroupedAudits(e,t){let n=new Map,r="NotAGroup";n.set(r,[]);for(let a of e){let l=a.group||r,s=n.get(l)||[];s.push(a),n.set(l,s)}let i=[];for(let[a,l]of n){if(a===r){for(let h of l)i.push(this.renderAudit(h));continue}let s=t[a],[c,d]=this.renderAuditGroup(s);for(let h of l)c.insertBefore(this.renderAudit(h),d);c.classList.add(`lh-audit-group--${a}`),i.push(c)}return i}renderUnexpandableClump(e,t){let n=this.dom.createElement("div");return this._renderGroupedAudits(e,t).forEach(i=>n.append(i)),n}renderClump(e,{auditRefsOrEls:t,description:n,openByDefault:r}){let i=this.dom.createComponent("clump"),a=this.dom.find(".lh-clump",i);r&&a.setAttribute("open","");let l=this.dom.find(".lh-audit-group__header",a),s=this._clumpTitles[e];this.dom.find(".lh-audit-group__title",l).textContent=s;let c=this.dom.find(".lh-audit-group__itemcount",a);c.textContent=`(${t.length})`;let d=t.map(p=>p instanceof HTMLElement?p:this.renderAudit(p));a.append(...d);let h=this.dom.find(".lh-audit-group",i);if(n){let p=this.dom.convertMarkdownLinkSnippets(n);p.classList.add("lh-audit-group__description","lh-audit-group__footer"),h.append(p)}return this.dom.find(".lh-clump-toggletext--show",h).textContent=m.strings.show,this.dom.find(".lh-clump-toggletext--hide",h).textContent=m.strings.hide,a.classList.add(`lh-clump--${e.toLowerCase()}`),h}renderCategoryScore(e,t,n){let r;if(n&&k.shouldDisplayAsFraction(n.gatherMode,e)?r=this.renderCategoryFraction(e):r=this.renderScoreGauge(e,t),n?.omitLabel&&this.dom.find(".lh-gauge__label,.lh-fraction__label",r).remove(),n?.onPageAnchorRendered){let i=this.dom.find("a",r);n.onPageAnchorRendered(i)}return r}renderScoreGauge(e,t){let n=this.dom.createComponent("gauge"),r=this.dom.find("a.lh-gauge__wrapper",n);k.isPluginCategory(e.id)&&r.classList.add("lh-gauge__wrapper--plugin");let i=Number(e.score),a=this.dom.find(".lh-gauge",n),l=this.dom.find("circle.lh-gauge-arc",a);l&&this._setGaugeArc(l,i);let s=Math.round(i*100),c=this.dom.find("div.lh-gauge__percentage",n);return c.textContent=s.toString(),e.score===null&&(c.classList.add("lh-gauge--error"),c.textContent="",c.title=m.strings.errorLabel),e.auditRefs.length===0||this.hasApplicableAudits(e)?r.classList.add(`lh-gauge__wrapper--${k.calculateRating(e.score)}`):(r.classList.add("lh-gauge__wrapper--not-applicable"),c.textContent="-",c.title=m.strings.notApplicableAuditsGroupTitle),this.dom.find(".lh-gauge__label",n).textContent=e.title,n}renderCategoryFraction(e){let t=this.dom.createComponent("fraction"),n=this.dom.find("a.lh-fraction__wrapper",t),{numPassed:r,numPassableAudits:i,totalWeight:a}=k.calculateCategoryFraction(e),l=r/i,s=this.dom.find(".lh-fraction__content",t),c=this.dom.createElement("span");c.textContent=`${r}/${i}`,s.append(c);let d=k.calculateRating(l);return a===0&&(d="null"),n.classList.add(`lh-fraction__wrapper--${d}`),this.dom.find(".lh-fraction__label",t).textContent=e.title,t}hasApplicableAudits(e){return e.auditRefs.some(t=>t.result.scoreDisplayMode!=="notApplicable")}_setGaugeArc(e,t){let n=2*Math.PI*Number(e.getAttribute("r")),r=Number(e.getAttribute("stroke-width")),i=.25*r/n;e.style.transform=`rotate(${-90+i*360}deg)`;let a=t*n-r/2;t===0&&(e.style.opacity="0"),t===1&&(a=n),e.style.strokeDasharray=`${Math.max(a,0)} ${n}`}_auditHasWarning(e){return!!e.result.warnings?.length}_getClumpIdForAuditRef(e){let t=e.result.scoreDisplayMode;return t==="manual"||t==="notApplicable"?t:k.showAsPassed(e.result)?this._auditHasWarning(e)?"warning":"passed":"failed"}render(e,t={},n){let r=this.dom.createElement("div","lh-category");r.id=e.id,r.append(this.renderCategoryHeader(e,t,n));let i=new Map;i.set("failed",[]),i.set("warning",[]),i.set("manual",[]),i.set("passed",[]),i.set("notApplicable",[]);for(let l of e.auditRefs){if(l.group==="hidden")continue;let s=this._getClumpIdForAuditRef(l),c=i.get(s);c.push(l),i.set(s,c)}for(let l of i.values())l.sort((s,c)=>c.weight-s.weight);let a=i.get("failed")?.length;for(let[l,s]of i){if(s.length===0)continue;if(l==="failed"){let p=this.renderUnexpandableClump(s,t);p.classList.add("lh-clump--failed"),r.append(p);continue}let c=l==="manual"?e.manualDescription:void 0,d=l==="warning"||l==="manual"&&a===0,h=this.renderClump(l,{auditRefsOrEls:s,description:c,openByDefault:d});r.append(h)}return r}};var Y=class{static createSegment(e,t,n,r){let i=e[t],a=Object.keys(e),l=a.indexOf(t)===a.length-1,s=!!i.children&&Object.keys(i.children).length>0,c=Array.isArray(n)?n.slice(0):[];return typeof r<"u"&&c.push(!r),{node:i,isLastChild:l,hasChildren:s,treeMarkers:c}}static createChainNode(e,t,n){let r=e.createComponent("crcChain"),i,a,l,s,c;"request"in t.node?(a=t.node.request.transferSize,l=t.node.request.url,i=(t.node.request.endTime-t.node.request.startTime)*1e3,s=!1):(a=t.node.transferSize,l=t.node.url,i=t.node.navStartToEndTime,s=!0,c=t.node.isLongest);let d=e.find(".lh-crc-node",r);d.setAttribute("title",l),c&&d.classList.add("lh-crc-node__longest");let h=e.find(".lh-crc-node__tree-marker",r);t.treeMarkers.forEach(f=>{let u=f?"lh-tree-marker lh-vert":"lh-tree-marker";h.append(e.createElement("span",u),e.createElement("span","lh-tree-marker"))});let p=t.isLastChild?"lh-tree-marker lh-up-right":"lh-tree-marker lh-vert-right",g=t.hasChildren?"lh-tree-marker lh-horiz-down":"lh-tree-marker lh-right";h.append(e.createElement("span",p),e.createElement("span","lh-tree-marker lh-right"),e.createElement("span",g));let b=n.renderTextURL(l),w=e.find(".lh-crc-node__tree-value",r);if(w.append(b),!t.hasChildren||s){let f=e.createElement("span","lh-crc-node__chain-duration");f.textContent=" - "+m.i18n.formatMilliseconds(i)+", ";let u=e.createElement("span","lh-crc-node__chain-size");u.textContent=m.i18n.formatBytesToKiB(a,.01),w.append(f,u)}return r}static buildTree(e,t,n,r){if(n.append(Q.createChainNode(e,t,r)),t.node.children)for(let i of Object.keys(t.node.children)){let a=Q.createSegment(t.node.children,i,t.treeMarkers,t.isLastChild);Q.buildTree(e,a,n,r)}}static render(e,t,n){let r=e.createComponent("crc"),i=e.find(".lh-crc",r);e.find(".lh-crc-initial-nav",r).textContent=m.strings.crcInitialNavigation,e.find(".lh-crc__longest_duration_label",r).textContent=m.strings.crcLongestDurationLabel,e.find(".lh-crc__longest_duration",r).textContent=m.i18n.formatMilliseconds(t.longestChain.duration);let a=t.chains;for(let l of Object.keys(a)){let s=Q.createSegment(a,l);Q.buildTree(e,s,i,n)}return e.find(".lh-crc-container",r)}},Q=Y;function pt(o,e){return e.left<=o.width&&0<=e.right&&e.top<=o.height&&0<=e.bottom}function ke(o,e,t){return o<e?e:o>t?t:o}function ut(o){return{x:o.left+o.width/2,y:o.top+o.height/2}}var V=class o{static getScreenshotPositions(e,t,n){let r=ut(e),i=ke(r.x-t.width/2,0,n.width-t.width),a=ke(r.y-t.height/2,0,n.height-t.height);return{screenshot:{left:i,top:a},clip:{left:e.left-i,top:e.top-a}}}static renderClipPathInScreenshot(e,t,n,r,i){let a=e.find("clipPath",t),l=`clip-${m.getUniqueSuffix()}`;a.id=l,t.style.clipPath=`url(#${l})`;let s=n.top/i.height,c=s+r.height/i.height,d=n.left/i.width,h=d+r.width/i.width,p=[`0,0 1,0 1,${s} 0,${s}`,`0,${c} 1,${c} 1,1 0,1`,`0,${s} ${d},${s} ${d},${c} 0,${c}`,`${h},${s} 1,${s} 1,${c} ${h},${c}`];for(let g of p){let b=e.createElementNS("http://www.w3.org/2000/svg","polygon");b.setAttribute("points",g),a.append(b)}}static installFullPageScreenshot(e,t){e.style.setProperty("--element-screenshot-url",`url('${t.data}')`)}static installOverlayFeature(e){let{dom:t,rootEl:n,overlayContainerEl:r,fullPageScreenshot:i}=e,a="lh-screenshot-overlay--enabled";n.classList.contains(a)||(n.classList.add(a),n.addEventListener("click",l=>{let s=l.target;if(!s)return;let c=s.closest(".lh-node > .lh-element-screenshot");if(!c)return;let d=t.createElement("div","lh-element-screenshot__overlay");r.append(d);let h={width:d.clientWidth*.95,height:d.clientHeight*.8},p={width:Number(c.dataset.rectWidth),height:Number(c.dataset.rectHeight),left:Number(c.dataset.rectLeft),right:Number(c.dataset.rectLeft)+Number(c.dataset.rectWidth),top:Number(c.dataset.rectTop),bottom:Number(c.dataset.rectTop)+Number(c.dataset.rectHeight)},g=o.render(t,i.screenshot,p,h);if(!g){d.remove();return}d.append(g),d.addEventListener("click",()=>d.remove())}))}static _computeZoomFactor(e,t){let r={x:t.width/e.width,y:t.height/e.height},i=.75*Math.min(r.x,r.y);return Math.min(1,i)}static render(e,t,n,r){if(!pt(t,n))return null;let i=e.createComponent("elementScreenshot"),a=e.find("div.lh-element-screenshot",i);a.dataset.rectWidth=n.width.toString(),a.dataset.rectHeight=n.height.toString(),a.dataset.rectLeft=n.left.toString(),a.dataset.rectTop=n.top.toString();let l=this._computeZoomFactor(n,r),s={width:r.width/l,height:r.height/l};s.width=Math.min(t.width,s.width),s.height=Math.min(t.height,s.height);let c={width:s.width*l,height:s.height*l},d=o.getScreenshotPositions(n,s,{width:t.width,height:t.height}),h=e.find("div.lh-element-screenshot__image",a);h.style.width=c.width+"px",h.style.height=c.height+"px",h.style.backgroundPositionY=-(d.screenshot.top*l)+"px",h.style.backgroundPositionX=-(d.screenshot.left*l)+"px",h.style.backgroundSize=`${t.width*l}px ${t.height*l}px`;let p=e.find("div.lh-element-screenshot__element-marker",a);p.style.width=n.width*l+"px",p.style.height=n.height*l+"px",p.style.left=d.clip.left*l+"px",p.style.top=d.clip.top*l+"px";let g=e.find("div.lh-element-screenshot__mask",a);return g.style.width=c.width+"px",g.style.height=c.height+"px",o.renderClipPathInScreenshot(e,g,d.clip,n,s),a}};var gt=["http://","https://","data:"],mt=["bytes","numeric","ms","timespanMs"],X=class{constructor(e,t={}){this._dom=e,this._fullPageScreenshot=t.fullPageScreenshot,this._entities=t.entities}render(e){switch(e.type){case"filmstrip":return this._renderFilmstrip(e);case"list":return this._renderList(e);case"checklist":return this._renderChecklist(e);case"table":case"opportunity":return this._renderTable(e);case"network-tree":case"criticalrequestchain":return Y.render(this._dom,e,this);case"screenshot":case"debugdata":case"treemap-data":return null;default:return this._renderUnknown(e.type,e)}}_renderBytes(e){let t=m.i18n.formatBytesToKiB(e.value,e.granularity||.1),n=this._renderText(t);return n.title=m.i18n.formatBytes(e.value),n}_renderMilliseconds(e){let t;return e.displayUnit==="duration"?t=m.i18n.formatDuration(e.value):t=m.i18n.formatMilliseconds(e.value,e.granularity||10),this._renderText(t)}renderTextURL(e){let t=e,n,r,i;try{let l=E.parseURL(t);n=l.file==="/"?l.origin:l.file,r=l.file==="/"||l.hostname===""?"":`(${l.hostname})`,i=t}catch{n=t}let a=this._dom.createElement("div","lh-text__url");if(a.append(this._renderLink({text:n,url:t})),r){let l=this._renderText(r);l.classList.add("lh-text__url-host"),a.append(l)}return i&&(a.title=t,a.dataset.url=t),a}_renderLink(e){let t=this._dom.createElement("a");if(this._dom.safelySetHref(t,e.url),!t.href){let n=this._renderText(e.text);return n.classList.add("lh-link"),n}return t.rel="noopener",t.target="_blank",t.textContent=e.text,t.classList.add("lh-link"),t}_renderText(e){let t=this._dom.createElement("div","lh-text");return t.textContent=e,t}_renderBaselineStatus(e){let t=this._dom.createElement("div","lh-baseline-status"),n=e.status;return t.classList.add(`lh-baseline-status--${n}`),t.textContent=String(e.displayString),t}_renderNumeric(e){let t=m.i18n.formatNumber(e.value,e.granularity||.1),n=this._dom.createElement("div","lh-numeric");return n.textContent=t,n}_renderThumbnail(e){let t=this._dom.createElement("img","lh-thumbnail"),n=e;return t.src=n,t.title=n,t.alt="",t}_renderUnknown(e,t){console.error(`Unknown details type: ${e}`,t);let n=this._dom.createElement("details","lh-unknown");return this._dom.createChildOf(n,"summary").textContent=`We don't know how to render audit details of type \`${e}\`. The Lighthouse version that collected this data is likely newer than the Lighthouse version of the report renderer. Expand for the raw JSON.`,this._dom.createChildOf(n,"pre").textContent=JSON.stringify(t,null,2),n}_renderTableValue(e,t){if(e==null)return null;if(typeof e=="object")switch(e.type){case"code":return this._renderCode(e.value);case"link":return this._renderLink(e);case"node":return this.renderNode(e);case"numeric":return this._renderNumeric(e);case"text":return this._renderText(e.value);case"source-location":return this.renderSourceLocation(e);case"url":return this.renderTextURL(e.value);case"baseline-status":return this._renderBaselineStatus(e);default:return this._renderUnknown(e.type,e)}switch(t.valueType){case"bytes":{let n=Number(e);return this._renderBytes({value:n,granularity:t.granularity})}case"code":{let n=String(e);return this._renderCode(n)}case"ms":{let n={value:Number(e),granularity:t.granularity,displayUnit:t.displayUnit};return this._renderMilliseconds(n)}case"numeric":{let n=Number(e);return this._renderNumeric({value:n,granularity:t.granularity})}case"text":{let n=String(e);return this._renderText(n)}case"thumbnail":{let n=String(e);return this._renderThumbnail(n)}case"timespanMs":{let n=Number(e);return this._renderMilliseconds({value:n})}case"url":{let n=String(e);return gt.some(r=>n.startsWith(r))?this.renderTextURL(n):this._renderCode(n)}default:return this._renderUnknown(t.valueType,e)}}_getDerivedSubItemsHeading(e){return e.subItemsHeading?{key:e.subItemsHeading.key||"",valueType:e.subItemsHeading.valueType||e.valueType,granularity:e.subItemsHeading.granularity||e.granularity,displayUnit:e.subItemsHeading.displayUnit||e.displayUnit,label:""}:null}_renderTableRow(e,t){let n=this._dom.createElement("tr");for(let r of t){if(!r||!r.key){this._dom.createChildOf(n,"td","lh-table-column--empty");continue}let i=e[r.key],a;if(i!=null&&(a=this._renderTableValue(i,r)),a){let l=`lh-table-column--${r.valueType}`;this._dom.createChildOf(n,"td",l).append(a)}else this._dom.createChildOf(n,"td","lh-table-column--empty")}return n}_renderTableRowsFromItem(e,t){let n=this._dom.createFragment();if(n.append(this._renderTableRow(e,t)),!e.subItems)return n;let r=t.map(this._getDerivedSubItemsHeading);if(!r.some(Boolean))return n;for(let i of e.subItems.items){let a=this._renderTableRow(i,r);a.classList.add("lh-sub-item-row"),n.append(a)}return n}_adornEntityGroupRow(e){let t=e.dataset.entity;if(!t)return;let n=this._entities?.find(i=>i.name===t);if(!n)return;let r=this._dom.find("td",e);if(n.category){let i=this._dom.createElement("span");i.classList.add("lh-audit__adorn"),i.textContent=n.category,r.append(" ",i)}if(n.isFirstParty){let i=this._dom.createElement("span");i.classList.add("lh-audit__adorn","lh-audit__adorn1p"),i.textContent=m.strings.firstPartyChipLabel,r.append(" ",i)}if(n.homepage){let i=this._dom.createElement("a");i.href=n.homepage,i.target="_blank",i.title=m.strings.openInANewTabTooltip,i.classList.add("lh-report-icon--external"),r.append(" ",i)}}_renderEntityGroupRow(e,t){let n={...t[0]};n.valueType="text";let r=[n,...t.slice(1)],i=this._dom.createFragment();return i.append(this._renderTableRow(e,r)),this._dom.find("tr",i).classList.add("lh-row--group"),i}_getEntityGroupItems(e){let{items:t,headings:n,sortedBy:r}=e;if(!t.length||e.isEntityGrouped||!t.some(d=>d.entity))return[];let i=new Set(e.skipSumming||[]),a=[];for(let d of n)!d.key||i.has(d.key)||mt.includes(d.valueType)&&a.push(d.key);let l=n[0].key;if(!l)return[];let s=new Map;for(let d of t){let h=typeof d.entity=="string"?d.entity:void 0,p=s.get(h)||{[l]:h||m.strings.unattributable,entity:h};for(let g of a)p[g]=Number(p[g]||0)+Number(d[g]||0);s.set(h,p)}let c=[...s.values()];return r&&c.sort(k.getTableItemSortComparator(r)),c}_renderTable(e){if(!e.items.length)return this._dom.createElement("span");let t=this._dom.createElement("table","lh-table"),n=this._dom.createChildOf(t,"thead"),r=this._dom.createChildOf(n,"tr");for(let l of e.headings){let c=`lh-table-column--${l.valueType||"text"}`,d=this._dom.createElement("div","lh-text");d.textContent=l.label,this._dom.createChildOf(r,"th",c).append(d)}let i=this._getEntityGroupItems(e),a=this._dom.createChildOf(t,"tbody");if(i.length)for(let l of i){let s=typeof l.entity=="string"?l.entity:void 0,c=this._renderEntityGroupRow(l,e.headings);for(let h of e.items.filter(p=>p.entity===s))c.append(this._renderTableRowsFromItem(h,e.headings));let d=this._dom.findAll("tr",c);s&&d.length&&(d.forEach(h=>h.dataset.entity=s),this._adornEntityGroupRow(d[0])),a.append(c)}else{let l=!0;for(let s of e.items){let c=this._renderTableRowsFromItem(s,e.headings),d=this._dom.findAll("tr",c),h=d[0];if(typeof s.entity=="string"&&(h.dataset.entity=s.entity),e.isEntityGrouped&&s.entity)h.classList.add("lh-row--group"),this._adornEntityGroupRow(h);else for(let p of d)p.classList.add(l?"lh-row--even":"lh-row--odd");l=!l,a.append(c)}}return t}_renderListValue(e){return e.type==="node"?this.renderNode(e):e.type==="text"?this._renderText(e.value):this.render(e)}_renderList(e){let t=this._dom.createElement("div","lh-list");return e.items.forEach(n=>{if(n.type==="list-section"){let i=this._dom.createElement("div","lh-list-section");n.title&&this._dom.createChildOf(i,"div","lh-list-section__title").append(this._dom.convertMarkdownLinkSnippets(n.title)),n.description&&this._dom.createChildOf(i,"div","lh-list-section__description").append(this._dom.convertMarkdownLinkSnippets(n.description));let a=this._renderListValue(n.value);a&&i.append(a),t.append(i);return}let r=this._renderListValue(n);r&&t.append(r)}),t}_renderChecklist(e){let t=this._dom.createElement("ul","lh-checklist");return Object.values(e.items).forEach(n=>{let r=this._dom.createChildOf(t,"li","lh-checklist-item"),i=n.value?"lh-report-plain-icon--checklist-pass":"lh-report-plain-icon--checklist-fail";this._dom.createChildOf(r,"span",`lh-report-plain-icon ${i}`).textContent=n.label}),t}renderNode(e){let t=this._dom.createElement("span","lh-node");if(e.nodeLabel){let a=this._dom.createElement("div");a.textContent=e.nodeLabel,t.append(a)}if(e.snippet){let a=this._dom.createElement("div");a.classList.add("lh-node__snippet"),a.textContent=e.snippet,t.append(a)}if(e.selector&&(t.title=e.selector),e.path&&t.setAttribute("data-path",e.path),e.selector&&t.setAttribute("data-selector",e.selector),e.snippet&&t.setAttribute("data-snippet",e.snippet),!this._fullPageScreenshot)return t;let n=e.lhId&&this._fullPageScreenshot.nodes[e.lhId];if(!n||n.width===0||n.height===0)return t;let r={width:147,height:100},i=V.render(this._dom,this._fullPageScreenshot.screenshot,n,r);return i&&t.prepend(i),t}renderSourceLocation(e){if(!e.url)return null;let t=`${e.url}:${e.line+1}:${e.column}`,n;e.original&&(n=`${e.original.file||"<unmapped>"}:${e.original.line+1}:${e.original.column}`);let r;if(e.urlProvider==="network"&&n)r=this._renderLink({url:e.url,text:n}),r.title=`maps to generated location ${t}`;else if(e.urlProvider==="network"&&!n)r=this.renderTextURL(e.url),this._dom.find(".lh-link",r).textContent+=`:${e.line+1}:${e.column}`;else if(e.urlProvider==="comment"&&n)r=this._renderText(`${n} (from source map)`),r.title=`${t} (from sourceURL)`;else if(e.urlProvider==="comment"&&!n)r=this._renderText(`${t} (from sourceURL)`);else return null;return r.classList.add("lh-source-location"),r.setAttribute("data-source-url",e.url),r.setAttribute("data-source-line",String(e.line)),r.setAttribute("data-source-column",String(e.column)),r}_renderFilmstrip(e){let t=this._dom.createElement("div","lh-filmstrip");for(let n of e.items){let r=this._dom.createChildOf(t,"div","lh-filmstrip__frame"),i=this._dom.createChildOf(r,"img","lh-filmstrip__thumbnail");i.src=n.data,i.alt="Screenshot"}return t}_renderCode(e){let t=this._dom.createElement("pre","lh-code");return t.textContent=e,t}};var te=class{constructor(e){e==="en-XA"&&(e="de"),this._locale=e,this._cachedNumberFormatters=new Map}_formatNumberWithGranularity(e,t,n={}){if(t!==void 0){let a=-Math.log10(t);Number.isInteger(a)||(console.warn(`granularity of ${t} is invalid. Using 1 instead`),t=1),t<1&&(n={...n},n.minimumFractionDigits=n.maximumFractionDigits=Math.ceil(a)),e=Math.round(e/t)*t,Object.is(e,-0)&&(e=0)}else Math.abs(e)<5e-4&&(e=0);let r,i=[n.minimumFractionDigits,n.maximumFractionDigits,n.style,n.unit,n.unitDisplay,this._locale].join("");return r=this._cachedNumberFormatters.get(i),r||(r=new Intl.NumberFormat(this._locale,n),this._cachedNumberFormatters.set(i,r)),r.format(e).replace(" ","\xA0")}formatNumber(e,t){return this._formatNumberWithGranularity(e,t)}formatInteger(e){return this._formatNumberWithGranularity(e,1)}formatPercent(e){return new Intl.NumberFormat(this._locale,{style:"percent"}).format(e)}formatBytesToKiB(e,t=void 0){return this._formatNumberWithGranularity(e/1024,t)+"\xA0KiB"}formatBytesToMiB(e,t=void 0){return this._formatNumberWithGranularity(e/1048576,t)+"\xA0MiB"}formatBytes(e,t=1){return this._formatNumberWithGranularity(e,t,{style:"unit",unit:"byte",unitDisplay:"long"})}formatBytesWithBestUnit(e,t=.1){return e>=1048576?this.formatBytesToMiB(e,t):e>=1024?this.formatBytesToKiB(e,t):this._formatNumberWithGranularity(e,t,{style:"unit",unit:"byte",unitDisplay:"narrow"})}formatKbps(e,t=void 0){return this._formatNumberWithGranularity(e,t,{style:"unit",unit:"kilobit-per-second",unitDisplay:"short"})}formatMilliseconds(e,t=void 0){return this._formatNumberWithGranularity(e,t,{style:"unit",unit:"millisecond",unitDisplay:"short"})}formatSeconds(e,t=void 0){return this._formatNumberWithGranularity(e/1e3,t,{style:"unit",unit:"second",unitDisplay:"narrow"})}formatDateTime(e){let t={month:"short",day:"numeric",year:"numeric",hour:"numeric",minute:"numeric",timeZoneName:"short"},n;try{n=new Intl.DateTimeFormat(this._locale,t)}catch{t.timeZone="UTC",n=new Intl.DateTimeFormat(this._locale,t)}return n.format(new Date(e))}formatDuration(e){let t=e/1e3;if(Math.round(t)===0)return"None";let n=[],r={day:3600*24,hour:3600,minute:60,second:1};return Object.keys(r).forEach(i=>{let a=r[i],l=Math.floor(t/a);if(l>0){t-=l*a;let s=this._formatNumberWithGranularity(l,1,{style:"unit",unit:i,unitDisplay:"narrow"});n.push(s)}}),n.join(" ")}};function Ee(o){let e=o.createComponent("explodeyGauge");return o.find(".lh-exp-gauge-component",e)}function Le(o,e,t){let n=o.find("div.lh-exp-gauge__wrapper",e);n.className="",n.classList.add("lh-exp-gauge__wrapper",`lh-exp-gauge__wrapper--${k.calculateRating(t.score)}`),vt(o,n,t)}function ft(o,e,t){t=t||o/32;let n=o/t,r=.5*t,i=n+r+t,a=2*Math.PI*n,l=Math.acos(1-.5*Math.pow(.5*t/n,2))*n,s=2*Math.PI*i,c=Math.acos(1-.5*Math.pow(.5*t/i,2))*i;return{radiusInner:n,radiusOuter:i,circumferenceInner:a,circumferenceOuter:s,getArcLength:()=>Math.max(0,Number(e*a)),getMetricArcLength:(d,h=!1)=>{let p=h?0:2*c;return Math.max(0,Number(d*s-r-p))},endDiffInner:l,endDiffOuter:c,strokeWidth:t,strokeGap:r}}function vt(o,e,t){let i=Number(t.score),{radiusInner:a,radiusOuter:l,circumferenceInner:s,circumferenceOuter:c,getArcLength:d,getMetricArcLength:h,endDiffInner:p,endDiffOuter:g,strokeWidth:b,strokeGap:w}=ft(128,i),f=o.find("svg.lh-exp-gauge",e);o.find(".lh-exp-gauge__label",f).textContent=t.title,f.setAttribute("viewBox",[-64,-64/2,128,128/2].join(" ")),f.style.setProperty("--stroke-width",`${b}px`),f.style.setProperty("--circle-meas",(2*Math.PI).toFixed(4));let u=o.find("g.lh-exp-gauge__outer",e),v=o.find("g.lh-exp-gauge__inner",e),_=o.find("circle.lh-cover",u),x=o.find("circle.lh-exp-gauge__arc",v),L=o.find("text.lh-exp-gauge__percentage",v);u.style.setProperty("--scale-initial",String(a/l)),u.style.setProperty("--radius",`${l}px`),_.style.setProperty("--radius",`${.5*(a+l)}px`),_.setAttribute("stroke-width",String(w)),f.style.setProperty("--radius",`${a}px`),x.setAttribute("stroke-dasharray",`${d()} ${(s-d()).toFixed(4)}`),x.setAttribute("stroke-dashoffset",String(.25*s-p)),L.textContent=Math.round(i*100).toString();let C=l+b,z=l-b,M=t.auditRefs.filter(y=>y.group==="metrics"&&y.weight),$=M.reduce((y,S)=>y+=S.weight,0),R=.25*c-g-.5*w,N=-.5*Math.PI;u.querySelectorAll(".metric").forEach(y=>{M.map(F=>`metric--${F.id}`).find(F=>y.classList.contains(F))||y.remove()}),M.forEach((y,S)=>{let A=y.acronym??y.id,F=!u.querySelector(`.metric--${A}`),T=o.maybeFind(`g.metric--${A}`,u)||o.createSVGElement("g"),B=o.maybeFind(`.metric--${A} circle.lh-exp-gauge--faded`,u)||o.createSVGElement("circle"),K=o.maybeFind(`.metric--${A} circle.lh-exp-gauge--miniarc`,u)||o.createSVGElement("circle"),q=o.maybeFind(`.metric--${A} circle.lh-exp-gauge-hovertarget`,u)||o.createSVGElement("circle"),P=o.maybeFind(`.metric--${A} text.metric__label`,u)||o.createSVGElement("text"),H=o.maybeFind(`.metric--${A} text.metric__value`,u)||o.createSVGElement("text");T.classList.add("metric",`metric--${A}`),B.classList.add("lh-exp-gauge__arc","lh-exp-gauge__arc--metric","lh-exp-gauge--faded"),K.classList.add("lh-exp-gauge__arc","lh-exp-gauge__arc--metric","lh-exp-gauge--miniarc"),q.classList.add("lh-exp-gauge__arc","lh-exp-gauge__arc--metric","lh-exp-gauge-hovertarget");let j=y.weight/$,de=h(j),he=y.result.score?y.result.score*j:0,pe=h(he),Pe=j*c,ue=h(j,!0),ge=k.calculateRating(y.result.score,y.result.scoreDisplayMode);T.style.setProperty("--metric-rating",ge),T.style.setProperty("--metric-color",`var(--color-${ge})`),T.style.setProperty("--metric-offset",`${R}`),T.style.setProperty("--i",S.toString()),B.setAttribute("stroke-dasharray",`${de} ${c-de}`),K.style.setProperty("--metric-array",`${pe} ${c-pe}`),q.setAttribute("stroke-dasharray",`${ue} ${c-ue-g}`),P.classList.add("metric__label"),H.classList.add("metric__value"),P.textContent=A,H.textContent=`+${Math.round(he*100)}`;let me=N+j*Math.PI,Z=Math.cos(me),J=Math.sin(me);switch(!0){case Z>0:H.setAttribute("text-anchor","end");break;case Z<0:P.setAttribute("text-anchor","end");break;case Z===0:P.setAttribute("text-anchor","middle"),H.setAttribute("text-anchor","middle");break}switch(!0){case J>0:P.setAttribute("dominant-baseline","hanging");break;case J<0:H.setAttribute("dominant-baseline","hanging");break;case J===0:P.setAttribute("dominant-baseline","middle"),H.setAttribute("dominant-baseline","middle");break}P.setAttribute("x",(C*Z).toFixed(2)),P.setAttribute("y",(C*J).toFixed(2)),H.setAttribute("x",(z*Z).toFixed(2)),H.setAttribute("y",(z*J).toFixed(2)),F&&(T.appendChild(B),T.appendChild(K),T.appendChild(q),T.appendChild(P),T.appendChild(H),u.appendChild(T)),R-=Pe,N+=j*2*Math.PI});let D=u.querySelector(".lh-exp-gauge-underhovertarget")||o.createSVGElement("circle");D.classList.add("lh-exp-gauge__arc","lh-exp-gauge__arc--metric","lh-exp-gauge-hovertarget","lh-exp-gauge-underhovertarget");let I=h(1,!0);if(D.setAttribute("stroke-dasharray",`${I} ${c-I-g}`),D.isConnected||u.prepend(D),f.dataset.listenersSetup)return;f.dataset.listenersSetup=!0,De(f),f.addEventListener("pointerover",y=>{if(y.target===f&&f.classList.contains("state--expanded")){f.classList.remove("state--expanded"),f.classList.contains("state--highlight")&&(f.classList.remove("state--highlight"),o.find(".metric--highlight",f).classList.remove("metric--highlight"));return}if(!(y.target instanceof Element))return;let S=y.target.parentNode;if(S instanceof SVGElement){if(S&&S===v){f.classList.contains("state--expanded")?f.classList.contains("state--highlight")&&(f.classList.remove("state--highlight"),o.find(".metric--highlight",f).classList.remove("metric--highlight")):f.classList.add("state--expanded");return}if(S&&S.classList&&S.classList.contains("metric")){let A=S.style.getPropertyValue("--metric-rating");if(e.style.setProperty("--color-highlight",`var(--color-${A}-secondary)`),!f.classList.contains("state--highlight"))f.classList.add("state--highlight"),S.classList.add("metric--highlight");else{let F=o.find(".metric--highlight",f);S!==F&&(F.classList.remove("metric--highlight"),S.classList.add("metric--highlight"))}}}}),f.addEventListener("mouseleave",()=>{f.classList.remove("state--highlight"),f.querySelector(".metric--highlight")?.classList.remove("metric--highlight")});async function De(y){if(await new Promise(P=>setTimeout(P,1e3)),y.classList.contains("state--expanded"))return;let S=o.find(".lh-exp-gauge__inner",y),A=`uniq-${Math.random()}`;S.setAttribute("id",A);let F=o.createSVGElement("use");F.setAttribute("href",`#${A}`),y.appendChild(F);let T=2.5;y.style.setProperty("--peek-dur",`${T}s`),y.classList.add("state--peek","state--expanded");let B=()=>{y.classList.remove("state--peek","state--expanded"),F.remove()},K=setTimeout(()=>{y.removeEventListener("mouseenter",q),B()},T*1e3*1.5);function q(){clearTimeout(K),B()}y.addEventListener("mouseenter",q,{once:!0})}}var ne=class extends G{_renderMetric(e){let t=this.dom.createComponent("metric"),n=this.dom.find(".lh-metric",t);n.id=e.result.id;let r=k.calculateRating(e.result.score,e.result.scoreDisplayMode);n.classList.add(`lh-metric--${r}`);let i=this.dom.find(".lh-metric__title",t);i.textContent=e.result.title;let a=this.dom.find(".lh-metric__value",t);a.textContent=e.result.displayValue||"";let l=this.dom.find(".lh-metric__description",t);if(l.append(this.dom.convertMarkdownLinkSnippets(e.result.description)),e.result.scoreDisplayMode==="error"){l.textContent="",a.textContent="Error!";let s=this.dom.createChildOf(l,"span");s.textContent=e.result.errorMessage||"Report error: no metric information"}else e.result.scoreDisplayMode==="notApplicable"&&(a.textContent="--");return n}_getScoringCalculatorHref(e){let t=e.filter(h=>h.group==="metrics"),n=e.find(h=>h.id==="interactive"),r=e.find(h=>h.id==="first-cpu-idle"),i=e.find(h=>h.id==="first-meaningful-paint");n&&t.push(n),r&&t.push(r),i&&typeof i.result.score=="number"&&t.push(i);let a=h=>Math.round(h*100)/100,s=[...t.map(h=>{let p;return typeof h.result.numericValue=="number"?(p=h.id==="cumulative-layout-shift"?a(h.result.numericValue):Math.round(h.result.numericValue),p=p.toString()):p="null",[h.acronym||h.id,p]})];m.reportJson&&(s.push(["device",m.reportJson.configSettings.formFactor]),s.push(["version",m.reportJson.lighthouseVersion]));let c=new URLSearchParams(s),d=new URL("https://googlechrome.github.io/lighthouse/scorecalc/");return d.hash=c.toString(),d.href}overallImpact(e,t){if(!e.result.metricSavings)return{overallImpact:0,overallLinearImpact:0};let n=0,r=0;for(let[i,a]of Object.entries(e.result.metricSavings)){if(a===void 0)continue;let l=t.find(g=>g.acronym===i);if(!l||l.result.score===null)continue;let s=l.result.numericValue;if(!s)continue;let c=a/s*l.weight;r+=c;let d=l.result.scoringOptions;if(!d)continue;let p=(E.computeLogNormalScore(d,s-a)-l.result.score)*l.weight;n+=p}return{overallImpact:n,overallLinearImpact:r}}render(e,t,n){let r=m.strings,i=this.dom.createElement("div","lh-category");i.id=e.id,i.append(this.renderCategoryHeader(e,t,n));let a=e.auditRefs.filter(p=>p.group==="metrics");if(a.length){let[p,g]=this.renderAuditGroup(t.metrics),b=this.dom.createElement("input","lh-metrics-toggle__input"),w=`lh-metrics-toggle${m.getUniqueSuffix()}`;b.setAttribute("aria-label","Toggle the display of metric descriptions"),b.type="checkbox",b.id=w,p.prepend(b);let f=this.dom.find(".lh-audit-group__header",p),u=this.dom.createChildOf(f,"label","lh-metrics-toggle__label");u.htmlFor=w;let v=this.dom.createChildOf(u,"span","lh-metrics-toggle__labeltext--show"),_=this.dom.createChildOf(u,"span","lh-metrics-toggle__labeltext--hide");v.textContent=m.strings.expandView,_.textContent=m.strings.collapseView;let x=this.dom.createElement("div","lh-metrics-container");if(p.insertBefore(x,g),a.forEach(L=>{x.append(this._renderMetric(L))}),i.querySelector(".lh-gauge__wrapper")){let L=this.dom.find(".lh-category-header__description",i),C=this.dom.createChildOf(L,"div","lh-metrics__disclaimer"),z=this.dom.convertMarkdownLinkSnippets(r.varianceDisclaimer);C.append(z);let M=this.dom.createChildOf(C,"a","lh-calclink");M.target="_blank",M.textContent=r.calculatorLink,this.dom.safelySetHref(M,this._getScoringCalculatorHref(e.auditRefs))}p.classList.add("lh-audit-group--metrics"),i.append(p)}let l=this.dom.createChildOf(i,"div","lh-filmstrip-container"),c=e.auditRefs.find(p=>p.id==="screenshot-thumbnails")?.result;if(c?.details){l.id=c.id;let p=this.detailsRenderer.render(c.details);p&&l.append(p)}let d=this.renderFilterableSection(e,t,["insights","diagnostics"],a);if(d&&(d.classList.add("lh-perf-audits"),i.append(d)),(!n||n?.gatherMode==="navigation")&&e.score!==null){let p=Ee(this.dom);Le(this.dom,p,e),this.dom.find(".lh-score__gauge",i).replaceWith(p)}return i}renderFilterableSection(e,t,n,r){if(n.some(u=>!t[u]))return null;let i=this.dom.createElement("div"),a=u=>u.group??"",s=e.auditRefs.filter(u=>n.includes(a(u))).map(u=>{let{overallImpact:v,overallLinearImpact:_}=this.overallImpact(u,r),x=u.result.guidanceLevel||1,L=this.renderAudit(u);return{auditRef:u,auditEl:L,overallImpact:v,overallLinearImpact:_,guidanceLevel:x}}),c=s.filter(u=>!k.showAsPassed(u.auditRef.result)),d=s.filter(u=>k.showAsPassed(u.auditRef.result)),h={};for(let u of n){let v=this.renderAuditGroup(t[u]);v[0].classList.add(`lh-audit-group--${u}`),h[u]=v}function p(u){for(let v of s)if(u==="All")v.auditEl.hidden=!1;else{let _=v.auditRef.result.metricSavings?.[u]===void 0;v.auditEl.hidden=_}c.sort((v,_)=>{let x=v.auditRef.result.score||0,L=_.auditRef.result.score||0;if(x!==L)return x-L;if(u!=="All"){let C=v.auditRef.result.metricSavings?.[u]??-1,z=_.auditRef.result.metricSavings?.[u]??-1;if(C!==z)return z-C}return v.overallImpact!==_.overallImpact?_.overallImpact*_.guidanceLevel-v.overallImpact*v.guidanceLevel:v.overallImpact===0&&_.overallImpact===0&&v.overallLinearImpact!==_.overallLinearImpact?_.overallLinearImpact*_.guidanceLevel-v.overallLinearImpact*v.guidanceLevel:_.guidanceLevel-v.guidanceLevel});for(let v of c){if(!v.auditRef.group)continue;let _=h[a(v.auditRef)];if(!_)continue;let[x,L]=_;x.insertBefore(v.auditEl,L)}}let g=new Set;for(let u of c){let v=u.auditRef.result.metricSavings||{};for(let[_,x]of Object.entries(v))typeof x=="number"&&g.add(_)}let b=r.filter(u=>u.acronym&&g.has(u.acronym));b.length&&this.renderMetricAuditFilter(b,i,p),p("All");for(let u of n)if(c.some(v=>a(v.auditRef)===u)){let v=h[u];if(!v)continue;i.append(v[0])}if(!d.length)return i;let w={auditRefsOrEls:d.map(u=>u.auditEl),groupDefinitions:t},f=this.renderClump("passed",w);return i.append(f),i}renderMetricAuditFilter(e,t,n){let r=this.dom.createElement("div","lh-metricfilter"),i=this.dom.createChildOf(r,"span","lh-metricfilter__text");i.textContent=m.strings.showRelevantAudits;let a=[{acronym:"All",id:"All"},...e],l=m.getUniqueSuffix();for(let s of a){let c=`metric-${s.acronym}-${l}`,d=this.dom.createChildOf(r,"input","lh-metricfilter__radio");d.type="radio",d.name=`metricsfilter-${l}`,d.id=c;let h=this.dom.createChildOf(r,"label","lh-metricfilter__label");h.htmlFor=c,h.title="result"in s?s.result.title:"",h.textContent=s.acronym||s.id,s.acronym==="All"&&(d.checked=!0,h.classList.add("lh-metricfilter__label--active")),t.append(r),d.addEventListener("input",p=>{for(let b of t.querySelectorAll("label.lh-metricfilter__label"))b.classList.toggle("lh-metricfilter__label--active",b.htmlFor===c);t.classList.toggle("lh-category--filtered",s.acronym!=="All"),n(s.acronym||"All");let g=t.querySelectorAll("div.lh-audit-group, details.lh-audit-group");for(let b of g){b.hidden=!1;let w=Array.from(b.querySelectorAll("div.lh-audit")),f=!!w.length&&w.every(u=>u.hidden);b.hidden=f}})}}};var re=class{constructor(e){this._dom=e,this._opts={}}renderReport(e,t,n){if(!this._dom.rootEl&&t){console.warn("Please adopt the new report API in renderer/api.js.");let i=t.closest(".lh-root");i?this._dom.rootEl=i:(t.classList.add("lh-root","lh-vars"),this._dom.rootEl=t)}else this._dom.rootEl&&t&&(this._dom.rootEl=t);n&&(this._opts=n),this._dom.setLighthouseChannel(e.configSettings.channel||"unknown");let r=k.prepareReportResult(e);return this._dom.rootEl.textContent="",this._dom.rootEl.append(this._renderReport(r)),this._opts.occupyEntireViewport&&this._dom.rootEl.classList.add("lh-max-viewport"),this._dom.rootEl}_renderReportTopbar(e){let t=this._dom.createComponent("topbar"),n=this._dom.find("a.lh-topbar__url",t);return n.textContent=e.finalDisplayedUrl,n.title=e.finalDisplayedUrl,this._dom.safelySetHref(n,e.finalDisplayedUrl),t}_renderReportHeader(){let e=this._dom.createComponent("heading"),t=this._dom.createComponent("scoresWrapper");return this._dom.find(".lh-scores-wrapper-placeholder",e).replaceWith(t),e}_renderReportFooter(e){let t=this._dom.createComponent("footer");return this._renderMetaBlock(e,t),this._dom.find(".lh-footer__version_issue",t).textContent=m.strings.footerIssue,this._dom.find(".lh-footer__version",t).textContent=e.lighthouseVersion,t}_renderMetaBlock(e,t){let n=k.getEmulationDescriptions(e.configSettings||{}),r=e.userAgent.match(/(\w*Chrome\/[\d.]+)/),i=Array.isArray(r)?r[1].replace("/"," ").replace("Chrome","Chromium"):"Chromium",a=e.configSettings.channel,l=e.environment.benchmarkIndex.toFixed(0),s=e.environment.credits?.["axe-core"],c=[`${m.strings.runtimeSettingsBenchmark}: ${l}`,`${m.strings.runtimeSettingsCPUThrottling}: ${n.cpuThrottling}`];n.screenEmulation&&c.push(`${m.strings.runtimeSettingsScreenEmulation}: ${n.screenEmulation}`),s&&c.push(`${m.strings.runtimeSettingsAxeVersion}: ${s}`);let d=m.strings.runtimeAnalysisWindow;e.gatherMode==="timespan"?d=m.strings.runtimeAnalysisWindowTimespan:e.gatherMode==="snapshot"&&(d=m.strings.runtimeAnalysisWindowSnapshot);let h=[["date",`Captured at ${m.i18n.formatDateTime(e.fetchTime)}`],["devices",`${n.deviceEmulation} with Lighthouse ${e.lighthouseVersion}`,c.join(`
+`)],["samples-one",m.strings.runtimeSingleLoad,m.strings.runtimeSingleLoadTooltip],["stopwatch",d],["networkspeed",`${n.summary}`,`${m.strings.runtimeSettingsNetworkThrottling}: ${n.networkThrottling}`],["chrome",`Using ${i}`+(a?` with ${a}`:""),`${m.strings.runtimeSettingsUANetwork}: "${e.environment.networkUserAgent}"`]],p=this._dom.find(".lh-meta__items",t);for(let[g,b,w]of h){let f=this._dom.createChildOf(p,"li","lh-meta__item");if(f.textContent=b,w){f.classList.add("lh-tooltip-boundary");let u=this._dom.createChildOf(f,"div","lh-tooltip");u.textContent=w}f.classList.add("lh-report-icon",`lh-report-icon--${g}`)}}_renderReportWarnings(e){if(!e.runWarnings||e.runWarnings.length===0)return this._dom.createElement("div");let t=this._dom.createComponent("warningsToplevel"),n=this._dom.find(".lh-warnings__msg",t);n.textContent=m.strings.toplevelWarningsMessage;let r=[];for(let i of e.runWarnings){let a=this._dom.createElement("li");a.append(this._dom.convertMarkdownLinkSnippets(i)),r.push(a)}return this._dom.find("ul",t).append(...r),t}_renderScoreGauges(e,t,n){let r=[],i=[];for(let a of Object.values(e.categories)){let s=(n[a.id]||t).renderCategoryScore(a,e.categoryGroups||{},{gatherMode:e.gatherMode}),c=this._dom.find("a.lh-gauge__wrapper, a.lh-fraction__wrapper",s);c&&(this._dom.safelySetHref(c,`#${a.id}`),c.addEventListener("click",d=>{if(!c.matches('[href^="#"]'))return;let h=c.getAttribute("href"),p=this._dom.rootEl;if(!h||!p)return;let g=this._dom.find(h,p);d.preventDefault(),g.scrollIntoView()}),this._opts.onPageAnchorRendered?.(c)),k.isPluginCategory(a.id)?i.push(s):r.push(s)}return[...r,...i]}_renderReport(e){m.apply({providedStrings:e.i18n.rendererFormattedStrings,i18n:new te(e.configSettings.locale),reportJson:e});let t=new X(this._dom,{fullPageScreenshot:e.fullPageScreenshot??void 0,entities:e.entities}),n=new G(this._dom,t),r={performance:new ne(this._dom,t)},i=this._dom.createElement("div");i.append(this._renderReportHeader());let a=this._dom.createElement("div","lh-container"),l=this._dom.createElement("div","lh-report");l.append(this._renderReportWarnings(e));let s;Object.keys(e.categories).length===1?i.classList.add("lh-header--solo-category"):s=this._dom.createElement("div","lh-scores-header");let d=this._dom.createElement("div");if(d.classList.add("lh-scorescale-wrap"),d.append(this._dom.createComponent("scorescale")),s){let b=this._dom.find(".lh-scores-container",i);s.append(...this._renderScoreGauges(e,n,r)),b.append(s,d);let w=this._dom.createElement("div","lh-sticky-header");w.append(...this._renderScoreGauges(e,n,r)),a.append(w)}let h=this._dom.createElement("div","lh-categories");l.append(h);let p={gatherMode:e.gatherMode};for(let b of Object.values(e.categories)){let w=r[b.id]||n;w.dom.createChildOf(h,"div","lh-category-wrapper").append(w.render(b,e.categoryGroups,p))}n.injectFinalScreenshot(h,e.audits,d);let g=this._dom.createFragment();return this._opts.omitGlobalStyles||g.append(this._dom.createComponent("styles")),this._opts.omitTopbar||g.append(this._renderReportTopbar(e)),g.append(a),l.append(this._renderReportFooter(e)),a.append(i,l),e.fullPageScreenshot&&V.installFullPageScreenshot(this._dom.rootEl,e.fullPageScreenshot.screenshot),g}};function W(o,e){let t=o.rootEl;typeof e>"u"?t.classList.toggle("lh-dark"):t.classList.toggle("lh-dark",e)}var bt=typeof btoa<"u"?btoa:o=>Buffer.from(o).toString("base64"),_t=typeof atob<"u"?atob:o=>Buffer.from(o,"base64").toString();async function wt(o,e){let t=new TextEncoder().encode(o);if(e.gzip)if(typeof CompressionStream<"u"){let i=new CompressionStream("gzip"),a=i.writable.getWriter();a.write(t),a.close();let l=await new Response(i.readable).arrayBuffer();t=new Uint8Array(l)}else t=window.pako.gzip(o);let n="",r=5e3;for(let i=0;i<t.length;i+=r)n+=String.fromCharCode(...t.subarray(i,i+r));return bt(n)}function yt(o,e){let t=_t(o),n=Uint8Array.from(t,r=>r.charCodeAt(0));return e.gzip?window.pako.ungzip(n,{to:"string"}):new TextDecoder().decode(n)}var Se={toBase64:wt,fromBase64:yt};function se(){let o=window.location.host.endsWith(".vercel.app"),e=new URLSearchParams(window.location.search).has("dev");return o?`https://${window.location.host}/gh-pages`:e?"http://localhost:7333":"https://googlechrome.github.io/lighthouse"}function ce(o){let e=o.generatedTime,t=o.fetchTime||e;return`${o.lighthouseVersion}-${o.finalDisplayedUrl}-${t}`}function xt(o,e,t){let n=new URL(e).origin;window.addEventListener("message",function i(a){a.origin===n&&r&&a.data.opened&&(r.postMessage(o,n),window.removeEventListener("message",i))});let r=window.open(e,t)}async function Ce(o,e,t){let n=new URL(e),r=!!window.CompressionStream;n.hash=await Se.toBase64(JSON.stringify(o),{gzip:r}),r&&n.searchParams.set("gzip","1"),window.open(n.toString(),t)}async function Ae(o){let e="viewer-"+ce(o),t=se()+"/viewer/";await Ce({lhr:o},t,e)}async function ze(o){let e="viewer-"+ce(o),t=se()+"/viewer/";xt({lhr:o},t,e)}function Me(o){if(!o.audits["script-treemap-data"].details)throw new Error("no script treemap data found");let t={lhr:{mainDocumentUrl:o.mainDocumentUrl,finalUrl:o.finalUrl,finalDisplayedUrl:o.finalDisplayedUrl,audits:{"script-treemap-data":o.audits["script-treemap-data"]},configSettings:{locale:o.configSettings.locale}}},n=se()+"/treemap/",r="treemap-"+ce(o);Ce(t,n,r)}var oe=class{constructor(e){this._dom=e,this._toggleEl,this._menuEl,this.onDocumentKeyDown=this.onDocumentKeyDown.bind(this),this.onToggleClick=this.onToggleClick.bind(this),this.onToggleKeydown=this.onToggleKeydown.bind(this),this.onMenuFocusOut=this.onMenuFocusOut.bind(this),this.onMenuKeydown=this.onMenuKeydown.bind(this),this._getNextMenuItem=this._getNextMenuItem.bind(this),this._getNextSelectableNode=this._getNextSelectableNode.bind(this),this._getPreviousMenuItem=this._getPreviousMenuItem.bind(this)}setup(e){this._toggleEl=this._dom.find(".lh-topbar button.lh-tools__button",this._dom.rootEl),this._toggleEl.addEventListener("click",this.onToggleClick),this._toggleEl.addEventListener("keydown",this.onToggleKeydown),this._menuEl=this._dom.find(".lh-topbar div.lh-tools__dropdown",this._dom.rootEl),this._menuEl.addEventListener("keydown",this.onMenuKeydown),this._menuEl.addEventListener("click",e)}close(){this._toggleEl.classList.remove("lh-active"),this._toggleEl.setAttribute("aria-expanded","false"),this._menuEl.contains(this._dom.document().activeElement)&&this._toggleEl.focus(),this._menuEl.removeEventListener("focusout",this.onMenuFocusOut),this._dom.document().removeEventListener("keydown",this.onDocumentKeyDown)}open(e){this._toggleEl.classList.contains("lh-active")?e.focus():this._menuEl.addEventListener("transitionend",()=>{e.focus()},{once:!0}),this._toggleEl.classList.add("lh-active"),this._toggleEl.setAttribute("aria-expanded","true"),this._menuEl.addEventListener("focusout",this.onMenuFocusOut),this._dom.document().addEventListener("keydown",this.onDocumentKeyDown)}onToggleClick(e){e.preventDefault(),e.stopImmediatePropagation(),this._toggleEl.classList.contains("lh-active")?this.close():this.open(this._getNextMenuItem())}onToggleKeydown(e){switch(e.code){case"ArrowUp":e.preventDefault(),this.open(this._getPreviousMenuItem());break;case"ArrowDown":case"Enter":case" ":e.preventDefault(),this.open(this._getNextMenuItem());break;default:}}onMenuKeydown(e){let t=e.target;switch(e.code){case"ArrowUp":e.preventDefault(),this._getPreviousMenuItem(t).focus();break;case"ArrowDown":e.preventDefault(),this._getNextMenuItem(t).focus();break;case"Home":e.preventDefault(),this._getNextMenuItem().focus();break;case"End":e.preventDefault(),this._getPreviousMenuItem().focus();break;default:}}onDocumentKeyDown(e){e.keyCode===27&&this.close()}onMenuFocusOut(e){let t=e.relatedTarget;this._menuEl.contains(t)||this.close()}_getNextSelectableNode(e,t){let n=e.filter(i=>i instanceof HTMLElement).filter(i=>!(i.hasAttribute("disabled")||window.getComputedStyle(i).display==="none")),r=t?n.indexOf(t)+1:0;return r>=n.length&&(r=0),n[r]}_getNextMenuItem(e){let t=Array.from(this._menuEl.childNodes);return this._getNextSelectableNode(t,e)}_getPreviousMenuItem(e){let t=Array.from(this._menuEl.childNodes).reverse();return this._getNextSelectableNode(t,e)}};var ie=class{constructor(e,t){this.lhr,this._reportUIFeatures=e,this._dom=t,this._dropDownMenu=new oe(this._dom),this._copyAttempt=!1,this.topbarEl,this.categoriesEl,this.stickyHeaderEl,this.highlightEl,this.onDropDownMenuClick=this.onDropDownMenuClick.bind(this),this.onKeyUp=this.onKeyUp.bind(this),this.onCopy=this.onCopy.bind(this),this.collapseAllDetails=this.collapseAllDetails.bind(this)}enable(e){this.lhr=e,this._dom.rootEl.addEventListener("keyup",this.onKeyUp),this._dom.document().addEventListener("copy",this.onCopy),this._dropDownMenu.setup(this.onDropDownMenuClick),this._setUpCollapseDetailsAfterPrinting(),this._dom.find(".lh-topbar__logo",this._dom.rootEl).addEventListener("click",()=>W(this._dom)),this._setupStickyHeader()}onDropDownMenuClick(e){e.preventDefault();let t=e.target;if(!(!t||!t.hasAttribute("data-action"))){switch(t.getAttribute("data-action")){case"copy":this.onCopyButtonClick();break;case"print-summary":this.collapseAllDetails(),this._print();break;case"print-expanded":this.expandAllDetails(),this._print();break;case"save-json":{let n=JSON.stringify(this.lhr,null,2);this._reportUIFeatures._saveFile(new Blob([n],{type:"application/json"}));break}case"save-html":{let n=this._reportUIFeatures.getReportHtml();try{this._reportUIFeatures._saveFile(new Blob([n],{type:"text/html"}))}catch(r){this._dom.fireEventOn("lh-log",this._dom.document(),{cmd:"error",msg:"Could not export as HTML. "+r.message})}break}case"open-viewer":{this._dom.isDevTools()?Ae(this.lhr):ze(this.lhr);break}case"save-gist":{this._reportUIFeatures.saveAsGist();break}case"toggle-dark":{W(this._dom);break}case"view-unthrottled-trace":this._reportUIFeatures._opts.onViewTrace?.()}this._dropDownMenu.close()}}onCopy(e){this._copyAttempt&&e.clipboardData&&(e.preventDefault(),e.clipboardData.setData("text/plain",JSON.stringify(this.lhr,null,2)),this._dom.fireEventOn("lh-log",this._dom.document(),{cmd:"log",msg:"Report JSON copied to clipboard"})),this._copyAttempt=!1}onCopyButtonClick(){this._dom.fireEventOn("lh-analytics",this._dom.document(),{name:"copy"});try{this._dom.document().queryCommandSupported("copy")&&(this._copyAttempt=!0,this._dom.document().execCommand("copy")||(this._copyAttempt=!1,this._dom.fireEventOn("lh-log",this._dom.document(),{cmd:"warn",msg:"Your browser does not support copy to clipboard."})))}catch(e){this._copyAttempt=!1,this._dom.fireEventOn("lh-log",this._dom.document(),{cmd:"log",msg:e.message})}}onKeyUp(e){(e.ctrlKey||e.metaKey)&&e.keyCode===80&&this._dropDownMenu.close()}expandAllDetails(){this._dom.findAll(".lh-categories details",this._dom.rootEl).map(t=>t.open=!0)}collapseAllDetails(){this._dom.findAll(".lh-categories details",this._dom.rootEl).map(t=>t.open=!1)}_print(){this._reportUIFeatures._opts.onPrintOverride?this._reportUIFeatures._opts.onPrintOverride(this._dom.rootEl):self.print()}resetUIState(){this._dropDownMenu.close()}_getScrollParent(e){let{overflowY:t}=window.getComputedStyle(e);return t!=="visible"&&t!=="hidden"?e:e.parentElement?this._getScrollParent(e.parentElement):document}_setUpCollapseDetailsAfterPrinting(){"onbeforeprint"in self?self.addEventListener("afterprint",this.collapseAllDetails):self.matchMedia("print").addListener(t=>{t.matches?this.expandAllDetails():this.collapseAllDetails()})}_setupStickyHeader(){this.topbarEl=this._dom.find("div.lh-topbar",this._dom.rootEl),this.categoriesEl=this._dom.find("div.lh-categories",this._dom.rootEl),requestAnimationFrame(()=>requestAnimationFrame(()=>{try{this.stickyHeaderEl=this._dom.find("div.lh-sticky-header",this._dom.rootEl)}catch{return}this.highlightEl=this._dom.createChildOf(this.stickyHeaderEl,"div","lh-highlighter");let e=this._getScrollParent(this._dom.find(".lh-container",this._dom.rootEl));e.addEventListener("scroll",()=>this._updateStickyHeader());let t=e instanceof window.Document?document.documentElement:e;new window.ResizeObserver(()=>this._updateStickyHeader()).observe(t)}))}_updateStickyHeader(){if(!this.stickyHeaderEl)return;let e=this.topbarEl.getBoundingClientRect().bottom,t=this.categoriesEl.getBoundingClientRect().top,n=e>=t,i=Array.from(this._dom.rootEl.querySelectorAll(".lh-category")).filter(h=>h.getBoundingClientRect().top-window.innerHeight/2<0),a=i.length>0?i.length-1:0,l=this.stickyHeaderEl.querySelectorAll(".lh-gauge__wrapper, .lh-fraction__wrapper"),s=l[a],c=l[0].getBoundingClientRect().left,d=s.getBoundingClientRect().left-c;this.highlightEl.style.transform=`translate(${d}px)`,this.stickyHeaderEl.classList.toggle("lh-sticky-header--visible",n)}};function kt(o,e){let t=e?new Date(e):new Date,n=t.toLocaleTimeString("en-US",{hour12:!1}),r=t.toLocaleDateString("en-US",{year:"numeric",month:"2-digit",day:"2-digit"}).split("/");r.unshift(r.pop());let i=r.join("-");return`${o}_${i}_${n}`.replace(/[/?<>\\:*|"]/g,"-")}function Te(o){let e=new URL(o.finalDisplayedUrl).hostname;return kt(e,o.fetchTime)}function Et(o){return Array.from(o.tBodies[0].rows)}var ae=class{constructor(e,t={}){this.json,this._dom=e,this._opts=t,this._topbar=t.omitTopbar?null:new ie(this,e),this.onMediaQueryChange=this.onMediaQueryChange.bind(this)}initFeatures(e){this.json=e,this._fullPageScreenshot=E.getFullPageScreenshot(e),this._topbar&&(this._topbar.enable(e),this._topbar.resetUIState()),this._setupMediaQueryListeners(),this._setupThirdPartyFilter(),this._setupElementScreenshotOverlay(this._dom.rootEl);let t=this._dom.isDevTools()||this._opts.disableDarkMode||this._opts.disableAutoDarkModeAndFireworks;!t&&window.matchMedia("(prefers-color-scheme: dark)").matches&&W(this._dom,!0);let r=["performance","accessibility","best-practices","seo"].every(s=>{let c=e.categories[s];return c&&c.score===1}),i=this._opts.disableFireworks||this._opts.disableAutoDarkModeAndFireworks;if(r&&!i&&(this._enableFireworks(),t||W(this._dom,!0)),e.categories.performance&&e.categories.performance.auditRefs.some(s=>!!(s.group==="metrics"&&e.audits[s.id].errorMessage))){let s=this._dom.find("input.lh-metrics-toggle__input",this._dom.rootEl);s.checked=!0}this.json.audits["script-treemap-data"]&&this.json.audits["script-treemap-data"].details&&this.addButton({text:m.strings.viewTreemapLabel,icon:"treemap",onClick:()=>Me(this.json)}),this._opts.onViewTrace&&(e.configSettings.throttlingMethod==="simulate"?this._dom.find('a[data-action="view-unthrottled-trace"]',this._dom.rootEl).classList.remove("lh-hidden"):this.addButton({text:m.strings.viewTraceLabel,onClick:()=>this._opts.onViewTrace?.()})),this._opts.getStandaloneReportHTML&&this._dom.find('a[data-action="save-html"]',this._dom.rootEl).classList.remove("lh-hidden");for(let s of this._dom.findAll("[data-i18n]",this._dom.rootEl)){let d=s.getAttribute("data-i18n");s.textContent=m.strings[d]}}addButton(e){let t=this._dom.rootEl.querySelector(".lh-audit-group--metrics");if(!t)return;let n=t.querySelector(".lh-buttons");n||(n=this._dom.createChildOf(t,"div","lh-buttons"));let r=["lh-button"];e.icon&&(r.push("lh-report-icon"),r.push(`lh-report-icon--${e.icon}`));let i=this._dom.createChildOf(n,"button",r.join(" "));return i.textContent=e.text,i.addEventListener("click",e.onClick),i}resetUIState(){this._topbar&&this._topbar.resetUIState()}getReportHtml(){if(!this._opts.getStandaloneReportHTML)throw new Error("`getStandaloneReportHTML` is not set");return this.resetUIState(),this._opts.getStandaloneReportHTML()}saveAsGist(){throw new Error("Cannot save as gist from base report")}_enableFireworks(){this._dom.find(".lh-scores-container",this._dom.rootEl).classList.add("lh-score100")}_setupMediaQueryListeners(){let e=self.matchMedia("(max-width: 500px)");e.addListener(this.onMediaQueryChange),this.onMediaQueryChange(e)}_resetUIState(){this._topbar&&this._topbar.resetUIState()}onMediaQueryChange(e){this._dom.rootEl.classList.toggle("lh-narrow",e.matches)}_setupThirdPartyFilter(){let e=["uses-rel-preconnect","third-party-facades","network-dependency-tree-insight"],t=["legacy-javascript","legacy-javascript-insight"];Array.from(this._dom.rootEl.querySelectorAll("table.lh-table")).filter(i=>i.querySelector("td.lh-table-column--url, td.lh-table-column--source-location")).filter(i=>{let a=i.closest(".lh-audit");if(!a)throw new Error(".lh-table not within audit");return!e.includes(a.id)}).forEach(i=>{let a=Et(i),l=a.filter(f=>!f.classList.contains("lh-sub-item-row")),s=this._getThirdPartyRows(l,E.getFinalDisplayedUrl(this.json)),c=a.some(f=>f.classList.contains("lh-row--even")),d=this._dom.createComponent("3pFilter"),h=this._dom.find("input",d);h.addEventListener("change",f=>{let u=f.target instanceof HTMLInputElement&&!f.target.checked,v=!0,_=l[0];for(;_;){let x=u&&s.includes(_);do _.classList.toggle("lh-row--hidden",x),c&&(_.classList.toggle("lh-row--even",!x&&v),_.classList.toggle("lh-row--odd",!x&&!v)),_=_.nextElementSibling;while(_&&_.classList.contains("lh-sub-item-row"));x||(v=!v)}});let p=s.filter(f=>!f.classList.contains("lh-row--group")).length;this._dom.find(".lh-3p-filter-count",d).textContent=`${p}`,this._dom.find(".lh-3p-ui-string",d).textContent=m.strings.thirdPartyResourcesLabel;let g=s.length===l.length,b=!s.length;if((g||b)&&(this._dom.find("div.lh-3p-filter",d).hidden=!0),!i.parentNode)return;i.parentNode.insertBefore(d,i);let w=i.closest(".lh-audit");if(!w)throw new Error(".lh-table not within audit");t.includes(w.id)&&!g&&h.click()})}_setupElementScreenshotOverlay(e){this._fullPageScreenshot&&V.installOverlayFeature({dom:this._dom,rootEl:e,overlayContainerEl:e,fullPageScreenshot:this._fullPageScreenshot})}_getThirdPartyRows(e,t){let n=E.getEntityFromUrl(t,this.json.entities),r=this.json.entities?.find(a=>a.isFirstParty===!0)?.name,i=[];for(let a of e){if(r){if(!a.dataset.entity||a.dataset.entity===r)continue}else{let l=a.querySelector("div.lh-text__url");if(!l)continue;let s=l.dataset.url;if(!s||!(E.getEntityFromUrl(s,this.json.entities)!==n))continue}i.push(a)}return i}_saveFile(e){let t=e.type.match("json")?".json":".html",n=Te({finalDisplayedUrl:E.getFinalDisplayedUrl(this.json),fetchTime:this.json.fetchTime})+t;this._opts.onSaveFileOverride?this._opts.onSaveFileOverride(e,n):this._dom.saveFile(e,n)}};function Fe(o,e={}){let t=document.createElement("article");t.classList.add("lh-root","lh-vars");let n=new ee(t.ownerDocument,t);return new re(n).renderReport(o,t,e),new ae(n,e).initFeatures(o),t}var le=class{constructor(e){this.el=e;let t=document.createElement("style");if(t.textContent=`
+ #lh-log {
+ position: fixed;
+ background-color: #323232;
+ color: #fff;
+ min-height: 48px;
+ min-width: 288px;
+ padding: 16px 24px;
+ box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26);
+ border-radius: 2px;
+ margin: 12px;
+ font-size: 14px;
+ cursor: default;
+ transition: transform 0.3s, opacity 0.3s;
+ transform: translateY(100px);
+ opacity: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 3;
+ display: flex;
+ flex-direction: row;
+ justify-content: center;
+ align-items: center;
+ }
+
+ #lh-log.lh-show {
+ opacity: 1;
+ transform: translateY(0);
+ }
+ `,!this.el.parentNode)throw new Error("element needs to be in the DOM");this.el.parentNode.insertBefore(t,this.el),this._id=void 0}log(e,t=!0){this._id&&clearTimeout(this._id),this.el.textContent=e,this.el.classList.add("lh-show"),t&&(this._id=setTimeout(()=>{this.el.classList.remove("lh-show")},7e3))}warn(e){this.log("Warning: "+e)}error(e){this.log(e),setTimeout(()=>{throw new Error(e)},0)}hide(){this._id&&clearTimeout(this._id),this.el.classList.remove("lh-show")}};function Lt(){let o=window.__LIGHTHOUSE_JSON__,e=Fe(o,{occupyEntireViewport:!0,getStandaloneReportHTML(){return document.documentElement.outerHTML}});document.body.append(e),document.addEventListener("lh-analytics",t=>{let n=t;"gtag"in window&&window.gtag("event",n.detail.name,n.detail.data??{})}),document.addEventListener("lh-log",t=>{let n=document.querySelector("div#lh-log");if(!n)return;let r=new le(n),i=t.detail;switch(i.cmd){case"log":r.log(i.msg);break;case"warn":r.warn(i.msg);break;case"error":r.error(i.msg);break;case"hide":r.hide();break}})}window.__initLighthouseReport__=Lt;})();
+/**
+ * @license
+ * Copyright 2017 Google LLC
+ * SPDX-License-Identifier: Apache-2.0
+ */
+/**
+ * @license
+ * Copyright 2023 Google LLC
+ * SPDX-License-Identifier: Apache-2.0
+ */
+/**
+ * @license
+ * Copyright 2020 Google LLC
+ * SPDX-License-Identifier: Apache-2.0
+ */
+/**
+ * @license Copyright 2023 The Lighthouse Authors. All Rights Reserved.
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
+*/
+/**
+ * @license
+ * Copyright 2018 Google LLC
+ * SPDX-License-Identifier: Apache-2.0
+ */
+/**
+ * @license
+ * Copyright 2017 Google LLC
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Dummy text for ensuring report robustness: <\/script> pre$`post %%LIGHTHOUSE_JSON%%
+ * (this is handled by terser)
+ */
+/**
+ * @license
+ * Copyright 2021 Google LLC
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+ __initLighthouseReport__();
+ //# sourceURL=compiled-reportrenderer.js
+ </script>
+ <script>console.log('window.__LIGHTHOUSE_JSON__', __LIGHTHOUSE_JSON__);</script>
+</body>
+</html>
diff --git a/audit/report.json b/audit/report.json
new file mode 100644
index 0000000..15b7bd9
--- /dev/null
+++ b/audit/report.json
@@ -0,0 +1,6075 @@
+{
+ "lighthouseVersion": "13.1.0",
+ "requestedUrl": "https://www.studentdebtcrisis.org/",
+ "mainDocumentUrl": "https://www.studentdebtcrisis.org/",
+ "finalDisplayedUrl": "https://www.studentdebtcrisis.org/",
+ "finalUrl": "https://www.studentdebtcrisis.org/",
+ "fetchTime": "2026-04-25T14:16:29.174Z",
+ "gatherMode": "navigation",
+ "runWarnings": [],
+ "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36",
+ "environment": {
+ "hostUserAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36",
+ "benchmarkIndex": 3157.5,
+ "credits": {
+ "axe-core": "4.11.2"
+ }
+ },
+ "audits": {
+ "is-on-https": {
+ "id": "is-on-https",
+ "title": "Uses HTTPS",
+ "description": "All sites should be protected with HTTPS, even ones that don't handle sensitive data. This includes avoiding [mixed content](https://developers.google.com/web/fundamentals/security/prevent-mixed-content/what-is-mixed-content), where some resources are loaded over HTTP despite the initial request being served over HTTPS. HTTPS prevents intruders from tampering with or passively listening in on the communications between your app and your users, and is a prerequisite for HTTP/2 and many new web platform APIs. [Learn more about HTTPS](https://developer.chrome.com/docs/lighthouse/pwa/is-on-https/).",
+ "score": 1,
+ "scoreDisplayMode": "binary",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "url",
+ "valueType": "url",
+ "label": "Insecure URL"
+ },
+ {
+ "key": "resolution",
+ "valueType": "text",
+ "label": "Request Resolution"
+ }
+ ],
+ "items": []
+ }
+ },
+ "redirects-http": {
+ "id": "redirects-http",
+ "title": "Redirects HTTP traffic to HTTPS",
+ "description": "Make sure that you redirect all HTTP traffic to HTTPS in order to enable secure web features for all your users. [Learn more](https://developer.chrome.com/docs/lighthouse/pwa/redirects-http/).",
+ "score": null,
+ "scoreDisplayMode": "notApplicable"
+ },
+ "errors-in-console": {
+ "id": "errors-in-console",
+ "title": "Browser errors were logged to the console",
+ "description": "Errors logged to the console indicate unresolved problems. They can come from network request failures and other browser concerns. [Learn more about this errors in console diagnostic audit](https://developer.chrome.com/docs/lighthouse/best-practices/errors-in-console/)",
+ "score": 0,
+ "scoreDisplayMode": "binary",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "sourceLocation",
+ "valueType": "source-location",
+ "label": "Source"
+ },
+ {
+ "key": "description",
+ "valueType": "code",
+ "label": "Description"
+ }
+ ],
+ "items": [
+ {
+ "source": "network",
+ "description": "Failed to load resource: the server responded with a status of 403 ()",
+ "sourceLocation": {
+ "type": "source-location",
+ "url": "https://www.studentdebtcrisis.org/v1/bulk/report-exposures",
+ "urlProvider": "network",
+ "line": 0,
+ "column": 0
+ }
+ },
+ {
+ "source": "network",
+ "description": "Failed to load resource: the server responded with a status of 502 ()",
+ "sourceLocation": {
+ "type": "source-location",
+ "url": "https://www.studentdebtcrisis.org/_serverless/cookie-consent-settings-serverless/v1/cookie-banner-settings?languageCode=en",
+ "urlProvider": "network",
+ "line": 0,
+ "column": 0
+ }
+ }
+ ]
+ }
+ },
+ "image-aspect-ratio": {
+ "id": "image-aspect-ratio",
+ "title": "Displays images with correct aspect ratio",
+ "description": "Image display dimensions should match natural aspect ratio. [Learn more about image aspect ratio](https://developer.chrome.com/docs/lighthouse/best-practices/image-aspect-ratio/).",
+ "score": 1,
+ "scoreDisplayMode": "binary",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "node",
+ "valueType": "node",
+ "label": ""
+ },
+ {
+ "key": "url",
+ "valueType": "url",
+ "label": "URL"
+ },
+ {
+ "key": "displayedAspectRatio",
+ "valueType": "text",
+ "label": "Aspect Ratio (Displayed)"
+ },
+ {
+ "key": "actualAspectRatio",
+ "valueType": "text",
+ "label": "Aspect Ratio (Actual)"
+ }
+ ],
+ "items": []
+ }
+ },
+ "image-size-responsive": {
+ "id": "image-size-responsive",
+ "title": "Serves images with appropriate resolution",
+ "description": "Image natural dimensions should be proportional to the display size and the pixel ratio to maximize image clarity. [Learn how to provide responsive images](https://web.dev/articles/serve-responsive-images).",
+ "score": 1,
+ "scoreDisplayMode": "binary",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "node",
+ "valueType": "node",
+ "label": ""
+ },
+ {
+ "key": "url",
+ "valueType": "url",
+ "label": "URL"
+ },
+ {
+ "key": "displayedSize",
+ "valueType": "text",
+ "label": "Displayed size"
+ },
+ {
+ "key": "actualSize",
+ "valueType": "text",
+ "label": "Actual size"
+ },
+ {
+ "key": "expectedSize",
+ "valueType": "text",
+ "label": "Expected size"
+ }
+ ],
+ "items": []
+ }
+ },
+ "deprecations": {
+ "id": "deprecations",
+ "title": "Avoids deprecated APIs",
+ "description": "Deprecated APIs will eventually be removed from the browser. [Learn more about deprecated APIs](https://developer.chrome.com/docs/lighthouse/best-practices/deprecations/).",
+ "score": 1,
+ "scoreDisplayMode": "binary",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "value",
+ "valueType": "text",
+ "label": "Deprecation / Warning"
+ },
+ {
+ "key": "source",
+ "valueType": "source-location",
+ "label": "Source"
+ }
+ ],
+ "items": []
+ }
+ },
+ "third-party-cookies": {
+ "id": "third-party-cookies",
+ "title": "Uses third-party cookies",
+ "description": "Third-party cookies may be blocked in some contexts. [Learn more about preparing for third-party cookie restrictions](https://privacysandbox.google.com/cookies/prepare/overview).",
+ "score": 0,
+ "scoreDisplayMode": "binary",
+ "displayValue": "5 cookies found",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "name",
+ "valueType": "text",
+ "label": "Name"
+ },
+ {
+ "key": "url",
+ "valueType": "url",
+ "label": "URL"
+ }
+ ],
+ "items": [
+ {
+ "name": "bSession",
+ "url": "https://panorama.wixapps.net/api/v1/bulklog"
+ },
+ {
+ "name": "XSRF-TOKEN",
+ "url": "https://panorama.wixapps.net/api/v1/bulklog"
+ },
+ {
+ "name": "bSession",
+ "url": "https://panorama.wixapps.net/api/v1/bulklog"
+ },
+ {
+ "name": "AWSALBCORS",
+ "url": "https://panorama.wixapps.net/api/v1/bulklog"
+ },
+ {
+ "name": "_can2_session",
+ "url": "https://actionnetwork.org/css/style-embed-v3.css"
+ }
+ ]
+ }
+ },
+ "valid-source-maps": {
+ "id": "valid-source-maps",
+ "title": "Page has valid source maps",
+ "description": "Source maps translate minified code to the original source code. This helps developers debug in production. In addition, Lighthouse is able to provide further insights. Consider deploying source maps to take advantage of these benefits. [Learn more about source maps](https://developer.chrome.com/docs/devtools/javascript/source-maps/).",
+ "score": 1,
+ "scoreDisplayMode": "binary",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "scriptUrl",
+ "valueType": "url",
+ "subItemsHeading": {
+ "key": "error"
+ },
+ "label": "URL"
+ },
+ {
+ "key": "sourceMapUrl",
+ "valueType": "url",
+ "label": "Map URL"
+ }
+ ],
+ "items": [
+ {
+ "scriptUrl": "https://www.studentdebtcrisis.org/",
+ "sourceMapUrl": "https://www.studentdebtcrisis.org/handleAccessTokens.inline.dc220a1a.bundle.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": [
+ {
+ "error": "Error: Failed fetching source map (400)"
+ }
+ ]
+ }
+ },
+ {
+ "scriptUrl": "https://www.studentdebtcrisis.org/",
+ "sourceMapUrl": "https://www.studentdebtcrisis.org/overrideGlobals.inline.306e90d8.bundle.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": [
+ {
+ "error": "Error: Failed fetching source map (400)"
+ }
+ ]
+ }
+ },
+ {
+ "scriptUrl": "https://www.studentdebtcrisis.org/",
+ "sourceMapUrl": "https://www.studentdebtcrisis.org/sendFedopsLoadStarted.inline.1189ae2c.bundle.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": [
+ {
+ "error": "Error: Failed fetching source map (400)"
+ }
+ ]
+ }
+ },
+ {
+ "scriptUrl": "https://www.studentdebtcrisis.org/",
+ "sourceMapUrl": "https://www.studentdebtcrisis.org/webpack-runtime.5b4e16b4.bundle.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": [
+ {
+ "error": "Error: Failed fetching source map (400)"
+ }
+ ]
+ }
+ },
+ {
+ "scriptUrl": "https://www.studentdebtcrisis.org/",
+ "sourceMapUrl": "https://www.studentdebtcrisis.org/fastdom.inline.58a6f94c.bundle.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": [
+ {
+ "error": "Error: Failed fetching source map (400)"
+ }
+ ]
+ }
+ },
+ {
+ "scriptUrl": "https://www.studentdebtcrisis.org/",
+ "sourceMapUrl": "https://www.studentdebtcrisis.org/custom-element-utils.inline.dfd062cc.bundle.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": [
+ {
+ "error": "Error: Failed fetching source map (400)"
+ }
+ ]
+ }
+ },
+ {
+ "scriptUrl": "https://www.studentdebtcrisis.org/",
+ "sourceMapUrl": "https://www.studentdebtcrisis.org/initCustomElements.inline.25987d64.bundle.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": [
+ {
+ "error": "Error: Failed fetching source map (400)"
+ }
+ ]
+ }
+ },
+ {
+ "scriptUrl": "https://www.studentdebtcrisis.org/",
+ "sourceMapUrl": "https://www.studentdebtcrisis.org/externals-registry.inline.2c3a9b6e.bundle.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": [
+ {
+ "error": "Error: Failed fetching source map (400)"
+ }
+ ]
+ }
+ },
+ {
+ "scriptUrl": "https://www.studentdebtcrisis.org/",
+ "sourceMapUrl": "https://www.studentdebtcrisis.org/lazyCustomElementWrapper.inline.0a0bab45.bundle.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": [
+ {
+ "error": "Error: Failed fetching source map (400)"
+ }
+ ]
+ }
+ },
+ {
+ "scriptUrl": "https://www.studentdebtcrisis.org/",
+ "sourceMapUrl": "https://www.studentdebtcrisis.org/bi-common.inline.4cb8b6a1.bundle.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": [
+ {
+ "error": "Error: Failed fetching source map (400)"
+ }
+ ]
+ }
+ },
+ {
+ "scriptUrl": "https://www.studentdebtcrisis.org/",
+ "sourceMapUrl": "https://www.studentdebtcrisis.org/createPlatformWorker.inline.5582455f.bundle.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": [
+ {
+ "error": "Error: Failed fetching source map (400)"
+ }
+ ]
+ }
+ },
+ {
+ "scriptUrl": "https://www.studentdebtcrisis.org/",
+ "sourceMapUrl": "https://www.studentdebtcrisis.org/windowMessageRegister.inline.d8470fd7.bundle.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": [
+ {
+ "error": "Error: Failed fetching source map (400)"
+ }
+ ]
+ }
+ },
+ {
+ "scriptUrl": "https://www.studentdebtcrisis.org/",
+ "sourceMapUrl": "https://www.studentdebtcrisis.org/bi.inline.f636c49b.bundle.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": [
+ {
+ "error": "Error: Failed fetching source map (400)"
+ }
+ ]
+ }
+ },
+ {
+ "scriptUrl": "https://www.studentdebtcrisis.org/",
+ "sourceMapUrl": "https://www.studentdebtcrisis.org/sendBeat12.inline.b6bc7452.bundle.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": [
+ {
+ "error": "Error: Failed fetching source map (400)"
+ }
+ ]
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/windowScroll.b6975c2a.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/windowScroll.b6975c2a.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/usedPlatformApis.b09c4d5c.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/usedPlatformApis.b09c4d5c.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/tslib.inline.ca2949bb.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/tslib.inline.ca2949bb.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/triggersAndReactions.23ab777e.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/triggersAndReactions.23ab777e.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/TPABaseComponent.a461f98b.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/TPABaseComponent.a461f98b.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/tpa.f72183ab.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/tpa.f72183ab.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/thunderbolt-components-registry.2b110099.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/thunderbolt-components-registry.2b110099.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/thunderbolt-commons.b6ac6398.bundle.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/thunderbolt-commons.b6ac6398.bundle.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/svgLoader.dda061e2.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/svgLoader.dda061e2.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/stores.0468e03d.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/stores.0468e03d.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/ssrCache.a72bfdc3.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/ssrCache.a72bfdc3.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/speculationRules.0f29966f.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/speculationRules.0f29966f.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/siteScrollBlocker.d38ddc5a.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/siteScrollBlocker.d38ddc5a.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/siteMembersWixCodeSdk.c31eca95.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/siteMembersWixCodeSdk.c31eca95.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/siteMembers.4f6f476c.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/siteMembers.4f6f476c.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/scrollToAnchor.c63ab772.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/scrollToAnchor.c63ab772.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/routerFetch.4fed4805.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/routerFetch.4fed4805.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/router.a868afca.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/router.a868afca.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/reporter-api.b7edb858.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/reporter-api.b7edb858.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/renderer.90f3ef29.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/renderer.90f3ef29.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/quickActionBar.35dbd2c2.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/quickActionBar.35dbd2c2.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/protectedPages.9e2f0c3d.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/protectedPages.9e2f0c3d.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/popups.4f64a536.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/popups.4f64a536.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/platformPubsub.bde4edad.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/platformPubsub.bde4edad.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/platform.884c7fe8.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/platform.884c7fe8.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/panorama.1bdf1744.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/panorama.1bdf1744.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/pageAnchors.b16478c5.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/pageAnchors.b16478c5.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/ooi.5da71659.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/ooi.5da71659.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/navigation.857097f4.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/navigation.857097f4.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/mpaNavigation.a6072a7b.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/mpaNavigation.a6072a7b.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/motion.4dedec96.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/motion.4dedec96.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/mobileFullScreen.3c69b7f5.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/mobileFullScreen.3c69b7f5.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/main.a5b51f31.bundle.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/main.a5b51f31.bundle.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/imagePlaceholder.a5c38083.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/imagePlaceholder.a5c38083.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/group_9.c8b7529f.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/group_9.c8b7529f.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/group_8.8d04ec73.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/group_8.8d04ec73.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/group_7.c0d47db2.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/group_7.c0d47db2.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/group_6.8fc8a69c.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/group_6.8fc8a69c.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/group_50.c5131fce.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/group_50.c5131fce.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/group_5.19f45dc1.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/group_5.19f45dc1.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/group_41.b4a59480.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/group_41.b4a59480.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/group_4.825d1a51.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/group_4.825d1a51.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/group_38.90c9557b.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/group_38.90c9557b.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/group_30.2abbdf6f.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/group_30.2abbdf6f.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/group_3.443a1623.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/group_3.443a1623.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/group_28.98f4bda8.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/group_28.98f4bda8.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/group_27.24507aab.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/group_27.24507aab.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/group_24.ae2b90b3.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/group_24.ae2b90b3.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/group_23.572bd6dc.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/group_23.572bd6dc.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/group_22.476583c6.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/group_22.476583c6.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/group_20.1128a55d.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/group_20.1128a55d.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/group_2.2c8bde99.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/group_2.2c8bde99.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/group_14.71cad7d9.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/group_14.71cad7d9.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/group_11.e2f9d796.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/group_11.e2f9d796.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/group_0.5120b1c2.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/group_0.5120b1c2.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/externalServices.bf1ce5f4.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/externalServices.bf1ce5f4.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/environmentWixCodeSdk.dbb376f6.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/environmentWixCodeSdk.dbb376f6.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/environmentService.ce65c260.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/environmentService.ce65c260.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/environment.aa72590f.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/environment.aa72590f.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/dynamicPages.1b10d791.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/dynamicPages.1b10d791.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/domStore.4d54a74d.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/domStore.4d54a74d.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/domSelectors.0df2cf2d.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/domSelectors.0df2cf2d.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/cyclicTabbing.7085d18c.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/cyclicTabbing.7085d18c.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/consentPolicy.c7f0149b.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/consentPolicy.c7f0149b.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/componentsLoader.07f88113.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/componentsLoader.07f88113.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/businessLogger.382014f6.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/businessLogger.382014f6.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/assetsLoader.1a4bd352.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/assetsLoader.1a4bd352.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/appMonitoring.d502493c.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/appMonitoring.d502493c.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/animationsWixCodeSdk.726e9885.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/animationsWixCodeSdk.726e9885.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/animations.49c55ede.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/animations.49c55ede.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/accessibilityBrowserZoom.6895cb62.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/accessibilityBrowserZoom.6895cb62.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/accessibility.5a528201.chunk.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/wix-thunderbolt/dist/accessibility.5a528201.chunk.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/tag-manager-client/1.1028.0/siteTags.bundle.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/tag-manager-client/1.1028.0/siteTags.bundle.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/profile-card-tpa-ooi/1.2916.0/ProfileCardViewerWidgetNoCss.bundle.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/profile-card-tpa-ooi/1.2916.0/ProfileCardViewerWidgetNoCss.bundle.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[WPhoto_LiftedShadowPhoto].15573384.bundle.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[WPhoto_LiftedShadowPhoto].15573384.bundle.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[StripColumnsContainer_Default].76b92073.bundle.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[StripColumnsContainer_Default].76b92073.bundle.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[SlideShowSlide].0b8489af.bundle.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[SlideShowSlide].0b8489af.bundle.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[SlideShowContainer].aec8153a.bundle.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[SlideShowContainer].aec8153a.bundle.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[SkipToContentButton].8b0178bf.bundle.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[SkipToContentButton].8b0178bf.bundle.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[QuickActionBar_floatingSkin].76343ac3.bundle.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[QuickActionBar_floatingSkin].76343ac3.bundle.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[MeshGroup].ed33e0e4.bundle.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[MeshGroup].ed33e0e4.bundle.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[MenuContainer_Classic].3866d25e.bundle.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[MenuContainer_Classic].3866d25e.bundle.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[HtmlComponent].18b6b9b2.bundle.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[HtmlComponent].18b6b9b2.bundle.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[FiveGridLine_SolidLine].72adc7c0.bundle.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[FiveGridLine_SolidLine].72adc7c0.bundle.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[DropDownMenu_ComboBoxInputNavigation].47359326.bundle.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[DropDownMenu_ComboBoxInputNavigation].47359326.bundle.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[Container_DefaultAreaSkin].2353971d.bundle.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[Container_DefaultAreaSkin].2353971d.bundle.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[ClassicSection].7122231e.bundle.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt[ClassicSection].7122231e.bundle.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt_mobile.37766d1a.bundle.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt_mobile.37766d1a.bundle.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt_bootstrap.f95e24fd.bundle.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt_bootstrap.f95e24fd.bundle.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt_bootstrap-classic.28aa948b.bundle.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/editor-elements-library/dist/thunderbolt/rb_wixui.thunderbolt_bootstrap-classic.28aa948b.bundle.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/cookie-consent-banner-for-uou/1.819.0//app.bundle.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/cookie-consent-banner-for-uou/1.819.0//app.bundle.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://static.parastorage.com/services/communities-blog-ooi/1.3167.0/PostListViewerWidgetNoCss.bundle.min.js",
+ "sourceMapUrl": "https://static.parastorage.com/services/communities-blog-ooi/1.3167.0/PostListViewerWidgetNoCss.bundle.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ },
+ {
+ "scriptUrl": "https://browser.sentry-cdn.com/7.120.3/modulemetadata.es5.min.js",
+ "sourceMapUrl": "https://browser.sentry-cdn.com/7.120.3/modulemetadata.es5.min.js.map",
+ "subItems": {
+ "type": "subitems",
+ "items": []
+ }
+ }
+ ]
+ }
+ },
+ "csp-xss": {
+ "id": "csp-xss",
+ "title": "Ensure CSP is effective against XSS attacks",
+ "description": "A strong Content Security Policy (CSP) significantly reduces the risk of cross-site scripting (XSS) attacks. [Learn how to use a CSP to prevent XSS](https://developer.chrome.com/docs/lighthouse/best-practices/csp-xss/)",
+ "score": 1,
+ "scoreDisplayMode": "informative",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "description",
+ "valueType": "text",
+ "subItemsHeading": {
+ "key": "description"
+ },
+ "label": "Description"
+ },
+ {
+ "key": "directive",
+ "valueType": "code",
+ "subItemsHeading": {
+ "key": "directive"
+ },
+ "label": "Directive"
+ },
+ {
+ "key": "severity",
+ "valueType": "text",
+ "subItemsHeading": {
+ "key": "severity"
+ },
+ "label": "Severity"
+ }
+ ],
+ "items": [
+ {
+ "severity": "High",
+ "description": "No CSP found in enforcement mode"
+ }
+ ]
+ }
+ },
+ "has-hsts": {
+ "id": "has-hsts",
+ "title": "Use a strong HSTS policy",
+ "description": "Deployment of the HSTS header significantly reduces the risk of downgrading HTTP connections and eavesdropping attacks. A rollout in stages, starting with a low max-age is recommended. [Learn more about using a strong HSTS policy.](https://developer.chrome.com/docs/lighthouse/best-practices/has-hsts)",
+ "score": 1,
+ "scoreDisplayMode": "informative",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "description",
+ "valueType": "text",
+ "subItemsHeading": {
+ "key": "description"
+ },
+ "label": "Description"
+ },
+ {
+ "key": "directive",
+ "valueType": "code",
+ "subItemsHeading": {
+ "key": "directive"
+ },
+ "label": "Directive"
+ },
+ {
+ "key": "severity",
+ "valueType": "text",
+ "subItemsHeading": {
+ "key": "severity"
+ },
+ "label": "Severity"
+ }
+ ],
+ "items": [
+ {
+ "directive": "includeSubDomains",
+ "description": "No `includeSubDomains` directive found",
+ "severity": "Medium"
+ },
+ {
+ "directive": "preload",
+ "description": "No `preload` directive found",
+ "severity": "Medium"
+ }
+ ]
+ }
+ },
+ "origin-isolation": {
+ "id": "origin-isolation",
+ "title": "Ensure proper origin isolation with COOP",
+ "description": "The Cross-Origin-Opener-Policy (COOP) can be used to isolate the top-level window from other documents such as pop-ups. [Learn more about deploying the COOP header.](https://web.dev/articles/why-coop-coep#coop)",
+ "score": 1,
+ "scoreDisplayMode": "informative",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "description",
+ "valueType": "text",
+ "subItemsHeading": {
+ "key": "description"
+ },
+ "label": "Description"
+ },
+ {
+ "key": "directive",
+ "valueType": "code",
+ "subItemsHeading": {
+ "key": "directive"
+ },
+ "label": "Directive"
+ },
+ {
+ "key": "severity",
+ "valueType": "text",
+ "subItemsHeading": {
+ "key": "severity"
+ },
+ "label": "Severity"
+ }
+ ],
+ "items": [
+ {
+ "description": "No COOP header found",
+ "severity": "High"
+ }
+ ]
+ }
+ },
+ "clickjacking-mitigation": {
+ "id": "clickjacking-mitigation",
+ "title": "Mitigate clickjacking with XFO or CSP",
+ "description": "The `X-Frame-Options` (XFO) header or the `frame-ancestors` directive in the `Content-Security-Policy` (CSP) header control where a page can be embedded. These can mitigate clickjacking attacks by blocking some or all sites from embedding the page. [Learn more about mitigating clickjacking](https://developer.chrome.com/docs/lighthouse/best-practices/clickjacking-mitigation).",
+ "score": 1,
+ "scoreDisplayMode": "informative",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "description",
+ "valueType": "text",
+ "subItemsHeading": {
+ "key": "description"
+ },
+ "label": "Description"
+ },
+ {
+ "key": "severity",
+ "valueType": "text",
+ "subItemsHeading": {
+ "key": "severity"
+ },
+ "label": "Severity"
+ }
+ ],
+ "items": [
+ {
+ "severity": "High",
+ "description": "No frame control policy found"
+ }
+ ]
+ }
+ },
+ "trusted-types-xss": {
+ "id": "trusted-types-xss",
+ "title": "Mitigate DOM-based XSS with Trusted Types",
+ "description": "The `require-trusted-types-for` directive in the `Content-Security-Policy` (CSP) header instructs user agents to control the data passed to DOM XSS sink functions. [Learn more about mitigating DOM-based XSS with Trusted Types](https://developer.chrome.com/docs/lighthouse/best-practices/trusted-types-xss).",
+ "score": 1,
+ "scoreDisplayMode": "informative",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "description",
+ "valueType": "text",
+ "subItemsHeading": {
+ "key": "description"
+ },
+ "label": "Description"
+ },
+ {
+ "key": "severity",
+ "valueType": "text",
+ "subItemsHeading": {
+ "key": "severity"
+ },
+ "label": "Severity"
+ }
+ ],
+ "items": [
+ {
+ "severity": "High",
+ "description": "No `Content-Security-Policy` header with Trusted Types directive found"
+ }
+ ]
+ }
+ },
+ "accesskeys": {
+ "id": "accesskeys",
+ "title": "`[accesskey]` values are unique",
+ "description": "Access keys let users quickly focus a part of the page. For proper navigation, each access key must be unique. [Learn more about access keys](https://dequeuniversity.com/rules/axe/4.11/accesskeys).",
+ "score": null,
+ "scoreDisplayMode": "notApplicable"
+ },
+ "aria-allowed-attr": {
+ "id": "aria-allowed-attr",
+ "title": "`[aria-*]` attributes match their roles",
+ "description": "Each ARIA `role` supports a specific subset of `aria-*` attributes. Mismatching these invalidates the `aria-*` attributes. [Learn how to match ARIA attributes to their roles](https://dequeuniversity.com/rules/axe/4.11/aria-allowed-attr).",
+ "score": 1,
+ "scoreDisplayMode": "binary",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "node",
+ "valueType": "node",
+ "subItemsHeading": {
+ "key": "relatedNode",
+ "valueType": "node"
+ },
+ "label": "Failing Elements"
+ }
+ ],
+ "items": []
+ }
+ },
+ "aria-allowed-role": {
+ "id": "aria-allowed-role",
+ "title": "Uses ARIA roles only on compatible elements",
+ "description": "Many HTML elements can only be assigned certain ARIA roles. Using ARIA roles where they are not allowed can interfere with the accessibility of the web page. [Learn more about ARIA roles](https://dequeuniversity.com/rules/axe/4.11/aria-allowed-role).",
+ "score": null,
+ "scoreDisplayMode": "notApplicable"
+ },
+ "aria-command-name": {
+ "id": "aria-command-name",
+ "title": "`button`, `link`, and `menuitem` elements have accessible names",
+ "description": "When an element doesn't have an accessible name, screen readers announce it with a generic name, making it unusable for users who rely on screen readers. [Learn how to make command elements more accessible](https://dequeuniversity.com/rules/axe/4.11/aria-command-name).",
+ "score": 1,
+ "scoreDisplayMode": "binary",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "node",
+ "valueType": "node",
+ "subItemsHeading": {
+ "key": "relatedNode",
+ "valueType": "node"
+ },
+ "label": "Failing Elements"
+ }
+ ],
+ "items": []
+ }
+ },
+ "aria-conditional-attr": {
+ "id": "aria-conditional-attr",
+ "title": "ARIA attributes are used as specified for the element's role",
+ "description": "Some ARIA attributes are only allowed on an element under certain conditions. [Learn more about conditional ARIA attributes](https://dequeuniversity.com/rules/axe/4.11/aria-conditional-attr).",
+ "score": 1,
+ "scoreDisplayMode": "binary",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "node",
+ "valueType": "node",
+ "subItemsHeading": {
+ "key": "relatedNode",
+ "valueType": "node"
+ },
+ "label": "Failing Elements"
+ }
+ ],
+ "items": []
+ }
+ },
+ "aria-deprecated-role": {
+ "id": "aria-deprecated-role",
+ "title": "Deprecated ARIA roles were not used",
+ "description": "Deprecated ARIA roles may not be processed correctly by assistive technology. [Learn more about deprecated ARIA roles](https://dequeuniversity.com/rules/axe/4.11/aria-deprecated-role).",
+ "score": 1,
+ "scoreDisplayMode": "binary",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "node",
+ "valueType": "node",
+ "subItemsHeading": {
+ "key": "relatedNode",
+ "valueType": "node"
+ },
+ "label": "Failing Elements"
+ }
+ ],
+ "items": []
+ }
+ },
+ "aria-dialog-name": {
+ "id": "aria-dialog-name",
+ "title": "Elements with `role=\"dialog\"` or `role=\"alertdialog\"` have accessible names.",
+ "description": "ARIA dialog elements without accessible names may prevent screen readers users from discerning the purpose of these elements. [Learn how to make ARIA dialog elements more accessible](https://dequeuniversity.com/rules/axe/4.11/aria-dialog-name).",
+ "score": null,
+ "scoreDisplayMode": "notApplicable"
+ },
+ "aria-hidden-body": {
+ "id": "aria-hidden-body",
+ "title": "`[aria-hidden=\"true\"]` is not present on the document `<body>`",
+ "description": "Assistive technologies, like screen readers, work inconsistently when `aria-hidden=\"true\"` is set on the document `<body>`. [Learn how `aria-hidden` affects the document body](https://dequeuniversity.com/rules/axe/4.11/aria-hidden-body).",
+ "score": 1,
+ "scoreDisplayMode": "binary",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "node",
+ "valueType": "node",
+ "subItemsHeading": {
+ "key": "relatedNode",
+ "valueType": "node"
+ },
+ "label": "Failing Elements"
+ }
+ ],
+ "items": []
+ }
+ },
+ "aria-hidden-focus": {
+ "id": "aria-hidden-focus",
+ "title": "`[aria-hidden=\"true\"]` elements do not contain focusable descendents",
+ "description": "Focusable descendents within an `[aria-hidden=\"true\"]` element prevent those interactive elements from being available to users of assistive technologies like screen readers. [Learn how `aria-hidden` affects focusable elements](https://dequeuniversity.com/rules/axe/4.11/aria-hidden-focus).",
+ "score": 1,
+ "scoreDisplayMode": "binary",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "node",
+ "valueType": "node",
+ "subItemsHeading": {
+ "key": "relatedNode",
+ "valueType": "node"
+ },
+ "label": "Failing Elements"
+ }
+ ],
+ "items": []
+ }
+ },
+ "aria-input-field-name": {
+ "id": "aria-input-field-name",
+ "title": "ARIA input fields have accessible names",
+ "description": "When an input field doesn't have an accessible name, screen readers announce it with a generic name, making it unusable for users who rely on screen readers. [Learn more about input field labels](https://dequeuniversity.com/rules/axe/4.11/aria-input-field-name).",
+ "score": null,
+ "scoreDisplayMode": "notApplicable"
+ },
+ "aria-meter-name": {
+ "id": "aria-meter-name",
+ "title": "ARIA `meter` elements have accessible names",
+ "description": "When a meter element doesn't have an accessible name, screen readers announce it with a generic name, making it unusable for users who rely on screen readers. [Learn how to name `meter` elements](https://dequeuniversity.com/rules/axe/4.11/aria-meter-name).",
+ "score": null,
+ "scoreDisplayMode": "notApplicable"
+ },
+ "aria-progressbar-name": {
+ "id": "aria-progressbar-name",
+ "title": "ARIA `progressbar` elements have accessible names",
+ "description": "When a `progressbar` element doesn't have an accessible name, screen readers announce it with a generic name, making it unusable for users who rely on screen readers. [Learn how to label `progressbar` elements](https://dequeuniversity.com/rules/axe/4.11/aria-progressbar-name).",
+ "score": null,
+ "scoreDisplayMode": "notApplicable"
+ },
+ "aria-prohibited-attr": {
+ "id": "aria-prohibited-attr",
+ "title": "Elements use only permitted ARIA attributes",
+ "description": "Using ARIA attributes in roles where they are prohibited can mean that important information is not communicated to users of assistive technologies. [Learn more about prohibited ARIA roles](https://dequeuniversity.com/rules/axe/4.11/aria-prohibited-attr).",
+ "score": 1,
+ "scoreDisplayMode": "binary",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "node",
+ "valueType": "node",
+ "subItemsHeading": {
+ "key": "relatedNode",
+ "valueType": "node"
+ },
+ "label": "Failing Elements"
+ }
+ ],
+ "items": []
+ }
+ },
+ "aria-required-attr": {
+ "id": "aria-required-attr",
+ "title": "`[role]`s have all required `[aria-*]` attributes",
+ "description": "Some ARIA roles have required attributes that describe the state of the element to screen readers. [Learn more about roles and required attributes](https://dequeuniversity.com/rules/axe/4.11/aria-required-attr).",
+ "score": 1,
+ "scoreDisplayMode": "binary",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "node",
+ "valueType": "node",
+ "subItemsHeading": {
+ "key": "relatedNode",
+ "valueType": "node"
+ },
+ "label": "Failing Elements"
+ }
+ ],
+ "items": []
+ }
+ },
+ "aria-required-children": {
+ "id": "aria-required-children",
+ "title": "Elements with an ARIA `[role]` that require children to contain a specific `[role]` have all required children.",
+ "description": "Some ARIA parent roles must contain specific child roles to perform their intended accessibility functions. [Learn more about roles and required children elements](https://dequeuniversity.com/rules/axe/4.11/aria-required-children).",
+ "score": null,
+ "scoreDisplayMode": "notApplicable"
+ },
+ "aria-required-parent": {
+ "id": "aria-required-parent",
+ "title": "`[role]`s are contained by their required parent element",
+ "description": "Some ARIA child roles must be contained by specific parent roles to properly perform their intended accessibility functions. [Learn more about ARIA roles and required parent element](https://dequeuniversity.com/rules/axe/4.11/aria-required-parent).",
+ "score": null,
+ "scoreDisplayMode": "notApplicable"
+ },
+ "aria-roles": {
+ "id": "aria-roles",
+ "title": "`[role]` values are valid",
+ "description": "ARIA roles must have valid values in order to perform their intended accessibility functions. [Learn more about valid ARIA roles](https://dequeuniversity.com/rules/axe/4.11/aria-roles).",
+ "score": 1,
+ "scoreDisplayMode": "binary",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "node",
+ "valueType": "node",
+ "subItemsHeading": {
+ "key": "relatedNode",
+ "valueType": "node"
+ },
+ "label": "Failing Elements"
+ }
+ ],
+ "items": []
+ }
+ },
+ "aria-text": {
+ "id": "aria-text",
+ "title": "Elements with the `role=text` attribute do not have focusable descendents.",
+ "description": "Adding `role=text` around a text node split by markup enables VoiceOver to treat it as one phrase, but the element's focusable descendents will not be announced. [Learn more about the `role=text` attribute](https://dequeuniversity.com/rules/axe/4.11/aria-text).",
+ "score": null,
+ "scoreDisplayMode": "notApplicable"
+ },
+ "aria-toggle-field-name": {
+ "id": "aria-toggle-field-name",
+ "title": "ARIA toggle fields have accessible names",
+ "description": "When a toggle field doesn't have an accessible name, screen readers announce it with a generic name, making it unusable for users who rely on screen readers. [Learn more about toggle fields](https://dequeuniversity.com/rules/axe/4.11/aria-toggle-field-name).",
+ "score": null,
+ "scoreDisplayMode": "notApplicable"
+ },
+ "aria-tooltip-name": {
+ "id": "aria-tooltip-name",
+ "title": "ARIA `tooltip` elements have accessible names",
+ "description": "When a tooltip element doesn't have an accessible name, screen readers announce it with a generic name, making it unusable for users who rely on screen readers. [Learn how to name `tooltip` elements](https://dequeuniversity.com/rules/axe/4.11/aria-tooltip-name).",
+ "score": null,
+ "scoreDisplayMode": "notApplicable"
+ },
+ "aria-treeitem-name": {
+ "id": "aria-treeitem-name",
+ "title": "ARIA `treeitem` elements have accessible names",
+ "description": "When a `treeitem` element doesn't have an accessible name, screen readers announce it with a generic name, making it unusable for users who rely on screen readers. [Learn more about labeling `treeitem` elements](https://dequeuniversity.com/rules/axe/4.11/aria-treeitem-name).",
+ "score": null,
+ "scoreDisplayMode": "notApplicable"
+ },
+ "aria-valid-attr-value": {
+ "id": "aria-valid-attr-value",
+ "title": "`[aria-*]` attributes have valid values",
+ "description": "Assistive technologies, like screen readers, can't interpret ARIA attributes with invalid values. [Learn more about valid values for ARIA attributes](https://dequeuniversity.com/rules/axe/4.11/aria-valid-attr-value).",
+ "score": 1,
+ "scoreDisplayMode": "binary",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "node",
+ "valueType": "node",
+ "subItemsHeading": {
+ "key": "relatedNode",
+ "valueType": "node"
+ },
+ "label": "Failing Elements"
+ }
+ ],
+ "items": []
+ }
+ },
+ "aria-valid-attr": {
+ "id": "aria-valid-attr",
+ "title": "`[aria-*]` attributes are valid and not misspelled",
+ "description": "Assistive technologies, like screen readers, can't interpret ARIA attributes with invalid names. [Learn more about valid ARIA attributes](https://dequeuniversity.com/rules/axe/4.11/aria-valid-attr).",
+ "score": 1,
+ "scoreDisplayMode": "binary",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "node",
+ "valueType": "node",
+ "subItemsHeading": {
+ "key": "relatedNode",
+ "valueType": "node"
+ },
+ "label": "Failing Elements"
+ }
+ ],
+ "items": []
+ }
+ },
+ "button-name": {
+ "id": "button-name",
+ "title": "Buttons have an accessible name",
+ "description": "When a button doesn't have an accessible name, screen readers announce it as \"button\", making it unusable for users who rely on screen readers. [Learn how to make buttons more accessible](https://dequeuniversity.com/rules/axe/4.11/button-name).",
+ "score": 1,
+ "scoreDisplayMode": "binary",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "node",
+ "valueType": "node",
+ "subItemsHeading": {
+ "key": "relatedNode",
+ "valueType": "node"
+ },
+ "label": "Failing Elements"
+ }
+ ],
+ "items": []
+ }
+ },
+ "bypass": {
+ "id": "bypass",
+ "title": "The page contains a heading, skip link, or landmark region",
+ "description": "Adding ways to bypass repetitive content lets keyboard users navigate the page more efficiently. [Learn more about bypass blocks](https://dequeuniversity.com/rules/axe/4.11/bypass).",
+ "score": null,
+ "scoreDisplayMode": "notApplicable"
+ },
+ "color-contrast": {
+ "id": "color-contrast",
+ "title": "Background and foreground colors have a sufficient contrast ratio",
+ "description": "Low-contrast text is difficult or impossible for many users to read. [Learn how to provide sufficient color contrast](https://dequeuniversity.com/rules/axe/4.11/color-contrast).",
+ "score": 1,
+ "scoreDisplayMode": "binary",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "node",
+ "valueType": "node",
+ "subItemsHeading": {
+ "key": "relatedNode",
+ "valueType": "node"
+ },
+ "label": "Failing Elements"
+ }
+ ],
+ "items": []
+ }
+ },
+ "definition-list": {
+ "id": "definition-list",
+ "title": "`<dl>`'s contain only properly-ordered `<dt>` and `<dd>` groups, `<script>`, `<template>` or `<div>` elements.",
+ "description": "When definition lists are not properly marked up, screen readers may produce confusing or inaccurate output. [Learn how to structure definition lists correctly](https://dequeuniversity.com/rules/axe/4.11/definition-list).",
+ "score": null,
+ "scoreDisplayMode": "notApplicable"
+ },
+ "dlitem": {
+ "id": "dlitem",
+ "title": "Definition list items are wrapped in `<dl>` elements",
+ "description": "Definition list items (`<dt>` and `<dd>`) must be wrapped in a parent `<dl>` element to ensure that screen readers can properly announce them. [Learn how to structure definition lists correctly](https://dequeuniversity.com/rules/axe/4.11/dlitem).",
+ "score": null,
+ "scoreDisplayMode": "notApplicable"
+ },
+ "document-title": {
+ "id": "document-title",
+ "title": "Document has a `<title>` element",
+ "description": "The title gives screen reader users an overview of the page, and search engine users rely on it heavily to determine if a page is relevant to their search. [Learn more about document titles](https://dequeuniversity.com/rules/axe/4.11/document-title).",
+ "score": 1,
+ "scoreDisplayMode": "binary",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "node",
+ "valueType": "node",
+ "subItemsHeading": {
+ "key": "relatedNode",
+ "valueType": "node"
+ },
+ "label": "Failing Elements"
+ }
+ ],
+ "items": []
+ }
+ },
+ "duplicate-id-aria": {
+ "id": "duplicate-id-aria",
+ "title": "ARIA IDs are unique",
+ "description": "The value of an ARIA ID must be unique to prevent other instances from being overlooked by assistive technologies. [Learn how to fix duplicate ARIA IDs](https://dequeuniversity.com/rules/axe/4.11/duplicate-id-aria).",
+ "score": null,
+ "scoreDisplayMode": "notApplicable"
+ },
+ "empty-heading": {
+ "id": "empty-heading",
+ "title": "All heading elements contain content.",
+ "description": "A heading with no content or inaccessible text prevent screen reader users from accessing information on the page's structure. [Learn more about headings](https://dequeuniversity.com/rules/axe/4.11/empty-heading).",
+ "score": null,
+ "scoreDisplayMode": "notApplicable"
+ },
+ "form-field-multiple-labels": {
+ "id": "form-field-multiple-labels",
+ "title": "No form fields have multiple labels",
+ "description": "Form fields with multiple labels can be confusingly announced by assistive technologies like screen readers which use either the first, the last, or all of the labels. [Learn how to use form labels](https://dequeuniversity.com/rules/axe/4.11/form-field-multiple-labels).",
+ "score": null,
+ "scoreDisplayMode": "notApplicable"
+ },
+ "frame-title": {
+ "id": "frame-title",
+ "title": "`<frame>` or `<iframe>` elements have a title",
+ "description": "Screen reader users rely on frame titles to describe the contents of frames. [Learn more about frame titles](https://dequeuniversity.com/rules/axe/4.11/frame-title).",
+ "score": 1,
+ "scoreDisplayMode": "binary",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "node",
+ "valueType": "node",
+ "subItemsHeading": {
+ "key": "relatedNode",
+ "valueType": "node"
+ },
+ "label": "Failing Elements"
+ }
+ ],
+ "items": []
+ }
+ },
+ "heading-order": {
+ "id": "heading-order",
+ "title": "Heading elements appear in a sequentially-descending order",
+ "description": "Properly ordered headings that do not skip levels convey the semantic structure of the page, making it easier to navigate and understand when using assistive technologies. [Learn more about heading order](https://dequeuniversity.com/rules/axe/4.11/heading-order).",
+ "score": 1,
+ "scoreDisplayMode": "binary",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "node",
+ "valueType": "node",
+ "subItemsHeading": {
+ "key": "relatedNode",
+ "valueType": "node"
+ },
+ "label": "Failing Elements"
+ }
+ ],
+ "items": []
+ }
+ },
+ "html-has-lang": {
+ "id": "html-has-lang",
+ "title": "`<html>` element has a `[lang]` attribute",
+ "description": "If a page doesn't specify a `lang` attribute, a screen reader assumes that the page is in the default language that the user chose when setting up the screen reader. If the page isn't actually in the default language, then the screen reader might not announce the page's text correctly. [Learn more about the `lang` attribute](https://dequeuniversity.com/rules/axe/4.11/html-has-lang).",
+ "score": 1,
+ "scoreDisplayMode": "binary",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "node",
+ "valueType": "node",
+ "subItemsHeading": {
+ "key": "relatedNode",
+ "valueType": "node"
+ },
+ "label": "Failing Elements"
+ }
+ ],
+ "items": []
+ }
+ },
+ "html-lang-valid": {
+ "id": "html-lang-valid",
+ "title": "`<html>` element has a valid value for its `[lang]` attribute",
+ "description": "Specifying a valid [BCP 47 language](https://www.w3.org/International/questions/qa-choosing-language-tags#question) helps screen readers announce text properly. [Learn how to use the `lang` attribute](https://dequeuniversity.com/rules/axe/4.11/html-lang-valid).",
+ "score": 1,
+ "scoreDisplayMode": "binary",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "node",
+ "valueType": "node",
+ "subItemsHeading": {
+ "key": "relatedNode",
+ "valueType": "node"
+ },
+ "label": "Failing Elements"
+ }
+ ],
+ "items": []
+ }
+ },
+ "html-xml-lang-mismatch": {
+ "id": "html-xml-lang-mismatch",
+ "title": "`<html>` element has an `[xml:lang]` attribute with the same base language as the `[lang]` attribute.",
+ "description": "If the webpage does not specify a consistent language, then the screen reader might not announce the page's text correctly. [Learn more about the `lang` attribute](https://dequeuniversity.com/rules/axe/4.11/html-xml-lang-mismatch).",
+ "score": null,
+ "scoreDisplayMode": "notApplicable"
+ },
+ "identical-links-same-purpose": {
+ "id": "identical-links-same-purpose",
+ "title": "Identical links have the same purpose.",
+ "description": "Links with the same destination should have the same description, to help users understand the link's purpose and decide whether to follow it. [Learn more about identical links](https://dequeuniversity.com/rules/axe/4.11/identical-links-same-purpose).",
+ "score": null,
+ "scoreDisplayMode": "notApplicable"
+ },
+ "image-alt": {
+ "id": "image-alt",
+ "title": "Image elements have `[alt]` attributes",
+ "description": "Informative elements should aim for short, descriptive alternate text. Decorative elements can be ignored with an empty alt attribute. [Learn more about the `alt` attribute](https://dequeuniversity.com/rules/axe/4.11/image-alt).",
+ "score": 1,
+ "scoreDisplayMode": "binary",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "node",
+ "valueType": "node",
+ "subItemsHeading": {
+ "key": "relatedNode",
+ "valueType": "node"
+ },
+ "label": "Failing Elements"
+ }
+ ],
+ "items": []
+ }
+ },
+ "image-redundant-alt": {
+ "id": "image-redundant-alt",
+ "title": "Image elements do not have `[alt]` attributes that are redundant text.",
+ "description": "Informative elements should aim for short, descriptive alternative text. Alternative text that is exactly the same as the text adjacent to the link or image is potentially confusing for screen reader users, because the text will be read twice. [Learn more about the `alt` attribute](https://dequeuniversity.com/rules/axe/4.11/image-redundant-alt).",
+ "score": null,
+ "scoreDisplayMode": "notApplicable"
+ },
+ "input-button-name": {
+ "id": "input-button-name",
+ "title": "Input buttons have discernible text.",
+ "description": "Adding discernable and accessible text to input buttons may help screen reader users understand the purpose of the input button. [Learn more about input buttons](https://dequeuniversity.com/rules/axe/4.11/input-button-name).",
+ "score": null,
+ "scoreDisplayMode": "notApplicable"
+ },
+ "input-image-alt": {
+ "id": "input-image-alt",
+ "title": "`<input type=\"image\">` elements have `[alt]` text",
+ "description": "When an image is being used as an `<input>` button, providing alternative text can help screen reader users understand the purpose of the button. [Learn about input image alt text](https://dequeuniversity.com/rules/axe/4.11/input-image-alt).",
+ "score": null,
+ "scoreDisplayMode": "notApplicable"
+ },
+ "label-content-name-mismatch": {
+ "id": "label-content-name-mismatch",
+ "title": "Elements with visible text labels have matching accessible names.",
+ "description": "Visible text labels that do not match the accessible name can result in a confusing experience for screen reader users. [Learn more about accessible names](https://dequeuniversity.com/rules/axe/4.11/label-content-name-mismatch).",
+ "score": 1,
+ "scoreDisplayMode": "binary",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "node",
+ "valueType": "node",
+ "subItemsHeading": {
+ "key": "relatedNode",
+ "valueType": "node"
+ },
+ "label": "Failing Elements"
+ }
+ ],
+ "items": []
+ }
+ },
+ "label": {
+ "id": "label",
+ "title": "Form elements have associated labels",
+ "description": "Labels ensure that form controls are announced properly by assistive technologies, like screen readers. [Learn more about form element labels](https://dequeuniversity.com/rules/axe/4.11/label).",
+ "score": null,
+ "scoreDisplayMode": "notApplicable"
+ },
+ "landmark-one-main": {
+ "id": "landmark-one-main",
+ "title": "Document has a main landmark.",
+ "description": "One main landmark helps screen reader users navigate a web page. [Learn more about landmarks](https://dequeuniversity.com/rules/axe/4.11/landmark-one-main).",
+ "score": 1,
+ "scoreDisplayMode": "binary",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "node",
+ "valueType": "node",
+ "subItemsHeading": {
+ "key": "relatedNode",
+ "valueType": "node"
+ },
+ "label": "Failing Elements"
+ }
+ ],
+ "items": []
+ }
+ },
+ "link-name": {
+ "id": "link-name",
+ "title": "Links do not have a discernible name",
+ "description": "Link text (and alternate text for images, when used as links) that is discernible, unique, and focusable improves the navigation experience for screen reader users. [Learn how to make links accessible](https://dequeuniversity.com/rules/axe/4.11/link-name).",
+ "score": 0,
+ "scoreDisplayMode": "binary",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "node",
+ "valueType": "node",
+ "subItemsHeading": {
+ "key": "relatedNode",
+ "valueType": "node"
+ },
+ "label": "Failing Elements"
+ }
+ ],
+ "items": [
+ {
+ "node": {
+ "type": "node",
+ "lhId": "1-0-A",
+ "path": "1,HTML,1,BODY,9,DIV,0,DIV,3,DIV,0,DIV,0,HEADER,1,DIV,1,DIV,0,DIV,0,DIV,0,SECTION,1,DIV,0,DIV,1,DIV,0,DIV,0,DIV,0,A",
+ "selector": "div > div > div#comp-jg3bd4sj > a.aeyn4z",
+ "boundingRect": {
+ "top": 25,
+ "bottom": 50,
+ "left": 528,
+ "right": 548,
+ "width": 20,
+ "height": 25
+ },
+ "snippet": "<a data-testid=\"linkElement\" href=\"https://www.studentdebtcrisis.org\" target=\"_self\" class=\"aeyn4z\">",
+ "nodeLabel": "div > div > div#comp-jg3bd4sj > a.aeyn4z",
+ "explanation": "Fix all of the following:\n Element is in tab order and does not have accessible text\n\nFix any of the following:\n Element does not have text that is visible to screen readers\n aria-label attribute does not exist or is empty\n aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty\n Element has no title attribute"
+ }
+ }
+ ],
+ "debugData": {
+ "type": "debugdata",
+ "impact": "serious",
+ "tags": [
+ "cat.name-role-value",
+ "wcag2a",
+ "wcag244",
+ "wcag412",
+ "section508",
+ "section508.22.a",
+ "TTv5",
+ "TT6.a",
+ "EN-301-549",
+ "EN-9.2.4.4",
+ "EN-9.4.1.2",
+ "ACT",
+ "RGAAv4",
+ "RGAA-6.2.1"
+ ]
+ }
+ }
+ },
+ "link-in-text-block": {
+ "id": "link-in-text-block",
+ "title": "Links are distinguishable without relying on color.",
+ "description": "Low-contrast text is difficult or impossible for many users to read. Link text that is discernible improves the experience for users with low vision. [Learn how to make links distinguishable](https://dequeuniversity.com/rules/axe/4.11/link-in-text-block).",
+ "score": null,
+ "scoreDisplayMode": "notApplicable"
+ },
+ "list": {
+ "id": "list",
+ "title": "Lists contain only `<li>` elements and script supporting elements (`<script>` and `<template>`).",
+ "description": "Screen readers have a specific way of announcing lists. Ensuring proper list structure aids screen reader output. [Learn more about proper list structure](https://dequeuniversity.com/rules/axe/4.11/list).",
+ "score": 1,
+ "scoreDisplayMode": "binary",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "node",
+ "valueType": "node",
+ "subItemsHeading": {
+ "key": "relatedNode",
+ "valueType": "node"
+ },
+ "label": "Failing Elements"
+ }
+ ],
+ "items": []
+ }
+ },
+ "listitem": {
+ "id": "listitem",
+ "title": "List items (`<li>`) are contained within `<ul>`, `<ol>` or `<menu>` parent elements",
+ "description": "Screen readers require list items (`<li>`) to be contained within a parent `<ul>`, `<ol>` or `<menu>` to be announced properly. [Learn more about proper list structure](https://dequeuniversity.com/rules/axe/4.11/listitem).",
+ "score": 1,
+ "scoreDisplayMode": "binary",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "node",
+ "valueType": "node",
+ "subItemsHeading": {
+ "key": "relatedNode",
+ "valueType": "node"
+ },
+ "label": "Failing Elements"
+ }
+ ],
+ "items": []
+ }
+ },
+ "meta-refresh": {
+ "id": "meta-refresh",
+ "title": "The document does not use `<meta http-equiv=\"refresh\">`",
+ "description": "Users do not expect a page to refresh automatically, and doing so will move focus back to the top of the page. This may create a frustrating or confusing experience. [Learn more about the refresh meta tag](https://dequeuniversity.com/rules/axe/4.11/meta-refresh).",
+ "score": null,
+ "scoreDisplayMode": "notApplicable"
+ },
+ "meta-viewport": {
+ "id": "meta-viewport",
+ "title": "`[user-scalable=\"no\"]` is not used in the `<meta name=\"viewport\">` element and the `[maximum-scale]` attribute is not less than 5.",
+ "description": "Disabling zooming is problematic for users with low vision who rely on screen magnification to properly see the contents of a web page. [Learn more about the viewport meta tag](https://dequeuniversity.com/rules/axe/4.11/meta-viewport).",
+ "score": 1,
+ "scoreDisplayMode": "binary",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "node",
+ "valueType": "node",
+ "subItemsHeading": {
+ "key": "relatedNode",
+ "valueType": "node"
+ },
+ "label": "Failing Elements"
+ }
+ ],
+ "items": []
+ }
+ },
+ "object-alt": {
+ "id": "object-alt",
+ "title": "`<object>` elements have alternate text",
+ "description": "Screen readers cannot translate non-text content. Adding alternate text to `<object>` elements helps screen readers convey meaning to users. [Learn more about alt text for `object` elements](https://dequeuniversity.com/rules/axe/4.11/object-alt).",
+ "score": null,
+ "scoreDisplayMode": "notApplicable"
+ },
+ "select-name": {
+ "id": "select-name",
+ "title": "Select elements have associated label elements.",
+ "description": "Form elements without effective labels can create frustrating experiences for screen reader users. [Learn more about the `select` element](https://dequeuniversity.com/rules/axe/4.11/select-name).",
+ "score": null,
+ "scoreDisplayMode": "notApplicable"
+ },
+ "skip-link": {
+ "id": "skip-link",
+ "title": "Skip links are focusable.",
+ "description": "Including a skip link can help users skip to the main content to save time. [Learn more about skip links](https://dequeuniversity.com/rules/axe/4.11/skip-link).",
+ "score": null,
+ "scoreDisplayMode": "notApplicable"
+ },
+ "tabindex": {
+ "id": "tabindex",
+ "title": "No element has a `[tabindex]` value greater than 0",
+ "description": "A value greater than 0 implies an explicit navigation ordering. Although technically valid, this often creates frustrating experiences for users who rely on assistive technologies. [Learn more about the `tabindex` attribute](https://dequeuniversity.com/rules/axe/4.11/tabindex).",
+ "score": 1,
+ "scoreDisplayMode": "binary",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "node",
+ "valueType": "node",
+ "subItemsHeading": {
+ "key": "relatedNode",
+ "valueType": "node"
+ },
+ "label": "Failing Elements"
+ }
+ ],
+ "items": []
+ }
+ },
+ "table-duplicate-name": {
+ "id": "table-duplicate-name",
+ "title": "Tables have different content in the summary attribute and `<caption>`.",
+ "description": "The summary attribute should describe the table structure, while `<caption>` should have the onscreen title. Accurate table mark-up helps users of screen readers. [Learn more about summary and caption](https://dequeuniversity.com/rules/axe/4.11/table-duplicate-name).",
+ "score": null,
+ "scoreDisplayMode": "notApplicable"
+ },
+ "table-fake-caption": {
+ "id": "table-fake-caption",
+ "title": "Tables use `<caption>` instead of cells with the `[colspan]` attribute to indicate a caption.",
+ "description": "Screen readers have features to make navigating tables easier. Ensuring that tables use the actual caption element instead of cells with the `[colspan]` attribute may improve the experience for screen reader users. [Learn more about captions](https://dequeuniversity.com/rules/axe/4.11/table-fake-caption).",
+ "score": null,
+ "scoreDisplayMode": "notApplicable"
+ },
+ "target-size": {
+ "id": "target-size",
+ "title": "Touch targets do not have sufficient size or spacing.",
+ "description": "Touch targets with sufficient size and spacing help users who may have difficulty targeting small controls to activate the targets. [Learn more about touch targets](https://dequeuniversity.com/rules/axe/4.11/target-size).",
+ "score": 0,
+ "scoreDisplayMode": "binary",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "node",
+ "valueType": "node",
+ "subItemsHeading": {
+ "key": "relatedNode",
+ "valueType": "node"
+ },
+ "label": "Failing Elements"
+ }
+ ],
+ "items": [
+ {
+ "node": {
+ "type": "node",
+ "lhId": "1-1-A",
+ "path": "1,HTML,1,BODY,9,DIV,0,DIV,3,DIV,0,DIV,1,MAIN,0,DIV,0,DIV,1,DIV,0,DIV,0,DIV,0,DIV,3,SECTION,1,DIV,0,DIV,2,SECTION,1,DIV,0,DIV,1,DIV,0,DIV,0,DIV,4,NAV,0,OL,0,LI,0,A",
+ "selector": "nav.lZ5yqT > ol.dZxZOk > li > a.ZVUGJp",
+ "boundingRect": {
+ "top": 2511,
+ "bottom": 2519,
+ "left": 641,
+ "right": 649,
+ "width": 8,
+ "height": 8
+ },
+ "snippet": "<a href=\"./#comp-llvrt3hh\" aria-label=\"Section3SlideShowItem1MediaImage1\" class=\"ZVUGJp Ale4Rm\">",
+ "nodeLabel": "Section3SlideShowItem1MediaImage1",
+ "explanation": "Fix any of the following:\n Target has insufficient size (8px by 8px, should be at least 24px by 24px)\n Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of 22px instead of at least 24px."
+ },
+ "subItems": {
+ "type": "subitems",
+ "items": [
+ {
+ "relatedNode": {
+ "type": "node",
+ "lhId": "1-2-A",
+ "path": "1,HTML,1,BODY,9,DIV,0,DIV,3,DIV,0,DIV,1,MAIN,0,DIV,0,DIV,1,DIV,0,DIV,0,DIV,0,DIV,3,SECTION,1,DIV,0,DIV,2,SECTION,1,DIV,0,DIV,1,DIV,0,DIV,0,DIV,4,NAV,0,OL,1,LI,0,A",
+ "selector": "nav.lZ5yqT > ol.dZxZOk > li > a.ZVUGJp",
+ "boundingRect": {
+ "top": 2511,
+ "bottom": 2519,
+ "left": 664,
+ "right": 672,
+ "width": 8,
+ "height": 8
+ },
+ "snippet": "<a href=\"./#comp-llvrt3hm5\" aria-label=\"Section3SlideShowItem2MediaImage1\" class=\"ZVUGJp\">",
+ "nodeLabel": "Section3SlideShowItem2MediaImage1"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "node": {
+ "type": "node",
+ "lhId": "1-2-A",
+ "path": "1,HTML,1,BODY,9,DIV,0,DIV,3,DIV,0,DIV,1,MAIN,0,DIV,0,DIV,1,DIV,0,DIV,0,DIV,0,DIV,3,SECTION,1,DIV,0,DIV,2,SECTION,1,DIV,0,DIV,1,DIV,0,DIV,0,DIV,4,NAV,0,OL,1,LI,0,A",
+ "selector": "nav.lZ5yqT > ol.dZxZOk > li > a.ZVUGJp",
+ "boundingRect": {
+ "top": 2511,
+ "bottom": 2519,
+ "left": 664,
+ "right": 672,
+ "width": 8,
+ "height": 8
+ },
+ "snippet": "<a href=\"./#comp-llvrt3hm5\" aria-label=\"Section3SlideShowItem2MediaImage1\" class=\"ZVUGJp\">",
+ "nodeLabel": "Section3SlideShowItem2MediaImage1",
+ "explanation": "Fix any of the following:\n Target has insufficient size (8px by 8px, should be at least 24px by 24px)\n Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of 22px instead of at least 24px."
+ },
+ "subItems": {
+ "type": "subitems",
+ "items": [
+ {
+ "relatedNode": {
+ "type": "node",
+ "lhId": "1-1-A",
+ "path": "1,HTML,1,BODY,9,DIV,0,DIV,3,DIV,0,DIV,1,MAIN,0,DIV,0,DIV,1,DIV,0,DIV,0,DIV,0,DIV,3,SECTION,1,DIV,0,DIV,2,SECTION,1,DIV,0,DIV,1,DIV,0,DIV,0,DIV,4,NAV,0,OL,0,LI,0,A",
+ "selector": "nav.lZ5yqT > ol.dZxZOk > li > a.ZVUGJp",
+ "boundingRect": {
+ "top": 2511,
+ "bottom": 2519,
+ "left": 641,
+ "right": 649,
+ "width": 8,
+ "height": 8
+ },
+ "snippet": "<a href=\"./#comp-llvrt3hh\" aria-label=\"Section3SlideShowItem1MediaImage1\" class=\"ZVUGJp Ale4Rm\">",
+ "nodeLabel": "Section3SlideShowItem1MediaImage1"
+ }
+ },
+ {
+ "relatedNode": {
+ "type": "node",
+ "lhId": "1-3-A",
+ "path": "1,HTML,1,BODY,9,DIV,0,DIV,3,DIV,0,DIV,1,MAIN,0,DIV,0,DIV,1,DIV,0,DIV,0,DIV,0,DIV,3,SECTION,1,DIV,0,DIV,2,SECTION,1,DIV,0,DIV,1,DIV,0,DIV,0,DIV,4,NAV,0,OL,2,LI,0,A",
+ "selector": "nav.lZ5yqT > ol.dZxZOk > li > a.ZVUGJp",
+ "boundingRect": {
+ "top": 2511,
+ "bottom": 2519,
+ "left": 687,
+ "right": 695,
+ "width": 8,
+ "height": 8
+ },
+ "snippet": "<a href=\"./#comp-llvrt3hr\" aria-label=\"Section3SlideShowItem3MediaImage1\" class=\"ZVUGJp\">",
+ "nodeLabel": "Section3SlideShowItem3MediaImage1"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "node": {
+ "type": "node",
+ "lhId": "1-3-A",
+ "path": "1,HTML,1,BODY,9,DIV,0,DIV,3,DIV,0,DIV,1,MAIN,0,DIV,0,DIV,1,DIV,0,DIV,0,DIV,0,DIV,3,SECTION,1,DIV,0,DIV,2,SECTION,1,DIV,0,DIV,1,DIV,0,DIV,0,DIV,4,NAV,0,OL,2,LI,0,A",
+ "selector": "nav.lZ5yqT > ol.dZxZOk > li > a.ZVUGJp",
+ "boundingRect": {
+ "top": 2511,
+ "bottom": 2519,
+ "left": 687,
+ "right": 695,
+ "width": 8,
+ "height": 8
+ },
+ "snippet": "<a href=\"./#comp-llvrt3hr\" aria-label=\"Section3SlideShowItem3MediaImage1\" class=\"ZVUGJp\">",
+ "nodeLabel": "Section3SlideShowItem3MediaImage1",
+ "explanation": "Fix any of the following:\n Target has insufficient size (8px by 8px, should be at least 24px by 24px)\n Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of 22px instead of at least 24px."
+ },
+ "subItems": {
+ "type": "subitems",
+ "items": [
+ {
+ "relatedNode": {
+ "type": "node",
+ "lhId": "1-2-A",
+ "path": "1,HTML,1,BODY,9,DIV,0,DIV,3,DIV,0,DIV,1,MAIN,0,DIV,0,DIV,1,DIV,0,DIV,0,DIV,0,DIV,3,SECTION,1,DIV,0,DIV,2,SECTION,1,DIV,0,DIV,1,DIV,0,DIV,0,DIV,4,NAV,0,OL,1,LI,0,A",
+ "selector": "nav.lZ5yqT > ol.dZxZOk > li > a.ZVUGJp",
+ "boundingRect": {
+ "top": 2511,
+ "bottom": 2519,
+ "left": 664,
+ "right": 672,
+ "width": 8,
+ "height": 8
+ },
+ "snippet": "<a href=\"./#comp-llvrt3hm5\" aria-label=\"Section3SlideShowItem2MediaImage1\" class=\"ZVUGJp\">",
+ "nodeLabel": "Section3SlideShowItem2MediaImage1"
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "debugData": {
+ "type": "debugdata",
+ "impact": "serious",
+ "tags": [
+ "cat.sensory-and-visual-cues",
+ "wcag22aa",
+ "wcag258"
+ ]
+ }
+ }
+ },
+ "td-has-header": {
+ "id": "td-has-header",
+ "title": "`<td>` elements in a large `<table>` have one or more table headers.",
+ "description": "Screen readers have features to make navigating tables easier. Ensuring that `<td>` elements in a large table (3 or more cells in width and height) have an associated table header may improve the experience for screen reader users. [Learn more about table headers](https://dequeuniversity.com/rules/axe/4.11/td-has-header).",
+ "score": null,
+ "scoreDisplayMode": "notApplicable"
+ },
+ "td-headers-attr": {
+ "id": "td-headers-attr",
+ "title": "Cells in a `<table>` element that use the `[headers]` attribute refer to table cells within the same table.",
+ "description": "Screen readers have features to make navigating tables easier. Ensuring `<td>` cells using the `[headers]` attribute only refer to other cells in the same table may improve the experience for screen reader users. [Learn more about the `headers` attribute](https://dequeuniversity.com/rules/axe/4.11/td-headers-attr).",
+ "score": null,
+ "scoreDisplayMode": "notApplicable"
+ },
+ "th-has-data-cells": {
+ "id": "th-has-data-cells",
+ "title": "`<th>` elements and elements with `[role=\"columnheader\"/\"rowheader\"]` have data cells they describe.",
+ "description": "Screen readers have features to make navigating tables easier. Ensuring table headers always refer to some set of cells may improve the experience for screen reader users. [Learn more about table headers](https://dequeuniversity.com/rules/axe/4.11/th-has-data-cells).",
+ "score": null,
+ "scoreDisplayMode": "notApplicable"
+ },
+ "valid-lang": {
+ "id": "valid-lang",
+ "title": "`[lang]` attributes have a valid value",
+ "description": "Specifying a valid [BCP 47 language](https://www.w3.org/International/questions/qa-choosing-language-tags#question) on elements helps ensure that text is pronounced correctly by a screen reader. [Learn how to use the `lang` attribute](https://dequeuniversity.com/rules/axe/4.11/valid-lang).",
+ "score": null,
+ "scoreDisplayMode": "notApplicable"
+ },
+ "video-caption": {
+ "id": "video-caption",
+ "title": "`<video>` elements contain a `<track>` element with `[kind=\"captions\"]`",
+ "description": "When a video provides a caption it is easier for deaf and hearing impaired users to access its information. [Learn more about video captions](https://dequeuniversity.com/rules/axe/4.11/video-caption).",
+ "score": null,
+ "scoreDisplayMode": "notApplicable"
+ },
+ "custom-controls-labels": {
+ "id": "custom-controls-labels",
+ "title": "Custom controls have associated labels",
+ "description": "Custom interactive controls have associated labels, provided by aria-label or aria-labelledby. [Learn more about custom controls and labels](https://developer.chrome.com/docs/lighthouse/accessibility/custom-controls-labels/).",
+ "score": null,
+ "scoreDisplayMode": "manual"
+ },
+ "custom-controls-roles": {
+ "id": "custom-controls-roles",
+ "title": "Custom controls have ARIA roles",
+ "description": "Custom interactive controls have appropriate ARIA roles. [Learn how to add roles to custom controls](https://developer.chrome.com/docs/lighthouse/accessibility/custom-control-roles/).",
+ "score": null,
+ "scoreDisplayMode": "manual"
+ },
+ "focus-traps": {
+ "id": "focus-traps",
+ "title": "User focus is not accidentally trapped in a region",
+ "description": "A user can tab into and out of any control or region without accidentally trapping their focus. [Learn how to avoid focus traps](https://developer.chrome.com/docs/lighthouse/accessibility/focus-traps/).",
+ "score": null,
+ "scoreDisplayMode": "manual"
+ },
+ "focusable-controls": {
+ "id": "focusable-controls",
+ "title": "Interactive controls are keyboard focusable",
+ "description": "Custom interactive controls are keyboard focusable and display a focus indicator. [Learn how to make custom controls focusable](https://developer.chrome.com/docs/lighthouse/accessibility/focusable-controls/).",
+ "score": null,
+ "scoreDisplayMode": "manual"
+ },
+ "interactive-element-affordance": {
+ "id": "interactive-element-affordance",
+ "title": "Interactive elements indicate their purpose and state",
+ "description": "Interactive elements, such as links and buttons, should indicate their state and be distinguishable from non-interactive elements. [Learn how to decorate interactive elements with affordance hints](https://developer.chrome.com/docs/lighthouse/accessibility/interactive-element-affordance/).",
+ "score": null,
+ "scoreDisplayMode": "manual"
+ },
+ "logical-tab-order": {
+ "id": "logical-tab-order",
+ "title": "The page has a logical tab order",
+ "description": "Tabbing through the page follows the visual layout. Users cannot focus elements that are offscreen. [Learn more about logical tab ordering](https://developer.chrome.com/docs/lighthouse/accessibility/logical-tab-order/).",
+ "score": null,
+ "scoreDisplayMode": "manual"
+ },
+ "managed-focus": {
+ "id": "managed-focus",
+ "title": "The user's focus is directed to new content added to the page",
+ "description": "If new content, such as a dialog, is added to the page, the user's focus is directed to it. [Learn how to direct focus to new content](https://developer.chrome.com/docs/lighthouse/accessibility/managed-focus/).",
+ "score": null,
+ "scoreDisplayMode": "manual"
+ },
+ "offscreen-content-hidden": {
+ "id": "offscreen-content-hidden",
+ "title": "Offscreen content is hidden from assistive technology",
+ "description": "Offscreen content is hidden with display: none or aria-hidden=true. [Learn how to properly hide offscreen content](https://developer.chrome.com/docs/lighthouse/accessibility/offscreen-content-hidden/).",
+ "score": null,
+ "scoreDisplayMode": "manual"
+ },
+ "use-landmarks": {
+ "id": "use-landmarks",
+ "title": "HTML5 landmark elements are used to improve navigation",
+ "description": "Landmark elements (`<main>`, `<nav>`, etc.) are used to improve the keyboard navigation of the page for assistive technology. [Learn more about landmark elements](https://developer.chrome.com/docs/lighthouse/accessibility/use-landmarks/).",
+ "score": null,
+ "scoreDisplayMode": "manual"
+ },
+ "visual-order-follows-dom": {
+ "id": "visual-order-follows-dom",
+ "title": "Visual order on the page follows DOM order",
+ "description": "DOM order matches the visual order, improving navigation for assistive technology. [Learn more about DOM and visual ordering](https://developer.chrome.com/docs/lighthouse/accessibility/visual-order-follows-dom/).",
+ "score": null,
+ "scoreDisplayMode": "manual"
+ },
+ "autocomplete-valid": {
+ "id": "autocomplete-valid",
+ "title": "`autocomplete` attributes are used correctly",
+ "description": "The `autocomplete` attribute values must be valid and correctly applied for screen readers to function correctly. [Learn more about valid autocomplete values](https://dequeuniversity.com/rules/axe/4.11/autocomplete-valid).",
+ "score": null,
+ "scoreDisplayMode": "notApplicable"
+ },
+ "presentation-role-conflict": {
+ "id": "presentation-role-conflict",
+ "title": "Elements with `role=\"none\"` or `role=\"presentation\"` do not have conflicts",
+ "description": "There are certain cases where the semantic role of an element with `role=\"none\"` or `role=\"presentation\"` does not resolve to none or presentation. To ensure the element remains removed from the accessibility tree, you should not add any global ARIA attributes to the element or make it focusable. [Learn more about presentation role conflict](https://dequeuniversity.com/rules/axe/4.11/presentation-role-conflict).",
+ "score": 1,
+ "scoreDisplayMode": "binary",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "node",
+ "valueType": "node",
+ "subItemsHeading": {
+ "key": "relatedNode",
+ "valueType": "node"
+ },
+ "label": "Failing Elements"
+ }
+ ],
+ "items": []
+ }
+ },
+ "svg-img-alt": {
+ "id": "svg-img-alt",
+ "title": "SVG elements with an `img` role have an accessible text alternative",
+ "description": "Ensures SVG elements with an `img`, `graphics-document` or `graphics-symbol` role have an accessible text alternative. [Learn more about SVG alt text](https://dequeuniversity.com/rules/axe/4.11/svg-img-alt).",
+ "score": null,
+ "scoreDisplayMode": "notApplicable"
+ },
+ "doctype": {
+ "id": "doctype",
+ "title": "Page has the HTML doctype",
+ "description": "Specifying a doctype prevents the browser from switching to quirks-mode. [Learn more about the doctype declaration](https://developer.chrome.com/docs/lighthouse/best-practices/doctype/).",
+ "score": 1,
+ "scoreDisplayMode": "binary"
+ },
+ "charset": {
+ "id": "charset",
+ "title": "Properly defines charset",
+ "description": "A character encoding declaration is required. It can be done with a `<meta>` tag in the first 1024 bytes of the HTML or in the Content-Type HTTP response header. [Learn more about declaring the character encoding](https://developer.chrome.com/docs/lighthouse/best-practices/charset/).",
+ "score": 1,
+ "scoreDisplayMode": "binary"
+ },
+ "geolocation-on-start": {
+ "id": "geolocation-on-start",
+ "title": "Avoids requesting the geolocation permission on page load",
+ "description": "Users are mistrustful of or confused by sites that request their location without context. Consider tying the request to a user action instead. [Learn more about the geolocation permission](https://developer.chrome.com/docs/lighthouse/best-practices/geolocation-on-start/).",
+ "score": 1,
+ "scoreDisplayMode": "binary",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "source",
+ "valueType": "source-location",
+ "label": "Source"
+ }
+ ],
+ "items": []
+ }
+ },
+ "inspector-issues": {
+ "id": "inspector-issues",
+ "title": "Issues were logged in the `Issues` panel in Chrome Devtools",
+ "description": "Issues logged to the `Issues` panel in Chrome Devtools indicate unresolved problems. They can come from network request failures, insufficient security controls, and other browser concerns. Open up the Issues panel in Chrome DevTools for more details on each issue.",
+ "score": 0,
+ "scoreDisplayMode": "binary",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "issueType",
+ "valueType": "text",
+ "subItemsHeading": {
+ "key": "url",
+ "valueType": "url"
+ },
+ "label": "Issue type"
+ }
+ ],
+ "items": [
+ {
+ "issueType": "Cookie",
+ "subItems": {
+ "type": "subitems",
+ "items": [
+ {
+ "url": "https://panorama.wixapps.net/api/v1/bulklog"
+ },
+ {
+ "url": "https://actionnetwork.org/css/style-embed-v3.css"
+ },
+ {
+ "url": "https://actionnetwork.org/widgets/v5/form/student-debt-crisis-center?format=js&source=widget"
+ },
+ {
+ "url": "https://engage.wixapps.net/chat-widget-server/renderChatWidget/index?pageId=masterPage&compId=comp-jqkn0z81&viewerCompId=comp-jqkn0z81&siteRevision=805&viewMode=site&deviceType=mobile&locale=en&tz=America%2FLos_Angeles®ionalLanguage=en&width=0&height=0&instance=VnVrawbSUwKRhLrpef5o2PRX0zSONofg0e8LX7QjhrM.eyJpbnN0YW5jZUlkIjoiOWYwOWRiMGUtNzQ0YS00ZGUyLWIwZDQtYjYwMzYyYTM1NWFkIiwiYXBwRGVmSWQiOiIxNDUxN2UxYS0zZmYwLWFmOTgtNDA4ZS0yYmQ2OTUzYzM2YTIiLCJtZXRhU2l0ZUlkIjoiYWRkYjM5MTItZDg2MC00ZTNkLWIyYWYtYTEwZTNhYTExNGQ3Iiwic2lnbkRhdGUiOiIyMDI2LTA0LTI1VDE0OjE2OjI5LjgzN1oiLCJkZW1vTW9kZSI6ZmFsc2UsIm9yaWdpbkluc3RhbmNlSWQiOiJkMzQwNzI0Ni1mMjM0LTRlZDQtOGY5Yy1iYzYxODZlZjE5ZTEiLCJhaWQiOiJhNzlkZDgyNi1mYTRjLTRiMjUtYjk1NS0yYmQ3OTRiOTczZjUiLCJiaVRva2VuIjoiMzJkMmUyMWMtYWMyYS0wM2RmLTAyN2ItMTcwZDU4MDI0MTdhIiwic2l0ZU93bmVySWQiOiIwNzA1YjgzYi02MjRhLTQ3ODYtOTA4OC0wYmRlZDMyY2VmMzYiLCJicyI6Im9seFVkZ1lOU0dhUjBmN0hsbTQ5WnBqREo5REhHeHZoTk9BN2cxMXRiYWMiLCJzY2QiOiIyMDIzLTA0LTI0VDE5OjIzOjQxLjc5OVoifQ¤cy=USD¤tCurrency=USD&commonConfig=%7B%22brand%22%3A%22wix%22%2C%22host%22%3A%22VIEWER%22%2C%22bsi%22%3A%22e02d625a-bc3d-4800-bdef-e2de573d71c5%7C1%22%2C%22siteRevision%22%3A%22805%22%2C%22renderingFlow%22%3A%22NONE%22%2C%22language%22%3A%22en%22%2C%22locale%22%3A%22en-us%22%2C%22BSI%22%3A%22e02d625a-bc3d-4800-bdef-e2de573d71c5%7C1%22%7D¤tRoute=.%2F&vsi=7aa05a45-4271-4b3e-ace5-4c2bf0f02d12"
+ },
+ {
+ "url": "https://actionnetwork.org/widgets/v5/form/student-debt-crisis-center?format=js&source=widget&js_inner=true"
+ },
+ {
+ "url": "https://actionnetwork.org/includes/js/jquery-min.js"
+ },
+ {
+ "url": "https://actionnetwork.org/includes/js/can-embed.js?v=69"
+ },
+ {
+ "url": "https://engage.wixapps.net/_api/chat-web/v1/real-time-tokens"
+ },
+ {
+ "url": "https://actionnetwork.org/includes/js/challenge.min.js?v=69"
+ },
+ {
+ "url": "https://actionnetwork.org/images/spinner8.png"
+ },
+ {
+ "url": "https://engage.wixapps.net/serverless/chat-event-reporter/report-event"
+ },
+ {
+ "url": "https://engage.wixapps.net/_api/presence-service/v1/set-data"
+ }
+ ]
+ }
+ }
+ ]
+ }
+ },
+ "js-libraries": {
+ "id": "js-libraries",
+ "title": "Detected JavaScript libraries",
+ "description": "All front-end JavaScript libraries detected on the page. [Learn more about this JavaScript library detection diagnostic audit](https://developer.chrome.com/docs/lighthouse/best-practices/js-libraries/).",
+ "score": 1,
+ "scoreDisplayMode": "informative",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "name",
+ "valueType": "text",
+ "label": "Name"
+ },
+ {
+ "key": "version",
+ "valueType": "text",
+ "label": "Version"
+ }
+ ],
+ "items": [
+ {
+ "name": "React",
+ "version": "18.3.1",
+ "npm": "react"
+ },
+ {
+ "name": "Lo-Dash",
+ "version": "4.17.21",
+ "npm": "lodash"
+ },
+ {
+ "name": "RequireJS",
+ "version": "2.3.6",
+ "npm": "requirejs"
+ }
+ ],
+ "debugData": {
+ "type": "debugdata",
+ "stacks": [
+ {
+ "id": "react",
+ "version": "18.3.1"
+ },
+ {
+ "id": "react-fast",
+ "version": "18.3.1"
+ },
+ {
+ "id": "lodash",
+ "version": "4.17.21"
+ },
+ {
+ "id": "requirejs",
+ "version": "2.3.6"
+ }
+ ]
+ }
+ }
+ },
+ "notification-on-start": {
+ "id": "notification-on-start",
+ "title": "Avoids requesting the notification permission on page load",
+ "description": "Users are mistrustful of or confused by sites that request to send notifications without context. Consider tying the request to user gestures instead. [Learn more about responsibly getting permission for notifications](https://developer.chrome.com/docs/lighthouse/best-practices/notification-on-start/).",
+ "score": 1,
+ "scoreDisplayMode": "binary",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "source",
+ "valueType": "source-location",
+ "label": "Source"
+ }
+ ],
+ "items": []
+ }
+ },
+ "paste-preventing-inputs": {
+ "id": "paste-preventing-inputs",
+ "title": "Allows users to paste into input fields",
+ "description": "Preventing input pasting is a bad practice for the UX, and weakens security by blocking password managers.[Learn more about user-friendly input fields](https://developer.chrome.com/docs/lighthouse/best-practices/paste-preventing-inputs/).",
+ "score": 1,
+ "scoreDisplayMode": "binary",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "node",
+ "valueType": "node",
+ "label": "Failing Elements"
+ }
+ ],
+ "items": []
+ }
+ },
+ "baseline": {
+ "id": "baseline",
+ "title": "Baseline Features",
+ "description": "Lists web features used on the page and their Baseline status as of 2026-03-18. [Learn more about Baseline](https://webstatus.dev/).",
+ "score": 1,
+ "scoreDisplayMode": "informative",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "featureId",
+ "valueType": "link",
+ "label": "Web-features"
+ },
+ {
+ "key": "displayStatus",
+ "valueType": "baseline-status",
+ "label": "Baseline Status"
+ },
+ {
+ "key": "source",
+ "valueType": "source-location",
+ "label": "Source"
+ }
+ ],
+ "items": [
+ {
+ "featureId": {
+ "type": "link",
+ "text": "long-animation-frames",
+ "url": "https://webstatus.dev/features/long-animation-frames"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "limited",
+ "displayString": "Limited Availability"
+ },
+ "source": {
+ "type": "source-location",
+ "url": "https://static.parastorage.com/services/wix-thunderbolt/dist/main.a5b51f31.bundle.min.js",
+ "urlProvider": "network",
+ "line": 2,
+ "column": 10227
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "scheduler",
+ "url": "https://webstatus.dev/features/scheduler"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "limited",
+ "displayString": "Limited Availability"
+ },
+ "source": {
+ "type": "source-location",
+ "url": "https://static.parastorage.com/services/wix-thunderbolt/dist/thunderbolt-commons.b6ac6398.bundle.min.js",
+ "urlProvider": "network",
+ "line": 6,
+ "column": 432
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "layout-instability",
+ "url": "https://webstatus.dev/features/layout-instability"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "limited",
+ "displayString": "Limited Availability"
+ },
+ "source": {
+ "type": "source-location",
+ "url": "https://static.parastorage.com/services/wix-thunderbolt/dist/main.a5b51f31.bundle.min.js",
+ "urlProvider": "network",
+ "line": 2,
+ "column": 10227
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "requestidlecallback",
+ "url": "https://webstatus.dev/features/requestidlecallback"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "limited",
+ "displayString": "Limited Availability"
+ },
+ "source": {
+ "type": "source-location",
+ "url": "_lighthouse-eval.js",
+ "urlProvider": "network",
+ "line": 23,
+ "column": 15
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "background-clip-text",
+ "url": "https://webstatus.dev/features/background-clip-text"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "limited",
+ "displayString": "Limited Availability"
+ },
+ "source": {
+ "type": "source-location",
+ "url": "https://actionnetwork.org/includes/js/jquery-min.js",
+ "urlProvider": "network",
+ "line": 0,
+ "column": 18001
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "ua-client-hints",
+ "url": "https://webstatus.dev/features/ua-client-hints"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "limited",
+ "displayString": "Limited Availability"
+ },
+ "source": {
+ "type": "source-location",
+ "url": "https://dist.eventscalendar.co/embed.js",
+ "urlProvider": "network",
+ "line": 2,
+ "column": 998840
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "speculation-rules",
+ "url": "https://webstatus.dev/features/speculation-rules"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "limited",
+ "displayString": "Limited Availability"
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "with",
+ "url": "https://webstatus.dev/features/with"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "limited",
+ "displayString": "Limited Availability"
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "fetch-priority",
+ "url": "https://webstatus.dev/features/fetch-priority"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "low",
+ "displayString": "Newly Available (2024-10-29)"
+ },
+ "source": {
+ "type": "source-location",
+ "url": "https://www.studentdebtcrisis.org/",
+ "urlProvider": "network",
+ "line": 1513,
+ "column": 6304
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "scrollbar-color",
+ "url": "https://webstatus.dev/features/scrollbar-color"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "low",
+ "displayString": "Newly Available (2025-12-12)"
+ },
+ "source": {
+ "type": "source-location",
+ "url": "https://dist.eventscalendar.co/embed.js",
+ "urlProvider": "network",
+ "line": 2,
+ "column": 1004036
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "active-view-transition",
+ "url": "https://webstatus.dev/features/active-view-transition"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "low",
+ "displayString": "Newly Available (2026-01-13)"
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "has",
+ "url": "https://webstatus.dev/features/has"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "low",
+ "displayString": "Newly Available (2023-12-19)"
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "scrollbar-width",
+ "url": "https://webstatus.dev/features/scrollbar-width"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "low",
+ "displayString": "Newly Available (2024-12-11)"
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "masks",
+ "url": "https://webstatus.dev/features/masks"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "low",
+ "displayString": "Newly Available (2023-12-07)"
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "backdrop-filter",
+ "url": "https://webstatus.dev/features/backdrop-filter"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "low",
+ "displayString": "Newly Available (2024-09-16)"
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "avif",
+ "url": "https://webstatus.dev/features/avif"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "low",
+ "displayString": "Newly Available (2024-01-25)"
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "http3",
+ "url": "https://webstatus.dev/features/http3"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "low",
+ "displayString": "Newly Available (2024-09-16)"
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "nullish-coalescing",
+ "url": "https://webstatus.dev/features/nullish-coalescing"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "high",
+ "displayString": "Widely Available (2020-09-16)"
+ },
+ "source": {
+ "type": "source-location",
+ "url": "https://www.studentdebtcrisis.org/",
+ "urlProvider": "network",
+ "line": 0,
+ "column": 0
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "request-animation-frame",
+ "url": "https://webstatus.dev/features/request-animation-frame"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "high",
+ "displayString": "Widely Available (2015-07-29)"
+ },
+ "source": {
+ "type": "source-location",
+ "url": "https://www.studentdebtcrisis.org/",
+ "urlProvider": "network",
+ "line": 1464,
+ "column": 8
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "intersection-observer",
+ "url": "https://webstatus.dev/features/intersection-observer"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "high",
+ "displayString": "Widely Available (2019-03-25)"
+ },
+ "source": {
+ "type": "source-location",
+ "url": "https://www.studentdebtcrisis.org/",
+ "urlProvider": "network",
+ "line": 1513,
+ "column": 7421
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "string-replaceall",
+ "url": "https://webstatus.dev/features/string-replaceall"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "high",
+ "displayString": "Widely Available (2020-08-27)"
+ },
+ "source": {
+ "type": "source-location",
+ "url": "https://www.studentdebtcrisis.org/",
+ "urlProvider": "network",
+ "line": 1588,
+ "column": 3849
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "focus-visible",
+ "url": "https://webstatus.dev/features/focus-visible"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "high",
+ "displayString": "Widely Available (2022-03-14)"
+ },
+ "source": {
+ "type": "source-location",
+ "url": "https://static.parastorage.com/services/cookie-consent-banner-for-uou/1.819.0//app.bundle.min.js",
+ "urlProvider": "network",
+ "line": 0,
+ "column": 51177
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "text-underline-offset",
+ "url": "https://webstatus.dev/features/text-underline-offset"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "high",
+ "displayString": "Widely Available (2020-11-19)"
+ },
+ "source": {
+ "type": "source-location",
+ "url": "https://static.parastorage.com/services/cookie-consent-banner-for-uou/1.819.0//app.bundle.min.js",
+ "urlProvider": "network",
+ "line": 0,
+ "column": 51154
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "web-animations",
+ "url": "https://webstatus.dev/features/web-animations"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "high",
+ "displayString": "Widely Available (2020-09-16)"
+ },
+ "source": {
+ "type": "source-location",
+ "url": "https://static.parastorage.com/services/wix-thunderbolt/dist/motion.4dedec96.chunk.min.js",
+ "urlProvider": "network",
+ "line": 0,
+ "column": 117434
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "text-indent",
+ "url": "https://webstatus.dev/features/text-indent"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "high",
+ "displayString": "Widely Available (2015-07-29)"
+ },
+ "source": {
+ "type": "source-location",
+ "url": "https://dist.eventscalendar.co/embed.js",
+ "urlProvider": "network",
+ "line": 2,
+ "column": 1004036
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "slot",
+ "url": "https://webstatus.dev/features/slot"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "high",
+ "displayString": "Widely Available (2020-01-15)"
+ },
+ "source": {
+ "type": "source-location",
+ "url": "https://actionnetwork.org/includes/js/jquery-min.js",
+ "urlProvider": "network",
+ "line": 0,
+ "column": 16231
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "structured-clone",
+ "url": "https://webstatus.dev/features/structured-clone"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "high",
+ "displayString": "Widely Available (2022-03-14)"
+ },
+ "source": {
+ "type": "source-location",
+ "url": "https://dist.eventscalendar.co/embed.js",
+ "urlProvider": "network",
+ "line": 2,
+ "column": 969521
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "outline",
+ "url": "https://webstatus.dev/features/outline"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "high",
+ "displayString": "Widely Available (2023-03-27)"
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "not",
+ "url": "https://webstatus.dev/features/not"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "high",
+ "displayString": "Widely Available (2021-01-21)"
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "quotes",
+ "url": "https://webstatus.dev/features/quotes"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "high",
+ "displayString": "Widely Available (2021-04-26)"
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "overflow-clip",
+ "url": "https://webstatus.dev/features/overflow-clip"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "high",
+ "displayString": "Widely Available (2022-09-12)"
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "logical-properties",
+ "url": "https://webstatus.dev/features/logical-properties"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "high",
+ "displayString": "Widely Available (2021-09-20)"
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "clip-path",
+ "url": "https://webstatus.dev/features/clip-path"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "high",
+ "displayString": "Widely Available (2021-01-21)"
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "is",
+ "url": "https://webstatus.dev/features/is"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "high",
+ "displayString": "Widely Available (2021-01-21)"
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "will-change",
+ "url": "https://webstatus.dev/features/will-change"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "high",
+ "displayString": "Widely Available (2020-01-15)"
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "scroll-snap",
+ "url": "https://webstatus.dev/features/scroll-snap"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "high",
+ "displayString": "Widely Available (2020-01-15)"
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "where",
+ "url": "https://webstatus.dev/features/where"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "high",
+ "displayString": "Widely Available (2021-01-21)"
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "animation-composition",
+ "url": "https://webstatus.dev/features/animation-composition"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "high",
+ "displayString": "Widely Available (2023-07-04)"
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "revert-value",
+ "url": "https://webstatus.dev/features/revert-value"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "high",
+ "displayString": "Widely Available (2020-07-27)"
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "grid",
+ "url": "https://webstatus.dev/features/grid"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "high",
+ "displayString": "Widely Available (2017-10-17)"
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "flexbox",
+ "url": "https://webstatus.dev/features/flexbox"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "high",
+ "displayString": "Widely Available (2015-09-30)"
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "logical-assignments",
+ "url": "https://webstatus.dev/features/logical-assignments"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "high",
+ "displayString": "Widely Available (2020-09-16)"
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "referrer-policy",
+ "url": "https://webstatus.dev/features/referrer-policy"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "high",
+ "displayString": "Widely Available (2021-09-20)"
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "media-query-range-syntax",
+ "url": "https://webstatus.dev/features/media-query-range-syntax"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "high",
+ "displayString": "Widely Available (2023-03-27)"
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "overflow-shorthand",
+ "url": "https://webstatus.dev/features/overflow-shorthand"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "high",
+ "displayString": "Widely Available (2020-03-24)"
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "appearance",
+ "url": "https://webstatus.dev/features/appearance"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "high",
+ "displayString": "Widely Available (2022-03-14)"
+ }
+ },
+ {
+ "featureId": {
+ "type": "link",
+ "text": "individual-transforms",
+ "url": "https://webstatus.dev/features/individual-transforms"
+ },
+ "displayStatus": {
+ "type": "baseline-status",
+ "status": "high",
+ "displayString": "Widely Available (2022-08-05)"
+ }
+ }
+ ]
+ }
+ },
+ "meta-description": {
+ "id": "meta-description",
+ "title": "Document has a meta description",
+ "description": "Meta descriptions may be included in search results to concisely summarize page content. [Learn more about the meta description](https://developer.chrome.com/docs/lighthouse/seo/meta-description/).",
+ "score": 1,
+ "scoreDisplayMode": "binary"
+ },
+ "http-status-code": {
+ "id": "http-status-code",
+ "title": "Page has successful HTTP status code",
+ "description": "Pages with unsuccessful HTTP status codes may not be indexed properly. [Learn more about HTTP status codes](https://developer.chrome.com/docs/lighthouse/seo/http-status-code/).",
+ "score": 1,
+ "scoreDisplayMode": "binary"
+ },
+ "link-text": {
+ "id": "link-text",
+ "title": "Links do not have descriptive text",
+ "description": "Descriptive link text helps search engines understand your content. [Learn how to make links more accessible](https://developer.chrome.com/docs/lighthouse/seo/link-text/).",
+ "score": 0,
+ "scoreDisplayMode": "binary",
+ "displayValue": "1 link found",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "href",
+ "valueType": "url",
+ "label": "Link destination"
+ },
+ {
+ "key": "text",
+ "valueType": "text",
+ "label": "Link Text"
+ }
+ ],
+ "items": [
+ {
+ "href": "https://www.studentdebtcrisis.org/news",
+ "text": "Read More",
+ "textLang": "en"
+ }
+ ]
+ }
+ },
+ "crawlable-anchors": {
+ "id": "crawlable-anchors",
+ "title": "Links are crawlable",
+ "description": "Search engines may use `href` attributes on links to crawl websites. Ensure that the `href` attribute of anchor elements links to an appropriate destination, so more pages of the site can be discovered. [Learn how to make links crawlable](https://support.google.com/webmasters/answer/9112205)",
+ "score": 1,
+ "scoreDisplayMode": "binary",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "node",
+ "valueType": "node",
+ "label": "Uncrawlable Link"
+ }
+ ],
+ "items": []
+ }
+ },
+ "is-crawlable": {
+ "id": "is-crawlable",
+ "title": "Page isn’t blocked from indexing",
+ "description": "Search engines are unable to include your pages in search results if they don't have permission to crawl them. [Learn more about crawler directives](https://developer.chrome.com/docs/lighthouse/seo/is-crawlable/).",
+ "score": 1,
+ "scoreDisplayMode": "binary",
+ "warnings": [],
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "source",
+ "valueType": "code",
+ "label": "Blocking Directive Source"
+ }
+ ],
+ "items": []
+ }
+ },
+ "robots-txt": {
+ "id": "robots-txt",
+ "title": "robots.txt is valid",
+ "description": "If your robots.txt file is malformed, crawlers may not be able to understand how you want your website to be crawled or indexed. [Learn more about robots.txt](https://developer.chrome.com/docs/lighthouse/seo/invalid-robots-txt/).",
+ "score": 1,
+ "scoreDisplayMode": "binary",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "index",
+ "valueType": "text",
+ "label": "Line #"
+ },
+ {
+ "key": "line",
+ "valueType": "code",
+ "label": "Content"
+ },
+ {
+ "key": "message",
+ "valueType": "code",
+ "label": "Error"
+ }
+ ],
+ "items": []
+ }
+ },
+ "hreflang": {
+ "id": "hreflang",
+ "title": "Document has a valid `hreflang`",
+ "description": "hreflang links tell search engines what version of a page they should list in search results for a given language or region. [Learn more about `hreflang`](https://developer.chrome.com/docs/lighthouse/seo/hreflang/).",
+ "score": 1,
+ "scoreDisplayMode": "binary",
+ "details": {
+ "type": "table",
+ "headings": [
+ {
+ "key": "source",
+ "valueType": "code",
+ "subItemsHeading": {
+ "key": "reason",
+ "valueType": "text"
+ },
+ "label": ""
+ }
+ ],
+ "items": []
+ }
+ },
+ "canonical": {
+ "id": "canonical",
+ "title": "Document has a valid `rel=canonical`",
+ "description": "Canonical links suggest which URL to show in search results. [Learn more about canonical links](https://developer.chrome.com/docs/lighthouse/seo/canonical/).",
+ "score": 1,
+ "scoreDisplayMode": "binary"
+ },
+ "structured-data": {
+ "id": "structured-data",
+ "title": "Structured data is valid",
+ "description": "Run the [Structured Data Testing Tool](https://developers.google.com/search/docs/appearance/structured-data/) to validate structured data. [Learn more about Structured Data](https://developer.chrome.com/docs/lighthouse/seo/structured-data/).",
+ "score": null,
+ "scoreDisplayMode": "manual"
+ }
+ },
+ "configSettings": {
+ "output": [
+ "json",
+ "html"
+ ],
+ "maxWaitForFcp": 30000,
+ "maxWaitForLoad": 30000,
+ "pauseAfterFcpMs": 1000,
+ "pauseAfterLoadMs": 1000,
+ "networkQuietThresholdMs": 1000,
+ "cpuQuietThresholdMs": 1000,
+ "formFactor": "desktop",
+ "throttling": {
+ "rttMs": 150,
+ "throughputKbps": 1638.4,
+ "requestLatencyMs": 562.5,
+ "downloadThroughputKbps": 1474.5600000000002,
+ "uploadThroughputKbps": 675,
+ "cpuSlowdownMultiplier": 4
+ },
+ "throttlingMethod": "simulate",
+ "screenEmulation": {
+ "mobile": false,
+ "width": 1350,
+ "height": 940,
+ "deviceScaleFactor": 1,
+ "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": "node",
+ "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": [
+ "accessibility",
+ "seo",
+ "best-practices"
+ ],
+ "skipAudits": null
+ },
+ "categories": {
+ "accessibility": {
+ "title": "Accessibility",
+ "description": "These checks highlight opportunities to [improve the accessibility of your web app](https://developer.chrome.com/docs/lighthouse/accessibility/). Automatic detection can only detect a subset of issues and does not guarantee the accessibility of your web app, so [manual testing](https://web.dev/articles/how-to-review) is also encouraged.",
+ "manualDescription": "These items address areas which an automated testing tool cannot cover. Learn more in our guide on [conducting an accessibility review](https://web.dev/articles/how-to-review).",
+ "supportedModes": [
+ "navigation",
+ "snapshot"
+ ],
+ "auditRefs": [
+ {
+ "id": "accesskeys",
+ "weight": 0,
+ "group": "a11y-navigation"
+ },
+ {
+ "id": "aria-allowed-attr",
+ "weight": 10,
+ "group": "a11y-aria"
+ },
+ {
+ "id": "aria-command-name",
+ "weight": 7,
+ "group": "a11y-aria"
+ },
+ {
+ "id": "aria-conditional-attr",
+ "weight": 7,
+ "group": "a11y-aria"
+ },
+ {
+ "id": "aria-deprecated-role",
+ "weight": 1,
+ "group": "a11y-aria"
+ },
+ {
+ "id": "aria-dialog-name",
+ "weight": 0,
+ "group": "a11y-aria"
+ },
+ {
+ "id": "aria-hidden-body",
+ "weight": 10,
+ "group": "a11y-aria"
+ },
+ {
+ "id": "aria-hidden-focus",
+ "weight": 7,
+ "group": "a11y-aria"
+ },
+ {
+ "id": "aria-input-field-name",
+ "weight": 0,
+ "group": "a11y-aria"
+ },
+ {
+ "id": "aria-meter-name",
+ "weight": 0,
+ "group": "a11y-aria"
+ },
+ {
+ "id": "aria-progressbar-name",
+ "weight": 0,
+ "group": "a11y-aria"
+ },
+ {
+ "id": "aria-prohibited-attr",
+ "weight": 7,
+ "group": "a11y-aria"
+ },
+ {
+ "id": "aria-required-attr",
+ "weight": 10,
+ "group": "a11y-aria"
+ },
+ {
+ "id": "aria-required-children",
+ "weight": 0,
+ "group": "a11y-aria"
+ },
+ {
+ "id": "aria-required-parent",
+ "weight": 0,
+ "group": "a11y-aria"
+ },
+ {
+ "id": "aria-roles",
+ "weight": 10,
+ "group": "a11y-aria"
+ },
+ {
+ "id": "aria-text",
+ "weight": 0,
+ "group": "a11y-aria"
+ },
+ {
+ "id": "aria-toggle-field-name",
+ "weight": 0,
+ "group": "a11y-aria"
+ },
+ {
+ "id": "aria-tooltip-name",
+ "weight": 0,
+ "group": "a11y-aria"
+ },
+ {
+ "id": "aria-treeitem-name",
+ "weight": 0,
+ "group": "a11y-aria"
+ },
+ {
+ "id": "aria-valid-attr-value",
+ "weight": 10,
+ "group": "a11y-aria"
+ },
+ {
+ "id": "aria-valid-attr",
+ "weight": 10,
+ "group": "a11y-aria"
+ },
+ {
+ "id": "button-name",
+ "weight": 10,
+ "group": "a11y-names-labels"
+ },
+ {
+ "id": "bypass",
+ "weight": 0,
+ "group": "a11y-navigation"
+ },
+ {
+ "id": "color-contrast",
+ "weight": 7,
+ "group": "a11y-color-contrast"
+ },
+ {
+ "id": "definition-list",
+ "weight": 0,
+ "group": "a11y-tables-lists"
+ },
+ {
+ "id": "dlitem",
+ "weight": 0,
+ "group": "a11y-tables-lists"
+ },
+ {
+ "id": "document-title",
+ "weight": 7,
+ "group": "a11y-names-labels"
+ },
+ {
+ "id": "duplicate-id-aria",
+ "weight": 0,
+ "group": "a11y-aria"
+ },
+ {
+ "id": "form-field-multiple-labels",
+ "weight": 0,
+ "group": "a11y-names-labels"
+ },
+ {
+ "id": "frame-title",
+ "weight": 7,
+ "group": "a11y-names-labels"
+ },
+ {
+ "id": "heading-order",
+ "weight": 3,
+ "group": "a11y-navigation"
+ },
+ {
+ "id": "html-has-lang",
+ "weight": 7,
+ "group": "a11y-language"
+ },
+ {
+ "id": "html-lang-valid",
+ "weight": 7,
+ "group": "a11y-language"
+ },
+ {
+ "id": "html-xml-lang-mismatch",
+ "weight": 0,
+ "group": "a11y-language"
+ },
+ {
+ "id": "image-alt",
+ "weight": 10,
+ "group": "a11y-names-labels"
+ },
+ {
+ "id": "input-button-name",
+ "weight": 0,
+ "group": "a11y-names-labels"
+ },
+ {
+ "id": "input-image-alt",
+ "weight": 0,
+ "group": "a11y-names-labels"
+ },
+ {
+ "id": "label",
+ "weight": 0,
+ "group": "a11y-names-labels"
+ },
+ {
+ "id": "link-in-text-block",
+ "weight": 0,
+ "group": "a11y-color-contrast"
+ },
+ {
+ "id": "link-name",
+ "weight": 7,
+ "group": "a11y-names-labels"
+ },
+ {
+ "id": "list",
+ "weight": 7,
+ "group": "a11y-tables-lists"
+ },
+ {
+ "id": "listitem",
+ "weight": 7,
+ "group": "a11y-tables-lists"
+ },
+ {
+ "id": "meta-refresh",
+ "weight": 0,
+ "group": "a11y-best-practices"
+ },
+ {
+ "id": "meta-viewport",
+ "weight": 10,
+ "group": "a11y-best-practices"
+ },
+ {
+ "id": "object-alt",
+ "weight": 0,
+ "group": "a11y-names-labels"
+ },
+ {
+ "id": "select-name",
+ "weight": 0,
+ "group": "a11y-names-labels"
+ },
+ {
+ "id": "skip-link",
+ "weight": 0,
+ "group": "a11y-names-labels"
+ },
+ {
+ "id": "tabindex",
+ "weight": 7,
+ "group": "a11y-navigation"
+ },
+ {
+ "id": "target-size",
+ "weight": 7,
+ "group": "a11y-best-practices"
+ },
+ {
+ "id": "td-headers-attr",
+ "weight": 0,
+ "group": "a11y-tables-lists"
+ },
+ {
+ "id": "th-has-data-cells",
+ "weight": 0,
+ "group": "a11y-tables-lists"
+ },
+ {
+ "id": "valid-lang",
+ "weight": 0,
+ "group": "a11y-language"
+ },
+ {
+ "id": "video-caption",
+ "weight": 0,
+ "group": "a11y-audio-video"
+ },
+ {
+ "id": "landmark-one-main",
+ "weight": 3,
+ "group": "a11y-best-practices"
+ },
+ {
+ "id": "autocomplete-valid",
+ "weight": 0,
+ "group": "a11y-best-practices"
+ },
+ {
+ "id": "presentation-role-conflict",
+ "weight": 1,
+ "group": "a11y-best-practices"
+ },
+ {
+ "id": "svg-img-alt",
+ "weight": 0,
+ "group": "a11y-best-practices"
+ },
+ {
+ "id": "focusable-controls",
+ "weight": 0
+ },
+ {
+ "id": "interactive-element-affordance",
+ "weight": 0
+ },
+ {
+ "id": "logical-tab-order",
+ "weight": 0
+ },
+ {
+ "id": "visual-order-follows-dom",
+ "weight": 0
+ },
+ {
+ "id": "focus-traps",
+ "weight": 0
+ },
+ {
+ "id": "managed-focus",
+ "weight": 0
+ },
+ {
+ "id": "use-landmarks",
+ "weight": 0
+ },
+ {
+ "id": "offscreen-content-hidden",
+ "weight": 0
+ },
+ {
+ "id": "custom-controls-labels",
+ "weight": 0
+ },
+ {
+ "id": "custom-controls-roles",
+ "weight": 0
+ },
+ {
+ "id": "table-duplicate-name",
+ "weight": 0,
+ "group": "a11y-best-practices"
+ },
+ {
+ "id": "empty-heading",
+ "weight": 0,
+ "group": "a11y-best-practices"
+ },
+ {
+ "id": "aria-allowed-role",
+ "weight": 0,
+ "group": "a11y-best-practices"
+ },
+ {
+ "id": "image-redundant-alt",
+ "weight": 0,
+ "group": "a11y-names-labels"
+ },
+ {
+ "id": "identical-links-same-purpose",
+ "weight": 0,
+ "group": "a11y-best-practices"
+ },
+ {
+ "id": "label-content-name-mismatch",
+ "weight": 0,
+ "group": "hidden"
+ },
+ {
+ "id": "table-fake-caption",
+ "weight": 0,
+ "group": "hidden"
+ },
+ {
+ "id": "td-has-header",
+ "weight": 0,
+ "group": "hidden"
+ }
+ ],
+ "id": "accessibility",
+ "score": 0.93
+ },
+ "best-practices": {
+ "title": "Best Practices",
+ "supportedModes": [
+ "navigation",
+ "timespan",
+ "snapshot"
+ ],
+ "auditRefs": [
+ {
+ "id": "is-on-https",
+ "weight": 5,
+ "group": "best-practices-trust-safety"
+ },
+ {
+ "id": "redirects-http",
+ "weight": 0,
+ "group": "best-practices-trust-safety"
+ },
+ {
+ "id": "geolocation-on-start",
+ "weight": 1,
+ "group": "best-practices-trust-safety"
+ },
+ {
+ "id": "notification-on-start",
+ "weight": 1,
+ "group": "best-practices-trust-safety"
+ },
+ {
+ "id": "csp-xss",
+ "weight": 0,
+ "group": "best-practices-trust-safety"
+ },
+ {
+ "id": "has-hsts",
+ "weight": 0,
+ "group": "best-practices-trust-safety"
+ },
+ {
+ "id": "origin-isolation",
+ "weight": 0,
+ "group": "best-practices-trust-safety"
+ },
+ {
+ "id": "clickjacking-mitigation",
+ "weight": 0,
+ "group": "best-practices-trust-safety"
+ },
+ {
+ "id": "trusted-types-xss",
+ "weight": 0,
+ "group": "best-practices-trust-safety"
+ },
+ {
+ "id": "paste-preventing-inputs",
+ "weight": 3,
+ "group": "best-practices-ux"
+ },
+ {
+ "id": "image-aspect-ratio",
+ "weight": 1,
+ "group": "best-practices-ux"
+ },
+ {
+ "id": "image-size-responsive",
+ "weight": 1,
+ "group": "best-practices-ux"
+ },
+ {
+ "id": "doctype",
+ "weight": 1,
+ "group": "best-practices-browser-compat"
+ },
+ {
+ "id": "charset",
+ "weight": 1,
+ "group": "best-practices-browser-compat"
+ },
+ {
+ "id": "baseline",
+ "weight": 0,
+ "group": "best-practices-browser-compat"
+ },
+ {
+ "id": "js-libraries",
+ "weight": 0,
+ "group": "best-practices-general"
+ },
+ {
+ "id": "deprecations",
+ "weight": 5,
+ "group": "best-practices-general"
+ },
+ {
+ "id": "third-party-cookies",
+ "weight": 5,
+ "group": "best-practices-general"
+ },
+ {
+ "id": "errors-in-console",
+ "weight": 1,
+ "group": "best-practices-general"
+ },
+ {
+ "id": "valid-source-maps",
+ "weight": 0,
+ "group": "best-practices-general"
+ },
+ {
+ "id": "inspector-issues",
+ "weight": 1,
+ "group": "best-practices-general"
+ }
+ ],
+ "id": "best-practices",
+ "score": 0.73
+ },
+ "seo": {
+ "title": "SEO",
+ "description": "These checks ensure that your page is following basic search engine optimization advice. There are many additional factors Lighthouse does not score here that may affect your search ranking, including performance on [Core Web Vitals](https://web.dev/explore/vitals). [Learn more about Google Search Essentials](https://support.google.com/webmasters/answer/35769).",
+ "manualDescription": "Run these additional validators on your site to check additional SEO best practices.",
+ "supportedModes": [
+ "navigation",
+ "snapshot"
+ ],
+ "auditRefs": [
+ {
+ "id": "is-crawlable",
+ "weight": 4.043478260869565,
+ "group": "seo-crawl"
+ },
+ {
+ "id": "document-title",
+ "weight": 1,
+ "group": "seo-content"
+ },
+ {
+ "id": "meta-description",
+ "weight": 1,
+ "group": "seo-content"
+ },
+ {
+ "id": "http-status-code",
+ "weight": 1,
+ "group": "seo-crawl"
+ },
+ {
+ "id": "link-text",
+ "weight": 1,
+ "group": "seo-content"
+ },
+ {
+ "id": "crawlable-anchors",
+ "weight": 1,
+ "group": "seo-crawl"
+ },
+ {
+ "id": "robots-txt",
+ "weight": 1,
+ "group": "seo-crawl"
+ },
+ {
+ "id": "image-alt",
+ "weight": 1,
+ "group": "seo-content"
+ },
+ {
+ "id": "hreflang",
+ "weight": 1,
+ "group": "seo-content"
+ },
+ {
+ "id": "canonical",
+ "weight": 1,
+ "group": "seo-content"
+ },
+ {
+ "id": "structured-data",
+ "weight": 0
+ }
+ ],
+ "id": "seo",
+ "score": 0.92
+ }
+ },
+ "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": [
+ {
+ "id": "react",
+ "title": "React",
+ "iconDataURL": "data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 841.9 595.3\"><g fill=\"%2361DAFB\"><path d=\"M666.3 296.5c0-32.5-40.7-63.3-103.1-82.4 14.4-63.6 8-114.2-20.2-130.4-6.5-3.8-14.1-5.6-22.4-5.6v22.3c4.6 0 8.3.9 11.4 2.6 13.6 7.8 19.5 37.5 14.9 75.7-1.1 9.4-2.9 19.3-5.1 29.4-19.6-4.8-41-8.5-63.5-10.9-13.5-18.5-27.5-35.3-41.6-50 32.6-30.3 63.2-46.9 84-46.9V78c-27.5 0-63.5 19.6-99.9 53.6-36.4-33.8-72.4-53.2-99.9-53.2v22.3c20.7 0 51.4 16.5 84 46.6-14 14.7-28 31.4-41.3 49.9-22.6 2.4-44 6.1-63.6 11-2.3-10-4-19.7-5.2-29-4.7-38.2 1.1-67.9 14.6-75.8 3-1.8 6.9-2.6 11.5-2.6V78.5c-8.4 0-16 1.8-22.6 5.6-28.1 16.2-34.4 66.7-19.9 130.1-62.2 19.2-102.7 49.9-102.7 82.3 0 32.5 40.7 63.3 103.1 82.4-14.4 63.6-8 114.2 20.2 130.4 6.5 3.8 14.1 5.6 22.5 5.6 27.5 0 63.5-19.6 99.9-53.6 36.4 33.8 72.4 53.2 99.9 53.2 8.4 0 16-1.8 22.6-5.6 28.1-16.2 34.4-66.7 19.9-130.1 62-19.1 102.5-49.9 102.5-82.3zm-130.2-66.7c-3.7 12.9-8.3 26.2-13.5 39.5-4.1-8-8.4-16-13.1-24-4.6-8-9.5-15.8-14.4-23.4 14.2 2.1 27.9 4.7 41 7.9zm-45.8 106.5c-7.8 13.5-15.8 26.3-24.1 38.2-14.9 1.3-30 2-45.2 2-15.1 0-30.2-.7-45-1.9-8.3-11.9-16.4-24.6-24.2-38-7.6-13.1-14.5-26.4-20.8-39.8 6.2-13.4 13.2-26.8 20.7-39.9 7.8-13.5 15.8-26.3 24.1-38.2 14.9-1.3 30-2 45.2-2 15.1 0 30.2.7 45 1.9 8.3 11.9 16.4 24.6 24.2 38 7.6 13.1 14.5 26.4 20.8 39.8-6.3 13.4-13.2 26.8-20.7 39.9zm32.3-13c5.4 13.4 10 26.8 13.8 39.8-13.1 3.2-26.9 5.9-41.2 8 4.9-7.7 9.8-15.6 14.4-23.7 4.6-8 8.9-16.1 13-24.1zM421.2 430c-9.3-9.6-18.6-20.3-27.8-32 9 .4 18.2.7 27.5.7 9.4 0 18.7-.2 27.8-.7-9 11.7-18.3 22.4-27.5 32zm-74.4-58.9c-14.2-2.1-27.9-4.7-41-7.9 3.7-12.9 8.3-26.2 13.5-39.5 4.1 8 8.4 16 13.1 24 4.7 8 9.5 15.8 14.4 23.4zM420.7 163c9.3 9.6 18.6 20.3 27.8 32-9-.4-18.2-.7-27.5-.7-9.4 0-18.7.2-27.8.7 9-11.7 18.3-22.4 27.5-32zm-74 58.9c-4.9 7.7-9.8 15.6-14.4 23.7-4.6 8-8.9 16-13 24-5.4-13.4-10-26.8-13.8-39.8 13.1-3.1 26.9-5.8 41.2-7.9zm-90.5 125.2c-35.4-15.1-58.3-34.9-58.3-50.6 0-15.7 22.9-35.6 58.3-50.6 8.6-3.7 18-7 27.7-10.1 5.7 19.6 13.2 40 22.5 60.9-9.2 20.8-16.6 41.1-22.2 60.6-9.9-3.1-19.3-6.5-28-10.2zM310 490c-13.6-7.8-19.5-37.5-14.9-75.7 1.1-9.4 2.9-19.3 5.1-29.4 19.6 4.8 41 8.5 63.5 10.9 13.5 18.5 27.5 35.3 41.6 50-32.6 30.3-63.2 46.9-84 46.9-4.5-.1-8.3-1-11.3-2.7zm237.2-76.2c4.7 38.2-1.1 67.9-14.6 75.8-3 1.8-6.9 2.6-11.5 2.6-20.7 0-51.4-16.5-84-46.6 14-14.7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-27.7 10.1-5.7-19.6-13.2-40-22.5-60.9 9.2-20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-58.4 50.6zM320.8 78.4z\"/><circle cx=\"420.9\" cy=\"296.5\" r=\"45.7\"/><path d=\"M520.5 78.1z\"/></g></svg>",
+ "descriptions": {
+ "unminified-css": "If your build system minifies CSS files automatically, ensure that you are deploying the production build of your application. You can check this with the React Developer Tools extension. [Learn more](https://reactjs.org/docs/optimizing-performance.html#use-the-production-build).",
+ "unminified-javascript": "If your build system minifies JS files automatically, ensure that you are deploying the production build of your application. You can check this with the React Developer Tools extension. [Learn more](https://reactjs.org/docs/optimizing-performance.html#use-the-production-build).",
+ "unused-javascript": "If you are not server-side rendering, [split your JavaScript bundles](https://web.dev/code-splitting-suspense/) with `React.lazy()`. Otherwise, code-split using a third-party library such as [loadable-components](https://loadable-components.com/).",
+ "server-response-time": "If you are server-side rendering any React components, consider using `renderToPipeableStream()` or `renderToStaticNodeStream()` to allow the client to receive and hydrate different parts of the markup instead of all at once. [Learn more](https://reactjs.org/docs/react-dom-server.html#renderToPipeableStream).",
+ "redirects": "If you are using React Router, minimize usage of the `<Redirect>` component for [route navigations](https://reacttraining.com/react-router/web/api/Redirect).",
+ "user-timings": "Use the React DevTools Profiler, which makes use of the Profiler API, to measure the rendering performance of your components. [Learn more.](https://reactjs.org/blog/2018/09/10/introducing-the-react-profiler.html)",
+ "dom-size": "Consider using a \"windowing\" library like `react-window` to minimize the number of DOM nodes created if you are rendering many repeated elements on the page. [Learn more](https://web.dev/virtualize-long-lists-react-window/). Also, minimize unnecessary re-renders using [`shouldComponentUpdate`](https://reactjs.org/docs/optimizing-performance.html#shouldcomponentupdate-in-action), [`PureComponent`](https://reactjs.org/docs/react-api.html#reactpurecomponent), or [`React.memo`](https://reactjs.org/docs/react-api.html#reactmemo) and [skip effects](https://reactjs.org/docs/hooks-effect.html#tip-optimizing-performance-by-skipping-effects) only until certain dependencies have changed if you are using the `Effect` hook to improve runtime performance."
+ }
+ }
+ ],
+ "entities": [],
+ "timing": {
+ "entries": [
+ {
+ "startTime": 1530919.18,
+ "name": "lh:config",
+ "duration": 150.99,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1530921.45,
+ "name": "lh:config:resolveArtifactsToDefns",
+ "duration": 1.44,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1531070.33,
+ "name": "lh:runner:gather",
+ "duration": 8518.49,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1531070.52,
+ "name": "lh:driver:connect",
+ "duration": 4.4,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1531075.15,
+ "name": "lh:driver:navigate",
+ "duration": 99.68,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1531175.14,
+ "name": "lh:gather:getBenchmarkIndex",
+ "duration": 1002.87,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1532178.13,
+ "name": "lh:gather:getVersion",
+ "duration": 0.39,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1532178.56,
+ "name": "lh:gather:getDevicePixelRatio",
+ "duration": 0.71,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1532179.45,
+ "name": "lh:prepare:navigationMode",
+ "duration": 128.55,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1532179.91,
+ "name": "lh:gather:getVersion",
+ "duration": 0.22,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1532190.04,
+ "name": "lh:storage:clearDataForOrigin",
+ "duration": 8.21,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1532198.49,
+ "name": "lh:storage:clearBrowserCaches",
+ "duration": 108.6,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1532307.65,
+ "name": "lh:gather:prepareThrottlingAndNetwork",
+ "duration": 0.33,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1532348.08,
+ "name": "lh:driver:navigate",
+ "duration": 4554.14,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1538512.18,
+ "name": "lh:computed:NetworkRecords",
+ "duration": 4.85,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1538517.38,
+ "name": "lh:gather:getArtifact:DevtoolsLog",
+ "duration": 0.01,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1538517.41,
+ "name": "lh:gather:getArtifact:Trace",
+ "duration": 0.01,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1538517.42,
+ "name": "lh:gather:getArtifact:Accessibility",
+ "duration": 565.34,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539082.82,
+ "name": "lh:gather:getArtifact:AnchorElements",
+ "duration": 26.97,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539109.83,
+ "name": "lh:gather:getArtifact:ConsoleMessages",
+ "duration": 0.04,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539109.89,
+ "name": "lh:gather:getArtifact:Doctype",
+ "duration": 0.91,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539110.82,
+ "name": "lh:gather:getArtifact:Inputs",
+ "duration": 2.14,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539113.01,
+ "name": "lh:gather:getArtifact:ImageElements",
+ "duration": 118.84,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539232.01,
+ "name": "lh:gather:getArtifact:InspectorIssues",
+ "duration": 0.43,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539232.45,
+ "name": "lh:gather:getArtifact:LinkElements",
+ "duration": 3.45,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539235.22,
+ "name": "lh:computed:MainResource",
+ "duration": 0.11,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539235.93,
+ "name": "lh:gather:getArtifact:MainDocumentContent",
+ "duration": 23.2,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539259.17,
+ "name": "lh:gather:getArtifact:MetaElements",
+ "duration": 3.01,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539262.21,
+ "name": "lh:gather:getArtifact:NetworkUserAgent",
+ "duration": 0.02,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539262.24,
+ "name": "lh:gather:getArtifact:RobotsTxt",
+ "duration": 143.75,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539406.05,
+ "name": "lh:gather:getArtifact:Scripts",
+ "duration": 0.27,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539406.36,
+ "name": "lh:gather:getArtifact:SourceMaps",
+ "duration": 173.66,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539580.06,
+ "name": "lh:gather:getArtifact:Stacks",
+ "duration": 6.69,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539580.16,
+ "name": "lh:gather:collectStacks",
+ "duration": 6.57,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539586.76,
+ "name": "lh:gather:getArtifact:ViewportDimensions",
+ "duration": 0.56,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539587.34,
+ "name": "lh:gather:getArtifact:FullPageScreenshot",
+ "duration": 0.02,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539589,
+ "name": "lh:runner:audit",
+ "duration": 312.59,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539589.06,
+ "name": "lh:runner:auditing",
+ "duration": 312.32,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539589.46,
+ "name": "lh:audit:is-on-https",
+ "duration": 0.67,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539590.24,
+ "name": "lh:audit:redirects-http",
+ "duration": 0.42,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539590.78,
+ "name": "lh:audit:errors-in-console",
+ "duration": 153.28,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539590.99,
+ "name": "lh:computed:JSBundles",
+ "duration": 151.38,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539744.2,
+ "name": "lh:audit:image-aspect-ratio",
+ "duration": 0.54,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539744.88,
+ "name": "lh:audit:image-size-responsive",
+ "duration": 0.93,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539745.16,
+ "name": "lh:computed:ImageRecords",
+ "duration": 0.25,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539745.91,
+ "name": "lh:audit:deprecations",
+ "duration": 0.54,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539746.56,
+ "name": "lh:audit:third-party-cookies",
+ "duration": 6.73,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539753.6,
+ "name": "lh:audit:valid-source-maps",
+ "duration": 2.19,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539753.98,
+ "name": "lh:computed:EntityClassification",
+ "duration": 0.03,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539755.92,
+ "name": "lh:audit:csp-xss",
+ "duration": 3.5,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539759.52,
+ "name": "lh:audit:has-hsts",
+ "duration": 0.64,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539760.25,
+ "name": "lh:audit:origin-isolation",
+ "duration": 0.41,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539760.75,
+ "name": "lh:audit:clickjacking-mitigation",
+ "duration": 0.41,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539761.24,
+ "name": "lh:audit:trusted-types-xss",
+ "duration": 0.41,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539761.76,
+ "name": "lh:audit:accesskeys",
+ "duration": 0.5,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539762.37,
+ "name": "lh:audit:aria-allowed-attr",
+ "duration": 1.84,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539764.34,
+ "name": "lh:audit:aria-allowed-role",
+ "duration": 1.73,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539766.23,
+ "name": "lh:audit:aria-command-name",
+ "duration": 1.65,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539768,
+ "name": "lh:audit:aria-conditional-attr",
+ "duration": 1.78,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539770.04,
+ "name": "lh:audit:aria-deprecated-role",
+ "duration": 1.69,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539771.86,
+ "name": "lh:audit:aria-dialog-name",
+ "duration": 0.4,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539772.37,
+ "name": "lh:audit:aria-hidden-body",
+ "duration": 3.59,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539776.12,
+ "name": "lh:audit:aria-hidden-focus",
+ "duration": 1.75,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539778.03,
+ "name": "lh:audit:aria-input-field-name",
+ "duration": 0.51,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539778.66,
+ "name": "lh:audit:aria-meter-name",
+ "duration": 0.49,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539779.26,
+ "name": "lh:audit:aria-progressbar-name",
+ "duration": 0.53,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539779.89,
+ "name": "lh:audit:aria-prohibited-attr",
+ "duration": 1.56,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539781.55,
+ "name": "lh:audit:aria-required-attr",
+ "duration": 1.6,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539783.27,
+ "name": "lh:audit:aria-required-children",
+ "duration": 3.48,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539786.93,
+ "name": "lh:audit:aria-required-parent",
+ "duration": 0.6,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539787.64,
+ "name": "lh:audit:aria-roles",
+ "duration": 1.64,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539789.41,
+ "name": "lh:audit:aria-text",
+ "duration": 0.64,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539790.15,
+ "name": "lh:audit:aria-toggle-field-name",
+ "duration": 0.66,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539790.93,
+ "name": "lh:audit:aria-tooltip-name",
+ "duration": 0.72,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539791.79,
+ "name": "lh:audit:aria-treeitem-name",
+ "duration": 0.75,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539792.65,
+ "name": "lh:audit:aria-valid-attr-value",
+ "duration": 1.76,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539794.51,
+ "name": "lh:audit:aria-valid-attr",
+ "duration": 1.62,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539796.24,
+ "name": "lh:audit:button-name",
+ "duration": 4.26,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539800.63,
+ "name": "lh:audit:bypass",
+ "duration": 1.54,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539802.3,
+ "name": "lh:audit:color-contrast",
+ "duration": 1.44,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539803.86,
+ "name": "lh:audit:definition-list",
+ "duration": 0.74,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539804.7,
+ "name": "lh:audit:dlitem",
+ "duration": 0.73,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539805.53,
+ "name": "lh:audit:document-title",
+ "duration": 1.41,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539807.04,
+ "name": "lh:audit:duplicate-id-aria",
+ "duration": 0.72,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539811.07,
+ "name": "lh:audit:empty-heading",
+ "duration": 1.49,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539812.68,
+ "name": "lh:audit:form-field-multiple-labels",
+ "duration": 0.77,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539813.55,
+ "name": "lh:audit:frame-title",
+ "duration": 1.4,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539815.05,
+ "name": "lh:audit:heading-order",
+ "duration": 1.44,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539816.6,
+ "name": "lh:audit:html-has-lang",
+ "duration": 1.59,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539818.29,
+ "name": "lh:audit:html-lang-valid",
+ "duration": 3.65,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539822.06,
+ "name": "lh:audit:html-xml-lang-mismatch",
+ "duration": 0.88,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539823.05,
+ "name": "lh:audit:identical-links-same-purpose",
+ "duration": 1.54,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539824.71,
+ "name": "lh:audit:image-alt",
+ "duration": 1.44,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539826.26,
+ "name": "lh:audit:image-redundant-alt",
+ "duration": 1.61,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539827.97,
+ "name": "lh:audit:input-button-name",
+ "duration": 0.86,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539828.93,
+ "name": "lh:audit:input-image-alt",
+ "duration": 0.9,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539829.94,
+ "name": "lh:audit:label-content-name-mismatch",
+ "duration": 6.48,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539836.55,
+ "name": "lh:audit:label",
+ "duration": 0.93,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539837.58,
+ "name": "lh:audit:landmark-one-main",
+ "duration": 1.59,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539839.29,
+ "name": "lh:audit:link-name",
+ "duration": 1.57,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539840.96,
+ "name": "lh:audit:link-in-text-block",
+ "duration": 0.92,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539841.98,
+ "name": "lh:audit:list",
+ "duration": 1.52,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539843.62,
+ "name": "lh:audit:listitem",
+ "duration": 3.96,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539847.69,
+ "name": "lh:audit:meta-refresh",
+ "duration": 0.94,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539848.73,
+ "name": "lh:audit:meta-viewport",
+ "duration": 1.44,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539850.26,
+ "name": "lh:audit:object-alt",
+ "duration": 0.96,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539851.32,
+ "name": "lh:audit:select-name",
+ "duration": 0.97,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539852.39,
+ "name": "lh:audit:skip-link",
+ "duration": 0.99,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539853.48,
+ "name": "lh:audit:tabindex",
+ "duration": 4.05,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539857.66,
+ "name": "lh:audit:table-duplicate-name",
+ "duration": 1.25,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539859.04,
+ "name": "lh:audit:table-fake-caption",
+ "duration": 1.36,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539860.5,
+ "name": "lh:audit:target-size",
+ "duration": 1.75,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539862.4,
+ "name": "lh:audit:td-has-header",
+ "duration": 1.2,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539863.7,
+ "name": "lh:audit:td-headers-attr",
+ "duration": 1.25,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539865.06,
+ "name": "lh:audit:th-has-data-cells",
+ "duration": 3.82,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539868.99,
+ "name": "lh:audit:valid-lang",
+ "duration": 1.25,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539870.35,
+ "name": "lh:audit:video-caption",
+ "duration": 1.28,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539871.65,
+ "name": "lh:audit:custom-controls-labels",
+ "duration": 0.07,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539871.72,
+ "name": "lh:audit:custom-controls-roles",
+ "duration": 0.01,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539871.73,
+ "name": "lh:audit:focus-traps",
+ "duration": 0,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539871.76,
+ "name": "lh:audit:focusable-controls",
+ "duration": 0.01,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539871.78,
+ "name": "lh:audit:interactive-element-affordance",
+ "duration": 0,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539871.79,
+ "name": "lh:audit:logical-tab-order",
+ "duration": 0,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539871.8,
+ "name": "lh:audit:managed-focus",
+ "duration": 0,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539871.81,
+ "name": "lh:audit:offscreen-content-hidden",
+ "duration": 0,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539871.83,
+ "name": "lh:audit:use-landmarks",
+ "duration": 0,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539871.84,
+ "name": "lh:audit:visual-order-follows-dom",
+ "duration": 0,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539871.94,
+ "name": "lh:audit:autocomplete-valid",
+ "duration": 0.71,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539872.78,
+ "name": "lh:audit:presentation-role-conflict",
+ "duration": 1.66,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539874.55,
+ "name": "lh:audit:svg-img-alt",
+ "duration": 1.26,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539875.94,
+ "name": "lh:audit:doctype",
+ "duration": 6.2,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539882.27,
+ "name": "lh:audit:charset",
+ "duration": 2.56,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539884.93,
+ "name": "lh:audit:geolocation-on-start",
+ "duration": 0.42,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539885.46,
+ "name": "lh:audit:inspector-issues",
+ "duration": 0.57,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539886.11,
+ "name": "lh:audit:js-libraries",
+ "duration": 0.44,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539886.69,
+ "name": "lh:audit:notification-on-start",
+ "duration": 0.4,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539887.19,
+ "name": "lh:audit:paste-preventing-inputs",
+ "duration": 0.34,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539887.61,
+ "name": "lh:audit:baseline",
+ "duration": 7.69,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539895.42,
+ "name": "lh:audit:meta-description",
+ "duration": 0.34,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539895.85,
+ "name": "lh:audit:http-status-code",
+ "duration": 0.35,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539896.29,
+ "name": "lh:audit:link-text",
+ "duration": 0.93,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539897.36,
+ "name": "lh:audit:crawlable-anchors",
+ "duration": 0.58,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539898.06,
+ "name": "lh:audit:is-crawlable",
+ "duration": 1.3,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539899.47,
+ "name": "lh:audit:robots-txt",
+ "duration": 0.55,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539900.13,
+ "name": "lh:audit:hreflang",
+ "duration": 0.39,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539900.63,
+ "name": "lh:audit:canonical",
+ "duration": 0.43,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539901.15,
+ "name": "lh:audit:structured-data",
+ "duration": 0.22,
+ "entryType": "measure"
+ },
+ {
+ "startTime": 1539901.39,
+ "name": "lh:runner:generate",
+ "duration": 0.19,
+ "entryType": "measure"
+ }
+ ],
+ "total": 8831.08
+ },
+ "i18n": {
+ "rendererFormattedStrings": {},
+ "icuMessagePaths": {
+ "core/audits/is-on-https.js | title": [
+ "audits[is-on-https].title"
+ ],
+ "core/audits/is-on-https.js | description": [
+ "audits[is-on-https].description"
+ ],
+ "core/audits/is-on-https.js | columnInsecureURL": [
+ "audits[is-on-https].details.headings[0].label"
+ ],
+ "core/audits/is-on-https.js | columnResolution": [
+ "audits[is-on-https].details.headings[1].label"
+ ],
+ "core/audits/redirects-http.js | title": [
+ "audits[redirects-http].title"
+ ],
+ "core/audits/redirects-http.js | description": [
+ "audits[redirects-http].description"
+ ],
+ "core/audits/errors-in-console.js | failureTitle": [
+ "audits[errors-in-console].title"
+ ],
+ "core/audits/errors-in-console.js | description": [
+ "audits[errors-in-console].description"
+ ],
+ "core/lib/i18n/i18n.js | columnSource": [
+ "audits[errors-in-console].details.headings[0].label",
+ "audits.deprecations.details.headings[1].label",
+ "audits[geolocation-on-start].details.headings[0].label",
+ "audits[notification-on-start].details.headings[0].label",
+ "audits.baseline.details.headings[2].label"
+ ],
+ "core/lib/i18n/i18n.js | columnDescription": [
+ "audits[errors-in-console].details.headings[1].label",
+ "audits[csp-xss].details.headings[0].label",
+ "audits[has-hsts].details.headings[0].label",
+ "audits[origin-isolation].details.headings[0].label",
+ "audits[clickjacking-mitigation].details.headings[0].label",
+ "audits[trusted-types-xss].details.headings[0].label"
+ ],
+ "core/audits/image-aspect-ratio.js | title": [
+ "audits[image-aspect-ratio].title"
+ ],
+ "core/audits/image-aspect-ratio.js | description": [
+ "audits[image-aspect-ratio].description"
+ ],
+ "core/lib/i18n/i18n.js | columnURL": [
+ "audits[image-aspect-ratio].details.headings[1].label",
+ "audits[image-size-responsive].details.headings[1].label",
+ "audits[third-party-cookies].details.headings[1].label",
+ "audits[valid-source-maps].details.headings[0].label"
+ ],
+ "core/audits/image-aspect-ratio.js | columnDisplayed": [
+ "audits[image-aspect-ratio].details.headings[2].label"
+ ],
+ "core/audits/image-aspect-ratio.js | columnActual": [
+ "audits[image-aspect-ratio].details.headings[3].label"
+ ],
+ "core/audits/image-size-responsive.js | title": [
+ "audits[image-size-responsive].title"
+ ],
+ "core/audits/image-size-responsive.js | description": [
+ "audits[image-size-responsive].description"
+ ],
+ "core/audits/image-size-responsive.js | columnDisplayed": [
+ "audits[image-size-responsive].details.headings[2].label"
+ ],
+ "core/audits/image-size-responsive.js | columnActual": [
+ "audits[image-size-responsive].details.headings[3].label"
+ ],
+ "core/audits/image-size-responsive.js | columnExpected": [
+ "audits[image-size-responsive].details.headings[4].label"
+ ],
+ "core/audits/deprecations.js | title": [
+ "audits.deprecations.title"
+ ],
+ "core/audits/deprecations.js | description": [
+ "audits.deprecations.description"
+ ],
+ "core/audits/deprecations.js | columnDeprecate": [
+ "audits.deprecations.details.headings[0].label"
+ ],
+ "core/audits/third-party-cookies.js | failureTitle": [
+ "audits[third-party-cookies].title"
+ ],
+ "core/audits/third-party-cookies.js | description": [
+ "audits[third-party-cookies].description"
+ ],
+ "core/audits/third-party-cookies.js | displayValue": [
+ {
+ "values": {
+ "itemCount": 5
+ },
+ "path": "audits[third-party-cookies].displayValue"
+ }
+ ],
+ "core/lib/i18n/i18n.js | columnName": [
+ "audits[third-party-cookies].details.headings[0].label",
+ "audits[js-libraries].details.headings[0].label"
+ ],
+ "core/audits/valid-source-maps.js | title": [
+ "audits[valid-source-maps].title"
+ ],
+ "core/audits/valid-source-maps.js | description": [
+ "audits[valid-source-maps].description"
+ ],
+ "core/audits/valid-source-maps.js | columnMapURL": [
+ "audits[valid-source-maps].details.headings[1].label"
+ ],
+ "core/audits/csp-xss.js | title": [
+ "audits[csp-xss].title"
+ ],
+ "core/audits/csp-xss.js | description": [
+ "audits[csp-xss].description"
+ ],
+ "core/audits/csp-xss.js | columnDirective": [
+ "audits[csp-xss].details.headings[1].label"
+ ],
+ "core/audits/csp-xss.js | columnSeverity": [
+ "audits[csp-xss].details.headings[2].label"
+ ],
+ "core/lib/i18n/i18n.js | itemSeverityHigh": [
+ "audits[csp-xss].details.items[0].severity",
+ "audits[origin-isolation].details.items[0].severity",
+ "audits[clickjacking-mitigation].details.items[0].severity",
+ "audits[trusted-types-xss].details.items[0].severity"
+ ],
+ "core/audits/csp-xss.js | noCsp": [
+ "audits[csp-xss].details.items[0].description"
+ ],
+ "core/audits/has-hsts.js | title": [
+ "audits[has-hsts].title"
+ ],
+ "core/audits/has-hsts.js | description": [
+ "audits[has-hsts].description"
+ ],
+ "core/audits/has-hsts.js | columnDirective": [
+ "audits[has-hsts].details.headings[1].label"
+ ],
+ "core/audits/has-hsts.js | columnSeverity": [
+ "audits[has-hsts].details.headings[2].label"
+ ],
+ "core/audits/has-hsts.js | noSubdomain": [
+ "audits[has-hsts].details.items[0].description"
+ ],
+ "core/lib/i18n/i18n.js | itemSeverityMedium": [
+ "audits[has-hsts].details.items[0].severity",
+ "audits[has-hsts].details.items[1].severity"
+ ],
+ "core/audits/has-hsts.js | noPreload": [
+ "audits[has-hsts].details.items[1].description"
+ ],
+ "core/audits/origin-isolation.js | title": [
+ "audits[origin-isolation].title"
+ ],
+ "core/audits/origin-isolation.js | description": [
+ "audits[origin-isolation].description"
+ ],
+ "core/audits/origin-isolation.js | columnDirective": [
+ "audits[origin-isolation].details.headings[1].label"
+ ],
+ "core/audits/origin-isolation.js | columnSeverity": [
+ "audits[origin-isolation].details.headings[2].label"
+ ],
+ "core/audits/origin-isolation.js | noCoop": [
+ "audits[origin-isolation].details.items[0].description"
+ ],
+ "core/audits/clickjacking-mitigation.js | title": [
+ "audits[clickjacking-mitigation].title"
+ ],
+ "core/audits/clickjacking-mitigation.js | description": [
+ "audits[clickjacking-mitigation].description"
+ ],
+ "core/audits/clickjacking-mitigation.js | columnSeverity": [
+ "audits[clickjacking-mitigation].details.headings[1].label"
+ ],
+ "core/audits/clickjacking-mitigation.js | noClickjackingMitigation": [
+ "audits[clickjacking-mitigation].details.items[0].description"
+ ],
+ "core/audits/trusted-types-xss.js | title": [
+ "audits[trusted-types-xss].title"
+ ],
+ "core/audits/trusted-types-xss.js | description": [
+ "audits[trusted-types-xss].description"
+ ],
+ "core/audits/trusted-types-xss.js | columnSeverity": [
+ "audits[trusted-types-xss].details.headings[1].label"
+ ],
+ "core/audits/trusted-types-xss.js | noTrustedTypesToMitigateXss": [
+ "audits[trusted-types-xss].details.items[0].description"
+ ],
+ "core/audits/accessibility/accesskeys.js | title": [
+ "audits.accesskeys.title"
+ ],
+ "core/audits/accessibility/accesskeys.js | description": [
+ "audits.accesskeys.description"
+ ],
+ "core/audits/accessibility/aria-allowed-attr.js | title": [
+ "audits[aria-allowed-attr].title"
+ ],
+ "core/audits/accessibility/aria-allowed-attr.js | description": [
+ "audits[aria-allowed-attr].description"
+ ],
+ "core/lib/i18n/i18n.js | columnFailingElem": [
+ "audits[aria-allowed-attr].details.headings[0].label",
+ "audits[aria-command-name].details.headings[0].label",
+ "audits[aria-conditional-attr].details.headings[0].label",
+ "audits[aria-deprecated-role].details.headings[0].label",
+ "audits[aria-hidden-body].details.headings[0].label",
+ "audits[aria-hidden-focus].details.headings[0].label",
+ "audits[aria-prohibited-attr].details.headings[0].label",
+ "audits[aria-required-attr].details.headings[0].label",
+ "audits[aria-roles].details.headings[0].label",
+ "audits[aria-valid-attr-value].details.headings[0].label",
+ "audits[aria-valid-attr].details.headings[0].label",
+ "audits[button-name].details.headings[0].label",
+ "audits[color-contrast].details.headings[0].label",
+ "audits[document-title].details.headings[0].label",
+ "audits[frame-title].details.headings[0].label",
+ "audits[heading-order].details.headings[0].label",
+ "audits[html-has-lang].details.headings[0].label",
+ "audits[html-lang-valid].details.headings[0].label",
+ "audits[image-alt].details.headings[0].label",
+ "audits[label-content-name-mismatch].details.headings[0].label",
+ "audits[landmark-one-main].details.headings[0].label",
+ "audits[link-name].details.headings[0].label",
+ "audits.list.details.headings[0].label",
+ "audits.listitem.details.headings[0].label",
+ "audits[meta-viewport].details.headings[0].label",
+ "audits.tabindex.details.headings[0].label",
+ "audits[target-size].details.headings[0].label",
+ "audits[presentation-role-conflict].details.headings[0].label",
+ "audits[paste-preventing-inputs].details.headings[0].label"
+ ],
+ "core/audits/accessibility/aria-allowed-role.js | title": [
+ "audits[aria-allowed-role].title"
+ ],
+ "core/audits/accessibility/aria-allowed-role.js | description": [
+ "audits[aria-allowed-role].description"
+ ],
+ "core/audits/accessibility/aria-command-name.js | title": [
+ "audits[aria-command-name].title"
+ ],
+ "core/audits/accessibility/aria-command-name.js | description": [
+ "audits[aria-command-name].description"
+ ],
+ "core/audits/accessibility/aria-conditional-attr.js | title": [
+ "audits[aria-conditional-attr].title"
+ ],
+ "core/audits/accessibility/aria-conditional-attr.js | description": [
+ "audits[aria-conditional-attr].description"
+ ],
+ "core/audits/accessibility/aria-deprecated-role.js | title": [
+ "audits[aria-deprecated-role].title"
+ ],
+ "core/audits/accessibility/aria-deprecated-role.js | description": [
+ "audits[aria-deprecated-role].description"
+ ],
+ "core/audits/accessibility/aria-dialog-name.js | title": [
+ "audits[aria-dialog-name].title"
+ ],
+ "core/audits/accessibility/aria-dialog-name.js | description": [
+ "audits[aria-dialog-name].description"
+ ],
+ "core/audits/accessibility/aria-hidden-body.js | title": [
+ "audits[aria-hidden-body].title"
+ ],
+ "core/audits/accessibility/aria-hidden-body.js | description": [
+ "audits[aria-hidden-body].description"
+ ],
+ "core/audits/accessibility/aria-hidden-focus.js | title": [
+ "audits[aria-hidden-focus].title"
+ ],
+ "core/audits/accessibility/aria-hidden-focus.js | description": [
+ "audits[aria-hidden-focus].description"
+ ],
+ "core/audits/accessibility/aria-input-field-name.js | title": [
+ "audits[aria-input-field-name].title"
+ ],
+ "core/audits/accessibility/aria-input-field-name.js | description": [
+ "audits[aria-input-field-name].description"
+ ],
+ "core/audits/accessibility/aria-meter-name.js | title": [
+ "audits[aria-meter-name].title"
+ ],
+ "core/audits/accessibility/aria-meter-name.js | description": [
+ "audits[aria-meter-name].description"
+ ],
+ "core/audits/accessibility/aria-progressbar-name.js | title": [
+ "audits[aria-progressbar-name].title"
+ ],
+ "core/audits/accessibility/aria-progressbar-name.js | description": [
+ "audits[aria-progressbar-name].description"
+ ],
+ "core/audits/accessibility/aria-prohibited-attr.js | title": [
+ "audits[aria-prohibited-attr].title"
+ ],
+ "core/audits/accessibility/aria-prohibited-attr.js | description": [
+ "audits[aria-prohibited-attr].description"
+ ],
+ "core/audits/accessibility/aria-required-attr.js | title": [
+ "audits[aria-required-attr].title"
+ ],
+ "core/audits/accessibility/aria-required-attr.js | description": [
+ "audits[aria-required-attr].description"
+ ],
+ "core/audits/accessibility/aria-required-children.js | title": [
+ "audits[aria-required-children].title"
+ ],
+ "core/audits/accessibility/aria-required-children.js | description": [
+ "audits[aria-required-children].description"
+ ],
+ "core/audits/accessibility/aria-required-parent.js | title": [
+ "audits[aria-required-parent].title"
+ ],
+ "core/audits/accessibility/aria-required-parent.js | description": [
+ "audits[aria-required-parent].description"
+ ],
+ "core/audits/accessibility/aria-roles.js | title": [
+ "audits[aria-roles].title"
+ ],
+ "core/audits/accessibility/aria-roles.js | description": [
+ "audits[aria-roles].description"
+ ],
+ "core/audits/accessibility/aria-text.js | title": [
+ "audits[aria-text].title"
+ ],
+ "core/audits/accessibility/aria-text.js | description": [
+ "audits[aria-text].description"
+ ],
+ "core/audits/accessibility/aria-toggle-field-name.js | title": [
+ "audits[aria-toggle-field-name].title"
+ ],
+ "core/audits/accessibility/aria-toggle-field-name.js | description": [
+ "audits[aria-toggle-field-name].description"
+ ],
+ "core/audits/accessibility/aria-tooltip-name.js | title": [
+ "audits[aria-tooltip-name].title"
+ ],
+ "core/audits/accessibility/aria-tooltip-name.js | description": [
+ "audits[aria-tooltip-name].description"
+ ],
+ "core/audits/accessibility/aria-treeitem-name.js | title": [
+ "audits[aria-treeitem-name].title"
+ ],
+ "core/audits/accessibility/aria-treeitem-name.js | description": [
+ "audits[aria-treeitem-name].description"
+ ],
+ "core/audits/accessibility/aria-valid-attr-value.js | title": [
+ "audits[aria-valid-attr-value].title"
+ ],
+ "core/audits/accessibility/aria-valid-attr-value.js | description": [
+ "audits[aria-valid-attr-value].description"
+ ],
+ "core/audits/accessibility/aria-valid-attr.js | title": [
+ "audits[aria-valid-attr].title"
+ ],
+ "core/audits/accessibility/aria-valid-attr.js | description": [
+ "audits[aria-valid-attr].description"
+ ],
+ "core/audits/accessibility/button-name.js | title": [
+ "audits[button-name].title"
+ ],
+ "core/audits/accessibility/button-name.js | description": [
+ "audits[button-name].description"
+ ],
+ "core/audits/accessibility/bypass.js | title": [
+ "audits.bypass.title"
+ ],
+ "core/audits/accessibility/bypass.js | description": [
+ "audits.bypass.description"
+ ],
+ "core/audits/accessibility/color-contrast.js | title": [
+ "audits[color-contrast].title"
+ ],
+ "core/audits/accessibility/color-contrast.js | description": [
+ "audits[color-contrast].description"
+ ],
+ "core/audits/accessibility/definition-list.js | title": [
+ "audits[definition-list].title"
+ ],
+ "core/audits/accessibility/definition-list.js | description": [
+ "audits[definition-list].description"
+ ],
+ "core/audits/accessibility/dlitem.js | title": [
+ "audits.dlitem.title"
+ ],
+ "core/audits/accessibility/dlitem.js | description": [
+ "audits.dlitem.description"
+ ],
+ "core/audits/accessibility/document-title.js | title": [
+ "audits[document-title].title"
+ ],
+ "core/audits/accessibility/document-title.js | description": [
+ "audits[document-title].description"
+ ],
+ "core/audits/accessibility/duplicate-id-aria.js | title": [
+ "audits[duplicate-id-aria].title"
+ ],
+ "core/audits/accessibility/duplicate-id-aria.js | description": [
+ "audits[duplicate-id-aria].description"
+ ],
+ "core/audits/accessibility/empty-heading.js | title": [
+ "audits[empty-heading].title"
+ ],
+ "core/audits/accessibility/empty-heading.js | description": [
+ "audits[empty-heading].description"
+ ],
+ "core/audits/accessibility/form-field-multiple-labels.js | title": [
+ "audits[form-field-multiple-labels].title"
+ ],
+ "core/audits/accessibility/form-field-multiple-labels.js | description": [
+ "audits[form-field-multiple-labels].description"
+ ],
+ "core/audits/accessibility/frame-title.js | title": [
+ "audits[frame-title].title"
+ ],
+ "core/audits/accessibility/frame-title.js | description": [
+ "audits[frame-title].description"
+ ],
+ "core/audits/accessibility/heading-order.js | title": [
+ "audits[heading-order].title"
+ ],
+ "core/audits/accessibility/heading-order.js | description": [
+ "audits[heading-order].description"
+ ],
+ "core/audits/accessibility/html-has-lang.js | title": [
+ "audits[html-has-lang].title"
+ ],
+ "core/audits/accessibility/html-has-lang.js | description": [
+ "audits[html-has-lang].description"
+ ],
+ "core/audits/accessibility/html-lang-valid.js | title": [
+ "audits[html-lang-valid].title"
+ ],
+ "core/audits/accessibility/html-lang-valid.js | description": [
+ "audits[html-lang-valid].description"
+ ],
+ "core/audits/accessibility/html-xml-lang-mismatch.js | title": [
+ "audits[html-xml-lang-mismatch].title"
+ ],
+ "core/audits/accessibility/html-xml-lang-mismatch.js | description": [
+ "audits[html-xml-lang-mismatch].description"
+ ],
+ "core/audits/accessibility/identical-links-same-purpose.js | title": [
+ "audits[identical-links-same-purpose].title"
+ ],
+ "core/audits/accessibility/identical-links-same-purpose.js | description": [
+ "audits[identical-links-same-purpose].description"
+ ],
+ "core/audits/accessibility/image-alt.js | title": [
+ "audits[image-alt].title"
+ ],
+ "core/audits/accessibility/image-alt.js | description": [
+ "audits[image-alt].description"
+ ],
+ "core/audits/accessibility/image-redundant-alt.js | title": [
+ "audits[image-redundant-alt].title"
+ ],
+ "core/audits/accessibility/image-redundant-alt.js | description": [
+ "audits[image-redundant-alt].description"
+ ],
+ "core/audits/accessibility/input-button-name.js | title": [
+ "audits[input-button-name].title"
+ ],
+ "core/audits/accessibility/input-button-name.js | description": [
+ "audits[input-button-name].description"
+ ],
+ "core/audits/accessibility/input-image-alt.js | title": [
+ "audits[input-image-alt].title"
+ ],
+ "core/audits/accessibility/input-image-alt.js | description": [
+ "audits[input-image-alt].description"
+ ],
+ "core/audits/accessibility/label-content-name-mismatch.js | title": [
+ "audits[label-content-name-mismatch].title"
+ ],
+ "core/audits/accessibility/label-content-name-mismatch.js | description": [
+ "audits[label-content-name-mismatch].description"
+ ],
+ "core/audits/accessibility/label.js | title": [
+ "audits.label.title"
+ ],
+ "core/audits/accessibility/label.js | description": [
+ "audits.label.description"
+ ],
+ "core/audits/accessibility/landmark-one-main.js | title": [
+ "audits[landmark-one-main].title"
+ ],
+ "core/audits/accessibility/landmark-one-main.js | description": [
+ "audits[landmark-one-main].description"
+ ],
+ "core/audits/accessibility/link-name.js | failureTitle": [
+ "audits[link-name].title"
+ ],
+ "core/audits/accessibility/link-name.js | description": [
+ "audits[link-name].description"
+ ],
+ "core/audits/accessibility/link-in-text-block.js | title": [
+ "audits[link-in-text-block].title"
+ ],
+ "core/audits/accessibility/link-in-text-block.js | description": [
+ "audits[link-in-text-block].description"
+ ],
+ "core/audits/accessibility/list.js | title": [
+ "audits.list.title"
+ ],
+ "core/audits/accessibility/list.js | description": [
+ "audits.list.description"
+ ],
+ "core/audits/accessibility/listitem.js | title": [
+ "audits.listitem.title"
+ ],
+ "core/audits/accessibility/listitem.js | description": [
+ "audits.listitem.description"
+ ],
+ "core/audits/accessibility/meta-refresh.js | title": [
+ "audits[meta-refresh].title"
+ ],
+ "core/audits/accessibility/meta-refresh.js | description": [
+ "audits[meta-refresh].description"
+ ],
+ "core/audits/accessibility/meta-viewport.js | title": [
+ "audits[meta-viewport].title"
+ ],
+ "core/audits/accessibility/meta-viewport.js | description": [
+ "audits[meta-viewport].description"
+ ],
+ "core/audits/accessibility/object-alt.js | title": [
+ "audits[object-alt].title"
+ ],
+ "core/audits/accessibility/object-alt.js | description": [
+ "audits[object-alt].description"
+ ],
+ "core/audits/accessibility/select-name.js | title": [
+ "audits[select-name].title"
+ ],
+ "core/audits/accessibility/select-name.js | description": [
+ "audits[select-name].description"
+ ],
+ "core/audits/accessibility/skip-link.js | title": [
+ "audits[skip-link].title"
+ ],
+ "core/audits/accessibility/skip-link.js | description": [
+ "audits[skip-link].description"
+ ],
+ "core/audits/accessibility/tabindex.js | title": [
+ "audits.tabindex.title"
+ ],
+ "core/audits/accessibility/tabindex.js | description": [
+ "audits.tabindex.description"
+ ],
+ "core/audits/accessibility/table-duplicate-name.js | title": [
+ "audits[table-duplicate-name].title"
+ ],
+ "core/audits/accessibility/table-duplicate-name.js | description": [
+ "audits[table-duplicate-name].description"
+ ],
+ "core/audits/accessibility/table-fake-caption.js | title": [
+ "audits[table-fake-caption].title"
+ ],
+ "core/audits/accessibility/table-fake-caption.js | description": [
+ "audits[table-fake-caption].description"
+ ],
+ "core/audits/accessibility/target-size.js | failureTitle": [
+ "audits[target-size].title"
+ ],
+ "core/audits/accessibility/target-size.js | description": [
+ "audits[target-size].description"
+ ],
+ "core/audits/accessibility/td-has-header.js | title": [
+ "audits[td-has-header].title"
+ ],
+ "core/audits/accessibility/td-has-header.js | description": [
+ "audits[td-has-header].description"
+ ],
+ "core/audits/accessibility/td-headers-attr.js | title": [
+ "audits[td-headers-attr].title"
+ ],
+ "core/audits/accessibility/td-headers-attr.js | description": [
+ "audits[td-headers-attr].description"
+ ],
+ "core/audits/accessibility/th-has-data-cells.js | title": [
+ "audits[th-has-data-cells].title"
+ ],
+ "core/audits/accessibility/th-has-data-cells.js | description": [
+ "audits[th-has-data-cells].description"
+ ],
+ "core/audits/accessibility/valid-lang.js | title": [
+ "audits[valid-lang].title"
+ ],
+ "core/audits/accessibility/valid-lang.js | description": [
+ "audits[valid-lang].description"
+ ],
+ "core/audits/accessibility/video-caption.js | title": [
+ "audits[video-caption].title"
+ ],
+ "core/audits/accessibility/video-caption.js | description": [
+ "audits[video-caption].description"
+ ],
+ "core/audits/accessibility/autocomplete-valid.js | title": [
+ "audits[autocomplete-valid].title"
+ ],
+ "core/audits/accessibility/autocomplete-valid.js | description": [
+ "audits[autocomplete-valid].description"
+ ],
+ "core/audits/accessibility/presentation-role-conflict.js | title": [
+ "audits[presentation-role-conflict].title"
+ ],
+ "core/audits/accessibility/presentation-role-conflict.js | description": [
+ "audits[presentation-role-conflict].description"
+ ],
+ "core/audits/accessibility/svg-img-alt.js | title": [
+ "audits[svg-img-alt].title"
+ ],
+ "core/audits/accessibility/svg-img-alt.js | description": [
+ "audits[svg-img-alt].description"
+ ],
+ "core/audits/dobetterweb/doctype.js | title": [
+ "audits.doctype.title"
+ ],
+ "core/audits/dobetterweb/doctype.js | description": [
+ "audits.doctype.description"
+ ],
+ "core/audits/dobetterweb/charset.js | title": [
+ "audits.charset.title"
+ ],
+ "core/audits/dobetterweb/charset.js | description": [
+ "audits.charset.description"
+ ],
+ "core/audits/dobetterweb/geolocation-on-start.js | title": [
+ "audits[geolocation-on-start].title"
+ ],
+ "core/audits/dobetterweb/geolocation-on-start.js | description": [
+ "audits[geolocation-on-start].description"
+ ],
+ "core/audits/dobetterweb/inspector-issues.js | failureTitle": [
+ "audits[inspector-issues].title"
+ ],
+ "core/audits/dobetterweb/inspector-issues.js | description": [
+ "audits[inspector-issues].description"
+ ],
+ "core/audits/dobetterweb/inspector-issues.js | columnIssueType": [
+ "audits[inspector-issues].details.headings[0].label"
+ ],
+ "core/audits/dobetterweb/js-libraries.js | title": [
+ "audits[js-libraries].title"
+ ],
+ "core/audits/dobetterweb/js-libraries.js | description": [
+ "audits[js-libraries].description"
+ ],
+ "core/audits/dobetterweb/js-libraries.js | columnVersion": [
+ "audits[js-libraries].details.headings[1].label"
+ ],
+ "core/audits/dobetterweb/notification-on-start.js | title": [
+ "audits[notification-on-start].title"
+ ],
+ "core/audits/dobetterweb/notification-on-start.js | description": [
+ "audits[notification-on-start].description"
+ ],
+ "core/audits/dobetterweb/paste-preventing-inputs.js | title": [
+ "audits[paste-preventing-inputs].title"
+ ],
+ "core/audits/dobetterweb/paste-preventing-inputs.js | description": [
+ "audits[paste-preventing-inputs].description"
+ ],
+ "core/audits/baseline.js | title": [
+ "audits.baseline.title"
+ ],
+ "core/audits/baseline.js | description": [
+ {
+ "values": {
+ "date": "2026-03-18"
+ },
+ "path": "audits.baseline.description"
+ }
+ ],
+ "core/audits/baseline.js | columnFeature": [
+ "audits.baseline.details.headings[0].label"
+ ],
+ "core/audits/baseline.js | columnStatus": [
+ "audits.baseline.details.headings[1].label"
+ ],
+ "core/audits/seo/meta-description.js | title": [
+ "audits[meta-description].title"
+ ],
+ "core/audits/seo/meta-description.js | description": [
+ "audits[meta-description].description"
+ ],
+ "core/audits/seo/http-status-code.js | title": [
+ "audits[http-status-code].title"
+ ],
+ "core/audits/seo/http-status-code.js | description": [
+ "audits[http-status-code].description"
+ ],
+ "core/audits/seo/link-text.js | failureTitle": [
+ "audits[link-text].title"
+ ],
+ "core/audits/seo/link-text.js | description": [
+ "audits[link-text].description"
+ ],
+ "core/audits/seo/link-text.js | displayValue": [
+ {
+ "values": {
+ "itemCount": 1
+ },
+ "path": "audits[link-text].displayValue"
+ }
+ ],
+ "core/audits/seo/crawlable-anchors.js | title": [
+ "audits[crawlable-anchors].title"
+ ],
+ "core/audits/seo/crawlable-anchors.js | description": [
+ "audits[crawlable-anchors].description"
+ ],
+ "core/audits/seo/crawlable-anchors.js | columnFailingLink": [
+ "audits[crawlable-anchors].details.headings[0].label"
+ ],
+ "core/audits/seo/is-crawlable.js | title": [
+ "audits[is-crawlable].title"
+ ],
+ "core/audits/seo/is-crawlable.js | description": [
+ "audits[is-crawlable].description"
+ ],
+ "core/audits/seo/robots-txt.js | title": [
+ "audits[robots-txt].title"
+ ],
+ "core/audits/seo/robots-txt.js | description": [
+ "audits[robots-txt].description"
+ ],
+ "core/audits/seo/hreflang.js | title": [
+ "audits.hreflang.title"
+ ],
+ "core/audits/seo/hreflang.js | description": [
+ "audits.hreflang.description"
+ ],
+ "core/audits/seo/canonical.js | title": [
+ "audits.canonical.title"
+ ],
+ "core/audits/seo/canonical.js | description": [
+ "audits.canonical.description"
+ ],
+ "core/audits/seo/manual/structured-data.js | title": [
+ "audits[structured-data].title"
+ ],
+ "core/audits/seo/manual/structured-data.js | description": [
+ "audits[structured-data].description"
+ ],
+ "core/config/default-config.js | a11yCategoryTitle": [
+ "categories.accessibility.title"
+ ],
+ "core/config/default-config.js | a11yCategoryDescription": [
+ "categories.accessibility.description"
+ ],
+ "core/config/default-config.js | a11yCategoryManualDescription": [
+ "categories.accessibility.manualDescription"
+ ],
+ "core/config/default-config.js | bestPracticesCategoryTitle": [
+ "categories[best-practices].title"
+ ],
+ "core/config/default-config.js | seoCategoryTitle": [
+ "categories.seo.title"
+ ],
+ "core/config/default-config.js | seoCategoryDescription": [
+ "categories.seo.description"
+ ],
+ "core/config/default-config.js | seoCategoryManualDescription": [
+ "categories.seo.manualDescription"
+ ],
+ "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"
+ ],
+ "node_modules/lighthouse-stack-packs/packs/react.js | unminified-css": [
+ "stackPacks[0].descriptions[unminified-css]"
+ ],
+ "node_modules/lighthouse-stack-packs/packs/react.js | unminified-javascript": [
+ "stackPacks[0].descriptions[unminified-javascript]"
+ ],
+ "node_modules/lighthouse-stack-packs/packs/react.js | unused-javascript": [
+ "stackPacks[0].descriptions[unused-javascript]"
+ ],
+ "node_modules/lighthouse-stack-packs/packs/react.js | server-response-time": [
+ "stackPacks[0].descriptions[server-response-time]"
+ ],
+ "node_modules/lighthouse-stack-packs/packs/react.js | redirects": [
+ "stackPacks[0].descriptions.redirects"
+ ],
+ "node_modules/lighthouse-stack-packs/packs/react.js | user-timings": [
+ "stackPacks[0].descriptions[user-timings]"
+ ],
+ "node_modules/lighthouse-stack-packs/packs/react.js | dom-size": [
+ "stackPacks[0].descriptions[dom-size]"
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/figma/all-46-grid.png b/figma/all-46-grid.png
new file mode 100644
index 0000000..03b4e78
Binary files /dev/null and b/figma/all-46-grid.png differ
diff --git a/research/audience-demographics.md b/research/audience-demographics.md
new file mode 100644
index 0000000..77cc9e5
--- /dev/null
+++ b/research/audience-demographics.md
@@ -0,0 +1,308 @@
+# Audience Demographics Research
+**Student Debt Advocacy Nonprofit — Two Primary Audiences**
+Compiled: 2026-04-25
+Analyst: Data Analyst Agent
+
+---
+
+## AUDIENCE A: Foundation / Grantmaker Decision-Makers
+
+### 1. Who They Are — Demographics and Role Titles
+
+**Workforce composition (Council on Foundations, 2024 Grantmaker Salary & Benefits Report, n=11,380 full-time staff from 1,006 foundations):**
+- Women: 75.8% of all full-time grantmaking staff; 62.6% of foundation CEOs
+- People of color: 33.5% of full-time grantmaking staff; 17.1% of foundation CEOs
+- Age distribution: Not published in the 2024 CoF report; the sector skews toward mid-career (35–55) based on salary banding data for senior program roles
+- Median annual salary increase in 2025: 4.6%
+- Mean annual turnover rate: 12.3% (up from 10.8% in 2024)
+
+**Role hierarchy (Bridgespan / 80,000 Hours career profiles):**
+| Title | Function |
+|---|---|
+| Program Associate | Research, grant agreements, administrative |
+| Program Officer (PO) | Sourcing, due diligence, relationship management |
+| Program Director | Manages POs, shapes portfolio strategy |
+| Vice President / Managing Director | Portfolio oversight, board reporting |
+| President / Executive Director (ED) | Ultimate grant authority, public face |
+
+**Practical implication:** Program Officers are the first screeners and most frequent website visitors. They decide whether to advance an application. EDs/VPs ratify decisions but rarely do cold discovery.
+
+---
+
+### 2. Credibility Signals Foundations Look For on a Nonprofit Website
+
+*Sources: Bridgespan "Philanthropic Sourcing, Diligence, and Decision-Making" (equity-oriented approach); Candid/GuideStar Seal research; Council on Nonprofits financial transparency standards*
+
+**The five Bridgespan due-diligence criteria program officers apply:**
+
+1. **Problem focus** — Does the organization articulate an important, significant problem with specificity? Vague mission statements are red flags.
+2. **Solution credibility** — Is there "a credible solution that addresses the root cause" with demonstrated results? POs want to see outcome data, not just activity metrics.
+3. **Organizational capacity** — Evidence of "leadership, organizational, and operating capabilities needed to achieve the intended impact." Board composition, staff bios with credentials, and org chart matter.
+4. **Funding model** — A clear explanation of how philanthropic dollars leverage other support (government contracts, earned revenue, multi-funder coalitions).
+5. **Equity anchoring** — The work must "anchor in equity and what will benefit the most marginalized." This is now a threshold criterion at most major foundations, not a bonus.
+
+**Specific website signals POs check (in order of typical workflow):**
+
+- **Candid/GuideStar profile and Seal of Transparency** — POs pull the GuideStar profile before visiting the website. Organizations with a Seal received 62% more contributions on average and represent 32% of all grant dollars despite being only 19% of recipients (Candid research, 2024). Bronze = 990 only; Silver/Gold/Platinum = progressively more data shared. Platinum requires publishing results data.
+- **Form 990 consistency** — The story on the website must match the 990's Statement of Program Service Accomplishments. Inconsistency between website narrative and 990 financials is an immediate trust-breaker.
+- **Annual report / audited financials publicly posted** — The absence of these raises questions. Working capital reserves and clean audits signal stability.
+- **Staff / leadership page with credentials** — People with lived experience in the communities served are increasingly weighted. "You need people on your team who come from the communities you're funding" (Hazen Foundation PO, Bridgespan research).
+- **Theory of change** — Explicitly articulating the causal logic from activities to outcomes. POs are trained to look for this.
+- **Evaluation / impact data** — Publications, third-party evaluations, or data dashboards with concrete numbers. Qualitative testimonials alone are insufficient for most institutional funders.
+- **Field relationships** — Advisory boards, coalition memberships, and named partnerships signal legitimacy within the advocacy ecosystem.
+
+---
+
+### 3. Top Foundations Funding Student Debt / Consumer Finance Work
+
+#### Lumina Foundation
+- **Assets (2024):** $1.525 billion
+- **Total grantmaking since founding (2000):** $250+ million
+- **Approach:** Proactive — solicits partners directly based on capacity for large-scale systemic change. Unsolicited LOIs rarely advance.
+- **Priorities:** 75% attainment goal (adults with postsecondary credential by 2040); transparent credentialing; racial equity in higher education outcomes (focus on Black, Hispanic, Native American students); higher education redesign; policy research and data.
+- **Student-debt relevance:** Funds work on reducing cost barriers and improving credential value. Debt relief and income-driven repayment advocacy intersects with their access and completion work.
+- **Key terms they use:** "credential of value," "attainment goal," "postsecondary pathways," "system-level change," "racial equity in completion."
+- **Source:** luminafoundation.org; Rockefeller Philanthropy Advisors profile
+
+#### Arnold Ventures
+- **2024 grantmaking:** ~$190 million (LJAF) + $10 million (ANI)
+- **2025:** 40+ new research grants across policy areas
+- **Approach:** Research → policy → advocacy → litigation pipeline. Heavily evidence-first.
+- **Student-debt priorities:** Higher education accountability; student loan default reduction (35% of borrowers have defaulted); graduate program ROI; policy reforms for community college completion; student loan servicer accountability.
+- **Student-debt relevance:** Strong fit for advocacy orgs with data products, policy analysis units, or litigation strategies.
+- **Key terms:** "evidence-based," "meaningful accountability," "return on investment," "policy and practice," "actionable evidence," "ensure students are better off."
+- **Source:** arnoldventures.org/work/higher-education; BU Office of Research profile (March 2025)
+
+#### Ford Foundation
+- **Approach:** Allocates majority of grantmaking to marginalized communities; at least 25% to social justice strategies (advocacy, community organizing, civic engagement); $2 billion BUILD initiative for general operating support.
+- **Student-debt relevance:** Consumer finance advocacy organizations serving BIPOC borrowers, especially organizations pursuing policy change and base-building, align with Ford's inequality frame.
+- **Key terms:** "inequality," "systemic change," "BUILD," "general operating support," "social justice," "community organizing."
+- **Source:** fordfoundation.org/work/our-grants
+
+#### Kresge Foundation
+- **Annual education grants:** $10M+
+- **Focus states:** California, Florida, Michigan, Texas
+- **Education priorities (2024):** Aligning urban higher education ecosystems; institutional capacity for minority-serving institutions (MSIs), community colleges, and public universities; urban pathways to college; monitoring declines in student diversity post-affirmative action rollback.
+- **Student-debt relevance:** Kresge funds organizations improving outcomes for students already in the system — loan counseling, financial aid reform, HBCU/MSI capacity — rather than pure debt-cancellation advocacy.
+- **Key terms:** "urban ecosystem," "MSI capacity," "student success," "equity in completion," "institutional reform."
+- **Source:** kresge.org/news-views/funding-for-the-future-education-program-priorities-for-2024
+
+#### Joyce Foundation
+- **Region:** Great Lakes / Midwest focus
+- **Relevance:** Consumer finance, workforce, and education overlap; specific student-debt grantmaking should be verified directly at joycefdn.org (not publicly indexed in recent search data).
+
+#### Kellogg, Gates, and Other Foundations
+- **Gates Foundation:** Education focus on post-secondary pathways, especially for students from low-income backgrounds and students of color. Relevant for debt-burden work intersecting with completion.
+- **Note for prospecting:** Use Candid's Foundation Directory (fconline.foundationcenter.org) with filters on "higher education," "consumer finance," "civil rights," and "policy advocacy" to identify active funders.
+
+---
+
+### 4. Keyword / Phrase Lexicon Program Officers Use
+
+This language appears across grant applications, RFPs, and Bridgespan/Candid guidance. Using it correctly signals sector literacy; misusing it (without substance) backfires.
+
+| Category | Phrases |
+|---|---|
+| **Evidence & Research** | "evidence-based," "rigorous evaluation," "theory of change," "randomized controlled trial," "quasi-experimental," "actionable evidence," "learning agenda" |
+| **Equity** | "BIPOC borrowers," "communities of color," "lived experience," "centering marginalized communities," "intersectionality," "equity-anchored," "structural racism," "wealth gap" |
+| **Strategy** | "field-building," "systems change," "policy advocacy," "narrative change," "coalition building," "base-building," "power-building," "movement ecosystem" |
+| **Organizational health** | "general operating support," "unrestricted funding," "organizational resilience," "capacity building," "succession planning," "board diversity" |
+| **Impact framing** | "population-level outcomes," "return on investment," "scale and sustainability," "leveraging philanthropic capital," "multiplier effect," "matched funding" |
+| **Emerging (2024–2025)** | "participatory grantmaking," "trust-based philanthropy," "proximate leadership," "asset-based," "co-creation," "democratic participation" |
+
+---
+
+### 5. Data Quality Notes — Audience A
+
+- Age distribution of grantmakers is not publicly broken out by the Council on Foundations 2024 report; institutional knowledge and sector surveys suggest the PO cohort clusters at 30–50.
+- Foundation-specific keyword preferences vary; always read the most recent RFP language and funded grantee descriptions before applying.
+- The shift toward "trust-based philanthropy" (fewer reporting requirements, multi-year grants, unrestricted funds) is real but uneven — large foundations ($500M+ assets) are slower to adopt than community foundations.
+
+**Sources:**
+- [2024 Grantmaker Salary and Benefits Report Key Findings — Council on Foundations](https://cof.org/content/2024-grantmaker-salary-and-benefits-report-key-findings)
+- [Philanthropic Sourcing, Diligence, and Decision-Making — Bridgespan](https://www.bridgespan.org/insights/philanthropic-sourcing-diligence-and-decision-making-an-equity-oriented-approach)
+- [GuideStar Seals of Transparency — Candid](https://candid.org/blogs/a-look-at-organizations-that-have-earned-guidestar-seals-of-transparency/)
+- [Arnold Ventures Higher Education](https://www.arnoldventures.org/work/higher-education)
+- [Lumina Foundation FAQ](https://www.luminafoundation.org/about/lumina-foundation-faq/)
+- [Kresge Education Priorities 2024](https://kresge.org/news-views/funding-for-the-future-education-program-priorities-for-2024/)
+- [Ford Foundation Grants](https://www.fordfoundation.org/work/our-grants/)
+
+---
+
+---
+
+## AUDIENCE B: Student Debtors Aged 45+
+
+### 1. Population Size
+
+| Cohort | Borrowers | Total Debt | Avg Balance | Source / Date |
+|---|---|---|---|---|
+| Age 40–49 | 7.8 million | ~$349B | $44,798 | educationdata.org / 2024 |
+| Age 50–61 | 5.3–6.4 million* | $311.5B | $46,790–$48,672 | educationdata.org / 2024 |
+| Age 62+ | 2.7–2.9 million | $136.9B | $41,651–$43,392 | CFPB / educationdata.org 2023–2025 |
+| Age 81+ | ~90,000 | est. $2.6B | $29,000 | CFPB 2024 |
+| **All 50+** | **~9 million** | **est. $448B+ (25.5% of total)** | — | AARP / CFPB |
+
+*Range reflects different reporting methodologies (FFEL vs Direct Loan universe, date of snapshot).
+
+**Key trend:** The number of borrowers age 62+ increased 59% between 2017 and 2023 (from 1.7M to 2.7M), while borrowers under 62 remained essentially flat. Federal debt among 50–61-year-olds has grown 33.5% since 2017.
+
+---
+
+### 2. Average Balance and Time in Repayment
+
+- Borrowers age 50–61 carry the **highest average balance of any age cohort** at $46,790–$48,672 (educationdata.org, 2024).
+- Baby Boomers still carrying debt report an average balance of **$54,924** with monthly payments averaging $710 (Student Loan Planner, 2025 — includes private loans).
+- Gen X (approx. 45–60 in 2025) has the highest per-borrower federal balance at **$44,240**.
+- Loans not paid off after six years spent an average of **41% of months in deferment or forbearance** (CBO, September 2024) — meaning many older borrowers have been trapped in payment-pause cycles for a decade or more.
+- As of June 30, 2024, approximately **21% of all Direct Loan dollars ($302 billion)** were in deferment or forbearance status.
+
+---
+
+### 3. Race, Gender, and Income Breakdown
+
+**Gender:**
+- Women hold **63.6% of all student loan debt** (educationdata.org, 2025).
+- Average debt for women: **$31,700**; for men: lower by approximately $10,000+ depending on degree level.
+- Among borrowers 45+, women are disproportionately represented due to higher rates of returning-adult enrollment and longer repayment cycles (career interruptions for caregiving).
+
+**Race / Ethnicity:**
+- **Black borrowers** are the most burdened: 57% of Black student loan holders carry more than $25,000 in debt, vs. 45% of white and 39% of Hispanic borrowers (Federal Reserve Survey of Consumer Finances, 2022; note: 2026 Fed update adds new racial detail).
+- **Black women** borrow on average **$20,000+ more than white men** (CEPR analysis).
+- Black women experience the intersection of the gender debt gap and the racial wealth gap simultaneously.
+- **Parent PLUS impact on BIPOC families:** Nearly **half of Black Parent PLUS borrowers** had an Expected Family Contribution of $0, meaning they took on this debt despite being unable to afford college costs (NCLC, 2023). One-quarter of all Parent PLUS borrowers had EFC=$0.
+- Hispanic and Native American borrowers face compounded access and completion barriers that lead to debt without degrees — the worst-case scenario for long-term repayment.
+
+**Income:**
+- Median household income for borrowers receiving debt relief: **$50,000–$65,000** in 2022, vs. national median of ~$75,000 (CFPB 2023–2024 Borrower Survey).
+- 87% of Social Security beneficiaries with student loan debt have benefits **below 225% of the federal poverty level** (CFPB, 2024).
+- 37% (~480,000 people) of Social Security recipients with student debt rely on Social Security for **90%+ of their income**.
+- 82% report expenses meeting or exceeding income — no financial cushion.
+
+---
+
+### 4. Parent PLUS Borrower Share
+
+- An estimated **25% of borrowers age 50+** are making payments on private loans because a dependent failed to repay (AARP research).
+- Federal Parent PLUS loans are discharged upon the **parent borrower's death** — but are not discharged upon the student's death, leaving parents with full liability.
+- Surviving spouses in community property states may face private loan liability for a **deceased spouse's** student loans if the loan originated during the marriage — a particularly acute pain point for older widows/widowers.
+- Parent PLUS borrowers are locked out of the most generous income-driven repayment plans without a Direct Consolidation workaround, which itself resets the forgiveness clock.
+
+---
+
+### 5. Social Security Garnishment — The Most Acute Crisis
+
+*Source: CFPB Issue Spotlight on Social Security Offsets and Defaulted Student Loans, 2024*
+
+- **452,000 borrowers age 62+** with defaulted loans are likely receiving Social Security and eligible for benefit offset.
+- The number of beneficiaries experiencing offset grew from **6,200 (2001) to 192,300 (2019)** — a 3,000% increase in fewer than 20 years.
+- Average Social Security benefit: **$1,524/month**. Average amount collected per offset borrower: **$186/month ($2,232/year)**.
+- **75% of collected dollars** go to interest and fees, not principal — borrowers can have Social Security garnished for years while the principal barely moves.
+- The current protected income floor is **$750/month** — set decades ago and now **$400 below the 2024 poverty threshold**.
+- 800,000 borrowers age 62+ with defaulted loans faced collection actions (tax refunds, wages, Social Security) when administrative forbearance ended in October 2024 (NCLC estimate).
+- **2 out of 3** borrowers whose Social Security is seized end up with benefits below the **federal poverty level** (NCLC, 2023).
+- In 2015, approximately **114,000 borrowers age 50+** had Social Security seized; **67,300 of them lived below the poverty line**.
+- Loan rehabilitation success rates decline sharply with age: **11% for ages 50–59**; **5% for ages 75+** — older borrowers cannot escape default through the standard rehabilitation pathway.
+
+---
+
+### 6. Other Key Pain Points
+
+**PSLF Denial:**
+- Overall PSLF application denial rate: **93–98%** depending on methodology (educationdata.org, 2025; Student Loan Planner, 2026).
+- Top denial reasons: incomplete paperwork (26.1%), insufficient qualifying payments (the largest category), ineligible loan type (15%).
+- Older borrowers who have been in public service since before PSLF existed (2007) may have spent years in ineligible FFEL loans that were never converted — meaning decades of payments that don't count.
+
+**Retirement at Risk:**
+- 38% of Gen X student loan holders say debt is a **barrier to saving for retirement** (AARP survey).
+- Borrowers without degrees may need to **work 2–7 years longer** to achieve equivalent retirement savings (AARP research).
+- 9.6% of families headed by someone 50+ carry student loans, up from 3.1% in 1989 — a demographic that had no expectation of carrying this debt into retirement.
+
+**Deceased Spouse Loans:**
+- If a borrower dies in a community property state with a **private student loan** taken out during marriage, the surviving spouse may be held liable — even as a non-cosigner.
+- Federal loans discharge at death of the borrower; private loans have no such universal protection.
+- This disproportionately affects older widows — often women, often on fixed income, often unaware of liability until collections begin.
+
+**Deferment Cycles / Servicer Failures:**
+- 45% of borrowers who enrolled in an IDR plan reported difficulty with enrolling or recertifying; the most common issue was **difficulty getting information from their servicer** (CFPB 2023–2024 Survey, 20% of IDR enrollees).
+- 18% reported difficulty completing the application itself.
+- 42% of borrowers have only ever been on the standard repayment plan; 31% of those didn't know alternatives existed.
+- Student loan correspondence is typically written at a **14th-grade reading level**, while most Americans read at a **7th-grade level** — a 7-grade comprehension gap that is particularly acute for older borrowers who may have cognitive or health limitations.
+
+**Health and Hardship:**
+- 50% of Social Security offset borrowers **skipped doctor visits or prescription medications** due to costs (CFPB, 2024).
+- 36% report fair or poor health.
+- 22% of retirement-age borrowers report disabilities but fall outside automated disability discharge processes.
+
+---
+
+### 7. Where Older Borrowers Get Information
+
+*Note: Direct behavioral research (ethnography, click data) on 45+ student borrowers is limited. The following synthesizes AARP data, CFPB survey signals, and search/social media pattern research.*
+
+**Primary institutional sources:**
+- **AARP** — The dominant trusted institutional voice for borrowers 50+. AARP Foundation partnered with NCLC to provide specialized guidance for over-50 borrowers. AARP has a free Savi tool at AARP.org/studentloans and runs free webinar series. Borrowers actively search AARP.org for student loan content.
+- **CFPB / StudentAid.gov** — Government-issued guidance; trusted for factual information but complex to navigate.
+- **National Consumer Law Center (NCLC)** — Policy and legal resource, more trusted by advocates than borrowers directly.
+
+**Digital and media channels:**
+- **Search engines (Google)** — Primary discovery channel. Older borrowers search terms like "student loan Social Security garnishment," "parent plus loan forgiveness," "what happens to student loans when you retire," and "PSLF denied what to do."
+- **Facebook groups** — Informal peer networks (e.g., "Student Loan Forgiveness Support Group," parent PLUS-specific groups) are active for this cohort. Facebook remains the dominant social platform for users 45–65.
+- **NPR / public radio** — High trust among educated older borrowers; NPR Ed coverage and Planet Money episodes drive awareness of policy changes.
+- **Local news** — Community newspapers and local TV news segments on Social Security garnishment reach borrowers who don't follow national student debt media.
+- **NextAvenue.org** — AARP's media platform for adults 50+; actively covers student loan issues for older borrowers.
+- **Reddit (r/StudentLoans)** — Skews younger but has a substantial contingent of older borrowers asking questions in the parent PLUS and PSLF threads.
+
+**What they do NOT use (relative to younger borrowers):**
+- TikTok, Instagram — Very low penetration for debt-specific research in this cohort.
+- Twitter/X — Declining among 45+ for financial research.
+
+---
+
+### 8. Reading Level and Accessibility Needs
+
+- Student loan communications are written at a **14th-grade reading level**; the U.S. average adult reads at a **7th-grade level** (findlaw / broader literacy research).
+- For a nonprofit serving this audience, **plain language at 6th–8th grade reading level** is the appropriate target.
+- Older adults (especially 62+) are more likely to have: reduced screen contrast sensitivity (use high-contrast text), motor limitations (larger tap targets), and cognitive load issues under stress (shorter sentences, bullet structure, no jargon).
+- **WCAG 2.1 AA compliance** is the minimum accessibility standard; WCAG 2.2 preferred.
+- PDF-heavy content should be supplemented with HTML versions; many older borrowers access content on smartphones with limited storage.
+- Telephone as a channel remains important — this cohort has higher phone-call preference for sensitive financial matters than digital forms.
+
+---
+
+### 9. Behavioral and Emotional Profile
+
+- **Shame and isolation** — Many older borrowers feel stigmatized; they expected to be debt-free by this life stage. Messaging that normalizes their situation reduces bounce rates.
+- **Distrust of servicers** — After years of incorrect information, holds, and bureaucratic runarounds, this cohort is highly skeptical of official communications. Third-party advocacy organizations are perceived as more trustworthy.
+- **Information overwhelm** — The complexity of IDR plans, PSLF, consolidation, and rehabilitation pathways creates analysis paralysis. Step-by-step simplified content converts better than comprehensive guides.
+- **Urgency at specific triggers** — Social Security offset notices, tax refund seizure notices, and retirement planning milestones are the key activation moments. Content tied to these triggers has high engagement.
+- **56% of Gen X student loan holders** report concern about their ability to repay (FINRA Foundation, October 2024) — anxiety is the dominant emotional state.
+
+---
+
+### 10. Data Quality Notes — Audience B
+
+- Most federal datasets (FSA, CFPB) do not cross-tabulate age with race/gender simultaneously; breakdowns are reported separately, limiting intersectional analysis.
+- The CFPB 2023–2024 Borrower Survey is the most current large-sample source but does not publish age-specific breakdowns for all questions.
+- Social Security garnishment data lags by 1–2 years; the October 2024 resumption of collections will produce updated figures in 2025–2026 FSA reports.
+- Private loan data (non-federal) is systemically undercounted; NCLC estimates are partially based on survey extrapolation.
+- Behavioral data (where borrowers seek information) relies on platform analytics not publicly available; the channel priorities above are based on AARP stated outreach strategy + demographic social media usage patterns.
+
+**Sources:**
+- [Federal Reserve SHED 2024 — Higher Education and Student Loans](https://www.federalreserve.gov/publications/2025-economic-well-being-of-us-households-in-2024-higher-education-and-student-loans.htm)
+- [educationdata.org — Student Loan Debt by Age Group](https://educationdata.org/student-loan-debt-by-age-group)
+- [CFPB Issue Spotlight: Social Security Offsets and Defaulted Student Loans (2024)](https://www.consumerfinance.gov/data-research/research-reports/issue-spotlight-social-security-offsets-and-defaulted-student-loans/)
+- [NCLC — 3.5 Million Older Americans Have Over $125 Billion in Student Loans](https://www.nclc.org/3-5-million-older-americans-have-over-125-billion-in-student-loans/)
+- [CFPB — Insights from the 2023-2024 Student Loan Borrower Survey](https://www.consumerfinance.gov/data-research/research-reports/insights-from-the-2023-2024-student-loan-borrower-survey/)
+- [AARP — Student Debt Crisis for Older Americans](https://www.aarp.org/money/personal-finance/student-debt-crisis-for-older-americans/)
+- [AARP — Student Loan Debt Assistance for Older Adults](https://www.aarp.org/aarp-foundation/find-help/student-loans.html)
+- [educationdata.org — Student Loan Debt by Race](https://educationdata.org/student-loan-debt-by-race)
+- [CEPR — Student Loan Debt Across Race and Gender Groups](https://cepr.net/student-loan-debt-is-common-across-all-race-and-gender-groups-especially-for-black-women/)
+- [educationdata.org — Student Loan Forgiveness / PSLF Statistics](https://educationdata.org/student-loan-forgiveness-statistics)
+- [CBO — Federal Student Loan Repayment, 2009–2019 (September 2024)](https://www.cbo.gov/system/files/2024-09/58963-student-loan.pdf)
+- [The State of American Debt 2025 — The Kaplan Group](https://www.kaplancollectionagency.com/debt-collection-2/the-state-of-american-debt-2025-36-debt-growth-among-seniors-student-loan-delinquency-up-841/)
+- [FINRA Foundation — How Gen X Compares Financially (October 2024)](https://www.finrafoundation.org/sites/finrafoundation/files/2024-10/how-gen-x-compares-financially-to-other-generations-oct2024.pdf)
+
+---
+
+*Research compiled by Data Analyst Agent using WebSearch and WebFetch across authoritative primary sources. All figures should be verified against original source documents before use in grant applications or public communications.*
diff --git a/research/grantee-seo-comparison.md b/research/grantee-seo-comparison.md
new file mode 100644
index 0000000..4e54b92
--- /dev/null
+++ b/research/grantee-seo-comparison.md
@@ -0,0 +1,112 @@
+# Student Debt Advocacy Nonprofits: SEO & Funding Comparison
+
+## Executive Summary
+
+This research profiles the top 20 US 501(c)(3) nonprofits working in student-debt advocacy, financial protection, and consumer-finance education. Data was compiled from direct website inspection, ProPublica Nonprofit Explorer filings, and supplementary research. Organizations range from ~$1.1M to $33.2M in annual revenue, with funding heavily dependent on foundation grants and individual contributions.
+
+---
+
+## Organizational Profiles & SEO Comparison
+
+| # | Organization | Homepage URL | Title Tag | Meta Description | H1 Wording | Most Recent Revenue (Year) | Top 3 Named Funders | SEO Keywords | Cy Pres Page? | Visual Tone |
+|---|---|---|---|---|---|---|---|---|---|---|
+| 1 | Student Debt Crisis Center (SDCC) | studentdebtcrisis.org | Student Debt Crisis Center \| A people-powered movement representing over 2 million supporters | Not provided | Centering Borrower Voices | $321,002 (2024) | Donations only (no named funders disclosed) | student debt, borrower advocacy, debt relief, crisis | Not found | Borrower-friendly accessible |
+| 2 | Student Borrower Protection Center (Protect Borrowers) | protectborrowers.org | Home - Protect Borrowers | Not provided | A fair economy doesn't put a price tag on opportunity | Not disclosed | Not disclosed | borrower protection, student loans, predatory lending, litigation | Bodor v. Maximus settlement | Borrower-friendly accessible |
+| 3 | The Institute for College Access & Success (TICAS) | ticas.org | The Institute for College Access & Success | Not provided | Fighting for affordability, accountability, and equity in higher education | Fighting for affordability, accountability, and equity in higher education | Not disclosed | college access, student debt, higher education, policy | Not found | Donor-friendly polished |
+| 4 | National Consumer Law Center (NCLC) | nclc.org | Homepage - NCLC | Not provided | Working for Consumer Justice & Economic Security | Working for Consumer Justice & Economic Security | $21.6M (2024) | Not named in summary; accepts cy pres awards | consumer law, student loans, debt collection, financial protection | Active cy pres program | Donor-friendly polished |
+| 5 | Center for Responsible Lending (CRL) | responsiblelending.org | Center for Responsible Lending | Not provided | About CRL | About CRL | $9.67M (2024) | Self-Help (parent CDFI); grant funding from unnamed sources | responsible lending, financial regulation, consumer protection | Not found | Donor-friendly polished |
+| 6 | Americans for Financial Reform Education Fund (AFREF) | realbankreform.org | Americans for Financial Reform Education Fund | Not provided | We fight for a fair and just financial system that contributes to shared prosperity for all families and communities | We fight for a fair and just financial system that contributes to shared prosperity for all families and communities | $4.22M (2024) | Arca Foundation (noted: $125k in 2018); others unnamed | financial reform, consumer protection, banking regulation, advocacy | Not found | Donor-friendly polished |
+| 7 | Consumer Federation of America (CFA) | consumerfed.org | Consumer Federation of America | Not provided | Advancing the consumer interest through research, advocacy, and education | Advancing the consumer interest through research, advocacy, and education | $9.25M (2024) | Not named in summary | consumer protection, financial services, student debt, advocacy | Not found | Donor-friendly polished |
+| 8 | Demos | demos.org | Homepage \| Demos | Not provided | 25 Years of Dēmos | 25 Years of Dēmos | Not disclosed | Not disclosed | higher education, student debt, economic justice, policy | Not found | Donor-friendly polished |
+| 9 | Roosevelt Institute | rooseveltinstitute.org | The Roosevelt Institute | Not provided | Our economy & democracy are at a hinge point | Our economy & democracy are at a hinge point | $22.8M (2024) | Individual donors (93% of revenue); unnamed foundations | student debt cancellation, racial equity, economic justice | Not found | Donor-friendly polished |
+| 10 | Young Invincibles | younginvincibles.org | Homepage - Young Invincibles | Not provided | [Not provided in fetch] | [Not provided in fetch] | $5.74M (2024) | Individual donors (95.5% of revenue); unnamed foundations | student debt, young adults, college access, policy | Not found | Donor-friendly accessible |
+| 11 | uAspire | uaspire.org | uAspire - uAspire \| Affordable College Access & Financial Aid Guidance | Not provided | We improve the economic mobility of underrepresented students by increasing access to financial aid and postsecondary pathways | We improve the economic mobility of underrepresented students by increasing access to financial aid and postsecondary pathways | $11.09M (2024) | Not named in summary; Supporters page exists but content not fetched | college affordability, financial aid, student debt, guidance | Not found | Borrower-friendly accessible |
+| 12 | Generation Progress | genprogress.org | Generation Progress | Not provided | We seize power for our generation | We seize power for our generation | Not disclosed | Center for American Progress (umbrella org); unnamed sources | student debt, higher education, climate, immigration | Not found | Borrower-friendly accessible |
+| 13 | Education Trust (EdTrust) | edtrust.org | Homepage - EdTrust | Not provided | Who We Are | Who We Are | $33.2M (2025) | Gates Foundation, Walton Family Foundation, W.K. Kellogg Foundation, Chan Zuckerberg Initiative, Lumina Foundation, Strada Education Foundation, Annie E. Casey Foundation, Kresge Foundation | education equity, higher education, student success, policy | Not found | Donor-friendly polished |
+| 14 | Higher Learning Advocates | hla.higherlearningadvices.org | [Not fetched] | Not provided | [Not fetched] | Not disclosed | [Not fetched] | higher education, student debt, policy, equity | Not found | Donor-friendly polished |
+| 15 | New America | newamerica.org | New America - Big Ideas and Bold Solutions | Not provided | We are generating big ideas and bold solutions for a new America | We are generating big ideas and bold solutions for a new America | Not disclosed | Not named in homepage; Funding page accessible at newamerica.org/about/funding | higher education, education policy, student debt, policy | Not found | Donor-friendly polished |
+| 16 | National College Attainment Network (NCAN) | ncan.org | [Not fetched due to 403] | Not provided | [Not fetched] | $11.9M (2024) | Not named in summary; individual contributors (84.4%) | college access, student success, attainment, policy | Not found | Donor-friendly polished |
+| 17 | Veterans Education Success | vetsedsuccess.org | Veterans Education Success® – Serving America's Military-Connected Students | Not provided | Our Mission | Our Mission | $1.09M (2024) | Not named in summary; individual donors (92.3%) | GI Bill, veterans education, student loans, policy | Not found | Donor-friendly accessible |
+| 18 | Public Citizen | citizen.org | Public Citizen - Protecting Health, Safety, and Democracy | Not provided | People. Power. Progress | People. Power. Progress | Not disclosed | Takes no government or corporate money (independent) | consumer protection, health care, financial reform, democracy | Not found | Donor-friendly polished |
+| 19 | EDCAP Network (NY) | edcapny.org | EDCAP Helps New Yorkers With Student Loans and Debt - EDCAPNY.org | Not provided | Home | Home | Not disclosed (part of Community Service Society of New York) | Community Service Society of New York (funding body); NY State funded | student loan counseling, debt management, financial aid, repayment | Not found | Borrower-friendly accessible |
+| 20 | Hope Center for Student Basic Needs | hope.temple.edu | [Not located as standalone nonprofit; see notes] | Not provided | [Not standalone org] | [Not applicable] | [Not applicable] | basic needs, student welfare, food insecurity, housing | Not found | Research/Action-focused |
+
+---
+
+## Key Findings
+
+### Revenue Distribution
+- **Largest**: Education Trust ($33.2M), Roosevelt Institute ($22.8M), National Consumer Law Center ($21.6M)
+- **Mid-size**: NCAN ($11.9M), uAspire ($11.09M), CFL ($9.25M), CRL ($9.67M)
+- **Smallest**: Student Debt Crisis Center ($321K), Veterans Education Success ($1.09M)
+- **Median range**: $4–11M annually
+
+### Funding Pattern
+- **93–96% from contributions** (individual donors, foundations)
+- **Program services** provide 1–14% (higher for NCLC at 58%, meaning fee-based legal services)
+- **Investment income** typically 1–4%
+- **Named funders rarely disclosed** in ProPublica summaries; full Form 990 Schedule B required for individual donor names
+
+### SEO & Homepage Strategy
+- **Donor-friendly polished** orgs emphasize equity, policy, research (EdTrust, NCLC, Roosevelt, Demos, AFREF, Public Citizen)
+- **Borrower-friendly accessible** orgs emphasize direct aid, counseling, affordability (SDCC, uAspire, Young Invincibles, EDCAP, Veterans Education Success)
+- **Title tag patterns**: Policy orgs mention "Advancing," "Fighting for," "Working for"; Service orgs mention "Affordable," "Student Loan," "Debt Help"
+- **Meta descriptions**: Rarely present; when available, lead with service/mission value
+- **H1 emphasis**: Policy orgs lead with equity/systemic change; service orgs lead with borrower outcome
+
+### Cy Pres & Settlement Landscape
+- **NCLC** has active, published cy pres program accepting unclaimed class action settlement funds
+- **Protect Borrowers** actively litigates (Bodor v. Maximus class action settlement noted)
+- **No dedicated settlement/cy pres pages** found for SDCC, TICAS, Roosevelt, Demos, or others
+- Suggests settlement work is ancillary; traditional advocacy/policy is primary model
+
+### Notable Absences
+- **Hope Center for College Costs**: Not located as standalone 501(c)(3); Hope Center for Student Basic Needs at Temple University exists but focuses on food/housing insecurity, not debt specifically
+- **EDCAP is a program** of Community Service Society of New York, not a standalone org
+- **Generation Progress is a project** of Center for American Progress, not independent
+
+---
+
+## Synthesis for Student Debt Crisis Center Redesign
+
+### Competitive Landscape
+1. **Policy + Research leaders** (NCLC, Roosevelt, Demos, EdTrust) have professional, polished sites with emphasis on thought leadership and foundation funding
+2. **Borrower service orgs** (SDCC, uAspire, EDCAP) are less polished but more accessible; leverage vernacular and direct-aid language
+3. **Hybrid advocacy orgs** (AFREF, Public Citizen, TICAS) blend policy and education with clear calls-to-action
+
+### Implications for SDCC Positioning
+- SDCC's current title emphasizes **scale ("2 million supporters")** → competitive with scale-focused messaging
+- H1 "Centering Borrower Voices" aligns with **borrower-friendly accessible** tier
+- **No named funders disclosed** on SDCC site; below-industry transparency (most peer sites silent on this too)
+- **Revenue of $321K** is smallest in cohort → suggests bootstrapped operation; emphasize grassroots donor base if refocusing
+
+### SEO Opportunities
+- **SDCC keywords in metadata** (student debt, borrower advocacy) are broad; competitors differentiate by adding "higher education," "policy," "equity," "consumer protection"
+- **No cy pres page** = missed revenue stream visibility; consider adding if settlement work is planned
+- **Homepage H1 strength**: SDCC's "Centering Borrower Voices" is thematic/emotional; competitors use action verbs ("Fighting," "Advancing," "Protecting") → test split if seeking broader reach
+
+---
+
+## Sources & Methodology
+
+Data collected via:
+- **Direct homepage fetches** (19 of 20 organizations)
+- **ProPublica Nonprofit Explorer** (15 organizations with 2024 Form 990 data)
+- **GuideStar/Charity Navigator** (verification and alternative revenue sources)
+- **Organization-hosted funders pages** (EdTrust, NCLC cy pres, AFREF, Public Citizen)
+
+Timeframe: April 2025 research; most recent revenue is FY 2024 or FY 2025.
+
+Note: ProPublica Form 990 summaries do not name individual foundations or grants by default; Schedule B data (often redacted for privacy) would be needed for full funder lists. Named funders in this report come from organizations' own published "Supporters" or "Funders" pages.
+
+---
+
+## Appendix: Organizations Excluded or Noted
+
+- **Hope Center for College Costs**: No standalone nonprofit found; Hope Center at Temple University is research/policy focused on basic needs insecurity, not specifically student debt
+- **Higher Learning Advocates**: Limited homepage fetch; organization confirmed to exist and focus on higher ed policy but detailed data incomplete
+- **Roosevelt Network**: Separate entity from Roosevelt Institute; not primary focus of research
+
+---
+
+*Report compiled: April 2025*
diff --git a/research/keyword-landers.md b/research/keyword-landers.md
new file mode 100644
index 0000000..df95e3c
--- /dev/null
+++ b/research/keyword-landers.md
@@ -0,0 +1,500 @@
+# SDC Keyword Landing Pages — Research Brief
+**Prepared:** April 25, 2026
+**Audience:** Borrowers 45+, parents with PLUS loans, defaulted borrowers, PSLF/SAVE/IDR limbo
+**Source validation:** studentdebtcrisis.org navigation audit, NCLC 2025-26 issue briefs, SDC news archive, studentloanjustice.org pain-point mapping
+
+---
+
+## Methodology Note
+
+All 20 queries below were cross-referenced against:
+- SDC's own news archive (topics with recent SDC coverage = confirmed searcher demand)
+- NCLC's identified "most pressing 2025-26 issues" (7M+ borrowers affected by SAVE elimination, Treasury servicing chaos, default collections restart)
+- Borrower pain-point language from studentloanjustice.org (non-payment crisis, garnishment fears, bankruptcy exclusion)
+- Demographic skew confirmed: SDC's own guides include dedicated Parent PLUS and Delinquency/Default resources, validating those segments
+
+Difficulty ratings are qualitative and based on commercial competition (lenders, loan servicers), existing authority content from DOE/CFPB, and SDC's relative domain authority as a nonprofit advocacy org.
+
+---
+
+## Landing Pages (20 Candidates)
+
+---
+
+### 1. SAVE Plan Blocked — Policy News
+
+**Target query:** `SAVE plan blocked what happens now`
+**Search intent:** Informational (high urgency, news-driven)
+**Estimated difficulty:** Low — news cycle creates fresh demand, lenders not competing here
+**URL slug:** `/save-plan-blocked-what-happens-now`
+**H1:** The SAVE Plan Is Blocked: Here Is What Happens to Your Loans Right Now
+
+**Page structure (H2s):**
+1. What the Court Ruling Actually Did to the SAVE Plan
+2. Which Repayment Plans Are Still Available to You
+3. Why More Than 7 Million Borrowers Are Now at Risk
+4. What the Government Has (and Has Not) Told Borrowers
+5. How to Protect Yourself While Litigation Continues
+6. What Student Debt Crisis Center Is Doing About It
+
+**Internal links:** Resources (IDR guide), News (SDC SAVE coverage archive), Take Action
+**CTA:** Contact your congressperson — pre-filled letter demanding legislative protection for IDR plans
+
+---
+
+### 2. Social Security Garnishment
+
+**Target query:** `can my Social Security be garnished for student loans`
+**Search intent:** Informational (fear-driven, high emotional load)
+**Estimated difficulty:** Low-Med — CFPB and SSA have thin content; emotional query niche dominates
+**URL slug:** `/social-security-garnishment-student-loans`
+**H1:** Can the Government Garnish Your Social Security for Student Loans?
+
+**Page structure (H2s):**
+1. The Short Answer: Yes, and It Is Happening to Borrowers Over 60
+2. How the Treasury Offset Program Takes Your Benefits
+3. How Much Can They Take — and What Is Protected
+4. What Triggers Offset and How to Know If You Are at Risk
+5. Steps to Stop or Reduce a Social Security Offset
+6. Why This Is a Retirement Security Crisis, Not Just a Debt Problem
+
+**Internal links:** Resources (Delinquency & Default guide), Student Debt Stories, Take Action, Donate
+**CTA:** Share your story — form to submit personal testimony about retirement-age garnishment impact
+
+---
+
+### 3. Parent PLUS Loan Forgiveness
+
+**Target query:** `parent plus loan forgiveness options 2026`
+**Search intent:** Informational / Commercial investigation
+**Estimated difficulty:** Med — high competition from loan companies; advocacy angle differentiates
+**URL slug:** `/parent-plus-loan-forgiveness-2026`
+**H1:** Parent PLUS Loan Forgiveness in 2026: What Options Actually Exist
+
+**Page structure (H2s):**
+1. Why Parent PLUS Loans Are Different — and Often Worse
+2. Income-Contingent Repayment: The Only IDR Plan Available to Parent PLUS Borrowers
+3. PSLF and Parent PLUS: Can You Qualify?
+4. Double Consolidation Loophole: What It Was and Why It May Be Gone
+5. What Congress Has (and Has Not) Done for Parent PLUS Borrowers
+6. If You Are Over 60 With a Parent PLUS Loan, Read This Section First
+
+**Internal links:** Resources (Parent PLUS guide, IDR guide, PSLF guide), Take Action, Free the Degree
+**CTA:** Sign the petition demanding Parent PLUS borrowers be included in all IDR plans
+
+---
+
+### 4. Student Loans for Parents Over 60
+
+**Target query:** `student loans for parents over 60 what are my options`
+**Search intent:** Informational / Commercial investigation
+**Estimated difficulty:** Low — extremely specific demographic query, very little advocacy content exists
+**URL slug:** `/student-loans-parents-over-60`
+**H1:** You Are Over 60 With Student Loans. Here Is What You Need to Know.
+
+**Page structure (H2s):**
+1. How Older Borrowers Got Here: The Parent PLUS and Co-Signer Trap
+2. The Retirement Cliff: What Happens When Loan Payments Exceed Your Fixed Income
+3. Social Security Offset Risk at Retirement Age
+4. Income-Driven Repayment Eligibility When You Are Near or Past Retirement
+5. Death and Disability Discharge: What Happens to Your Loans
+6. Advocating for Yourself When the System Was Not Built for You
+
+**Internal links:** Resources (Parent PLUS guide, Delinquency & Default guide), Student Debt Stories, Donate
+**CTA:** Share your story — senior borrower testimony submission
+
+---
+
+### 5. Borrower Defense Application 2026
+
+**Target query:** `how to apply for borrower defense to repayment 2026`
+**Search intent:** Transactional / Procedural
+**Estimated difficulty:** Low-Med — DOE page exists but is bureaucratic; advocacy org guidance is more accessible
+**URL slug:** `/how-to-apply-borrower-defense-2026`
+**H1:** How to Apply for Borrower Defense to Repayment in 2026 (Step-by-Step)
+
+**Page structure (H2s):**
+1. What Borrower Defense Is and Who Qualifies
+2. Which Schools Have Approved Borrower Defense Claims
+3. What the Application Requires: Documents, Evidence, and Timeline
+4. What Has Changed Under the Current Administration
+5. What to Do If Your Application Has Been Pending for Years
+6. Free Help and Legal Resources for Borrower Defense Applicants
+
+**Internal links:** Resources hub, News (Borrower Defense coverage), Take Action, Student Debt Stories
+**CTA:** Email signup — get notified of borrower defense application status changes and policy updates
+
+---
+
+### 6. Navient Settlement Check 2026
+
+**Target query:** `Navient settlement check 2026 am I eligible`
+**Search intent:** Transactional / Commercial investigation (high intent)
+**Estimated difficulty:** Low — time-sensitive, scammy sites dominate; authoritative nonprofit fills trust gap
+**URL slug:** `/navient-settlement-check-2026`
+**H1:** Navient Settlement 2026: Are You Eligible for a Payment?
+
+**Page structure (H2s):**
+1. What the Navient Settlement Covers and Who Was Harmed
+2. How to Find Out If You Are in the Eligible Borrower Group
+3. What the Checks Actually Covered (and Why Many Borrowers Feel Cheated)
+4. The Difference Between Cy Pres Relief and Direct Loan Cancellation
+5. If You Did Not Receive a Check: What to Do Next
+6. Why Settlement Money Is Not Enough: The Broader Navient Accountability Fight
+
+**Internal links:** News (Navient coverage), Take Action, Student Debt Stories, Donate
+**CTA:** Share your story — Navient borrower testimony to support ongoing accountability advocacy
+
+---
+
+### 7. Student Loan Default Restart 2025
+
+**Target query:** `student loan default collections restarted 2025 what to do`
+**Search intent:** Informational (crisis-driven, high emotional urgency)
+**Estimated difficulty:** Low — very specific query, borrowers in panic mode, lenders avoid this
+**URL slug:** `/student-loan-default-collections-restarted-2025`
+**H1:** Student Loan Collections Have Restarted: What Happens If You Are in Default
+
+**Page structure (H2s):**
+1. What "Collections Restarted" Actually Means for You
+2. The Consequences of Default: Wage Garnishment, Tax Refunds, and Benefits Offset
+3. Loan Rehabilitation: How to Get Out of Default Step by Step
+4. Fresh Start Program: Is It Still Available in 2026?
+5. If Garnishment Has Already Started: Your Rights and Options
+6. Why This Collections Restart Is Happening to 9 Million Borrowers at Once
+
+**Internal links:** Resources (Delinquency & Default guide), News (Wage Garnishment articles), Take Action, Donate
+**CTA:** Contact your congressperson — demand a collections pause for borrowers in IDR limbo
+
+---
+
+### 8. PSLF Denied — What To Do
+
+**Target query:** `PSLF denied what to do next 2026`
+**Search intent:** Informational / Transactional (post-denial, high frustration)
+**Estimated difficulty:** Low-Med — government pages explain rules but not advocacy; emotional gap exists
+**URL slug:** `/pslf-denied-what-to-do-2026`
+**H1:** Your PSLF Application Was Denied. Here Is What to Do Next.
+
+**Page structure (H2s):**
+1. The Most Common Reasons PSLF Applications Are Denied
+2. Temporary Expanded PSLF (TEPSLF): Is It Still an Option?
+3. How to File a Reconsideration Request (With What to Include)
+4. What the IDR Waiver and One-Time Adjustment Mean for Your Denial
+5. Free Legal Help for Denied PSLF Borrowers
+6. Why So Many Public Servants Are Still Being Denied — and What We Are Doing About It
+
+**Internal links:** Resources (PSLF guide), News, Take Action, Student Debt Stories
+**CTA:** Share your story — denied PSLF borrower testimony for congressional advocacy
+
+---
+
+### 9. Student Loans Transferred to Treasury
+
+**Target query:** `student loans transferred to Treasury Department what does it mean`
+**Search intent:** Informational (breaking news, high confusion)
+**Estimated difficulty:** Low — very recent news (March 2026), almost no content exists yet
+**URL slug:** `/student-loans-transferred-treasury-department`
+**H1:** The Department of Education Transferred Your Loans to Treasury. What Now?
+
+**Page structure (H2s):**
+1. Why the Department of Education Is Moving Loans to the U.S. Treasury
+2. What This Means for Your Servicer, Account Access, and Payment Schedule
+3. The Risk of Errors When 40+ Million Accounts Change Systems
+4. What Borrowers Who Have Already Had Servicing Errors Should Do Now
+5. The Political Context: What This Administrative Move Signals
+6. How SDC Is Tracking Servicer Errors and Fighting for Borrowers
+
+**Internal links:** News (DOE Transfer article), Resources, Take Action, Donate
+**CTA:** Email signup — early-alert list for Treasury transfer errors and borrower rights updates
+
+---
+
+### 10. IDR Plans Being Eliminated
+
+**Target query:** `income driven repayment plans being eliminated what happens to my loans`
+**Search intent:** Informational (policy fear, high emotional load)
+**Estimated difficulty:** Low-Med — NCLC and SDC both cover this; keyword specificity is the differentiator
+**URL slug:** `/income-driven-repayment-plans-eliminated`
+**H1:** Income-Driven Repayment Plans Are Being Eliminated. What Happens to Your Loans?
+
+**Page structure (H2s):**
+1. Which IDR Plans Are Being Cut and Which May Survive
+2. The Budget Reconciliation Bill: How Congress Is Ending Affordable Repayment
+3. If You Are Currently on SAVE, IBR, PAYE, or REPAYE: Your Immediate Options
+4. How Repayment Changes After July 1, 2026 (SDC Guide Breakdown)
+5. Who Gets Hurt Most: Borrowers on Fixed Incomes, Parents, and Public Servants
+6. What You Can Do Before the July 2026 Deadline
+
+**Internal links:** Resources (IDR guide, Repayment after July 2026 guide), News, Take Action
+**CTA:** Contact your congressperson — pre-filled letter opposing IDR plan elimination
+
+---
+
+### 11. Wage Garnishment Student Loans
+
+**Target query:** `wage garnishment for student loans how much can they take`
+**Search intent:** Informational (procedural, fear-driven)
+**Estimated difficulty:** Low — SDC already has wage garnishment FAQ; this expands it into a full landing page
+**URL slug:** `/wage-garnishment-student-loans-how-much`
+**H1:** Student Loan Wage Garnishment: How Much Can They Take From Your Paycheck?
+
+**Page structure (H2s):**
+1. How Federal Student Loan Wage Garnishment Works (Administrative vs. Court Order)
+2. The Legal Limits: What Percentage of Your Wages Can Be Withheld
+3. How to Get a Hearing and Challenge a Garnishment Order
+4. Hardship Exemption: Can You Reduce or Stop Garnishment?
+5. Getting Out of Default to End Garnishment: Rehabilitation vs. Consolidation
+6. If Your Employer Has Already Been Notified: Steps to Take Today
+
+**Internal links:** Resources (Delinquency & Default guide, Wage Garnishment FAQ), Take Action, Donate
+**CTA:** Share your story — wage garnishment testimony for congressional record
+
+---
+
+### 12. For-Profit College Loan Discharge
+
+**Target query:** `for profit college closed loan discharge how to apply`
+**Search intent:** Transactional / Procedural
+**Estimated difficulty:** Low — high volume of affected borrowers, bureaucratic government pages leave gap
+**URL slug:** `/for-profit-college-closed-school-loan-discharge`
+**H1:** Did Your For-Profit College Close? How to Apply for a Loan Discharge
+
+**Page structure (H2s):**
+1. Closed School Discharge vs. Borrower Defense: Which One Applies to You
+2. Schools Currently Covered Under Automatic Closed School Discharge
+3. What Documentation You Need and Where to Find It
+4. The Application Process: Timeline and What to Expect
+5. What Happens If the Current Administration Rescinds These Protections
+6. For-Profit College Survivors: You Were Defrauded, Not Irresponsible
+
+**Internal links:** Resources (Borrower Defense content), News, Student Debt Stories, Take Action
+**CTA:** Share your story — for-profit college survivor testimony
+
+---
+
+### 13. Student Loan Bankruptcy Reform
+
+**Target query:** `can you discharge student loans in bankruptcy 2026`
+**Search intent:** Informational / Transactional
+**Estimated difficulty:** Med — legal sites and law firms compete here; advocacy angle differentiates
+**URL slug:** `/discharge-student-loans-bankruptcy-2026`
+**H1:** Can You Discharge Student Loans in Bankruptcy in 2026?
+
+**Page structure (H2s))**
+1. The "Undue Hardship" Standard: Why It Is Nearly Impossible to Meet
+2. The Brunner Test Explained in Plain English
+3. Recent Court Wins: When Judges Have Discharged Student Loans
+4. What Proposed Legislation Would Change About Student Loan Bankruptcy
+5. How Student Loan Bankruptcy Exclusion Was Created — and Why It Needs to End
+6. What to Do If You Are Considering Bankruptcy With Student Debt
+
+**Internal links:** News, Resources, Take Action, Donate
+**CTA:** Sign the petition — demanding Congress restore bankruptcy rights for student loan borrowers
+
+---
+
+### 14. Spouse's Student Loans After Death
+
+**Target query:** `am I responsible for my spouse's student loans if they die`
+**Search intent:** Informational (grief + fear, deeply personal)
+**Estimated difficulty:** Low — almost no nonprofit content exists on this specific query
+**URL slug:** `/am-i-responsible-spouse-student-loans-death`
+**H1:** Are You Responsible for Your Spouse's Student Loans If They Pass Away?
+
+**Page structure (H2s):**
+1. Federal vs. Private Loans: The Rules Are Very Different
+2. Federal Student Loan Death Discharge: What Is Required and How to Apply
+3. Community Property States: When You May Be on the Hook for Federal Loans
+4. Private Student Loans After a Spouse Dies: What Lenders Do Not Tell You
+5. Parent PLUS Loans and the Death of the Student: What Parents Need to Know
+6. How to Protect Your Family From Student Loan Liability
+
+**Internal links:** Resources, Student Debt Stories, Donate, Take Action
+**CTA:** Email signup — get the SDC guide on navigating student loans during family crises
+
+---
+
+### 15. PSLF and Part-Time Work
+
+**Target query:** `does part time work count for public service loan forgiveness`
+**Search intent:** Informational / Procedural
+**Estimated difficulty:** Low-Med — rule-specific query, government page is dense; cleaner advocacy version needed
+**URL slug:** `/part-time-work-public-service-loan-forgiveness`
+**H1:** Does Part-Time Work Count Toward Public Service Loan Forgiveness?
+
+**Page structure (H2s):**
+1. The 30-Hour Rule: What PSLF Actually Requires for Part-Time Employees
+2. Working Multiple Part-Time Jobs: How to Combine Hours for PSLF Eligibility
+3. Which Employers Qualify — and Some That Surprise Borrowers
+4. How to Document Part-Time PSLF Employment Correctly
+5. Common Mistakes That Disqualify Years of Part-Time Service
+6. Why PSLF Rules Punish Non-Traditional Workers — and What Should Change
+
+**Internal links:** Resources (PSLF guide), Student Debt Stories, Take Action
+**CTA:** Share your story — part-time worker PSLF denial testimony
+
+---
+
+### 16. Tax Refund Seized for Student Loans
+
+**Target query:** `IRS seized my tax refund for student loans what can I do`
+**Search intent:** Informational / Transactional (crisis, immediate action needed)
+**Estimated difficulty:** Low — high urgency, underserved by existing content, borrowers in panic mode
+**URL slug:** `/irs-seized-tax-refund-student-loans`
+**H1:** The IRS Seized Your Tax Refund for Student Loans. Here Is What You Can Do.
+
+**Page structure (H2s):**
+1. Why the Government Took Your Refund: The Treasury Offset Program Explained
+2. How to Find Out If Your Refund Was Taken for Student Loans
+3. Injured Spouse Claims: Protecting Your Spouse's Portion of a Joint Refund
+4. How to Request an Offset Bypass Refund Due to Financial Hardship
+5. Getting Out of Default to Prevent Future Offset
+6. If the Refund Was Wrong: How to Dispute a Tax Offset
+
+**Internal links:** Resources (Delinquency & Default guide), News, Take Action, Donate
+**CTA:** Contact your congressperson — demand automatic hardship exemptions from tax offset
+
+---
+
+### 17. Student Loan Forgiveness After 20 Years
+
+**Target query:** `student loan forgiveness after 20 years not happening what is wrong`
+**Search intent:** Informational (high frustration, betrayal narrative)
+**Estimated difficulty:** Low — emotionally specific phrasing, borrowers who followed the rules and got nothing
+**URL slug:** `/student-loan-forgiveness-20-years-not-happening`
+**H1:** You Were Promised Forgiveness After 20 Years. Why Has It Not Happened?
+
+**Page structure (H2s):**
+1. What the 20-Year Forgiveness Rule Was Supposed to Mean
+2. Why Servicer Errors and Payment Count Problems Are Blocking Forgiveness
+3. The IDR Adjustment: Did It Fix Your Payment Count — Or Was It Too Late?
+4. How the SAVE Plan Elimination Affects Borrowers Who Were Close to Forgiveness
+5. What "Forgiveness" Means for Your Tax Bill (and Why It Is Not Free)
+6. Thousands of Borrowers Are in Your Situation. This Is What We Are Fighting For.
+
+**Internal links:** Resources (IDR guide, SAVE guide), News, Student Debt Stories, Take Action
+**CTA:** Share your story — 20-year forgiveness betrayal testimony for congressional advocacy
+
+---
+
+### 18. Disability Discharge Student Loans
+
+**Target query:** `total and permanent disability discharge student loans 2026 how to apply`
+**Search intent:** Transactional / Procedural
+**Estimated difficulty:** Low — underserved demographic, SSA/VA benefit recipients 45+
+**URL slug:** `/total-permanent-disability-discharge-student-loans-2026`
+**H1:** Total and Permanent Disability Discharge for Student Loans in 2026: How to Apply
+
+**Page structure (H2s):**
+1. Who Qualifies for TPD Discharge (SSA, VA, and Physician Certification Paths)
+2. What the Automatic TPD Discharge Means If You Receive SSA Disability
+3. The Three-Year Monitoring Period: What You Are Required to Report
+4. What Happens to Taxes on Discharged Loan Amounts Under Current Law
+5. If Your TPD Application Was Denied: Reconsideration Steps
+6. Disability and Student Debt: A Crisis Within a Crisis
+
+**Internal links:** Resources, Student Debt Stories, Donate, Take Action
+**CTA:** Email signup — get the SDC disability discharge checklist and status alerts
+
+---
+
+### 19. Co-Signer Student Loan Liability
+
+**Target query:** `I co-signed my child's student loan and they can't pay what happens to me`
+**Search intent:** Informational (fear-driven, parent demographic, high emotional weight)
+**Estimated difficulty:** Low — extremely specific query, almost no nonprofit content
+**URL slug:** `/cosigned-student-loan-child-cant-pay`
+**H1:** You Co-Signed Your Child's Student Loan and They Cannot Pay. Now What?
+
+**Page structure (H2s):**
+1. What Co-Signing Actually Means: You Are Equally Responsible
+2. How Private Loan Defaults Affect Your Credit, Wages, and Retirement
+3. Co-Signer Release: Does It Exist, and Can You Qualify?
+4. If Your Child Declares Bankruptcy: Does It Discharge Your Co-Signer Liability?
+5. Refinancing Options to Remove Yourself as Co-Signer
+6. Federal vs. Private Loan Co-Signing: The Critical Difference Parents Miss
+
+**Internal links:** Resources, Student Debt Stories, Take Action, Free the Degree
+**CTA:** Share your story — co-signer parent testimony for private loan reform advocacy
+
+---
+
+### 20. IDR Application Backlog 2026
+
+**Target query:** `IDR application stuck pending 2026 what to do`
+**Search intent:** Informational / Transactional (bureaucratic frustration, immediate need)
+**Estimated difficulty:** Low — extremely timely, very little content exists on backlog specifically
+**URL slug:** `/idr-application-stuck-pending-2026`
+**H1:** Your IDR Application Is Stuck. Here Is Why — and What You Can Do About It.
+
+**Page structure (H2s):**
+1. Why IDR Applications Are Backlogged: The Processing Crisis Explained
+2. What Happens to Your Loans and Interest While Your Application Is Pending
+3. How to Check Your IDR Application Status (Step by Step)
+4. When to Call Your Servicer — and What to Say
+5. Escalation Options: Ombudsman, CFPB Complaint, and Congressional Inquiry
+6. Why the Processing Backlog Is Not Your Fault — and What Needs to Change
+
+**Internal links:** Resources (IDR guide), News, Take Action, Student Debt Stories
+**CTA:** Contact your congressperson — pre-filled letter demanding servicer accountability for IDR backlogs
+
+---
+
+## Priority Tiers
+
+### Tier 1 — Publish First (highest urgency + lowest competition)
+1. `/save-plan-blocked-what-happens-now` — news cycle peak, 7M+ affected borrowers
+2. `/student-loans-transferred-treasury-department` — March 2026 news, almost zero content exists
+3. `/student-loan-default-collections-restarted-2025` — 9M borrowers re-entering collections
+4. `/idr-application-stuck-pending-2026` — NCLC-confirmed processing crisis
+5. `/irs-seized-tax-refund-student-loans` — tax season urgency, March-May spike
+
+### Tier 2 — High Emotional / Demographic Value
+6. `/social-security-garnishment-student-loans` — retirement-age fear, evergreen
+7. `/student-loans-parents-over-60` — underserved demographic, low competition
+8. `/cosigned-student-loan-child-cant-pay` — parent pain point, unique angle
+9. `/student-loan-forgiveness-20-years-not-happening` — betrayal narrative, evergreen
+10. `/am-i-responsible-spouse-student-loans-death` — grief + fear, unique advocacy gap
+
+### Tier 3 — Procedural / High-Intent Transactional
+11. `/parent-plus-loan-forgiveness-2026` — perennial high-volume query
+12. `/how-to-apply-borrower-defense-2026` — procedural gap content
+13. `/pslf-denied-what-to-do-2026` — post-denial frustration, high share intent
+14. `/for-profit-college-closed-school-loan-discharge` — high-volume, underserved
+15. `/total-permanent-disability-discharge-student-loans-2026` — procedural, 45+ audience
+
+### Tier 4 — Long-Term Authority Building
+16. `/income-driven-repayment-plans-eliminated` — broad policy page
+17. `/wage-garnishment-student-loans-how-much` — expands existing FAQ
+18. `/navient-settlement-check-2026` — cy pres / settlement angle
+19. `/discharge-student-loans-bankruptcy-2026` — competitive but unique advocacy frame
+20. `/part-time-work-public-service-loan-forgiveness` — rule-specific, niche but loyal audience
+
+---
+
+## SDC Internal Link Map (Reference)
+
+All pages should link to at least 3 of these core destinations:
+
+| Core Page | Path | Anchor Text Themes |
+|---|---|---|
+| Take Action | `/take-action` | "tell Congress," "contact your representative," "take action" |
+| Student Debt Stories | `/student-debt-stories` | "read other borrowers' stories," "you are not alone" |
+| Resources | `/resources` | "download the free guide," "get the full breakdown" |
+| News | `/news` | "read our latest coverage," "follow the latest" |
+| Donate | (ActBlue) | "support this fight," "fund our advocacy" |
+| Free the Degree | `/free-the-degree` | "college affordability reform," "make college affordable again" |
+| About | `/about-us` | "who we are," "our movement" |
+
+---
+
+## CTA Assignment Summary
+
+| CTA Type | Assigned Pages |
+|---|---|
+| Contact congressperson (pre-filled letter) | SAVE blocked, IDR eliminated, Tax refund seized, IDR backlog, default collections |
+| Share your story (testimony submission) | Social Security garnishment, PSLF denied, wage garnishment, for-profit college, 20-year forgiveness, part-time PSLF, co-signer parent, spouse death |
+| Sign petition | Parent PLUS forgiveness, bankruptcy reform |
+| Email signup (alert/guide) | Borrower defense, Treasury transfer, disability discharge, spouse death guide |
+| Donate | Navient settlement (accountability framing) |
diff --git a/screenshots/01-home-desktop.png b/screenshots/01-home-desktop.png
new file mode 100644
index 0000000..d1ade2f
Binary files /dev/null and b/screenshots/01-home-desktop.png differ
diff --git a/screenshots/01b-home-mobile.png b/screenshots/01b-home-mobile.png
new file mode 100644
index 0000000..e7b3dd5
Binary files /dev/null and b/screenshots/01b-home-mobile.png differ
diff --git a/screenshots/02-action-desktop.png b/screenshots/02-action-desktop.png
new file mode 100644
index 0000000..eec8094
Binary files /dev/null and b/screenshots/02-action-desktop.png differ
diff --git a/screenshots/03-stories-desktop.png b/screenshots/03-stories-desktop.png
new file mode 100644
index 0000000..709a335
Binary files /dev/null and b/screenshots/03-stories-desktop.png differ
diff --git a/screenshots/04-resources-desktop.png b/screenshots/04-resources-desktop.png
new file mode 100644
index 0000000..0d9dafb
Binary files /dev/null and b/screenshots/04-resources-desktop.png differ
diff --git a/screenshots/05-news-desktop.png b/screenshots/05-news-desktop.png
new file mode 100644
index 0000000..b2ca5e6
Binary files /dev/null and b/screenshots/05-news-desktop.png differ
diff --git a/screenshots/06-free-the-degree.png b/screenshots/06-free-the-degree.png
new file mode 100644
index 0000000..b35b30a
Binary files /dev/null and b/screenshots/06-free-the-degree.png differ
diff --git a/screenshots/07-about.png b/screenshots/07-about.png
new file mode 100644
index 0000000..d6626e1
Binary files /dev/null and b/screenshots/07-about.png differ
diff --git a/screenshots/08-contact.png b/screenshots/08-contact.png
new file mode 100644
index 0000000..595e3cb
Binary files /dev/null and b/screenshots/08-contact.png differ
diff --git a/showcase/index.html b/showcase/index.html
new file mode 100644
index 0000000..f9673c1
--- /dev/null
+++ b/showcase/index.html
@@ -0,0 +1,715 @@
+<!doctype html>
+<html lang="en">
+<head>
+<meta charset="utf-8" />
+<meta name="viewport" content="width=device-width,initial-scale=1" />
+<title>SDCC Redesign Showcase — 46 themes × 4 audiences × 8 pages</title>
+<link rel="preconnect" href="https://fonts.googleapis.com" />
+<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
+<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Source+Serif+4:wght@400;600;700&family=Lora:wght@400;600;700&family=Space+Grotesk:wght@400;500;700&family=Crimson+Pro:wght@400;600;700&family=DM+Mono&family=Playfair+Display:wght@500;700;800&family=Spectral:wght@400;600;700&family=IBM+Plex+Mono&family=Bebas+Neue&family=Anton&family=Archivo+Black&family=Public+Sans:wght@400;500;700&family=Rubik+Mono+One&display=swap" rel="stylesheet">
+<style>
+ :root{
+ --t-bg:#0b1733; --t-surface:#ffffff; --t-text:#0a0f24; --t-muted:#5a6076;
+ --t-primary:#1d4ed8; --t-accent:#dc2626; --t-h:'Inter',system-ui,sans-serif; --t-b:'Inter',system-ui,sans-serif;
+ --t-radius:14px;
+ }
+ *{box-sizing:border-box}
+ html,body{margin:0;padding:0;height:100%;background:#f3f4f6;color:#0a0a0a;font-family:'Inter',system-ui,sans-serif}
+ /* APP SHELL — strict grid, no overlap */
+ .app{display:grid;grid-template-rows:auto 1fr;height:100vh;min-height:0}
+ header.bar{
+ position:sticky;top:0;z-index:30;background:#0a0f24;color:#fff;
+ display:grid;grid-template-columns:auto 1fr auto;gap:18px;align-items:center;
+ padding:10px 18px;border-bottom:1px solid #1f2540;min-height:60px}
+ header.bar h1{font-size:14px;letter-spacing:.04em;text-transform:uppercase;margin:0;color:#fff;white-space:nowrap}
+ header.bar h1 b{color:#facc15}
+ .controls{display:flex;flex-wrap:wrap;gap:10px;align-items:center;justify-self:center;min-width:0}
+ .ctl{display:flex;flex-direction:column;gap:2px;min-width:0}
+ .ctl label{font-size:10px;letter-spacing:.06em;text-transform:uppercase;color:#9aa3c2}
+ .ctl select{min-height:36px;background:#15193a;color:#fff;border:1px solid #2a2f55;border-radius:8px;padding:6px 10px;font:inherit;font-size:13px;max-width:280px}
+ .pill-btn{min-height:36px;padding:6px 14px;border-radius:8px;background:#facc15;color:#1a1a1a;border:0;font-weight:700;cursor:pointer;font-size:13px;white-space:nowrap}
+ .pill-btn.ghost{background:transparent;color:#facc15;border:1px solid #facc15}
+ /* MAIN GRID 2/3 + 1/3, each cell scrolls itself */
+ main.split{display:grid;grid-template-columns:minmax(0,2fr) minmax(0,1fr);min-height:0;gap:0}
+ @media (max-width:980px){ main.split{grid-template-columns:1fr;grid-template-rows:60vh 1fr} }
+ .pane{min-width:0;min-height:0;overflow:auto;background:#fff}
+ .pane.preview{background:var(--t-bg);color:var(--t-text)}
+ .pane.critique{background:#ffffff;border-left:1px solid #e5e7eb}
+ /* PREVIEW INTERNAL — themed mock */
+ .mock{font-family:var(--t-b);color:var(--t-text);background:var(--t-surface);min-height:100%;display:flex;flex-direction:column}
+ .mock .topnav{display:flex;align-items:center;justify-content:space-between;padding:14px 22px;background:var(--t-bg);color:var(--t-surface);position:sticky;top:0;z-index:5}
+ .mock .topnav .brand{font-family:var(--t-h);font-weight:800;font-size:18px;line-height:1}
+ .mock .topnav nav a{color:var(--t-surface);text-decoration:none;font-size:13px;margin-left:14px;opacity:.9}
+ .mock .topnav .donate{background:var(--t-accent);color:#fff;padding:8px 14px;border-radius:8px;text-decoration:none;font-weight:700;font-size:13px;margin-left:14px}
+ .mock .hero{padding:48px 32px;display:grid;grid-template-columns:1.2fr .8fr;gap:32px;align-items:center;background:var(--t-surface)}
+ @media (max-width:640px){ .mock .hero{grid-template-columns:1fr} }
+ .mock h1.hero-h{font-family:var(--t-h);font-size:42px;line-height:1.05;margin:0 0 14px;color:var(--t-text);letter-spacing:-.01em}
+ .mock p.hero-p{font-size:17px;color:var(--t-muted);line-height:1.5;margin:0 0 22px}
+ .mock .ctas{display:flex;flex-wrap:wrap;gap:10px}
+ .mock .btn-p{background:var(--t-primary);color:#fff;padding:12px 18px;border-radius:10px;font-weight:700;text-decoration:none;font-size:14px}
+ .mock .btn-s{background:transparent;border:2px solid var(--t-primary);color:var(--t-primary);padding:10px 16px;border-radius:10px;font-weight:700;text-decoration:none;font-size:14px}
+ .mock .hero-art{aspect-ratio:1.2;background:linear-gradient(135deg,var(--t-primary),var(--t-accent));border-radius:var(--t-radius);display:flex;align-items:center;justify-content:center;color:#fff;font-family:var(--t-h);font-size:22px;text-align:center;padding:24px}
+ .mock .stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:10px;padding:24px 32px;background:var(--t-bg);color:var(--t-surface)}
+ .mock .stat{padding:14px;border-radius:10px;background:rgba(255,255,255,.06)}
+ .mock .stat b{font-family:var(--t-h);font-size:26px;display:block;color:var(--t-surface)}
+ .mock .stat span{font-size:12px;opacity:.8}
+ .mock .section{padding:36px 32px;background:var(--t-surface);border-top:1px solid rgba(0,0,0,.06)}
+ .mock h2{font-family:var(--t-h);font-size:26px;margin:0 0 18px;color:var(--t-text)}
+ .mock .cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:14px}
+ .mock .card{padding:18px;border:1px solid rgba(0,0,0,.08);border-radius:var(--t-radius);background:#fff;color:var(--t-text)}
+ .mock .card h3{font-family:var(--t-h);font-size:16px;margin:0 0 8px}
+ .mock .card p{font-size:13px;color:var(--t-muted);margin:0 0 10px;line-height:1.5}
+ .mock .card a{color:var(--t-primary);font-size:13px;text-decoration:none;font-weight:700}
+ .mock .funder-strip{display:flex;flex-wrap:wrap;gap:14px;justify-content:center;padding:20px;background:rgba(0,0,0,.04)}
+ .mock .funder-strip span{font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--t-muted);padding:6px 10px;border:1px solid var(--t-muted);border-radius:4px}
+ .mock .footer{padding:24px 32px;background:#0a0f24;color:#cbd5e1;font-size:12px;line-height:1.6}
+ /* numbered card variant — for Tate Esq style */
+ .mock .num-card{padding:24px;border:1px solid rgba(0,0,0,.1);border-radius:var(--t-radius);background:var(--t-surface)}
+ .mock .num-card .n{font-family:var(--t-h);font-size:14px;color:var(--t-primary);letter-spacing:.12em;font-weight:700}
+ .mock .num-card h3{font-size:20px;margin:8px 0 8px}
+ /* PSLF calc */
+ .calc{display:grid;grid-template-columns:1fr 1fr;gap:16px}
+ @media (max-width:640px){.calc{grid-template-columns:1fr}}
+ .calc input,.calc select{width:100%;min-height:42px;padding:8px 10px;border:1px solid #cbd5e1;border-radius:8px;font:inherit;font-size:14px}
+ .calc label{font-size:12px;color:var(--t-muted);font-weight:600;display:block;margin-bottom:4px}
+ .calc-row{display:flex;gap:14px;flex-wrap:wrap;margin-top:18px}
+ .calc-out{padding:14px;background:rgba(0,0,0,.04);border-radius:10px;font-size:14px;line-height:1.6}
+ .calc-out b{display:block;font-family:var(--t-h);font-size:22px;color:var(--t-primary)}
+ pre.json{background:#0a0f24;color:#a5f3fc;padding:16px;border-radius:10px;overflow:auto;font-family:'IBM Plex Mono',ui-monospace,monospace;font-size:12px;line-height:1.55}
+ /* CRITIQUE PANEL */
+ .crit{padding:18px 18px 60px;display:flex;flex-direction:column;gap:16px}
+ .crit h2{font-size:16px;margin:0 0 6px;letter-spacing:.04em;text-transform:uppercase;color:#0a0f24}
+ .crit .scorebar{display:flex;align-items:center;gap:10px}
+ .scorechip{padding:8px 12px;border-radius:999px;font-weight:700;font-size:12px}
+ .pass{background:#dcfce7;color:#14532d}.warn{background:#fef9c3;color:#713f12}.fail{background:#fee2e2;color:#7f1d1d}
+ .crit details{border:1px solid #e5e7eb;border-radius:10px;padding:10px 12px;background:#fafafa}
+ .crit details[open]{background:#fff}
+ .crit summary{cursor:pointer;font-weight:700;font-size:13px;color:#0a0f24}
+ .crit ul{margin:6px 0 0;padding-left:18px;font-size:13px;line-height:1.55;color:#1f2937}
+ .crit li{margin:4px 0}
+ .crit .pros li::marker{color:#16a34a}
+ .crit .cons li::marker{color:#dc2626}
+ .crit .ideas li::marker{color:#2563eb}
+ .crit .why{background:#0a0f24;color:#fff;padding:14px;border-radius:10px;font-size:13px;line-height:1.6}
+ .crit .why b{color:#facc15}
+ .crit .meta{font-size:11px;color:#6b7280}
+ /* Modal — clean dialog, no overlap */
+ dialog#revModal{border:0;border-radius:14px;padding:0;width:min(720px,92vw);max-height:88vh;box-shadow:0 30px 80px rgba(0,0,0,.4)}
+ dialog#revModal::backdrop{background:rgba(8,12,30,.6);backdrop-filter:blur(2px)}
+ .rev-h{padding:18px 22px;background:#0a0f24;color:#fff;display:flex;justify-content:space-between;align-items:center;border-radius:14px 14px 0 0}
+ .rev-h h2{margin:0;font-size:18px}
+ .rev-h button{background:transparent;border:1px solid #fff;color:#fff;border-radius:8px;padding:6px 12px;cursor:pointer}
+ .rev-body{padding:18px 22px;overflow:auto;max-height:calc(88vh - 70px);background:#fff}
+ .rev-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:12px}
+ .rev-card{border:1px solid #e5e7eb;border-radius:10px;padding:14px;background:#fafafa}
+ .rev-card h3{margin:0 0 6px;font-size:14px;color:#0a0f24}
+ .rev-card p{margin:0;font-size:12px;color:#374151;line-height:1.5}
+ .rev-card .tag{display:inline-block;font-size:10px;font-weight:700;padding:3px 8px;border-radius:999px;background:#fef3c7;color:#92400e;margin-right:4px;margin-bottom:6px;letter-spacing:.04em;text-transform:uppercase}
+ .rev-card .tag.h{background:#dbeafe;color:#1e3a8a}
+ .rev-card .tag.q{background:#dcfce7;color:#14532d}
+ /* tiny day badge */
+ .day-chip{font-size:10px;padding:3px 8px;border-radius:999px;background:#facc15;color:#1a1a1a;font-weight:700;letter-spacing:.05em;text-transform:uppercase;margin-left:6px;vertical-align:middle}
+ .day-chip.may{background:#dc2626;color:#fff}
+ .day-chip.tate{background:#0ea5e9;color:#fff}
+ /* ALL-46 OVERVIEW PAGE */
+ main.overview{overflow:auto;background:#0e1320;padding:24px;min-height:0}
+ .ov-head{color:#fff;display:flex;justify-content:space-between;align-items:flex-end;gap:12px;margin-bottom:16px;flex-wrap:wrap}
+ .ov-head h2{font-size:20px;margin:0;letter-spacing:.02em}
+ .ov-head p{font-size:13px;margin:0;color:#9aa3c2;max-width:520px}
+ .ov-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:14px}
+ .ov-card{position:relative;border-radius:12px;overflow:hidden;cursor:pointer;background:var(--c-bg);box-shadow:0 6px 24px rgba(0,0,0,.25);transition:transform .12s ease,box-shadow .12s ease;border:1px solid rgba(255,255,255,.06);min-height:380px;display:flex;flex-direction:column}
+ .ov-card:hover{transform:translateY(-3px);box-shadow:0 14px 36px rgba(0,0,0,.45);border-color:rgba(250,204,21,.4)}
+ .ov-meta{position:absolute;top:8px;left:8px;right:8px;display:flex;justify-content:space-between;align-items:center;z-index:3;pointer-events:none}
+ .ov-meta .num{background:rgba(0,0,0,.65);color:#facc15;font-weight:800;font-size:11px;padding:3px 8px;border-radius:6px;letter-spacing:.06em}
+ .ov-meta .cat{background:rgba(0,0,0,.65);color:#fff;font-weight:700;font-size:10px;padding:3px 8px;border-radius:6px;letter-spacing:.06em;text-transform:uppercase}
+ .ov-meta .cat.may{background:#dc2626}
+ .ov-meta .cat.tate{background:#0ea5e9}
+ .ov-meta .cat.granters{background:#1d4ed8}
+ .ov-meta .cat.users{background:#0f766e}
+ .ov-meta .cat.both{background:#7c3aed}
+ .ov-mini{flex:1;background:var(--c-surface);color:var(--c-text);font-family:var(--c-b);display:flex;flex-direction:column}
+ .ov-nav{background:var(--c-bg);color:var(--c-surface);padding:10px 14px;display:flex;justify-content:space-between;align-items:center;font-family:var(--c-h);font-weight:800;font-size:12px}
+ .ov-nav .donate{background:var(--c-accent);color:#fff;font-size:10px;padding:4px 10px;border-radius:6px}
+ .ov-hero{padding:18px;background:var(--c-surface);flex:1}
+ .ov-h1{font-family:var(--c-h);font-size:22px;line-height:1.1;margin:0 0 8px;color:var(--c-text);letter-spacing:-.01em;font-weight:700}
+ .ov-sub{font-size:12px;line-height:1.4;color:var(--c-muted);margin:0 0 12px}
+ .ov-ctas{display:flex;gap:6px;flex-wrap:wrap}
+ .ov-cta{font-size:11px;padding:6px 10px;border-radius:6px;font-weight:700}
+ .ov-cta.p{background:var(--c-primary);color:#fff}
+ .ov-cta.s{background:transparent;border:1.5px solid var(--c-primary);color:var(--c-primary)}
+ .ov-stats{display:grid;grid-template-columns:1fr 1fr 1fr 1fr;gap:6px;padding:10px 14px;background:var(--c-bg);color:var(--c-surface)}
+ .ov-stat{font-family:var(--c-h);font-size:14px;font-weight:700;text-align:center}
+ .ov-stat span{display:block;font-size:8px;opacity:.7;font-weight:400;margin-top:2px;letter-spacing:.04em;text-transform:uppercase}
+ .ov-foot{background:#0a0f24;color:#cbd5e1;font-size:9px;padding:6px 14px;text-align:center;letter-spacing:.04em}
+ .ov-name{position:absolute;bottom:8px;left:8px;right:8px;background:rgba(0,0,0,.78);color:#fff;font-size:11px;font-weight:700;padding:6px 10px;border-radius:6px;display:flex;justify-content:space-between;align-items:center;z-index:3;pointer-events:none}
+ .ov-name .score{color:#facc15;font-size:10px}
+</style>
+</head>
+<body>
+<div class="app">
+ <header class="bar">
+ <h1>SDCC <b>Redesign</b> Showcase <span style="opacity:.6;font-weight:400;text-transform:none;font-size:11px">— pick a theme · audience · page</span></h1>
+ <div class="controls">
+ <div class="ctl"><label for="themeSel">Theme</label><select id="themeSel"></select></div>
+ <div class="ctl"><label for="audSel">Target audience</label>
+ <select id="audSel">
+ <option value="granters">Foundation grantmakers</option>
+ <option value="users">Borrowers age 45+</option>
+ <option value="both">Both</option>
+ </select></div>
+ <div class="ctl"><label for="pageSel">Page</label>
+ <select id="pageSel">
+ <option value="home">Home</option>
+ <option value="stories">Stories</option>
+ <option value="resources">Resources (2026 updated)</option>
+ <option value="news">News</option>
+ <option value="calculators">Calculators</option>
+ <option value="pslfJson">PSLF JSON Inspector</option>
+ <option value="cypres">Cy Pres Award</option>
+ <option value="bookacall">Book a Call</option>
+ </select></div>
+ </div>
+ <div style="display:flex;gap:8px">
+ <button class="pill-btn ghost" id="allBtn">📑 View all 46</button>
+ <button class="pill-btn" id="revBtn">💰 Revenue Streams</button>
+ </div>
+ </header>
+ <main class="split" id="splitView">
+ <section class="pane preview" id="previewPane"><div class="mock" id="mockRoot"></div></section>
+ <aside class="pane critique" id="critPane"><div class="crit" id="critRoot"></div></aside>
+ </main>
+ <main class="overview" id="overviewView" style="display:none">
+ <div class="ov-head">
+ <div>
+ <h2>All 46 themes — at a glance</h2>
+ <p>Click any tile to open it full-size with the audience-aware critique panel. URL updates to <code style="background:#1a1f33;padding:2px 6px;border-radius:4px">#t-N</code> so you can deep-link any theme.</p>
+ </div>
+ <div style="color:#9aa3c2;font-size:12px;text-align:right">
+ 46 themes · 4 audience views · 8 pages · 1 critique engine
+ </div>
+ </div>
+ <div class="ov-grid" id="ovGrid"></div>
+ </main>
+</div>
+
+<dialog id="revModal">
+ <div class="rev-h"><h2>Revenue streams — why some nonprofits get the money</h2><button id="revClose">Close ✕</button></div>
+ <div class="rev-body"><div class="rev-grid" id="revGrid"></div></div>
+</dialog>
+
+<script>
+/* ===========================================================
+ THEMES — 46 total
+ =========================================================== */
+const THEMES = [
+ // 1-20: unique full rebrands targeting granters / users / both
+ {id:1,name:"Senate Beltway Polished",cat:"granters",bg:"#0b1733",surface:"#fbfaf6",text:"#0a0f24",muted:"#4d5572",primary:"#1d3a78",accent:"#a32638",h:"'Source Serif 4',serif",b:"'Inter',sans-serif",hero:"Building durable policy wins for student-loan borrowers",sub:"Ten years of evidence-anchored advocacy alongside borrowers, lawmakers, and partner organizations.",cta:"Schedule a briefing",cta2:"Read 2026 outcomes report",badge:"Granter polish"},
+ {id:2,name:"Borrower Diary",cat:"users",bg:"#fdf6ec",surface:"#fff8ee",text:"#2b1d12",muted:"#6b5743",primary:"#b65331",accent:"#0e6b4a",h:"'Lora',serif",b:"'Crimson Pro',serif",hero:"You are not alone with this loan.",sub:"82,475 borrowers have shared their student-debt story with us. Read theirs. Share yours. We will fight beside you.",cta:"Share your story",cta2:"Read other stories",badge:"Borrower warmth"},
+ {id:3,name:"Civic Brutalist",cat:"granters",bg:"#000",surface:"#fff",text:"#000",muted:"#444",primary:"#000",accent:"#bef264",h:"'Archivo Black',sans-serif",b:"'Public Sans',sans-serif",hero:"END THE STUDENT DEBT CRISIS.",sub:"45 million Americans. $1.7 trillion in debt. We organize, lobby, litigate.",cta:"Fund the fight",cta2:"Download theory of change",badge:"Brutalist authority"},
+ {id:4,name:"Helpline Hopeful",cat:"users",bg:"#eef7f3",surface:"#ffffff",text:"#0d2a1f",muted:"#52685c",primary:"#0e8a5f",accent:"#f0784f",h:"'Inter',sans-serif",b:"'Inter',sans-serif",hero:"A friendly hand with your student loans.",sub:"Plain-language guides, free workshops, and a real person to call. No upsells, no servicer drama.",cta:"Call us: (646) 820-8037",cta2:"Browse free guides",badge:"Helpline tone"},
+ {id:5,name:"Data-Forward Foundation",cat:"granters",bg:"#0a1f3d",surface:"#f7f8fb",text:"#0a1f3d",muted:"#475569",primary:"#1d4ed8",accent:"#84cc16",h:"'Space Grotesk',sans-serif",b:"'Inter',sans-serif",hero:"Evidence-based advocacy for 45M federal student-loan borrowers.",sub:"Real-time dashboards, peer-reviewed briefs, and outcomes you can audit.",cta:"Open data portal",cta2:"Read methodology",badge:"Quant credibility"},
+ {id:6,name:"Kitchen-Table Conversation",cat:"users",bg:"#f9f3e7",surface:"#fffdf6",text:"#3a2c18",muted:"#7c6b53",primary:"#a04b1f",accent:"#3b6a4a",h:"'Crimson Pro',serif",b:"'Lora',serif",hero:"Let's talk about that letter you got.",sub:"Walk through default, garnishment, IDR, and PSLF in plain English. Sit down with us.",cta:"Start with your situation",cta2:"Watch a 4-min explainer",badge:"Plain-spoken"},
+ {id:7,name:"NPR Editorial",cat:"both",bg:"#1a1c1f",surface:"#f5f1ea",text:"#1a1c1f",muted:"#5b5d63",primary:"#b04a2f",accent:"#3b5b87",h:"'Spectral',serif",b:"'Source Serif 4',serif",hero:"The student-loan story America keeps avoiding.",sub:"Reporting, policy analysis, and lived experience from the borrowers behind the numbers.",cta:"Subscribe to the brief",cta2:"Latest investigations",badge:"Editorial trust"},
+ {id:8,name:"Vermont General Store",cat:"users",bg:"#3c2614",surface:"#fdf3df",text:"#2a1a09",muted:"#6b5236",primary:"#9c2c1d",accent:"#274a2c",h:"'Lora',serif",b:"'Lora',serif",hero:"Honest help with your student loans.",sub:"Old-fashioned plain-talk help. We stock the answers other folks don't bother with.",cta:"Find what you need",cta2:"Talk to a real person",badge:"Wholesome trust"},
+ {id:9,name:"Modern Movement",cat:"granters",bg:"#0d3b3b",surface:"#fbf8f1",text:"#0d3b3b",muted:"#5a6e6a",primary:"#caa44a",accent:"#dc6c4f",h:"'Playfair Display',serif",b:"'Inter',sans-serif",hero:"A movement for 45 million.",sub:"Grassroots scale, professional discipline, measurable change at every level of government.",cta:"Partner with SDCC",cta2:"Download case study",badge:"Movement gravitas"},
+ {id:10,name:"Aged Archive",cat:"granters",bg:"#36251a",surface:"#f3e8d3",text:"#241608",muted:"#6c5840",primary:"#7a1f1c",accent:"#3d4d2e",h:"'Playfair Display',serif",b:"'Spectral',serif",hero:"Ten years of borrower advocacy.",sub:"From Occupy-era organizing to federal policy victories. The longest continuously-active borrower org in America.",cta:"Browse the archive",cta2:"Read founding story",badge:"Heritage signal"},
+ {id:11,name:"Bright Activist",cat:"both",bg:"#facc15",surface:"#0a0a0a",text:"#fef9c3",muted:"#fde68a",primary:"#fb7185",accent:"#22d3ee",h:"'Anton',sans-serif",b:"'Public Sans',sans-serif",hero:"DEBT IS A POLICY CHOICE.",sub:"And so is canceling it. Join 2 million Americans demanding the choice change.",cta:"Sign the petition",cta2:"Find an action near you",badge:"High-energy"},
+ {id:12,name:"Quiet Authority",cat:"granters",bg:"#1f2937",surface:"#f4f4f0",text:"#1f2937",muted:"#475569",primary:"#0f766e",accent:"#b45309",h:"'Source Serif 4',serif",b:"'Inter',sans-serif",hero:"Trusted counsel on the student-loan crisis since 2012.",sub:"Cited by NYT, WSJ, NPR, and three presidential administrations. We don't shout. We deliver.",cta:"Request consultation",cta2:"Press kit",badge:"Quiet credibility"},
+ {id:13,name:"Hometown Newspaper",cat:"users",bg:"#241a0e",surface:"#fbf6e8",text:"#1a120a",muted:"#6c5b3a",primary:"#9b1c1c",accent:"#1f3a5f",h:"'Playfair Display',serif",b:"'Crimson Pro',serif",hero:"Your hometown voice for borrower rights.",sub:"Tonight's headline: SAVE blocked. Default collections restarted. Here's what it means for you.",cta:"Read today's brief",cta2:"Sign up for daily digest",badge:"Newsroom feel"},
+ {id:14,name:"Public Library",cat:"users",bg:"#3b2a1a",surface:"#f5efe1",text:"#26190d",muted:"#695540",primary:"#3a5b78",accent:"#a04b1f",h:"'Source Serif 4',serif",b:"'Lora',serif",hero:"A free public resource on student loans.",sub:"Like the library: open to everyone, run for the public good, no late fees, no upsells.",cta:"Browse the catalog",cta2:"Ask a librarian",badge:"Civic warmth"},
+ {id:15,name:"Capitol Hill Op-Ed",cat:"granters",bg:"#fff",surface:"#fff",text:"#0c1428",muted:"#3f4a66",primary:"#0c2960",accent:"#9c1f2e",h:"'Source Serif 4',serif",b:"'Source Serif 4',serif",hero:"The case for borrower-centered student-loan reform.",sub:"A standing brief for foundations, congressional staff, and reporters covering the $1.7T crisis.",cta:"Read the brief",cta2:"Subscribe to the digest",badge:"Op-ed authority"},
+ {id:16,name:"Late-Night Inbox",cat:"users",bg:"#0e1424",surface:"#fdf6e3",text:"#0e1424",muted:"#5a6788",primary:"#d97706",accent:"#fcd34d",h:"'Lora',serif",b:"'Source Serif 4',serif",hero:"It's 11pm and you can't sleep over your loans.",sub:"We get it. Here's a 7-minute walkthrough of what to do tomorrow morning.",cta:"Start the walkthrough",cta2:"Email me the steps",badge:"Empathy first"},
+ {id:17,name:"PBS Documentary",cat:"both",bg:"#0a0a0a",surface:"#f3eedb",text:"#0a0a0a",muted:"#4a4233",primary:"#b8860b",accent:"#7a1f1c",h:"'Spectral',serif",b:"'Spectral',serif",hero:"A national reckoning with the student-debt crisis.",sub:"A multi-part series on how 45 million Americans got here — and what comes next.",cta:"Watch the series",cta2:"Educator resources",badge:"Documentary tone"},
+ {id:18,name:"Grandkids' Future",cat:"users",bg:"#fdf2f8",surface:"#fff",text:"#3a1a36",muted:"#7c4a73",primary:"#831843",accent:"#0d6e6e",h:"'Lora',serif",b:"'Lora',serif",hero:"Don't let student debt steal your retirement.",sub:"For the 9 million Americans 50+ still carrying student loans. We help you protect what you've built.",cta:"Protect your benefits",cta2:"Free retirement-impact check",badge:"50+ targeted"},
+ {id:19,name:"Treasury Department",cat:"granters",bg:"#f5f3ed",surface:"#fff",text:"#1c1f2b",muted:"#4a5060",primary:"#1d3a78",accent:"#8a6b2a",h:"'Source Serif 4',serif",b:"'Source Serif 4',serif",hero:"A 501(c)(3) advocate for the federal student-loan portfolio.",sub:"Working with Treasury's new servicing portfolio, ED, CFPB, and state AGs to protect 45M borrowers.",cta:"Annual report 2025",cta2:"990 transparency",badge:"Federal-fluent"},
+ {id:20,name:"Coffee Shop Town Hall",cat:"both",bg:"#3b2a1a",surface:"#faf3e6",text:"#27190b",muted:"#6c563b",primary:"#c2410c",accent:"#1d4ed8",h:"'Inter',sans-serif",b:"'Crimson Pro',serif",hero:"Pull up a chair. Let's end this together.",sub:"Town halls in 38 states. 2 million supporters. One simple ask: end the student-debt crisis.",cta:"Find a town hall",cta2:"Host one in your city",badge:"Community"},
+ // 21-30: light tweaks of current SDC palette
+ {id:21,name:"Current SDC + Higher Contrast",cat:"users",bg:"#ffffff",surface:"#ffffff",text:"#000000",muted:"#3f3f46",primary:"#0a3da6",accent:"#c5111c",h:"'Inter',sans-serif",b:"'Inter',sans-serif",hero:"End the student debt crisis.",sub:"A people-powered movement of 2 million supporters.",cta:"Take action",cta2:"Donate $12",badge:"WCAG-tightened"},
+ {id:22,name:"Current SDC + 20px base font",cat:"users",bg:"#ffffff",surface:"#ffffff",text:"#0a0f24",muted:"#3f3f46",primary:"#1d4ed8",accent:"#dc2626",h:"'Inter',sans-serif",b:"'Inter',sans-serif",hero:"End the student debt crisis.",sub:"A movement of 2 million supporters fighting for borrower relief.",cta:"Take action",cta2:"Read stories",badge:"Larger type"},
+ {id:23,name:"Current SDC + Sticky Phone CTA",cat:"users",bg:"#ffffff",surface:"#fafafa",text:"#0a0f24",muted:"#475569",primary:"#1d4ed8",accent:"#dc2626",h:"'Inter',sans-serif",b:"'Inter',sans-serif",hero:"Talk to a borrower advocate today.",sub:"(646) 820-8037 — Mon-Fri 9-5 PT. Or schedule a free call below.",cta:"Call (646) 820-8037",cta2:"Book a free call",badge:"Phone-first"},
+ {id:24,name:"Current SDC + Stats Above Fold",cat:"granters",bg:"#ffffff",surface:"#ffffff",text:"#0a0f24",muted:"#475569",primary:"#1d4ed8",accent:"#dc2626",h:"'Inter',sans-serif",b:"'Inter',sans-serif",hero:"4.7M signatures. 800K letters. 82K stories. 10 years.",sub:"Borrower-centered advocacy, every metric public.",cta:"View 2025 outcomes",cta2:"Open dashboard",badge:"Numbers-forward"},
+ {id:25,name:"Current SDC + Photo-Dominant",cat:"both",bg:"#ffffff",surface:"#ffffff",text:"#0a0f24",muted:"#475569",primary:"#1d4ed8",accent:"#dc2626",h:"'Inter',sans-serif",b:"'Inter',sans-serif",hero:"Robyn. Florida. Mom. Borrower.",sub:'"Canceling these loans would not only change our lives, but our families."',cta:"Read Robyn's story",cta2:"Share yours",badge:"Portrait hero"},
+ {id:26,name:"Current SDC + Funder Logos",cat:"granters",bg:"#ffffff",surface:"#ffffff",text:"#0a0f24",muted:"#475569",primary:"#1d4ed8",accent:"#dc2626",h:"'Inter',sans-serif",b:"'Inter',sans-serif",hero:"Independent. Borrower-led. Foundation-trusted.",sub:"Funded by individual donors and foundations who care about ending the student-debt crisis.",cta:"Become a funder",cta2:"View funder list",badge:"Funders visible"},
+ {id:27,name:"Current SDC + Plain-Language Toggle",cat:"users",bg:"#ffffff",surface:"#ffffff",text:"#0a0f24",muted:"#475569",primary:"#1d4ed8",accent:"#dc2626",h:"'Inter',sans-serif",b:"'Inter',sans-serif",hero:"Plain English on student loans.",sub:"All our guides are written at a 7th-grade reading level — the level Americans actually read at.",cta:"Browse plain-English guides",cta2:"Switch to legal language",badge:"Reading level"},
+ {id:28,name:"Current SDC + Spanish toggle",cat:"users",bg:"#ffffff",surface:"#ffffff",text:"#0a0f24",muted:"#475569",primary:"#1d4ed8",accent:"#dc2626",h:"'Inter',sans-serif",b:"'Inter',sans-serif",hero:"Recursos sobre préstamos estudiantiles, en tu idioma.",sub:"English / Español. Free guides, hotline, and live workshops in both languages.",cta:"Empezar aquí",cta2:"Start here",badge:"Bilingual"},
+ {id:29,name:"Current SDC + Single-Action Hero",cat:"users",bg:"#ffffff",surface:"#ffffff",text:"#0a0f24",muted:"#475569",primary:"#1d4ed8",accent:"#dc2626",h:"'Inter',sans-serif",b:"'Inter',sans-serif",hero:"What's your loan situation right now?",sub:"Pick the one that matches you. We'll send the next-step playbook.",cta:"I'm in default",cta2:"I'm in PSLF",badge:"One-action hero"},
+ {id:30,name:"Current SDC + 990 Transparency Strip",cat:"granters",bg:"#ffffff",surface:"#ffffff",text:"#0a0f24",muted:"#475569",primary:"#1d4ed8",accent:"#dc2626",h:"'Inter',sans-serif",b:"'Inter',sans-serif",hero:"End the student debt crisis.",sub:"Candid Platinum • GuideStar verified • Form 990 published annually • Independent board",cta:"Read our 990",cta2:"Annual report",badge:"Trust badges"},
+ // 31-45: MAY 1 DAY total overhauls — workers' day, debt as labor issue
+ {id:31,name:"May Day Picket",cat:"both",day:"may",bg:"#a30000",surface:"#fbf6ec",text:"#1a0606",muted:"#5a3a3a",primary:"#000000",accent:"#fbbf24",h:"'Bebas Neue',sans-serif",b:"'Public Sans',sans-serif",hero:"DEBT IS A LABOR ISSUE.",sub:"On May 1 — International Workers' Day — we say: the same workers who teach, nurse, and serve our communities should not be drowning in student debt.",cta:"Join May Day rally",cta2:"Sign the worker debt pledge",badge:"May Day"},
+ {id:32,name:"General Strike Banner",cat:"both",day:"may",bg:"#7f0d0d",surface:"#f5e9d3",text:"#1a0606",muted:"#5a3a3a",primary:"#7f0d0d",accent:"#0a0a0a",h:"'Anton',sans-serif",b:"'Spectral',serif",hero:"GENERAL STRIKE FOR DEBT RELIEF.",sub:"Educators, healthcare workers, public servants — your labor built this country. Your loans should not break it.",cta:"Pledge to strike",cta2:"Find your local",badge:"Strike energy"},
+ {id:33,name:"Vintage Union Hall",cat:"both",day:"may",bg:"#5b1a14",surface:"#f3e8d2",text:"#2b110b",muted:"#6c4d34",primary:"#5b1a14",accent:"#caa44a",h:"'Playfair Display',serif",b:"'Crimson Pro',serif",hero:"Solidarity from 1886 to 2026.",sub:"From the eight-hour workday to ending the student-debt crisis — workers' demands always sounded impossible. Until they didn't.",cta:"Read the labor brief",cta2:"Join the local",badge:"Heritage labor"},
+ {id:34,name:"Carnation Red",cat:"both",day:"may",bg:"#fbe7ec",surface:"#fff",text:"#3a0a14",muted:"#7a3848",primary:"#c2002f",accent:"#0a0a0a",h:"'Lora',serif",b:"'Inter',sans-serif",hero:"Wear a red carnation on May 1.",sub:"For every student-loan borrower who works two jobs to pay back loans they took on a promise that's been broken.",cta:"Order a carnation pin",cta2:"Share the campaign",badge:"May Day flower"},
+ {id:35,name:"Solidarity Forever",cat:"both",day:"may",bg:"#c2002f",surface:"#0a0a0a",text:"#f5f5f5",muted:"#a3a3a3",primary:"#fbbf24",accent:"#f5f5f5",h:"'Bebas Neue',sans-serif",b:"'Public Sans',sans-serif",hero:"SOLIDARITY FOREVER.",sub:"Borrowers and labor — one fight. Cancel the debt. Tax the lenders. Protect public service.",cta:"Sign the pledge",cta2:"Print the poster",badge:"Solidarity"},
+ {id:36,name:"Rosie Riveter",cat:"both",day:"may",bg:"#1d3a78",surface:"#f5e9d3",text:"#0a1a3d",muted:"#4a5b7a",primary:"#c2002f",accent:"#fbbf24",h:"'Anton',sans-serif",b:"'Public Sans',sans-serif",hero:"WE CAN END IT.",sub:"Women hold 63.6% of all student debt. Black women carry $20K more than white men. We can end it — together.",cta:"Join the campaign",cta2:"Read the data",badge:"Worker-icon"},
+ {id:37,name:"Picket Sign Pop",cat:"both",day:"may",bg:"#fbbf24",surface:"#0a0a0a",text:"#fef9c3",muted:"#fde68a",primary:"#c2002f",accent:"#fff",h:"'Rubik Mono One',sans-serif",b:"'Public Sans',sans-serif",hero:"CANCEL THE DEBT. PAY THE WORKERS.",sub:"May 1, 2026 — Day of Action for Borrower Workers. 38 cities. 2 million supporters.",cta:"Find a rally near you",cta2:"Print a sign",badge:"Picket pop"},
+ {id:38,name:"Worker's Co-op",cat:"both",day:"may",bg:"#1f3d2b",surface:"#f0ebd8",text:"#0e1f15",muted:"#4f6a59",primary:"#1f3d2b",accent:"#c2002f",h:"'Lora',serif",b:"'Lora',serif",hero:"A cooperative future, free of debt.",sub:"What if higher education served workers and not lenders? On May 1, we imagine — and organize — that future.",cta:"Join the co-op",cta2:"Read the manifesto",badge:"Co-op tone"},
+ {id:39,name:"Print Shop Activist",cat:"both",day:"may",bg:"#0a0a0a",surface:"#f3e9d3",text:"#0a0a0a",muted:"#5a4a30",primary:"#a30000",accent:"#0a0a0a",h:"'Anton',sans-serif",b:"'Crimson Pro',serif",hero:"PRESSED. PRINTED. POSTED.",sub:"Free downloadable May Day posters in every major US city. Hang them. Tear them down. Hang them again.",cta:"Download the print pack",cta2:"Submit your design",badge:"DIY print"},
+ {id:40,name:"Wobbly Heritage",cat:"both",day:"may",bg:"#0a0a0a",surface:"#f5ead0",text:"#0a0a0a",muted:"#5a4a30",primary:"#a30000",accent:"#caa44a",h:"'Playfair Display',serif",b:"'Spectral',serif",hero:"An injury to one is an injury to all.",sub:"From the IWW (1905) to the borrower movement (2026) — the same fight, in new clothes.",cta:"Join the IWW × SDCC action",cta2:"Read the history",badge:"IWW homage"},
+ {id:41,name:"Mayday Demonstration",cat:"both",day:"may",bg:"#c2185b",surface:"#fff",text:"#3a0a1f",muted:"#7c2a4a",primary:"#c2185b",accent:"#0a0a0a",h:"'Anton',sans-serif",b:"'Public Sans',sans-serif",hero:"MAYDAY. MAYDAY. MAYDAY.",sub:"For 9 million Americans 50+ still paying student loans into their retirement, this is an emergency.",cta:"Call your senator now",cta2:"Find a rally",badge:"Distress signal"},
+ {id:42,name:"Worker's Memorial",cat:"both",day:"may",bg:"#1f2937",surface:"#f1ead2",text:"#0e141c",muted:"#4a5263",primary:"#a04b1f",accent:"#caa44a",h:"'Cardo',serif",b:"'Spectral',serif",hero:"For the borrowers we have lost.",sub:"452,000 borrowers age 62+ face Social Security garnishment. We honor those crushed by the system. We organize so the next million aren't.",cta:"Light a candle",cta2:"Submit a name",badge:"Memorial"},
+ {id:43,name:"Eight-Hour Day",cat:"both",day:"may",bg:"#fdf6ec",surface:"#fff",text:"#0a0f24",muted:"#475569",primary:"#1d4ed8",accent:"#c2002f",h:"'Public Sans',sans-serif",b:"'Public Sans',sans-serif",hero:"Eight hours of work. Eight hours of rest. Eight hours of freedom from debt.",sub:"The same logic that won the eight-hour workday in 1886 wins debt relief in 2026.",cta:"Read the playbook",cta2:"Sign the petition",badge:"Reform parallel"},
+ {id:44,name:"Labor & Loans",cat:"both",day:"may",bg:"#7c2d12",surface:"#fdf6ec",text:"#3a1a08",muted:"#7c5836",primary:"#c2410c",accent:"#1d4ed8",h:"'Crimson Pro',serif",b:"'Lora',serif",hero:"Your wages. Their debt.",sub:"Wage garnishment for student loans is the modern company-store. We're shutting it down.",cta:"Stop garnishment now",cta2:"Read the report",badge:"Wage focus"},
+ {id:45,name:"Solidarity Across Generations",cat:"both",day:"may",bg:"#fdf2f8",surface:"#1e1b4b",text:"#fdf2f8",muted:"#a5b4fc",primary:"#fb7185",accent:"#fbbf24",h:"'Anton',sans-serif",b:"'Inter',sans-serif",hero:"GRANDPARENTS. PARENTS. GRADUATES.",sub:"Three generations of student-loan borrowers. One May 1 demand: end this for good.",cta:"Join the rally",cta2:"Share your generation's story",badge:"Intergenerational"},
+ // 46: TATE ESQ ATTORNEY POLISHED
+ {id:46,name:"Tate Esq Attorney Polished",cat:"both",day:"tate",bg:"#0e1424",surface:"#fafaf7",text:"#0e1424",muted:"#52607a",primary:"#1f3a78",accent:"#caa44a",h:"'Source Serif 4',serif",b:"'Inter',sans-serif",hero:"Student loan companies don't help. We do.",sub:"Borrower-centered guidance from a nonprofit team that's been at this for ten years. No upsells. No servicer scripts. Just honest help.",cta:"Book a free call",cta2:"Browse our calculators",badge:"Attorney-polished"}
+];
+
+const PEER = {
+ sdcRevenue:"$321K (smallest in 20-org cohort)",
+ topPeers:[
+ ["Education Trust","$33.2M","Gates, Walton, Lumina, Strada, Kresge"],
+ ["Roosevelt Institute","$22.8M","Foundation-funded research"],
+ ["NCLC","$21.6M","Active Cy Pres program"],
+ ["TICAS","~$8M","Lumina, Gates, Joyce"],
+ ["Young Invincibles","~$5M","Health + ed coverage funders"]
+ ]
+};
+
+/* ===========================================================
+ PAGE RENDERERS — each returns inner HTML for the mock
+ =========================================================== */
+const PAGES = {
+ home: t => `
+ ${nav(t)}
+ <div class="hero">
+ <div>
+ <h1 class="hero-h">${esc(t.hero)}</h1>
+ <p class="hero-p">${esc(t.sub)}</p>
+ <div class="ctas">
+ <a class="btn-p" href="#">${esc(t.cta)}</a>
+ <a class="btn-s" href="#">${esc(t.cta2)}</a>
+ </div>
+ </div>
+ <div class="hero-art">${esc(t.badge)} hero image<br><small style="opacity:.85;font-size:12px;font-weight:400">[Replace with portrait of borrower from steve-personal Drive]</small></div>
+ </div>
+ <div class="stats">
+ <div class="stat"><b>4,697,206</b><span>Petition signatures</span></div>
+ <div class="stat"><b>887,507</b><span>Letters to lawmakers</span></div>
+ <div class="stat"><b>82,475</b><span>Stories collected</span></div>
+ <div class="stat"><b>10+ yrs</b><span>Borrower advocacy</span></div>
+ </div>
+ <div class="section">
+ <h2>What we're working on right now (April 2026)</h2>
+ <div class="cards">
+ <div class="card"><h3>SAVE Plan blocked</h3><p>7M+ borrowers in administrative forbearance. We're tracking the litigation and your options.</p><a href="#">Read latest</a></div>
+ <div class="card"><h3>Default collections restarted</h3><p>Treasury offsets resumed May 2025. We help you stop garnishment and restore your loans.</p><a href="#">Get the playbook</a></div>
+ <div class="card"><h3>PSLF backlog</h3><p>93–98% denial rate. We help you appeal and document qualifying payments.</p><a href="#">Appeal a denial</a></div>
+ </div>
+ </div>
+ ${funderStrip(t)}
+ ${footer(t)}`,
+
+ stories: t => `
+ ${nav(t)}
+ <div class="section">
+ <h1 class="hero-h">82,475 borrower stories.</h1>
+ <p class="hero-p">Read theirs. Share yours. Stories move policy.</p>
+ <div class="cards">
+ <div class="card"><h3>Eugenia, 70 — Long Beach, CA</h3><p>"I went back to school at 50. After 13 years of work and 200+ applications post-layoff, I still owe $50,000 three months from turning 70."</p><a href="#">Read full story</a></div>
+ <div class="card"><h3>john scalera, 69 — Galloway, NJ</h3><p>"I've been paying my Parent PLUS for 20 years. Started at $80K. I still owe $79K. I cannot retire."</p><a href="#">Read full story</a></div>
+ <div class="card"><h3>Megan S., 42 — Logan, UT</h3><p>"Borrowed $215,714 in graduate loans. Now I owe $456,178. SAVE was the only thing keeping it manageable."</p><a href="#">Read full story</a></div>
+ <div class="card"><h3>Ileasia Handy, 60 — Springfield, IL</h3><p>"First in my family to go to college. The same tool I use to help others is now hindering me."</p><a href="#">Read full story</a></div>
+ </div>
+ <div class="ctas" style="margin-top:22px"><a class="btn-p" href="#">Share your story</a><a class="btn-s" href="#">Browse all 82,475</a></div>
+ </div>
+ ${footer(t)}`,
+
+ resources: t => `
+ ${nav(t)}
+ <div class="section">
+ <h1 class="hero-h">Free borrower resources — refreshed April 2026</h1>
+ <p class="hero-p">Every guide updated for the SAVE block, the Treasury servicing transition, and the default-collections restart. <b>Last reviewed: ${new Date().toLocaleDateString('en-US',{month:'long',day:'numeric',year:'numeric'})}.</b></p>
+ <div class="cards">
+ <div class="card"><h3>SAVE Plan — what now? <span style="font-size:10px;background:#fef3c7;padding:2px 6px;border-radius:4px">Updated 04/2026</span></h3><p>The 8th Circuit ruling, your options for IDR re-enrollment, and how to avoid forbearance interest capitalization.</p><a href="#">Open guide (PDF)</a></div>
+ <div class="card"><h3>Default collections restarted <span style="font-size:10px;background:#fef3c7;padding:2px 6px;border-radius:4px">Updated 04/2026</span></h3><p>Treasury offsets, wage garnishment, the Fresh Start window — and how to use loan rehabilitation in 2026.</p><a href="#">Open guide (PDF)</a></div>
+ <div class="card"><h3>Parent PLUS <span style="font-size:10px;background:#fef3c7;padding:2px 6px;border-radius:4px">Updated 04/2026</span></h3><p>Double-consolidation loophole, ICR-only access, joint-consolidation fix for divorced borrowers.</p><a href="#">Open guide (PDF)</a></div>
+ <div class="card"><h3>PSLF after the backlog <span style="font-size:10px;background:#fef3c7;padding:2px 6px;border-radius:4px">Updated 04/2026</span></h3><p>How to count qualifying payments, appeal denials, and use the buy-back program.</p><a href="#">Open guide (PDF)</a></div>
+ <div class="card"><h3>Repayment system after July 1, 2026 <span style="font-size:10px;background:#fef3c7;padding:2px 6px;border-radius:4px">New 04/2026</span></h3><p>The new statutory IDR plan, the 25-year cap, and what your old plan converts to.</p><a href="#">Open guide (PDF)</a></div>
+ <div class="card"><h3>Income-Driven Repayment <span style="font-size:10px;background:#fef3c7;padding:2px 6px;border-radius:4px">Updated 04/2026</span></h3><p>IBR vs PAYE vs ICR vs the new plan. Which one is still open to you in 2026.</p><a href="#">Open guide (PDF)</a></div>
+ </div>
+ </div>
+ ${footer(t)}`,
+
+ news: t => `
+ ${nav(t)}
+ <div class="section">
+ <h1 class="hero-h">Latest news</h1>
+ <div class="cards">
+ <div class="card"><h3>April 22, 2026 — Little Hoover Commission hearing</h3><p>Historic hearing on California institutional debt locking students out of higher education.</p><a href="#">Read</a></div>
+ <div class="card"><h3>April 14, 2026 — 5th Annual State of Student Debt Summit</h3><p>Borrowers, advocates, and experts on the year ahead in federal student loans.</p><a href="#">Read</a></div>
+ <div class="card"><h3>April 9, 2026 — Treasury servicing transition</h3><p>What the move from FSA to Treasury means for the 45M federal borrowers.</p><a href="#">Read</a></div>
+ </div>
+ </div>
+ ${footer(t)}`,
+
+ calculators: t => `
+ ${nav(t)}
+ <div class="section">
+ <h1 class="hero-h">SDCC Calculators — free, borrower-first</h1>
+ <p class="hero-p">Eight free tools, no email gate. Built nonprofit, for borrowers, in plain language.</p>
+ <div class="cards" style="margin-bottom:24px">
+ ${["TXT loan-listing tool","PSLF Calculator","Parent PLUS Calculator","SAVE Plan Calculator","ICR Plan Calculator","IBR Plan Calculator","PAYE Plan Calculator","Partial Financial Hardship Calculator"].map((n,i)=>`<div class="num-card"><div class="n">0${i+1}</div><h3>${n}</h3><p style="font-size:13px;color:var(--t-muted);margin:6px 0 10px">${calcDesc(n)}</p><a href="#" style="color:var(--t-primary);font-size:13px;font-weight:700;text-decoration:none">Open →</a></div>`).join("")}
+ </div>
+ <div class="num-card" style="margin-top:24px">
+ <div class="n">PSLF DEMO</div>
+ <h3>PSLF Calculator (live)</h3>
+ <div class="calc">
+ <div><label>Loan balance ($)</label><input id="cBal" type="number" value="120000" /></div>
+ <div><label>Avg interest rate (%)</label><input id="cInt" type="number" step="0.01" value="6.8" /></div>
+ <div><label>Annual income ($)</label><input id="cInc" type="number" value="62000" /></div>
+ <div><label>Family size</label><input id="cFam" type="number" value="2" /></div>
+ <div><label>Tax filing status</label><select id="cTax"><option>Single</option><option>Married Filing Jointly</option><option>Married Filing Separately</option><option>Head of Household</option></select></div>
+ <div><label>State of residence</label><select id="cState"><option>Lower 48</option><option>Alaska</option><option>Hawaii</option></select></div>
+ <div><label>Avg annual income growth (%)</label><input id="cGrow" type="number" step="0.1" value="3" /></div>
+ <div><label>Years in public service so far</label><input id="cYrs" type="number" value="3" /></div>
+ <div><label>Qualifying payments so far</label><input id="cPay" type="number" value="36" /></div>
+ <div><label>Current monthly payment ($)</label><input id="cMon" type="number" value="320" /></div>
+ </div>
+ <div class="calc-row">
+ <button class="btn-p" id="cRun" style="background:var(--t-primary);color:#fff;padding:10px 16px;border-radius:8px;border:0;cursor:pointer;font-weight:700">Calculate</button>
+ </div>
+ <div class="calc-out" id="cOut" style="margin-top:14px"><b>—</b>Enter your numbers and click Calculate.</div>
+ </div>
+ </div>
+ ${footer(t)}`,
+
+ pslfJson: t => `
+ ${nav(t)}
+ <div class="section">
+ <h1 class="hero-h">PSLF Calculator — JSON schema</h1>
+ <p class="hero-p">The structured input/output our PSLF Calculator reads. Same shape as the field-tested model used by tateesq.com/calculator/pslf — public, documented, replicable.</p>
+ <h3 style="font-family:var(--t-h);margin-top:18px">Inputs</h3>
+ <pre class="json">${esc(JSON.stringify(PSLF_SCHEMA.inputs,null,2))}</pre>
+ <h3 style="font-family:var(--t-h);margin-top:18px">Outputs</h3>
+ <pre class="json">${esc(JSON.stringify(PSLF_SCHEMA.outputs,null,2))}</pre>
+ <h3 style="font-family:var(--t-h);margin-top:18px">Sample request → response</h3>
+ <pre class="json">${esc(JSON.stringify(PSLF_SCHEMA.sample,null,2))}</pre>
+ <p class="hero-p" style="margin-top:18px"><b>Why this exists.</b> Borrowers should be able to inspect the math behind any tool that touches their loans. Open inputs, open outputs, no hidden assumptions.</p>
+ </div>
+ ${footer(t)}`,
+
+ cypres: t => `
+ ${nav(t)}
+ <div class="section">
+ <h1 class="hero-h">Cy Pres awards — fund borrower advocacy from class-action settlements</h1>
+ <p class="hero-p">When residual class-action settlement funds cannot be distributed to class members, courts may direct those funds to a 501(c)(3) whose mission aligns with the underlying suit. SDCC is purpose-built to be that recipient for student-loan litigation.</p>
+ <div class="cards">
+ <div class="card"><h3>Why SDCC qualifies</h3><p>10 years of borrower advocacy, 4.7M signatures, 82K stories collected — direct beneficiary alignment with student-loan classes (Navient, Sweet, Borrower Defense).</p></div>
+ <div class="card"><h3>Recent eligible matters</h3><p>Navient settlement residuals, ITT/Corinthian/Westwood Borrower Defense funds, servicer-misconduct settlements at the state AG level.</p></div>
+ <div class="card"><h3>Use of funds</h3><p>100% directed to borrower hotline, free guides, and public-interest litigation support. Annual report published. Independent board.</p></div>
+ <div class="card"><h3>Counsel & process</h3><p>We provide draft order language, IRS determination letter, audited financials, 990, and beneficiary-alignment memo on request within 48 hours.</p></div>
+ </div>
+ <div class="ctas" style="margin-top:22px"><a class="btn-p" href="#">Request the Cy Pres packet</a><a class="btn-s" href="#">Email cypres@studentdebtcrisis.org</a></div>
+ </div>
+ ${footer(t)}`,
+
+ bookacall: t => `
+ ${nav(t)}
+ <div class="hero">
+ <div>
+ <h1 class="hero-h">Student-loan companies don't help. <br>We do.</h1>
+ <p class="hero-p">Book a free 20-minute call with an SDCC borrower advocate. We'll walk through your specific loans, your repayment options in April 2026, and your next three steps. No upsell — we are a 501(c)(3).</p>
+ <div class="ctas">
+ <a class="btn-p" href="#">📅 Book my free call</a>
+ <a class="btn-s" href="#">Or call (646) 820-8037</a>
+ </div>
+ </div>
+ <div class="hero-art" style="background:#0e1424;display:flex;flex-direction:column;justify-content:center;text-align:center;padding:0;overflow:hidden;position:relative">
+ <div style="background:rgba(255,255,255,.08);padding:40px 20px;width:100%">
+ <div style="font-size:42px;line-height:1;margin-bottom:8px">▶</div>
+ <div style="font-family:var(--t-h);font-size:14px;color:#fff">Watch: What SDCC can do for you (2:14)</div>
+ <div style="font-size:11px;color:#a3a3a3;margin-top:6px">[Embed: SDCC explainer video]</div>
+ </div>
+ </div>
+ </div>
+ <div class="section">
+ <h2>What we're good at</h2>
+ <div class="cards">
+ <div class="num-card"><div class="n">01</div><h3>SAVE / IDR triage</h3><p style="font-size:13px;color:var(--t-muted);margin:6px 0 0">Figure out your real options now that SAVE is blocked.</p></div>
+ <div class="num-card"><div class="n">02</div><h3>PSLF appeals</h3><p style="font-size:13px;color:var(--t-muted);margin:6px 0 0">When your qualifying-payment count is wrong — and it usually is.</p></div>
+ <div class="num-card"><div class="n">03</div><h3>Default & garnishment</h3><p style="font-size:13px;color:var(--t-muted);margin:6px 0 0">Fresh Start, rehabilitation, stopping wage and SS offsets.</p></div>
+ <div class="num-card"><div class="n">04</div><h3>Parent PLUS strategy</h3><p style="font-size:13px;color:var(--t-muted);margin:6px 0 0">Double-consolidation, ICR access, divorced-borrower fixes.</p></div>
+ <div class="num-card"><div class="n">05</div><h3>Borrower Defense</h3><p style="font-size:13px;color:var(--t-muted);margin:6px 0 0">For ITT, Corinthian, Westwood, Ashford and other for-profit harm.</p></div>
+ <div class="num-card"><div class="n">06</div><h3>Disability / TPD</h3><p style="font-size:13px;color:var(--t-muted);margin:6px 0 0">Permanent-disability discharge documentation and appeals.</p></div>
+ </div>
+ </div>
+ <div class="section" style="background:rgba(0,0,0,.04)">
+ <h2>What borrowers say</h2>
+ <div class="cards">
+ <div class="card"><h3>Robyn — Florida</h3><p>"They didn't try to sell me anything. They just helped."</p></div>
+ <div class="card"><h3>Eugenia — Long Beach</h3><p>"At 70, finally someone explained Parent PLUS in English."</p></div>
+ <div class="card"><h3>Megan — Logan, UT</h3><p>"They helped me figure out my PSLF count was off by 18 months."</p></div>
+ </div>
+ </div>
+ ${footer(t)}`
+};
+
+const PSLF_SCHEMA = {
+ inputs:{loanBalance:{type:"number",units:"USD",required:true,label:"Loan balance"},avgInterestRate:{type:"number",units:"percent",required:true,label:"Average interest rate"},monthlyPayment:{type:"number",units:"USD",required:true,label:"Current monthly payment"},state:{type:"string",enum:"US state",required:true,label:"State of residence"},taxFilingStatus:{type:"string",enum:["Single","Head of Household","Qualified Widow(er)","Married Filing Jointly","Married Filing Separately"],required:true,label:"Tax filing status"},familySize:{type:"number",units:"count",required:true,label:"Family size"},annualIncome:{type:"number",units:"USD",required:true,label:"Annual income (AGI)"},avgAnnualGrowth:{type:"number",units:"percent",required:true,label:"Average annual income growth"},yearsInPublicService:{type:"number",units:"years",required:true,label:"Years in qualifying public service so far"},qualifyingPayments:{type:"number",units:"count",required:true,label:"Qualifying payments completed"}},
+ outputs:{monthlyPaymentByPlan:{IBR:"USD",PAYE:"USD",ICR:"USD",SAVE_blocked:true,STANDARD:"USD"},totalRepaymentBeforeForgiveness:"USD",totalForgivenessAmount:"USD",remainingPayments:"count",monthsToForgiveness:"count",timelineToForgiveness:"YYYY-MM",disclaimer:"Estimate only — verify against StudentAid.gov"},
+ sample:{request:{loanBalance:120000,avgInterestRate:6.8,monthlyPayment:320,state:"CA",taxFilingStatus:"Single",familySize:2,annualIncome:62000,avgAnnualGrowth:3,yearsInPublicService:3,qualifyingPayments:36},response:{monthlyPaymentByPlan:{IBR:320,PAYE:295,ICR:760,STANDARD:1380},totalRepaymentBeforeForgiveness:38640,totalForgivenessAmount:138420,remainingPayments:84,monthsToForgiveness:84,timelineToForgiveness:"2033-04"}}
+};
+
+/* helpers */
+function nav(t){return `<header class="topnav"><div class="brand">SDCC</div><nav><a href="#">Take Action</a><a href="#">Stories</a><a href="#">Resources</a><a href="#">News</a><a href="#">Calculators</a><a href="#">Book a Call</a><a class="donate" href="#">Donate $12</a></nav></header>`;}
+function footer(t){return `<div class="footer">© 2026 Student Debt Crisis Center · 501(c)(3) · 15442 Ventura Blvd #102, Los Angeles CA 91403 · (646) 820-8037 · info@studentdebtcrisis.org · Candid Platinum · GuideStar verified · Form 990 published annually. Not a law firm or financial counselor; we provide free information about existing federal & state programs.</div>`;}
+function funderStrip(t){return `<div class="funder-strip"><span>Foundation A</span><span>Foundation B</span><span>Foundation C</span><span>Cy Pres awards</span><span>Individual donors</span><span>Workplace giving</span></div>`;}
+function calcDesc(n){const m={"TXT loan-listing tool":"Paste your StudentAid.gov export — get a clean loan inventory.","PSLF Calculator":"Months to forgiveness given your plan, income, family size.","Parent PLUS Calculator":"Double-consolidation savings, ICR-only access projections.","SAVE Plan Calculator":"Your old SAVE payment vs. your new IDR options post-block.","ICR Plan Calculator":"The Parent PLUS borrower's only IDR door — modeled.","IBR Plan Calculator":"Old IBR vs new IBR — eligibility & payment math.","PAYE Plan Calculator":"PAYE eligibility test & 20-year forgiveness path.","Partial Financial Hardship Calculator":"Whether you qualify for IDR partial hardship in 2026."};return m[n]||"";}
+function esc(s){return String(s).replace(/[&<>"']/g,c=>({"&":"&","<":"<",">":">",'"':""","'":"'"})[c])}
+
+/* WCAG contrast */
+function lum(hex){const r=parseInt(hex.slice(1,3),16)/255,g=parseInt(hex.slice(3,5),16)/255,b=parseInt(hex.slice(5,7),16)/255;const f=v=>v<=.03928?v/12.92:Math.pow((v+.055)/1.055,2.4);return .2126*f(r)+.7152*f(g)+.0722*f(b)}
+function contrast(a,b){const L1=lum(a),L2=lum(b);return ((Math.max(L1,L2)+.05)/(Math.min(L1,L2)+.05))}
+
+/* CRITIQUE — per (theme, audience, page) */
+function critique(t,aud,page){
+ const cTextSurface=contrast(t.text,t.surface).toFixed(2);
+ const cPrimaryWhite=contrast(t.primary,'#ffffff').toFixed(2);
+ const cAccentSurface=contrast(t.accent,t.surface).toFixed(2);
+ const tag=t.day==='may'?'<span class="day-chip may">MAY 1</span>':t.day==='tate'?'<span class="day-chip tate">TATE-STYLE</span>':'<span class="day-chip">'+t.cat+'</span>';
+ const score=Math.round((parseFloat(cTextSurface)>=4.5?1:.4)*40 + (parseFloat(cPrimaryWhite)>=3?1:.4)*30 + (t.cat===aud||t.cat==='both'?30:15));
+ const scoreClass=score>=80?'pass':score>=60?'warn':'fail';
+ const pageNote = page==='resources'?'Resource cards stamped "Updated 04/2026" — granters specifically check that resource pages are not stale.':
+ page==='cypres'?'Cy Pres page is the single biggest unclaimed revenue line for student-debt orgs. NCLC has one. SDCC does not.':
+ page==='calculators'?'Free calculators with no email gate are how Tate Esq drives 69 Google reviews. SDCC has the borrower base to do the same.':
+ page==='pslfJson'?'Open JSON schema = signal of evidence-based seriousness to program officers from Arnold Ventures and Lumina.':
+ page==='bookacall'?'A "book a call" page with embedded video and Calendly converts >5x better than a contact form for older audiences.':
+ page==='stories'?'Borrower stories are SDCC\'s best asset — but they\'re trapped in a Wix-ified VocalReferences widget. Move to native rendering.':
+ page==='news'?'News page is SEO gold for breaking-policy queries. Add date-modified microdata for Google freshness signals.':
+ 'Home page is what foundation program officers see in the first 30 seconds. Lead with proof, not pleas.';
+
+ const audPros = aud==='granters'? [
+ t.cat==='granters'||t.cat==='both' ? `Visual register reads "professional 501(c)(3)" — POs from Lumina, Arnold, Ford recognize this language.` : `Even though styled for users, the palette is clean enough not to red-flag a PO.`,
+ `Contrast ${cTextSurface}:1 (text on surface) ${parseFloat(cTextSurface)>=4.5?'meets WCAG AA — required for federally-funded programs':'is below WCAG AA — fix before sending to a foundation site review'}.`,
+ page==='cypres'||page==='resources'||page==='pslfJson'||page==='bookacall' ? 'Page itself signals organizational maturity — most $321K-tier orgs do not have this page at all.' : 'Add Candid Platinum + GuideStar badges in the footer; SDCC qualifies and is not displaying them.'
+ ] : aud==='users'? [
+ t.cat==='users'||t.cat==='both' ? 'Tone matches the borrower emotional state — distrustful of servicers, overwhelmed, time-poor.' : 'Even though styled for granters, the page is still legible and accessible.',
+ `Body type ${parseFloat(cTextSurface)>=7?'easily readable for 45+ eyes':'should be tested with 20px base font for 45+ readability'}.`,
+ page==='bookacall'||page==='calculators'||page==='resources' ? 'Page directly serves a borrower trigger moment — exactly what the 50–61 cohort searches for.' : 'Surface a phone number above the fold — 45+ borrowers prefer phone over chat.'
+ ] : [
+ `Cross-audience score ${score}/100. Theme tagged "${t.cat}".`,
+ `Contrast text/surface ${cTextSurface}:1 · primary on white ${cPrimaryWhite}:1 · accent on surface ${cAccentSurface}:1.`,
+ page==='home' ? 'Hero copy "${esc(t.hero)}" works for both audiences only if backed by visible proof (numbers, funder logos, dated outcomes).' : pageNote
+ ];
+
+ const audCons = aud==='granters'? [
+ t.cat==='users' ? 'May read as too borrower-folksy for a $5M+ foundation gift — POs equate polish with capacity.' : null,
+ parseFloat(cTextSurface)<4.5 ? `WCAG AA fail (${cTextSurface}:1) — federally-funded foundation sites require AA minimum.` : null,
+ page!=='cypres' && page!=='pslfJson' ? 'No published 990, no theory of change link, no evaluation data on this page — POs check for these in the first 30 seconds.' : null,
+ t.day==='may' ? 'May Day branding may signal "advocacy / partisan" to risk-averse donor-advised-fund advisors. Consider a date-fenced rollout (April 25 – May 5 only).' : null
+ ].filter(Boolean): aud==='users'? [
+ t.cat==='granters' ? 'Tone risks reading as "another DC nonprofit that doesn\'t understand my Parent PLUS letter."' : null,
+ parseFloat(cTextSurface)<7 ? `Contrast ${cTextSurface}:1 is OK for sighted 30-year-olds; tighten to 7:1 for the 45+ retina.` : null,
+ page!=='bookacall' && page!=='calculators' && page!=='resources' ? 'No phone number above the fold — 45+ users want to call before they read.' : null,
+ t.day==='may' ? '"May Day" framing is unfamiliar to most US borrowers; pair with plain-language explainer ("We mark International Workers\' Day because…").' : null
+ ].filter(Boolean): [
+ parseFloat(cTextSurface)<4.5 ? `Fails WCAG AA — fix before going live.` : null,
+ t.cat!=='both' ? `Theme is tagged for ${t.cat}; the opposite audience may bounce.` : null,
+ 'Hero CTA hierarchy: two equal-weight buttons compete. Pick a primary.'
+ ].filter(Boolean);
+
+ const audIdeas = aud==='granters'? [
+ `Add a "Funded by" strip with named foundations. Education Trust does this; it correlates with the 19%-of-grantees-getting-32%-of-dollars pattern.`,
+ `Publish a one-page Theory of Change PDF. Bridgespan rates this as a top-5 PO check.`,
+ `Stamp every resource "Reviewed [date]". Stale resources cost grants — fresh ones win them.`,
+ `Stand up the Cy Pres page (currently missing) — peer NCLC has one and treats it as a revenue line.`,
+ `Get the Candid Platinum seal — seal-holders raise 62% more on average.`
+ ] : aud==='users'? [
+ `Lead with a phone number and a "what's your situation right now?" 3-button hero.`,
+ `Move all PDFs to native HTML pages — PDFs do not rank for long-tail Google queries.`,
+ `Add a Spanish toggle; the Lumina Foundation funds bilingual ed-access work specifically.`,
+ `Plain-language pass: rewrite servicer-letter explainers at 7th-grade reading level.`,
+ `Calculators with no email gate — drives organic traffic and Google reviews like Tate Esq does.`
+ ] : [
+ `Single-action hero per page. Two co-equal CTAs split conversion in both audiences.`,
+ `Move from Wix to a static-site build (Astro/Next) — you'll fix performance, accessibility, and SEO in one stroke.`,
+ `Update the © 2023 footer. Stale copyright reads as "abandoned org" to both POs and borrowers.`,
+ `Add date-modified schema to every resource and news post for Google freshness.`,
+ `Cross-link Stories ↔ Resources ↔ Calculators ↔ Cy Pres — current site is a hub-and-spoke; make it a graph.`
+ ];
+
+ const why = aud==='granters'? `<b>Why some get the money, others don't:</b> Education Trust ($33.2M revenue) publishes a named funder list, theory of change, and dated outcomes. SDCC (${PEER.sdcRevenue}) does none of these on the public site. Foundations cannot fund what they cannot underwrite. The single biggest dollar-per-hour move for SDCC is publishing a funder list, an outcomes report, and a Cy Pres page — three pages, and the public-perception gap to a $5M+ peer narrows immediately.` :
+ aud==='users'? `<b>Why borrowers stay or bounce:</b> the 50–61 cohort carries the highest balances ($46K–$48K), and 75.8% of program officers are women — but the borrowers who pay this site visits at 11pm with a wage-garnishment letter want a phone number, plain language, and a calculator that does not require their email. Make the site work for them and the foundations notice.` :
+ `<b>The 1-vs-100 gap:</b> SDCC operates at ${PEER.sdcRevenue} while peer orgs run $4M–$33M. The asset SDCC owns that no peer matches: 82,475 first-person borrower stories. Surface them, dated and SEO-discoverable, and the moat becomes visible to both granters and users at once.`;
+
+ return `
+ <h2>Critique ${tag}</h2>
+ <div class="meta">Theme #${t.id} · ${esc(t.name)} · audience: ${aud} · page: ${page}</div>
+ <div class="scorebar">
+ <div class="scorechip ${scoreClass}">Fit score: ${score}/100</div>
+ <div class="scorechip ${parseFloat(cTextSurface)>=4.5?'pass':'fail'}">Text contrast ${cTextSurface}:1</div>
+ <div class="scorechip ${parseFloat(cPrimaryWhite)>=3?'pass':'warn'}">Primary on white ${cPrimaryWhite}:1</div>
+ </div>
+ <details open><summary>✅ Pros</summary><ul class="pros">${audPros.map(p=>'<li>'+p+'</li>').join('')}</ul></details>
+ <details open><summary>⚠️ Cons</summary><ul class="cons">${audCons.length?audCons.map(p=>'<li>'+p+'</li>').join(''):'<li>None blocking on this page.</li>'}</ul></details>
+ <details open><summary>💡 Suggestions vs. peer nonprofits</summary><ul class="ideas">${audIdeas.map(p=>'<li>'+p+'</li>').join('')}</ul></details>
+ <details><summary>📊 Peer benchmark</summary><ul>${PEER.topPeers.map(p=>'<li><b>'+p[0]+'</b> — '+p[1]+' · '+p[2]+'</li>').join('')}</ul></details>
+ <details><summary>📷 Photo suggestions for this page (steve-personal Drive)</summary><ul><li><b>Hero:</b> portrait of a 50+ borrower at kitchen table with paperwork (search: "kitchen", "paperwork", "natural light")</li><li><b>Stats band:</b> wide-angle of 2024 State of Student Debt Summit audience</li><li><b>Cards:</b> three quiet workplace shots — teacher, nurse, postal worker (no stock photos)</li><li><b>Footer:</b> SDCC team photo from the most recent retreat (must be < 12 months old)</li></ul><div class="meta" style="margin-top:6px">⚠️ Google Drive MCP not yet authenticated — run /mcp and select "claude.ai Google Drive" to let the assistant pull actual asset filenames from steve-personal (steveabramsdesigns@gmail.com).</div></details>
+ <div class="why">${why}</div>
+ <div class="meta">Theme cat=${t.cat}, day=${t.day||'standard'}. Updated April 2026 against current SDCC site, ProPublica peer revenue data, and 9M+ borrowers age 50+ demographic.</div>`;
+}
+
+/* REVENUE STREAMS */
+const REV = [
+ {h:"Foundation grants",t:"q",e:"High effort",imp:"High impact",d:"Lumina ($1.5B), Arnold ($190M/yr), Ford BUILD, Kresge. Each requires theory of change + outcomes data. SDCC currently invisible on most foundation portfolio sites."},
+ {h:"Cy Pres awards",t:"q",e:"Medium effort",imp:"High impact",d:"Residual class-action funds. NCLC has an active program. Navient, ITT, Corinthian, Borrower Defense settlements all eligible. SDCC has zero cy pres page → zero pipeline."},
+ {h:"Major individual donors",t:"q",e:"High effort",imp:"High impact",d:"$25K-$1M gifts. Mid-tier donor program below 1% of SDCC revenue today. Borrower-success-story-led cultivation tour."},
+ {h:"Recurring small-donor (ActBlue)",t:"h",e:"Low effort",imp:"Medium",d:"Already on ActBlue. Move from one-time $12 default to $12/mo recurring as default toggle. 3-5x donor LTV uplift."},
+ {h:"Workplace giving (CFC, United Way)",t:"q",e:"Low effort",imp:"Medium",d:"Combined Federal Campaign + state workplace campaigns. Federal employees with PSLF debt are exactly the donor."},
+ {h:"DAF & planned giving",t:"q",e:"Medium effort",imp:"High",d:"Donor-Advised Funds at Fidelity Charitable / Schwab — set up DAFgiving360 link. Bequest language for borrower-debtors who want their estate to fight back."},
+ {h:"Cause-marketing partnerships",t:"h",e:"Medium effort",imp:"Medium",d:"Refi-adjacent fintechs (NOT predatory ones), Penny Hoarder-style affiliates, careful with conflict of interest. Disclosure-first."},
+ {h:"Earned: paid workshops & certifications",t:"h",e:"Medium effort",imp:"Medium",d:"Certify HR benefit administrators in PSLF. Schools and city governments will pay $500-$2K per seat."},
+ {h:"Government contracts",t:"q",e:"High effort",imp:"High",d:"State AG offices, CFPB consumer ed, state higher-ed agencies fund borrower outreach. Two-year build."},
+ {h:"Sponsored research / fellowships",t:"q",e:"Medium effort",imp:"Medium",d:"Pair with Roosevelt Institute, NCLC, TICAS for jointly-funded fellow positions. Counts as program services."},
+ {h:"Email/SMS list partnerships",t:"h",e:"Low effort",imp:"Medium",d:"82K story-submitters + petition signers = a uniquely qualified borrower list. Rent ethically (no scams) for $1-3/contact."},
+ {h:"Litigation cost-recovery & attorney fees",t:"q",e:"High effort",imp:"High",d:"Partner-of-record on impact lawsuits. NCLC, Public Citizen, Protect Borrowers all do this. Statutory fees + cy pres feed each other."}
+];
+
+/* RENDER */
+const themeSel = document.getElementById('themeSel');
+THEMES.forEach(t=>{
+ const o=document.createElement('option');
+ o.value=t.id;
+ const d=t.day==='may'?' 🚩':t.day==='tate'?' ⚖️':'';
+ o.textContent=`#${t.id} — ${t.name}${d}`;
+ themeSel.appendChild(o);
+});
+
+function applyTheme(t){
+ const r=document.documentElement.style;
+ r.setProperty('--t-bg',t.bg);r.setProperty('--t-surface',t.surface);
+ r.setProperty('--t-text',t.text);r.setProperty('--t-muted',t.muted);
+ r.setProperty('--t-primary',t.primary);r.setProperty('--t-accent',t.accent);
+ r.setProperty('--t-h',t.h);r.setProperty('--t-b',t.b);
+}
+
+function render(){
+ const t=THEMES.find(x=>x.id===+themeSel.value)||THEMES[0];
+ const aud=document.getElementById('audSel').value;
+ const page=document.getElementById('pageSel').value;
+ applyTheme(t);
+ document.getElementById('mockRoot').innerHTML = PAGES[page](t);
+ document.getElementById('critRoot').innerHTML = critique(t,aud,page);
+ if(page==='calculators') wirePSLF();
+}
+function wirePSLF(){
+ const $=id=>document.getElementById(id);
+ const btn=$('cRun'); if(!btn) return;
+ btn.onclick=()=>{
+ const bal=+$('cBal').value, rate=+$('cInt').value/100, inc=+$('cInc').value, fam=+$('cFam').value, grow=+$('cGrow').value/100, yrs=+$('cYrs').value, pay=+$('cPay').value;
+ const polLine=2025*15060/12; // not used precisely; demo math
+ const fpl = 15060 + 5380*(fam-1); // 2025 lower 48
+ const discIncome = Math.max(0, inc - 1.5*fpl);
+ const ibrMonthly = Math.round(discIncome*0.10/12);
+ const payeMonthly = Math.round(discIncome*0.10/12);
+ const icrMonthly = Math.round(inc*0.20/12);
+ const stdMonthly = Math.round((bal*(rate/12))/(1-Math.pow(1+rate/12,-120)));
+ const remaining = Math.max(0,120-pay);
+ const monthsLeft = remaining;
+ const totalRepay = ibrMonthly*remaining;
+ const forg = Math.max(0, bal*(1+rate*monthsLeft/12) - totalRepay);
+ const eta = new Date(); eta.setMonth(eta.getMonth()+monthsLeft);
+ $('cOut').innerHTML = `<b>$${ibrMonthly.toLocaleString()}/mo IBR · $${payeMonthly.toLocaleString()}/mo PAYE · $${icrMonthly.toLocaleString()}/mo ICR · $${stdMonthly.toLocaleString()}/mo Standard</b>
+ ${remaining} qualifying payments remaining · est. forgiveness ${eta.toLocaleString('en-US',{month:'long',year:'numeric'})}<br>
+ Total out-of-pocket before forgiveness: <b style="font-size:16px">$${totalRepay.toLocaleString()}</b> · estimated forgiven: <b style="font-size:16px">$${Math.round(forg).toLocaleString()}</b><br>
+ <span style="font-size:11px;color:#6b7280">Estimate. Verify against StudentAid.gov. Demo math; production version uses the documented JSON schema on the PSLF JSON Inspector page.</span>`;
+ };
+}
+
+/* Modal */
+const dlg=document.getElementById('revModal');
+document.getElementById('revBtn').onclick=()=>{ dlg.showModal(); };
+document.getElementById('revClose').onclick=()=>dlg.close();
+dlg.addEventListener('click',e=>{ if(e.target===dlg) dlg.close(); });
+const grid=document.getElementById('revGrid');
+grid.innerHTML = REV.map(r=>`<div class="rev-card"><span class="tag ${r.t}">${r.t==='q'?'Quiet money':r.t==='h'?'Hustle money':'Steady'}</span><span class="tag">${r.e}</span><span class="tag">${r.imp}</span><h3>${r.h}</h3><p>${r.d}</p></div>`).join('');
+
+/* OVERVIEW — all 46 themes on one page */
+const ovGrid = document.getElementById('ovGrid');
+function buildOverview(){
+ ovGrid.innerHTML = THEMES.map(t=>{
+ const styleVars = `--c-bg:${t.bg};--c-surface:${t.surface};--c-text:${t.text};--c-muted:${t.muted};--c-primary:${t.primary};--c-accent:${t.accent};--c-h:${t.h};--c-b:${t.b}`;
+ const catCls = t.day==='may'?'may':t.day==='tate'?'tate':t.cat;
+ const catLabel = t.day==='may'?'May Day':t.day==='tate'?'Tate Esq':t.cat;
+ const score = (parseFloat(contrast(t.text,t.surface).toFixed(2))>=4.5?1:0)*40 + (parseFloat(contrast(t.primary,'#fff').toFixed(2))>=3?1:0)*30 + 30;
+ return `<div class="ov-card" data-id="${t.id}" style="${styleVars}">
+ <div class="ov-meta"><span class="num">#${t.id}</span><span class="cat ${catCls}">${catLabel}</span></div>
+ <div class="ov-mini">
+ <div class="ov-nav">SDCC<span class="donate">Donate $12</span></div>
+ <div class="ov-hero">
+ <div class="ov-h1">${esc(t.hero)}</div>
+ <div class="ov-sub">${esc(t.sub.slice(0,140))}${t.sub.length>140?'…':''}</div>
+ <div class="ov-ctas"><span class="ov-cta p">${esc(t.cta)}</span><span class="ov-cta s">${esc(t.cta2)}</span></div>
+ </div>
+ <div class="ov-stats">
+ <div class="ov-stat">4.7M<span>signatures</span></div>
+ <div class="ov-stat">887K<span>letters</span></div>
+ <div class="ov-stat">82K<span>stories</span></div>
+ <div class="ov-stat">10y<span>advocacy</span></div>
+ </div>
+ <div class="ov-foot">© 2026 Student Debt Crisis Center · 501(c)(3)</div>
+ </div>
+ <div class="ov-name"><span>${esc(t.name)}</span><span class="score">${score}/100</span></div>
+ </div>`;
+ }).join('');
+ ovGrid.querySelectorAll('.ov-card').forEach(c=>{
+ c.addEventListener('click',()=>{ location.hash = 't-'+c.dataset.id; });
+ });
+}
+
+/* HASH ROUTER */
+const splitView = document.getElementById('splitView');
+const overviewView = document.getElementById('overviewView');
+const allBtn = document.getElementById('allBtn');
+
+function showOverview(){
+ splitView.style.display='none';
+ overviewView.style.display='block';
+ allBtn.textContent='✕ Close all-46 view';
+ document.querySelectorAll('.controls .ctl').forEach(c=>c.style.opacity='.4');
+}
+function showSplit(){
+ splitView.style.display='grid';
+ overviewView.style.display='none';
+ allBtn.textContent='📑 View all 46';
+ document.querySelectorAll('.controls .ctl').forEach(c=>c.style.opacity='1');
+}
+
+function routeFromHash(){
+ const h = location.hash.replace('#','');
+ if(h==='all'){ showOverview(); return; }
+ const m = h.match(/^t-(\d+)$/);
+ if(m){
+ const id = +m[1];
+ if(THEMES.find(x=>x.id===id)){
+ themeSel.value = id;
+ showSplit();
+ render();
+ return;
+ }
+ }
+ // default
+ showSplit();
+ render();
+}
+
+allBtn.onclick=()=>{
+ location.hash = (overviewView.style.display==='none') ? 'all' : 't-'+themeSel.value;
+};
+window.addEventListener('hashchange',routeFromHash);
+
+/* init */
+['themeSel','audSel','pageSel'].forEach(id=>document.getElementById(id).addEventListener('change',()=>{
+ // Update hash so URL reflects current theme without triggering router loop
+ const newHash = 't-'+themeSel.value;
+ if(location.hash !== '#'+newHash){
+ history.replaceState(null,'','#'+newHash);
+ }
+ render();
+}));
+themeSel.value = 1;
+buildOverview();
+routeFromHash();
+</script>
+</body>
+</html>
diff --git a/showcase/screens/01-default-load.png b/showcase/screens/01-default-load.png
new file mode 100644
index 0000000..e05a7e8
Binary files /dev/null and b/showcase/screens/01-default-load.png differ
diff --git a/showcase/screens/02-mayday-bookacall.png b/showcase/screens/02-mayday-bookacall.png
new file mode 100644
index 0000000..6088d56
Binary files /dev/null and b/showcase/screens/02-mayday-bookacall.png differ
diff --git a/showcase/screens/03-tate-calculators.png b/showcase/screens/03-tate-calculators.png
new file mode 100644
index 0000000..0051d17
Binary files /dev/null and b/showcase/screens/03-tate-calculators.png differ
diff --git a/showcase/screens/04-revenue-modal.png b/showcase/screens/04-revenue-modal.png
new file mode 100644
index 0000000..61045a2
Binary files /dev/null and b/showcase/screens/04-revenue-modal.png differ
diff --git a/showcase/screens/05-all-46-full.png b/showcase/screens/05-all-46-full.png
new file mode 100644
index 0000000..e6f1cf9
Binary files /dev/null and b/showcase/screens/05-all-46-full.png differ
diff --git a/showcase/screens/05-all-46.png b/showcase/screens/05-all-46.png
new file mode 100644
index 0000000..4e09213
Binary files /dev/null and b/showcase/screens/05-all-46.png differ
diff --git a/specs/new-pages-and-cypres.md b/specs/new-pages-and-cypres.md
new file mode 100644
index 0000000..6382851
--- /dev/null
+++ b/specs/new-pages-and-cypres.md
@@ -0,0 +1,136 @@
+# New page specs — keyword landers + Cy Pres + Calculators + Book a Call
+
+Companion to:
+- `research/keyword-landers.md` (20 candidate landers, 4 tiers)
+- `research/grantee-seo-comparison.md` (peer revenue + SEO patterns)
+- `research/audience-demographics.md` (granters + 45+ borrower cohorts)
+
+---
+
+## 1. Cy Pres Award page — `/cy-pres`
+
+**Why it matters:** Residual class-action settlement funds get directed to a 501(c)(3) whose mission aligns with the underlying suit. NCLC has an active program and treats it as a revenue line. SDCC has zero such page → zero pipeline. Estimated unlocked annual revenue: **$25K–$250K** depending on attorney outreach effort.
+
+**H1:** Cy Pres awards — fund borrower advocacy from class-action settlement residuals
+**Meta description:** Direct unclaimed class-action funds to a 501(c)(3) purpose-built to advocate for the same student-loan borrowers harmed in the underlying case.
+**Audience:** Class-action attorneys, foundation program officers, judges' chambers
+**URL:** `/cy-pres` (canonical) · 301 redirects from `/cypres`, `/class-action`
+
+**Sections:**
+1. Hero — one sentence on what cy pres is + "we are eligible" badge
+2. Why SDCC qualifies — 10 years, 4.7M signatures, 82K stories, beneficiary alignment with student-loan classes
+3. Recent eligible matters — Navient, ITT/Corinthian/Westwood Borrower Defense, state AG servicer settlements
+4. Use of funds — 100% directed to borrower hotline, free guides, public-interest litigation support
+5. Counsel & process packet — 990, IRS determination, audited financials, beneficiary-alignment memo, draft order language
+6. Email — `cypres@studentdebtcrisis.org` (set up dedicated inbox)
+7. Past awards (start with placeholder; populate as awards land)
+
+**Internal links:** About, Annual report, 990 PDF
+**External links:** ProPublica Nonprofit Explorer profile, Candid profile
+
+---
+
+## 2. Calculators page — `/calculators`
+
+**Why it matters:** Free calculators with no email gate are how Tate Esq drives 69 Google reviews and inbound consults. SDCC has 2M supporters and zero calculators. Free calculators rank for transactional, high-commercial-intent queries that nonprofit education content cannot.
+
+**Eight calculators (per the screenshot reference):**
+| # | Name | Purpose | Inputs (high-level) |
+|---|---|---|---|
+| 01 | TXT loan-listing tool | Paste StudentAid.gov export → clean inventory | text dump |
+| 02 | PSLF Calculator | Months to forgiveness given plan, income, family size | 10 fields per the Tate-style schema |
+| 03 | Parent PLUS Calculator | Double-consolidation savings, ICR-only access | balance, interest, retirement timeline |
+| 04 | SAVE Plan Calculator | Old SAVE payment vs. new IDR options post-block | balance, AGI, family size |
+| 05 | ICR Plan Calculator | Parent PLUS borrower's only IDR door | balance, AGI, family size |
+| 06 | IBR Plan Calculator | Old IBR vs new IBR — eligibility & math | balance, AGI, family size, loan year |
+| 07 | PAYE Plan Calculator | Eligibility test + 20-year forgiveness path | balance, first-loan date, AGI, family size |
+| 08 | Partial Financial Hardship Calc | Whether you qualify in 2026 | AGI, family size, balance, plan |
+
+**JSON schema for PSLF (canonical for all calculators):**
+See live page in showcase: `/showcase/index.html` → page selector → "PSLF JSON Inspector". Mirrors tateesq.com/calculator/pslf input shape so we can interop / validate against an established model.
+
+```jsonc
+{
+ "loanBalance": { "type":"number", "units":"USD", "required":true },
+ "avgInterestRate": { "type":"number", "units":"percent", "required":true },
+ "monthlyPayment": { "type":"number", "units":"USD", "required":true },
+ "state": { "type":"string", "enum":"US state", "required":true },
+ "taxFilingStatus": { "type":"string", "enum":["Single","Head of Household","Qualified Widow(er)","Married Filing Jointly","Married Filing Separately"] },
+ "familySize": { "type":"number", "units":"count" },
+ "annualIncome": { "type":"number", "units":"USD" },
+ "avgAnnualGrowth": { "type":"number", "units":"percent" },
+ "yearsInPublicService":{ "type":"number", "units":"years" },
+ "qualifyingPayments": { "type":"number", "units":"count" }
+}
+```
+
+**Outputs:** monthly payment by plan (IBR, PAYE, ICR, Standard; SAVE flagged as blocked), total repayment before forgiveness, total forgiven, remaining qualifying payments, months to forgiveness, ETA YYYY-MM, disclaimer.
+
+**Build notes:** plain client-side JS, no backend. No email gate. Print-friendly. Canonical results-URL so users can share. Dated as "Reviewed [last review month]" so granters see freshness.
+
+---
+
+## 3. Book a Call page — `/book-a-call`
+
+**Why it matters:** Mirrors tateesq.com/contact pattern. For the 45+ cohort, video + phone + scheduled call converts >5x better than a "contact form." Also serves as a major-donor cultivation channel (an SDCC borrower advocate on a free call with a foundation PO is the highest-quality top-of-funnel signal that exists).
+
+**H1:** Student-loan companies don't help. We do.
+**Sections:**
+1. Hero — H1, sub-headline ("Book a free 20-minute call with an SDCC borrower advocate"), embedded video (2-min explainer of what SDCC does), phone number, "Book my free call" Calendly button
+2. What we're good at — 6 numbered cards (SAVE/IDR triage, PSLF appeals, Default & garnishment, Parent PLUS strategy, Borrower Defense, Disability/TPD) — same numbered visual pattern as the Tate Esq theme
+3. What borrowers say — 3 short quotes from real submissions (Robyn / Eugenia / Megan), pulled from Stories database
+4. Trust strip — Candid Platinum seal, GuideStar verified, 501(c)(3), "Not a law firm" disclaimer
+5. CTA repeated — Calendly + phone + email
+
+**Embedded video brief (2 min):**
+- 0:00 — Hook: "If you got a default, garnishment, or PSLF denial letter this year — this is for you."
+- 0:15 — Who SDCC is in one sentence ("We're a 501(c)(3) borrower-advocacy nonprofit. We don't sell anything.")
+- 0:30 — What we do (3 bullets shown on screen)
+- 0:50 — Three quick borrower outcomes (5 sec each)
+- 1:35 — How to book (show the page in the background)
+- 1:50 — Tag: "Free. No upsell. Just help."
+
+---
+
+## 4. Twenty long-tail landers — see `research/keyword-landers.md`
+
+Tier 1 (publish now — breaking 2025–26 news):
+- `/save-plan-blocked-what-now`
+- `/student-loans-transferred-to-treasury`
+- `/default-collections-restarted-2026`
+- `/idr-application-backlog`
+- `/tax-refund-seizure-student-loans`
+
+Tier 2 (high emotional ROI for 45+):
+- `/social-security-garnishment-student-loans`
+- `/student-loans-for-parents-over-60`
+- `/cosigned-student-loan-help`
+- `/twenty-years-of-payments-still-owe`
+- `/student-loans-after-spouse-death`
+
+Tier 3 (procedural how-to):
+- `/parent-plus-loan-forgiveness-2026`
+- `/borrower-defense-application-2026`
+- `/pslf-denial-appeal`
+- `/closed-school-discharge`
+- `/total-permanent-disability-discharge`
+
+Tier 4 (authority building):
+- `/idr-elimination-explained`
+- `/student-loan-wage-garnishment-amounts`
+- `/navient-settlement-cy-pres`
+- `/student-loan-bankruptcy-discharge`
+- `/part-time-employment-pslf`
+
+Each follows the same template (full content briefs in `research/keyword-landers.md`):
+**H1 → 4-6 H2s → emotional-state-matched CTA → internal links to Resources, Stories, Donate, Petition, Cy Pres → date-modified schema → "Reviewed [date]" stamp.**
+
+---
+
+## 5. Footer-strip changes (apply globally)
+
+- © 2026 (was: 2023)
+- Candid Platinum seal · GuideStar verified · 990 (PDF) · Annual Report
+- Phone number on every page above fold
+- "Reviewed [date]" stamp on every Resource, News, and Lander page
+- Date-modified microdata for Google freshness signal
diff --git a/specs/photo-suggestions-MATCHED.md b/specs/photo-suggestions-MATCHED.md
new file mode 100644
index 0000000..94abe1a
--- /dev/null
+++ b/specs/photo-suggestions-MATCHED.md
@@ -0,0 +1,98 @@
+# Photo suggestions — MATCHED against steve-personal Drive
+
+> **Drive auth status:** ✅ Authenticated as `steveabramsdesigns@gmail.com` (steve-personal). Searched April 25, 2026.
+>
+> **Headline finding:** Steve's personal Drive holds **very few directly Student-Debt-Crisis-Center photos.** Most photos in the Drive are personal, design-portfolio (wallpaper renders), or San Diego Comic-Con (the local viewer at `~/Projects/sdcc-images` on port 9821 is for *Comic-Con*, not Student Debt Crisis Center). The actual SDCC nonprofit's photo library most likely lives on the org's Google Workspace Drive (`info@studentdebtcrisis.org` or `sabrina@studentdebtcrisis.org`), not Steve's personal account.
+>
+> **Recommendation:** request access to the SDCC org Drive before final design. Until then, the matches below are the best candidates from steve-personal, plus explicit "no match — needs new photography" notes for slots where personal Drive can't fill the gap.
+
+---
+
+## ✅ Matches found in steve-personal Drive
+
+### Natalia Abrams — President & Founder (headshots)
+
+These are 2010 SDCC-era headshots of Natalia Abrams. They are real and usable, but **16 years old** — recommend a new headshot session before going live.
+
+| File | Drive ID | Modified | Use for |
+|---|---|---|---|
+| `Natalia-Abrams336.JPG` | `10rjgnvi1BRQM1osMybScKfYLb92AbZS1` | 2010-03-05 | About page · Book a Call hero (interim) |
+| `Natalia-Abrams342.JPG` | `11-39i0kzyTQpn_30Uif7CtOl-_7AzWFW` | 2010-03-05 | About page alternate |
+| `Natalia-Abrams347.JPG` | `11-tY4mWRHvpzY4iRdT2sOdRMxuXh54Dp` | 2010-03-05 | About page alternate |
+| `Abrams_History.JPG` | `15gOyurNdLw3Ljc431sxYoo9jcOWf2eLS` | 2025-09-23 | Founder origin-story callout (verify subject before using) |
+
+### Cody Hounanian (former SDCC staff, shared by him)
+
+| File | Drive ID | Modified | Use for |
+|---|---|---|---|
+| `Student Debt Crisis Cody Hounanian.jpg` | `1zCV4XkoIOLaeinGP93GYF51yV_gq5uPd` | 2018-09-09 | Archive / "Our history" page only — Cody is a former staff member |
+| `Activist-Instagram Crop-3.jpg` | `1WjVL0sK2gB4PCP0zBShIDMUKPDvLo3nz` | 2018-09-09 | Archive social-media reuse only |
+
+### College / "Free the Degree" candidates
+
+| File | Drive ID | Use for |
+|---|---|---|
+| `CollegeStudentOccupyColleges.JPG` | `14qgXteXGG7EJNdaf4QkZ6AGZ_xPxP4l9` | Free the Degree hero — perfect on-topic match |
+| Multiple `IMG_7702`–`IMG_7759` from "UC Riverside" folder | `133SLba7MubHtT-FJhithIyJC7GsOoKKl` (folder) | Section dividers if context is acceptable to subjects |
+
+### "Photos 2025" — recent shoot (verify subject matter)
+
+Folder `19MOOq-M-vL4IC4mLF4GFRe6zORL7KLmP` contains a recent (Aug 2025) Nikon DSC shoot — `DSC_2483.JPG` through `DSC_2487.JPG` plus matching `.NEF` raw files. **Subject matter not yet confirmed** — could be SDCC event, could be unrelated. Worth a manual review before assigning to slots.
+
+---
+
+## ❌ Slots with NO match in steve-personal Drive — needs new photography or org-Drive access
+
+| Slot (from `photo-suggestions.md`) | Why no match | Action |
+|---|---|---|
+| **Sabrina Calazans** (current ED) — headshot for About + Book a Call | Zero hits searching "Sabrina Calazans" / "Calazans" | Request from SDCC org Drive or schedule new shoot |
+| **Sabrina Cereceres** (Special Projects) — headshot | Zero hits | Same |
+| **Ángel Rentería** (Communications) — headshot | Zero hits | Same |
+| **Home hero — borrower 50+ at kitchen table with paperwork** | "Kitchen" search returned only old wallpaper-design renders ("DecoKitchen1917.tif" etc) | Commission shoot — model release required |
+| **Stats band — State of Student Debt Summit audience wide-shot** | Searches for "summit" / "town hall" / "audience" returned no SDCC-event results | Request from SDCC events archive |
+| **Workplace cards — teacher / nurse / postal worker** | Searches returned no relevant results | Commission shoot or carefully-licensed editorial library (DocumentingDC, Allison Shelley/EDU, Reading Through It) |
+| **News hero — press conference / capitol** | Searches returned only Mueller-report PDF page scans (irrelevant) | Request from SDCC press archive |
+| **Cy Pres hero — federal courthouse exterior** | No matches | Use public-domain (Library of Congress, GAO) |
+| **Stories hero — demonstration / rally with banners** | "Demonstration" / "rally" / "protest" returned only wallpaper renders and Mueller report pages | Request from SDCC field archive or pull frames from existing summit videos |
+| **SDCC team retreat photo** | "Team / staff / retreat" returned wallpaper product photos — no hits | Request from SDCC org Drive |
+| **Most-recent-12-months SDCC team photo for footer** | Same | Same |
+
+---
+
+## ⚠️ False-positive warnings (DO NOT USE)
+
+These came up in keyword searches but are **NOT** Student Debt Crisis Center assets:
+
+- **`SDCC_Background.png` / `.psd` / `SDCC_Background2.png`** in the "Graphics" folder — these are **San Diego Comic-Con** brand backgrounds, NOT Student Debt Crisis Center.
+- **`sas-natalia-*.jpg/psd`** files (multiple, dated 2008) — these are **Steve's personal photos** with someone named Natalia (not Natalia Abrams the SDCC founder).
+- **`DylanNataliaSteve*.JPG`** — personal photos, not SDCC content.
+- **`Natalia bday.jpg`** (Oct 2024) — personal birthday photo.
+- One spam-style filename in the May/protest search (excluded from this doc by name).
+
+---
+
+## Suggested next steps for Steve
+
+1. **Request the SDCC org Drive shared link** from Sabrina Calazans (ED). Re-run the matching against the org Drive — that is where the actual borrower portraits, summit photos, team headshots, and rally images will be.
+2. **Schedule a 2026 team headshot session** — current Natalia photos are 16 years old; Sabrina, Sabrina Cereceres, and Ángel have no photos in steve-personal at all.
+3. **Build a small "consented portraits" Drive folder** of borrowers from the 82,475 stories who have explicitly consented to photo use. Tag with story ID. This is SDCC's most valuable visual asset and currently does not exist as a structured library.
+4. **For interim production**, use the 2010 Natalia-Abrams headshots + the `CollegeStudentOccupyColleges.JPG` for Free the Degree, and use the Tate-Esq numbered-card visual pattern (which doesn't require photos) for Calculators / Book-a-Call cards.
+
+---
+
+## Drive search log (for audit)
+
+Searches run April 25, 2026 (UTC) against `steveabramsdesigns@gmail.com`:
+
+| Query | Results | Useful matches |
+|---|---|---|
+| `fullText contains 'SDCC'` (image only) | 20+ | Comic-Con assets only |
+| `fullText contains 'student debt' OR 'borrower' OR 'student loan'` | 20+ | 1 (Cody Hounanian) |
+| `fullText contains 'Sabrina' OR 'Natalia' OR 'headshot'` | 15 | 4 (Natalia Abrams 2010 set + history) |
+| `fullText contains 'Sabrina Calazans' OR 'Sabrina Cereceres' OR 'Angel Renteria'` | 0 | 0 |
+| `fullText contains 'summit' OR 'town hall' OR 'rally' OR 'protest' OR 'demonstration'` | 20+ | 1 (CollegeStudentOccupyColleges) |
+| `fullText contains 'press conference' OR 'capitol' OR 'congress' OR 'briefing'` | 15 | 0 (all Mueller-report scans) |
+| `fullText contains 'team' OR 'staff' OR 'retreat' OR 'group photo'` | 15 | 0 (all wallpaper renders) |
+| `fullText contains 'free the degree' OR 'graduation' OR 'tuition' OR 'college student'` | 15 | 1 (CollegeStudentOccupyColleges) |
+| `fullText contains 'kitchen' OR 'paperwork' OR 'desk' OR 'letter' OR 'mail'` | 15 | 0 (all wallpaper / vintage assets) |
+| `fullText contains 'logo' AND ('sdcc' OR 'student debt')` | 1 | 0 |
diff --git a/specs/photo-suggestions.md b/specs/photo-suggestions.md
new file mode 100644
index 0000000..f9675a4
--- /dev/null
+++ b/specs/photo-suggestions.md
@@ -0,0 +1,129 @@
+# Photo suggestions — page by page
+
+> **Status of `steve-personal` (steveabramsdesigns@gmail.com) Google Drive:** the Claude.ai Google Drive MCP connector is installed but **not yet authenticated**. The connector requires the user to run `/mcp` and complete OAuth — once done, the assistant can list assets in Drive by name and tag the right file per slot. Until then, this file specifies the **brief** for each slot so any photo lookup (manual or automated) can match against the same criteria.
+
+> **Photography principles for SDCC (apply globally):**
+> - Real borrowers, not stock. Every face on the site is someone whose story we have written permission to use.
+> - Natural light, no studio backdrops.
+> - Show 45+ subjects in proportion to the audience (~70% of imagery).
+> - Show racial/gender diversity — Black women carry $20K+ more debt than white men; the imagery should not erase that.
+> - Workplace dignity — teachers, nurses, public servants, postal workers, social workers — never shame imagery.
+> - Avoid cap-and-gown shots (the loans hurt long after the gown comes off).
+
+---
+
+## Home — `/`
+
+| Slot | Brief | Drive search terms |
+|---|---|---|
+| Hero | Portrait of a 50–65 borrower at kitchen table reviewing paperwork in natural light. Direct, calm gaze. | `kitchen`, `paperwork`, `borrower`, `portrait`, `natural-light` |
+| Stats band background | Wide-angle of an SDCC town hall or State of Student Debt Summit audience | `summit`, `town-hall`, `audience-2024`, `audience-2025` |
+| "What we're working on" cards (×3) | One borrower at workplace per card: teacher in classroom · nurse on ward · postal worker on route. No staged smiles. | `teacher`, `nurse`, `postal`, `workplace` |
+| Funder strip | Skip — text only. (Photos here read as advertorial.) | — |
+| Footer | Most recent SDCC team photo (must be ≤ 12 months old; if not, replace the photo with a phone number) | `team`, `staff`, `2025`, `2026` |
+
+---
+
+## Stories — `/stories`
+
+| Slot | Brief | Drive search terms |
+|---|---|---|
+| Hero | Wide shot of a 2024 demonstration — banners, faces, daylight | `demonstration`, `rally`, `protest`, `banners` |
+| Per-story portrait | One unposed photo per story, where the borrower has consented | `consented-portraits/[name]` |
+| Section divider | Crowd hands-up at a town hall | `hands`, `pledge`, `town-hall` |
+
+---
+
+## Resources — `/resources`
+
+| Slot | Brief | Drive search terms |
+|---|---|---|
+| Hero | Hand on phone reading a `Studentaid.gov` letter — anonymous (over-shoulder shot, no face) | `letter`, `phone`, `mail`, `over-shoulder` |
+| Each guide card | A small icon — not a photo. Photos in resource cards reduce scannability for 45+ readers. | — |
+
+---
+
+## News — `/news`
+
+| Slot | Brief | Drive search terms |
+|---|---|---|
+| Hero | SDCC team at a press conference / capitol step — recognizable spokesperson | `press-conference`, `capitol`, `Sabrina`, `Natalia` |
+| Per-post thumbnail | News-style: location, building, or supporting graphic. Avoid clip-art. | varies per post |
+
+---
+
+## Calculators — `/calculators`
+
+| Slot | Brief | Drive search terms |
+|---|---|---|
+| Hero | Hands on a calculator and laptop — soft, not financial-services-corporate | `calculator`, `laptop`, `hands`, `desk` |
+| Per-calculator card | Numbered icon only (01–08), not photos | — |
+
+---
+
+## PSLF JSON Inspector — `/pslf-json`
+
+No photos. The page IS the schema. Visual treatment is monospace JSON on dark background — that's the message. Adding photos here would weaken the "open, evidence-based, replicable" signal.
+
+---
+
+## Cy Pres Award — `/cy-pres`
+
+| Slot | Brief | Drive search terms |
+|---|---|---|
+| Hero | Federal courthouse exterior or judge's bench (architectural, not staged) | `courthouse`, `bench`, `gavel-no`, `judicial` |
+| "Why we qualify" card | Group of borrowers at a State of Student Debt Summit | `summit`, `audience` |
+| "Past awards" placeholder | Replace with each award's announcement when received; until then, no photo, just text | — |
+
+---
+
+## Book a Call — `/book-a-call`
+
+| Slot | Brief | Drive search terms |
+|---|---|---|
+| Hero portrait + video thumbnail | Sabrina Calazans (ED) or Natalia Abrams (President & Founder) — direct gaze, slight smile, neutral background. **Pair with the 2-minute explainer video** (see new-pages spec). | `Sabrina`, `Natalia`, `headshot`, `2025`, `2026` |
+| "What we're good at" 6 numbered cards | Tiny icon per card, not photos | — |
+| "What borrowers say" testimonial cards | Real headshot + name, where consented; otherwise initial only | `testimonial`, `consented` |
+
+---
+
+## Free the Degree — `/free-the-degree`
+
+| Slot | Brief | Drive search terms |
+|---|---|---|
+| Hero | Group of college students protesting tuition or wages | `students`, `protest`, `tuition`, `young` |
+| Stat band | Stylized infographic — no photo | — |
+
+---
+
+## About — `/about`
+
+| Slot | Brief | Drive search terms |
+|---|---|---|
+| Each team headshot | Latest professional headshot — natural light, neutral background | `headshot/[name]` |
+
+---
+
+## Contact — `/contact`
+
+| Slot | Brief | Drive search terms |
+|---|---|---|
+| Hero | Phone in foreground, daytime light. Subtitle: phone number large. | `phone`, `daylight` |
+
+---
+
+## May Day pages (themes 31–45)
+
+| Slot | Brief | Drive search terms |
+|---|---|---|
+| Hero | Historic labor demonstration (public-domain) OR an SDCC rally with red carnations | `mayday`, `carnation`, `union`, `picket`, `1886` |
+| Section dividers | Vintage IWW / labor poster reproductions (public domain only) | `iww`, `union-poster-public-domain` |
+
+---
+
+## Photo asset workflow once Drive MCP is authenticated
+
+1. Run `/mcp` → select "claude.ai Google Drive" → complete OAuth in browser.
+2. Re-invoke this assistant with: "Run the photo-suggestions matcher against steve-personal Drive."
+3. The assistant will, per slot above, search Drive for the listed terms, return the top 3 candidates per slot, and attach Drive file IDs / preview URLs to a refreshed `photo-suggestions-MATCHED.md`.
+4. Steve approves by initialing each row; approved rows go into the design system as named asset slots (`hero/home`, `stats/summit-2024`, etc).
(oldest)
·
back to Student Debt Crisis Redesign
·
fix(gitignore): add missing backup-file glob patterns to pre 4e7c65e →